@sasjs/adapter 4.17.3 → 4.19.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/SASViyaApiClient.d.ts +6 -7
- package/SASjs.d.ts +6 -2
- package/api/viya/executeOnComputeApi.d.ts +3 -1
- package/api/viya/pollJobState.d.ts +3 -2
- package/auth/getTokens.d.ts +13 -1
- package/index-dev.js +145 -38
- package/index.d.ts +1 -0
- package/index.js +145 -38
- package/minified_sas9.js +39 -5
- package/node/SASViyaApiClient.d.ts +6 -7
- package/node/SASjs.d.ts +6 -2
- package/node/api/viya/executeOnComputeApi.d.ts +3 -1
- package/node/api/viya/pollJobState.d.ts +3 -2
- package/node/auth/getTokens.d.ts +13 -1
- package/node/index.d.ts +1 -0
- package/node/index.js +145 -38
- package/package.json +2 -2
- package/spec/SASjs.startComputeJob.spec.d.ts +1 -0
- package/src/SASViyaApiClient.ts +44 -16
- package/src/SASjs.ts +17 -4
- package/src/api/viya/executeOnComputeApi.ts +19 -6
- package/src/api/viya/pollJobState.ts +21 -9
- package/src/auth/getTokens.ts +82 -9
- package/src/index.ts +1 -0
package/minified_sas9.js
CHANGED
|
@@ -16,12 +16,28 @@ return /******/ (() => { // webpackBootstrap
|
|
|
16
16
|
|
|
17
17
|
"use strict";
|
|
18
18
|
|
|
19
|
-
var
|
|
20
|
-
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
21
37
|
};
|
|
22
38
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
23
39
|
exports.decodeToken = exports.hasTokenExpired = exports.isRefreshTokenExpiring = exports.isAccessTokenExpiring = void 0;
|
|
24
|
-
const jwt_decode_1 =
|
|
40
|
+
const jwt_decode_1 = __importStar(__webpack_require__(6765));
|
|
25
41
|
/**
|
|
26
42
|
* Checks if the Access Token is expired or is expiring in 1 hour. A default Access Token
|
|
27
43
|
* lasts 12 hours. If the Access Token expires, the Refresh Token is used to fetch a new
|
|
@@ -67,7 +83,25 @@ function hasTokenExpired(token) {
|
|
|
67
83
|
}
|
|
68
84
|
exports.hasTokenExpired = hasTokenExpired;
|
|
69
85
|
function isTokenExpiring(token, timeToLiveSeconds) {
|
|
70
|
-
|
|
86
|
+
let payload;
|
|
87
|
+
try {
|
|
88
|
+
payload = (0, jwt_decode_1.default)(token);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// Only tolerate undecodable (opaque / non-JWT) tokens - anything else
|
|
92
|
+
// is a genuine bug and should surface.
|
|
93
|
+
if (!(err instanceof jwt_decode_1.InvalidTokenError))
|
|
94
|
+
throw err;
|
|
95
|
+
// Opaque tokens cannot be expiry-checked client-side.
|
|
96
|
+
// Assume the token is usable and let the server reject it if expired.
|
|
97
|
+
console.debug('isTokenExpiring: token is not a decodable JWT, treating it as not expiring.');
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// A JWT without an `exp` claim cannot be expiry-checked either.
|
|
101
|
+
// Note: `== null` (not `!`) - exp of 0 is a real (long-expired) claim,
|
|
102
|
+
// not a missing one.
|
|
103
|
+
if (payload.exp == null)
|
|
104
|
+
return false;
|
|
71
105
|
const timeToLive = payload.exp - new Date().valueOf() / 1000;
|
|
72
106
|
return timeToLive <= timeToLiveSeconds;
|
|
73
107
|
}
|
|
@@ -15452,4 +15486,4 @@ module.exports = axios;
|
|
|
15452
15486
|
/******/ })()
|
|
15453
15487
|
;
|
|
15454
15488
|
});
|
|
15455
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsVUFBVTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsRUFBRTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlOzs7QUFHZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDLEtBQUs7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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Q0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FB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O0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxXQUFXLGNBQWM7QUFDaEM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPLG9CQUFvQixPQUFPOztBQUVoRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIsbUJBQW1CO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQsT0FBTztB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O0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsNEJBQTRCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixrQkFBa0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQixXQUFXLFNBQVM7QUFDcEI7QUFDQSxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsU0FBUztBQUN0QixhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLGVBQWU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsS0FBSztBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixLQUFLLEdBQUcsMEJBQTBCOztBQUU3RDtBQUNBLGlDQUFpQyxnQ0FBZ0M7QUFDakU7QUFDQTtBQUNBLDhCQUE4QixLQUFLO0FBQ25DO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFNBQVM7QUFDM0M7O0FBRUEseUNBQXlDO0FBQ3pDLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRixjQUFjO0FBQ2QsZ0RBQWdEO0FBQ2hELHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsT0FBTztBQUNQLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzRUFBc0UsV0FBVzs7QUFFakY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxrQ0FBa0MsVUFBVTtBQUM1QyxNQUFNO0FBQ04sNkJBQTZCO0FBQzdCLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyx3QkFBd0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscURBQXFEO0FBQ2pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QywwQ0FBMEM7O0FBRTFDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUVBLFVBQVUscUNBQXFDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLDJCQUEyQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx3QkFBd0I7QUFDbEUsTUFBTTtBQUNOO0FBQ0E7QUFDQSwrQ0FBK0Msd0JBQXdCO0FBQ3ZFO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ0Esc0NBQXNDLE9BQU87O0FBRTdDO0FBQ0E7QUFDQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0NBQXdDO0FBQ25ELFdBQVcsUUFBUTtBQUNuQixZQUFZLFlBQVk7QUFDeEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLFNBQVM7QUFDbkI7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsR0FBRztBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixJQUFJO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLEtBQUssNkJBQTZCLGdCQUFnQjtBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxlQUFlO0FBQzVCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBLFlBQVksMENBQTBDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FB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QUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDemhLOEM7O0FBRTlDLHNFQUFlLG9FQUFvQixJQUFDOztBQUVnQjs7Ozs7OztVQ0pwRDtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDekJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLDJDQUEyQywwQ0FBMEM7V0FDckYsTUFBTTtXQUNOLDJDQUEyQyxnQ0FBZ0M7V0FDM0U7V0FDQSxLQUFLLHlCQUF5QjtXQUM5QjtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsMENBQTBDLHdDQUF3QztXQUNsRjtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsQ0FBQyxJOzs7OztXQ1BELHdGOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RCxFOzs7OztXQ05BO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7VUVKQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1NBU2pzL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvYXV0aC9hdXRoLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9hdXRoL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9lcnJvci9lcnJvck1vZGlmaWVyLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9lcnJvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvZXJyb3Ivc2VydmVyVHlwZUVycm9yLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9pbnB1dC92YWxpZGF0b3JzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2NvbmZpZ3VyYXRpb24uanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2RlY29kZWRUb2tlbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2ZpbGUuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2ZpbGVUcmVlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9oYXNoLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9odHRwc0FnZW50T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL21hY3JvLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zYXNBdXRoUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL3Nhc0pzRmlsZVR5cGUuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL3NlcnZlckVycm9yLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zZXJ2ZXJUeXBlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zZXJ2aWNlUGFjay5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvdGFyZ2V0LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy90YXJnZXRWYWxpZGF0b3JzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYWN0dWFsQXBwbHkuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYXBwbHlCaW5kLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHkuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL3JlZmxlY3RBcHBseS5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9kdW5kZXItcHJvdG8vZ2V0LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdXJpLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLW9iamVjdC1hdG9tcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mb3JtLWRhdGEvbGliL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dlbmVyYXRvci1mdW5jdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dvcGQvZ09QRC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaGFzb3duL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaXMtY2FsbGFibGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaXMtZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2lzLXR5cGVkLWFycmF5L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2p3dC1kZWNvZGUvYnVpbGQvand0LWRlY29kZS5lc20uanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Ficy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2lzTmFOLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9tYXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvcG93LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9wb3NzaWJsZS10eXBlZC1hcnJheS1uYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvc2FmZS1yZWdleC10ZXN0L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3NldC1mdW5jdGlvbi1sZW5ndGgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9BdXRoTWFuYWdlci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9hdXRoL2luZGV4LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvaXNBdXRob3JpemVGb3JtUmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9pc0xvZ2luUmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9sb2dpbkhlYWRlci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9hdXRoL29wZW5XZWJQYWdlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvdmVyaWZ5U2FzOUxvZ2luLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvdmVyaWZ5U2FzVml5YUxvZ2luLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2pvYi1leGVjdXRpb24vRmlsZVVwbG9hZGVyLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2pvYi1leGVjdXRpb24vSm9iRXhlY3V0b3IudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvbWluaWZpZWQvc2FzOS9TQVNqcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9taW5pZmllZC9zYXM5L1dlYkpvYkV4ZWN1dG9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL21pbmlmaWVkL3NhczkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvcmVxdWVzdC9SZXF1ZXN0Q2xpZW50LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvQ3NyZlRva2VuLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0V4ZWN1dGVTY3JpcHQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvRmlsZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9Gb2xkZXIudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvSm9iLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0pvYkRlZmluaXRpb24udHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvSm9iUmVzdWx0LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0xpbmsudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvTG9naW4udHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvUG9sbE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvUmVxdWVzdENsaWVudC50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9TQVNqc0NvbmZpZy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9TZXNzaW9uLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL1RhYmxlcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9VcGxvYWRGaWxlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL1dyaXRlU3RyZWFtLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Bcmd1bWVudEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9BdXRob3JpemVFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvQ2VydGlmaWNhdGVFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvQ29tcHV0ZUpvYkV4ZWN1dGlvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9FcnJvclJlc3BvbnNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnRlcm5hbFNlcnZlckVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnZhbGlkSnNvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnZhbGlkU0FTanNDc3JmRXJyb3IudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvZXJyb3JzL0pvYkV4ZWN1dGlvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Kb2JTdGF0ZVBvbGxFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvSnNvblBhcnNlQXJyYXlFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvTG9naW5SZXF1aXJlZEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Ob1Nlc3Npb25TdGF0ZUVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Ob3RGb3VuZEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Sb290Rm9sZGVyTm90Rm91bmRFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvU0FTOUF1dGhFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvV2Vib3V0UmVzcG9uc2VFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvYXBwZW5kRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvYXN5bmNGb3JFYWNoLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2NvbXBhcmVUaW1lc3RhbXBzLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2NvbnZlcnRUb0Nzdi50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9jcmVhdGVBeGlvc0luc3RhbmNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2RlbGF5LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2ZldGNoTG9nQnlDaHVua3MudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvZ2V0Rm9ybURhdGEudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvZ2V0VXNlckxhbmd1YWdlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2dldFZhbGlkSnNvbi50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9pbmRleC50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9pc05vZGUudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNSZWxhdGl2ZVBhdGgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNVcmkudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNVcmwudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvbG9naW5Qcm9tcHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvbmVlZHNSZXRyeS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9wYXJzZUdlbmVyYXRlZENvZGUudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvcGFyc2VTYXNWaXlhTG9nLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3BhcnNlU291cmNlQ29kZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9wYXJzZVZpeWFEZWJ1Z1Jlc3BvbnNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3BhcnNlVml5YUxvZ0RlYnVnUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvcGFyc2VXZWJvdXRSZXNwb25zZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9zYXM5L2V4dHJhY3RVc2VyTG9uZ05hbWVTYXM5LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3NlcmlhbGl6ZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9zcGxpdENodW5rcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy92YWxpZGF0ZUlucHV0LnRzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L3R5cGVzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy92YWxpZC11cmwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvd2hpY2gtdHlwZWQtYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9hZGFwdGVyL2FkYXB0ZXIvc3JjL3JlcXVlc3R8aHR0cHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvYXZhaWxhYmxlLXR5cGVkLWFycmF5cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9heGlvcy9kaXN0L2Jyb3dzZXIvYXhpb3MuY2pzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dlbmVyYXRvci1mdW5jdGlvbi9yZXF1aXJlLm1qcyIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vU0FTanMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1NBU2pzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vU0FTanMvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL1NBU2pzL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU0FTanNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiU0FTanNcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZVRva2VuID0gZXhwb3J0cy5oYXNUb2tlbkV4cGlyZWQgPSBleHBvcnRzLmlzUmVmcmVzaFRva2VuRXhwaXJpbmcgPSBleHBvcnRzLmlzQWNjZXNzVG9rZW5FeHBpcmluZyA9IHZvaWQgMDtcbmNvbnN0IGp3dF9kZWNvZGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiand0LWRlY29kZVwiKSk7XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgQWNjZXNzIFRva2VuIGlzIGV4cGlyZWQgb3IgaXMgZXhwaXJpbmcgaW4gMSBob3VyLiAgQSBkZWZhdWx0IEFjY2VzcyBUb2tlblxuICogbGFzdHMgMTIgaG91cnMuIElmIHRoZSBBY2Nlc3MgVG9rZW4gZXhwaXJlcywgdGhlIFJlZnJlc2ggVG9rZW4gaXMgdXNlZCB0byBmZXRjaCBhIG5ld1xuICogQWNjZXNzIFRva2VuLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBSZWZyZXNoIFRva2VuIGlzIGV4cGlyZWQsIDEgaG91ciBpcyBlbm91Z2ggdG8gbGV0XG4gKiBtb3N0IGpvYnMgZmluaXNoLlxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuLSB0b2tlbiBzdHJpbmcgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVUb0xpdmVTZWNvbmRzIC0gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHRva2VuIGhhcyBiZWZvcmUgaXQgZXhwaXJlcywgZGVmYXVsdHMgdG8gMzYwMFxuICogQHJldHVybnMge2Jvb2xlYW59IGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0b2tlbiBpcyBhYm91dCB0byBleHBpcmVcbiAqL1xuZnVuY3Rpb24gaXNBY2Nlc3NUb2tlbkV4cGlyaW5nKHRva2VuLCB0aW1lVG9MaXZlU2Vjb25kcyA9IDM2MDApIHtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNUb2tlbkV4cGlyaW5nKHRva2VuLCB0aW1lVG9MaXZlU2Vjb25kcyk7XG59XG5leHBvcnRzLmlzQWNjZXNzVG9rZW5FeHBpcmluZyA9IGlzQWNjZXNzVG9rZW5FeHBpcmluZztcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBSZWZyZXNoIFRva2VuIGlzIGV4cGlyZWQgb3IgZXhwaXJpbmcgaW4gMzAgc2Vjcy4gQSBkZWZhdWx0IFJlZnJlc2ggVG9rZW5cbiAqIGxhc3RzIDMwIGRheXMuICBPbmNlIHRoZSBSZWZyZXNoIFRva2VuIGV4cGlyZXMsIHRoZSB1c2VyIG11c3QgcmUtYXV0aGVudGljYXRlIChwcm92aWRlXG4gKiBjcmVkZW50aWFscyBpbiBhIGJyb3dzZXIgdG8gb2J0YWluIGFuIGF1dGhvcmlzYXRpb24gY29kZSkuIDMwIHNlY29uZHMgaXMgZW5vdWdoIHRpbWVcbiAqIHRvIG1ha2UgYSByZXF1ZXN0IGZvciBhIGZpbmFsIEFjY2VzcyBUb2tlbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbi0gdG9rZW4gc3RyaW5nIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lVG9MaXZlU2Vjb25kcyAtIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB0b2tlbiBoYXMgYmVmb3JlIGl0IGV4cGlyZXMsIGRlZmF1bHRzIHRvIDMwXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRva2VuIGlzIGFib3V0IHRvIGV4cGlyZVxuICovXG5mdW5jdGlvbiBpc1JlZnJlc2hUb2tlbkV4cGlyaW5nKHRva2VuLCB0aW1lVG9MaXZlU2Vjb25kcyA9IDMwKSB7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVG9rZW5FeHBpcmluZyh0b2tlbiwgdGltZVRvTGl2ZVNlY29uZHMpO1xufVxuZXhwb3J0cy5pc1JlZnJlc2hUb2tlbkV4cGlyaW5nID0gaXNSZWZyZXNoVG9rZW5FeHBpcmluZztcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0b2tlbiBoYXMgZXhwaXJlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbi0gdG9rZW4gc3RyaW5nIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gaGFzIGV4cGlyZWRcbiAqL1xuZnVuY3Rpb24gaGFzVG9rZW5FeHBpcmVkKHRva2VuKSB7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVG9rZW5FeHBpcmluZyh0b2tlbiwgMCk7XG59XG5leHBvcnRzLmhhc1Rva2VuRXhwaXJlZCA9IGhhc1Rva2VuRXhwaXJlZDtcbmZ1bmN0aW9uIGlzVG9rZW5FeHBpcmluZyh0b2tlbiwgdGltZVRvTGl2ZVNlY29uZHMpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gKDAsIGp3dF9kZWNvZGVfMS5kZWZhdWx0KSh0b2tlbik7XG4gICAgY29uc3QgdGltZVRvTGl2ZSA9IHBheWxvYWQuZXhwIC0gbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwO1xuICAgIHJldHVybiB0aW1lVG9MaXZlIDw9IHRpbWVUb0xpdmVTZWNvbmRzO1xufVxuZnVuY3Rpb24gZGVjb2RlVG9rZW4odG9rZW4pIHtcbiAgICBsZXQgcGF5bG9hZDtcbiAgICB0cnkge1xuICAgICAgICBwYXlsb2FkID0gKDAsIGp3dF9kZWNvZGVfMS5kZWZhdWx0KSh0b2tlbik7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIHN1cHBsaWVkLicpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydHMuZGVjb2RlVG9rZW4gPSBkZWNvZGVUb2tlbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9hdXRoXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wcmVmaXhNZXNzYWdlID0gdm9pZCAwO1xuY29uc3QgcHJlZml4TWVzc2FnZSA9IChlcnIsIG1lc3NhZ2VQcmVmaXgpID0+IHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGVyci5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICBlcnIubWVzc2FnZSA9IG1lc3NhZ2VQcmVmaXggKyBlcnIubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlcnIuaGFzT3duUHJvcGVydHkoJ2JvZHknKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyLmJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID0gZXJyLmJvZHkubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlUHJlZml4ICsgZXJyLmJvZHkubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlUHJlZml4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVyci5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGVyci5ib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID0gbWVzc2FnZVByZWZpeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYm9keS5tZXNzYWdlID0gYm9keS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VQcmVmaXggKyBib2R5Lm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZVByZWZpeDtcbiAgICAgICAgICAgICAgICAgICAgZXJyLmJvZHkgPSBib2R5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlcnIpLCB7IG1lc3NhZ2U6IG1lc3NhZ2VQcmVmaXggfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKVxuICAgICAgICBlcnIgPSBtZXNzYWdlUHJlZml4ICsgZXJyO1xuICAgIHJldHVybiBlcnI7XG59O1xuZXhwb3J0cy5wcmVmaXhNZXNzYWdlID0gcHJlZml4TWVzc2FnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9yTW9kaWZpZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9lcnJvck1vZGlmaWVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zZXJ2ZXJUeXBlRXJyb3JcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlcnZlclR5cGVFcnJvciA9IHZvaWQgMDtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG5jbGFzcyBTZXJ2ZXJUeXBlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IodmFsaWRPcHRpb25zID0gW10pIHtcbiAgICAgICAgdmFsaWRPcHRpb25zID0gWy4uLm5ldyBTZXQodmFsaWRPcHRpb25zKV07XG4gICAgICAgIGxldCBvcHRpb25zID0gdmFsaWRPcHRpb25zLmxlbmd0aFxuICAgICAgICAgICAgPyB2YWxpZE9wdGlvbnMuam9pbignLCAnKS50cmltKClcbiAgICAgICAgICAgIDogW3R5cGVzXzEuU2VydmVyVHlwZS5TYXNWaXlhLCB0eXBlc18xLlNlcnZlclR5cGUuU2FzOSwgdHlwZXNfMS5TZXJ2ZXJUeXBlLlNhc2pzXVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMucmVwbGFjZSgvLFxccyhbXixdKikkLywgJyBhbmQgJDEnKTtcbiAgICAgICAgc3VwZXIoYEludmFsaWQgc2VydmVyIHR5cGU6IHZhbGlkIG9wdGlvbiR7dmFsaWRPcHRpb25zLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSAke3ZhbGlkT3B0aW9ucy5sZW5ndGggIT09IDEgPyAnYXJlJyA6ICdpcyd9ICR7b3B0aW9uc31gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ1NlcnZlclR5cGVFcnJvcic7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTZXJ2ZXJUeXBlRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLlNlcnZlclR5cGVFcnJvciA9IFNlcnZlclR5cGVFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcnZlclR5cGVFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNTcGVjaWFsTWlzc2luZyA9IGV4cG9ydHMuY2hvaWNlVmFsaWRhdG9yID0gZXhwb3J0cy5jb25maXJtYXRpb25WYWxpZGF0b3IgPSBleHBvcnRzLnVybFZhbGlkYXRvciA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkX3VybF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJ2YWxpZC11cmxcIikpO1xuY29uc3QgdXJsVmFsaWRhdG9yID0gKHZhbHVlLCBlcnJvck1lc3NhZ2UpID0+ICEhdmFsaWRfdXJsXzEuZGVmYXVsdC5pc0h0dHBVcmkodmFsdWUpIHx8XG4gICAgISF2YWxpZF91cmxfMS5kZWZhdWx0LmlzSHR0cHNVcmkodmFsdWUpIHx8XG4gICAgdmFsdWUgPT09ICcnIHx8XG4gICAgZXJyb3JNZXNzYWdlO1xuZXhwb3J0cy51cmxWYWxpZGF0b3IgPSB1cmxWYWxpZGF0b3I7XG5jb25zdCBjb25maXJtYXRpb25WYWxpZGF0b3IgPSAodmFsdWUpID0+IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbmV4cG9ydHMuY29uZmlybWF0aW9uVmFsaWRhdG9yID0gY29uZmlybWF0aW9uVmFsaWRhdG9yO1xuY29uc3QgY2hvaWNlVmFsaWRhdG9yID0gKHZhbHVlLCBudW1iZXJPZkNob2ljZXMsIGVycm9yTWVzc2FnZSkgPT4gKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBudW1iZXJPZkNob2ljZXMpIHx8IGVycm9yTWVzc2FnZTtcbmV4cG9ydHMuY2hvaWNlVmFsaWRhdG9yID0gY2hvaWNlVmFsaWRhdG9yO1xuLy8gVGhpcyByZWdleCB3aWxsIG1hdGNoIHNwZWNpYWwgbWlzc2luZ1xuLy8gYGEtemAgb3IgYF9gIG9yIGAuYCBvciAnLlthLXpdJ1xuY29uc3QgaXNTcGVjaWFsTWlzc2luZyA9ICh2YWx1ZSkgPT4ge1xuICAgIC8vIFRoaXMgcmVnZXggY2FuJ3QgY292ZXIgdGhlIGNhc2Ugd2l0aCBgLi5gIHR3byBkb3RzLCBzbyBpZiB3ZSByZWNlaXZlIGl0IHRoYXQgaXMgZmFsc2Ugc3BlY2lhbCBtaXNzaW5nXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJy4uJykpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14oXFxcXC4pP1thLXpfLl17MX0kJywgJ2knKTtcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG59O1xuZXhwb3J0cy5pc1NwZWNpYWxNaXNzaW5nID0gaXNTcGVjaWFsTWlzc2luZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhbGlkYXRvcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbmZpZ1R5cGVzID0gdm9pZCAwO1xudmFyIENvbmZpZ1R5cGVzO1xuKGZ1bmN0aW9uIChDb25maWdUeXBlcykge1xuICAgIENvbmZpZ1R5cGVzW1wiQnVpbGRcIl0gPSBcImJ1aWxkQ29uZmlnXCI7XG4gICAgQ29uZmlnVHlwZXNbXCJTZXJ2aWNlXCJdID0gXCJzZXJ2aWNlQ29uZmlnXCI7XG4gICAgQ29uZmlnVHlwZXNbXCJKb2JcIl0gPSBcImpvYkNvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiVGVzdFwiXSA9IFwidGVzdENvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiRG9jXCJdID0gXCJkb2NDb25maWdcIjtcbiAgICBDb25maWdUeXBlc1tcIkRlcGxveVwiXSA9IFwiZGVwbG95Q29uZmlnXCI7XG4gICAgQ29uZmlnVHlwZXNbXCJTdHJlYW1cIl0gPSBcInN0cmVhbUNvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiQXV0aFwiXSA9IFwiYXV0aENvbmZpZ1wiO1xufSkoQ29uZmlnVHlwZXMgPSBleHBvcnRzLkNvbmZpZ1R5cGVzIHx8IChleHBvcnRzLkNvbmZpZ1R5cGVzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZ3VyYXRpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGVkVG9rZW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHRyYVJlc3BvbnNlQXR0cmlidXRlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTGluZUVuZGluZ3MgPSB2b2lkIDA7XG52YXIgTGluZUVuZGluZ3M7XG4oZnVuY3Rpb24gKExpbmVFbmRpbmdzKSB7XG4gICAgTGluZUVuZGluZ3NbXCJDUkxGXCJdID0gXCJcXHJcXG5cIjtcbiAgICBMaW5lRW5kaW5nc1tcIkxGXCJdID0gXCJcXG5cIjtcbn0pKExpbmVFbmRpbmdzID0gZXhwb3J0cy5MaW5lRW5kaW5ncyB8fCAoZXhwb3J0cy5MaW5lRW5kaW5ncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5NZW1iZXJUeXBlID0gdm9pZCAwO1xudmFyIE1lbWJlclR5cGU7XG4oZnVuY3Rpb24gKE1lbWJlclR5cGUpIHtcbiAgICBNZW1iZXJUeXBlW1wic2VydmljZVwiXSA9IFwic2VydmljZVwiO1xuICAgIE1lbWJlclR5cGVbXCJmaWxlXCJdID0gXCJmaWxlXCI7XG4gICAgTWVtYmVyVHlwZVtcImZvbGRlclwiXSA9IFwiZm9sZGVyXCI7XG59KShNZW1iZXJUeXBlID0gZXhwb3J0cy5NZW1iZXJUeXBlIHx8IChleHBvcnRzLk1lbWJlclR5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZVRyZWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cHNBZ2VudE9wdGlvbnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jb25maWdcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbmZpZ3VyYXRpb25cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2RlY29kZWRUb2tlblwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2ZpbGVUcmVlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9oYXNoXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9odHRwc0FnZW50T3B0aW9uc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbWFjcm9cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Nhc0F1dGhSZXNwb25zZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2FzSnNGaWxlVHlwZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2VydmVyRXJyb3JcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NlcnZlclR5cGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NlcnZpY2VQYWNrXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90YXJnZXRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2ZpbGVcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzTWFjcm9WYXJzID0gdm9pZCAwO1xuY29uc3QgaXNNYWNyb1ZhcnMgPSAoYXJnKSA9PiBhcmcgJiYgdHlwZW9mIGFyZy5tYWNyb1ZhcnMgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFyZy5tYWNyb1ZhcnMpO1xuZXhwb3J0cy5pc01hY3JvVmFycyA9IGlzTWFjcm9WYXJzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFjcm8uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zYXNBdXRoUmVzcG9uc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNBU0pzRmlsZVR5cGUgPSB2b2lkIDA7XG52YXIgU0FTSnNGaWxlVHlwZTtcbihmdW5jdGlvbiAoU0FTSnNGaWxlVHlwZSkge1xuICAgIFNBU0pzRmlsZVR5cGVbXCJzZXJ2aWNlXCJdID0gXCJTZXJ2aWNlXCI7XG4gICAgU0FTSnNGaWxlVHlwZVtcImpvYlwiXSA9IFwiSm9iXCI7XG4gICAgU0FTSnNGaWxlVHlwZVtcInRlc3RcIl0gPSBcIlRlc3RcIjtcbiAgICBTQVNKc0ZpbGVUeXBlW1wiZmlsZVwiXSA9IFwiRmlsZVwiOyAvLyBTaG91bGQgYmUgdXNlZCB3aGVuIGZpbGUgY29udGVudCBpcyBub3QgY29uc2lkZXJlZCBhcyBTZXJ2aWNlLCBKb2Igb3IgVGVzdCBhbmQgaXMgdXNlZCBhcyByYXcgY29udGVudFxufSkoU0FTSnNGaWxlVHlwZSA9IGV4cG9ydHMuU0FTSnNGaWxlVHlwZSB8fCAoZXhwb3J0cy5TQVNKc0ZpbGVUeXBlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNhc0pzRmlsZVR5cGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJ2ZXJFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2VydmVyVHlwZSA9IHZvaWQgMDtcbnZhciBTZXJ2ZXJUeXBlO1xuKGZ1bmN0aW9uIChTZXJ2ZXJUeXBlKSB7XG4gICAgU2VydmVyVHlwZVtcIlNhc1ZpeWFcIl0gPSBcIlNBU1ZJWUFcIjtcbiAgICBTZXJ2ZXJUeXBlW1wiU2FzOVwiXSA9IFwiU0FTOVwiO1xuICAgIFNlcnZlclR5cGVbXCJTYXNqc1wiXSA9IFwiU0FTSlNcIjtcbn0pKFNlcnZlclR5cGUgPSBleHBvcnRzLlNlcnZlclR5cGUgfHwgKGV4cG9ydHMuU2VydmVyVHlwZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJ2ZXJUeXBlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VydmljZVBhY2suanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRhcmdldCA9IHZvaWQgMDtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vY29uZmlnXCIpO1xuY29uc3Qgc2VydmVyVHlwZV8xID0gcmVxdWlyZShcIi4vc2VydmVyVHlwZVwiKTtcbmNvbnN0IHRhcmdldFZhbGlkYXRvcnNfMSA9IHJlcXVpcmUoXCIuL3RhcmdldFZhbGlkYXRvcnNcIik7XG5jbGFzcyBUYXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKGpzb24sIGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3NlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlXzEuU2VydmVyVHlwZS5TYXNWaXlhO1xuICAgICAgICB0aGlzLmdldENvbmZpZyA9IChrZXksIGpzb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NvbmZpZ1trZXldIHx8IHt9O1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKSwganNvbltrZXldKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghanNvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXJnZXQ6IElucHV0IEpTT04gaXMgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVRhcmdldE5hbWUpKGpzb24ubmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJVcmwgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlU2VydmVyVXJsKShqc29uLnNlcnZlclVybCk7XG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJUeXBlID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVNlcnZlclR5cGUpKGpzb24uc2VydmVyVHlwZSk7XG4gICAgICAgICAgICB0aGlzLl9odHRwc0FnZW50T3B0aW9ucyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVIdHRwc0FnZW50T3B0aW9ucykoanNvbi5odHRwc0FnZW50T3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hcHBMb2MgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlQXBwTG9jKShqc29uLmFwcExvYyk7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0TmFtZSA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVDb250ZXh0TmFtZSkoanNvbi5jb250ZXh0TmFtZSwgdGhpcy5fc2VydmVyVHlwZSk7XG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJOYW1lID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVNlcnZlck5hbWUpKGpzb24uc2VydmVyTmFtZSwgdGhpcy5fc2VydmVyVHlwZSk7XG4gICAgICAgICAgICB0aGlzLl9zeW5jRm9sZGVyID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVN5bmNGb2xkZXIpKGpzb24uc3luY0ZvbGRlcik7XG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0b3J5TmFtZSA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVSZXBvc2l0b3J5TmFtZSkoanNvbi5yZXBvc2l0b3J5TmFtZSwgdGhpcy5fc2VydmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoanNvbi5kb2NDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2NDb25maWcgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlRG9jQ29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5Eb2MsIGpzb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmF1dGhDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoQ29uZmlnID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZUF1dGhDb25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLkF1dGgsIGpzb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmF1dGhDb25maWdTYXM5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aENvbmZpZ1NhczkgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlQXV0aENvbmZpZ1NhczkpKGpzb24uYXV0aENvbmZpZ1NhczkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24uYnVpbGRDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9idWlsZENvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVCdWlsZENvbmZpZykodGhpcy5nZXRDb25maWcoY29uZmlnXzEuQ29uZmlnVHlwZXMuQnVpbGQsIGpzb24pLCB0aGlzLl9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmRlcGxveUNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlcGxveUNvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVEZXBsb3lDb25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLkRlcGxveSwganNvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVwbG95Q29uZmlnID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZURlcGxveUNvbmZpZykoe1xuICAgICAgICAgICAgICAgICAgICBkZXBsb3lTZXJ2aWNlUGFjazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95U2NyaXB0czogW11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLnNlcnZpY2VDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlQ29uZmlnID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVNlcnZpY2VDb25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLlNlcnZpY2UsIGpzb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmpvYkNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2pvYkNvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVKb2JDb25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLkpvYiwganNvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24uc3RyZWFtQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RyZWFtQ29uZmlnID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVN0cmVhbUNvbmZpZykodGhpcy5nZXRDb25maWcoY29uZmlnXzEuQ29uZmlnVHlwZXMuU3RyZWFtLCBqc29uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi50ZXN0Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVzdENvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVUZXN0Q29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5UZXN0LCBqc29uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5tYWNyb0ZvbGRlcnMgJiYganNvbi5tYWNyb0ZvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFjcm9Gb2xkZXJzID0ganNvbi5tYWNyb0ZvbGRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5wcm9ncmFtRm9sZGVycyAmJiBqc29uLnByb2dyYW1Gb2xkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyYW1Gb2xkZXJzID0ganNvbi5wcm9ncmFtRm9sZGVycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmJpbmFyeUZvbGRlcnMgJiYganNvbi5iaW5hcnlGb2xkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmFyeUZvbGRlcnMgPSBqc29uLmJpbmFyeUZvbGRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5zeW5jRGlyZWN0b3JpZXMgJiYganNvbi5zeW5jRGlyZWN0b3JpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3luY0RpcmVjdG9yaWVzID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVN5bmNEaXJlY3RvcmllcykoanNvbi5zeW5jRGlyZWN0b3JpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24uc2FzanNCdWlsZEZvbGRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nhc2pzQnVpbGRGb2xkZXIgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlU2FzanNCdWlsZEZvbGRlcikoanNvbi5zYXNqc0J1aWxkRm9sZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLnNhc2pzUmVzdWx0c0ZvbGRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nhc2pzUmVzdWx0c0ZvbGRlciA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTYXNqc1Jlc3VsdHNGb2xkZXIpKGpzb24uc2FzanNSZXN1bHRzRm9sZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIHRhcmdldDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBnZXQgc2VydmVyVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsO1xuICAgIH1cbiAgICBnZXQgc2VydmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlclR5cGU7XG4gICAgfVxuICAgIGdldCBodHRwc0FnZW50T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBzQWdlbnRPcHRpb25zO1xuICAgIH1cbiAgICBnZXQgYXBwTG9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwTG9jO1xuICAgIH1cbiAgICBnZXQgZG9jQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jQ29uZmlnO1xuICAgIH1cbiAgICBnZXQgYXV0aENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhDb25maWc7XG4gICAgfVxuICAgIGdldCBhdXRoQ29uZmlnU2FzOSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhDb25maWdTYXM5O1xuICAgIH1cbiAgICBnZXQgYnVpbGRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWlsZENvbmZpZztcbiAgICB9XG4gICAgZ2V0IGRlcGxveUNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlcGxveUNvbmZpZztcbiAgICB9XG4gICAgZ2V0IHNlcnZpY2VDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlQ29uZmlnO1xuICAgIH1cbiAgICBnZXQgam9iQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fam9iQ29uZmlnO1xuICAgIH1cbiAgICBnZXQgc3RyZWFtQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtQ29uZmlnO1xuICAgIH1cbiAgICBnZXQgbWFjcm9Gb2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFjcm9Gb2xkZXJzO1xuICAgIH1cbiAgICBnZXQgcHJvZ3JhbUZvbGRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmFtRm9sZGVycztcbiAgICB9XG4gICAgZ2V0IGJpbmFyeUZvbGRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5hcnlGb2xkZXJzO1xuICAgIH1cbiAgICBnZXQgY29udGV4dE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0TmFtZTtcbiAgICB9XG4gICAgZ2V0IHNlcnZlck5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJOYW1lO1xuICAgIH1cbiAgICBnZXQgcmVwb3NpdG9yeU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBvc2l0b3J5TmFtZTtcbiAgICB9XG4gICAgZ2V0IHRlc3RDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXN0Q29uZmlnO1xuICAgIH1cbiAgICBnZXQgc3luY0ZvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N5bmNGb2xkZXI7XG4gICAgfVxuICAgIGdldCBzeW5jRGlyZWN0b3JpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zeW5jRGlyZWN0b3JpZXM7XG4gICAgfVxuICAgIGdldCBzYXNqc0J1aWxkRm9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2FzanNCdWlsZEZvbGRlcjtcbiAgICB9XG4gICAgZ2V0IHNhc2pzUmVzdWx0c0ZvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nhc2pzUmVzdWx0c0ZvbGRlcjtcbiAgICB9XG4gICAgdG9Kc29uKHdpdGhEZWZhdWx0cyA9IHRydWUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzZXJ2ZXJVcmw6IHRoaXMuc2VydmVyVXJsLFxuICAgICAgICAgICAgc2VydmVyVHlwZTogdGhpcy5zZXJ2ZXJUeXBlLFxuICAgICAgICAgICAgaHR0cHNBZ2VudE9wdGlvbnM6IHRoaXMuaHR0cHNBZ2VudE9wdGlvbnMsXG4gICAgICAgICAgICBhcHBMb2M6IHRoaXMuYXBwTG9jLFxuICAgICAgICAgICAgZG9jQ29uZmlnOiB0aGlzLmRvY0NvbmZpZyxcbiAgICAgICAgICAgIGRlcGxveUNvbmZpZzogdGhpcy5kZXBsb3lDb25maWdcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKChfYSA9IHRoaXMubWFjcm9Gb2xkZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKVxuICAgICAgICAgICAganNvbi5tYWNyb0ZvbGRlcnMgPSB0aGlzLm1hY3JvRm9sZGVycztcbiAgICAgICAgaWYgKChfYiA9IHRoaXMucHJvZ3JhbUZvbGRlcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpXG4gICAgICAgICAgICBqc29uLnByb2dyYW1Gb2xkZXJzID0gdGhpcy5wcm9ncmFtRm9sZGVycztcbiAgICAgICAgaWYgKChfYyA9IHRoaXMuYmluYXJ5Rm9sZGVycykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxlbmd0aClcbiAgICAgICAgICAgIGpzb24uYmluYXJ5Rm9sZGVycyA9IHRoaXMuYmluYXJ5Rm9sZGVycztcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbmZpZykge1xuICAgICAgICAgICAganNvbi5hdXRoQ29uZmlnID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb25maWdTYXM5KSB7XG4gICAgICAgICAgICBqc29uLmF1dGhDb25maWdTYXM5ID0gdGhpcy5hdXRoQ29uZmlnU2FzOTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zYXNqc0J1aWxkRm9sZGVyKSB7XG4gICAgICAgICAgICBqc29uLnNhc2pzQnVpbGRGb2xkZXIgPSB0aGlzLnNhc2pzQnVpbGRGb2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKSB7XG4gICAgICAgICAgICBqc29uLnNhc2pzQnVpbGRGb2xkZXIgPSB0YXJnZXRWYWxpZGF0b3JzXzEuREVGQVVMVF9TQVNKU19CVUlMRF9GT0xERVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2FzanNSZXN1bHRzRm9sZGVyKSB7XG4gICAgICAgICAgICBqc29uLnNhc2pzUmVzdWx0c0ZvbGRlciA9IHRoaXMuc2FzanNSZXN1bHRzRm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhEZWZhdWx0cykge1xuICAgICAgICAgICAganNvbi5zYXNqc1Jlc3VsdHNGb2xkZXIgPSB0YXJnZXRWYWxpZGF0b3JzXzEuREVGQVVMVF9TQVNKU19SRVNVTFRTX0ZPTERFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zeW5jRGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICAgIGpzb24uc3luY0RpcmVjdG9yaWVzID0gdGhpcy5zeW5jRGlyZWN0b3JpZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKSB7XG4gICAgICAgICAgICBqc29uLnN5bmNEaXJlY3RvcmllcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBqc29uLmJ1aWxkQ29uZmlnID0gdGhpcy5idWlsZENvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpXG4gICAgICAgICAgICBqc29uLmJ1aWxkQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGluaXRQcm9ncmFtOiAnJyxcbiAgICAgICAgICAgICAgICB0ZXJtUHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgYnVpbGRPdXRwdXRGaWxlTmFtZTogYCR7dGhpcy5uYW1lfS5zYXNgLFxuICAgICAgICAgICAgICAgIG1hY3JvVmFyczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmpvYkNvbmZpZykge1xuICAgICAgICAgICAganNvbi5qb2JDb25maWcgPSB0aGlzLmpvYkNvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpXG4gICAgICAgICAgICBqc29uLmpvYkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBqb2JGb2xkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBpbml0UHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgdGVybVByb2dyYW06ICcnLFxuICAgICAgICAgICAgICAgIG1hY3JvVmFyczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VDb25maWcpIHtcbiAgICAgICAgICAgIGpzb24uc2VydmljZUNvbmZpZyA9IHRoaXMuc2VydmljZUNvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpXG4gICAgICAgICAgICBqc29uLnNlcnZpY2VDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgc2VydmljZUZvbGRlcnM6IFtdLFxuICAgICAgICAgICAgICAgIGluaXRQcm9ncmFtOiAnJyxcbiAgICAgICAgICAgICAgICB0ZXJtUHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgbWFjcm9WYXJzOiB7fVxuICAgICAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtQ29uZmlnKSB7XG4gICAgICAgICAgICBqc29uLnN0cmVhbUNvbmZpZyA9IHRoaXMuc3RyZWFtQ29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhEZWZhdWx0cylcbiAgICAgICAgICAgIGpzb24uc3RyZWFtQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHN0cmVhbVdlYkZvbGRlcjogJycsXG4gICAgICAgICAgICAgICAgc3RyZWFtV2ViOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3ZWJTb3VyY2VQYXRoOiAnJyxcbiAgICAgICAgICAgICAgICBzdHJlYW1TZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgYXNzZXRQYXRoczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRlc3RDb25maWcpIHtcbiAgICAgICAgICAgIGpzb24udGVzdENvbmZpZyA9IHRoaXMudGVzdENvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpXG4gICAgICAgICAgICBqc29uLnRlc3RDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaW5pdFByb2dyYW06ICcnLFxuICAgICAgICAgICAgICAgIHRlcm1Qcm9ncmFtOiAnJyxcbiAgICAgICAgICAgICAgICBtYWNyb1ZhcnM6IHt9LFxuICAgICAgICAgICAgICAgIHRlc3RTZXRVcDogJycsXG4gICAgICAgICAgICAgICAgdGVzdFRlYXJEb3duOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyVHlwZSA9PT0gc2VydmVyVHlwZV8xLlNlcnZlclR5cGUuU2FzVml5YSkge1xuICAgICAgICAgICAganNvbi5jb250ZXh0TmFtZSA9IHRoaXMuY29udGV4dE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zZXJ2ZXJUeXBlID09PSBzZXJ2ZXJUeXBlXzEuU2VydmVyVHlwZS5TYXM5KSB7XG4gICAgICAgICAgICBqc29uLnNlcnZlck5hbWUgPSB0aGlzLnNlcnZlck5hbWU7XG4gICAgICAgICAgICBqc29uLnJlcG9zaXRvcnlOYW1lID0gdGhpcy5yZXBvc2l0b3J5TmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG59XG5leHBvcnRzLlRhcmdldCA9IFRhcmdldDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhcmdldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVTYXNqc1Jlc3VsdHNGb2xkZXIgPSBleHBvcnRzLnZhbGlkYXRlU2FzanNCdWlsZEZvbGRlciA9IGV4cG9ydHMudmFsaWRhdGVTeW5jRGlyZWN0b3JpZXMgPSBleHBvcnRzLnZhbGlkYXRlUmVwb3NpdG9yeU5hbWUgPSBleHBvcnRzLnZhbGlkYXRlU3luY0ZvbGRlciA9IGV4cG9ydHMudmFsaWRhdGVTZXJ2ZXJOYW1lID0gZXhwb3J0cy52YWxpZGF0ZUNvbnRleHROYW1lID0gZXhwb3J0cy52YWxpZGF0ZVN0cmVhbUNvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVEZXBsb3lDb25maWcgPSBleHBvcnRzLnZhbGlkYXRlSm9iQ29uZmlnID0gZXhwb3J0cy52YWxpZGF0ZVRlc3RDb25maWcgPSBleHBvcnRzLnZhbGlkYXRlU2VydmljZUNvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVCdWlsZENvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVBdXRoQ29uZmlnU2FzOSA9IGV4cG9ydHMudmFsaWRhdGVBdXRoQ29uZmlnID0gZXhwb3J0cy52YWxpZGF0ZURvY0NvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVBcHBMb2MgPSBleHBvcnRzLnZhbGlkYXRlSHR0cHNBZ2VudE9wdGlvbnMgPSBleHBvcnRzLnZhbGlkYXRlU2VydmVyVXJsID0gZXhwb3J0cy52YWxpZGF0ZVRhcmdldE5hbWUgPSBleHBvcnRzLnZhbGlkYXRlU2VydmVyVHlwZSA9IGV4cG9ydHMuREVGQVVMVF9TQVNKU19SRVNVTFRTX0ZPTERFUiA9IGV4cG9ydHMuREVGQVVMVF9TQVNKU19CVUlMRF9GT0xERVIgPSB2b2lkIDA7XG5jb25zdCB2YWxpZF91cmxfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwidmFsaWQtdXJsXCIpKTtcbmNvbnN0IF8xID0gcmVxdWlyZShcIi5cIik7XG5jb25zdCBERUZBVUxUX0NPTlRFWFRfTkFNRSA9ICdTQVMgSm9iIEV4ZWN1dGlvbiBjb21wdXRlIGNvbnRleHQnO1xuY29uc3QgREVGQVVMVF9TRVJWRVJfTkFNRSA9ICdTQVNBcHAnO1xuY29uc3QgREVGQVVMVF9SRVBPU0lUT1JZX05BTUUgPSAnRm91bmRhdGlvbic7XG5leHBvcnRzLkRFRkFVTFRfU0FTSlNfQlVJTERfRk9MREVSID0gJ3Nhc2pzYnVpbGQnO1xuZXhwb3J0cy5ERUZBVUxUX1NBU0pTX1JFU1VMVFNfRk9MREVSID0gJ3Nhc2pzcmVzdWx0cyc7XG5jb25zdCB2YWxpZGF0ZVNlcnZlclR5cGUgPSAoc2VydmVyVHlwZSkgPT4ge1xuICAgIGlmICghc2VydmVyVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2VydmVyIHR5cGU6IGBzZXJ2ZXJUeXBlYCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICghKHNlcnZlclR5cGUgPT09IF8xLlNlcnZlclR5cGUuU2FzOSB8fFxuICAgICAgICBzZXJ2ZXJUeXBlID09PSBfMS5TZXJ2ZXJUeXBlLlNhc1ZpeWEgfHxcbiAgICAgICAgc2VydmVyVHlwZSA9PT0gXzEuU2VydmVyVHlwZS5TYXNqcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZlciB0eXBlOiBTdXBwb3J0ZWQgdmFsdWVzIGZvciAgXFxgc2VydmVyVHlwZVxcYCBhcmUgJHtfMS5TZXJ2ZXJUeXBlLlNhc1ZpeWF9LCAke18xLlNlcnZlclR5cGUuU2FzOX0gYW5kICR7XzEuU2VydmVyVHlwZS5TYXNqc30uYCk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2ZXJUeXBlO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTZXJ2ZXJUeXBlID0gdmFsaWRhdGVTZXJ2ZXJUeXBlO1xuY29uc3QgdmFsaWRhdGVUYXJnZXROYW1lID0gKHRhcmdldE5hbWUpID0+IHtcbiAgICBpZiAoIXRhcmdldE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhcmdldCBuYW1lOiBgbmFtZWAgY2Fubm90IGJlIGVtcHR5LCBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldE5hbWUudHJpbSgpLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhcmdldCBuYW1lOiBgbmFtZWAgY2Fubm90IGluY2x1ZGUgc3BhY2VzLicpO1xuICAgIH1cbiAgICBpZiAoIS9eW2EtekEtWjAtOVxcLV0rJC9pLnRlc3QodGFyZ2V0TmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhcmdldCBuYW1lOiBgbmFtZWAgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgZGFzaGVzLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0TmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlVGFyZ2V0TmFtZSA9IHZhbGlkYXRlVGFyZ2V0TmFtZTtcbmNvbnN0IHZhbGlkYXRlU2VydmVyVXJsID0gKHNlcnZlclVybCkgPT4ge1xuICAgIGlmIChzZXJ2ZXJVcmwgPT09IG51bGwgfHwgc2VydmVyVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VydmVyVXJsID0gJyc7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJVcmwgIT09ICcnICYmXG4gICAgICAgICF2YWxpZF91cmxfMS5kZWZhdWx0LmlzSHR0cFVyaShzZXJ2ZXJVcmwpICYmXG4gICAgICAgICF2YWxpZF91cmxfMS5kZWZhdWx0LmlzSHR0cHNVcmkoc2VydmVyVXJsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2VydmVyIFVSTDogYHNlcnZlclVybGAgc2hvdWxkIGVpdGhlciBiZSBhbiBlbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBVUkwgb2YgdGhlIGZvcm0gaHR0cChzKTovL3lvdXItc2VydmVyLmNvbSg6cG9ydCkuJyk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2ZXJVcmw7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVNlcnZlclVybCA9IHZhbGlkYXRlU2VydmVyVXJsO1xuY29uc3QgdmFsaWRhdGVIdHRwc0FnZW50T3B0aW9ucyA9IChodHRwc0FnZW50T3B0aW9ucykgPT4ge1xuICAgIGlmICghaHR0cHNBZ2VudE9wdGlvbnMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGh0dHBzQWdlbnRPcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWU6IGBodHRwc0FnZW50T3B0aW9uc2Agc2hvdWxkIGVpdGhlciBiZSBhbiBlbXB0eSBvciBhbiBvYmplY3Qgb2YgYEh0dHBzQWdlbnRPcHRpb25zYCcpO1xuICAgIH1cbiAgICBpZiAoaHR0cHNBZ2VudE9wdGlvbnMuYWxsb3dJbnNlY3VyZVJlcXVlc3RzID09PSBudWxsIHx8XG4gICAgICAgIGh0dHBzQWdlbnRPcHRpb25zLmFsbG93SW5zZWN1cmVSZXF1ZXN0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGh0dHBzQWdlbnRPcHRpb25zLmFsbG93SW5zZWN1cmVSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgaHR0cHNBZ2VudE9wdGlvbnMuYWxsb3dJbnNlY3VyZVJlcXVlc3RzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlOiBgaHR0cHNBZ2VudE9wdGlvbnMuYWxsb3dJbnNlY3VyZVJlcXVlc3RzYCBzaG91bGQgZWl0aGVyIGJlIGFuIGVtcHR5IG9yIGEgYm9vbGVhbicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGh0dHBzQWdlbnRPcHRpb25zLmNhUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaHR0cHNBZ2VudE9wdGlvbnMuY2FQYXRoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGh0dHBzQWdlbnRPcHRpb25zLmtleVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGh0dHBzQWdlbnRPcHRpb25zLmtleVBhdGggPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaHR0cHNBZ2VudE9wdGlvbnMuY2VydFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGh0dHBzQWdlbnRPcHRpb25zLmNlcnRQYXRoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaHR0cHNBZ2VudE9wdGlvbnM7XG59O1xuZXhwb3J0cy52YWxpZGF0ZUh0dHBzQWdlbnRPcHRpb25zID0gdmFsaWRhdGVIdHRwc0FnZW50T3B0aW9ucztcbmNvbnN0IHZhbGlkYXRlQXBwTG9jID0gKGFwcExvYykgPT4ge1xuICAgIGlmICghYXBwTG9jKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcHAgbG9jYXRpb246IGBhcHBMb2NgIGNhbm5vdCBiZSBlbXB0eSwgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICghYXBwTG9jLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXBwIGxvY2F0aW9uOiBgYXBwTG9jYCBtdXN0IHN0YXJ0IHdpdGggYSBgL2AuJyk7XG4gICAgfVxuICAgIHJldHVybiBhcHBMb2M7XG59O1xuZXhwb3J0cy52YWxpZGF0ZUFwcExvYyA9IHZhbGlkYXRlQXBwTG9jO1xuY29uc3QgdmFsaWRhdGVEb2NDb25maWcgPSAoZG9jQ29uZmlnKSA9PiB7XG4gICAgaWYgKCFkb2NDb25maWcpIHtcbiAgICAgICAgZG9jQ29uZmlnID0ge307XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZG9jQ29uZmlnLmRpc3BsYXlNYWNyb0NvcmUgIT09ICdib29sZWFuJykge1xuICAgICAgICBkb2NDb25maWcuZGlzcGxheU1hY3JvQ29yZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2NDb25maWcuZW5hYmxlTGluZWFnZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGRvY0NvbmZpZy5lbmFibGVMaW5lYWdlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY0NvbmZpZy5vdXREaXJlY3RvcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRvY0NvbmZpZy5vdXREaXJlY3RvcnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZG9jQ29uZmlnLmRhdGFDb250cm9sbGVyVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9jQ29uZmlnLmRhdGFDb250cm9sbGVyVXJsICE9PSAnJyAmJlxuICAgICAgICAgICAgIXZhbGlkX3VybF8xLmRlZmF1bHQuaXNIdHRwVXJpKGRvY0NvbmZpZy5kYXRhQ29udHJvbGxlclVybCkgJiZcbiAgICAgICAgICAgICF2YWxpZF91cmxfMS5kZWZhdWx0LmlzSHR0cHNVcmkoZG9jQ29uZmlnLmRhdGFDb250cm9sbGVyVXJsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIERhdGEgQ29udHJvbGxlciBVcmw6IGBkYXRhQ29udHJvbGxlclVybGAgc2hvdWxkIGVpdGhlciBiZSBhbiBlbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBVUkwgb2YgdGhlIGZvcm0gaHR0cChzKTovL3lvdXItc2VydmVyLmNvbSg6cG9ydCkuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRvY0NvbmZpZy5kYXRhQ29udHJvbGxlclVybCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRvY0NvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlRG9jQ29uZmlnID0gdmFsaWRhdGVEb2NDb25maWc7XG5jb25zdCB2YWxpZGF0ZUF1dGhDb25maWcgPSAoYXV0aENvbmZpZykgPT4ge1xuICAgIGlmICghYXV0aENvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXV0aCBjb25maWc6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICByZXR1cm4gYXV0aENvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlQXV0aENvbmZpZyA9IHZhbGlkYXRlQXV0aENvbmZpZztcbmNvbnN0IHZhbGlkYXRlQXV0aENvbmZpZ1NhczkgPSAoYXV0aENvbmZpZ1NhczkpID0+IHtcbiAgICBpZiAoIWF1dGhDb25maWdTYXM5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhdXRoIGNvbmZpZyBmb3Igc2FzOTogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICghYXV0aENvbmZpZ1NhczkudXNlck5hbWUgfHwgIWF1dGhDb25maWdTYXM5LnBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhdXRoIGNvbmZpZyBmb3Igc2FzOTogdXNlck5hbWUgYW5kIHBhc3N3b3JkIGNhbiBub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGhDb25maWdTYXM5O1xufTtcbmV4cG9ydHMudmFsaWRhdGVBdXRoQ29uZmlnU2FzOSA9IHZhbGlkYXRlQXV0aENvbmZpZ1Nhczk7XG5jb25zdCB2YWxpZGF0ZUJ1aWxkQ29uZmlnID0gKGJ1aWxkQ29uZmlnLCBkZWZhdWx0TmFtZSkgPT4ge1xuICAgIGlmICghYnVpbGRDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICghYnVpbGRDb25maWcuYnVpbGRPdXRwdXRGaWxlTmFtZSkge1xuICAgICAgICBidWlsZENvbmZpZy5idWlsZE91dHB1dEZpbGVOYW1lID0gYCR7ZGVmYXVsdE5hbWV9LnNhc2A7XG4gICAgfVxuICAgIGlmICghYnVpbGRDb25maWcuaW5pdFByb2dyYW0pIHtcbiAgICAgICAgYnVpbGRDb25maWcuaW5pdFByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFidWlsZENvbmZpZy50ZXJtUHJvZ3JhbSkge1xuICAgICAgICBidWlsZENvbmZpZy50ZXJtUHJvZ3JhbSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIWJ1aWxkQ29uZmlnLm1hY3JvVmFycykge1xuICAgICAgICBidWlsZENvbmZpZy5tYWNyb1ZhcnMgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkQ29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVCdWlsZENvbmZpZyA9IHZhbGlkYXRlQnVpbGRDb25maWc7XG5jb25zdCB2YWxpZGF0ZVNlcnZpY2VDb25maWcgPSAoc2VydmljZUNvbmZpZykgPT4ge1xuICAgIGlmICghc2VydmljZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2VydmljZSBjb25maWc6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXNlcnZpY2VDb25maWcuaW5pdFByb2dyYW0pIHtcbiAgICAgICAgc2VydmljZUNvbmZpZy5pbml0UHJvZ3JhbSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIXNlcnZpY2VDb25maWcudGVybVByb2dyYW0pIHtcbiAgICAgICAgc2VydmljZUNvbmZpZy50ZXJtUHJvZ3JhbSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIXNlcnZpY2VDb25maWcuc2VydmljZUZvbGRlcnMpIHtcbiAgICAgICAgc2VydmljZUNvbmZpZy5zZXJ2aWNlRm9sZGVycyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXNlcnZpY2VDb25maWcubWFjcm9WYXJzKSB7XG4gICAgICAgIHNlcnZpY2VDb25maWcubWFjcm9WYXJzID0ge307XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlQ29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTZXJ2aWNlQ29uZmlnID0gdmFsaWRhdGVTZXJ2aWNlQ29uZmlnO1xuY29uc3QgdmFsaWRhdGVUZXN0Q29uZmlnID0gKHRlc3RDb25maWcpID0+IHtcbiAgICBpZiAoIXRlc3RDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRlc3QgY29uZmlnOiBKU09OIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgaWYgKCF0ZXN0Q29uZmlnLmluaXRQcm9ncmFtKVxuICAgICAgICB0ZXN0Q29uZmlnLmluaXRQcm9ncmFtID0gJyc7XG4gICAgaWYgKCF0ZXN0Q29uZmlnLnRlcm1Qcm9ncmFtKVxuICAgICAgICB0ZXN0Q29uZmlnLnRlcm1Qcm9ncmFtID0gJyc7XG4gICAgaWYgKCF0ZXN0Q29uZmlnLm1hY3JvVmFycylcbiAgICAgICAgdGVzdENvbmZpZy5tYWNyb1ZhcnMgPSB7fTtcbiAgICBpZiAoIXRlc3RDb25maWcudGVzdFNldFVwKVxuICAgICAgICB0ZXN0Q29uZmlnLnRlc3RTZXRVcCA9ICcnO1xuICAgIGlmICghdGVzdENvbmZpZy50ZXN0VGVhckRvd24pXG4gICAgICAgIHRlc3RDb25maWcudGVzdFRlYXJEb3duID0gJyc7XG4gICAgcmV0dXJuIHRlc3RDb25maWc7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVRlc3RDb25maWcgPSB2YWxpZGF0ZVRlc3RDb25maWc7XG5jb25zdCB2YWxpZGF0ZUpvYkNvbmZpZyA9IChqb2JDb25maWcpID0+IHtcbiAgICBpZiAoIWpvYkNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgam9iIGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICgham9iQ29uZmlnLmluaXRQcm9ncmFtKSB7XG4gICAgICAgIGpvYkNvbmZpZy5pbml0UHJvZ3JhbSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIWpvYkNvbmZpZy50ZXJtUHJvZ3JhbSkge1xuICAgICAgICBqb2JDb25maWcudGVybVByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFqb2JDb25maWcuam9iRm9sZGVycykge1xuICAgICAgICBqb2JDb25maWcuam9iRm9sZGVycyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWpvYkNvbmZpZy5tYWNyb1ZhcnMpIHtcbiAgICAgICAgam9iQ29uZmlnLm1hY3JvVmFycyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gam9iQ29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVKb2JDb25maWcgPSB2YWxpZGF0ZUpvYkNvbmZpZztcbmNvbnN0IHZhbGlkYXRlRGVwbG95Q29uZmlnID0gKGRlcGxveUNvbmZpZykgPT4ge1xuICAgIGlmICghZGVwbG95Q29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXBsb3kgY29uZmlnOiBKU09OIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgZGVwbG95Q29uZmlnLmRlcGxveVNlcnZpY2VQYWNrID0gISFkZXBsb3lDb25maWcuZGVwbG95U2VydmljZVBhY2s7XG4gICAgaWYgKCFkZXBsb3lDb25maWcuZGVwbG95U2NyaXB0cykge1xuICAgICAgICBkZXBsb3lDb25maWcuZGVwbG95U2NyaXB0cyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gZGVwbG95Q29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVEZXBsb3lDb25maWcgPSB2YWxpZGF0ZURlcGxveUNvbmZpZztcbmNvbnN0IHZhbGlkYXRlU3RyZWFtQ29uZmlnID0gKHN0cmVhbUNvbmZpZykgPT4ge1xuICAgIGlmICghc3RyZWFtQ29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJlYW0gY29uZmlnOiBKU09OIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbUNvbmZpZy5zdHJlYW1XZWIgIT09IHRydWUgJiYgc3RyZWFtQ29uZmlnLnN0cmVhbVdlYiAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmVhbSBjb25maWc6IGBzdHJlYW1XZWJgIGNhbm5vdCBiZSBhIG5vbi1ib29sZWFuIHZhbHVlLicpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtQ29uZmlnLnN0cmVhbVdlYiAmJiAhc3RyZWFtQ29uZmlnLnN0cmVhbVdlYkZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyZWFtIGNvbmZpZzogYHN0cmVhbVdlYkZvbGRlcmAgY2Fubm90IGJlIGVtcHR5LCBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGBzdHJlYW1XZWJgIGlzIHRydWUuJyk7XG4gICAgfVxuICAgIGlmIChzdHJlYW1Db25maWcuc3RyZWFtV2ViICYmICFzdHJlYW1Db25maWcud2ViU291cmNlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyZWFtIGNvbmZpZzogYHdlYlNvdXJjZVBhdGhgIHNob3VsZCBjb250YWluIHRoZSBwYXRoIHRvIHlvdXIgZnJvbnRlbmQgYXBwbGljYXRpb24gZWcgYnVpbGQsIGRpc3QsIG9yIHNyYy4nKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbUNvbmZpZy5zdHJlYW1Mb2dvICYmIHR5cGVvZiBzdHJlYW1Db25maWcuc3RyZWFtTG9nbyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtQ29uZmlnLnN0cmVhbUxvZ28gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghc3RyZWFtQ29uZmlnLmFzc2V0UGF0aHMpIHtcbiAgICAgICAgc3RyZWFtQ29uZmlnLmFzc2V0UGF0aHMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdHJlYW1Db25maWcuc3RyZWFtU2VydmljZU5hbWUpIHtcbiAgICAgICAgc3RyZWFtQ29uZmlnLnN0cmVhbVNlcnZpY2VOYW1lID0gJ2NsaWNrbWUnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtQ29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTdHJlYW1Db25maWcgPSB2YWxpZGF0ZVN0cmVhbUNvbmZpZztcbmNvbnN0IHZhbGlkYXRlQ29udGV4dE5hbWUgPSAoY29udGV4dE5hbWUsIHNlcnZlclR5cGUpID0+IHtcbiAgICBpZiAoc2VydmVyVHlwZSA9PT0gXzEuU2VydmVyVHlwZS5TYXNWaXlhICYmICFjb250ZXh0TmFtZSkge1xuICAgICAgICByZXR1cm4gREVGQVVMVF9DT05URVhUX05BTUU7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0TmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlQ29udGV4dE5hbWUgPSB2YWxpZGF0ZUNvbnRleHROYW1lO1xuY29uc3QgdmFsaWRhdGVTZXJ2ZXJOYW1lID0gKHNlcnZlck5hbWUsIHNlcnZlclR5cGUpID0+IHtcbiAgICBpZiAoc2VydmVyVHlwZSA9PT0gXzEuU2VydmVyVHlwZS5TYXM5ICYmICFzZXJ2ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1NFUlZFUl9OQU1FO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmVyTmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlU2VydmVyTmFtZSA9IHZhbGlkYXRlU2VydmVyTmFtZTtcbmNvbnN0IHZhbGlkYXRlU3luY0ZvbGRlciA9IChzeW5jRm9sZGVyKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzeW5jRm9sZGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghc3luY0ZvbGRlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIHJldHVybiBzeW5jRm9sZGVyO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTeW5jRm9sZGVyID0gdmFsaWRhdGVTeW5jRm9sZGVyO1xuY29uc3QgdmFsaWRhdGVSZXBvc2l0b3J5TmFtZSA9IChyZXBvc2l0b3J5TmFtZSwgc2VydmVyVHlwZSkgPT4ge1xuICAgIGlmIChzZXJ2ZXJUeXBlID09PSBfMS5TZXJ2ZXJUeXBlLlNhczkgJiYgIXJlcG9zaXRvcnlOYW1lKSB7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JFUE9TSVRPUllfTkFNRTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcG9zaXRvcnlOYW1lO1xufTtcbmV4cG9ydHMudmFsaWRhdGVSZXBvc2l0b3J5TmFtZSA9IHZhbGlkYXRlUmVwb3NpdG9yeU5hbWU7XG5jb25zdCB2YWxpZGF0ZVN5bmNEaXJlY3RvcmllcyA9IChzeW5jRGlyZWN0b3JpZXMpID0+IHtcbiAgICBpZiAoIXN5bmNEaXJlY3Rvcmllcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3luY0RpcmVjdG9yaWVzIGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIHN5bmNEaXJlY3Rvcmllcy5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgICAgaWYgKCFvYmoubG9jYWwgfHwgIW9iai5yZW1vdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luY0RpcmVjdG9yeSBjb25maWc6IHZhbHVlcyBvZiBwcm9wZXJ0eSAnbG9jYWwnIGFuZCAncmVtb3RlIGNhbiBub3QgYmUgZW1wdHkgb3IgdW5kZWZpbmVkYCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bmNEaXJlY3Rvcmllcztcbn07XG5leHBvcnRzLnZhbGlkYXRlU3luY0RpcmVjdG9yaWVzID0gdmFsaWRhdGVTeW5jRGlyZWN0b3JpZXM7XG5jb25zdCB2YWxpZGF0ZVNhc2pzQnVpbGRGb2xkZXIgPSAoZm9sZGVyTmFtZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZm9sZGVyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGUgb2YgdmFsdWUgKCR7dHlwZW9mIGZvbGRlck5hbWV9KSBpcyBwcm92aWRlZCBmb3IgcHJvcGVydHkgJ3Nhc2pzQnVpbGRGb2xkZXInIGluIGNvbmZpZy4gUmVxdWlyZWQgaXMgc3RyaW5nLmApO1xuICAgIH1cbiAgICBpZiAoIWZvbGRlck5hbWUpXG4gICAgICAgIHJldHVybiBleHBvcnRzLkRFRkFVTFRfU0FTSlNfQlVJTERfRk9MREVSO1xuICAgIHJldHVybiBmb2xkZXJOYW1lO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTYXNqc0J1aWxkRm9sZGVyID0gdmFsaWRhdGVTYXNqc0J1aWxkRm9sZGVyO1xuY29uc3QgdmFsaWRhdGVTYXNqc1Jlc3VsdHNGb2xkZXIgPSAoZm9sZGVyTmFtZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZm9sZGVyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGUgb2YgdmFsdWUgKCR7dHlwZW9mIGZvbGRlck5hbWV9KSBpcyBwcm92aWRlZCBmb3IgcHJvcGVydHkgJ3Nhc2pzUmVzdWx0c0ZvbGRlcicgaW4gY29uZmlnLiBSZXF1aXJlZCBpcyBzdHJpbmcuYCk7XG4gICAgfVxuICAgIGlmICghZm9sZGVyTmFtZSlcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuREVGQVVMVF9TQVNKU19SRVNVTFRTX0ZPTERFUjtcbiAgICByZXR1cm4gZm9sZGVyTmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlU2FzanNSZXN1bHRzRm9sZGVyID0gdmFsaWRhdGVTYXNqc1Jlc3VsdHNGb2xkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXJnZXRWYWxpZGF0b3JzLmpzLm1hcCIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGN1c3RvbUluc3BlY3RTeW1ib2wgPVxuICAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA/IFN5bWJvbFsnZm9yJ10oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA6IG51bGxcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG52YXIgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgdmFyIHByb3RvID0geyBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSlcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIsIFVpbnQ4QXJyYXkpXG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheVZpZXcgKGFycmF5Vmlldykge1xuICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdmFyIGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBCdWZmZXIuZnJvbShidWYpLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgYnVmLFxuICAgICAgICAgIHBvc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIH1cbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBtdXN0TWF0Y2ggPSAoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlKVxuICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICB9XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcmNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cbmlmIChjdXN0b21JbnNwZWN0U3ltYm9sKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBCdWZmZXIucHJvdG90eXBlLmluc3BlY3Rcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpXG4gIH1cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB0YXJnZXQpXG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbdmFsXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKVxuICAgICAgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKVxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJylcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxudmFyIGhleFNsaWNlTG9va3VwVGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZidcbiAgdmFyIHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdmFyIGkxNiA9IGkgKiAxNlxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgdGFibGVbaTE2ICsgal0gPSBhbHBoYWJldFtpXSArIGFscGhhYmV0W2pdXG4gICAgfVxuICB9XG4gIHJldHVybiB0YWJsZVxufSkoKVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxudmFyICRhcHBseSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25BcHBseScpO1xudmFyICRjYWxsID0gcmVxdWlyZSgnLi9mdW5jdGlvbkNhbGwnKTtcbnZhciAkcmVmbGVjdEFwcGx5ID0gcmVxdWlyZSgnLi9yZWZsZWN0QXBwbHknKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vYWN0dWFsQXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gJHJlZmxlY3RBcHBseSB8fCBiaW5kLmNhbGwoJGNhbGwsICRhcHBseSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyICRhcHBseSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25BcHBseScpO1xudmFyIGFjdHVhbEFwcGx5ID0gcmVxdWlyZSgnLi9hY3R1YWxBcHBseScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9hcHBseUJpbmQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gYWN0dWFsQXBwbHkoYmluZCwgJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZnVuY3Rpb25BcHBseScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Z1bmN0aW9uQ2FsbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJGFjdHVhbEFwcGx5ID0gcmVxdWlyZSgnLi9hY3R1YWxBcHBseScpO1xuXG4vKiogQHR5cGUgeyhhcmdzOiBbRnVuY3Rpb24sIHRoaXNBcmc/OiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW11dKSA9PiBGdW5jdGlvbn0gVE9ETyBGSVhNRSwgZmluZCBhIHdheSB0byB1c2UgaW1wb3J0KCcuJykgKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmRCYXNpYyhhcmdzKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA8IDEgfHwgdHlwZW9mIGFyZ3NbMF0gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYSBmdW5jdGlvbiBpcyByZXF1aXJlZCcpO1xuXHR9XG5cdHJldHVybiAkYWN0dWFsQXBwbHkoYmluZCwgJGNhbGwsIGFyZ3MpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcmVmbGVjdEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuYXBwbHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzZXRGdW5jdGlvbkxlbmd0aCA9IHJlcXVpcmUoJ3NldC1mdW5jdGlvbi1sZW5ndGgnKTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgY2FsbEJpbmRCYXNpYyA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzJyk7XG52YXIgYXBwbHlCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYXBwbHlCaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmQob3JpZ2luYWxGdW5jdGlvbikge1xuXHR2YXIgZnVuYyA9IGNhbGxCaW5kQmFzaWMoYXJndW1lbnRzKTtcblx0dmFyIGFkanVzdGVkTGVuZ3RoID0gMSArIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0cmV0dXJuIHNldEZ1bmN0aW9uTGVuZ3RoKFxuXHRcdGZ1bmMsXG5cdFx0YWRqdXN0ZWRMZW5ndGggPiAwID8gYWRqdXN0ZWRMZW5ndGggOiAwLFxuXHRcdHRydWVcblx0KTtcbn07XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0JGRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYXBwbHknLCB7IHZhbHVlOiBhcHBseUJpbmQgfSk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cy5hcHBseSA9IGFwcGx5QmluZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kQmFzaWMgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xuXG4vKiogQHR5cGUgeyh0aGlzQXJnOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gbnVtYmVyfSAqL1xudmFyICRpbmRleE9mID0gY2FsbEJpbmRCYXNpYyhbR2V0SW50cmluc2ljKCclU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJScpXSk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0LyogZXNsaW50IG5vLWV4dHJhLXBhcmVuczogMCAqL1xuXG5cdHZhciBpbnRyaW5zaWMgPSAvKiogQHR5cGUgeyh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd259ICovIChHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpKTtcblx0aWYgKHR5cGVvZiBpbnRyaW5zaWMgPT09ICdmdW5jdGlvbicgJiYgJGluZGV4T2YobmFtZSwgJy5wcm90b3R5cGUuJykgPiAtMSkge1xuXHRcdHJldHVybiBjYWxsQmluZEJhc2ljKC8qKiBAdHlwZSB7Y29uc3R9ICovIChbaW50cmluc2ljXSkpO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciBnb3BkID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkoXG5cdG9iaixcblx0cHJvcGVydHksXG5cdHZhbHVlXG4pIHtcblx0aWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSAnc3ltYm9sJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHR5cGVvZiBhcmd1bWVudHNbM10gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbM10gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB0eXBlb2YgYXJndW1lbnRzWzRdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzRdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIHR5cGVvZiBhcmd1bWVudHNbNV0gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbNV0gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIHR5cGVvZiBhcmd1bWVudHNbNl0gIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBub25FbnVtZXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXHR2YXIgbm9uV3JpdGFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IG51bGw7XG5cdHZhciBub25Db25maWd1cmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogZmFsc2U7XG5cblx0LyogQHR5cGUge2ZhbHNlIHwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj59ICovXG5cdHZhciBkZXNjID0gISFnb3BkICYmIGdvcGQob2JqLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IG5vbkNvbmZpZ3VyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5jb25maWd1cmFibGUgOiAhbm9uQ29uZmlndXJhYmxlLFxuXHRcdFx0ZW51bWVyYWJsZTogbm9uRW51bWVyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogIW5vbkVudW1lcmFibGUsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogbm9uV3JpdGFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2Mud3JpdGFibGUgOiAhbm9uV3JpdGFibGVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChsb29zZSB8fCAoIW5vbkVudW1lcmFibGUgJiYgIW5vbldyaXRhYmxlICYmICFub25Db25maWd1cmFibGUpKSB7XG5cdFx0Ly8gbXVzdCBmYWxsIGJhY2sgdG8gW1tTZXRdXSwgYW5kIHdhcyBub3QgZXhwbGljaXRseSBhc2tlZCB0byBtYWtlIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1jb25maWd1cmFibGVcblx0XHRvYmpbcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLicpO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciBoYXNQcm90b0FjY2Vzc29yO1xudHJ5IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVucywgbm8tcHJvdG9cblx0aGFzUHJvdG9BY2Nlc3NvciA9IC8qKiBAdHlwZSB7eyBfX3Byb3RvX18/OiB0eXBlb2YgQXJyYXkucHJvdG90eXBlIH19ICovIChbXSkuX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGU7XG59IGNhdGNoIChlKSB7XG5cdGlmICghZSB8fCB0eXBlb2YgZSAhPT0gJ29iamVjdCcgfHwgISgnY29kZScgaW4gZSkgfHwgZS5jb2RlICE9PSAnRVJSX1BST1RPX0FDQ0VTUycpIHtcblx0XHR0aHJvdyBlO1xuXHR9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcbnZhciBkZXNjID0gISFoYXNQcm90b0FjY2Vzc29yICYmIGdPUEQgJiYgZ09QRChPYmplY3QucHJvdG90eXBlLCAvKiogQHR5cGUge2tleW9mIHR5cGVvZiBPYmplY3QucHJvdG90eXBlfSAqLyAoJ19fcHJvdG9fXycpKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgJGdldFByb3RvdHlwZU9mID0gJE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ2V0Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGRlc2MgJiYgdHlwZW9mIGRlc2MuZ2V0ID09PSAnZnVuY3Rpb24nXG5cdD8gY2FsbEJpbmQoW2Rlc2MuZ2V0XSlcblx0OiB0eXBlb2YgJGdldFByb3RvdHlwZU9mID09PSAnZnVuY3Rpb24nXG5cdFx0PyAvKiogQHR5cGUge2ltcG9ydCgnLi9nZXQnKX0gKi8gZnVuY3Rpb24gZ2V0RHVuZGVyKHZhbHVlKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRyZXR1cm4gJGdldFByb3RvdHlwZU9mKHZhbHVlID09IG51bGwgPyB2YWx1ZSA6ICRPYmplY3QodmFsdWUpKTtcblx0XHR9XG5cdFx0OiBmYWxzZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9ldmFsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEV2YWxFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXJpJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFVSSUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnaXMtY2FsbGFibGUnKTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKiBAdHlwZSB7PFRoaXMsIEEgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KGFycjogQSwgaXRlcmF0b3I6ICh0aGlzOiBUaGlzIHwgdm9pZCwgdmFsdWU6IEFbbnVtYmVyXSwgaW5kZXg6IG51bWJlciwgYXJyOiBBKSA9PiB2b2lkLCByZWNlaXZlcjogVGhpcyB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gKi9cbnZhciBmb3JFYWNoQXJyYXkgPSBmdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksIGl0ZXJhdG9yLCByZWNlaXZlcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgaSkpIHtcbiAgICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0sIGksIGFycmF5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChyZWNlaXZlciwgYXJyYXlbaV0sIGksIGFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKiBAdHlwZSB7PFRoaXMsIFMgZXh0ZW5kcyBzdHJpbmc+KHN0cmluZzogUywgaXRlcmF0b3I6ICh0aGlzOiBUaGlzIHwgdm9pZCwgdmFsdWU6IFNbbnVtYmVyXSwgaW5kZXg6IG51bWJlciwgc3RyaW5nOiBTKSA9PiB2b2lkLCByZWNlaXZlcjogVGhpcyB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gKi9cbnZhciBmb3JFYWNoU3RyaW5nID0gZnVuY3Rpb24gZm9yRWFjaFN0cmluZyhzdHJpbmcsIGl0ZXJhdG9yLCByZWNlaXZlcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gbm8gc3VjaCB0aGluZyBhcyBhIHNwYXJzZSBzdHJpbmcuXG4gICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBpdGVyYXRvcihzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChyZWNlaXZlciwgc3RyaW5nLmNoYXJBdChpKSwgaSwgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKiBAdHlwZSB7PFRoaXMsIE8+KG9iajogTywgaXRlcmF0b3I6ICh0aGlzOiBUaGlzIHwgdm9pZCwgdmFsdWU6IE9ba2V5b2YgT10sIGluZGV4OiBrZXlvZiBPLCBvYmo6IE8pID0+IHZvaWQsIHJlY2VpdmVyOiBUaGlzIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSAqL1xudmFyIGZvckVhY2hPYmplY3QgPSBmdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihvYmplY3Rba10sIGssIG9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIG9iamVjdFtrXSwgaywgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKiBAdHlwZSB7KHg6IHVua25vd24pID0+IHggaXMgcmVhZG9ubHkgdW5rbm93bltdfSAqL1xuZnVuY3Rpb24gaXNBcnJheSh4KSB7XG4gICAgcmV0dXJuIHRvU3RyLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykuX2ludGVybmFsfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGxpc3QsIGl0ZXJhdG9yLCB0aGlzQXJnKSB7XG4gICAgaWYgKCFpc0NhbGxhYmxlKGl0ZXJhdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVjZWl2ZXI7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykge1xuICAgICAgICByZWNlaXZlciA9IHRoaXNBcmc7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgZm9yRWFjaEFycmF5KGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZm9yRWFjaFN0cmluZyhsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnID8gc2VsZi5Gb3JtRGF0YSA6IHdpbmRvdy5Gb3JtRGF0YTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGNvbmNhdHR5ID0gZnVuY3Rpb24gY29uY2F0dHkoYSwgYikge1xuICAgIHZhciBhcnIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJbaV0gPSBhW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgYXJyW2ogKyBhLmxlbmd0aF0gPSBiW2pdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgc2xpY3kgPSBmdW5jdGlvbiBzbGljeShhcnJMaWtlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldCB8fCAwLCBqID0gMDsgaSA8IGFyckxpa2UubGVuZ3RoOyBpICs9IDEsIGogKz0gMSkge1xuICAgICAgICBhcnJbal0gPSBhcnJMaWtlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIGpvaW55ID0gZnVuY3Rpb24gKGFyciwgam9pbmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBhcnJbaV07XG4gICAgICAgIGlmIChpICsgMSA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0ciArPSBqb2luZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuYXBwbHkodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljeShhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICk7XG5cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3NbaV0gPSAnJCcgKyBpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBqb2lueShib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zLCBuby1lbXB0eS1mdW5jdGlvblxuY29uc3QgY2FjaGVkID0gLyoqIEB0eXBlIHtHZW5lcmF0b3JGdW5jdGlvbkNvbnN0cnVjdG9yfSAqLyAoZnVuY3Rpb24qICgpIHt9LmNvbnN0cnVjdG9yKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gKCkgPT4gY2FjaGVkO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnZXMtb2JqZWN0LWF0b21zJyk7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgYWJzID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2FicycpO1xudmFyIGZsb29yID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2Zsb29yJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL21heCcpO1xudmFyIG1pbiA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9taW4nKTtcbnZhciBwb3cgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvcG93Jyk7XG52YXIgcm91bmQgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3Mvcm91bmQnKTtcbnZhciBzaWduID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3NpZ24nKTtcblxudmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdlcy1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCdnZXQtcHJvdG8nKTtcbnZhciAkT2JqZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL09iamVjdC5nZXRQcm90b3R5cGVPZicpO1xudmFyICRSZWZsZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyICRhcHBseSA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQ2FsbCcpO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFnZ3JlZ2F0ZUVycm9yJSc6IHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBZ2dyZWdhdGVFcnJvcixcblx0JyVBcnJheSUnOiBBcnJheSxcblx0JyVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIsXG5cdCclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IG5lZWRzRXZhbCxcblx0JyVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCclQmlnSW50JSc6IHR5cGVvZiBCaWdJbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50LFxuXHQnJUJpZ0ludDY0QXJyYXklJzogdHlwZW9mIEJpZ0ludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50NjRBcnJheSxcblx0JyVCaWdVaW50NjRBcnJheSUnOiB0eXBlb2YgQmlnVWludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnVWludDY0QXJyYXksXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiAkRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogJEV2YWxFcnJvcixcblx0JyVGbG9hdDE2QXJyYXklJzogdHlwZW9mIEZsb2F0MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDE2QXJyYXksXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogJE9iamVjdCxcblx0JyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJSc6ICRnT1BELFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogJFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogJFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiAkVVJJRXJyb3IsXG5cdCclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJVdlYWtSZWYlJzogdHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1JlZixcblx0JyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQsXG5cblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUnOiAkY2FsbCxcblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklJzogJGFwcGx5LFxuXHQnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnOiAkZGVmaW5lUHJvcGVydHksXG5cdCclT2JqZWN0LmdldFByb3RvdHlwZU9mJSc6ICRPYmplY3RHUE8sXG5cdCclTWF0aC5hYnMlJzogYWJzLFxuXHQnJU1hdGguZmxvb3IlJzogZmxvb3IsXG5cdCclTWF0aC5tYXglJzogbWF4LFxuXHQnJU1hdGgubWluJSc6IG1pbixcblx0JyVNYXRoLnBvdyUnOiBwb3csXG5cdCclTWF0aC5yb3VuZCUnOiByb3VuZCxcblx0JyVNYXRoLnNpZ24lJzogc2lnbixcblx0JyVSZWZsZWN0LmdldFByb3RvdHlwZU9mJSc6ICRSZWZsZWN0R1BPXG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKCRjYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoJGFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbCgkY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoJGNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKCRjYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvLCBuYW1lKSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2AlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUnKTtcblx0fVxuXHR2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG5cdHZhciBpbnRyaW5zaWNCYXNlTmFtZSA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnO1xuXG5cdHZhciBpbnRyaW5zaWMgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXHR2YXIgaW50cmluc2ljUmVhbE5hbWUgPSBpbnRyaW5zaWMubmFtZTtcblx0dmFyIHZhbHVlID0gaW50cmluc2ljLnZhbHVlO1xuXHR2YXIgc2tpcEZ1cnRoZXJDYWNoaW5nID0gZmFsc2U7XG5cblx0dmFyIGFsaWFzID0gaW50cmluc2ljLmFsaWFzO1xuXHRpZiAoYWxpYXMpIHtcblx0XHRpbnRyaW5zaWNCYXNlTmFtZSA9IGFsaWFzWzBdO1xuXHRcdCRzcGxpY2VBcHBseShwYXJ0cywgJGNvbmNhdChbMCwgMV0sIGFsaWFzKSk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMSwgaXNPd24gPSB0cnVlOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgcGFydCA9IHBhcnRzW2ldO1xuXHRcdHZhciBmaXJzdCA9ICRzdHJTbGljZShwYXJ0LCAwLCAxKTtcblx0XHR2YXIgbGFzdCA9ICRzdHJTbGljZShwYXJ0LCAtMSk7XG5cdFx0aWYgKFxuXHRcdFx0KFxuXHRcdFx0XHQoZmlyc3QgPT09ICdcIicgfHwgZmlyc3QgPT09IFwiJ1wiIHx8IGZpcnN0ID09PSAnYCcpXG5cdFx0XHRcdHx8IChsYXN0ID09PSAnXCInIHx8IGxhc3QgPT09IFwiJ1wiIHx8IGxhc3QgPT09ICdgJylcblx0XHRcdClcblx0XHRcdCYmIGZpcnN0ICE9PSBsYXN0XG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzJyk7XG5cdFx0fVxuXHRcdGlmIChwYXJ0ID09PSAnY29uc3RydWN0b3InIHx8ICFpc093bikge1xuXHRcdFx0c2tpcEZ1cnRoZXJDYWNoaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpbnRyaW5zaWNCYXNlTmFtZSArPSAnLicgKyBwYXJ0O1xuXHRcdGludHJpbnNpY1JlYWxOYW1lID0gJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJSc7XG5cblx0XHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY1JlYWxOYW1lKSkge1xuXHRcdFx0dmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGlmICghKHBhcnQgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdGlmICghYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRnT1BEICYmIChpICsgMSkgPj0gcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnQpO1xuXHRcdFx0XHRpc093biA9ICEhZGVzYztcblxuXHRcdFx0XHQvLyBCeSBjb252ZW50aW9uLCB3aGVuIGEgZGF0YSBwcm9wZXJ0eSBpcyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3Jcblx0XHRcdFx0Ly8gcHJvcGVydHkgdG8gZW11bGF0ZSBhIGRhdGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBzdWZmZXIgZnJvbVxuXHRcdFx0XHQvLyB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgdGhhdCBhY2Nlc3NvcidzIGdldHRlciBpcyBtYXJrZWQgd2l0aFxuXHRcdFx0XHQvLyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHkuIEhlcmUsIHdoZW4gd2UgZGV0ZWN0IHRoaXMsIHdlXG5cdFx0XHRcdC8vIHVwaG9sZCB0aGUgaWxsdXNpb24gYnkgcHJldGVuZGluZyB0byBzZWUgdGhhdCBvcmlnaW5hbCBkYXRhXG5cdFx0XHRcdC8vIHByb3BlcnR5LCBpLmUuLCByZXR1cm5pbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBnZXR0ZXJcblx0XHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0XHRpZiAoaXNPd24gJiYgJ2dldCcgaW4gZGVzYyAmJiAhKCdvcmlnaW5hbFZhbHVlJyBpbiBkZXNjLmdldCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGRlc2MuZ2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlzT3duID0gaGFzT3duKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT3duICYmICFza2lwRnVydGhlckNhY2hpbmcpIHtcblx0XHRcdFx0SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRPYmplY3QgPSByZXF1aXJlKCdlcy1vYmplY3QtYXRvbXMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YpIHx8IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWZsZWN0R2V0UHJvdG8gPSByZXF1aXJlKCcuL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcbnZhciBvcmlnaW5hbEdldFByb3RvID0gcmVxdWlyZSgnLi9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyIGdldER1bmRlclByb3RvID0gcmVxdWlyZSgnZHVuZGVyLXByb3RvL2dldCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0R2V0UHJvdG9cblx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0cmV0dXJuIHJlZmxlY3RHZXRQcm90byhPKTtcblx0fVxuXHQ6IG9yaWdpbmFsR2V0UHJvdG9cblx0XHQ/IGZ1bmN0aW9uIGdldFByb3RvKE8pIHtcblx0XHRcdGlmICghTyB8fCAodHlwZW9mIE8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBPICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRQcm90bzogbm90IGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0XHRyZXR1cm4gb3JpZ2luYWxHZXRQcm90byhPKTtcblx0XHR9XG5cdFx0OiBnZXREdW5kZXJQcm90b1xuXHRcdFx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdFx0XHRyZXR1cm4gZ2V0RHVuZGVyUHJvdG8oTyk7XG5cdFx0XHR9XG5cdFx0XHQ6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dPUEQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZ09QRCA9IHJlcXVpcmUoJy4vZ09QRCcpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpIHtcblx0cmV0dXJuICEhJGRlZmluZVByb3BlcnR5O1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCEkZGVmaW5lUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9yaWdTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2w7XG52YXIgaGFzU3ltYm9sU2hhbSA9IHJlcXVpcmUoJy4vc2hhbXMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3NoYW1zJyl9ICovXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG5cdC8qKiBAdHlwZSB7eyBbayBpbiBzeW1ib2xdPzogdW5rbm93biB9fSAqL1xuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHZhciBfIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tdW5yZWFjaGFibGUtbG9vcFxuXHRpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cdGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHR2YXIgZGVzY3JpcHRvciA9IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSkpO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1RvU3RyaW5nVGFnU2hhbXMoKSB7XG5cdHJldHVybiBoYXNTeW1ib2xzKCkgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xudmFyICRoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChjYWxsLCAkaGFzT3duKTtcbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xuXG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgaXNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdGlmIChcblx0XHRoYXNUb1N0cmluZ1RhZ1xuXHRcdCYmIHZhbHVlXG5cdFx0JiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuXHRcdCYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZVxuXHQpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdGlmIChpc1N0YW5kYXJkQXJndW1lbnRzKHZhbHVlKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbFxuXHRcdCYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcblx0XHQmJiAnbGVuZ3RoJyBpbiB2YWx1ZVxuXHRcdCYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInXG5cdFx0JiYgdmFsdWUubGVuZ3RoID49IDBcblx0XHQmJiAkdG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBBcnJheV0nXG5cdFx0JiYgJ2NhbGxlZScgaW4gdmFsdWVcblx0XHQmJiAkdG9TdHJpbmcodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKTtcbn0oKSk7XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBtYWtlIHRoaXMgbm90IGVycm9yXG5pc1N0YW5kYXJkQXJndW1lbnRzLmlzTGVnYWN5QXJndW1lbnRzID0gaXNMZWdhY3lBcmd1bWVudHM7IC8vIGZvciB0ZXN0c1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID8gaXNTdGFuZGFyZEFyZ3VtZW50cyA6IGlzTGVnYWN5QXJndW1lbnRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHkgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdCAhPT0gbnVsbCAmJiBSZWZsZWN0LmFwcGx5O1xudmFyIGJhZEFycmF5TGlrZTtcbnZhciBpc0NhbGxhYmxlTWFya2VyO1xuaWYgKHR5cGVvZiByZWZsZWN0QXBwbHkgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuXHR0cnkge1xuXHRcdGJhZEFycmF5TGlrZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2xlbmd0aCcsIHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBpc0NhbGxhYmxlTWFya2VyO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuXHRcdHJlZmxlY3RBcHBseShmdW5jdGlvbiAoKSB7IHRocm93IDQyOyB9LCBudWxsLCBiYWRBcnJheUxpa2UpO1xuXHR9IGNhdGNoIChfKSB7XG5cdFx0aWYgKF8gIT09IGlzQ2FsbGFibGVNYXJrZXIpIHtcblx0XHRcdHJlZmxlY3RBcHBseSA9IG51bGw7XG5cdFx0fVxuXHR9XG59IGVsc2Uge1xuXHRyZWZsZWN0QXBwbHkgPSBudWxsO1xufVxuXG52YXIgY29uc3RydWN0b3JSZWdleCA9IC9eXFxzKmNsYXNzXFxiLztcbnZhciBpc0VTNkNsYXNzRm4gPSBmdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24odmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3QoZm5TdHIpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlOyAvLyBub3QgYSBmdW5jdGlvblxuXHR9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0Zm5Ub1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcpIHtcblx0Ly8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG5cdHZhciBhbGwgPSBkb2N1bWVudC5hbGw7XG5cdGlmICh0b1N0ci5jYWxsKGFsbCkgPT09IHRvU3RyLmNhbGwoZG9jdW1lbnQuYWxsKSkge1xuXHRcdGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCh2YWx1ZSkge1xuXHRcdFx0LyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cblx0XHRcdC8vIGluIElFIDYtOCwgdHlwZW9mIGRvY3VtZW50LmFsbCBpcyBcIm9iamVjdFwiIGFuZCBpdCdzIHRydXRoeVxuXHRcdFx0aWYgKChpc0lFNjggfHwgIXZhbHVlKSAmJiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0c3RyID09PSBkZGFDbGFzc1xuXHRcdFx0XHRcdFx0fHwgc3RyID09PSBkZGFDbGFzczJcblx0XHRcdFx0XHRcdHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG5cdFx0XHRcdFx0XHR8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuXHRcdFx0XHRcdCkgJiYgdmFsdWUoJycpID09IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZmxlY3RBcHBseVxuXHQ/IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0dHJ5IHtcblx0XHRcdHJlZmxlY3RBcHBseSh2YWx1ZSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZSAhPT0gaXNDYWxsYWJsZU1hcmtlcikgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR9XG5cdFx0cmV0dXJuICFpc0VTNkNsYXNzRm4odmFsdWUpICYmIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcblx0fVxuXHQ6IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG5cdH07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgc2FmZVJlZ2V4VGVzdCA9IHJlcXVpcmUoJ3NhZmUtcmVnZXgtdGVzdCcpO1xudmFyIGlzRm5SZWdleCA9IHNhZmVSZWdleFRlc3QoL15cXHMqKD86ZnVuY3Rpb24pP1xcKi8pO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJ2dldC1wcm90bycpO1xuXG52YXIgdG9TdHIgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBmblRvU3RyID0gY2FsbEJvdW5kKCdGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIGdldEdlbmVyYXRvckZ1bmN0aW9uID0gcmVxdWlyZSgnZ2VuZXJhdG9yLWZ1bmN0aW9uJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzR2VuZXJhdG9yRnVuY3Rpb24oZm4pIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoaXNGblJlZ2V4KGZuVG9TdHIoZm4pKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHR2YXIgc3RyID0gdG9TdHIoZm4pO1xuXHRcdHJldHVybiBzdHIgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG5cdH1cblx0aWYgKCFnZXRQcm90bykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR2YXIgR2VuZXJhdG9yRnVuY3Rpb24gPSBnZXRHZW5lcmF0b3JGdW5jdGlvbigpO1xuXHRyZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24gJiYgZ2V0UHJvdG8oZm4pID09PSBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xudmFyIGZuO1xuXG5pZiAoaGFzVG9TdHJpbmdUYWcpIHtcblx0LyoqIEB0eXBlIHsocmVjZWl2ZXI6IFRoaXNQYXJhbWV0ZXJUeXBlPHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmV4ZWM+LCAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmV4ZWM+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmV4ZWM+fSAqL1xuXHR2YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xuXHQvKiogQHR5cGUge29iamVjdH0gKi9cblx0dmFyIGlzUmVnZXhNYXJrZXIgPSB7fTtcblxuXHR2YXIgdGhyb3dSZWdleE1hcmtlciA9IGZ1bmN0aW9uICgpIHtcblx0XHR0aHJvdyBpc1JlZ2V4TWFya2VyO1xuXHR9O1xuXHQvKiogQHR5cGUge3sgdG9TdHJpbmcoKTogbmV2ZXIsIHZhbHVlT2YoKTogbmV2ZXIsIFtTeW1ib2wudG9QcmltaXRpdmVdPygpOiBuZXZlciB9fSAqL1xuXHR2YXIgYmFkU3RyaW5naWZpZXIgPSB7XG5cdFx0dG9TdHJpbmc6IHRocm93UmVnZXhNYXJrZXIsXG5cdFx0dmFsdWVPZjogdGhyb3dSZWdleE1hcmtlclxuXHR9O1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlID09PSAnc3ltYm9sJykge1xuXHRcdGJhZFN0cmluZ2lmaWVyW1N5bWJvbC50b1ByaW1pdGl2ZV0gPSB0aHJvd1JlZ2V4TWFya2VyO1xuXHR9XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBmaWd1cmUgb3V0IHRoYXQgdGhlICRleGVjIGNhbGwgYWx3YXlzIHRocm93c1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0Zm4gPSBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdHZhciBkZXNjcmlwdG9yID0gLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgZ09QRD59ICovIChnT1BEKSgvKiogQHR5cGUge3sgbGFzdEluZGV4PzogdW5rbm93biB9fSAqLyAodmFsdWUpLCAnbGFzdEluZGV4Jyk7XG5cdFx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzT3duKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRcdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdCRleGVjKHZhbHVlLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGJhZFN0cmluZ2lmaWVyKSkpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBlID09PSBpc1JlZ2V4TWFya2VyO1xuXHRcdH1cblx0fTtcbn0gZWxzZSB7XG5cdC8qKiBAdHlwZSB7KHJlY2VpdmVyOiBUaGlzUGFyYW1ldGVyVHlwZTx0eXBlb2YgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz4sIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nPn0gKi9cblx0dmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xuXHQvKiogQGNvbnN0IEB0eXBlIHsnW29iamVjdCBSZWdFeHBdJ30gKi9cblx0dmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcblxuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xuXHRmbiA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0XHQvLyBJbiBvbGRlciBicm93c2VycywgdHlwZW9mIHJlZ2V4IGluY29ycmVjdGx5IHJldHVybnMgJ2Z1bmN0aW9uJ1xuXHRcdGlmICghdmFsdWUgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkdG9TdHJpbmcodmFsdWUpID09PSByZWdleENsYXNzO1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpY2hUeXBlZEFycmF5ID0gcmVxdWlyZSgnd2hpY2gtdHlwZWQtYXJyYXknKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNUeXBlZEFycmF5KHZhbHVlKSB7XG5cdHJldHVybiAhIXdoaWNoVHlwZWRBcnJheSh2YWx1ZSk7XG59O1xuIiwiZnVuY3Rpb24gZShlKXt0aGlzLm1lc3NhZ2U9ZX1lLnByb3RvdHlwZT1uZXcgRXJyb3IsZS5wcm90b3R5cGUubmFtZT1cIkludmFsaWRDaGFyYWN0ZXJFcnJvclwiO3ZhciByPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hdG9iJiZ3aW5kb3cuYXRvYi5iaW5kKHdpbmRvdyl8fGZ1bmN0aW9uKHIpe3ZhciB0PVN0cmluZyhyKS5yZXBsYWNlKC89KyQvLFwiXCIpO2lmKHQubGVuZ3RoJTQ9PTEpdGhyb3cgbmV3IGUoXCInYXRvYicgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLlwiKTtmb3IodmFyIG4sbyxhPTAsaT0wLGM9XCJcIjtvPXQuY2hhckF0KGkrKyk7fm8mJihuPWElND82NCpuK286byxhKyslNCk/Yys9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbj4+KC0yKmEmNikpOjApbz1cIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihvKTtyZXR1cm4gY307ZnVuY3Rpb24gdChlKXt2YXIgdD1lLnJlcGxhY2UoLy0vZyxcIitcIikucmVwbGFjZSgvXy9nLFwiL1wiKTtzd2l0Y2godC5sZW5ndGglNCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjp0Kz1cIj09XCI7YnJlYWs7Y2FzZSAzOnQrPVwiPVwiO2JyZWFrO2RlZmF1bHQ6dGhyb3dcIklsbGVnYWwgYmFzZTY0dXJsIHN0cmluZyFcIn10cnl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocihlKS5yZXBsYWNlKC8oLikvZywoZnVuY3Rpb24oZSxyKXt2YXIgdD1yLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHQubGVuZ3RoPDImJih0PVwiMFwiK3QpLFwiJVwiK3R9KSkpfSh0KX1jYXRjaChlKXtyZXR1cm4gcih0KX19ZnVuY3Rpb24gbihlKXt0aGlzLm1lc3NhZ2U9ZX1mdW5jdGlvbiBvKGUscil7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpdGhyb3cgbmV3IG4oXCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZFwiKTt2YXIgbz0hMD09PShyPXJ8fHt9KS5oZWFkZXI/MDoxO3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KGUuc3BsaXQoXCIuXCIpW29dKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IG4oXCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogXCIrZS5tZXNzYWdlKX19bi5wcm90b3R5cGU9bmV3IEVycm9yLG4ucHJvdG90eXBlLm5hbWU9XCJJbnZhbGlkVG9rZW5FcnJvclwiO2V4cG9ydCBkZWZhdWx0IG87ZXhwb3J0e24gYXMgSW52YWxpZFRva2VuRXJyb3J9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9and0LWRlY29kZS5lc20uanMubWFwXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FicycpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmFicztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZmxvb3InKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5mbG9vcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaXNOYU4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIGlzTmFOKGEpIHtcblx0cmV0dXJuIGEgIT09IGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9tYXgnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5tYXg7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL21pbicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLm1pbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcG93Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgucG93O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yb3VuZCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnJvdW5kO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9pc05hTicpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9zaWduJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNpZ24obnVtYmVyKSB7XG5cdGlmICgkaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPT09IDApIHtcblx0XHRyZXR1cm4gbnVtYmVyO1xuXHR9XG5cdHJldHVybiBudW1iZXIgPCAwID8gLTEgOiArMTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFtcblx0J0Zsb2F0MTZBcnJheScsXG5cdCdGbG9hdDMyQXJyYXknLFxuXHQnRmxvYXQ2NEFycmF5Jyxcblx0J0ludDhBcnJheScsXG5cdCdJbnQxNkFycmF5Jyxcblx0J0ludDMyQXJyYXknLFxuXHQnVWludDhBcnJheScsXG5cdCdVaW50OENsYW1wZWRBcnJheScsXG5cdCdVaW50MTZBcnJheScsXG5cdCdVaW50MzJBcnJheScsXG5cdCdCaWdJbnQ2NEFycmF5Jyxcblx0J0JpZ1VpbnQ2NEFycmF5J1xuXTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgaXNSZWdleCA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG5cbnZhciAkZXhlYyA9IGNhbGxCb3VuZCgnUmVnRXhwLnByb3RvdHlwZS5leGVjJyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlZ2V4VGVzdGVyKHJlZ2V4KSB7XG5cdGlmICghaXNSZWdleChyZWdleCkpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYHJlZ2V4YCBtdXN0IGJlIGEgUmVnRXhwJyk7XG5cdH1cblx0cmV0dXJuIGZ1bmN0aW9uIHRlc3Qocykge1xuXHRcdHJldHVybiAkZXhlYyhyZWdleCwgcykgIT09IG51bGw7XG5cdH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1kYXRhLXByb3BlcnR5Jyk7XG52YXIgaGFzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdoYXMtcHJvcGVydHktZGVzY3JpcHRvcnMnKSgpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkZmxvb3IgPSBHZXRJbnRyaW5zaWMoJyVNYXRoLmZsb29yJScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXRGdW5jdGlvbkxlbmd0aChmbiwgbGVuZ3RoKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGZuYCBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHR9XG5cdGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBsZW5ndGggPCAwIHx8IGxlbmd0aCA+IDB4RkZGRkZGRkYgfHwgJGZsb29yKGxlbmd0aCkgIT09IGxlbmd0aCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbGVuZ3RoYCBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXInKTtcblx0fVxuXG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmICEhYXJndW1lbnRzWzJdO1xuXG5cdHZhciBmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gdHJ1ZTtcblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IHRydWU7XG5cdGlmICgnbGVuZ3RoJyBpbiBmbiAmJiBnT1BEKSB7XG5cdFx0dmFyIGRlc2MgPSBnT1BEKGZuLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChkZXNjICYmICFkZXNjLndyaXRhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSB8fCBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgfHwgIWxvb3NlKSB7XG5cdFx0aWYgKGhhc0Rlc2NyaXB0b3JzKSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgsIHRydWUsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm47XG59O1xuIiwiaW1wb3J0IHsgU2VydmVyVHlwZSB9IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7IFJlcXVlc3RDbGllbnQgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RDbGllbnQnXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuaW1wb3J0IHsgTG9naW5PcHRpb25zLCBMb2dpblJlc3VsdCwgTG9naW5SZXN1bHRJbnRlcm5hbCB9IGZyb20gJy4uL3R5cGVzL0xvZ2luJ1xuaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBleHRyYWN0VXNlckxvbmdOYW1lU2FzOSB9IGZyb20gJy4uL3V0aWxzL3NhczkvZXh0cmFjdFVzZXJMb25nTmFtZVNhczknXG5pbXBvcnQgeyBvcGVuV2ViUGFnZSB9IGZyb20gJy4vb3BlbldlYlBhZ2UnXG5pbXBvcnQgeyB2ZXJpZnlTYXM5TG9naW4gfSBmcm9tICcuL3ZlcmlmeVNhczlMb2dpbidcbmltcG9ydCB7IHZlcmlmeVNhc1ZpeWFMb2dpbiB9IGZyb20gJy4vdmVyaWZ5U2FzVml5YUxvZ2luJ1xuaW1wb3J0IHsgaXNMb2dJblN1Y2Nlc3NIZWFkZXJQcmVzZW50IH0gZnJvbSAnLi8nXG5cbmV4cG9ydCBjbGFzcyBBdXRoTWFuYWdlciB7XG4gIHB1YmxpYyB1c2VyTmFtZSA9ICcnXG4gIHB1YmxpYyB1c2VyTG9uZ05hbWUgPSAnJ1xuICBwcml2YXRlIGxvZ2luVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBsb2dvdXRVcmw6IHN0cmluZ1xuICBwcml2YXRlIHJlZGlyZWN0ZWRMb2dpblVybCA9IGAvU0FTTG9nb25gIC8vU0FTIDkgTTggbm8gbG9uZ2VyIHJlZGlyZWN0cyBmcm9tIGAvU0FTTG9nb24vaG9tZWAgdG8gdGhlIGxvZ2luIHBhZ2UuIGAvU0FTTG9nb25gIHNlZW1zIHRvIGJlIHN0YWJsZSBlbm91Z2ggYWNyb3NzIFNBUyB2ZXJzaW9uc1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmVyVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBzZXJ2ZXJUeXBlOiBTZXJ2ZXJUeXBlLFxuICAgIHByaXZhdGUgcmVxdWVzdENsaWVudDogUmVxdWVzdENsaWVudCxcbiAgICBwcml2YXRlIGxvZ2luQ2FsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgKSB7XG4gICAgdGhpcy5sb2dpblVybCA9IGAvU0FTTG9nb24vbG9naW5gXG4gICAgdGhpcy5sb2dvdXRVcmwgPVxuICAgICAgdGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhczlcbiAgICAgICAgPyAnL1NBU0xvZ29uL2xvZ291dD8nXG4gICAgICAgIDogdGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhc1ZpeWFcbiAgICAgICAgICA/ICcvU0FTTG9nb24vbG9nb3V0LmRvPydcbiAgICAgICAgICA6ICcvU0FTTG9nb24vbG9nb3V0J1xuXG4gICAgdGhpcy5yZWRpcmVjdGVkTG9naW5VcmwgPSB0aGlzLnNlcnZlclVybCArIHRoaXMucmVkaXJlY3RlZExvZ2luVXJsXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgUG9wIHVwIHdpbmRvdyB0byBTQVMgTG9naW4gc2NyZWVuLlxuICAgKiBBbmQgY2hlY2tzIGlmIHVzZXIgaGFzIGZpbmlzaGVkIGxvZ2luIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVkaXJlY3RlZExvZ0luKHtcbiAgICBvbkxvZ2dlZE91dFxuICB9OiBMb2dpbk9wdGlvbnMpOiBQcm9taXNlPExvZ2luUmVzdWx0PiB7XG4gICAgY29uc3Qge1xuICAgICAgaXNMb2dnZWRJbjogaXNMb2dnZWRJbkFscmVhZHksXG4gICAgICB1c2VyTmFtZTogY3VycmVudFNlc3Npb25Vc2VyTmFtZSxcbiAgICAgIHVzZXJMb25nTmFtZTogY3VycmVudFNlc3Npb25Vc2VyTG9uZ05hbWVcbiAgICB9ID0gYXdhaXQgdGhpcy5mZXRjaFVzZXJOYW1lKClcblxuICAgIGlmIChpc0xvZ2dlZEluQWxyZWFkeSkge1xuICAgICAgY29uc3QgbG9nZ2VyID0gcHJvY2Vzcy5sb2dnZXIgfHwgY29uc29sZVxuICAgICAgbG9nZ2VyLmxvZygnbG9naW4gd2FzIG5vdCBhdHRlbXB0ZWQgYXMgYSB2YWxpZCBzZXNzaW9uIGFscmVhZHkgZXhpc3RzJylcblxuICAgICAgYXdhaXQgdGhpcy5sb2dpbkNhbGxiYWNrKClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNMb2dnZWRJbjogdHJ1ZSxcbiAgICAgICAgdXNlck5hbWU6IGN1cnJlbnRTZXNzaW9uVXNlck5hbWUsXG4gICAgICAgIHVzZXJMb25nTmFtZTogY3VycmVudFNlc3Npb25Vc2VyTG9uZ05hbWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblBvcHVwID0gYXdhaXQgb3BlbldlYlBhZ2UoXG4gICAgICB0aGlzLnJlZGlyZWN0ZWRMb2dpblVybCxcbiAgICAgICdTQVNMb2dvbicsXG4gICAgICB7XG4gICAgICAgIHdpZHRoOiA1MDAsXG4gICAgICAgIGhlaWdodDogNjAwXG4gICAgICB9LFxuICAgICAgb25Mb2dnZWRPdXRcbiAgICApXG5cbiAgICBpZiAoIWxvZ2luUG9wdXApIHtcbiAgICAgIHJldHVybiB7IGlzTG9nZ2VkSW46IGZhbHNlLCB1c2VyTmFtZTogJycsIHVzZXJMb25nTmFtZTogJycgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgaXNMb2dnZWRJbiB9ID1cbiAgICAgIHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNWaXlhXG4gICAgICAgID8gYXdhaXQgdmVyaWZ5U2FzVml5YUxvZ2luKGxvZ2luUG9wdXApXG4gICAgICAgIDogYXdhaXQgdmVyaWZ5U2FzOUxvZ2luKGxvZ2luUG9wdXApXG5cbiAgICBsb2dpblBvcHVwLmNsb3NlKClcblxuICAgIGlmIChpc0xvZ2dlZEluKSB7XG4gICAgICBpZiAodGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhczkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtQ0FTU2VjdXJpdHlDaGVjaygpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHVzZXJMb25nTmFtZSB9ID0gYXdhaXQgdGhpcy5mZXRjaFVzZXJOYW1lKClcblxuICAgICAgYXdhaXQgdGhpcy5sb2dpbkNhbGxiYWNrKClcblxuICAgICAgcmV0dXJuIHsgaXNMb2dnZWRJbjogdHJ1ZSwgdXNlck5hbWUsIHVzZXJMb25nTmFtZSB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaXNMb2dnZWRJbjogZmFsc2UsIHVzZXJOYW1lOiAnJywgdXNlckxvbmdOYW1lOiAnJyB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbnRvIHRoZSBTQVMgc2VydmVyIHdpdGggdGhlIHN1cHBsaWVkIGNyZWRlbnRpYWxzLlxuICAgKiBAcGFyYW0gdXNlcm5hbWUgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXJuYW1lLlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyAtIGEgYm9vbGVhbiBgaXNMb2dnZWRpbmAgYW5kIGEgc3RyaW5nIGB1c2VybmFtZWBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2dJbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxMb2dpblJlc3VsdD4ge1xuICAgIGNvbnN0IGxvZ2luUGFyYW1zID0ge1xuICAgICAgX3NlcnZpY2U6ICdkZWZhdWx0JyxcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmRcbiAgICB9XG4gICAgdGhpcy51c2VyTmFtZSA9ICcnXG4gICAgdGhpcy51c2VyTG9uZ05hbWUgPSAnJ1xuXG4gICAgbGV0IHtcbiAgICAgIGlzTG9nZ2VkSW46IGlzTG9nZ2VkSW5BbHJlYWR5LFxuICAgICAgbG9naW5Gb3JtLFxuICAgICAgdXNlckxvbmdOYW1lOiBjdXJyZW50U2Vzc2lvblVzZXJMb25nTmFtZVxuICAgIH0gPSBhd2FpdCB0aGlzLmNoZWNrU2Vzc2lvbigpXG5cbiAgICBpZiAoaXNMb2dnZWRJbkFscmVhZHkpIHtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IHByb2Nlc3MubG9nZ2VyIHx8IGNvbnNvbGVcbiAgICAgIGxvZ2dlci5sb2coJ2xvZ2luIHdhcyBub3QgYXR0ZW1wdGVkIGFzIGEgdmFsaWQgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0cycpXG5cbiAgICAgIGF3YWl0IHRoaXMubG9naW5DYWxsYmFjaygpXG5cbiAgICAgIHRoaXMudXNlck5hbWUgPSBsb2dpblBhcmFtcy51c2VybmFtZVxuICAgICAgdGhpcy51c2VyTG9uZ05hbWUgPSBjdXJyZW50U2Vzc2lvblVzZXJMb25nTmFtZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNMb2dnZWRJbjogdHJ1ZSxcbiAgICAgICAgdXNlck5hbWU6IHRoaXMudXNlck5hbWUsXG4gICAgICAgIHVzZXJMb25nTmFtZTogdGhpcy51c2VyTG9uZ05hbWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbG9naW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZExvZ2luUmVxdWVzdChsb2dpbkZvcm0sIGxvZ2luUGFyYW1zKVxuXG4gICAgbGV0IGlzTG9nZ2VkSW4gPSBpc0xvZ0luU3VjY2Vzc0hlYWRlclByZXNlbnQodGhpcy5zZXJ2ZXJUeXBlLCBsb2dpblJlc3BvbnNlKVxuXG4gICAgaWYgKCFpc0xvZ2dlZEluKSB7XG4gICAgICBpZiAoaXNDcmVkZW50aWFsc1ZlcmlmeUVycm9yKGxvZ2luUmVzcG9uc2UpKSB7XG4gICAgICAgIGNvbnN0IG5ld0xvZ2luRm9ybSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5Gb3JtKGxvZ2luUmVzcG9uc2UpXG5cbiAgICAgICAgbG9naW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZExvZ2luUmVxdWVzdChuZXdMb2dpbkZvcm0sIGxvZ2luUGFyYW1zKVxuICAgICAgfVxuXG4gICAgICAvLyBTb21ldGltZXMgZHVlIHRvIHJlZGlyZWN0aW9uIG9uIFNBUzkgYW5kIFNBU1ZpeWEgd2UgZG9uJ3QgZ2V0IHRoZSBsb2dpbiByZXNwb25zZSB0aGF0IHNheXNcbiAgICAgIC8vIFlvdSBoYXZlIHNpZ25lZCBpbi4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIG1ha2UgYW4gZXh0cmEgcmVxdWVzdCBmb3IgY2hlY2tpbmcgc2Vzc2lvbiB0b1xuICAgICAgLy8gZW5zdXJlIGVpdGhlciB1c2VyIGlzIGxvZ2dlZCBpbiBvciBub3QuXG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2hlY2tTZXNzaW9uKClcbiAgICAgIGlzTG9nZ2VkSW4gPSByZXMuaXNMb2dnZWRJblxuICAgICAgdGhpcy51c2VyTG9uZ05hbWUgPSByZXMudXNlckxvbmdOYW1lXG4gICAgfVxuXG4gICAgaWYgKGlzTG9nZ2VkSW4pIHtcbiAgICAgIGlmICh0aGlzLnNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzOSkge1xuICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1DQVNTZWN1cml0eUNoZWNrKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2dpbkNhbGxiYWNrKClcbiAgICAgIHRoaXMudXNlck5hbWUgPSBsb2dpblBhcmFtcy51c2VybmFtZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc0xvZ2dlZEluLFxuICAgICAgdXNlck5hbWU6IHRoaXMudXNlck5hbWUsXG4gICAgICB1c2VyTG9uZ05hbWU6IHRoaXMudXNlckxvbmdOYW1lXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQ0FTU2VjdXJpdHlDaGVjaygpIHtcbiAgICBjb25zdCBjYXNBdXRoZW50aWNhdGlvblVybCA9IGAke3RoaXMuc2VydmVyVXJsfS9TQVNTdG9yZWRQcm9jZXNzL2pfc3ByaW5nX2Nhc19zZWN1cml0eV9jaGVja2BcblxuICAgIGF3YWl0IHRoaXMucmVxdWVzdENsaWVudFxuICAgICAgLmdldDxzdHJpbmc+KGAvU0FTTG9nb24vbG9naW4/c2VydmljZT0ke2Nhc0F1dGhlbnRpY2F0aW9uVXJsfWAsIHVuZGVmaW5lZClcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIC8vIGlnbm9yZSBpZiByZXNvdXJjZSBub3QgZm91bmQgZXJyb3JcbiAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGVyclxuICAgICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZExvZ2luUmVxdWVzdChcbiAgICBsb2dpbkZvcm06IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICAgbG9naW5QYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbiAgKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNqcykge1xuICAgICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IGxvZ2luUGFyYW1zXG4gICAgICBjb25zdCB7IHJlc3VsdDogbG9naW5SZXNwb25zZSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Q2xpZW50LnBvc3Q8c3RyaW5nPihcbiAgICAgICAgdGhpcy5sb2dpblVybCxcbiAgICAgICAgeyB1c2VybmFtZSwgcGFzc3dvcmQgfSxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApXG5cbiAgICAgIHJldHVybiBsb2dpblJlc3BvbnNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9naW5Gb3JtKSB7XG4gICAgICBsb2dpblBhcmFtc1trZXldID0gbG9naW5Gb3JtW2tleV1cbiAgICB9XG4gICAgY29uc3QgbG9naW5QYXJhbXNTdHIgPSBzZXJpYWxpemUobG9naW5QYXJhbXMpXG5cbiAgICBjb25zdCB7IHJlc3VsdDogbG9naW5SZXNwb25zZSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Q2xpZW50LnBvc3Q8c3RyaW5nPihcbiAgICAgIHRoaXMubG9naW5VcmwsXG4gICAgICBsb2dpblBhcmFtc1N0cixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgIHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICBBY2NlcHQ6ICcqLyonXG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIGxvZ2luUmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHNlc3Npb24gaXMgYWN0aXZlLCBvciBsb2dpbiBpcyByZXF1aXJlZC5cbiAgICogQHJldHVybnMgLSBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aHJlZSB2YWx1ZXNcbiAgICogIC0gYSBib29sZWFuIGBpc0xvZ2dlZEluYFxuICAgKiAgLSBhIHN0cmluZyBgdXNlck5hbWVgLFxuICAgKiAgLSBhIHN0cmluZyBgdXNlckZ1bGxOYW1lYCBhbmRcbiAgICogIC0gYSBmb3JtIGBsb2dpbkZvcm1gIGlmIG5vdCBsb2dnZWRJbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja1Nlc3Npb24oKTogUHJvbWlzZTxMb2dpblJlc3VsdEludGVybmFsPiB7XG4gICAgY29uc3QgeyBpc0xvZ2dlZEluLCB1c2VyTmFtZSwgdXNlckxvbmdOYW1lIH0gPSBhd2FpdCB0aGlzLmZldGNoVXNlck5hbWUoKVxuICAgIGxldCBsb2dpbkZvcm0gPSBudWxsXG5cbiAgICBpZiAoIWlzTG9nZ2VkSW4pIHtcbiAgICAgIC8vV2Ugd2lsbCBsb2dvdXQgdG8gbWFrZSBzdXJlIGNvb2tpZXMgYXJlIHJlbW92ZWQgYW5kIGxvZ2luIGZvcm0gaXMgcHJlc2VudGVkXG4gICAgICAvL1Jlc2lkdWUgY2FuIGhhcHBlbiBpbiBjYXNlIG9mIHNlc3Npb24gZXhwaXJhdGlvblxuICAgICAgYXdhaXQgdGhpcy5sb2dPdXQoKVxuXG4gICAgICBsb2dpbkZvcm0gPSBhd2FpdCB0aGlzLmdldE5ld0xvZ2luRm9ybSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBpc0xvZ2dlZEluLFxuICAgICAgdXNlck5hbWUsXG4gICAgICB1c2VyTG9uZ05hbWUsXG4gICAgICBsb2dpbkZvcm1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXROZXdMb2dpbkZvcm0oKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNqcykge1xuICAgICAgLy8gc2VydmVyIHdpbGwgYmUgc2VuZGluZyBDU1JGIHRva2VuIGluIHJlc3BvbnNlLFxuICAgICAgLy8gbmVlZCB0byBzYXZlIGluIGNvb2tpZSBzbyB0aGF0LFxuICAgICAgLy8gaHR0cCBjbGllbnQgd2lsbCB1c2UgaXQgYXV0b21hdGljYWxseVxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdENsaWVudC5nZXQoJy8nLCB1bmRlZmluZWQpLnRoZW4oKHsgcmVzdWx0IH0pID0+IHtcbiAgICAgICAgY29uc3QgY29va2llID1cbiAgICAgICAgICAvPHNjcmlwdD5kb2N1bWVudC5jb29raWUgPSAnKFhTUkYtVE9LRU49Lio7IE1heC1BZ2U9ODY0MDA7IFNhbWVTaXRlPVN0cmljdDsgUGF0aD1cXC87KSc8XFwvc2NyaXB0Pi8uZXhlYyhcbiAgICAgICAgICAgIHJlc3VsdCBhcyBzdHJpbmdcbiAgICAgICAgICApPy5bMV1cblxuICAgICAgICBpZiAoY29va2llKSBkb2N1bWVudC5jb29raWUgPSBjb29raWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgeyByZXN1bHQ6IGZvcm1SZXNwb25zZSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Q2xpZW50LmdldDxzdHJpbmc+KFxuICAgICAgdGhpcy5sb2dpblVybC5yZXBsYWNlKCcvU0FTTG9nb24vbG9naW4uZG8nLCAnL1NBU0xvZ29uL2xvZ2luJyksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAndGV4dC9wbGFpbidcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2dpbkZvcm0oZm9ybVJlc3BvbnNlKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFVzZXJOYW1lKCk6IFByb21pc2U8TG9naW5SZXN1bHQ+IHtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgdGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhc1ZpeWFcbiAgICAgICAgPyBgJHt0aGlzLnNlcnZlclVybH0vaWRlbnRpdGllcy91c2Vycy9AY3VycmVudFVzZXJgXG4gICAgICAgIDogdGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhczlcbiAgICAgICAgICA/IGAke3RoaXMuc2VydmVyVXJsfS9TQVNTdG9yZWRQcm9jZXNzYFxuICAgICAgICAgIDogYCR7dGhpcy5zZXJ2ZXJVcmx9L1NBU2pzQXBpL3Nlc3Npb25gXG5cbiAgICBjb25zdCB7IHJlc3VsdDogbG9naW5SZXNwb25zZSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Q2xpZW50XG4gICAgICAuZ2V0PHN0cmluZz4odXJsLCB1bmRlZmluZWQsICd0ZXh0L3BsYWluJylcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiAnYXV0aEVycicgfVxuICAgICAgfSlcblxuICAgIGNvbnN0IGlzTG9nZ2VkSW4gPSBsb2dpblJlc3BvbnNlICE9PSAnYXV0aEVycidcblxuICAgIGlmICghaXNMb2dnZWRJbikge1xuICAgICAgLy9XZSB3aWxsIGxvZ291dCB0byBtYWtlIHN1cmUgY29va2llcyBhcmUgcmVtb3ZlZCBhbmQgbG9naW4gZm9ybSBpcyBwcmVzZW50ZWRcbiAgICAgIC8vUmVzaWR1ZSBjYW4gaGFwcGVuIGluIGNhc2Ugb2Ygc2Vzc2lvbiBleHBpcmF0aW9uXG4gICAgICBhd2FpdCB0aGlzLmxvZ091dCgpXG4gICAgICByZXR1cm4geyBpc0xvZ2dlZEluLCB1c2VyTmFtZTogJycsIHVzZXJMb25nTmFtZTogJycgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc0xvZ2dlZEluLFxuICAgICAgdXNlck5hbWU6IHRoaXMuZXh0cmFjdFVzZXJOYW1lKGxvZ2luUmVzcG9uc2UpLFxuICAgICAgdXNlckxvbmdOYW1lOiB0aGlzLmV4dHJhY3RVc2VyTG9uZ05hbWUobG9naW5SZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RVc2VyTmFtZSA9IChyZXNwb25zZTogYW55KTogc3RyaW5nID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc2VydmVyVHlwZSkge1xuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhc1ZpeWE6XG4gICAgICAgIHJldHVybiByZXNwb25zZT8uaWRcblxuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhczk6XG4gICAgICAgIHJldHVybiAnJ1xuXG4gICAgICBjYXNlIFNlcnZlclR5cGUuU2FzanM6XG4gICAgICAgIHJldHVybiByZXNwb25zZT8udXNlcm5hbWVcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignU2VydmVyIFR5cGUgbm90IGZvdW5kIGluIGV4dHJhY3RVc2VyTmFtZSBmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFVzZXJMb25nTmFtZSA9IChyZXNwb25zZTogYW55KTogc3RyaW5nID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc2VydmVyVHlwZSkge1xuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhc1ZpeWE6XG4gICAgICAgIHJldHVybiByZXNwb25zZT8ubmFtZVxuXG4gICAgICBjYXNlIFNlcnZlclR5cGUuU2FzOTpcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RVc2VyTG9uZ05hbWVTYXM5KHJlc3BvbnNlKVxuXG4gICAgICBjYXNlIFNlcnZlclR5cGUuU2FzanM6XG4gICAgICAgIHJldHVybiByZXNwb25zZT8uZGlzcGxheU5hbWVcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignU2VydmVyIFR5cGUgbm90IGZvdW5kIGluIGV4dHJhY3RVc2VyTmFtZSBmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9naW5Gb3JtKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPGZvcm0uK2FjdGlvbj1cIiguKihMb2dvbnxsb2dpbilbXlwiXSopLio+L1xuICAgIGNvbnN0IG1hdGNoZXMgPSBwYXR0ZXJuLmV4ZWMocmVzcG9uc2UpXG4gICAgY29uc3QgZm9ybUlucHV0czogYW55ID0ge31cblxuICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldExvZ2luVXJsKG1hdGNoZXMpXG4gICAgICByZXNwb25zZSA9IHJlc3BvbnNlLnJlcGxhY2UoLzxpbnB1dC9nLCAnXFxuPGlucHV0JylcbiAgICAgIGNvbnN0IGlucHV0cyA9IHJlc3BvbnNlLm1hdGNoKC88aW5wdXQuKlwiaGlkZGVuXCJbXj5dKj4vZylcblxuICAgICAgaWYgKGlucHV0cykge1xuICAgICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXRTdHI6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlTWF0Y2ggPSBpbnB1dFN0ci5tYXRjaCgvbmFtZT1cIihbXlwiXSopXCJcXHN2YWx1ZT1cIihbXlwiXSopLylcblxuICAgICAgICAgIGlmICh2YWx1ZU1hdGNoICYmIHZhbHVlTWF0Y2gubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3JtSW5wdXRzW3ZhbHVlTWF0Y2hbMV1dID0gdmFsdWVNYXRjaFsyXVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybUlucHV0cykubGVuZ3RoID8gZm9ybUlucHV0cyA6IG51bGxcbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9naW5VcmwgPSAobWF0Y2hlczogUmVnRXhwRXhlY0FycmF5KSA9PiB7XG4gICAgbGV0IHBhcnNlZFVSTCA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvXFw/LiovLCAnJylcbiAgICBpZiAocGFyc2VkVVJMWzBdID09PSAnLycpIHtcbiAgICAgIHBhcnNlZFVSTCA9IHBhcnNlZFVSTC5zdWJzdHIoMSlcblxuICAgICAgY29uc3QgdGVtcExvZ2luTGluayA9IHRoaXMuc2VydmVyVXJsXG4gICAgICAgID8gYCR7dGhpcy5zZXJ2ZXJVcmx9LyR7cGFyc2VkVVJMfWBcbiAgICAgICAgOiBgJHtwYXJzZWRVUkx9YFxuXG4gICAgICBjb25zdCBsb2dpblVybCA9IHRlbXBMb2dpbkxpbmtcblxuICAgICAgdGhpcy5sb2dpblVybCA9XG4gICAgICAgIHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNWaXlhXG4gICAgICAgICAgPyB0ZW1wTG9naW5MaW5rXG4gICAgICAgICAgOiBsb2dpblVybC5yZXBsYWNlKCcvU0FTTG9nb24vbG9naW4uZG8nLCAnL1NBU0xvZ29uL2xvZ2luJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBvdXQgb2YgdGhlIGNvbmZpZ3VyZWQgU0FTIHNlcnZlci5cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2dPdXQoKSB7XG4gICAgdGhpcy5yZXF1ZXN0Q2xpZW50LnJlc2V0SW5NZW1vcnlBdXRoU3RhdGUoKVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENsaWVudC5nZXQodGhpcy5sb2dvdXRVcmwsIHVuZGVmaW5lZCkudGhlbigoKSA9PiB0cnVlKVxuICB9XG59XG5cbmNvbnN0IGlzQ3JlZGVudGlhbHNWZXJpZnlFcnJvciA9IChyZXNwb25zZTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAvQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdGhlIHN5c3RlbSB3YXMgdmVyaWZ5aW5nIHlvdXIgY3JlZGVudGlhbHMuIFBsZWFzZSBlbnRlciB5b3VyIGNyZWRlbnRpYWxzIGFnYWluLi9nbS50ZXN0KFxuICAgIHJlc3BvbnNlXG4gIClcbiIsImV4cG9ydCAqIGZyb20gJy4vQXV0aE1hbmFnZXInXG5leHBvcnQgKiBmcm9tICcuL2lzQXV0aG9yaXplRm9ybVJlcXVpcmVkJ1xuZXhwb3J0ICogZnJvbSAnLi9pc0xvZ2luUmVxdWlyZWQnXG5leHBvcnQgKiBmcm9tICcuL2xvZ2luSGVhZGVyJ1xuIiwiZXhwb3J0IGNvbnN0IGlzQXV0aG9yaXplRm9ybVJlcXVpcmVkID0gKHJlc3BvbnNlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIC88Zm9ybS4rYWN0aW9uPVwiKC4qTG9nb25cXC9vYXV0aFxcL2F1dGhvcml6ZVteXCJdKikuKj4vZ20udGVzdChyZXNwb25zZSlcbn1cbiIsImV4cG9ydCBjb25zdCBpc0xvZ0luUmVxdWlyZWQgPSAocmVzcG9uc2U6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPGZvcm0uK2FjdGlvbj1cIiguKihMb2dvbil8KGxvZ2luKVteXCJdKikuKj4vZ21cbiAgY29uc3QgbWF0Y2hlcyA9IHBhdHRlcm4udGVzdChyZXNwb25zZSlcbiAgcmV0dXJuIG1hdGNoZXNcbn1cbiIsImltcG9ydCB7IFNlcnZlclR5cGUgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBnZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuLi91dGlscydcblxuY29uc3QgZW5Mb2dpblN1Y2Nlc3NIZWFkZXIgPSAnWW91IGhhdmUgc2lnbmVkIGluLidcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdWNjZXNzSGVhZGVyS2V5ID0gJ2RlZmF1bHQnXG5cbi8vIFRoZSBmb2xsb3dpbmcgaGVhZGVycyBwcm92aWRlZCBieSBodHRwczovL2dpdGh1Yi5jb20vc2FzanMvYWRhcHRlci9pc3N1ZXMvODM1I2lzc3VlY29tbWVudC0yMTc3ODE4NjAxXG5leHBvcnQgY29uc3QgbG9naW5TdWNjZXNzSGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgZXM6IGBZYSBzZSBoYSBpbmljaWFkbyBsYSBzZXNpXFx1MDBmM24uYCxcbiAgdGg6IGBcXHUwZTA0XFx1MGUzOFxcdTBlMTNcXHUwZTI1XFx1MGUwN1xcdTBlMGFcXHUwZTM3XFx1MGU0OFxcdTBlMmRcXHUwZTQwXFx1MGUwMlxcdTBlNDlcXHUwZTMyXFx1MGU0M1xcdTBlMGFcXHUwZTQ5XFx1MGU0MVxcdTBlMjVcXHUwZTQ5XFx1MGUyN2AsXG4gIGphOiBgXFx1MzBiNVxcdTMwYTRcXHUzMGYzXFx1MzBhNFxcdTMwZjNcXHUzMDU3XFx1MzA3ZVxcdTMwNTdcXHUzMDVmXFx1MzAwMmAsXG4gIG5iOiBgRHUgaGFyIGxvZ2dldCBkZWcgcFxcdTAwZTUuYCxcbiAgc2w6IGBQcmlqYXZpbGkgc3RlIHNlLmAsXG4gIGFyOiBgXFx1MDY0NFxcdTA2NDJcXHUwNjJmIFxcdTA2NDJcXHUwNjQ1XFx1MDYyYSBgLFxuICBzazogYFByaWhsXFx1MDBlMXNpbGkgc3RlIHNhLmAsXG4gIHpoX0hLOiBgXFx1NjBhOFxcdTVkZjJcXHU3NjdiXFx1NTE2NVxcdTMwMDJgLFxuICB6aF9DTjogYFxcdTYwYThcXHU1ZGYyXFx1NzY3YlxcdTVmNTVcXHUzMDAyYCxcbiAgaXQ6IGBMJ3V0ZW50ZSBzaSBcXHUwMGU4IGNvbm5lc3NvLmAsXG4gIHN2OiBgRHUgaGFyIGxvZ2dhdCBpbi5gLFxuICBoZTogYFxcdTA1ZTBcXHUwNWRiXFx1MDVlMFxcdTA1ZTFcXHUwNWVhIGAsXG4gIG5sOiBgVSBoZWJ0IHppY2ggYWFuZ2VtZWxkLmAsXG4gIHBsOiBgWm9zdGFcXHUwMTQyZVxcdTAxNWIgemFsb2dvd2FueS5gLFxuICBrbzogYFxcdWI4NWNcXHVhZGY4XFx1Yzc3OFxcdWQ1ODhcXHVjMmI1XFx1YjJjOFxcdWIyZTQuYCxcbiAgemhfVFc6IGBcXHU2MGE4XFx1NWRmMlxcdTc2N2JcXHU1MTY1XFx1MzAwMmAsXG4gIHRyOiBgT3R1cnVtIGFcXHUwMGU3dFxcdTAxMzFuXFx1MDEzMXouYCxcbiAgaXc6IGBcXHUwNWUwXFx1MDVkYlxcdTA1ZTBcXHUwNWUxXFx1MDVlYSBgLFxuICBmcjogYFZvdXMgXFx1MDBlYXRlcyBjb25uZWN0XFx1MDBlOS5gLFxuICB1azogYFxcdTA0MTJcXHUwNDM4IFxcdTA0MzJcXHUwNDMyXFx1MDQ1NlxcdTA0MzlcXHUwNDQ4XFx1MDQzYlxcdTA0MzggXFx1MDQzMiBcXHUwNDNlXFx1MDQzMVxcdTA0M2JcXHUwNDU2XFx1MDQzYVxcdTA0M2VcXHUwNDMyXFx1MDQzOFxcdTA0MzkgXFx1MDQzN1xcdTA0MzBcXHUwNDNmXFx1MDQzOFxcdTA0NDEuYCxcbiAgcHRfQlI6IGBWb2NcXHUwMGVhIHNlIGNvbmVjdG91LmAsXG4gIG5vOiBgRHUgaGFyIGxvZ2dldCBkZWcgcFxcdTAwZTUuYCxcbiAgY3M6IGBKc3RlIHBcXHUwMTU5aWhsXFx1MDBlMVxcdTAxNjFlbmkuYCxcbiAgZmk6IGBPbGV0IGtpcmphdXR1bnV0IHNpc1xcdTAwZTRcXHUwMGU0bi5gLFxuICBydTogYFxcdTA0MTJcXHUwNDRiIFxcdTA0MzJcXHUwNDRiXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQzZFxcdTA0MzhcXHUwNDNiXFx1MDQzOCBcXHUwNDMyXFx1MDQ0NVxcdTA0M2VcXHUwNDM0IFxcdTA0MzIgXFx1MDQ0MVxcdTA0MzhcXHUwNDQxXFx1MDQ0MlxcdTA0MzVcXHUwNDNjXFx1MDQ0My5gLFxuICBlbDogYFxcdTAzODhcXHUwM2M3XFx1MDNiNVxcdTAzYzRcXHUwM2I1IFxcdTAzYzNcXHUwM2M1XFx1MDNiZFxcdTAzYjRcXHUwM2I1XFx1MDNiOFxcdTAzYjVcXHUwM2FmLmAsXG4gIGhyOiBgUHJpamF2aWxpIHN0ZSBzZS5gLFxuICBkYTogYER1IGVyIGxvZ2dldCBwXFx1MDBlNS5gLFxuICBkZTogYFNpZSBzaW5kIGpldHp0IGFuZ2VtZWxkZXQuYCxcbiAgc2g6IGBQcmlqYXZsamVuaSBzdGUuYCxcbiAgcHQ6IGBJbmljaW91IHNlc3NcXHUwMGUzby5gLFxuICBodTogYEJlamVsZW50a2V6ZXR0LmAsXG4gIHNyOiBgUHJpamF2bGplbmkgc3RlLmAsXG4gIGVuOiBlbkxvZ2luU3VjY2Vzc0hlYWRlcixcbiAgW2RlZmF1bHRTdWNjZXNzSGVhZGVyS2V5XTogZW5Mb2dpblN1Y2Nlc3NIZWFkZXJcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBleHBlY3RlZCBsb2dpbiBoZWFkZXIgYmFzZWQgb24gbGFuZ3VhZ2Ugc2V0dGluZ3Mgb2YgdGhlIGJyb3dzZXIuXG4gKiBAcmV0dXJucyAtIGV4cGVjdGVkIGhlYWRlciBhcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cGVjdGVkTG9nSW5TdWNjZXNzSGVhZGVyID0gKCk6IHN0cmluZyA9PiB7XG4gIC8vIGdldCBkZWZhdWx0IHN1Y2Nlc3MgaGVhZGVyXG4gIGxldCBzdWNjZXNzSGVhZGVyID0gbG9naW5TdWNjZXNzSGVhZGVyc1tkZWZhdWx0U3VjY2Vzc0hlYWRlcktleV1cblxuICAvLyBnZXQgdXNlciBsYW5ndWFnZSBiYXNlZCBvbiBsYW5ndWFnZSBzZXR0aW5ncyBvZiB0aGUgYnJvd3NlclxuICBjb25zdCB1c2VyTGFuZyA9IGdldFVzZXJMYW5ndWFnZSgpXG5cbiAgaWYgKHVzZXJMYW5nKSB7XG4gICAgLy8gZ2V0IHN1Y2Nlc3MgaGVhZGVyIG9uIGV4YWN0IG1hdGNoIG9mIHRoZSBsYW5ndWFnZSBjb2RlXG4gICAgbGV0IHVzZXJMYW5nU3VjY2Vzc0hlYWRlciA9IGxvZ2luU3VjY2Vzc0hlYWRlcnNbdXNlckxhbmddXG5cbiAgICAvLyBoYW5kbGUgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoIG9mIHRoZSBsYW5ndWFnZSBjb2RlXG4gICAgaWYgKCF1c2VyTGFuZ1N1Y2Nlc3NIZWFkZXIpIHtcbiAgICAgIC8vIGdldCBhbGwgc3VwcG9ydGVkIGxhbmd1YWdlIGNvZGVzXG4gICAgICBjb25zdCBoZWFkZXJMYW5ndWFnZXMgPSBPYmplY3Qua2V5cyhsb2dpblN1Y2Nlc3NIZWFkZXJzKVxuXG4gICAgICAvLyBmaW5kIGxhbmd1YWdlIGNvZGUgb24gcGFydGlhbCBtYXRjaFxuICAgICAgY29uc3QgaGVhZGVyTGFuZ3VhZ2UgPSBoZWFkZXJMYW5ndWFnZXMuZmluZCgobGFuZ3VhZ2UpID0+XG4gICAgICAgIG5ldyBSZWdFeHAobGFuZ3VhZ2UsICdpJykudGVzdCh1c2VyTGFuZylcbiAgICAgIClcblxuICAgICAgLy8gcmVhc3NpZ24gc3VjY2VzcyBoZWFkZXIgaWYgcGFydGlhbCBtYXRjaCB3YXMgZm91bmRcbiAgICAgIGlmIChoZWFkZXJMYW5ndWFnZSkge1xuICAgICAgICBzdWNjZXNzSGVhZGVyID0gbG9naW5TdWNjZXNzSGVhZGVyc1toZWFkZXJMYW5ndWFnZV1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VjY2Vzc0hlYWRlciA9IHVzZXJMYW5nU3VjY2Vzc0hlYWRlclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWNjZXNzSGVhZGVyXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIExvZ2luIHN1Y2Nlc3MgaGVhZGVyIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJhc2VkIG9uIGxhbmd1YWdlIHNldHRpbmdzIG9mIHRoZSBicm93c2VyLlxuICogQHBhcmFtIHNlcnZlclR5cGUgLSBzZXJ2ZXIgdHlwZS5cbiAqIEBwYXJhbSByZXNwb25zZSAtIHJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm5zIC0gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIExvZ2luIHN1Y2Nlc3MgaGVhZGVyIGlzIHByZXNlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xvZ0luU3VjY2Vzc0hlYWRlclByZXNlbnQgPSAoXG4gIHNlcnZlclR5cGU6IFNlcnZlclR5cGUsXG4gIHJlc3BvbnNlOiBhbnlcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNqcykgcmV0dXJuIHJlc3BvbnNlPy5sb2dnZWRJblxuXG4gIHJldHVybiBuZXcgUmVnRXhwKGdldEV4cGVjdGVkTG9nSW5TdWNjZXNzSGVhZGVyKCksICdnbScpLnRlc3QocmVzcG9uc2UpXG59XG4iLCJpbXBvcnQgeyBvcGVuTG9naW5Qcm9tcHQgfSBmcm9tICcuLi91dGlscy9sb2dpblByb21wdCdcblxuaW50ZXJmYWNlIFdpbmRvd0ZlYXR1cmVzIHtcbiAgd2lkdGg6IG51bWJlclxuICBoZWlnaHQ6IG51bWJlclxufVxuXG5jb25zdCBkZWZhdWx0V2luZG93RmVhdHVyZXM6IFdpbmRvd0ZlYXR1cmVzID0geyB3aWR0aDogNTAwLCBoZWlnaHQ6IDYwMCB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuV2ViUGFnZShcbiAgdXJsOiBzdHJpbmcsXG4gIHdpbmRvd05hbWU6IHN0cmluZyA9ICcnLFxuICBXaW5kb3dGZWF0dXJlczogV2luZG93RmVhdHVyZXMgPSBkZWZhdWx0V2luZG93RmVhdHVyZXMsXG4gIG9uTG9nZ2VkT3V0PzogKCkgPT4gUHJvbWlzZTxCb29sZWFuPlxuKTogUHJvbWlzZTxXaW5kb3cgfCBudWxsPiB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gV2luZG93RmVhdHVyZXNcbiAgY29uc3QgbGVmdCA9IHNjcmVlbi53aWR0aCAvIDIgLSB3aWR0aCAvIDJcbiAgY29uc3QgdG9wID0gc2NyZWVuLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyXG5cbiAgY29uc3QgbG9naW5Qb3B1cCA9IHdpbmRvdy5vcGVuKFxuICAgIHVybCxcbiAgICB3aW5kb3dOYW1lLFxuICAgIGB0b29sYmFyPTAsbG9jYXRpb249MCxtZW51YmFyPTAsd2lkdGg9JHt3aWR0aH0saGVpZ2h0PSR7aGVpZ2h0fSxsZWZ0PSR7bGVmdH0sdG9wPSR7dG9wfWBcbiAgKVxuXG4gIGlmICghbG9naW5Qb3B1cCkge1xuICAgIGNvbnN0IGdldFVzZXJBY3Rpb246ICgpID0+IFByb21pc2U8Qm9vbGVhbj4gPSBvbkxvZ2dlZE91dCA/PyBvcGVuTG9naW5Qcm9tcHRcblxuICAgIGNvbnN0IGRvTG9naW4gPSBhd2FpdCBnZXRVc2VyQWN0aW9uKClcbiAgICByZXR1cm4gZG9Mb2dpblxuICAgICAgPyB3aW5kb3cub3BlbihcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgd2luZG93TmFtZSxcbiAgICAgICAgICBgdG9vbGJhcj0wLGxvY2F0aW9uPTAsbWVudWJhcj0wLHdpZHRoPSR7d2lkdGh9LGhlaWdodD0ke2hlaWdodH0sbGVmdD0ke2xlZnR9LHRvcD0ke3RvcH1gXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIGxvZ2luUG9wdXBcbn1cbiIsImltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlciB9IGZyb20gJy4vJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2FzOUxvZ2luKGxvZ2luUG9wdXA6IFdpbmRvdyk6IFByb21pc2U8e1xuICBpc0xvZ2dlZEluOiBib29sZWFuXG59PiB7XG4gIGxldCBpc0xvZ2dlZEluID0gZmFsc2VcbiAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcbiAgbGV0IGVsYXBzZWRTZWNvbmRzID0gMFxuXG4gIGRvIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgIGlmIChsb2dpblBvcHVwLmNsb3NlZCkgYnJlYWtcblxuICAgIGlzTG9nZ2VkSW4gPVxuICAgICAgbG9naW5Qb3B1cC53aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnU0FTTG9nb24nKSAmJlxuICAgICAgbG9naW5Qb3B1cC53aW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lclRleHQuaW5jbHVkZXMoXG4gICAgICAgIGdldEV4cGVjdGVkTG9nSW5TdWNjZXNzSGVhZGVyKClcbiAgICAgIClcblxuICAgIGVsYXBzZWRTZWNvbmRzID0gKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnRUaW1lLnZhbHVlT2YoKSkgLyAxMDAwXG4gIH0gd2hpbGUgKCFpc0xvZ2dlZEluICYmIGVsYXBzZWRTZWNvbmRzIDwgNSAqIDYwKVxuXG4gIHJldHVybiB7IGlzTG9nZ2VkSW4gfVxufVxuIiwiaW1wb3J0IHsgZGVsYXkgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGdldEV4cGVjdGVkTG9nSW5TdWNjZXNzSGVhZGVyIH0gZnJvbSAnLi8nXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTYXNWaXlhTG9naW4obG9naW5Qb3B1cDogV2luZG93KTogUHJvbWlzZTx7XG4gIGlzTG9nZ2VkSW46IGJvb2xlYW5cbn0+IHtcbiAgbGV0IGlzTG9nZ2VkSW4gPSBmYWxzZVxuICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxuICBsZXQgZWxhcHNlZFNlY29uZHMgPSAwXG5cbiAgZG8ge1xuICAgIGF3YWl0IGRlbGF5KDEwMDApXG5cbiAgICBpZiAobG9naW5Qb3B1cC5jbG9zZWQpIGJyZWFrXG5cbiAgICBpc0xvZ2dlZEluID0gaXNMb2dnZWRJblNBU1ZJWUEoKVxuXG4gICAgZWxhcHNlZFNlY29uZHMgPSAobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydFRpbWUudmFsdWVPZigpKSAvIDEwMDBcbiAgfSB3aGlsZSAoIWlzTG9nZ2VkSW4gJiYgZWxhcHNlZFNlY29uZHMgPCA1ICogNjApXG5cbiAgbGV0IGlzQXV0aG9yaXplZCA9IGZhbHNlXG5cbiAgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxuXG4gIGRvIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKVxuXG4gICAgaWYgKGxvZ2luUG9wdXAuY2xvc2VkKSBicmVha1xuXG4gICAgaXNBdXRob3JpemVkID1cbiAgICAgIGxvZ2luUG9wdXAud2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ1NBU0xvZ29uJykgfHxcbiAgICAgIGxvZ2luUG9wdXAud2luZG93LmRvY3VtZW50LmJvZHk/LmlubmVyVGV4dD8uaW5jbHVkZXMoXG4gICAgICAgIGdldEV4cGVjdGVkTG9nSW5TdWNjZXNzSGVhZGVyKClcbiAgICAgIClcblxuICAgIGVsYXBzZWRTZWNvbmRzID0gKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnRUaW1lLnZhbHVlT2YoKSkgLyAxMDAwXG4gIH0gd2hpbGUgKCFpc0F1dGhvcml6ZWQgJiYgZWxhcHNlZFNlY29uZHMgPCA1ICogNjApXG5cbiAgcmV0dXJuIHsgaXNMb2dnZWRJbjogaXNMb2dnZWRJbiAmJiBpc0F1dGhvcml6ZWQgfVxufVxuXG5leHBvcnQgY29uc3QgaXNMb2dnZWRJblNBU1ZJWUEgPSAoKSA9PlxuICBkb2N1bWVudC5jb29raWUuaW5jbHVkZXMoJ0N1cnJlbnQtVXNlcicpICYmIGRvY3VtZW50LmNvb2tpZS5pbmNsdWRlcygndXNlcklkJylcbiIsImltcG9ydCB7XG4gIGdldFZhbGlkSnNvbixcbiAgcGFyc2VTYXNWaXlhRGVidWdSZXNwb25zZSxcbiAgcGFyc2VXZWJvdXRSZXNwb25zZVxufSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IFVwbG9hZEZpbGUgfSBmcm9tICcuLi90eXBlcy9VcGxvYWRGaWxlJ1xuaW1wb3J0IHtcbiAgRXJyb3JSZXNwb25zZSxcbiAgSm9iRXhlY3V0aW9uRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvclxufSBmcm9tICcuLi90eXBlcy9lcnJvcnMnXG5pbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHsgU2VydmVyVHlwZSB9IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7IEJhc2VKb2JFeGVjdXRvciB9IGZyb20gJy4vSm9iRXhlY3V0b3InXG5cbmludGVyZmFjZSBkYXRhRmlsZVVwbG9hZCB7XG4gIGZpbGVzOiBVcGxvYWRGaWxlW11cbiAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbFxufVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZGVyIGV4dGVuZHMgQmFzZUpvYkV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2VydmVyVXJsOiBzdHJpbmcsXG4gICAgc2VydmVyVHlwZTogU2VydmVyVHlwZSxcbiAgICBwcml2YXRlIGpvYnNQYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZXF1ZXN0Q2xpZW50OiBSZXF1ZXN0Q2xpZW50XG4gICkge1xuICAgIHN1cGVyKHNlcnZlclVybCwgc2VydmVyVHlwZSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlKFxuICAgIHNhc0pvYjogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBjb25maWc6IGFueSxcbiAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2s/OiBhbnlcbiAgKSB7XG4gICAgY29uc3QgeyBmaWxlcywgcGFyYW1zIH06IGRhdGFGaWxlVXBsb2FkID0gZGF0YVxuICAgIGNvbnN0IGxvZ2luQ2FsbGJhY2sgPSBsb2dpblJlcXVpcmVkQ2FsbGJhY2sgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgaWYgKCFmaWxlcz8ubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yUmVzcG9uc2UoJ0F0IGxlYXN0IG9uZSBmaWxlIG11c3QgYmUgcHJvdmlkZWQuJylcblxuICAgIGlmICghc2FzSm9iIHx8IHNhc0pvYiA9PT0gJycpXG4gICAgICB0aHJvdyBuZXcgRXJyb3JSZXNwb25zZSgnc2FzSm9iIG11c3QgYmUgcHJvdmlkZWQuJylcblxuICAgIGxldCBwYXJhbXNTdHJpbmcgPSAnJ1xuXG4gICAgZm9yIChsZXQgcGFyYW0gaW4gcGFyYW1zKVxuICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpXG4gICAgICAgIHBhcmFtc1N0cmluZyArPSBgJiR7cGFyYW19PSR7cGFyYW1zW3BhcmFtXX1gXG5cbiAgICBjb25zdCBwcm9ncmFtID0gY29uZmlnLmFwcExvY1xuICAgICAgPyBjb25maWcuYXBwTG9jLnJlcGxhY2UoL1xcLz8kLywgJy8nKSArIHNhc0pvYi5yZXBsYWNlKC9eXFwvLywgJycpXG4gICAgICA6IHNhc0pvYlxuICAgIGNvbnN0IHVwbG9hZFVybCA9IGAke3RoaXMuam9ic1BhdGh9Lz8ke1xuICAgICAgJ19wcm9ncmFtPScgKyBwcm9ncmFtXG4gICAgfSR7cGFyYW1zU3RyaW5nfWBcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcblxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUuZmlsZSwgZmlsZS5maWxlTmFtZSlcbiAgICB9XG5cbiAgICBjb25zdCBjc3JmVG9rZW4gPSB0aGlzLnJlcXVlc3RDbGllbnQuZ2V0Q3NyZlRva2VuKCdmaWxlJylcbiAgICBpZiAoY3NyZlRva2VuKSBmb3JtRGF0YS5hcHBlbmQoJ19jc3JmJywgY3NyZlRva2VuLnZhbHVlKVxuICAgIGlmIChjb25maWcuZGVidWcpIGZvcm1EYXRhLmFwcGVuZCgnX2RlYnVnJywgJzEzMScpXG4gICAgaWYgKGNvbmZpZy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhc1ZpeWEgJiYgY29uZmlnLmNvbnRleHROYW1lKVxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdfY29udGV4dG5hbWUnLCBjb25maWcuY29udGV4dE5hbWUpXG5cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUnLFxuICAgICAgQWNjZXB0OiAnKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbidcbiAgICB9XG5cbiAgICAvLyBjdXJyZW50bHkgb25seSB3ZWIgYXBwcm9hY2ggaXMgc3VwcG9ydGVkIGZvciBmaWxlIHVwbG9hZFxuICAgIC8vIHRoZXJlZm9yZSBsb2cgaXMgcGFydCBvZiByZXNwb25zZSB3aXRoIGRlYnVnIGVuYWJsZWQgYW5kIG11c3QgYmUgcGFyc2VkXG4gICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3RDbGllbnRcbiAgICAgICAgLnBvc3QodXBsb2FkVXJsLCBmb3JtRGF0YSwgdW5kZWZpbmVkLCAnYXBwbGljYXRpb24vanNvbicsIGhlYWRlcnMpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdENsaWVudC5hcHBlbmRSZXF1ZXN0KHJlcywgc2FzSm9iLCBjb25maWcuZGVidWcpXG5cbiAgICAgICAgICBsZXQganNvblJlc3BvbnNlID0gcmVzLnJlc3VsdFxuXG4gICAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNlcnZlclR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhc1ZpeWE6XG4gICAgICAgICAgICAgICAganNvblJlc3BvbnNlID0gYXdhaXQgcGFyc2VTYXNWaXlhRGVidWdSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgIHJlcy5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RDbGllbnQsXG4gICAgICAgICAgICAgICAgICBjb25maWcuc2VydmVyVXJsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhczk6XG4gICAgICAgICAgICAgICAganNvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXMucmVzdWx0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlV2Vib3V0UmVzcG9uc2UocmVzLnJlc3VsdCwgdXBsb2FkVXJsKVxuICAgICAgICAgICAgICAgICAgICA6IHJlcy5yZXN1bHRcblxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXNqczpcbiAgICAgICAgICAgICAgICBqc29uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5yZXN1bHQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gZ2V0VmFsaWRKc29uKHJlcy5yZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIDogcmVzLnJlc3VsdFxuXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAganNvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlcy5yZXN1bHQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBnZXRWYWxpZEpzb24ocmVzLnJlc3VsdClcbiAgICAgICAgICAgICAgICA6IHJlcy5yZXN1bHRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKGpzb25SZXNwb25zZSlcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGFzeW5jIChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSm9iRXhlY3V0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdENsaWVudCEuYXBwZW5kUmVxdWVzdChlLCBzYXNKb2IsIGNvbmZpZy5kZWJ1ZylcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3JSZXNwb25zZShlPy5tZXNzYWdlLCBlKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRXYWl0aW5nUmVxdWVzdCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAgICAgICAgICAgc2FzSm9iLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGxvZ2luUmVxdWlyZWRDYWxsYmFja1xuICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGF3YWl0IGxvZ2luQ2FsbGJhY2soKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yUmVzcG9uc2UoJ0ZpbGUgdXBsb2FkIHJlcXVlc3QgZmFpbGVkLicsIGUpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHJldHVybiByZXF1ZXN0UHJvbWlzZVxuICB9XG59XG4iLCJpbXBvcnQgeyBBdXRoQ29uZmlnLCBTZXJ2ZXJUeXBlIH0gZnJvbSAnQHNhc2pzL3V0aWxzL3R5cGVzJ1xuaW1wb3J0IHsgRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBhc3luY0ZvckVhY2gsIGlzUmVsYXRpdmVQYXRoIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVGdW5jdGlvbiA9ICgpID0+IFByb21pc2U8YW55PlxuXG5leHBvcnQgaW50ZXJmYWNlIEpvYkV4ZWN1dG9yIHtcbiAgZXhlY3V0ZTogKFxuICAgIHNhc0pvYjogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBjb25maWc6IGFueSxcbiAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2s/OiBhbnksXG4gICAgYXV0aENvbmZpZz86IEF1dGhDb25maWcsXG4gICAgZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXM/OiBFeHRyYVJlc3BvbnNlQXR0cmlidXRlc1tdXG4gICkgPT4gUHJvbWlzZTxhbnk+XG4gIHJlc2VuZFdhaXRpbmdSZXF1ZXN0czogKCkgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUpvYkV4ZWN1dG9yIGltcGxlbWVudHMgSm9iRXhlY3V0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc2VydmVyVXJsOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHNlcnZlclR5cGU6IFNlcnZlclR5cGVcbiAgKSB7fVxuXG4gIHByaXZhdGUgd2FpdGluZ1JlcXVlc3RzOiBFeGVjdXRlRnVuY3Rpb25bXSA9IFtdXG5cbiAgYWJzdHJhY3QgZXhlY3V0ZShcbiAgICBzYXNKb2I6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgY29uZmlnOiBhbnksXG4gICAgbG9naW5SZXF1aXJlZENhbGxiYWNrPzogYW55LFxuICAgIGF1dGhDb25maWc/OiBBdXRoQ29uZmlnIHwgdW5kZWZpbmVkLFxuICAgIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzPzogRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXNbXVxuICApOiBQcm9taXNlPGFueT5cblxuICByZXNlbmRXYWl0aW5nUmVxdWVzdHMgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXN5bmNGb3JFYWNoKFxuICAgICAgdGhpcy53YWl0aW5nUmVxdWVzdHMsXG4gICAgICBhc3luYyAod2FpdGluZ1JlcXVlc3Q6IEV4ZWN1dGVGdW5jdGlvbikgPT4ge1xuICAgICAgICBhd2FpdCB3YWl0aW5nUmVxdWVzdCgpXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGhpcy53YWl0aW5nUmVxdWVzdHMgPSBbXVxuICAgIHJldHVyblxuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGVuZFdhaXRpbmdSZXF1ZXN0KHJlcXVlc3Q6IEV4ZWN1dGVGdW5jdGlvbikge1xuICAgIHRoaXMud2FpdGluZ1JlcXVlc3RzLnB1c2gocmVxdWVzdClcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0UGFyYW1zKGNvbmZpZzogYW55KTogYW55IHtcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBhbnkgPSB7fVxuXG4gICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgcmVxdWVzdFBhcmFtc1snX29taXR0ZXh0bG9nJ10gPSAnZmFsc2UnXG4gICAgICByZXF1ZXN0UGFyYW1zWydfb21pdFNlc3Npb25SZXN1bHRzJ10gPSAnZmFsc2UnXG4gICAgICByZXF1ZXN0UGFyYW1zWydfZGVidWcnXSA9IDEzMVxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0UGFyYW1zXG4gIH1cbn1cbiIsImltcG9ydCB7IHZhbGlkYXRlSW5wdXQsIGNvbXBhcmVUaW1lc3RhbXBzIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBTQVNqc0NvbmZpZywgVXBsb2FkRmlsZSwgTG9naW5NZWNoYW5pc20gfSBmcm9tICcuLi8uLi90eXBlcydcbmltcG9ydCB7IEF1dGhNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vYXV0aCdcbmltcG9ydCB7XG4gIFNlcnZlclR5cGUsXG4gIEF1dGhDb25maWcsXG4gIEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzXG59IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7IFJlcXVlc3RDbGllbnQgfSBmcm9tICcuLi8uLi9yZXF1ZXN0L1JlcXVlc3RDbGllbnQnXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuLi8uLi9qb2ItZXhlY3V0aW9uL0ZpbGVVcGxvYWRlcidcbmltcG9ydCB7IFdlYkpvYkV4ZWN1dG9yIH0gZnJvbSAnLi9XZWJKb2JFeGVjdXRvcidcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcy9lcnJvcnMvRXJyb3JSZXNwb25zZSdcbmltcG9ydCB7IExvZ2luT3B0aW9ucywgTG9naW5SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9Mb2dpbidcblxuY29uc3QgZGVmYXVsdENvbmZpZzogU0FTanNDb25maWcgPSB7XG4gIHNlcnZlclVybDogJycsXG4gIHBhdGhTQVNKUzogJy9TQVNqc0FwaS9zdHAvZXhlY3V0ZScsXG4gIHBhdGhTQVM5OiAnL1NBU1N0b3JlZFByb2Nlc3MvZG8nLFxuICBwYXRoU0FTVml5YTogJy9TQVNKb2JFeGVjdXRpb24nLFxuICBhcHBMb2M6ICcvUHVibGljL3NlZWRhcHAnLFxuICBzZXJ2ZXJUeXBlOiBTZXJ2ZXJUeXBlLlNhczksXG4gIGRlYnVnOiBmYWxzZSxcbiAgY29udGV4dE5hbWU6ICdTQVMgSm9iIEV4ZWN1dGlvbiBjb21wdXRlIGNvbnRleHQnLFxuICB1c2VDb21wdXRlQXBpOiBudWxsLFxuICBsb2dpbk1lY2hhbmlzbTogTG9naW5NZWNoYW5pc20uRGVmYXVsdFxufVxuXG4vKipcbiAqIFNBU2pzIGlzIGEgSmF2YVNjcmlwdCBhZGFwdGVyIGZvciBTQVMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTQVNqcyB7XG4gIHByaXZhdGUgc2FzanNDb25maWc6IFNBU2pzQ29uZmlnID0gbmV3IFNBU2pzQ29uZmlnKClcbiAgcHJpdmF0ZSBqb2JzUGF0aDogc3RyaW5nID0gJydcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IEZpbGVVcGxvYWRlciB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgYXV0aE1hbmFnZXI6IEF1dGhNYW5hZ2VyIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSByZXF1ZXN0Q2xpZW50OiBSZXF1ZXN0Q2xpZW50IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSB3ZWJKb2JFeGVjdXRvcjogV2ViSm9iRXhlY3V0b3IgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8U0FTanNDb25maWc+KSB7XG4gICAgdGhpcy5zYXNqc0NvbmZpZyA9IHtcbiAgICAgIC4uLmRlZmF1bHRDb25maWcsXG4gICAgICAuLi5jb25maWdcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwQ29uZmlndXJhdGlvbigpXG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbnRvIHRoZSBTQVMgc2VydmVyIHdpdGggdGhlIHN1cHBsaWVkIGNyZWRlbnRpYWxzLlxuICAgKiBAcGFyYW0gdXNlcm5hbWUgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXJuYW1lLlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0gY2xpZW50SWQgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNsaWVudCBJRC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2dJbihcbiAgICB1c2VybmFtZT86IHN0cmluZyxcbiAgICBwYXNzd29yZD86IHN0cmluZyxcbiAgICBjbGllbnRJZD86IHN0cmluZyxcbiAgICBvcHRpb25zOiBMb2dpbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPExvZ2luUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuc2FzanNDb25maWcubG9naW5NZWNoYW5pc20gPT09IExvZ2luTWVjaGFuaXNtLkRlZmF1bHQpIHtcbiAgICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0EgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IGxvZ2luIG1lY2hhbmlzbS4nXG4gICAgICAgIClcblxuICAgICAgcmV0dXJuIHRoaXMuYXV0aE1hbmFnZXIhLmxvZ0luKHVzZXJuYW1lLCBwYXNzd29yZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHJlZGlyZWN0ZWQgbG9naW4gbWVjaGFuaXNtIGlzIG9ubHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gdGhlIGJyb3dzZXIuJ1xuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmF1dGhNYW5hZ2VyIS5yZWRpcmVjdGVkTG9nSW4ob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIG91dCBvZiB0aGUgY29uZmlndXJlZCBTQVMgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGxvZ091dCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoTWFuYWdlciEubG9nT3V0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFNBU2pzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0U2FzanNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FzanNDb25maWdcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIFNBU2pzUmVxdWVzdFxuICAgKiBAcmV0dXJucyBTQVNqc1JlcXVlc3RbXVxuICAgKi9cbiAgcHVibGljIGdldFNhc1JlcXVlc3RzKCkge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gWy4uLnRoaXMucmVxdWVzdENsaWVudCEuZ2V0UmVxdWVzdHMoKV1cbiAgICBjb25zdCBzb3J0ZWRSZXF1ZXN0cyA9IHJlcXVlc3RzLnNvcnQoY29tcGFyZVRpbWVzdGFtcHMpXG4gICAgcmV0dXJuIHNvcnRlZFJlcXVlc3RzXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVidWcgc3RhdGUuIFR1cm5pbmcgdGhpcyBvbiB3aWxsIGVuYWJsZSBhZGRpdGlvbmFsIGxvZ2dpbmcgaW4gdGhlIGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIGJvb2xlYW4gaW5kaWNhdGluZyBkZWJ1ZyBzdGF0ZSAob24vb2ZmKS5cbiAgICovXG4gIHB1YmxpYyBzZXREZWJ1Z1N0YXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zYXNqc0NvbmZpZy5kZWJ1ZyA9IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBhIGZpbGUgdG8gdGhlIGdpdmVuIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBzYXNKb2IgLSB0aGUgcGF0aCB0byB0aGUgU0FTIHByb2dyYW0gKHVsdGltYXRlbHkgcmVzb2x2ZXMgdG9cbiAgICogIHRoZSBTQVMgYF9wcm9ncmFtYCBwYXJhbWV0ZXIgdG8gcnVuIGEgSm9iIERlZmluaXRpb24gb3IgU0FTIDkgU3RvcmVkXG4gICAqICBQcm9jZXNzKS4gSXMgcHJlcGVuZGVkIGF0IHJ1bnRpbWUgd2l0aCB0aGUgdmFsdWUgb2YgYGFwcExvY2AuXG4gICAqIEBwYXJhbSBmaWxlcyAtIGFycmF5IG9mIGZpbGVzIHRvIGJlIHVwbG9hZGVkLCBpbmNsdWRpbmcgRmlsZSBvYmplY3QgYW5kIGZpbGUgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIHJlcXVlc3QgVVJMIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBjb25maWcgLSBwcm92aWRlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb25maWcgaGVyZSwgZm9yIGluc3RhbmNlIHRvXG4gICAqIGVuYWJsZS9kaXNhYmxlIGBkZWJ1Z2AuIEFueSBjaGFuZ2UgcHJvdmlkZWQgd2lsbCBvdmVycmlkZSB0aGUgZ2xvYmFsIGNvbmZpZyxcbiAgICogZm9yIHRoYXQgcGFydGljdWxhciBmdW5jdGlvbiBjYWxsLlxuICAgKiBAcGFyYW0gbG9naW5SZXF1aXJlZENhbGxiYWNrIC0gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGVcbiAgICogdXNlciBpcyBub3QgbG9nZ2VkIGluIChlZyB0byBkaXNwbGF5IGEgbG9naW4gZm9ybSkuIFRoZSByZXF1ZXN0IHdpbGwgYmVcbiAgICogcmVzdWJtaXR0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBsb2dpbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGxvYWRGaWxlKFxuICAgIHNhc0pvYjogc3RyaW5nLFxuICAgIGZpbGVzOiBVcGxvYWRGaWxlW10sXG4gICAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBjb25maWc6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2s/OiAoKSA9PiBhbnlcbiAgKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zYXNqc0NvbmZpZyxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0geyBmaWxlcywgcGFyYW1zIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVVcGxvYWRlciEuZXhlY3V0ZShcbiAgICAgIHNhc0pvYixcbiAgICAgIGRhdGEsXG4gICAgICBjb25maWcsXG4gICAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2tcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSByZXF1ZXN0IHRvIHByb2dyYW0gc3BlY2lmaWVkIGluIGBTQVNqb2JgIChjb3VsZCBiZSBhIFZpeWEgSm9iLCBhXG4gICAqIFNBUyA5IFN0b3JlZCBQcm9jZXNzLCBvciBhIFNBU2pzIFNlcnZlciBTdG9yZWQgUHJvZ3JhbSkuIFRoZSByZXNwb25zZVxuICAgKiBvYmplY3Qgd2lsbCBhbHdheXMgY29udGFpbiB0YWJsZSBuYW1lcyBpbiBsb3dlcmNhc2UsIGFuZCBjb2x1bW4gbmFtZXMgaW5cbiAgICogdXBwZXJjYXNlLiBWYWx1ZXMgYXJlIHJldHVybmVkIGZvcm1hdHRlZCBieSBkZWZhdWx0LCB1bmZvcm1hdHRlZFxuICAgKiB2YWx1ZXMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgYW4gb3B0aW9uIGluIHRoZSBgJXdlYm91dGAgbWFjcm8uXG4gICAqXG4gICAqIEBwYXJhbSBzYXNKb2IgLSB0aGUgcGF0aCB0byB0aGUgU0FTIHByb2dyYW0gKHVsdGltYXRlbHkgcmVzb2x2ZXMgdG9cbiAgICogIHRoZSBTQVMgYF9wcm9ncmFtYCBwYXJhbWV0ZXIgdG8gcnVuIGEgSm9iIERlZmluaXRpb24gb3IgU0FTIDkgU3RvcmVkXG4gICAqICBQcm9jZXNzKS4gSXMgcHJlcGVuZGVkIGF0IHJ1bnRpbWUgd2l0aCB0aGUgdmFsdWUgb2YgYGFwcExvY2AuXG4gICAqIEBwYXJhbSBkYXRhIC0gYSBKU09OIG9iamVjdCBjb250YWluaW5nIG9uZSBvciBtb3JlIHRhYmxlcyB0byBiZSBzZW50IHRvXG4gICAqIFNBUy4gIEZvciBhbiBleGFtcGxlIG9mIHRoZSB0YWJsZSBzdHJ1Y3R1cmUsIHNlZSB0aGUgcHJvamVjdCBSRUFETUUuIFRoaXNcbiAgICogdmFsdWUgY2FuIGJlIGBudWxsYCBpZiBubyBpbnB1dHMgYXJlIHJlcXVpcmVkLlxuICAgKiBAcGFyYW0gY29uZmlnIC0gcHJvdmlkZSBhbnkgY2hhbmdlcyB0byB0aGUgY29uZmlnIGhlcmUsIGZvciBpbnN0YW5jZSB0b1xuICAgKiBlbmFibGUvZGlzYWJsZSBgZGVidWdgLiBBbnkgY2hhbmdlIHByb3ZpZGVkIHdpbGwgb3ZlcnJpZGUgdGhlIGdsb2JhbCBjb25maWcsXG4gICAqIGZvciB0aGF0IHBhcnRpY3VsYXIgZnVuY3Rpb24gY2FsbC5cbiAgICogQHBhcmFtIGxvZ2luUmVxdWlyZWRDYWxsYmFjayAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgaWYgdGhlXG4gICAqIHVzZXIgaXMgbm90IGxvZ2dlZCBpbiAoZWcgdG8gZGlzcGxheSBhIGxvZ2luIGZvcm0pLiBUaGUgcmVxdWVzdCB3aWxsIGJlXG4gICAqIHJlc3VibWl0dGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbG9naW4uXG4gICAqIFdoZW4gdXNpbmcgYSBgbG9naW5SZXF1aXJlZENhbGxiYWNrYCwgdGhlIGNhbGwgdG8gdGhlIHJlcXVlc3Qgd2lsbCBsb29rLCBmb3IgZXhhbXBsZSwgbGlrZSBzbzpcbiAgICogYGF3YWl0IHJlcXVlc3Qoc2FzSm9iUGF0aCwgZGF0YSwgY29uZmlnLCAoKSA9PiBzZXRJc0xvZ2dlZEluKGZhbHNlKSlgXG4gICAqIElmIHlvdSBhcmUgbm90IHBhc3NpbmcgaW4gYW55IGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24sIGl0IHdpbGwgbG9vayBsaWtlIHNvOlxuICAgKiBgYXdhaXQgcmVxdWVzdChzYXNKb2JQYXRoLCB7fSwge30sICgpID0+IHNldElzTG9nZ2VkSW4oZmFsc2UpKWBcbiAgICogQHBhcmFtIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzIC0gYSBhcnJheSBvZiBwcmVkZWZpbmVkIHZhbHVlcyB0aGF0IGFyZSB1c2VkXG4gICAqIHRvIHByb3ZpZGUgZXh0cmEgYXR0cmlidXRlcyAoc2FtZSBuYW1lcyBhcyB0aG9zZSB2YWx1ZXMpIHRvIGJlIGFkZGVkIGluIHJlc3BvbnNlXG4gICAqIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGRlY2xhcmVkIGluIEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdChcbiAgICBzYXNKb2I6IHN0cmluZyxcbiAgICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBjb25maWc6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2s/OiAoKSA9PiBhbnksXG4gICAgYXV0aENvbmZpZz86IEF1dGhDb25maWcsXG4gICAgZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXM6IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzW10gPSBbXVxuICApIHtcbiAgICBjb25maWcgPSB7XG4gICAgICAuLi50aGlzLnNhc2pzQ29uZmlnLFxuICAgICAgLi4uY29uZmlnXG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlSW5wdXQoZGF0YSlcblxuICAgIC8vIHN0YXR1cyBpcyB0cnVlIGlmIHRoZSBkYXRhIHBhc3NlcyB2YWxpZGF0aW9uIGNoZWNrcyBhYm92ZVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnN0YXR1cykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMud2ViSm9iRXhlY3V0b3IhLmV4ZWN1dGUoXG4gICAgICAgIHNhc0pvYixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2ssXG4gICAgICAgIGF1dGhDb25maWcsXG4gICAgICAgIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZSh2YWxpZGF0aW9uUmVzdWx0Lm1zZykpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgc2Vzc2lvbiBpcyBhY3RpdmUsIG9yIGxvZ2luIGlzIHJlcXVpcmVkLlxuICAgKiBAcmV0dXJucyAtIGEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHR3byB2YWx1ZXMgLSBhIGJvb2xlYW4gYGlzTG9nZ2VkSW5gLCBhbmQgYSBzdHJpbmcgYHVzZXJOYW1lYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja1Nlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aE1hbmFnZXIhLmNoZWNrU2Vzc2lvbigpXG4gIH1cblxuICBwcml2YXRlIHNldHVwQ29uZmlndXJhdGlvbigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCA9PT0gJydcbiAgICApIHtcbiAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCB1cmwgPSBgJHtsb2NhdGlvbi5wcm90b2NvbH0vLyR7bG9jYXRpb24uaG9zdG5hbWV9YFxuXG4gICAgICAgIGlmIChsb2NhdGlvbi5wb3J0KSB1cmwgPSBgJHt1cmx9OiR7bG9jYXRpb24ucG9ydH1gXG5cbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwgPSB1cmxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsID0gJydcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsID0gdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwuc2xpY2UoMCwgLTEpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnJlcXVlc3RDbGllbnQpIHtcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudCA9IG5ldyBSZXF1ZXN0Q2xpZW50KFxuICAgICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCxcbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy5odHRwc0FnZW50T3B0aW9ucyxcbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy5yZXF1ZXN0SGlzdG9yeUxpbWl0LFxuICAgICAgICB0aGlzLnNhc2pzQ29uZmlnLnZlcmJvc2VcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50LnNldENvbmZpZyhcbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwsXG4gICAgICAgIHRoaXMuc2FzanNDb25maWcuaHR0cHNBZ2VudE9wdGlvbnNcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmpvYnNQYXRoID0gdGhpcy5zYXNqc0NvbmZpZy5wYXRoU0FTOVxuXG4gICAgdGhpcy5hdXRoTWFuYWdlciA9IG5ldyBBdXRoTWFuYWdlcihcbiAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsLFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJUeXBlISxcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudCxcbiAgICAgIHRoaXMucmVzZW5kV2FpdGluZ1JlcXVlc3RzXG4gICAgKVxuXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwsXG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclR5cGUhLFxuICAgICAgdGhpcy5qb2JzUGF0aCxcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudFxuICAgIClcblxuICAgIHRoaXMud2ViSm9iRXhlY3V0b3IgPSBuZXcgV2ViSm9iRXhlY3V0b3IoXG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCxcbiAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVHlwZSEsXG4gICAgICB0aGlzLmpvYnNQYXRoLFxuICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSByZXNlbmRXYWl0aW5nUmVxdWVzdHMgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy53ZWJKb2JFeGVjdXRvcj8ucmVzZW5kV2FpdGluZ1JlcXVlc3RzKClcbiAgICBhd2FpdCB0aGlzLmZpbGVVcGxvYWRlcj8ucmVzZW5kV2FpdGluZ1JlcXVlc3RzKClcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQXV0aENvbmZpZyxcbiAgRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFNlcnZlclR5cGVcbn0gZnJvbSAnQHNhc2pzL3V0aWxzL3R5cGVzJ1xuaW1wb3J0IHtcbiAgRXJyb3JSZXNwb25zZSxcbiAgSm9iRXhlY3V0aW9uRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvclxufSBmcm9tICcuLi8uLi90eXBlcy9lcnJvcnMnXG5pbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHtcbiAgaXNSZWxhdGl2ZVBhdGgsXG4gIGFwcGVuZEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBjb252ZXJ0VG9DU1Zcbn0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBCYXNlSm9iRXhlY3V0b3IgfSBmcm9tICcuLi8uLi9qb2ItZXhlY3V0aW9uL0pvYkV4ZWN1dG9yJ1xuaW1wb3J0IHsgcGFyc2VXZWJvdXRSZXNwb25zZSB9IGZyb20gJy4uLy4uL3V0aWxzL3BhcnNlV2Vib3V0UmVzcG9uc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdGluZ1JlcXVzdFByb21pc2Uge1xuICBwcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsXG4gIHJlc29sdmU6IGFueVxuICByZWplY3Q6IGFueVxufVxuZXhwb3J0IGNsYXNzIFdlYkpvYkV4ZWN1dG9yIGV4dGVuZHMgQmFzZUpvYkV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2VydmVyVXJsOiBzdHJpbmcsXG4gICAgc2VydmVyVHlwZTogU2VydmVyVHlwZSxcbiAgICBwcml2YXRlIGpvYnNQYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZXF1ZXN0Q2xpZW50OiBSZXF1ZXN0Q2xpZW50XG4gICkge1xuICAgIHN1cGVyKHNlcnZlclVybCwgc2VydmVyVHlwZSlcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoXG4gICAgc2FzSm9iOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIGxvZ2luUmVxdWlyZWRDYWxsYmFjaz86IGFueSxcbiAgICBhdXRoQ29uZmlnPzogQXV0aENvbmZpZyxcbiAgICBleHRyYVJlc3BvbnNlQXR0cmlidXRlczogRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXNbXSA9IFtdXG4gICkge1xuICAgIGNvbnN0IGxvZ2luQ2FsbGJhY2sgPSBsb2dpblJlcXVpcmVkQ2FsbGJhY2tcbiAgICBjb25zdCBwcm9ncmFtID0gaXNSZWxhdGl2ZVBhdGgoc2FzSm9iKVxuICAgICAgPyBjb25maWcuYXBwTG9jXG4gICAgICAgID8gY29uZmlnLmFwcExvYy5yZXBsYWNlKC9cXC8/JC8sICcvJykgKyBzYXNKb2IucmVwbGFjZSgvXlxcLy8sICcnKVxuICAgICAgICA6IHNhc0pvYlxuICAgICAgOiBzYXNKb2JcbiAgICBsZXQgYXBpVXJsID0gYCR7Y29uZmlnLnNlcnZlclVybH0ke3RoaXMuam9ic1BhdGh9Lz8keydfcHJvZ3JhbT0nICsgcHJvZ3JhbX1gXG5cbiAgICBsZXQgcmVxdWVzdFBhcmFtcyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0UmVxdWVzdFBhcmFtcyhjb25maWcpXG4gICAgfVxuXG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcblxuICAgIGlmIChkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3JtRGF0YSA9IGdlbmVyYXRlRmlsZVVwbG9hZEZvcm0oZm9ybURhdGEsIGRhdGEpXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKGU/Lm1lc3NhZ2UsIGUpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHJlcXVlc3RQYXJhbXMpIHtcbiAgICAgIGlmIChyZXF1ZXN0UGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgcmVxdWVzdFBhcmFtc1trZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50IS5wb3N0KGFwaVVybCwgZm9ybURhdGEsIGF1dGhDb25maWc/LmFjY2Vzc190b2tlbilcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50IS5hcHBlbmRSZXF1ZXN0KHJlcywgc2FzSm9iLCBjb25maWcuZGVidWcpXG5cbiAgICAgICAgICBjb25zdCBqc29uUmVzcG9uc2UgPVxuICAgICAgICAgICAgY29uZmlnLmRlYnVnICYmIHR5cGVvZiByZXMucmVzdWx0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IHBhcnNlV2Vib3V0UmVzcG9uc2UocmVzLnJlc3VsdCwgYXBpVXJsKVxuICAgICAgICAgICAgICA6IHJlcy5yZXN1bHRcblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gYXBwZW5kRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMoXG4gICAgICAgICAgICB7IHJlc3VsdDoganNvblJlc3BvbnNlLCBsb2c6IHJlcy5sb2cgfSxcbiAgICAgICAgICAgIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzXG4gICAgICAgICAgKVxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2VPYmplY3QpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChhc3luYyAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEpvYkV4ZWN1dGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RDbGllbnQhLmFwcGVuZFJlcXVlc3QoZSwgc2FzSm9iLCBjb25maWcuZGVidWcpXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yUmVzcG9uc2UoZT8ubWVzc2FnZSwgZSkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghbG9naW5SZXF1aXJlZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3JSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgICdSZXF1ZXN0IGlzIG5vdCBhdXRoZW50aWNhdGVkLiBNYWtlIHN1cmUgLmVudiBmaWxlIGV4aXN0cyB3aXRoIHZhbGlkIGNyZWRlbnRpYWxzLicsXG4gICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kV2FpdGluZ1JlcXVlc3QoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgICAgICAgICAgIHNhc0pvYixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgYXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgICBleHRyYVJlc3BvbnNlQXR0cmlidXRlc1xuICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChsb2dpbkNhbGxiYWNrKSBhd2FpdCBsb2dpbkNhbGxiYWNrKClcbiAgICAgICAgICB9IGVsc2UgcmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKGU/Lm1lc3NhZ2UsIGUpKVxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVxdWVzdFByb21pc2VcbiAgfVxufVxuXG4vKipcbiAqIE9uZSBvZiB0aGUgYXBwcm9hY2hlcyBTQVNqcyB0YWtlcyB0byBzZW5kIHRhYmxlcy1mb3JtYXR0ZWQgSlNPTiAoc2VlIFJFQURNRSlcbiAqIHRvIFNBUyBpcyBhcyBtdWx0aXBhcnQgZm9ybSBkYXRhLCB3aGVyZSBlYWNoIHRhYmxlIGlzIHByb3ZpZGVkIGFzIGEgc3BlY2lhbGx5XG4gKiBmb3JtYXR0ZWQgQ1NWIGZpbGUuXG4gKi9cbmNvbnN0IGdlbmVyYXRlRmlsZVVwbG9hZEZvcm0gPSAoZm9ybURhdGE6IEZvcm1EYXRhLCBkYXRhOiBhbnkpOiBGb3JtRGF0YSA9PiB7XG4gIGZvciAoY29uc3QgdGFibGVOYW1lIGluIGRhdGEpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YVt0YWJsZU5hbWVdKSkgY29udGludWVcblxuICAgIGNvbnN0IG5hbWUgPSB0YWJsZU5hbWVcbiAgICBjb25zdCBjc3YgPSBjb252ZXJ0VG9DU1YoZGF0YSwgdGFibGVOYW1lKVxuXG4gICAgaWYgKGNzdiA9PT0gJ0VSUk9SOiBMQVJHRSBTVFJJTkcgTEVOR1RIJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIG1heCBsZW5ndGggb2YgYSBzdHJpbmcgdmFsdWUgaW4gU0FTanMgaXMgMzI3NjUgY2hhcmFjdGVycy4nXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtjc3ZdLCB7XG4gICAgICB0eXBlOiAnYXBwbGljYXRpb24vY3N2J1xuICAgIH0pXG5cbiAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgZmlsZSwgYCR7bmFtZX0uY3N2YClcbiAgfVxuXG4gIHJldHVybiBmb3JtRGF0YVxufVxuIiwiaW1wb3J0IFNBU2pzIGZyb20gJy4vU0FTanMnXG5leHBvcnQgKiBmcm9tICcuLi8uLi90eXBlcydcbmV4cG9ydCBkZWZhdWx0IFNBU2pzXG4iLCJpbXBvcnQge1xuICBBeGlvc0Vycm9yLFxuICBBeGlvc0luc3RhbmNlLFxuICBBeGlvc1JlcXVlc3RDb25maWcsXG4gIEF4aW9zUmVxdWVzdEhlYWRlcnMsXG4gIEF4aW9zUmVzcG9uc2Vcbn0gZnJvbSAnYXhpb3MnXG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcydcbmltcG9ydCB7IENzcmZUb2tlbiB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgaXNBdXRob3JpemVGb3JtUmVxdWlyZWQsIGlzTG9nSW5SZXF1aXJlZCB9IGZyb20gJy4uL2F1dGgnXG5pbXBvcnQge1xuICBBdXRob3JpemVFcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBJbnRlcm5hbFNlcnZlckVycm9yLFxuICBKb2JFeGVjdXRpb25FcnJvcixcbiAgQ2VydGlmaWNhdGVFcnJvclxufSBmcm9tICcuLi90eXBlcy9lcnJvcnMnXG5pbXBvcnQgeyBTQVNqc1JlcXVlc3QsIEh0dHBDbGllbnQsIFZlcmJvc2VNb2RlIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBwYXJzZVdlYm91dFJlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMvcGFyc2VXZWJvdXRSZXNwb25zZSdcbmltcG9ydCB7IHByZWZpeE1lc3NhZ2UgfSBmcm9tICdAc2FzanMvdXRpbHMvZXJyb3InXG5pbXBvcnQgeyBTQVM5QXV0aEVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzL1NBUzlBdXRoRXJyb3InXG5pbXBvcnQge1xuICBwYXJzZUdlbmVyYXRlZENvZGUsXG4gIHBhcnNlU291cmNlQ29kZSxcbiAgY3JlYXRlQXhpb3NJbnN0YW5jZVxufSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IEludmFsaWRTQVNqc0NzcmZFcnJvciB9IGZyb20gJy4uL3R5cGVzL2Vycm9ycy9JbnZhbGlkU0FTanNDc3JmRXJyb3InXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCdcblxuY29uc3QgZ2V0TG9nZ2VyID0gKCkgPT5cbiAgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmxvZ2dlcikgfHwgY29uc29sZVxuXG5leHBvcnQgY2xhc3MgUmVxdWVzdENsaWVudCBpbXBsZW1lbnRzIEh0dHBDbGllbnQge1xuICBwcml2YXRlIHJlcXVlc3RzOiBTQVNqc1JlcXVlc3RbXSA9IFtdXG4gIHByaXZhdGUgcmVxdWVzdHNMaW1pdDogbnVtYmVyID0gMTBcbiAgcHJpdmF0ZSBodHRwSW50ZXJjZXB0b3I/OiBudW1iZXJcbiAgcHJpdmF0ZSB2ZXJib3NlTW9kZTogVmVyYm9zZU1vZGUgPSBmYWxzZVxuXG4gIHByb3RlY3RlZCBjc3JmVG9rZW46IENzcmZUb2tlbiA9IHsgaGVhZGVyTmFtZTogJycsIHZhbHVlOiAnJyB9XG4gIHByb3RlY3RlZCBmaWxlVXBsb2FkQ3NyZlRva2VuOiBDc3JmVG9rZW4gfCB1bmRlZmluZWRcbiAgcHJvdGVjdGVkIGh0dHBDbGllbnQhOiBBeGlvc0luc3RhbmNlXG4gIHByaXZhdGUgaXNSZWNvdmVyaW5nRnJvbU5ldHdvcmtFcnJvciA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGJhc2VVcmw6IHN0cmluZyxcbiAgICBodHRwc0FnZW50T3B0aW9ucz86IGh0dHBzLkFnZW50T3B0aW9ucyxcbiAgICByZXF1ZXN0c0xpbWl0PzogbnVtYmVyLFxuICAgIHZlcmJvc2VNb2RlPzogVmVyYm9zZU1vZGVcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVIdHRwQ2xpZW50KGJhc2VVcmwsIGh0dHBzQWdlbnRPcHRpb25zKVxuXG4gICAgaWYgKHJlcXVlc3RzTGltaXQpIHRoaXMucmVxdWVzdHNMaW1pdCA9IHJlcXVlc3RzTGltaXRcblxuICAgIGlmICh2ZXJib3NlTW9kZSkge1xuICAgICAgdGhpcy5zZXRWZXJib3NlTW9kZSh2ZXJib3NlTW9kZSlcbiAgICAgIHRoaXMuZW5hYmxlVmVyYm9zZU1vZGUoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoYmFzZVVybDogc3RyaW5nLCBodHRwc0FnZW50T3B0aW9ucz86IGh0dHBzLkFnZW50T3B0aW9ucykge1xuICAgIHRoaXMuY3JlYXRlSHR0cENsaWVudChiYXNlVXJsLCBodHRwc0FnZW50T3B0aW9ucylcbiAgfVxuXG4gIHB1YmxpYyBzYXZlTG9jYWxTdG9yYWdlVG9rZW4oYWNjZXNzVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXNzVG9rZW4nLCBhY2Nlc3NUb2tlbilcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVmcmVzaFRva2VuJywgcmVmcmVzaFRva2VuKVxuICB9XG5cbiAgcHVibGljIGdldENzcmZUb2tlbih0eXBlOiAnZ2VuZXJhbCcgfCAnZmlsZScgPSAnZ2VuZXJhbCcpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ2ZpbGUnID8gdGhpcy5maWxlVXBsb2FkQ3NyZlRva2VuIDogdGhpcy5jc3JmVG9rZW5cbiAgfVxuXG4gIHB1YmxpYyBjbGVhckNzcmZUb2tlbnMoKSB7XG4gICAgdGhpcy5jc3JmVG9rZW4gPSB7IGhlYWRlck5hbWU6ICcnLCB2YWx1ZTogJycgfVxuICAgIHRoaXMuZmlsZVVwbG9hZENzcmZUb2tlbiA9IHsgaGVhZGVyTmFtZTogJycsIHZhbHVlOiAnJyB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMb2NhbFN0b3JhZ2VUb2tlbnMoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FjY2Vzc1Rva2VuJywgJycpXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZnJlc2hUb2tlbicsICcnKVxuICB9XG5cbiAgcHVibGljIHJlc2V0SW5NZW1vcnlBdXRoU3RhdGUoKSB7XG4gICAgdGhpcy5jbGVhckNzcmZUb2tlbnMoKVxuICAgIGlmICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jbGVhckxvY2FsU3RvcmFnZVRva2VucygpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNsZWFyQWxsQ29va2llcygpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpXG4gICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgY29uc3QgbmFtZSA9IGNvb2tpZS5zcGxpdCgnPScpWzBdLnRyaW0oKVxuICAgICAgaWYgKCFuYW1lKSBjb250aW51ZVxuICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7bmFtZX09OyBNYXgtQWdlPTA7IFBhdGg9LztgXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEJhc2VVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWZhdWx0cy5iYXNlVVJMIHx8ICcnXG4gIH1cblxuICAvKipcbiAgICogdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgcmVxdWVzdHMsIGFuIGFycmF5IG9mIFNBU2pzUmVxdWVzdCB0eXBlXG4gICAqIEByZXR1cm5zIFNBU2pzUmVxdWVzdFtdXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxdWVzdHMgPSAoKSA9PiB0aGlzLnJlcXVlc3RzXG5cbiAgLyoqXG4gICAqIHRoaXMgbWV0aG9kIGNsZWFycyB0aGUgcmVxdWVzdHMgYXJyYXksIGkuZSBzZXQgdG8gZW1wdHlcbiAgICovXG4gIHB1YmxpYyBjbGVhclJlcXVlc3RzID0gKCkgPT4ge1xuICAgIHRoaXMucmVxdWVzdHMgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgbWV0aG9kIGFwcGVuZHMgdGhlIHJlc3BvbnNlIGZyb20gc2FzanMgcmVxdWVzdCB0byByZXF1ZXN0cyBhcnJheVxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSByZXNwb25zZSBmcm9tIHNhc2pzIHJlcXVlc3RcbiAgICogQHBhcmFtIHByb2dyYW0gLSBuYW1lIG9mIHByb2dyYW1cbiAgICogQHBhcmFtIGRlYnVnIC0gYSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZGVidWcgd2FzIGVuYWJsZWQgb3Igbm90XG4gICAqL1xuICBwdWJsaWMgYXBwZW5kUmVxdWVzdChyZXNwb25zZTogYW55LCBwcm9ncmFtOiBzdHJpbmcsIGRlYnVnOiBib29sZWFuKSB7XG4gICAgbGV0IHNvdXJjZUNvZGUgPSAnJ1xuICAgIGxldCBnZW5lcmF0ZWRDb2RlID0gJydcbiAgICBsZXQgc2FzV29yayA9IG51bGxcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgaWYgKHJlc3BvbnNlPy5sb2cpIHtcbiAgICAgICAgc291cmNlQ29kZSA9IHBhcnNlU291cmNlQ29kZShyZXNwb25zZS5sb2cpXG4gICAgICAgIGdlbmVyYXRlZENvZGUgPSBwYXJzZUdlbmVyYXRlZENvZGUocmVzcG9uc2UubG9nKVxuXG4gICAgICAgIGlmIChyZXNwb25zZT8ucmVzdWx0KSB7XG4gICAgICAgICAgc2FzV29yayA9IHJlc3BvbnNlLnJlc3VsdC5XT1JLXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FzV29yayA9IHJlc3BvbnNlLmxvZ1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlPy5yZXN1bHQpIHtcbiAgICAgICAgLy8gV2UgcGFyc2Ugb25seSBpZiBpdCdzIGEgc3RyaW5nLCBvdGhlcndpc2UgaXQgd291bGQgdGhyb3cgZXJyb3JcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5yZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc291cmNlQ29kZSA9IHBhcnNlU291cmNlQ29kZShyZXNwb25zZS5yZXN1bHQpXG4gICAgICAgICAgZ2VuZXJhdGVkQ29kZSA9IHBhcnNlR2VuZXJhdGVkQ29kZShyZXNwb25zZS5yZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICBzYXNXb3JrID0gcmVzcG9uc2UucmVzdWx0LldPUktcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdHJpbmdpZmllZFJlc3VsdCA9XG4gICAgICB0eXBlb2YgcmVzcG9uc2U/LnJlc3VsdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyByZXNwb25zZT8ucmVzdWx0XG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2U/LnJlc3VsdCwgbnVsbCwgMilcblxuICAgIHRoaXMucmVxdWVzdHMucHVzaCh7XG4gICAgICBsb2dGaWxlOiByZXNwb25zZT8ubG9nIHx8IHN0cmluZ2lmaWVkUmVzdWx0IHx8IHJlc3BvbnNlLFxuICAgICAgc2VydmljZUxpbms6IHByb2dyYW0sXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBzb3VyY2VDb2RlLFxuICAgICAgZ2VuZXJhdGVkQ29kZSxcbiAgICAgIFNBU1dPUks6IHNhc1dvcmtcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdHMubGVuZ3RoID4gdGhpcy5yZXF1ZXN0c0xpbWl0KSB7XG4gICAgICB0aGlzLnJlcXVlc3RzLnNwbGljZSgwLCAxKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogc3RyaW5nID0gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIG92ZXJyaWRlSGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSA9IHt9LFxuICAgIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nOyBzdGF0dXM6IG51bWJlciB9PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0SGVhZGVycyhhY2Nlc3NUb2tlbiwgY29udGVudFR5cGUpLFxuICAgICAgLi4ub3ZlcnJpZGVIZWFkZXJzXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZzogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHJlc3BvbnNlVHlwZTogY29udGVudFR5cGUgPT09ICd0ZXh0L3BsYWluJyA/ICd0ZXh0JyA6ICdqc29uJyxcbiAgICAgIHdpdGhYU1JGVG9rZW46IHRydWVcbiAgICB9XG5cbiAgICBpZiAoY29udGVudFR5cGUgPT09ICd0ZXh0L3BsYWluJykge1xuICAgICAgcmVxdWVzdENvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5nZXQ8VD4odXJsLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRocm93SWZFcnJvcihyZXNwb25zZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZ2V0PFQ+KHVybCwgYWNjZXNzVG9rZW4sIGNvbnRlbnRUeXBlLCBvdmVycmlkZUhlYWRlcnMpLmNhdGNoKFxuICAgICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICdFcnJvciB3aGlsZSBleGVjdXRpbmcgaGFuZGxlIGVycm9yIGNhbGxiYWNrLiAnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIGRlYnVnXG4gICAgICAgIClcbiAgICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGNvbnRlbnRUeXBlICBOZXdlciB2ZXJzaW9uIG9mIEF4aW9zIGlzIG1vcmUgc3RyaWN0IHNvIGlmIHlvdSBkb24ndFxuICAgKiBzZXQgdGhlIGNvbnRlbnRUeXBlIHRvIGBmb3JtIGRhdGFgIHdoaWxlIHNlbmRpbmcgYSBGb3JtRGF0YSBvYmplY3RcbiAgICogYXBwbGljYXRpb24vanNvbiB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdCwgYXhpb3Mgd29u4oCZdCB0cmVhdCBpdCBhcyBGb3JtRGF0YS5cbiAgICogSW5zdGVhZCwgaXQgc2VyaWFsaXplcyBkYXRhIGFzIEpTT07igJRyZXN1bHRpbmcgaW4gYSBwYXlsb2FkIGxpa2VcbiAgICoge1wic29tZXRhYmxlXCI6e319IGFuZCB3ZSBsb3NlIHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhIGZvcm1hdHRpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBvdmVycmlkZUhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fSxcbiAgICBhZGRpdGlvbmFsU2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fVxuICApOiBQcm9taXNlPHsgcmVzdWx0OiBUOyBldGFnOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoYWNjZXNzVG9rZW4sIGNvbnRlbnRUeXBlKSxcbiAgICAgIC4uLm92ZXJyaWRlSGVhZGVyc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5wb3N0PFQ+KHVybCwgZGF0YSwge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB3aXRoWFNSRlRva2VuOiB0cnVlLFxuICAgICAgICAuLi5hZGRpdGlvbmFsU2V0dGluZ3NcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhyb3dJZkVycm9yKHJlc3BvbnNlKVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IoZSwgKCkgPT5cbiAgICAgICAgICB0aGlzLnBvc3Q8VD4odXJsLCBkYXRhLCBhY2Nlc3NUb2tlbiwgY29udGVudFR5cGUsIG92ZXJyaWRlSGVhZGVycylcbiAgICAgICAgKVxuICAgICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3ZlcnJpZGVIZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge31cbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgLi4udGhpcy5nZXRIZWFkZXJzKGFjY2Vzc1Rva2VuLCAnYXBwbGljYXRpb24vanNvbicpLFxuICAgICAgLi4ub3ZlcnJpZGVIZWFkZXJzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnB1dDxUPih1cmwsIGRhdGEsIHsgaGVhZGVycywgd2l0aFhTUkZUb2tlbjogdHJ1ZSB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRocm93SWZFcnJvcihyZXNwb25zZSlcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihyZXNwb25zZSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihlLCAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0PFQ+KHVybCwgZGF0YSwgYWNjZXNzVG9rZW4sIG92ZXJyaWRlSGVhZGVycylcbiAgICAgICAgKVxuICAgICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGU8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKGFjY2Vzc1Rva2VuLCAnYXBwbGljYXRpb24vanNvbicpXG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZGVsZXRlPFQ+KHVybCwgeyBoZWFkZXJzLCB3aXRoWFNSRlRva2VuOiB0cnVlIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhyb3dJZkVycm9yKHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKGUsICgpID0+IHRoaXMuZGVsZXRlPFQ+KHVybCwgYWNjZXNzVG9rZW4pKVxuICAgICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYXRjaDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkYXRhOiBhbnkgPSB7fSxcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyxcbiAgICBvdmVycmlkZUhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fVxuICApOiBQcm9taXNlPHsgcmVzdWx0OiBUOyBldGFnOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoYWNjZXNzVG9rZW4sICdhcHBsaWNhdGlvbi9qc29uJyksXG4gICAgICAuLi5vdmVycmlkZUhlYWRlcnNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucGF0Y2g8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMsIHdpdGhYU1JGVG9rZW46IHRydWUgfSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aHJvd0lmRXJyb3IocmVzcG9uc2UpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IoZSwgKCkgPT5cbiAgICAgICAgICB0aGlzLnBhdGNoPFQ+KHVybCwgZGF0YSwgYWNjZXNzVG9rZW4pXG4gICAgICAgIClcbiAgICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBsb2FkRmlsZShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKGFjY2Vzc1Rva2VuLCAnYXBwbGljYXRpb24vanNvbicpXG5cbiAgICBpZiAodGhpcy5maWxlVXBsb2FkQ3NyZlRva2VuPy52YWx1ZSkge1xuICAgICAgaGVhZGVyc1t0aGlzLmZpbGVVcGxvYWRDc3JmVG9rZW4uaGVhZGVyTmFtZV0gPVxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRDc3JmVG9rZW4udmFsdWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQucG9zdCh1cmwsIGNvbnRlbnQsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogKHJlcXVlc3RCb2R5KSA9PiByZXF1ZXN0Qm9keVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiByZXNwb25zZS5kYXRhLFxuICAgICAgICBldGFnOiByZXNwb25zZS5oZWFkZXJzWydldGFnJ10gYXMgc3RyaW5nXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGUucmVzcG9uc2UgYXMgQXhpb3NSZXNwb25zZVxuICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fCByZXNwb25zZT8uc3RhdHVzID09PSA0NDkpIHtcbiAgICAgICAgdGhpcy5wYXJzZUFuZFNldEZpbGVVcGxvYWRDc3JmVG9rZW4ocmVzcG9uc2UpXG5cbiAgICAgICAgaWYgKHRoaXMuZmlsZVVwbG9hZENzcmZUb2tlbikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGUodXJsLCBjb250ZW50LCBhY2Nlc3NUb2tlbilcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGF1dGhvcml6ZSA9IGFzeW5jIChyZXNwb25zZTogc3RyaW5nKSA9PiB7XG4gICAgbGV0IGF1dGhVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fVxuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2Uuc3BsaXQoJzxib2R5PicpWzFdLnNwbGl0KCc8L2JvZHk+JylbMF1cbiAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgYm9keUVsZW1lbnQuaW5uZXJIVE1MID0gcmVzcG9uc2VCb2R5XG5cbiAgICBjb25zdCBmb3JtID0gYm9keUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2FwcGxpY2F0aW9uX2F1dGhvcml6YXRpb24nKVxuICAgIGF1dGhVcmwgPSBmb3JtID8gdGhpcy5iYXNlVXJsICsgZm9ybS5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpIDogbnVsbFxuXG4gICAgY29uc3QgaW5wdXRzOiBhbnkgPSBmb3JtPy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpXG5cbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgaWYgKGlucHV0Lm5hbWUgPT09ICd1c2VyX29hdXRoX2FwcHJvdmFsJykge1xuICAgICAgICBpbnB1dC52YWx1ZSA9ICd0cnVlJ1xuICAgICAgfVxuXG4gICAgICBwYXJhbXNbaW5wdXQubmFtZV0gPSBpbnB1dC52YWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IGNzcmZUb2tlbktleSA9IE9iamVjdC5rZXlzKHBhcmFtcykuZmluZCgoaykgPT5cbiAgICAgIGs/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NzcmYnKVxuICAgIClcblxuICAgIGlmIChjc3JmVG9rZW5LZXkpIHtcbiAgICAgIHRoaXMuY3NyZlRva2VuLnZhbHVlID0gcGFyYW1zW2NzcmZUb2tlbktleV1cbiAgICAgIHRoaXMuY3NyZlRva2VuLmhlYWRlck5hbWUgPSB0aGlzLmNzcmZUb2tlbi5oZWFkZXJOYW1lIHx8ICd4LWNzcmYtdG9rZW4nXG4gICAgfVxuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zKSB7XG4gICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgcGFyYW1zW2tleV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFhdXRoVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGggRm9ybSBVUkwgaXMgbnVsbCBvciB1bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5odHRwQ2xpZW50XG4gICAgICAucG9zdChhdXRoVXJsLCBmb3JtRGF0YSwge1xuICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICcqLyonLCAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIH1cbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKClcbiAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbG9ycyB0byB0aGUgc3RyaW5nLlxuICAgKiBJZiB2ZXJib3NlTW9kZSBpcyBzZXQgdG8gJ2JsZWFjaGVkJywgY29sb3JzIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKiBAcGFyYW0gc3RyIC0gc3RyaW5nIHRvIGJlIHByZXR0aWZpZWQuXG4gICAqIEByZXR1cm5zIC0gcHJldHRpZmllZCBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgcHJldHRpZnlTdHJpbmcgPSAoc3RyOiBhbnkpID0+XG4gICAgaW5zcGVjdChzdHIsIHsgY29sb3JzOiB0aGlzLnZlcmJvc2VNb2RlICE9PSAnYmxlYWNoZWQnIH0pXG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlIGJvZHkuXG4gICAqIEBwYXJhbSBib2R5IC0gSFRUUCByZXF1ZXN0L3Jlc3BvbnNlIGJvZHkuXG4gICAqIEByZXR1cm5zIC0gZm9ybWF0dGVkIHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VJbnRlcmNlcHRlZEJvZHkgPSAoYm9keTogYW55KSA9PiB7XG4gICAgaWYgKCFib2R5KSByZXR1cm4gJydcblxuICAgIGxldCBwYXJzZWRCb2R5XG5cbiAgICAvLyBUcmllcyB0byBwYXJzZSBib2R5IGludG8gSlNPTiBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkQm9keSA9IEpTT04ucGFyc2UoYm9keSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHBhcnNlZEJvZHkgPSBib2R5XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZEJvZHkgPSBib2R5XG4gICAgfVxuXG4gICAgY29uc3QgYm9keUxpbmVzID0gdGhpcy5wcmV0dGlmeVN0cmluZyhwYXJzZWRCb2R5KS5zcGxpdCgnXFxuJylcblxuICAgIC8vIExlYXZlcyBmaXJzdCA1MCBsaW5lc1xuICAgIGlmIChib2R5TGluZXMubGVuZ3RoID4gNTEpIHtcbiAgICAgIGJvZHlMaW5lcy5zcGxpY2UoNTApXG4gICAgICBib2R5TGluZXMucHVzaCgnLi4uJylcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keUxpbmVzLmpvaW4oJ1xcbicpXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF4aW9zUmVzcG9uc2UgPSAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB7IHN0YXR1cywgY29uZmlnLCByZXF1ZXN0LCBkYXRhIH0gPSByZXNwb25zZVxuXG4gICAgY29uc3QgcmVxSGVhZGVycyA9IHJlcXVlc3Q/Ll9oZWFkZXIgPz8gJ05vdCBwcm92aWRlZFxcbidcbiAgICBjb25zdCByYXdIZWFkZXJzID0gcmVxdWVzdD8ucmVzPy5yYXdIZWFkZXJzID8/IFsnTm90IHByb3ZpZGVkJ11cblxuICAgIGNvbnN0IHJlc0hlYWRlcnMgPSB0aGlzLmZvcm1hdEhlYWRlcnMocmF3SGVhZGVycylcbiAgICBjb25zdCBwYXJzZWRSZXNCb2R5ID0gdGhpcy5wYXJzZUludGVyY2VwdGVkQm9keShkYXRhKVxuXG4gICAgcHJvY2Vzcy5sb2dnZXI/LmluZm8oYEhUVFAgUmVxdWVzdCAoZmlyc3QgNTAgbGluZXMpOlxuJHtyZXFIZWFkZXJzfSR7dGhpcy5wYXJzZUludGVyY2VwdGVkQm9keShjb25maWcuZGF0YSl9XG5cbkhUVFAgUmVzcG9uc2UgQ29kZTogJHt0aGlzLnByZXR0aWZ5U3RyaW5nKHN0YXR1cyl9XG5cbkhUVFAgUmVzcG9uc2UgKGZpcnN0IDUwIGxpbmVzKTpcbiR7cmVzSGVhZGVyc30ke3BhcnNlZFJlc0JvZHkgPyBgXFxuXFxuJHtwYXJzZWRSZXNCb2R5fWAgOiAnJ31cbmApXG5cbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXhpb3NFcnJvciA9IChlcnJvcjogQXhpb3NFcnJvcikgPT4ge1xuICAgIC8vIE1lc3NhZ2UgaW5kaWNhdGluZyBhYnNlbnQgdmFsdWUuXG4gICAgY29uc3Qgbm9WYWx1ZU1lc3NhZ2UgPSAnTm90IHByb3ZpZGVkJ1xuICAgIGNvbnN0IHsgcmVzcG9uc2UsIHJlcXVlc3QsIGNvbmZpZyB9ID0gZXJyb3JcblxuICAgIC8vIEZhbGxiYWNrIHJlcXVlc3Qgb2JqZWN0IHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIHRvIGZvcm0gcmVxdWVzdCBzdW1tYXJ5LlxuICAgIC8vIF9oZWFkZXIgaXMgbm90IHByZXNlbnQgaW4gcmVzcG9uc2VzIHdpdGggc3RhdHVzIDEqKlxuICAgIC8vIHJhd0hlYWRlcnMgYXJlIG5vdCBwcmVzZW50IGluIHJlc3BvbnNlcyB3aXRoIHN0YXR1cyAxKipcbiAgICBsZXQgZmFsbGJhY2tSZXF1ZXN0ID0ge1xuICAgICAgX2hlYWRlcjogYCR7bm9WYWx1ZU1lc3NhZ2V9XFxuYCxcbiAgICAgIHJlczogeyByYXdIZWFkZXJzOiBbbm9WYWx1ZU1lc3NhZ2VdIH1cbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdCkge1xuICAgICAgZmFsbGJhY2tSZXF1ZXN0ID0ge1xuICAgICAgICBfaGVhZGVyOlxuICAgICAgICAgIHJlcXVlc3QuX2hlYWRlciA/PyByZXF1ZXN0Ll9jdXJyZW50UmVxdWVzdD8uX2hlYWRlciA/PyBub1ZhbHVlTWVzc2FnZSxcbiAgICAgICAgcmVzOiB7IHJhd0hlYWRlcnM6IHJlcXVlc3QucmVzPy5yYXdIZWFkZXJzID8/IFtub1ZhbHVlTWVzc2FnZV0gfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHJlc3BvbnNlIG9iamVjdCB0aGF0IGNhbiBiZSBzYWZlbHkgdXNlZCB0byBmb3JtIHJlc3BvbnNlIHN1bW1hcnkuXG4gICAgbGV0IGZhbGxiYWNrUmVzcG9uc2UgPSByZXNwb25zZSB8fCB7XG4gICAgICBzdGF0dXM6IG5vVmFsdWVNZXNzYWdlLFxuICAgICAgcmVxdWVzdDogZmFsbGJhY2tSZXF1ZXN0LFxuICAgICAgY29uZmlnOiBjb25maWcgfHwge1xuICAgICAgICBkYXRhOiBub1ZhbHVlTWVzc2FnZSxcbiAgICAgICAgaGVhZGVyczoge30gYXMgQXhpb3NSZXF1ZXN0SGVhZGVyc1xuICAgICAgfSxcbiAgICAgIGRhdGE6IG5vVmFsdWVNZXNzYWdlXG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGF0dXMsIHJlcXVlc3Q6IHJlcSwgZGF0YTogcmVzRGF0YSB9ID0gZmFsbGJhY2tSZXNwb25zZVxuICAgIGNvbnN0IHsgX2hlYWRlcjogcmVxSGVhZGVycywgcmVzIH0gPSByZXFcblxuICAgIGNvbnN0IHJlc0hlYWRlcnMgPSB0aGlzLmZvcm1hdEhlYWRlcnMocmVzLnJhd0hlYWRlcnMpXG4gICAgY29uc3QgcGFyc2VkUmVzQm9keSA9IHRoaXMucGFyc2VJbnRlcmNlcHRlZEJvZHkocmVzRGF0YSlcblxuICAgIHByb2Nlc3MubG9nZ2VyPy5pbmZvKGBIVFRQIFJlcXVlc3QgKGZpcnN0IDUwIGxpbmVzKTpcbiR7cmVxSGVhZGVyc30ke3RoaXMucGFyc2VJbnRlcmNlcHRlZEJvZHkoY29uZmlnPy5kYXRhKX1cblxuSFRUUCBSZXNwb25zZSBDb2RlOiAke3RoaXMucHJldHRpZnlTdHJpbmcoc3RhdHVzKX1cblxuSFRUUCBSZXNwb25zZSAoZmlyc3QgNTAgbGluZXMpOlxuJHtyZXNIZWFkZXJzfSR7cGFyc2VkUmVzQm9keSA/IGBcXG5cXG4ke3BhcnNlZFJlc0JvZHl9YCA6ICcnfVxuYClcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLy8gQ29udmVydHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpbnRvIGEgc2luZ2xlIHN0cmluZyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAvLyA8aGVhZGVyTmFtZT46IDxoZWFkZXJWYWx1ZT5cbiAgcHJpdmF0ZSBmb3JtYXRIZWFkZXJzID0gKHJhd0hlYWRlcnM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gcmF3SGVhZGVycy5yZWR1Y2UoKGFjYywgdmFsdWUsIGkpID0+IHtcbiAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICBhY2MgKz0gYCR7aSA9PT0gMCA/ICcnIDogJ1xcbid9JHt2YWx1ZX1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2MgKz0gYDogJHt2YWx1ZX1gXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgJycpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB2ZXJib3NlIG1vZGUuXG4gICAqIEBwYXJhbSB2ZXJib3NlTW9kZSAtIHZhbHVlIG9mIHRoZSB2ZXJib3NlIG1vZGUsIGNhbiBiZSB0cnVlLCBmYWxzZSBvciBibGVhY2hlZCh3aXRob3V0IGV4dHJhIGNvbG9ycykuXG4gICAqL1xuICBwdWJsaWMgc2V0VmVyYm9zZU1vZGUgPSAodmVyYm9zZU1vZGU6IFZlcmJvc2VNb2RlKSA9PiB7XG4gICAgdGhpcy52ZXJib3NlTW9kZSA9IHZlcmJvc2VNb2RlXG5cbiAgICBpZiAodGhpcy52ZXJib3NlTW9kZSkgdGhpcy5lbmFibGVWZXJib3NlTW9kZSgpXG4gICAgZWxzZSB0aGlzLmRpc2FibGVWZXJib3NlTW9kZSgpXG4gIH1cblxuICAvKipcbiAgICogVHVybnMgb24gdmVyYm9zZSBtb2RlIHRvIGxvZyBldmVyeSBIVFRQIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxCYWNrIC0gZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgdHJpZ2dlcmVkIG9uIGV2ZXJ5IEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgc3RhdHVzIDIqKi5cbiAgICogQHBhcmFtIGVycm9yQ2FsbEJhY2sgLSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gZXZlcnkgSFRUUCByZXNwb25zZSB3aXRoIHRoZSBzdGF0dXMgZGlmZmVyZW50IGZyb20gMioqLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVZlcmJvc2VNb2RlID0gKFxuICAgIHN1Y2Nlc3NDYWxsQmFjayA9IHRoaXMuaGFuZGxlQXhpb3NSZXNwb25zZSxcbiAgICBlcnJvckNhbGxCYWNrID0gdGhpcy5oYW5kbGVBeGlvc0Vycm9yXG4gICkgPT4ge1xuICAgIHRoaXMuaHR0cEludGVyY2VwdG9yID0gdGhpcy5odHRwQ2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG4gICAgICBzdWNjZXNzQ2FsbEJhY2ssXG4gICAgICBlcnJvckNhbGxCYWNrXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIG9mZiB2ZXJib3NlIG1vZGUgdG8gbG9nIGV2ZXJ5IEhUVFAgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZVZlcmJvc2VNb2RlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmh0dHBJbnRlcmNlcHRvcikge1xuICAgICAgdGhpcy5odHRwQ2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS5lamVjdCh0aGlzLmh0dHBJbnRlcmNlcHRvcilcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SGVhZGVycyA9IChcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgY29uc3QgaGVhZGVyczogYW55ID0ge31cblxuICAgIGlmIChjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudFR5cGVcbiAgICB9XG5cbiAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgaGVhZGVycy5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbidcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVycy5BY2NlcHQgPSAnKi8qJ1xuICAgIH1cbiAgICBpZiAoYWNjZXNzVG9rZW4pIHtcbiAgICAgIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gXG4gICAgfVxuICAgIGlmICh0aGlzLmNzcmZUb2tlbi5oZWFkZXJOYW1lICYmIHRoaXMuY3NyZlRva2VuLnZhbHVlKSB7XG4gICAgICBoZWFkZXJzW3RoaXMuY3NyZlRva2VuLmhlYWRlck5hbWVdID0gdGhpcy5jc3JmVG9rZW4udmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQW5kU2V0RmlsZVVwbG9hZENzcmZUb2tlbiA9IChyZXNwb25zZTogQXhpb3NSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wYXJzZUNzcmZUb2tlbihyZXNwb25zZSlcblxuICAgIGlmICh0b2tlbikge1xuICAgICAgdGhpcy5maWxlVXBsb2FkQ3NyZlRva2VuID0gdG9rZW5cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VBbmRTZXRDc3JmVG9rZW4gPSAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGFyc2VDc3JmVG9rZW4ocmVzcG9uc2UpXG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIHRoaXMuY3NyZlRva2VuID0gdG9rZW5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ3NyZlRva2VuID0gKHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlKTogQ3NyZlRva2VuIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB0b2tlbkhlYWRlciA9IChcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnNbJ3gtY3NyZi1oZWFkZXInXSBhcyBzdHJpbmdcbiAgICApPy50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAodG9rZW5IZWFkZXIpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gcmVzcG9uc2UuaGVhZGVyc1t0b2tlbkhlYWRlcl1cbiAgICAgIGNvbnN0IGNzcmZUb2tlbiA9IHtcbiAgICAgICAgaGVhZGVyTmFtZTogdG9rZW5IZWFkZXIsXG4gICAgICAgIHZhbHVlOiB0b2tlbiB8fCAnJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3NyZlRva2VuXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVycm9yID0gYXN5bmMgKFxuICAgIGU6IGFueSxcbiAgICBjYWxsYmFjazogYW55LFxuICAgIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBlLnJlc3BvbnNlIGFzIEF4aW9zUmVzcG9uc2VcblxuICAgIGlmIChlIGluc3RhbmNlb2YgQXV0aG9yaXplRXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuaHR0cENsaWVudFxuICAgICAgICAuZ2V0KGUuY29uZmlybVVybCwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJywgQWNjZXB0OiAnKi8qJyB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShlcnIsICdFcnJvciB3aGlsZSBnZXR0aW5nIGVycm9yIGNvbmZpcm1VcmwuICcpXG4gICAgICAgIH0pXG5cbiAgICAgIGlmIChpc0F1dGhvcml6ZUZvcm1SZXF1aXJlZChyZXM/LmRhdGEgYXMgc3RyaW5nKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhvcml6ZShyZXMuZGF0YSBhcyBzdHJpbmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICB0aHJvdyBwcmVmaXhNZXNzYWdlKGVyciwgJ0Vycm9yIHdoaWxlIGF1dGhvcml6aW5nIHJlcXVlc3QuICcpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aHJvdyBwcmVmaXhNZXNzYWdlKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICAnRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGNhbGxiYWNrIGluIGhhbmRsZUVycm9yLiAnXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgIHRoaXMuY2xlYXJDc3JmVG9rZW5zKClcblxuICAgICAgdGhyb3cgZVxuICAgIH1cblxuICAgIGlmIChlIGluc3RhbmNlb2YgSW52YWxpZFNBU2pzQ3NyZkVycm9yKSB7XG4gICAgICAvLyBGZXRjaGluZyByb290IGFuZCBjcmVhdGluZyBDU1JGIGNvb2tpZVxuICAgICAgYXdhaXQgdGhpcy5odHRwQ2xpZW50XG4gICAgICAgIC5nZXQoJy8nLCB7XG4gICAgICAgICAgd2l0aFhTUkZUb2tlbjogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBjb29raWUgPVxuICAgICAgICAgICAgLzxzY3JpcHQ+ZG9jdW1lbnQuY29va2llID0gJyhYU1JGLVRPS0VOPS4qOyBNYXgtQWdlPTg2NDAwOyBTYW1lU2l0ZT1TdHJpY3Q7IFBhdGg9XFwvOyknPFxcL3NjcmlwdD4vLmV4ZWMoXG4gICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgICk/LlsxXVxuXG4gICAgICAgICAgaWYgKGNvb2tpZSkgZG9jdW1lbnQuY29va2llID0gY29va2llXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShlcnIsICdFcnJvciB3aGlsZSByZS1mZXRjaGluZyBDU1JGIHRva2VuLicpXG4gICAgICAgIH0pXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aHJvdyBwcmVmaXhNZXNzYWdlKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICAnRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGNhbGxiYWNrIGluIGhhbmRsZUVycm9yLiAnXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fCByZXNwb25zZT8uc3RhdHVzID09PSA0NDkpIHtcbiAgICAgIHRoaXMucGFyc2VBbmRTZXRDc3JmVG9rZW4ocmVzcG9uc2UpXG5cbiAgICAgIGlmICh0aGlzLmNzcmZUb2tlbi5oZWFkZXJOYW1lICYmIHRoaXMuY3NyZlRva2VuLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRocm93IHByZWZpeE1lc3NhZ2UoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAnRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGNhbGxiYWNrIGluIGhhbmRsZUVycm9yLiAnXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlXG4gICAgfSBlbHNlIGlmIChyZXNwb25zZT8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKHJlc3BvbnNlLmNvbmZpZy51cmwhKVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2U/LnN0YXR1cyA9PT0gNTAyKSB7XG4gICAgICBpZiAoZGVidWcpIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yKClcbiAgICAgIGVsc2UgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGUuaXNBeGlvc0Vycm9yICYmIGUuY29kZSA9PT0gJ1VOQUJMRV9UT19WRVJJRllfTEVBRl9TSUdOQVRVUkUnKSB7XG4gICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFcnJvcihlLm1lc3NhZ2UpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZS5pc0F4aW9zRXJyb3IgJiZcbiAgICAgICFyZXNwb25zZSAmJlxuICAgICAgZS5jb2RlID09PSAnRVJSX05FVFdPUksnICYmXG4gICAgICAhdGhpcy5pc1JlY292ZXJpbmdGcm9tTmV0d29ya0Vycm9yXG4gICAgKSB7XG4gICAgICAvLyBPcGFxdWUgRVJSX05FVFdPUksgdXN1YWxseSBtZWFucyB0aGUgc2VydmVyIHJlamVjdGVkIHN0YWxlIGNyZWRlbnRpYWxzLlxuICAgICAgLy8gV2lwZSBpbi1tZW1vcnkgYXV0aCBzdGF0ZSwgcmUtZXN0YWJsaXNoIHNlc3Npb24gdmlhIEdFVCAvLFxuICAgICAgLy8gdGhlbiByZXRyeSB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAgICAgIHRoaXMucmVzZXRJbk1lbW9yeUF1dGhTdGF0ZSgpXG4gICAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21OZXR3b3JrRXJyb3IgPSB0cnVlXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZS1lc3RhYmxpc2ggc2Vzc2lvbiBhbmQgQ1NSRiBjb29raWVcbiAgICAgICAgY29uc3Qgcm9vdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5odHRwQ2xpZW50XG4gICAgICAgICAgLmdldCgnLycsIHsgd2l0aFhTUkZUb2tlbjogdHJ1ZSB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBlcnIucmVzcG9uc2UpXG5cbiAgICAgICAgaWYgKHJvb3RSZXNwb25zZT8uZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvb2tpZSA9XG4gICAgICAgICAgICAvPHNjcmlwdD5kb2N1bWVudC5jb29raWUgPSAnKFhTUkYtVE9LRU49Lio7IE1heC1BZ2U9ODY0MDA7IFNhbWVTaXRlPVN0cmljdDsgUGF0aD1cXC87KSc8XFwvc2NyaXB0Pi8uZXhlYyhcbiAgICAgICAgICAgICAgcm9vdFJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgICk/LlsxXVxuXG4gICAgICAgICAgaWYgKGNvb2tpZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBhcnNlQW5kU2V0Q3NyZlRva2VuKHJvb3RSZXNwb25zZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2Vzc2lvbiBjb3VsZCBub3QgYmUgcmVjb3ZlcmVkIOKAlCBzdXJmYWNlIExvZ2luUmVxdWlyZWRFcnJvclxuICAgICAgICB0aHJvdyBuZXcgTG9naW5SZXF1aXJlZEVycm9yKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaXNSZWNvdmVyaW5nRnJvbU5ldHdvcmtFcnJvciA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGUubWVzc2FnZSkgdGhyb3cgZVxuICAgIGVsc2UgdGhyb3cgcHJlZml4TWVzc2FnZShlLCAnRXJyb3Igd2hpbGUgaGFuZGxpbmcgZXJyb3IuICcpXG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZTxUPihyZXNwb25zZTogQXhpb3NSZXNwb25zZTxhbnk+KSB7XG4gICAgY29uc3QgZXRhZyA9IHJlc3BvbnNlPy5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVyc1snZXRhZyddIDogJydcbiAgICBsZXQgcGFyc2VkUmVzcG9uc2VcbiAgICBsZXQgaW5jbHVkZVNBUzlMb2c6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IHJlc3BvbnNlLmRhdGFcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gSlNPTi5wYXJzZShwYXJzZVdlYm91dFJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YVxuICAgICAgfVxuXG4gICAgICBpbmNsdWRlU0FTOUxvZyA9IHRydWVcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2VUb1JldHVybjoge1xuICAgICAgcmVzdWx0OiBUXG4gICAgICBldGFnOiBhbnlcbiAgICAgIGxvZz86IHN0cmluZ1xuICAgICAgc3RhdHVzOiBudW1iZXJcbiAgICB9ID0ge1xuICAgICAgcmVzdWx0OiBwYXJzZWRSZXNwb25zZSBhcyBULFxuICAgICAgZXRhZyxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzXG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVTQVM5TG9nKSB7XG4gICAgICByZXNwb25zZVRvUmV0dXJuLmxvZyA9IHJlc3BvbnNlLmRhdGFcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2VUb1JldHVyblxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIdHRwQ2xpZW50KFxuICAgIGJhc2VVcmw6IHN0cmluZyxcbiAgICBodHRwc0FnZW50T3B0aW9ucz86IGh0dHBzLkFnZW50T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBodHRwc0FnZW50ID0gaHR0cHNBZ2VudE9wdGlvbnNcbiAgICAgID8gbmV3IGh0dHBzLkFnZW50KGh0dHBzQWdlbnRPcHRpb25zKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuaHR0cENsaWVudCA9IGNyZWF0ZUF4aW9zSW5zdGFuY2UoYmFzZVVybCwgaHR0cHNBZ2VudClcblxuICAgIHRoaXMuaHR0cENsaWVudC5kZWZhdWx0cy52YWxpZGF0ZVN0YXR1cyA9IChzdGF0dXMpID0+IHtcbiAgICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSA0MDFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRocm93SWZFcnJvciA9IChyZXNwb25zZTogQXhpb3NSZXNwb25zZSkgPT4ge1xuICBzd2l0Y2ggKHJlc3BvbnNlLnN0YXR1cykge1xuICAgIGNhc2UgNDAwOlxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gJ2ludmFsaWRfZ3JhbnQnXG4gICAgICApIHtcbiAgICAgICAgLy8gSW4gU0FTVklZQSB3aGVuIHRyeWluZyB0byBnZXQgYWNjZXNzIHRva2VuLCBpZiBhdXRoIGNvZGUgaXMgd3Jvbmcgc3RhdHVzIGNvZGUgd2lsbCBiZSA0MDAgc28gaW4gc3VjaCBjYXNlIHdlIHJldHVybiBsb2dpbiByZXF1aXJlZCBlcnJvci5cbiAgICAgICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcihyZXNwb25zZS5kYXRhKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnc3RyaW5nJyAmJlxuICAgICAgICByZXNwb25zZS5kYXRhLnRvTG93ZXJDYXNlKCkgPT09ICdpbnZhbGlkIGNzcmYgdG9rZW4hJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkU0FTanNDc3JmRXJyb3IoKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICBjYXNlIDQwMTpcbiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcihyZXNwb25zZS5kYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcigpXG4gICAgICB9XG4gIH1cblxuICBpZiAocmVzcG9uc2UuZGF0YT8uZW50aXR5SUQ/LmluY2x1ZGVzKCdsb2dpbicpKSB7XG4gICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcigpXG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdzdHJpbmcnICYmXG4gICAgaXNBdXRob3JpemVGb3JtUmVxdWlyZWQocmVzcG9uc2UuZGF0YSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6ZUVycm9yKFxuICAgICAgJ0F1dGhvcml6YXRpb24gcmVxdWlyZWQnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdC5yZXNwb25zZVVSTFxuICAgIClcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycgJiZcbiAgICBpc0xvZ0luUmVxdWlyZWQocmVzcG9uc2UuZGF0YSkgJiZcbiAgICAhcmVzcG9uc2UuY29uZmlnPy51cmw/LmluY2x1ZGVzKCcvU0FTTG9nb24vbG9naW4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgTG9naW5SZXF1aXJlZEVycm9yKClcbiAgfVxuICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aF9yZXF1ZXN0KSB7XG4gICAgY29uc3QgYXV0aG9yaXplUmVxdWVzdFVybCA9IHJlc3BvbnNlLnJlcXVlc3QucmVzcG9uc2VVUkxcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXplRXJyb3IocmVzcG9uc2UuZGF0YS5tZXNzYWdlLCBhdXRob3JpemVSZXF1ZXN0VXJsKVxuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNvbmZpZz8udXJsPy5pbmNsdWRlcygnc2FzQXV0aEVycm9yJykpIHtcbiAgICB0aHJvdyBuZXcgU0FTOUF1dGhFcnJvcigpXG4gIH1cblxuICBjb25zdCBlcnJvciA9IHBhcnNlRXJyb3IocmVzcG9uc2UuZGF0YSBhcyBzdHJpbmcpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5jb25zdCBwYXJzZUVycm9yID0gKGRhdGE6IHN0cmluZykgPT4ge1xuICBpZiAoIWRhdGEpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZUpzb24gPSBKU09OLnBhcnNlKGRhdGE/LnJlcGxhY2UoL1tcXG5cXHJdL2csICcgJykpXG4gICAgaWYgKHJlc3BvbnNlSnNvbi5lcnJvckNvZGUgJiYgcmVzcG9uc2VKc29uLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBuZXcgSm9iRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIHJlc3BvbnNlSnNvbi5lcnJvckNvZGUsXG4gICAgICAgIHJlc3BvbnNlSnNvbi5tZXNzYWdlLFxuICAgICAgICBkYXRhPy5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnICcpXG4gICAgICApXG4gICAgfVxuICB9IGNhdGNoIChfKSB7fVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFzRXJyb3IgPSBkYXRhPy5pbmNsdWRlcygne1wiZXJyb3JDb2RlJylcbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZGF0YS5zcGxpdCgne1wiZXJyb3JDb2RlJylcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gJ3tcImVycm9yQ29kZScgKyBwYXJ0c1sxXS5zcGxpdCgnXCJ9JylbMF0gKyAnXCJ9J1xuICAgICAgICBjb25zdCBlcnJvckpzb24gPSBKU09OLnBhcnNlKGVycm9yLnJlcGxhY2UoL1tcXG5cXHJdL2csICcgJykpXG4gICAgICAgIHJldHVybiBuZXcgSm9iRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgZXJyb3JKc29uLmVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvckpzb24ubWVzc2FnZSxcbiAgICAgICAgICBkYXRhPy5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnXFxuJylcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cblxuICB0cnkge1xuICAgIGNvbnN0IGhhc0Vycm9yID0gISFkYXRhPy5tYXRjaCgvc3RvcmVkIHByb2Nlc3Mgbm90IGZvdW5kOiAvaSlcbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZGF0YS5zcGxpdCgvc3RvcmVkIHByb2Nlc3Mgbm90IGZvdW5kOiAvaSlcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZFByb2Nlc3NQYXRoID0gcGFydHNbMV0uc3BsaXQoJzxpPicpWzFdLnNwbGl0KCc8L2k+JylbMF1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHN0b3JlZFByb2Nlc3NQYXRoLmVuZHNXaXRoKCdydW5uZXInKVxuICAgICAgICAgID8gYFNBU0pTIHJ1bm5lciBub3QgZm91bmQuIEhlcmUncyB0aGUgbGluayAoaHR0cHM6Ly9jbGkuc2FzanMuaW8vYXV0aC8jc2FzanMtcnVubmVyKSB0byB0aGUgU0FTIGNvZGUgZm9yIHJlZ2lzdGVyaW5nIHRoZSBTQVNqcyBydW5uZXJgXG4gICAgICAgICAgOiBgU3RvcmVkIHByb2Nlc3Mgbm90IGZvdW5kOiAke3N0b3JlZFByb2Nlc3NQYXRofWBcbiAgICAgICAgcmV0dXJuIG5ldyBKb2JFeGVjdXRpb25FcnJvcig1MDAsIG1lc3NhZ2UsICcnKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cblxuICB0cnkge1xuICAgIC8vIFRoZXJlIGFyZSBzb21lIGVkZ2UgY2FzZXMgaW4gd2hpY2ggdGhlIFNBUyBtcF9hYm9ydCBtYWNyb1xuICAgIC8vIChodHRwczovL2NvcmUuc2FzanMuaW8vbXBfX2Fib3J0XzhzYXMuaHRtbCkgaXMgdW5hYmxlIHRvXG4gICAgLy8gcHJvdmlkZSBhIGNsZWFuIGV4aXQuICBJbiB0aGlzIGNhc2UgdGhlIEpTT04gcmVzcG9uc2Ugd2lsbFxuICAgIC8vIGJlIHdyYXBwZWQgaW4gPj53ZWJvdXRCRUdJTjw8IGFuZCA+PndlYm91dEVORDw8IHN0cmluZ3MuXG4gICAgLy8gVGhlcmVmb3JlLCBpZiB0aGUgZmlyc3Qgc3RyaW5nIGV4aXN0cywgd2Ugd29uJ3QgdGhyb3cgYW5cbiAgICAvLyBlcnJvciBqdXN0IHlldCAodGhlIHBhcnNlciBtYXkgeWV0IHRocm93IG9uZSBpbnN0ZWFkKVxuICAgIGNvbnN0IGhhc0Vycm9yID1cbiAgICAgICFkYXRhPy5tYXRjaCgvPj53ZWJvdXRCRUdJTjw8LykgJiZcbiAgICAgICEhZGF0YT8ubWF0Y2goL1N0b3JlZCBQcm9jZXNzIEVycm9yL2kpICYmXG4gICAgICAhIWRhdGE/Lm1hdGNoKC9UaGlzIHJlcXVlc3QgY29tcGxldGVkIHdpdGggZXJyb3JzLi9pKVxuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgY29uc3QgcGFydHMgPSBkYXRhLnNwbGl0KCc8aDI+U0FTIExvZzwvaDI+JylcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHBhcnRzWzFdLnNwbGl0KCc8cHJlPicpWzFdLnNwbGl0KCc8L3ByZT4nKVswXVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYFRoaXMgcmVxdWVzdCBjb21wbGV0ZWQgd2l0aCBlcnJvcnMuYFxuICAgICAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGlvbkVycm9yKDUwMCwgbWVzc2FnZSwgbG9nKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cblxuICByZXR1cm4gbnVsbFxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb250ZXh0IHtcbiAgbmFtZTogc3RyaW5nXG4gIGlkOiBzdHJpbmdcbiAgY3JlYXRlZEJ5OiBzdHJpbmdcbiAgdmVyc2lvbjogbnVtYmVyXG4gIGF0dHJpYnV0ZXM/OiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFZGl0Q29udGV4dElucHV0IHtcbiAgbmFtZT86IHN0cmluZ1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICBsYXVuY2hDb250ZXh0PzogeyBuYW1lOiBzdHJpbmcgfVxuICBlbnZpcm9ubWVudD86IHsgb3B0aW9ucz86IHN0cmluZ1tdOyBhdXRvRXhlY0xpbmVzPzogc3RyaW5nW10gfVxuICBhdHRyaWJ1dGVzPzogYW55XG4gIGF1dGhvcml6ZWRVc2Vycz86IHN0cmluZ1tdXG4gIGF1dGhvcml6ZUFsbEF1dGhlbnRpY2F0ZWRVc2Vycz86IGJvb2xlYW5cbiAgaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0QWxsQXR0cmlidXRlcyB7XG4gIGF0dHJpYnV0ZXM6IHtcbiAgICByZXVzZVNlcnZlclByb2Nlc3NlczogYm9vbGVhblxuICAgIHJ1blNlcnZlckFzOiBzdHJpbmdcbiAgfVxuICBtb2RpZmllZFRpbWVTdGFtcDogc3RyaW5nXG4gIGNyZWF0ZWRCeTogc3RyaW5nXG4gIGNyZWF0aW9uVGltZVN0YW1wOiBzdHJpbmdcbiAgbGF1bmNoVHlwZTogc3RyaW5nXG4gIGVudmlyb25tZW50OiB7XG4gICAgYXV0b0V4ZWNMaW5lczogW3N0cmluZ11cbiAgfVxuICBsYXVuY2hDb250ZXh0OiB7XG4gICAgY29udGV4dE5hbWU6IHN0cmluZ1xuICB9XG4gIG1vZGlmaWVkQnk6IHN0cmluZ1xuICBpZDogc3RyaW5nXG4gIHZlcnNpb246IG51bWJlclxuICBuYW1lOiBzdHJpbmdcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ3NyZlRva2VuIHtcbiAgaGVhZGVyTmFtZTogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uUXVlcnkge1xuICBfcHJvZ3JhbTogc3RyaW5nXG4gIF9kZWJ1Zz86IG51bWJlclxufVxuIiwiaW1wb3J0IHsgTGluayB9IGZyb20gJy4vTGluaydcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlIHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgcGFyZW50VXJpOiBzdHJpbmdcbiAgbGlua3M6IExpbmtbXVxufVxuIiwiaW1wb3J0IHsgTGluayB9IGZyb20gJy4vTGluaydcblxuZXhwb3J0IGludGVyZmFjZSBGb2xkZXIge1xuICBpZDogc3RyaW5nXG4gIHVyaTogc3RyaW5nXG4gIGxpbmtzOiBMaW5rW11cbiAgbWVtYmVyQ291bnQ6IG51bWJlclxufVxuIiwiaW1wb3J0IHsgTGluayB9IGZyb20gJy4vTGluaydcbmltcG9ydCB7IEpvYlJlc3VsdCB9IGZyb20gJy4vSm9iUmVzdWx0J1xuaW1wb3J0IHsgTG9nU3RhdGlzdGljcyB9IGZyb20gJy4vTG9nU3RhdGlzdGljcydcblxuZXhwb3J0IGludGVyZmFjZSBKb2Ige1xuICBpZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICB1cmk6IHN0cmluZ1xuICBjcmVhdGVkQnk6IHN0cmluZ1xuICBjb2RlPzogc3RyaW5nXG4gIGxpbmtzOiBMaW5rW11cbiAgcmVzdWx0czogSm9iUmVzdWx0XG4gIGVycm9yPzogYW55XG4gIGxvZ1N0YXRpc3RpY3M6IExvZ1N0YXRpc3RpY3Ncbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgSm9iRGVmaW5pdGlvbiB7XG4gIGNvZGU6IHN0cmluZ1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBKb2JSZXN1bHQge1xuICAnX3dlYm91dC5qc29uJzogc3RyaW5nXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIExpbmsge1xuICBtZXRob2Q6IHN0cmluZ1xuICByZWw6IHN0cmluZ1xuICBocmVmOiBzdHJpbmdcbiAgdXJpOiBzdHJpbmdcbiAgdHlwZTogc3RyaW5nXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIExvZ2luT3B0aW9ucyB7XG4gIG9uTG9nZ2VkT3V0PzogKCkgPT4gUHJvbWlzZTxib29sZWFuPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUmVzdWx0IHtcbiAgaXNMb2dnZWRJbjogYm9vbGVhblxuICB1c2VyTmFtZTogc3RyaW5nXG4gIHVzZXJMb25nTmFtZTogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUmVzdWx0SW50ZXJuYWwge1xuICBpc0xvZ2dlZEluOiBib29sZWFuXG4gIHVzZXJOYW1lOiBzdHJpbmdcbiAgdXNlckxvbmdOYW1lOiBzdHJpbmdcbiAgbG9naW5Gb3JtPzogYW55XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFBvbGxPcHRpb25zIHtcbiAgbWF4UG9sbENvdW50OiBudW1iZXJcbiAgcG9sbEludGVydmFsOiBudW1iZXIgLy8gbWlsbGlzZWNvbmRzXG4gIHBvbGxTdHJhdGVneT86IFBvbGxTdHJhdGVneVxuICBzdHJlYW1Mb2c/OiBib29sZWFuXG4gIGxvZ0ZvbGRlclBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUG9sbFN0cmF0ZWd5ID0gUG9sbE9wdGlvbnNbXVxuIiwiaW1wb3J0IHsgQ3NyZlRva2VuIH0gZnJvbSAnLi4nXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudCB7XG4gIGdldDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVIZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9XG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFQ7IGV0YWc6IHN0cmluZyB9PlxuXG4gIHBvc3Q8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGU6IHN0cmluZyxcbiAgICBvdmVycmlkZUhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH1cbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+XG5cbiAgcHV0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG92ZXJyaWRlSGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfVxuICApOiBQcm9taXNlPHsgcmVzdWx0OiBUOyBldGFnOiBzdHJpbmcgfT5cblxuICBkZWxldGU8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPHsgcmVzdWx0OiBUOyBldGFnOiBzdHJpbmcgfT5cblxuICBnZXRDc3JmVG9rZW4odHlwZTogJ2dlbmVyYWwnIHwgJ2ZpbGUnKTogQ3NyZlRva2VuIHwgdW5kZWZpbmVkXG4gIHNhdmVMb2NhbFN0b3JhZ2VUb2tlbihhY2Nlc3NUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZyk6IHZvaWRcbiAgY2xlYXJDc3JmVG9rZW5zKCk6IHZvaWRcbiAgY2xlYXJMb2NhbFN0b3JhZ2VUb2tlbnMoKTogdm9pZFxuICBnZXRCYXNlVXJsKCk6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNBU2pzUmVxdWVzdCB7XG4gIHNlcnZpY2VMaW5rOiBzdHJpbmdcbiAgdGltZXN0YW1wOiBEYXRlXG4gIHNvdXJjZUNvZGU6IHN0cmluZ1xuICBnZW5lcmF0ZWRDb2RlOiBzdHJpbmdcbiAgbG9nRmlsZTogc3RyaW5nXG4gIFNBU1dPUks6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhc2pzUGFyc2VkUmVzcG9uc2U8VD4ge1xuICByZXN1bHQ6IFRcbiAgbG9nOiBzdHJpbmdcbiAgZXRhZzogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG4gIHByaW50T3V0cHV0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFZlcmJvc2VNb2RlID0gYm9vbGVhbiB8ICdibGVhY2hlZCdcbiIsImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJ1xuaW1wb3J0IHsgU2VydmVyVHlwZSB9IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7IFZlcmJvc2VNb2RlIH0gZnJvbSAnLi4vdHlwZXMnXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgU0FTanMgaW5zdGFuY2UgLSBlZyB3aGVyZSBhbmQgaG93IHRvXG4gKiBjb25uZWN0IHRvIFNBUy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNBU2pzQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiAoaW5jbHVkaW5nIGh0dHAgcHJvdG9jb2wgYW5kIHBvcnQpIG9mIHRoZSBTQVMgU2VydmVyLlxuICAgKiBDYW4gYmUgb21pdHRlZCwgZWcgaWYgc2VydmluZyBkaXJlY3RseSBmcm9tIHRoZSBTQVMgV2ViIFNlcnZlciBvciBiZWluZ1xuICAgKiBzdHJlYW1lZC5cbiAgICovXG4gIHNlcnZlclVybDogc3RyaW5nID0gJydcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgU1RQIFByb2Nlc3MgV2ViIEFwcGxpY2F0aW9uLiAgQnkgZGVmYXVsdCB0aGUgYWRhcHRlclxuICAgKiB3aWxsIHVzZSAnL1NBU2pzQXBpL3N0cC9leGVjdXRlJyBvbiBTQVMgSlMuXG4gICAqL1xuICBwYXRoU0FTSlM6IHN0cmluZyA9ICcnXG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIFN0b3JlZCBQcm9jZXNzIFdlYiBBcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQgdGhlIGFkYXB0ZXJcbiAgICogd2lsbCB1c2UgJy9TQVNTdG9yZWRQcm9jZXNzL2RvJyBvbiBTQVMgOS5cbiAgICovXG4gIHBhdGhTQVM5OiBzdHJpbmcgPSAnJ1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBKb2IgRXhlY3V0aW9uIFdlYiBBcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQgdGhlIGFkYXB0ZXJcbiAgICogd2lsbCB1c2UgJy9TQVNKb2JFeGVjdXRpb24nIG9uIFNBUyBWaXlhLlxuICAgKi9cbiAgcGF0aFNBU1ZpeWE6IHN0cmluZyA9ICcnXG4gIC8qKlxuICAgKiBUaGUgYXBwTG9jIGlzIHRoZSBwYXJlbnQgZm9sZGVyIHVuZGVyIHdoaWNoIHRoZSBTQVMgc2VydmljZXMgKFNUUHMgb3IgSm9iXG4gICAqIEV4ZWN1dGlvbiBTZXJ2aWNlcykgYXJlIHN0b3JlZC4gIFdlIHJlY29tbWVuZCB0aGF0IGVhY2ggYXBwIGlzIHN0b3JlZCBpblxuICAgKiBhIGRlZGljYXRlZCBwYXJlbnQgZm9sZGVyICh0aGUgYXBwTG9jKSBhbmQgdGhlIHNlcnZpY2VzIGFyZSBncm91cGVkIGluc2lkZVxuICAgKiBzdWJmb2xkZXJzIHdpdGhpbiB0aGUgYXBwTG9jIC0gYWxsb3dpbmcgZnVuY3Rpb25hbGl0eSB0byBiZSByZXN0cmljdGVkXG4gICAqIGFjY29yZGluZyB0byB0aG9zZSBncm91cHMgYXQgYmFja2VuZC5cbiAgICogV2hlbiB1c2luZyBhcHBMb2MsIHRoZSBwYXRocyBwcm92aWRlZCBpbiB0aGUgYHJlcXVlc3RgIGZ1bmN0aW9uIHNob3VsZCBiZVxuICAgKiBfd2l0aG91dF8gYSBsZWFkaW5nIHNsYXNoICgvKS5cbiAgICovXG4gIGFwcExvYzogc3RyaW5nID0gJydcbiAgLyoqXG4gICAqIENhbiBiZSBgU0FTOWAgb3IgYFNBU1ZJWUFgLlxuICAgKi9cbiAgc2VydmVyVHlwZTogU2VydmVyVHlwZSB8IG51bGwgPSBudWxsXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIGVuYWJsZSBhZGRpdGlvbmFsIGRlYnVnZ2luZy5cbiAgICovXG4gIGRlYnVnOiBib29sZWFuID0gdHJ1ZVxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBlbmFibGUgdmVyYm9zZSBtb2RlIHRoYXQgd2lsbCBsb2cgYSBzdW1tYXJ5IG9mIGV2ZXJ5IEhUVFAgcmVzcG9uc2UuXG4gICAqL1xuICB2ZXJib3NlPzogVmVyYm9zZU1vZGUgPSB0cnVlXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcHV0ZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIFZpeWEgc2VydmljZXMgZGlyZWN0bHkuXG4gICAqIEV4YW1wbGUgdmFsdWU6ICdTQVMgSm9iIEV4ZWN1dGlvbiBjb21wdXRlIGNvbnRleHQnXG4gICAqL1xuICBjb250ZXh0TmFtZTogc3RyaW5nID0gJydcbiAgLyoqXG4gICAqIElmIGl0J3MgYGZhbHNlYCBhZGFwdGVyIHdpbGwgdXNlIHRoZSBKRVMgQVBJIGFzIGNvbm5lY3Rpb24gYXBwcm9hY2guICBUbyBlbmhhbmNlIFZJWUFcbiAgICogcGVyZm9ybWFuY2UsIHNldCB0byBgdHJ1ZWAgYW5kIHByb3ZpZGUgYSBgY29udGV4dE5hbWVgIG9uIHdoaWNoIHRvIHJ1blxuICAgKiB0aGUgY29kZS4gIFdoZW4gcnVubmluZyBvbiBhIG5hbWVkIGNvbnRleHQsIHRoZSBjb2RlIGV4ZWN1dGVzIHVuZGVyIHRoZVxuICAgKiB1c2VyIGlkZW50aXR5LiAgV2hlbiBydW5uaW5nIGFzIGEgSm9iIEV4ZWN1dGlvbiBzZXJ2aWNlLCB0aGUgY29kZSBydW5zXG4gICAqIHVuZGVyIHRoZSBpZGVudGl0eSBpbiB0aGUgSkVTIGNvbnRleHQuICBJZiBgdXNlQ29tcHV0ZUFwaWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLCB0aGUgc2VydmljZSB3aWxsIHJ1biBhcyBhIEpvYiwgZXhjZXB0XG4gICAqIHRyaWdnZXJlZCB1c2luZyB0aGUgQVBJcyBpbnN0ZWFkIG9mIHRoZSBKb2IgRXhlY3V0aW9uIFdlYiBTZXJ2aWNlIGJyb2tlci5cbiAgICovXG4gIHVzZUNvbXB1dGVBcGk6IGJvb2xlYW4gfCBudWxsID0gbnVsbFxuICAvKipcbiAgICogT3B0aW9uYWwgc2V0dGluZyB0byBjb25maWd1cmUgSFRUUFMgQWdlbnQuXG4gICAqIEJ5IHByb3ZpZGluZyBga2V5YCwgYGNlcnRgLCBgY2FgIHRvIGNvbm5lY3Qgd2l0aCBzZXJ2ZXJcbiAgICogT3RoZXIgb3B0aW9ucyBjYW4gYmUgc2V0IGByZWplY3RVbmF1dGhvcml6ZWRgIGFuZCBgcmVxdWVzdENlcnRgXG4gICAqL1xuICBodHRwc0FnZW50T3B0aW9ucz86IGh0dHBzLkFnZW50T3B0aW9uc1xuICAvKipcbiAgICogU3VwcG9ydGVkIGxvZ2luIG1lY2hhbmlzbXMgYXJlIC0gUmVkaXJlY3RlZCBhbmQgRGVmYXVsdFxuICAgKi9cbiAgbG9naW5NZWNoYW5pc206IExvZ2luTWVjaGFuaXNtID0gTG9naW5NZWNoYW5pc20uRGVmYXVsdFxuICAvKipcbiAgICogT3B0aW9uYWwgc2V0dGluZyB0byBjb25maWd1cmUgcmVxdWVzdCBoaXN0b3J5IGxpbWl0LiBJbmNyZWFzaW5nIHRoaXMgbGltaXRcbiAgICogbWF5IGFmZmVjdCBicm93c2VyIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IHdpdGggZGVidWcgKGxvZ3MpIGVuYWJsZWQuXG4gICAqL1xuICByZXF1ZXN0SGlzdG9yeUxpbWl0PzogbnVtYmVyID0gMTBcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNldHRpbmcuIFdoZW4gYHRydWVgLCB0aGUgcmVxdWVzdCBydW5zIGFzIGEgVml5YSBleGVjdXRpb24gdGFzayDigJRcbiAgICogYXBwZW5kcyBgX2V4ZWN1dGlvblRhc2tzPXRydWVgIHRvIHRoZSByZXF1ZXN0IFVSTC4gT25seSBhcHBsaWVzIHRvIHRoZSBWaXlhXG4gICAqIHdlYiBqb2JzIHBhdGgsIGkuZS4gd2hlbiBgc2VydmVyVHlwZSA9PT0gU0FTVklZQWAgQU5EXG4gICAqIGB1c2VDb21wdXRlQXBpYCBpcyBgbnVsbGAvYHVuZGVmaW5lZGAuIEhhcyBubyBlZmZlY3Qgd2hlbiBgdXNlQ29tcHV0ZUFwaWBcbiAgICogaXMgZXhwbGljaXRseSBzZXQgdG8gYHRydWVgIG9yIGBmYWxzZWAuXG4gICAqL1xuICBydW5Bc1Rhc2s/OiBib29sZWFuID0gZmFsc2Vcbn1cblxuZXhwb3J0IGVudW0gTG9naW5NZWNoYW5pc20ge1xuICBEZWZhdWx0ID0gJ0RlZmF1bHQnLFxuICBSZWRpcmVjdGVkID0gJ1JlZGlyZWN0ZWQnXG59XG4iLCJpbXBvcnQgeyBMaW5rIH0gZnJvbSAnLi9MaW5rJ1xuaW1wb3J0IHsgU2Vzc2lvbk1hbmFnZXIgfSBmcm9tICcuLi9TZXNzaW9uTWFuYWdlcidcblxuZXhwb3J0IGVudW0gU2Vzc2lvblN0YXRlIHtcbiAgQ29tcGxldGVkID0gJ2NvbXBsZXRlZCcsXG4gIFJ1bm5pbmcgPSAncnVubmluZycsXG4gIFBlbmRpbmcgPSAncGVuZGluZycsXG4gIElkbGUgPSAnaWRsZScsXG4gIFVuYXZhaWxhYmxlID0gJ3VuYXZhaWxhYmxlJyxcbiAgTm9TdGF0ZSA9ICcnLFxuICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgRXJyb3IgPSAnZXJyb3InXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbiB7XG4gIGlkOiBzdHJpbmdcbiAgc3RhdGU6IFNlc3Npb25TdGF0ZVxuICBzdGF0ZVVybDogc3RyaW5nXG4gIGxpbmtzOiBMaW5rW11cbiAgYXR0cmlidXRlczoge1xuICAgIHNlc3Npb25JbmFjdGl2ZVRpbWVvdXQ6IG51bWJlclxuICB9XG4gIGNyZWF0aW9uVGltZVN0YW1wOiBzdHJpbmdcbiAgZXRhZzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblZhcmlhYmxlIHtcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvYlNlc3Npb25NYW5hZ2VyIHtcbiAgc2Vzc2lvbjogU2Vzc2lvblxuICBzZXNzaW9uTWFuYWdlcjogU2Vzc2lvbk1hbmFnZXJcbn1cbiIsImltcG9ydCB7IEFyZ3VtZW50RXJyb3IgfSBmcm9tICcuL2Vycm9ycydcblxuZXhwb3J0IGNsYXNzIFRhYmxlcyB7XG4gIF90YWJsZXM6IHsgW21hY3JvTmFtZTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgYW55PiB9XG5cbiAgY29uc3RydWN0b3IodGFibGU6IFJlY29yZDxzdHJpbmcsIGFueT4sIG1hY3JvTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFibGVzID0ge31cblxuICAgIHRoaXMuYWRkKHRhYmxlLCBtYWNyb05hbWUpXG4gIH1cblxuICBhZGQodGFibGU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsLCBtYWNyb05hbWU6IHN0cmluZykge1xuICAgIGlmICh0YWJsZSAmJiBtYWNyb05hbWUpIHtcbiAgICAgIGlmICghKHRhYmxlIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFycmF5JylcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbWFjcm9OYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nJylcbiAgICAgIH1cbiAgICAgIGlmICghaXNOYU4oTnVtYmVyKG1hY3JvTmFtZVttYWNyb05hbWUubGVuZ3RoIC0gMV0pKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWFjcm8gbmFtZSBjYW5ub3QgaGF2ZSBudW1iZXIgYXQgdGhlIGVuZCcpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGFyZ3VtZW50cycpXG4gICAgfVxuXG4gICAgdGhpcy5fdGFibGVzW21hY3JvTmFtZV0gPSB0YWJsZVxuICB9XG59XG4iLCIvKipcbiAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBmaWxlIHVwbG9hZGVyLlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRGaWxlIHtcbiAgZmlsZTogRmlsZVxuICBmaWxlTmFtZTogc3RyaW5nXG59XG4iLCJpbXBvcnQgeyBXcml0ZVN0cmVhbSBhcyBGc1dyaXRlU3RyZWFtIH0gZnJvbSAnZnMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVTdHJlYW0gZXh0ZW5kcyBGc1dyaXRlU3RyZWFtIHtcbiAgd3JpdGUoXG4gICAgY2h1bms6IGFueSxcbiAgICBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSxcbiAgICBjYj86IChlcnJvcjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICk6IGJvb2xlYW5cbiAgcGF0aDogc3RyaW5nIHwgQnVmZmVyXG59XG4iLCJleHBvcnQgY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ0FyZ3VtZW50RXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEFyZ3VtZW50RXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQXV0aG9yaXplRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbmZpcm1Vcmw6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBdXRob3JpemVFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQXV0aG9yaXplRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJjb25zdCBpbnN0cnVjdGlvbnNUb0ZpeCA9XG4gICdodHRwczovL2dpdGh1Yi5jb20vc2FzanMvY2xpL2lzc3Vlcy8xMTgxI2lzc3VlY29tbWVudC0xMDkwNjM4NTg0J1xuXG5leHBvcnQgY2xhc3MgQ2VydGlmaWNhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgJHttZXNzYWdlfVxcblBsZWFzZSB2aXNpdCB0aGUgbGluayBiZWxvdyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGlzIGlzc3VlOlxcbi0gJHtpbnN0cnVjdGlvbnNUb0ZpeH1cXG5gXG4gICAgKVxuICAgIHRoaXMubmFtZSA9ICdDZXJ0aWZpY2F0ZUVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDZXJ0aWZpY2F0ZUVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgSm9iIH0gZnJvbSAnLi4vSm9iJ1xuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUpvYkV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgam9iOiBKb2IsXG4gICAgcHVibGljIGxvZzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCdFcnJvcjogSm9iIGV4ZWN1dGlvbiBmYWlsZWQnKVxuICAgIHRoaXMubmFtZSA9ICdDb21wdXRlSm9iRXhlY3V0aW9uRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENvbXB1dGVKb2JFeGVjdXRpb25FcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBFcnJvclJlc3BvbnNlIHtcbiAgZXJyb3I6IEVycm9yQm9keVxuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZGV0YWlscz86IGFueSwgcmF3PzogYW55KSB7XG4gICAgbGV0IGRldGFpbHNTdHJpbmcgPSBkZXRhaWxzXG5cbiAgICBpZiAodHlwZW9mIGRldGFpbHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXRhaWxzU3RyaW5nID0gSlNPTi5wYXJzZShkZXRhaWxzKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJhdyA9IGRldGFpbHNcbiAgICAgICAgZGV0YWlsc1N0cmluZyA9ICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvciA9IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkZXRhaWxzOiBkZXRhaWxzU3RyaW5nLFxuICAgICAgcmF3XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JCb2R5IHtcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGRldGFpbHM6IGFueVxuICByYXc6IGFueVxufVxuIiwiZXhwb3J0IGNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdFcnJvcjogSW50ZXJuYWwgc2VydmVyIGVycm9yLicpXG5cbiAgICB0aGlzLm5hbWUgPSAnSW50ZXJuYWxTZXJ2ZXJFcnJvcidcblxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBJbnRlcm5hbFNlcnZlckVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEludmFsaWRKc29uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdFcnJvcjogaW52YWxpZCBKc29uIHN0cmluZycpXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRKc29uRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEludmFsaWRKc29uRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgSW52YWxpZFNBU2pzQ3NyZkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgQ1NSRiB0b2tlbiEnXG5cbiAgICBzdXBlcihgQXV0aCBlcnJvcjogJHttZXNzYWdlfWApXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRTQVNqc0NzcmZFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSW52YWxpZFNBU2pzQ3NyZkVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEpvYkV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZXJyb3JDb2RlOiBudW1iZXIsXG4gICAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZXN1bHQ6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihgRXJyb3IgQ29kZSAke2Vycm9yQ29kZX06ICR7ZXJyb3JNZXNzYWdlfWApXG4gICAgdGhpcy5uYW1lID0gJ0pvYkV4ZWN1dGlvbkVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBKb2JFeGVjdXRpb25FcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBKb2JTdGF0ZVBvbGxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3JpZ2luYWxFcnJvcjogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBgRXJyb3Igd2hpbGUgcG9sbGluZyBqb2Igc3RhdGUgZm9yIGpvYiAke2lkfTogJHtcbiAgICAgICAgb3JpZ2luYWxFcnJvci5tZXNzYWdlIHx8IG9yaWdpbmFsRXJyb3JcbiAgICAgIH1gXG4gICAgKVxuICAgIHRoaXMubmFtZSA9ICdKb2JTdGF0ZVBvbGxFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSm9iU3RhdGVQb2xsRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgSnNvblBhcnNlQXJyYXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0NhbiBub3QgcGFyc2UgYXJyYXkgb2JqZWN0IHRvIGpzb24uJylcbiAgICB0aGlzLm5hbWUgPSAnSnNvblBhcnNlQXJyYXlFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSnNvblBhcnNlQXJyYXlFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbHM/OiBhbnkpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZGV0YWlsc1xuICAgICAgPyBKU09OLnN0cmluZ2lmeShkZXRhaWxzLCBudWxsLCAyKVxuICAgICAgOiAnWW91IG11c3QgYmUgbG9nZ2VkIGluIHRvIGFjY2VzcyB0aGlzIHJlc291cmNlJ1xuXG4gICAgc3VwZXIoYEF1dGggZXJyb3I6ICR7bWVzc2FnZX1gKVxuICAgIHRoaXMubmFtZSA9ICdMb2dpblJlcXVpcmVkRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIExvZ2luUmVxdWlyZWRFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBOb1Nlc3Npb25TdGF0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2VydmVyUmVzcG9uc2VTdGF0dXM6IG51bWJlcixcbiAgICBwdWJsaWMgc2Vzc2lvblN0YXRlVXJsOiBzdHJpbmcsXG4gICAgcHVibGljIGxvZ1VybDogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYENvdWxkIG5vdCBnZXQgc2Vzc2lvbiBzdGF0ZS4gU2VydmVyIHJlc3BvbmRlZCB3aXRoICR7c2VydmVyUmVzcG9uc2VTdGF0dXN9IHdoaWxzdCBjaGVja2luZyBzdGF0ZTogJHtzZXNzaW9uU3RhdGVVcmx9YFxuICAgIClcblxuICAgIHRoaXMubmFtZSA9ICdOb1Nlc3Npb25TdGF0dXMnXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTm9TZXNzaW9uU3RhdGVFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRXJyb3I6IFJlc291cmNlIGF0ICR7dXJsfSB3YXMgbm90IGZvdW5kYClcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTm90Rm91bmRFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGRlY29kZVRva2VuIH0gZnJvbSAnQHNhc2pzL3V0aWxzL2F1dGgnXG5cbmV4cG9ydCBjbGFzcyBSb290Rm9sZGVyTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50Rm9sZGVyUGF0aDogc3RyaW5nLFxuICAgIHNlcnZlclVybDogc3RyaW5nLFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBtZXNzYWdlOiBzdHJpbmcgPVxuICAgICAgYFJvb3QgZm9sZGVyICR7cGFyZW50Rm9sZGVyUGF0aH0gd2FzIG5vdCBmb3VuZC5gICtcbiAgICAgIGBcXG5QbGVhc2UgY2hlY2sgJHtzZXJ2ZXJVcmx9L1NBU0RyaXZlLmAgK1xuICAgICAgYFxcbklmIHRoZSBmb2xkZXIgRE9FUyBleGlzdCB0aGVuIGl0IGlzIGxpa2VseSBhIHBlcm1pc3Npb24gcHJvYmxlbS5cXG5gXG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVG9rZW4gPSBkZWNvZGVUb2tlbihhY2Nlc3NUb2tlbilcbiAgICAgIGxldCBzY29wZSA9IGRlY29kZWRUb2tlbi5zY29wZVxuICAgICAgc2NvcGUgPSBzY29wZS5tYXAoKGVsZW1lbnQpID0+ICcqICcgKyBlbGVtZW50KVxuICAgICAgbWVzc2FnZSArPVxuICAgICAgICBgWW91ciBhY2Nlc3MgdG9rZW4gY29udGFpbnMgdGhlIGZvbGxvd2luZyBzY29wZXM6XFxuYCArIHNjb3BlLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1Jvb3RGb2xkZXJOb3RGb3VuZEVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSb290Rm9sZGVyTm90Rm91bmRFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTQVM5QXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgICdUaGUgY3JlZGVudGlhbHMgeW91IHByb3ZpZGVkIGNhbm5vdCBiZSBhdXRoZW50aWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHNldCBvZiBjcmVkZW50aWFscy4nXG4gICAgKVxuICAgIHRoaXMubmFtZSA9ICdBdXRob3JpemVFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU0FTOUF1dGhFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXZWJvdXRSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRXJyb3I6IGVycm9yIHdoaWxlIHBhcnNpbmcgcmVzcG9uc2UgZnJvbSAke3VybH1gKVxuICAgIHRoaXMubmFtZSA9ICdXZWJvdXRSZXNwb25zZUVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBXZWJvdXRSZXNwb25zZUVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9Bcmd1bWVudEVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9BdXRob3JpemVFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vQ2VydGlmaWNhdGVFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vQ29tcHV0ZUpvYkV4ZWN1dGlvbkVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9FcnJvclJlc3BvbnNlJ1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbFNlcnZlckVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9JbnZhbGlkSnNvbkVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9Kb2JFeGVjdXRpb25FcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vSm9iU3RhdGVQb2xsRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL0pzb25QYXJzZUFycmF5RXJyb3InXG5leHBvcnQgKiBmcm9tICcuL0xvZ2luUmVxdWlyZWRFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vTm9TZXNzaW9uU3RhdGVFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vTm90Rm91bmRFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vUm9vdEZvbGRlck5vdEZvdW5kRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL1dlYm91dFJlc3BvbnNlRXJyb3InXG4iLCJleHBvcnQgKiBmcm9tICcuL0NvbnRleHQnXG5leHBvcnQgKiBmcm9tICcuL0NzcmZUb2tlbidcbmV4cG9ydCAqIGZyb20gJy4vRm9sZGVyJ1xuZXhwb3J0ICogZnJvbSAnLi9GaWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9Kb2InXG5leHBvcnQgKiBmcm9tICcuL0pvYkRlZmluaXRpb24nXG5leHBvcnQgKiBmcm9tICcuL0pvYlJlc3VsdCdcbmV4cG9ydCAqIGZyb20gJy4vTGluaydcbmV4cG9ydCAqIGZyb20gJy4vTG9naW4nXG5leHBvcnQgKiBmcm9tICcuL1NBU2pzQ29uZmlnJ1xuZXhwb3J0ICogZnJvbSAnLi9SZXF1ZXN0Q2xpZW50J1xuZXhwb3J0ICogZnJvbSAnLi9TZXNzaW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9VcGxvYWRGaWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9Qb2xsT3B0aW9ucydcbmV4cG9ydCAqIGZyb20gJy4vV3JpdGVTdHJlYW0nXG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHQnXG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycydcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVzJ1xuIiwiaW1wb3J0IHsgRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBlbmRFeHRyYVJlc3BvbnNlQXR0cmlidXRlcyhcbiAgcmVzcG9uc2U6IGFueSxcbiAgZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXM6IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzW11cbikge1xuICBsZXQgcmVzcG9uc2VPYmplY3QgPSB7fVxuXG4gIGlmIChleHRyYVJlc3BvbnNlQXR0cmlidXRlcz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgZXh0cmFBdHRyaWJ1dGVzID0gZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMucmVkdWNlKFxuICAgICAgKG1hcDogYW55LCBvYmo6IGFueSkgPT4gKChtYXBbb2JqXSA9IHJlc3BvbnNlW29ial0pLCBtYXApLFxuICAgICAge31cbiAgICApXG5cbiAgICByZXNwb25zZU9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDogcmVzcG9uc2UucmVzdWx0LFxuICAgICAgLi4uZXh0cmFBdHRyaWJ1dGVzXG4gICAgfVxuICB9IGVsc2UgcmVzcG9uc2VPYmplY3QgPSByZXNwb25zZS5yZXN1bHRcblxuICByZXR1cm4gcmVzcG9uc2VPYmplY3Rcbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZvckVhY2goYXJyYXk6IGFueVtdLCBjYWxsYmFjazogYW55KSB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBhd2FpdCBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgU0FTanNSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMnXG5cbi8qKlxuICogQ29tcGFyYXRvciBmb3IgU0FTanMgcmVxdWVzdCB0aW1lc3RhbXBzLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBhcmVUaW1lc3RhbXBzID0gKGE6IFNBU2pzUmVxdWVzdCwgYjogU0FTanNSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBiLnRpbWVzdGFtcC5nZXRUaW1lKCkgLSBhLnRpbWVzdGFtcC5nZXRUaW1lKClcbn1cbiIsImltcG9ydCB7IGlzU3BlY2lhbE1pc3NpbmcgfSBmcm9tICdAc2FzanMvdXRpbHMvaW5wdXQvdmFsaWRhdG9ycydcbmltcG9ydCB7IHByZWZpeE1lc3NhZ2UgfSBmcm9tICdAc2FzanMvdXRpbHMvZXJyb3InXG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIEpTT04gb2JqZWN0IGFycmF5IHRvIGEgQ1NWIHN0cmluZy5cbiAqIEBwYXJhbSBkYXRhIC0gdGhlIGFycmF5IG9mIEpTT04gb2JqZWN0cyB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgY29uc3QgY29udmVydFRvQ1NWID0gKFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICB0YWJsZU5hbWU6IHN0cmluZ1xuKSA9PiB7XG4gIGlmICghZGF0YVt0YWJsZU5hbWVdKSB7XG4gICAgY29uc3QgZXJyb3IgPSBwcmVmaXhNZXNzYWdlKFxuICAgICAgJ05vIHRhYmxlIHByb3ZpZGVkIHRvIGJlIGNvbnZlcnRlZCB0byBDU1YuJyxcbiAgICAgICdFcnJvciB3aGlsZSBjb252ZXJ0aW5nIHRvIENTVi4gJ1xuICAgIClcblxuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpXG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlTmFtZV1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkodGFibGUpKSByZXR1cm4gJydcblxuICBsZXQgZm9ybWF0cyA9IGRhdGFbYCQke3RhYmxlTmFtZX1gXT8uZm9ybWF0c1xuICBsZXQgaGVhZGVyczogc3RyaW5nW10gPSBbXVxuICBsZXQgY3N2VGVzdFxuICBsZXQgaW52YWxpZFN0cmluZyA9IGZhbHNlXG5cbiAgaWYgKGZvcm1hdHMpIHtcbiAgICBoZWFkZXJzID0gT2JqZWN0LmtleXMoZm9ybWF0cykubWFwKChrZXkpID0+IGAke2tleX06JHtmb3JtYXRzIVtrZXldfWApXG4gIH1cblxuICBjb25zdCBoZWFkZXJGaWVsZHMgPSBPYmplY3Qua2V5cyh0YWJsZVswXSlcblxuICBoZWFkZXJGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICBpZiAoIWZvcm1hdHMgfHwgIU9iamVjdC5rZXlzKGZvcm1hdHMpLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgbGV0IGhhc051bGxPck51bWJlciA9IGZhbHNlXG4gICAgICBsZXQgaGFzU3BlY2lhbE1pc3NpbmdTdHJpbmcgPSBmYWxzZVxuXG4gICAgICB0YWJsZS5mb3JFYWNoKChyb3c6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+IHtcbiAgICAgICAgaWYgKHJvd1tmaWVsZF0gPT09IG51bGwgfHwgdHlwZW9mIHJvd1tmaWVsZF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaGFzTnVsbE9yTnVtYmVyID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiByb3dbZmllbGRdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGlzU3BlY2lhbE1pc3Npbmcocm93W2ZpZWxkXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaGFzU3BlY2lhbE1pc3NpbmdTdHJpbmcgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmIChoYXNOdWxsT3JOdW1iZXIgJiYgaGFzU3BlY2lhbE1pc3NpbmdTdHJpbmcpIHtcbiAgICAgICAgaGVhZGVycy5wdXNoKGAke2ZpZWxkfTpiZXN0LmApXG5cbiAgICAgICAgaWYgKCFmb3JtYXRzKSBmb3JtYXRzID0ge31cblxuICAgICAgICBmb3JtYXRzW2ZpZWxkXSA9ICdiZXN0LidcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBmaXJzdEZvdW5kVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICAgICAgbGV0IGhhc01peGVkVHlwZXM6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICBsZXQgcm93TnVtRXJyb3I6IG51bWJlciA9IC0xXG5cbiAgICAgICAgY29uc3QgbG9uZ2VzdFZhbHVlRm9yRmllbGQgPSB0YWJsZVxuICAgICAgICAgIC5tYXAoKHJvdzogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocm93W2ZpZWxkXSB8fCByb3dbZmllbGRdID09PSAnJykge1xuICAgICAgICAgICAgICBpZiAoZmlyc3RGb3VuZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZpZWxkVHlwZSA9XG4gICAgICAgICAgICAgICAgICByb3dbZmllbGRdID09PSAnJyB8fCB0eXBlb2Ygcm93W2ZpZWxkXSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyAnY2hhcnMnXG4gICAgICAgICAgICAgICAgICAgIDogJ251bWJlcidcblxuICAgICAgICAgICAgICAgIGlmICghaGFzTWl4ZWRUeXBlcykge1xuICAgICAgICAgICAgICAgICAgaGFzTWl4ZWRUeXBlcyA9IGN1cnJlbnRGaWVsZFR5cGUgIT09IGZpcnN0Rm91bmRUeXBlXG4gICAgICAgICAgICAgICAgICByb3dOdW1FcnJvciA9IGhhc01peGVkVHlwZXMgPyBpbmRleCArIDEgOiAtMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2ZpZWxkXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgIGZpcnN0Rm91bmRUeXBlID0gJ2NoYXJzJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmaXJzdEZvdW5kVHlwZSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByb3dbZmllbGRdID09PSAnc3RyaW5nJyA/ICdjaGFycycgOiAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBieXRlU2l6ZVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm93W2ZpZWxkXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBieXRlU2l6ZSA9IGdldEJ5dGVTaXplKHJvd1tmaWVsZF0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gYnl0ZVNpemVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYiAtIGEpWzBdXG5cbiAgICAgICAgaWYgKGxvbmdlc3RWYWx1ZUZvckZpZWxkICYmIGxvbmdlc3RWYWx1ZUZvckZpZWxkID4gMzI3NjUpIHtcbiAgICAgICAgICBpbnZhbGlkU3RyaW5nID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc01peGVkVHlwZXMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFJvdyAoJHtyb3dOdW1FcnJvcn0pLCBDb2x1bW4gKCR7ZmllbGR9KSBoYXMgbWl4ZWQgdHlwZXM6IEVSUk9SYFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGhlYWRlcnMucHVzaChcbiAgICAgICAgICBgJHtmaWVsZH06JHtmaXJzdEZvdW5kVHlwZSA9PT0gJ2NoYXJzJyA/ICckY2hhcicgOiAnJ30ke1xuICAgICAgICAgICAgbG9uZ2VzdFZhbHVlRm9yRmllbGRcbiAgICAgICAgICAgICAgPyBsb25nZXN0VmFsdWVGb3JGaWVsZFxuICAgICAgICAgICAgICA6IGZpcnN0Rm91bmRUeXBlID09PSAnY2hhcnMnXG4gICAgICAgICAgICAgICAgPyAnMSdcbiAgICAgICAgICAgICAgICA6ICdiZXN0J1xuICAgICAgICAgIH0uYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIGlmIChmb3JtYXRzKSB7XG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc29ydChcbiAgICAgIChhLCBiKSA9PlxuICAgICAgICBoZWFkZXJGaWVsZHMuaW5kZXhPZihhLnJlcGxhY2UoLzouKi8sICcnKSkgLVxuICAgICAgICBoZWFkZXJGaWVsZHMuaW5kZXhPZihiLnJlcGxhY2UoLzouKi8sICcnKSlcbiAgICApXG4gIH1cblxuICBpZiAoaW52YWxpZFN0cmluZykgcmV0dXJuICdFUlJPUjogTEFSR0UgU1RSSU5HIExFTkdUSCdcblxuICBjc3ZUZXN0ID0gdGFibGUubWFwKChyb3c6IGFueSkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHJvdykubWFwKChmaWVsZE5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gcm93W2ZpZWxkTmFtZV1cblxuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2VsbCA9PT0gJ251bWJlcicpIHJldHVybiBjdXJyZW50Q2VsbFxuXG4gICAgICAvLyBzdHJpbmdpZnkgd2l0aCByZXBsYWNlciBjb252ZXJ0cyBudWxsIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzXG4gICAgICB2YWx1ZSA9IGN1cnJlbnRDZWxsID09PSBudWxsID8gJycgOiBjdXJyZW50Q2VsbFxuXG4gICAgICBpZiAoZm9ybWF0cyAmJiBmb3JtYXRzW2ZpZWxkTmFtZV0gPT09ICdiZXN0LicpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICFpc1NwZWNpYWxNaXNzaW5nKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBIFNwZWNpYWwgbWlzc2luZyB2YWx1ZSBjYW4gb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSAnQScgdG8gJ1onLCAnXycsICcuW2Etel0nLCAnLl8nYFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvdCA9IHZhbHVlLmluY2x1ZGVzKCcuJykgPyAnJyA6ICcuJ1xuXG4gICAgICAgIHJldHVybiBgJHtkb3R9JHt2YWx1ZS50b0xvd2VyQ2FzZSgpfWBcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlcmUgYW55IHByZXNlbnQsIGl0IHNob3VsZCBoYXZlIHByZWNlZGluZyAoXCIpIGZvciBlc2NhcGluZ1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBgXCJcImApXG5cbiAgICAgIC8vIGFsc28gd3JhcHMgdGhlIHZhbHVlIGluIGRvdWJsZSBxdW90ZXNcbiAgICAgIHZhbHVlID0gYFwiJHt2YWx1ZX1cImBcblxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSkuc2VhcmNoKC8oXFx0fFxcbnxcXHJ8LHxcXCd8XFxcIikvZ20pIDwgMFxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlbW92ZSB3cmFwcGluZyBxdW90ZXMgZm9yIHZhbHVlcyB0aGF0IGRvbid0IGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuL2dtLCAnXFxuJylcblxuICAgICAgaWYgKHZhbHVlID09PSAnJyAmJiBoZWFkZXJzW2luZGV4XS5pbmNsdWRlcygnYmVzdCcpKSB7XG4gICAgICAgIHZhbHVlID0gJy4nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0pXG4gICAgcmV0dXJuIGZpZWxkcy5qb2luKCcsJylcbiAgfSlcblxuICBsZXQgZmluYWxDU1YgPVxuICAgIGhlYWRlcnMuam9pbignLCcpLnJlcGxhY2UoLywvZywgJyAnKSArICdcXHJcXG4nICsgY3N2VGVzdC5qb2luKCdcXHJcXG4nKVxuXG4gIHJldHVybiBmaW5hbENTVlxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0YWJsZSBpcyB0YWJsZSBvZiBmb3JtYXRzICh0YWJsZSBuYW1lIHNob3VsZCBzdGFydCBmcm9tICckJyBjaGFyYWN0ZXIpLlxuICogQHBhcmFtIHRhYmxlTmFtZSAtIHRhYmxlIG5hbWUuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Zvcm1hdHNUYWJsZSA9ICh0YWJsZU5hbWU6IHN0cmluZykgPT4gL15cXCQuKi8udGVzdCh0YWJsZU5hbWUpXG5cbmNvbnN0IGdldEJ5dGVTaXplID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gIGxldCBieXRlU2l6ZSA9IHN0ci5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IHN0ci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlID4gMHg3ZiAmJiBjb2RlIDw9IDB4N2ZmKSBieXRlU2l6ZSsrXG4gICAgZWxzZSBpZiAoY29kZSA+IDB4N2ZmICYmIGNvZGUgPD0gMHhmZmZmKSBieXRlU2l6ZSArPSAyXG4gICAgaWYgKGNvZGUgPj0gMHhkYzAwICYmIGNvZGUgPD0gMHhkZmZmKSBpLS0gLy90cmFpbCBzdXJyb2dhdGVcbiAgfVxuICByZXR1cm4gYnl0ZVNpemVcbn1cbiIsImltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQXhpb3NJbnN0YW5jZSA9IChcbiAgYmFzZVVSTDogc3RyaW5nLFxuICBodHRwc0FnZW50PzogaHR0cHMuQWdlbnRcbikgPT4gYXhpb3MuY3JlYXRlKHsgYmFzZVVSTCwgaHR0cHNBZ2VudCB9KVxuIiwiZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbiIsImltcG9ydCB7IFJlcXVlc3RDbGllbnQgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RDbGllbnQnXG5pbXBvcnQgeyBwcmVmaXhNZXNzYWdlIH0gZnJvbSAnQHNhc2pzL3V0aWxzL2Vycm9yJ1xuXG4vKipcbiAqIEZldGNoZXMgY29udGVudCBvZiB0aGUgbG9nIGZpbGVcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXF1ZXN0Q2xpZW50IC0gY2xpZW50IG9iamVjdCBvZiBSZXF1ZXN0IENsaWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY2Nlc3NUb2tlbiAtIGFuIGFjY2VzcyB0b2tlbiBmb3IgYW4gYXV0aG9yaXplZCB1c2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IGxvZ1VybCAtIHVybCBvZiB0aGUgbG9nIGZpbGUuXG4gKiBAcGFyYW0ge251bWJlcn0gbG9nQ291bnQtIHRvdGFsIG51bWJlciBvZiBsb2cgbGluZXMgaW4gZmlsZS5cbiAqIEByZXR1cm5zIGFuIHN0cmluZyBjb250YWluaW5nIGxvZyBsaW5lcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZldGNoTG9nQnlDaHVua3MgPSBhc3luYyAoXG4gIHJlcXVlc3RDbGllbnQ6IFJlcXVlc3RDbGllbnQsXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIGxvZ1VybDogc3RyaW5nLFxuICBsb2dDb3VudDogbnVtYmVyXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICByZXR1cm4gYXdhaXQgZmV0Y2hMb2cocmVxdWVzdENsaWVudCwgYWNjZXNzVG9rZW4sIGxvZ1VybCwgMCwgbG9nQ291bnQpXG59XG5cbi8qKlxuICogRmV0Y2hlcyBhIHNlY3Rpb24gb2YgdGhlIGxvZyBmaWxlIGRlbGluZWF0ZWQgYnkgc3RhcnQgYW5kIGVuZCBsaW5lc1xuICogQHBhcmFtIHtvYmplY3R9IHJlcXVlc3RDbGllbnQgLSBjbGllbnQgb2JqZWN0IG9mIFJlcXVlc3QgQ2xpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGFjY2Vzc1Rva2VuIC0gYW4gYWNjZXNzIHRva2VuIGZvciBhbiBhdXRob3JpemVkIHVzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9nVXJsIC0gdXJsIG9mIHRoZSBsb2cgZmlsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIHRoZSBsaW5lIGF0IHdoaWNoIHRvIHN0YXJ0IGZldGNoaW5nIHRoZSBsb2cuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gdGhlIGxpbmUgYXQgd2hpY2ggdG8gc3RvcCBmZXRjaGluZyB0aGUgbG9nLlxuICogQHJldHVybnMgYW4gc3RyaW5nIGNvbnRhaW5pbmcgbG9nIGxpbmVzLlxuICovXG5leHBvcnQgY29uc3QgZmV0Y2hMb2cgPSBhc3luYyAoXG4gIHJlcXVlc3RDbGllbnQ6IFJlcXVlc3RDbGllbnQsXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIGxvZ1VybDogc3RyaW5nLFxuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgbG9nZ2VyID0gcHJvY2Vzcy5sb2dnZXIgfHwgY29uc29sZVxuXG4gIGxldCBsb2c6IHN0cmluZyA9ICcnXG5cbiAgY29uc3QgbG9nbGltaXQgPSBlbmQgPCAxMDAwMCA/IGVuZCA6IDEwMDAwXG4gIGRvIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBGZXRjaGluZyBsb2dzIGZyb20gbGluZSBubzogJHtzdGFydCArIDF9IHRvICR7XG4gICAgICAgIHN0YXJ0ICsgbG9nbGltaXRcbiAgICAgIH0gb2YgJHtlbmR9LmBcbiAgICApXG4gICAgY29uc3QgbG9nQ2h1bmtKc29uID0gYXdhaXQgcmVxdWVzdENsaWVudCFcbiAgICAgIC5nZXQ8YW55PihgJHtsb2dVcmx9P3N0YXJ0PSR7c3RhcnR9JmxpbWl0PSR7bG9nbGltaXR9YCwgYWNjZXNzVG9rZW4pXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcy5yZXN1bHQpXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aHJvdyBwcmVmaXhNZXNzYWdlKGVyciwgJ0Vycm9yIHdoaWxlIGdldHRpbmcgbG9nLiAnKVxuICAgICAgfSlcblxuICAgIGlmIChsb2dDaHVua0pzb24uaXRlbXMubGVuZ3RoID09PSAwKSBicmVha1xuXG4gICAgY29uc3QgbG9nQ2h1bmsgPSBsb2dDaHVua0pzb24uaXRlbXMubWFwKChpOiBhbnkpID0+IGkubGluZSkuam9pbignXFxuJylcbiAgICBsb2cgKz0gbG9nQ2h1bmtcblxuICAgIHN0YXJ0ICs9IGxvZ2xpbWl0XG4gIH0gd2hpbGUgKHN0YXJ0IDwgZW5kKVxuICByZXR1cm4gbG9nXG59XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLydcbmltcG9ydCBOb2RlRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJ1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9ybURhdGEgPSAoKTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEgPT5cbiAgaXNOb2RlKCkgPyBuZXcgTm9kZUZvcm1EYXRhKCkgOiBuZXcgRm9ybURhdGEoKVxuIiwiaW50ZXJmYWNlIElFbmF2aWdhdG9yIHtcbiAgdXNlckxhbmd1YWdlPzogc3RyaW5nXG59XG5cbi8qKlxuICogUHJvdmlkZXMgcHJlZmVycmVkIGxhbmd1YWdlIG9mIHRoZSB1c2VyLlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2Ugb2YgdGhlIHVzZXIsIHVzdWFsbHkgdGhlIGxhbmd1YWdlIG9mIHRoZSBicm93c2VyIFVJLiBFeGFtcGxlcyBvZiB2YWxpZCBsYW5ndWFnZSBjb2RlcyBpbmNsdWRlIFwiZW5cIiwgXCJlbi1VU1wiLCBcImZyXCIsIFwiZnItRlJcIiwgXCJlcy1FU1wiLiBNb3JlIGluZm8gYXZhaWxhYmxlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTY0NlxuICovXG5leHBvcnQgY29uc3QgZ2V0VXNlckxhbmd1YWdlID0gKCkgPT5cbiAgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSB8fCAod2luZG93Lm5hdmlnYXRvciBhcyBJRW5hdmlnYXRvcikudXNlckxhbmd1YWdlXG4iLCJpbXBvcnQgeyBKc29uUGFyc2VBcnJheUVycm9yLCBJbnZhbGlkSnNvbkVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuXG4vKipcbiAqIGlmIHN0cmluZyBwYXNzZWQgdGhlbiBwYXJzZSB0aGUgc3RyaW5nIHRvIGpzb24gZWxzZSBpZiB0aHJvdyBlcnJvciBmb3IgYWxsIG90aGVyIHR5cGVzIHVubGVzcyBpdCBpcyBub3QgYSB2YWxpZCBqc29uIG9iamVjdC5cbiAqIEBwYXJhbSBzdHIgLSBzdHJpbmcgdG8gY2hlY2suXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWYWxpZEpzb24gPSAoc3RyOiBzdHJpbmcgfCBvYmplY3QpOiBvYmplY3QgPT4ge1xuICB0cnkge1xuICAgIGlmIChzdHIgPT09IG51bGwgfHwgc3RyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBJbnZhbGlkSnNvbkVycm9yKClcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHN0cikpIHRocm93IG5ldyBKc29uUGFyc2VBcnJheUVycm9yKClcblxuICAgIGlmICh0eXBlb2Ygc3RyID09PSAnb2JqZWN0JykgcmV0dXJuIHN0clxuXG4gICAgaWYgKHN0ciA9PT0gJycpIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEpzb25QYXJzZUFycmF5RXJyb3IpIHRocm93IGVcblxuICAgIHRocm93IG5ldyBJbnZhbGlkSnNvbkVycm9yKClcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9hcHBlbmRFeHRyYVJlc3BvbnNlQXR0cmlidXRlcydcbmV4cG9ydCAqIGZyb20gJy4vYXN5bmNGb3JFYWNoJ1xuZXhwb3J0ICogZnJvbSAnLi9jb21wYXJlVGltZXN0YW1wcydcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydFRvQ3N2J1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGVBeGlvc0luc3RhbmNlJ1xuZXhwb3J0ICogZnJvbSAnLi9kZWxheSdcbmV4cG9ydCAqIGZyb20gJy4vZmV0Y2hMb2dCeUNodW5rcydcbmV4cG9ydCAqIGZyb20gJy4vZ2V0VmFsaWRKc29uJ1xuZXhwb3J0ICogZnJvbSAnLi9pc05vZGUnXG5leHBvcnQgKiBmcm9tICcuL2lzUmVsYXRpdmVQYXRoJ1xuZXhwb3J0ICogZnJvbSAnLi9pc1VyaSdcbmV4cG9ydCAqIGZyb20gJy4vaXNVcmwnXG5leHBvcnQgKiBmcm9tICcuL25lZWRzUmV0cnknXG5leHBvcnQgKiBmcm9tICcuL3BhcnNlR2VuZXJhdGVkQ29kZSdcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2VTYXNWaXlhTG9nJ1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZVNvdXJjZUNvZGUnXG5leHBvcnQgKiBmcm9tICcuL3BhcnNlVml5YURlYnVnUmVzcG9uc2UnXG5leHBvcnQgKiBmcm9tICcuL3BhcnNlVml5YUxvZ0RlYnVnUmVzcG9uc2UnXG5leHBvcnQgKiBmcm9tICcuL3BhcnNlV2Vib3V0UmVzcG9uc2UnXG5leHBvcnQgKiBmcm9tICcuL3NlcmlhbGl6ZSdcbmV4cG9ydCAqIGZyb20gJy4vc3BsaXRDaHVua3MnXG5leHBvcnQgKiBmcm9tICcuL3ZhbGlkYXRlSW5wdXQnXG5leHBvcnQgKiBmcm9tICcuL2dldEZvcm1EYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9nZXRVc2VyTGFuZ3VhZ2UnXG4iLCJleHBvcnQgY29uc3QgaXNOb2RlID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG4gIHByb2Nlc3MudmVyc2lvbnMgIT0gbnVsbCAmJlxuICBwcm9jZXNzLnZlcnNpb25zLm5vZGUgIT0gbnVsbFxuIiwiZXhwb3J0IGNvbnN0IGlzUmVsYXRpdmVQYXRoID0gKHVyaTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAhIXVyaSAmJiAhdXJpLnN0YXJ0c1dpdGgoJy8nKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgc3RyaW5nIGlzIGluIFVSSSBmb3JtYXQuXG4gKiBAcGFyYW0gc3RyIC0gc3RyaW5nIHRvIGNoZWNrLlxuICovXG5leHBvcnQgY29uc3QgaXNVcmkgPSAoc3RyOiBzdHJpbmcpOiBib29sZWFuID0+IC9eXFwvZm9sZGVyc1xcL2ZvbGRlcnNcXC8vLnRlc3Qoc3RyKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgc3RyaW5nIGlzIGluIFVSTCBmb3JtYXQuXG4gKiBAcGFyYW0gc3RyIC0gc3RyaW5nIHRvIGNoZWNrLlxuICovXG5leHBvcnQgY29uc3QgaXNVcmwgPSAoc3RyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3Qgc3VwcG9ydGVkUHJvdG9jb2xzID0gWydodHRwOicsICdodHRwczonXVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChzdHIpXG5cbiAgICBpZiAoIXN1cHBvcnRlZFByb3RvY29scy5pbmNsdWRlcyh1cmwucHJvdG9jb2wpKSByZXR1cm4gZmFsc2VcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsImVudW0gZG9tSURzIHtcbiAgc3R5bGVzID0gJ3Nhc2pzQWRhcHRlclN0eWxlcycsXG4gIG92ZXJsYXkgPSAnc2FzanNBZGFwdGVyTG9naW5Qcm9tcHRCRycsXG4gIGRpYWxvZyA9ICdzYXNqc0FkYXB0ZXJMb2dpblByb21wdCdcbn1cbmNvbnN0IGNzc1ByZWZpeCA9ICdzYXNqcy1hZGFwdGVyJ1xuXG5jb25zdCBjbGFzc2VzID0ge1xuICBwb3BVcDogYCR7Y3NzUHJlZml4fXBvcFVwYCxcbiAgcG9wVXBCRzogYCR7Y3NzUHJlZml4fXBvcFVwQkdgXG59XG5cbmV4cG9ydCBjb25zdCBvcGVuTG9naW5Qcm9tcHQgPSAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgIHN0eWxlLmlkID0gZG9tSURzLnN0eWxlc1xuICAgIHN0eWxlLmlubmVyVGV4dCA9IGNzc0NvbnRlbnRcblxuICAgIGNvbnN0IGxvZ2luUHJvbXB0QkcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIGxvZ2luUHJvbXB0QkcuaWQgPSBkb21JRHMub3ZlcmxheVxuICAgIGxvZ2luUHJvbXB0QkcuY2xhc3NMaXN0LmFkZChjbGFzc2VzLnBvcFVwQkcpXG5cbiAgICBjb25zdCBsb2dpblByb21wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbG9naW5Qcm9tcHQuaWQgPSBkb21JRHMuZGlhbG9nXG4gICAgbG9naW5Qcm9tcHQuY2xhc3NMaXN0LmFkZChjbGFzc2VzLnBvcFVwKVxuXG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMScpXG4gICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1Nlc3Npb24gRXhwaXJlZCEnXG4gICAgbG9naW5Qcm9tcHQuYXBwZW5kQ2hpbGQodGl0bGUpXG5cbiAgICBjb25zdCBkZXNjSG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBjb25zdCBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gICAgZGVzYy5pbm5lclRleHQgPSAnWW91IG5lZWQgdG8gcmVsb2dpbiwgY2xpY2sgT0sgdG8gbG9naW4uJ1xuICAgIGRlc2NIb2xkZXIuYXBwZW5kQ2hpbGQoZGVzYylcbiAgICBsb2dpblByb21wdC5hcHBlbmRDaGlsZChkZXNjSG9sZGVyKVxuXG4gICAgY29uc3QgYnV0dG9uQ2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJylcbiAgICBidXR0b25DYW5jZWwuY2xhc3NMaXN0LmFkZCgnY2FuY2VsJylcbiAgICBidXR0b25DYW5jZWwuaW5uZXJUZXh0ID0gJ0NhbmNlbCdcbiAgICBidXR0b25DYW5jZWwub25jbGljayA9ICgpID0+IHtcbiAgICAgIGNsb3NlTG9naW5Qcm9tcHQoKVxuICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICB9XG4gICAgbG9naW5Qcm9tcHQuYXBwZW5kQ2hpbGQoYnV0dG9uQ2FuY2VsKVxuXG4gICAgY29uc3QgYnV0dG9uT2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKVxuICAgIGJ1dHRvbk9rLmNsYXNzTGlzdC5hZGQoJ2NvbmZpcm0nKVxuICAgIGJ1dHRvbk9rLmlubmVyVGV4dCA9ICdPaydcbiAgICBidXR0b25Pay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgY2xvc2VMb2dpblByb21wdCgpXG4gICAgICByZXNvbHZlKHRydWUpXG4gICAgfVxuICAgIGxvZ2luUHJvbXB0LmFwcGVuZENoaWxkKGJ1dHRvbk9rKVxuXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlKVxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobG9naW5Qcm9tcHRCRylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxvZ2luUHJvbXB0KVxuICB9KVxufVxuY29uc3QgY2xvc2VMb2dpblByb21wdCA9ICgpID0+IHtcbiAgT2JqZWN0LnZhbHVlcyhkb21JRHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgIGVsZW0/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGVsZW0pXG4gIH0pXG5cbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJ1xufVxuXG5jb25zdCBjc3NDb250ZW50ID0gYFxuLiR7Y2xhc3Nlcy5wb3BVcEJHfSAsXG4uJHtjbGFzc2VzLnBvcFVwfSB7XG4gIHotaW5kZXg6IDEwMDAwO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA0MCU7XG4gIGxlZnQ6IDUwJTtcbiAgcGFkZGluZzogMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LWZhbWlseTogJ1BUIFNhbnMnLCBzYW5zLXNlcmlmO1xuICBjb2xvcjogI2ZmZjtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICB6LWluZGV4OiA5OTk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAzMDBweDtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiAzMDBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4uJHtjbGFzc2VzLnBvcFVwfSA+IGgxIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDVweDtcbiAgbWluLWhlaWdodDogNDBweDtcbiAgZm9udC1zaXplOiAxLjJlbTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG4gIGJvcmRlci13aWR0aDogNXB4O1xuICBib3JkZXItY29sb3I6IGJsYWNrO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gPiBkaXYge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLTEwOHB4KTtcbiAgbWFyZ2luOiAwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDUlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6ICNjY2M7XG4gIGJvcmRlci1zdHlsZTogbm9uZSBub25lIHNvbGlkIG5vbmU7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gPiBkaXYgPiBzcGFuIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgd2lkdGg6IDMwMHB4O1xuICBoZWlnaHQ6IDEwOHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4uJHtjbGFzc2VzLnBvcFVwfSAuY2FuY2VsIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uJHtjbGFzc2VzLnBvcFVwfSAuY29uZmlybSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi4ke2NsYXNzZXMucG9wVXB9ID4gYnV0dG9uIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweDtcbiAgd2lkdGg6IDUwJTtcbiAgYm9yZGVyOiAxcHggbm9uZSAjY2NjO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgaGVpZ2h0OiA1MHB4O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDEsIDEsIDEsIDAuMik7XG59XG4uJHtjbGFzc2VzLnBvcFVwfSA+IGJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cbi4ke2NsYXNzZXMucG9wVXBCR30ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgb3BhY2l0eTogMC45NTtcbiAgei1pbmRleDogNTA7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudCgjMDM3OGNkLCAjMDEyMDM2KTtcbn1cbmBcbiIsImV4cG9ydCBjb25zdCBuZWVkc1JldHJ5ID0gKHJlc3BvbnNlVGV4dDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiAoXG4gICAgISFyZXNwb25zZVRleHQgJiZcbiAgICAoKHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnXCJlcnJvckNvZGVcIjo0MDMnKSAmJlxuICAgICAgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdfY3NyZicpICYmXG4gICAgICByZXNwb25zZVRleHQuaW5jbHVkZXMoJ1gtQ1NSRi1UT0tFTicpKSB8fFxuICAgICAgKHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnXCJzdGF0dXNcIjo0MDMnKSAmJlxuICAgICAgICByZXNwb25zZVRleHQuaW5jbHVkZXMoJ1wiZXJyb3JcIjpcIkZvcmJpZGRlblwiJykpIHx8XG4gICAgICAocmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdcInN0YXR1c1wiOjQ0OScpICYmXG4gICAgICAgIHJlc3BvbnNlVGV4dC5pbmNsdWRlcyhcbiAgICAgICAgICAnQXV0aGVudGljYXRpb24gc3VjY2VzcywgcmV0cnkgb3JpZ2luYWwgcmVxdWVzdCdcbiAgICAgICAgKSkpXG4gIClcbn1cbiIsImV4cG9ydCBjb25zdCBwYXJzZUdlbmVyYXRlZENvZGUgPSAobG9nOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgc3RhcnRzV2l0aCA9ICdNUFJJTlQnXG4gIGNvbnN0IGlzR2VuZXJhdGVkQ29kZUxpbmUgPSAobGluZTogc3RyaW5nKSA9PlxuICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoc3RhcnRzV2l0aClcbiAgY29uc3QgbG9nTGluZXMgPSBsb2cuc3BsaXQoJ1xcbicpLmZpbHRlcihpc0dlbmVyYXRlZENvZGVMaW5lKVxuICByZXR1cm4gbG9nTGluZXMuam9pbignXFxyXFxuJylcbn1cbiIsImV4cG9ydCBjb25zdCBwYXJzZVNhc1ZpeWFMb2cgPSAobG9nUmVzcG9uc2U6IHsgaXRlbXM6IGFueVtdIH0pID0+IHtcbiAgbGV0IGxvZ1xuICB0cnkge1xuICAgIGxvZyA9IGxvZ1Jlc3BvbnNlLml0ZW1zXG4gICAgICA/IGxvZ1Jlc3BvbnNlLml0ZW1zLm1hcCgoaSkgPT4gaS5saW5lKS5qb2luKCdcXG4nKVxuICAgICAgOiBKU09OLnN0cmluZ2lmeShsb2dSZXNwb25zZSlcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgdGhlIGxvZyByZXNwb25zZScsIGUpXG4gICAgbG9nID0gbG9nUmVzcG9uc2VcbiAgfVxuICByZXR1cm4gbG9nXG59XG4iLCJleHBvcnQgY29uc3QgcGFyc2VTb3VyY2VDb2RlID0gKGxvZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaXNTb3VyY2VDb2RlTGluZSA9IChsaW5lOiBzdHJpbmcpID0+XG4gICAgbGluZS50cmltKCkuc3Vic3RyaW5nKDAsIDEwKS50cmltU3RhcnQoKS5tYXRjaCgvXlxcZC8pXG4gIGNvbnN0IGxvZ0xpbmVzID0gbG9nLnNwbGl0KCdcXG4nKS5maWx0ZXIoaXNTb3VyY2VDb2RlTGluZSlcbiAgcmV0dXJuIGxvZ0xpbmVzLmpvaW4oJ1xcclxcbicpXG59XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHsgZ2V0VmFsaWRKc29uIH0gZnJvbSAnLi4vdXRpbHMnXG5cbi8qKlxuICogV2hlbiBxdWVyeWluZyBhIFZpeWEgam9iIHVzaW5nIHRoZSBXZWIgYXBwcm9hY2ggKGFzIG9wcG9zZWQgdG8gdXNpbmcgdGhlIEFQSXMpIHdpdGggX0RFQlVHIGVuYWJsZWQsXG4gKiB0aGUgZmlyc3QgcmVzcG9uc2UgY29udGFpbnMgdGhlIGxvZyB3aXRoIHRoZSBjb250ZW50IGluIGFuIGlmcmFtZS4gVGhlcmVmb3JlIHdoZW4gZGVidWcgaXMgZW5hYmxlZCxcbiAqIGFuZCB0aGUgc2VydmVyVHlwZSBpcyBWSVlBLCBhbmQgdXNlQ29tcHV0ZUFwaSBpcyBudWxsIChXRUIpLCB3ZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGVcbiAqIChfd2Vib3V0KSBjb250ZW50IGZyb20gdGhlIGlmcmFtZS5cbiAqIEBwYXJhbSByZXNwb25zZSAtIGZpcnN0IHJlc3BvbnNlIGZyb20gdml5YSBqb2JcbiAqIEBwYXJhbSByZXF1ZXN0Q2xpZW50XG4gKiBAcGFyYW0gc2VydmVyVXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VTYXNWaXlhRGVidWdSZXNwb25zZSA9IGFzeW5jIChcbiAgcmVzcG9uc2U6IHN0cmluZyxcbiAgcmVxdWVzdENsaWVudDogUmVxdWVzdENsaWVudCxcbiAgc2VydmVyVXJsOiBzdHJpbmdcbikgPT4ge1xuICAvLyBPbiB2aXlhIDMuNSwgaWZyYW1lIGlzIGxpa2UgPGlmcmFtZSBzdHlsZT1cIndpZHRoOiA5OSU7IGhlaWdodDogNTAwcHhcIiBzcmM9XCIuLi5cIj48L2lmcmFtZT5cbiAgLy8gT24gdml5YSA0LCBpZnJhbWUgaXMgbGlrZSA8aWZyYW1lIHN0eWxlPVwid2lkdGg6IDk5JTsgaGVpZ2h0OiA1MDBweDsgYmFja2dyb3VuZC1jb2xvcjpDYW52YXM7XCIgc3JjPS4uLj48L2lmcmFtZT5cblxuICBjb25zdCBpZnJhbWVTdGFydCA9IHJlc3BvbnNlLnNwbGl0KFxuICAgIC88aWZyYW1lIHN0eWxlPVwid2lkdGg6IDk5JTsgaGVpZ2h0OiA1MDBweFwiIHNyYz1cInw8aWZyYW1lIHN0eWxlPVwid2lkdGg6IDk5JTsgaGVpZ2h0OiA1MDBweDsgYmFja2dyb3VuZC1jb2xvcjpDYW52YXM7XCIgc3JjPS9cbiAgKVsxXVxuICBjb25zdCBqc29uVXJsID0gaWZyYW1lU3RhcnRcbiAgICA/IGlmcmFtZVN0YXJ0LnNwbGl0KC9cIj48XFwvaWZyYW1lPnw+PFxcL2lmcmFtZT4vKVswXVxuICAgIDogbnVsbFxuICBpZiAoIWpzb25VcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHdlYm91dCBmaWxlIFVSTC4nKVxuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RDbGllbnRcbiAgICAuZ2V0KHNlcnZlclVybCArIGpzb25VcmwsIHVuZGVmaW5lZCwgJ3RleHQvcGxhaW4nKVxuICAgIC50aGVuKChyZXM6IGFueSkgPT4gZ2V0VmFsaWRKc29uKHJlcy5yZXN1bHQpKVxufVxuIiwiaW1wb3J0IHsgZ2V0VmFsaWRKc29uIH0gZnJvbSAnLi9nZXRWYWxpZEpzb24nXG5pbXBvcnQgeyBwYXJzZVdlYm91dFJlc3BvbnNlIH0gZnJvbSAnLi9wYXJzZVdlYm91dFJlc3BvbnNlJ1xuXG4vKipcbiAqIFdoZW4gcXVlcnlpbmcgYSBWaXlhIGpvYiB1c2luZyB0aGUgV2ViIGFwcHJvYWNoIHdpdGggX0RFQlVHPTEyOCAodXNlZCB3aGVuXG4gKiBydW5Bc1Rhc2sgaXMgdHJ1ZSksIHRoZSB3ZWJvdXQgSlNPTiBpcyBpbmxpbmVkIGludG8gdGhlIHJlc3BvbnNlIHZpYTpcbiAqICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYHsuLi59YF0sIHt0eXBlOiAnYXBwbGljYXRpb24vanNvbid9KTtcbiAqIE9uIGFib3J0L2Vycm9yIHBhdGhzIHRoZSBzYW1lIHNoYXBlIGlzIHVzZWQgYnV0IHdpdGggdGV4dC9wbGFpbiBhbmRcbiAqIHdlYm91dEJFR0lOL0VORCBtYXJrZXJzIGFyb3VuZCB0aGUgSlNPTjpcbiAqICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYD4+d2Vib3V0QkVHSU48PFxcbnsuLi59XFxuPj53ZWJvdXRFTkQ8PFxcbmBdLCB7dHlwZTogJ3RleHQvcGxhaW4nfSk7XG4gKiBObyBmb2xsb3ctdXAgcmVxdWVzdCBpcyBuZWVkZWQg4oCUIGV4dHJhY3QgYW5kIHBhcnNlIHRoZSBKU09OIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VTYXNWaXlhTG9nRGVidWdSZXNwb25zZSA9IGFzeW5jIChyZXNwb25zZTogYW55KSA9PiB7XG4gIC8vIElmIHVwc3RyZWFtIGFscmVhZHkgcGFyc2VkIHRoZSByZXNwb25zZSBhcyBKU09OIChvYmplY3QpLCBwYXNzIHRocm91Z2guXG4gIGlmICh0eXBlb2YgcmVzcG9uc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICBjb25zdCBibG9iTWF0Y2ggPSByZXNwb25zZS5tYXRjaChcbiAgICAvbmV3IEJsb2JcXChcXFtgKFtcXHNcXFNdKj8pYFxcXSxcXHMqXFx7dHlwZTpcXHMqJyg/OmFwcGxpY2F0aW9uXFwvanNvbnx0ZXh0XFwvcGxhaW4pJ1xcfVxcKS9cbiAgKVxuICBpZiAoIWJsb2JNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgd2Vib3V0IGJsb2IgaW4gZGVidWcgbG9nIHJlc3BvbnNlLicpXG4gIH1cblxuICBjb25zdCBibG9iQ29udGVudCA9IGJsb2JNYXRjaFsxXVxuICBjb25zdCBzdHJpcHBlZCA9IGJsb2JDb250ZW50LmluY2x1ZGVzKCc+PndlYm91dEJFR0lOPDwnKVxuICAgID8gcGFyc2VXZWJvdXRSZXNwb25zZShibG9iQ29udGVudClcbiAgICA6IGJsb2JDb250ZW50XG5cbiAgcmV0dXJuIGdldFZhbGlkSnNvbihzdHJpcHBlZClcbn1cbiIsImltcG9ydCB7IFdlYm91dFJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi90eXBlcy9lcnJvcnMnXG5cbmV4cG9ydCBjb25zdCBwYXJzZVdlYm91dFJlc3BvbnNlID0gKHJlc3BvbnNlOiBzdHJpbmcsIHVybD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBzYXNSZXNwb25zZSA9ICcnXG5cbiAgaWYgKHJlc3BvbnNlLmluY2x1ZGVzKCc+PndlYm91dEJFR0lOPDwnKSkge1xuICAgIHRyeSB7XG4gICAgICBzYXNSZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgICAgIC5zcGxpdCgnPj53ZWJvdXRCRUdJTjw8JylbMV1cbiAgICAgICAgLnNwbGl0KCc+PndlYm91dEVORDw8JylbMF1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICh1cmwpIHRocm93IG5ldyBXZWJvdXRSZXNwb25zZUVycm9yKHVybClcblxuICAgICAgc2FzUmVzcG9uc2UgPSAnJ1xuICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzYXNSZXNwb25zZVxufVxuIiwiLyoqXG4gKiBEaWN0aW9uYXJ5IHNob3VsZCBjb250YWluIG9ubHkgbGFuZ3VhZ2VzIGluIFNBUyB3aGVyZSBgbG9nb3V0YCB0ZXh0XG4gKiBpcyByZXByZXNlbnRlZCB3aXRoIG1vcmUgdGhlbiBvbmUgd29yZFxuICovXG5jb25zdCBkaWN0aW9uYXJ5ID0gWydMb2cgT2ZmJ11cblxuLyoqXG4gKiBFeHRyYWN0cyB1c2VyIGZ1bGwgbmFtZSBhc3N1bWluZyB0aGUgZmlyc3Qgd29yZCBhZnRlciBcInRpdGxlXCIgbWVhbnMgbG9nIG9mZiBpZiBub3QgZm91bmQgb3RoZXJ3aXNlIGluIHRoZSBkaWN0aW9uYXJ5XG4gKiBAcGFyYW0gcmVzcG9uc2UgU0FTIHJlc3BvbnNlIGNvbnRlbnRcbiAqIEByZXR1cm5zIHVzZXIgZnVsbCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0VXNlckxvbmdOYW1lU2FzOSA9IChyZXNwb25zZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gL1widGl0bGVcIjpcXHM/XCIuKj9cIi9cblxuICBjb25zdCBtYXRjaGVkID0gcmVzcG9uc2U/Lm1hdGNoKHJlZ2V4KVxuICBsZXQgZnVsbE5hbWUgPSBtYXRjaGVkPy5bMF0uc3BsaXQoJzonKVsxXS50cmltKClcbiAgbGV0IGJyZWFrSW5kZXggPSBmdWxsTmFtZT8uaW5kZXhPZignICcpXG5cbiAgaWYgKCFmdWxsTmFtZSkgcmV0dXJuICd1bmtub3duJ1xuXG4gIGRpY3Rpb25hcnkubWFwKChsb2dvdXRXb3JkKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBmdWxsTmFtZT8uaW5kZXhPZihsb2dvdXRXb3JkKSB8fCAtMVxuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGJyZWFrSW5kZXggPSBpbmRleCArIGxvZ291dFdvcmQubGVuZ3RoXG4gICAgfVxuICB9KVxuXG4gIC8vQ3V0IG9ubHkgbmFtZVxuICByZXR1cm4gZnVsbE5hbWUuc2xpY2UoYnJlYWtJbmRleCwgLTEpLnRyaW0oKVxufVxuIiwiZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZSA9IChvYmo6IGFueSkgPT4ge1xuICBjb25zdCBzdHI6IGFueVtdID0gW11cbiAgZm9yIChjb25zdCBwIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgIGlmIChvYmpbcF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IG9ialtwXS5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzdHIucHVzaChlbmNvZGVVUklDb21wb25lbnQocCkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW3BdW2ldKSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtwXSkpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHIuam9pbignJicpXG59XG4iLCJleHBvcnQgY29uc3Qgc3BsaXRDaHVua3MgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHNpemUgPSAxNjAwMFxuXG4gIGNvbnN0IG51bUNodW5rcyA9IE1hdGguY2VpbChjb250ZW50Lmxlbmd0aCAvIHNpemUpXG4gIGNvbnN0IGNodW5rcyA9IG5ldyBBcnJheShudW1DaHVua3MpXG5cbiAgZm9yIChsZXQgaSA9IDAsIG8gPSAwOyBpIDwgbnVtQ2h1bmtzOyArK2ksIG8gKz0gc2l6ZSkge1xuICAgIGNodW5rc1tpXSA9IGNvbnRlbnQuc3Vic3RyKG8sIHNpemUpXG4gIH1cblxuICByZXR1cm4gY2h1bmtzXG59XG4iLCJleHBvcnQgY29uc3QgTU9SRV9JTkZPID1cbiAgJ0ZvciBtb3JlIGluZm8gc2VlIGh0dHBzOi8vc2FzanMuaW8vc2FzanMtYWRhcHRlci8jcmVxdWVzdC1yZXNwb25zZSdcbmV4cG9ydCBjb25zdCBJTlZBTElEX1RBQkxFX1NUUlVDVFVSRSA9IGBQYXJhbWV0ZXIgZGF0YSBjb250YWlucyBpbnZhbGlkIHRhYmxlIHN0cnVjdHVyZS4gJHtNT1JFX0lORk99YFxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBpbnB1dCBkYXRhIHN0cnVjdHVyZSBhbmQgdGFibGUgbmFtaW5nIGNvbnZlbnRpb25cbiAqXG4gKiBAcGFyYW0gZGF0YSBBIGpzb24gb2JqZWN0IHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUgdGFibGVzLCBpdCBjYW4gYWxzbyBiZSBudWxsXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgdHdvIGF0dHJpYnV0ZXM6IDEpIHN0YXR1czogYm9vbGVhbiwgMikgbXNnOiBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSW5wdXQgPSAoXG4gIGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsXG4pOiB7XG4gIHN0YXR1czogYm9vbGVhblxuICBtc2c6IHN0cmluZ1xufSA9PiB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4geyBzdGF0dXM6IHRydWUsIG1zZzogJycgfVxuXG4gIGlmIChnZXRUeXBlKGRhdGEpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgbXNnOiBJTlZBTElEX1RBQkxFX1NUUlVDVFVSRVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzU2FzRm9ybWF0c1RhYmxlID0gKGtleTogc3RyaW5nKSA9PlxuICAgIGtleS5tYXRjaCgvXlxcJC4qLykgJiYgT2JqZWN0LmtleXMoZGF0YSkuaW5jbHVkZXMoa2V5LnJlcGxhY2UoL15cXCQvLCAnJykpXG5cbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eW2EtekEtWl9dLykgJiYgIWlzU2FzRm9ybWF0c1RhYmxlKGtleSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgIG1zZzogJ0ZpcnN0IGxldHRlciBvZiB0YWJsZSBzaG91bGQgYmUgYWxwaGFiZXQgb3IgdW5kZXJzY29yZS4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aMC05X10qJC8pICYmICFpc1Nhc0Zvcm1hdHNUYWJsZShrZXkpKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IGZhbHNlLCBtc2c6ICdUYWJsZSBuYW1lIHNob3VsZCBiZSBhbHBoYW51bWVyaWMuJyB9XG4gICAgfVxuXG4gICAgaWYgKGtleS5sZW5ndGggPiAzMikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgbXNnOiAnTWF4aW11bSBsZW5ndGggZm9yIHRhYmxlIG5hbWUgY291bGQgYmUgMzIgY2hhcmFjdGVycy4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdldFR5cGUoZGF0YVtrZXldKSAhPT0gJ0FycmF5JyAmJiAhaXNTYXNGb3JtYXRzVGFibGUoa2V5KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgbXNnOiBJTlZBTElEX1RBQkxFX1NUUlVDVFVSRVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVTNiBpcyBzdHJpY3RlciBzbyB3ZSBoYWQgdG8gaW5jbHVkZSB0aGUgY2hlY2sgZm9yIHRoZSBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhW2tleV0pIHtcbiAgICAgICAgaWYgKGdldFR5cGUoaXRlbSkgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICBtc2c6IGBUYWJsZSAke2tleX0gY29udGFpbnMgaW52YWxpZCBzdHJ1Y3R1cmUuICR7TU9SRV9JTkZPfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKGl0ZW0pXG4gICAgICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKGl0ZW1bYXR0cmlidXRlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtc2c6IGBBIHJvdyBpbiB0YWJsZSAke2tleX0gY29udGFpbnMgaW52YWxpZCB2YWx1ZS4gQ2FuJ3QgYXNzaWduIHVuZGVmaW5lZCB0byAke2F0dHJpYnV0ZX0uYFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgc3RhdHVzOiB0cnVlLCBtc2c6ICcnIH1cbn1cblxuLyoqXG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHR5cGUgb2YgdmFyaWFibGVcbiAqXG4gKiBAcGFyYW0gZGF0YSBpdCBjb3VsZCBiZSBhbnl0aGluZywgbGlrZSBzdHJpbmcsIGFycmF5LCBvYmplY3QgZXRjLlxuICogQHJldHVybnMgYSBzdHJpbmcgd2hpY2ggdGVsbHMgdGhlIHR5cGUgb2YgaW5wdXQgcGFyYW1ldGVyXG4gKi9cbmNvbnN0IGdldFR5cGUgPSAoZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICByZXR1cm4gJ0FycmF5J1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YVxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ3VycmVudGx5IGluIHN5bmMgd2l0aCBOb2RlLmpzIGxpYi9pbnRlcm5hbC91dGlsL3R5cGVzLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvY29tbWl0LzExMmNjN2MyNzU1MTI1NGFhMmIxNzA5OGZiNzc0ODY3ZjA1ZWQwZDlcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBcmd1bWVudHNPYmplY3QgPSByZXF1aXJlKCdpcy1hcmd1bWVudHMnKTtcbnZhciBpc0dlbmVyYXRvckZ1bmN0aW9uID0gcmVxdWlyZSgnaXMtZ2VuZXJhdG9yLWZ1bmN0aW9uJyk7XG52YXIgd2hpY2hUeXBlZEFycmF5ID0gcmVxdWlyZSgnd2hpY2gtdHlwZWQtYXJyYXknKTtcbnZhciBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCdpcy10eXBlZC1hcnJheScpO1xuXG5mdW5jdGlvbiB1bmN1cnJ5VGhpcyhmKSB7XG4gIHJldHVybiBmLmNhbGwuYmluZChmKTtcbn1cblxudmFyIEJpZ0ludFN1cHBvcnRlZCA9IHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIFN5bWJvbFN1cHBvcnRlZCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnO1xuXG52YXIgT2JqZWN0VG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKTtcblxudmFyIG51bWJlclZhbHVlID0gdW5jdXJyeVRoaXMoTnVtYmVyLnByb3RvdHlwZS52YWx1ZU9mKTtcbnZhciBzdHJpbmdWYWx1ZSA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUudmFsdWVPZik7XG52YXIgYm9vbGVhblZhbHVlID0gdW5jdXJyeVRoaXMoQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZik7XG5cbmlmIChCaWdJbnRTdXBwb3J0ZWQpIHtcbiAgdmFyIGJpZ0ludFZhbHVlID0gdW5jdXJyeVRoaXMoQmlnSW50LnByb3RvdHlwZS52YWx1ZU9mKTtcbn1cblxuaWYgKFN5bWJvbFN1cHBvcnRlZCkge1xuICB2YXIgc3ltYm9sVmFsdWUgPSB1bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO1xufVxuXG5mdW5jdGlvbiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBwcm90b3R5cGVWYWx1ZU9mKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgcHJvdG90eXBlVmFsdWVPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnRzLmlzQXJndW1lbnRzT2JqZWN0ID0gaXNBcmd1bWVudHNPYmplY3Q7XG5leHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBpc0dlbmVyYXRvckZ1bmN0aW9uO1xuZXhwb3J0cy5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG5cbi8vIFRha2VuIGZyb20gaGVyZSBhbmQgbW9kaWZpZWQgZm9yIGJldHRlciBicm93c2VyIHN1cHBvcnRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcC1pcy1wcm9taXNlL2Jsb2IvY2RhMzVhNTEzYmRhMDNmOTc3YWQ1Y2RlM2EwNzlkMjM3ZTgyZDdlZi9pbmRleC5qc1xuZnVuY3Rpb24gaXNQcm9taXNlKGlucHV0KSB7XG5cdHJldHVybiAoXG5cdFx0KFxuXHRcdFx0dHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0XHRpbnB1dCBpbnN0YW5jZW9mIFByb21pc2Vcblx0XHQpIHx8XG5cdFx0KFxuXHRcdFx0aW5wdXQgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiBpbnB1dC50aGVuID09PSAnZnVuY3Rpb24nICYmXG5cdFx0XHR0eXBlb2YgaW5wdXQuY2F0Y2ggPT09ICdmdW5jdGlvbidcblx0XHQpXG5cdCk7XG59XG5leHBvcnRzLmlzUHJvbWlzZSA9IGlzUHJvbWlzZTtcblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGlzVHlwZWRBcnJheSh2YWx1ZSkgfHxcbiAgICBpc0RhdGFWaWV3KHZhbHVlKVxuICApO1xufVxuZXhwb3J0cy5pc0FycmF5QnVmZmVyVmlldyA9IGlzQXJyYXlCdWZmZXJWaWV3O1xuXG5cbmZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ1VpbnQ4QXJyYXknO1xufVxuZXhwb3J0cy5pc1VpbnQ4QXJyYXkgPSBpc1VpbnQ4QXJyYXk7XG5cbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdVaW50OENsYW1wZWRBcnJheSc7XG59XG5leHBvcnRzLmlzVWludDhDbGFtcGVkQXJyYXkgPSBpc1VpbnQ4Q2xhbXBlZEFycmF5O1xuXG5mdW5jdGlvbiBpc1VpbnQxNkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnVWludDE2QXJyYXknO1xufVxuZXhwb3J0cy5pc1VpbnQxNkFycmF5ID0gaXNVaW50MTZBcnJheTtcblxuZnVuY3Rpb24gaXNVaW50MzJBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ1VpbnQzMkFycmF5Jztcbn1cbmV4cG9ydHMuaXNVaW50MzJBcnJheSA9IGlzVWludDMyQXJyYXk7XG5cbmZ1bmN0aW9uIGlzSW50OEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnSW50OEFycmF5Jztcbn1cbmV4cG9ydHMuaXNJbnQ4QXJyYXkgPSBpc0ludDhBcnJheTtcblxuZnVuY3Rpb24gaXNJbnQxNkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnSW50MTZBcnJheSc7XG59XG5leHBvcnRzLmlzSW50MTZBcnJheSA9IGlzSW50MTZBcnJheTtcblxuZnVuY3Rpb24gaXNJbnQzMkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnSW50MzJBcnJheSc7XG59XG5leHBvcnRzLmlzSW50MzJBcnJheSA9IGlzSW50MzJBcnJheTtcblxuZnVuY3Rpb24gaXNGbG9hdDMyQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdGbG9hdDMyQXJyYXknO1xufVxuZXhwb3J0cy5pc0Zsb2F0MzJBcnJheSA9IGlzRmxvYXQzMkFycmF5O1xuXG5mdW5jdGlvbiBpc0Zsb2F0NjRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0Zsb2F0NjRBcnJheSc7XG59XG5leHBvcnRzLmlzRmxvYXQ2NEFycmF5ID0gaXNGbG9hdDY0QXJyYXk7XG5cbmZ1bmN0aW9uIGlzQmlnSW50NjRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0JpZ0ludDY0QXJyYXknO1xufVxuZXhwb3J0cy5pc0JpZ0ludDY0QXJyYXkgPSBpc0JpZ0ludDY0QXJyYXk7XG5cbmZ1bmN0aW9uIGlzQmlnVWludDY0QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdCaWdVaW50NjRBcnJheSc7XG59XG5leHBvcnRzLmlzQmlnVWludDY0QXJyYXkgPSBpc0JpZ1VpbnQ2NEFycmF5O1xuXG5mdW5jdGlvbiBpc01hcFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IE1hcF0nO1xufVxuaXNNYXBUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc01hcFRvU3RyaW5nKG5ldyBNYXAoKSlcbik7XG5cbmZ1bmN0aW9uIGlzTWFwKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc01hcFRvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzTWFwVG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIE1hcDtcbn1cbmV4cG9ydHMuaXNNYXAgPSBpc01hcDtcblxuZnVuY3Rpb24gaXNTZXRUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBTZXRdJztcbn1cbmlzU2V0VG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNTZXRUb1N0cmluZyhuZXcgU2V0KCkpXG4pO1xuZnVuY3Rpb24gaXNTZXQodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzU2V0VG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNTZXRUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgU2V0O1xufVxuZXhwb3J0cy5pc1NldCA9IGlzU2V0O1xuXG5mdW5jdGlvbiBpc1dlYWtNYXBUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBXZWFrTWFwXSc7XG59XG5pc1dlYWtNYXBUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNXZWFrTWFwVG9TdHJpbmcobmV3IFdlYWtNYXAoKSlcbik7XG5mdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc1dlYWtNYXBUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc1dlYWtNYXBUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgV2Vha01hcDtcbn1cbmV4cG9ydHMuaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuXG5mdW5jdGlvbiBpc1dlYWtTZXRUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBXZWFrU2V0XSc7XG59XG5pc1dlYWtTZXRUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNXZWFrU2V0VG9TdHJpbmcobmV3IFdlYWtTZXQoKSlcbik7XG5mdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzV2Vha1NldFRvU3RyaW5nKHZhbHVlKTtcbn1cbmV4cG9ydHMuaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cbmlzQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nID0gKFxuICB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzQXJyYXlCdWZmZXJUb1N0cmluZyhuZXcgQXJyYXlCdWZmZXIoKSlcbik7XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc0FycmF5QnVmZmVyVG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufVxuZXhwb3J0cy5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcblxuZnVuY3Rpb24gaXNEYXRhVmlld1RvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGFWaWV3XSc7XG59XG5pc0RhdGFWaWV3VG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzRGF0YVZpZXdUb1N0cmluZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpLCAwLCAxKSlcbik7XG5mdW5jdGlvbiBpc0RhdGFWaWV3KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzRGF0YVZpZXdUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc0RhdGFWaWV3VG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3O1xufVxuZXhwb3J0cy5pc0RhdGFWaWV3ID0gaXNEYXRhVmlldztcblxuLy8gU3RvcmUgYSBjb3B5IG9mIFNoYXJlZEFycmF5QnVmZmVyIGluIGNhc2UgaXQncyBkZWxldGVkIGVsc2V3aGVyZVxudmFyIFNoYXJlZEFycmF5QnVmZmVyQ29weSA9IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgPyBTaGFyZWRBcnJheUJ1ZmZlciA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl0nO1xufVxuZnVuY3Rpb24gaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyQ29weSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nID09PSAndW5kZWZpbmVkJykge1xuICAgIGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nID0gaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nKG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNvcHkoKSk7XG4gIH1cblxuICByZXR1cm4gaXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSlcbiAgICA6IHZhbHVlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXJDb3B5O1xufVxuZXhwb3J0cy5pc1NoYXJlZEFycmF5QnVmZmVyID0gaXNTaGFyZWRBcnJheUJ1ZmZlcjtcblxuZnVuY3Rpb24gaXNBc3luY0Z1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJztcbn1cbmV4cG9ydHMuaXNBc3luY0Z1bmN0aW9uID0gaXNBc3luY0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc01hcEl0ZXJhdG9yKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IE1hcCBJdGVyYXRvcl0nO1xufVxuZXhwb3J0cy5pc01hcEl0ZXJhdG9yID0gaXNNYXBJdGVyYXRvcjtcblxuZnVuY3Rpb24gaXNTZXRJdGVyYXRvcih2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBTZXQgSXRlcmF0b3JdJztcbn1cbmV4cG9ydHMuaXNTZXRJdGVyYXRvciA9IGlzU2V0SXRlcmF0b3I7XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdG9yT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEdlbmVyYXRvcl0nO1xufVxuZXhwb3J0cy5pc0dlbmVyYXRvck9iamVjdCA9IGlzR2VuZXJhdG9yT2JqZWN0O1xuXG5mdW5jdGlvbiBpc1dlYkFzc2VtYmx5Q29tcGlsZWRNb2R1bGUodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgV2ViQXNzZW1ibHkuTW9kdWxlXSc7XG59XG5leHBvcnRzLmlzV2ViQXNzZW1ibHlDb21waWxlZE1vZHVsZSA9IGlzV2ViQXNzZW1ibHlDb21waWxlZE1vZHVsZTtcblxuZnVuY3Rpb24gaXNOdW1iZXJPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIG51bWJlclZhbHVlKTtcbn1cbmV4cG9ydHMuaXNOdW1iZXJPYmplY3QgPSBpc051bWJlck9iamVjdDtcblxuZnVuY3Rpb24gaXNTdHJpbmdPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIHN0cmluZ1ZhbHVlKTtcbn1cbmV4cG9ydHMuaXNTdHJpbmdPYmplY3QgPSBpc1N0cmluZ09iamVjdDtcblxuZnVuY3Rpb24gaXNCb29sZWFuT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBib29sZWFuVmFsdWUpO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW5PYmplY3QgPSBpc0Jvb2xlYW5PYmplY3Q7XG5cbmZ1bmN0aW9uIGlzQmlnSW50T2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBCaWdJbnRTdXBwb3J0ZWQgJiYgY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgYmlnSW50VmFsdWUpO1xufVxuZXhwb3J0cy5pc0JpZ0ludE9iamVjdCA9IGlzQmlnSW50T2JqZWN0O1xuXG5mdW5jdGlvbiBpc1N5bWJvbE9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gU3ltYm9sU3VwcG9ydGVkICYmIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIHN5bWJvbFZhbHVlKTtcbn1cbmV4cG9ydHMuaXNTeW1ib2xPYmplY3QgPSBpc1N5bWJvbE9iamVjdDtcblxuZnVuY3Rpb24gaXNCb3hlZFByaW1pdGl2ZSh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIGlzTnVtYmVyT2JqZWN0KHZhbHVlKSB8fFxuICAgIGlzU3RyaW5nT2JqZWN0KHZhbHVlKSB8fFxuICAgIGlzQm9vbGVhbk9iamVjdCh2YWx1ZSkgfHxcbiAgICBpc0JpZ0ludE9iamVjdCh2YWx1ZSkgfHxcbiAgICBpc1N5bWJvbE9iamVjdCh2YWx1ZSlcbiAgKTtcbn1cbmV4cG9ydHMuaXNCb3hlZFByaW1pdGl2ZSA9IGlzQm94ZWRQcmltaXRpdmU7XG5cbmZ1bmN0aW9uIGlzQW55QXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiAoXG4gICAgaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHxcbiAgICBpc1NoYXJlZEFycmF5QnVmZmVyKHZhbHVlKVxuICApO1xufVxuZXhwb3J0cy5pc0FueUFycmF5QnVmZmVyID0gaXNBbnlBcnJheUJ1ZmZlcjtcblxuWydpc1Byb3h5JywgJ2lzRXh0ZXJuYWwnLCAnaXNNb2R1bGVOYW1lc3BhY2VPYmplY3QnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbWV0aG9kLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArICcgaXMgbm90IHN1cHBvcnRlZCBpbiB1c2VybGFuZCcpO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIHx8XG4gIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzY3JpcHRvcnNba2V5c1tpXV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgfTtcblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZSZWdleCA9IC9eJC87XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSB7XG4gIHZhciBkZWJ1Z0VudiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUc7XG4gIGRlYnVnRW52ID0gZGVidWdFbnYucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCs/Ll0vZywgJ1xcXFwkJicpXG4gICAgLnJlcGxhY2UoL1xcKi9nLCAnLionKVxuICAgIC5yZXBsYWNlKC8sL2csICckfF4nKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuICBkZWJ1Z0VudlJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBkZWJ1Z0VudiArICckJywgJ2knKTtcbn1cbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAoZGVidWdFbnZSZWdleC50ZXN0KHNldCkpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc2xpY2UoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZXhwb3J0cy50eXBlcyA9IHJlcXVpcmUoJy4vc3VwcG9ydC90eXBlcycpO1xuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuZXhwb3J0cy50eXBlcy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcbmV4cG9ydHMudHlwZXMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5leHBvcnRzLnR5cGVzLmlzTmF0aXZlRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG52YXIga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2woJ3V0aWwucHJvbWlzaWZ5LmN1c3RvbScpIDogdW5kZWZpbmVkO1xuXG5leHBvcnRzLnByb21pc2lmeSA9IGZ1bmN0aW9uIHByb21pc2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9yaWdpbmFsXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG5cbiAgaWYgKGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCAmJiBvcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdKSB7XG4gICAgdmFyIGZuID0gb3JpZ2luYWxba0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ1dGlsLnByb21pc2lmeS5jdXN0b21cIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgZnVuY3Rpb24gZm4oKSB7XG4gICAgdmFyIHByb21pc2VSZXNvbHZlLCBwcm9taXNlUmVqZWN0O1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgcHJvbWlzZVJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUodmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcHJvbWlzZVJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGZuLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcblxuICBpZiAoa0N1c3RvbVByb21pc2lmaWVkU3ltYm9sKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuICAgIHZhbHVlOiBmbiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgZm4sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbClcbiAgKTtcbn1cblxuZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0ga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5T25SZWplY3RlZChyZWFzb24sIGNiKSB7XG4gIC8vIGAhcmVhc29uYCBndWFyZCBpbnNwaXJlZCBieSBibHVlYmlyZCAoUmVmOiBodHRwczovL2dvby5nbC90NUlTNk0pLlxuICAvLyBCZWNhdXNlIGBudWxsYCBpcyBhIHNwZWNpYWwgZXJyb3IgdmFsdWUgaW4gY2FsbGJhY2tzIHdoaWNoIG1lYW5zIFwibm8gZXJyb3JcbiAgLy8gb2NjdXJyZWRcIiwgd2UgZXJyb3Itd3JhcCBzbyB0aGUgY2FsbGJhY2sgY29uc3VtZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW5cbiAgLy8gXCJ0aGUgcHJvbWlzZSByZWplY3RlZCB3aXRoIG51bGxcIiBvciBcInRoZSBwcm9taXNlIGZ1bGZpbGxlZCB3aXRoIHVuZGVmaW5lZFwiLlxuICBpZiAoIXJlYXNvbikge1xuICAgIHZhciBuZXdSZWFzb24gPSBuZXcgRXJyb3IoJ1Byb21pc2Ugd2FzIHJlamVjdGVkIHdpdGggYSBmYWxzeSB2YWx1ZScpO1xuICAgIG5ld1JlYXNvbi5yZWFzb24gPSByZWFzb247XG4gICAgcmVhc29uID0gbmV3UmVhc29uO1xuICB9XG4gIHJldHVybiBjYihyZWFzb24pO1xufVxuXG5mdW5jdGlvbiBjYWxsYmFja2lmeShvcmlnaW5hbCkge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3JpZ2luYWxcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgfVxuXG4gIC8vIFdlIERPIE5PVCByZXR1cm4gdGhlIHByb21pc2UgYXMgaXQgZ2l2ZXMgdGhlIHVzZXIgYSBmYWxzZSBzZW5zZSB0aGF0XG4gIC8vIHRoZSBwcm9taXNlIGlzIGFjdHVhbGx5IHNvbWVob3cgcmVsYXRlZCB0byB0aGUgY2FsbGJhY2sncyBleGVjdXRpb25cbiAgLy8gYW5kIHRoYXQgdGhlIGNhbGxiYWNrIHRocm93aW5nIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlLlxuICBmdW5jdGlvbiBjYWxsYmFja2lmaWVkKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIHZhciBtYXliZUNiID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIG1heWJlQ2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWF5YmVDYi5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLy8gSW4gdHJ1ZSBub2RlIHN0eWxlIHdlIHByb2Nlc3MgdGhlIGNhbGxiYWNrIG9uIGBuZXh0VGlja2Agd2l0aCBhbGwgdGhlXG4gICAgLy8gaW1wbGljYXRpb25zIChzdGFjaywgYHVuY2F1Z2h0RXhjZXB0aW9uYCwgYGFzeW5jX2hvb2tzYClcbiAgICBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24ocmV0KSB7IHByb2Nlc3MubmV4dFRpY2soY2IuYmluZChudWxsLCBudWxsLCByZXQpKSB9LFxuICAgICAgICAgICAgZnVuY3Rpb24ocmVqKSB7IHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2tpZnlPblJlamVjdGVkLmJpbmQobnVsbCwgcmVqLCBjYikpIH0pO1xuICB9XG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGNhbGxiYWNraWZpZWQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjYWxsYmFja2lmaWVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKSk7XG4gIHJldHVybiBjYWxsYmFja2lmaWVkO1xufVxuZXhwb3J0cy5jYWxsYmFja2lmeSA9IGNhbGxiYWNraWZ5O1xuIiwiKGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIG1vZHVsZS5leHBvcnRzLmlzX3VyaSA9IGlzX2lyaTtcbiAgICBtb2R1bGUuZXhwb3J0cy5pc19odHRwX3VyaSA9IGlzX2h0dHBfaXJpO1xuICAgIG1vZHVsZS5leHBvcnRzLmlzX2h0dHBzX3VyaSA9IGlzX2h0dHBzX2lyaTtcbiAgICBtb2R1bGUuZXhwb3J0cy5pc193ZWJfdXJpID0gaXNfd2ViX2lyaTtcbiAgICAvLyBDcmVhdGUgYWxpYXNlc1xuICAgIG1vZHVsZS5leHBvcnRzLmlzVXJpID0gaXNfaXJpO1xuICAgIG1vZHVsZS5leHBvcnRzLmlzSHR0cFVyaSA9IGlzX2h0dHBfaXJpO1xuICAgIG1vZHVsZS5leHBvcnRzLmlzSHR0cHNVcmkgPSBpc19odHRwc19pcmk7XG4gICAgbW9kdWxlLmV4cG9ydHMuaXNXZWJVcmkgPSBpc193ZWJfaXJpO1xuXG5cbiAgICAvLyBwcml2YXRlIGZ1bmN0aW9uXG4gICAgLy8gaW50ZXJuYWwgVVJJIHNwaXR0ZXIgbWV0aG9kIC0gZGlyZWN0IGZyb20gUkZDIDM5ODZcbiAgICB2YXIgc3BsaXRVcmkgPSBmdW5jdGlvbih1cmkpIHtcbiAgICAgICAgdmFyIHNwbGl0dGVkID0gdXJpLm1hdGNoKC8oPzooW146XFwvPyNdKyk6KT8oPzpcXC9cXC8oW15cXC8/I10qKSk/KFtePyNdKikoPzpcXD8oW14jXSopKT8oPzojKC4qKSk/Lyk7XG4gICAgICAgIHJldHVybiBzcGxpdHRlZDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNfaXJpKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICAgICAgaWYgKC9bXmEtejAtOVxcOlxcL1xcP1xcI1xcW1xcXVxcQFxcIVxcJFxcJlxcJ1xcKFxcKVxcKlxcK1xcLFxcO1xcPVxcLlxcLVxcX1xcflxcJV0vaS50ZXN0KHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNoZWNrIGZvciBoZXggZXNjYXBlcyB0aGF0IGFyZW4ndCBjb21wbGV0ZVxuICAgICAgICBpZiAoLyVbXjAtOWEtZl0vaS50ZXN0KHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoLyVbMC05YS1mXSg6P1teMC05YS1mXXwkKS9pLnRlc3QodmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHNwbGl0dGVkID0gW107XG4gICAgICAgIHZhciBzY2hlbWUgPSAnJztcbiAgICAgICAgdmFyIGF1dGhvcml0eSA9ICcnO1xuICAgICAgICB2YXIgcGF0aCA9ICcnO1xuICAgICAgICB2YXIgcXVlcnkgPSAnJztcbiAgICAgICAgdmFyIGZyYWdtZW50ID0gJyc7XG4gICAgICAgIHZhciBvdXQgPSAnJztcblxuICAgICAgICAvLyBmcm9tIFJGQyAzOTg2XG4gICAgICAgIHNwbGl0dGVkID0gc3BsaXRVcmkodmFsdWUpO1xuICAgICAgICBzY2hlbWUgPSBzcGxpdHRlZFsxXTsgXG4gICAgICAgIGF1dGhvcml0eSA9IHNwbGl0dGVkWzJdO1xuICAgICAgICBwYXRoID0gc3BsaXR0ZWRbM107XG4gICAgICAgIHF1ZXJ5ID0gc3BsaXR0ZWRbNF07XG4gICAgICAgIGZyYWdtZW50ID0gc3BsaXR0ZWRbNV07XG5cbiAgICAgICAgLy8gc2NoZW1lIGFuZCBwYXRoIGFyZSByZXF1aXJlZCwgdGhvdWdoIHRoZSBwYXRoIGNhbiBiZSBlbXB0eVxuICAgICAgICBpZiAoIShzY2hlbWUgJiYgc2NoZW1lLmxlbmd0aCAmJiBwYXRoLmxlbmd0aCA+PSAwKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlmIGF1dGhvcml0eSBpcyBwcmVzZW50LCB0aGUgcGF0aCBtdXN0IGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSAvXG4gICAgICAgIGlmIChhdXRob3JpdHkgJiYgYXV0aG9yaXR5Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCEocGF0aC5sZW5ndGggPT09IDAgfHwgL15cXC8vLnRlc3QocGF0aCkpKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBhdXRob3JpdHkgaXMgbm90IHByZXNlbnQsIHRoZSBwYXRoIG11c3Qgbm90IHN0YXJ0IHdpdGggLy9cbiAgICAgICAgICAgIGlmICgvXlxcL1xcLy8udGVzdChwYXRoKSkgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2NoZW1lIG11c3QgYmVnaW4gd2l0aCBhIGxldHRlciwgdGhlbiBjb25zaXN0IG9mIGxldHRlcnMsIGRpZ2l0cywgKywgLiwgb3IgLVxuICAgICAgICBpZiAoIS9eW2Etel1bYS16MC05XFwrXFwtXFwuXSokLy50ZXN0KHNjaGVtZS50b0xvd2VyQ2FzZSgpKSkgIHJldHVybjtcblxuICAgICAgICAvLyByZS1hc3NlbWJsZSB0aGUgVVJMIHBlciBzZWN0aW9uIDUuMyBpbiBSRkMgMzk4NlxuICAgICAgICBvdXQgKz0gc2NoZW1lICsgJzonO1xuICAgICAgICBpZiAoYXV0aG9yaXR5ICYmIGF1dGhvcml0eS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG91dCArPSAnLy8nICsgYXV0aG9yaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ICs9IHBhdGg7XG5cbiAgICAgICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCkge1xuICAgICAgICAgICAgb3V0ICs9ICc/JyArIHF1ZXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWdtZW50ICYmIGZyYWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgb3V0ICs9ICcjJyArIGZyYWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc19odHRwX2lyaSh2YWx1ZSwgYWxsb3dIdHRwcykge1xuICAgICAgICBpZiAoIWlzX2lyaSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzcGxpdHRlZCA9IFtdO1xuICAgICAgICB2YXIgc2NoZW1lID0gJyc7XG4gICAgICAgIHZhciBhdXRob3JpdHkgPSAnJztcbiAgICAgICAgdmFyIHBhdGggPSAnJztcbiAgICAgICAgdmFyIHBvcnQgPSAnJztcbiAgICAgICAgdmFyIHF1ZXJ5ID0gJyc7XG4gICAgICAgIHZhciBmcmFnbWVudCA9ICcnO1xuICAgICAgICB2YXIgb3V0ID0gJyc7XG5cbiAgICAgICAgLy8gZnJvbSBSRkMgMzk4NlxuICAgICAgICBzcGxpdHRlZCA9IHNwbGl0VXJpKHZhbHVlKTtcbiAgICAgICAgc2NoZW1lID0gc3BsaXR0ZWRbMV07IFxuICAgICAgICBhdXRob3JpdHkgPSBzcGxpdHRlZFsyXTtcbiAgICAgICAgcGF0aCA9IHNwbGl0dGVkWzNdO1xuICAgICAgICBxdWVyeSA9IHNwbGl0dGVkWzRdO1xuICAgICAgICBmcmFnbWVudCA9IHNwbGl0dGVkWzVdO1xuXG4gICAgICAgIGlmICghc2NoZW1lKSAgcmV0dXJuO1xuXG4gICAgICAgIGlmKGFsbG93SHR0cHMpIHtcbiAgICAgICAgICAgIGlmIChzY2hlbWUudG9Mb3dlckNhc2UoKSAhPSAnaHR0cHMnKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2h0dHAnKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmdWxseS1xdWFsaWZpZWQgVVJJcyBtdXN0IGhhdmUgYW4gYXV0aG9yaXR5IHNlY3Rpb24gdGhhdCBpc1xuICAgICAgICAvLyBhIHZhbGlkIGhvc3RcbiAgICAgICAgaWYgKCFhdXRob3JpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuYWJsZSBwb3J0IGNvbXBvbmVudFxuICAgICAgICBpZiAoLzooXFxkKykkLy50ZXN0KGF1dGhvcml0eSkpIHtcbiAgICAgICAgICAgIHBvcnQgPSBhdXRob3JpdHkubWF0Y2goLzooXFxkKykkLylbMF07XG4gICAgICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkucmVwbGFjZSgvOlxcZCskLywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ICs9IHNjaGVtZSArICc6JztcbiAgICAgICAgb3V0ICs9ICcvLycgKyBhdXRob3JpdHk7XG4gICAgICAgIFxuICAgICAgICBpZiAocG9ydCkge1xuICAgICAgICAgICAgb3V0ICs9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG91dCArPSBwYXRoO1xuICAgICAgICBcbiAgICAgICAgaWYocXVlcnkgJiYgcXVlcnkubGVuZ3RoKXtcbiAgICAgICAgICAgIG91dCArPSAnPycgKyBxdWVyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGZyYWdtZW50ICYmIGZyYWdtZW50Lmxlbmd0aCl7XG4gICAgICAgICAgICBvdXQgKz0gJyMnICsgZnJhZ21lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNfaHR0cHNfaXJpKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc19odHRwX2lyaSh2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNfd2ViX2lyaSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKGlzX2h0dHBfaXJpKHZhbHVlKSB8fCBpc19odHRwc19pcmkodmFsdWUpKTtcbiAgICB9XG5cbn0pKG1vZHVsZSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKTtcbnZhciBhdmFpbGFibGVUeXBlZEFycmF5cyA9IHJlcXVpcmUoJ2F2YWlsYWJsZS10eXBlZC1hcnJheXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnZ2V0LXByb3RvJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcbnZhciB0eXBlZEFycmF5cyA9IGF2YWlsYWJsZVR5cGVkQXJyYXlzKCk7XG5cbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcblxuLyoqIEBpbXBvcnQgeyBCb3VuZFNldCwgQm91bmRTbGljZSwgQ2FjaGUsIEdldHRlciB9IGZyb20gJy4vdHlwZXMnICovXG4vKiogQGltcG9ydCB7IFR5cGVkQXJyYXlOYW1lIH0gZnJvbSAnLicgKi9cblxuLyoqIEB0eXBlIHs8VCA9IHVua25vd24+KGFycmF5OiByZWFkb25seSBUW10sIHZhbHVlOiB1bmtub3duKSA9PiBudW1iZXJ9ICovXG52YXIgJGluZGV4T2YgPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5pbmRleE9mJywgdHJ1ZSkgfHwgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gLTE7XG59O1xuXG4vKiogQHR5cGUge0NhY2hlfSAqL1xudmFyIGNhY2hlID0geyBfX3Byb3RvX186IG51bGwgfTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0dmFyIGFyciA9IG5ldyBnW3R5cGVkQXJyYXldKCk7XG5cdFx0aWYgKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBhcnIgJiYgZ2V0UHJvdG8pIHtcblx0XHRcdHZhciBwcm90byA9IGdldFByb3RvKGFycik7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIHdvbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlXG5cdFx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQocHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHRpZiAoIWRlc2NyaXB0b3IgJiYgcHJvdG8pIHtcblx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90byhwcm90byk7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgd29uJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmVcblx0XHRcdFx0ZGVzY3JpcHRvciA9IGdPUEQoc3VwZXJQcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdH1cblx0XHRcdGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZ2V0KSB7XG5cdFx0XHRcdHZhciBib3VuZCA9IGNhbGxCaW5kKGRlc2NyaXB0b3IuZ2V0KTtcblx0XHRcdFx0Y2FjaGVbXG5cdFx0XHRcdFx0LyoqIEB0eXBlIHtgJCR7VHlwZWRBcnJheU5hbWV9YH0gKi9cblx0XHRcdFx0XHQoJyQnICsgdHlwZWRBcnJheSlcblx0XHRcdFx0XSA9IGJvdW5kO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59IGVsc2Uge1xuXHRmb3JFYWNoKHR5cGVkQXJyYXlzLCBmdW5jdGlvbiAodHlwZWRBcnJheSkge1xuXHRcdHZhciBhcnIgPSBuZXcgZ1t0eXBlZEFycmF5XSgpO1xuXHRcdHZhciBmbiA9IGFyci5zbGljZSB8fCBhcnIuc2V0O1xuXHRcdGlmIChmbikge1xuXHRcdFx0dmFyIGJvdW5kID0gLyoqIEB0eXBlIHtCb3VuZFNsaWNlIHwgQm91bmRTZXR9ICovIChcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPIEZJWE1FXG5cdFx0XHRcdGNhbGxCaW5kKGZuKVxuXHRcdFx0KTtcblx0XHRcdGNhY2hlW1xuXHRcdFx0XHQvKiogQHR5cGUge2AkJHtUeXBlZEFycmF5TmFtZX1gfSAqL1xuXHRcdFx0XHQoJyQnICsgdHlwZWRBcnJheSlcblx0XHRcdF0gPSBib3VuZDtcblx0XHR9XG5cdH0pO1xufVxuXG4vKiogQHR5cGUgeyh2YWx1ZTogb2JqZWN0KSA9PiBmYWxzZSB8IFR5cGVkQXJyYXlOYW1lfSAqL1xuZnVuY3Rpb24gdHJ5VHlwZWRBcnJheXModmFsdWUpIHtcblx0LyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cnlUeXBlZEFycmF5cz59ICovIHZhciBmb3VuZCA9IGZhbHNlO1xuXHRmb3JFYWNoKFxuXHRcdC8qKiBAdHlwZSB7UmVjb3JkPGAkJHtUeXBlZEFycmF5TmFtZX1gLCBHZXR0ZXI+fSAqLyAoY2FjaGUpLFxuXHRcdC8qKiBAcGFyYW0ge0dldHRlcn0gZ2V0dGVyIEBwYXJhbSB7YCQke1R5cGVkQXJyYXlOYW1lfWB9IHR5cGVkQXJyYXkgKi9cblx0XHRmdW5jdGlvbiAoZ2V0dGVyLCB0eXBlZEFycmF5KSB7XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBhIHRocm93IGlzIGZpbmUgaGVyZVxuXHRcdFx0XHRcdGlmICgnJCcgKyBnZXR0ZXIodmFsdWUpID09PSB0eXBlZEFycmF5KSB7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IC8qKiBAdHlwZSB7VHlwZWRBcnJheU5hbWV9ICovICgkc2xpY2UodHlwZWRBcnJheSwgMSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkgeyAvKiovIH1cblx0XHRcdH1cblx0XHR9XG5cdCk7XG5cdHJldHVybiBmb3VuZDtcbn1cblxuLyoqIEB0eXBlIHsodmFsdWU6IG9iamVjdCkgPT4gZmFsc2UgfCBUeXBlZEFycmF5TmFtZX0gKi9cbmZ1bmN0aW9uIHRyeVNsaWNlcyh2YWx1ZSkge1xuXHQvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHRyeVNsaWNlcz59ICovIHZhciBmb3VuZCA9IGZhbHNlO1xuXHRmb3JFYWNoKFxuXHRcdC8qKiBAdHlwZSB7UmVjb3JkPGAkJHtUeXBlZEFycmF5TmFtZX1gLCBHZXR0ZXI+fSAqLyhjYWNoZSksXG5cdFx0LyoqIEBwYXJhbSB7R2V0dGVyfSBnZXR0ZXIgQHBhcmFtIHtgJCR7VHlwZWRBcnJheU5hbWV9YH0gbmFtZSAqLyBmdW5jdGlvbiAoZ2V0dGVyLCBuYW1lKSB7XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBhIHRocm93IGlzIGZpbmUgaGVyZVxuXHRcdFx0XHRcdGdldHRlcih2YWx1ZSk7XG5cdFx0XHRcdFx0Zm91bmQgPSAvKiogQHR5cGUge1R5cGVkQXJyYXlOYW1lfSAqLyAoJHNsaWNlKG5hbWUsIDEpKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkgeyAvKiovIH1cblx0XHRcdH1cblx0XHR9XG5cdCk7XG5cdHJldHVybiBmb3VuZDtcbn1cblxuLyoqIEB0eXBlIHsodGFnOiB1bmtub3duKSA9PiB0YWcgaXMgdHlwZW9mIHR5cGVkQXJyYXlzW251bWJlcl19ICovXG5mdW5jdGlvbiBpc1RBVGFnKHRhZykge1xuXHRyZXR1cm4gJGluZGV4T2YodHlwZWRBcnJheXMsIHRhZykgPiAtMTtcbn1cblxuLyoqXG4gKiBAdHlwZSB7aW1wb3J0KCcuJyl9XG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSB7XG5cdGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoIWhhc1RvU3RyaW5nVGFnKSB7XG5cdFx0dmFyIHRhZyA9ICRzbGljZSgkdG9TdHJpbmcodmFsdWUpLCA4LCAtMSk7XG5cdFx0aWYgKGlzVEFUYWcodGFnKSkge1xuXHRcdFx0cmV0dXJuIHRhZztcblx0XHR9XG5cdFx0aWYgKHRhZyAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gbm9kZSA8IDAuNiBoaXRzIGhlcmUgb24gcmVhbCBUeXBlZCBBcnJheXNcblx0XHRyZXR1cm4gdHJ5U2xpY2VzKHZhbHVlKTtcblx0fVxuXHRpZiAoIWdPUEQpIHsgcmV0dXJuIG51bGw7IH0gLy8gdW5rbm93biBlbmdpbmVcblx0cmV0dXJuIHRyeVR5cGVkQXJyYXlzKHZhbHVlKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwb3NzaWJsZU5hbWVzID0gcmVxdWlyZSgncG9zc2libGUtdHlwZWQtYXJyYXktbmFtZXMnKTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhdmFpbGFibGVUeXBlZEFycmF5cygpIHtcblx0dmFyIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgYXZhaWxhYmxlVHlwZWRBcnJheXM+fSAqLyBvdXQgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwb3NzaWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBnW3Bvc3NpYmxlTmFtZXNbaV1dID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yXG5cdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSBwb3NzaWJsZU5hbWVzW2ldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0O1xufTtcbiIsIi8qISBBeGlvcyB2MS4xOC4xIENvcHlyaWdodCAoYykgMjAyNiBNYXR0IFphYnJpc2tpZSBhbmQgY29udHJpYnV0b3JzICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgYm91bmQgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uIHdpdGggYSBzcGVjaWZpZWQgYHRoaXNgIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBiaW5kXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgLSBUaGUgdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHRoZSBgdGhpc2AgcGFyYW1ldGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYHRoaXNgIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3QgeyB0b1N0cmluZyB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgaXRlcmF0b3IsIHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKFxuICAoeyBoYXNPd25Qcm9wZXJ0eSB9KSA9PlxuICAob2JqLCBwcm9wKSA9PlxuICAgIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKVxuKShPYmplY3QucHJvdG90eXBlKTtcblxuLyoqXG4gKiBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gKGV4Y2x1ZGluZyB0aGUgc2hhcmVkIE9iamVjdC5wcm90b3R5cGUpIGxvb2tpbmcgZm9yXG4gKiBhbiBvd24gYHByb3BgLiBUaGlzIGRpc3Rpbmd1aXNoZXMgZ2VudWluZSBvd24vaW5oZXJpdGVkIG1lbWJlcnMg4oCUIGluY2x1ZGluZ1xuICogY2xhc3MgYWNjZXNzb3JzIGFuZCB0ZW1wbGF0ZSBwcm90b3R5cGVzIOKAlCBmcm9tIG1lbWJlcnMgaW5qZWN0ZWQgdmlhXG4gKiBPYmplY3QucHJvdG90eXBlIHBvbGx1dGlvbiAoZS5nLiBgT2JqZWN0LnByb3RvdHlwZS51c2VybmFtZSA9ICcuLi4nYCksIHdoaWNoXG4gKiBsaXZlIG9uIE9iamVjdC5wcm90b3R5cGUgaXRzZWxmIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgd2hvc2UgY2hhaW4gdG8gaW5zcGVjdFxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBwcm9wIFRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3JcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIGBwcm9wYCBpcyBvd25lZCBiZWxvdyBPYmplY3QucHJvdG90eXBlXG4gKi9cbmNvbnN0IGhhc093bkluUHJvdG90eXBlQ2hhaW4gPSAodGhpbmcsIHByb3ApID0+IHtcbiAgbGV0IG9iaiA9IHRoaW5nO1xuICBjb25zdCBzZWVuID0gW107XG5cbiAgd2hpbGUgKG9iaiAhPSBudWxsICYmIG9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGlmIChzZWVuLmluZGV4T2Yob2JqKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2Vlbi5wdXNoKG9iaik7XG5cbiAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9iaiA9IGdldFByb3RvdHlwZU9mKG9iaik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZWFkIGBvYmpbcHJvcF1gIG9ubHkgd2hlbiBpdCBpcyBzYWZlIGZyb20gT2JqZWN0LnByb3RvdHlwZSBwb2xsdXRpb24uIE93blxuICogcHJvcGVydGllcyBhbmQgbWVtYmVycyBpbmhlcml0ZWQgZnJvbSBhIG5vbi1PYmplY3QucHJvdG90eXBlIHNvdXJjZSAoYSBjbGFzc1xuICogaW5zdGFuY2Ugb3IgdGVtcGxhdGUgb2JqZWN0KSBhcmUgaG9ub3JlZDsgYSB2YWx1ZSByZWFjaGFibGUgb25seSB0aHJvdWdoIGFcbiAqIHBvbGx1dGVkIE9iamVjdC5wcm90b3R5cGUgaXMgaWdub3JlZCBhbmQgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHsqfSBvYmogVGhlIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gcHJvcCBUaGUgcHJvcGVydHkga2V5IHRvIHJlYWRcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc29sdmVkIHZhbHVlLCBvciB1bmRlZmluZWQgd2hlbiB1bnNhZmUvYWJzZW50XG4gKi9cbmNvbnN0IGdldFNhZmVQcm9wID0gKG9iaiwgcHJvcCkgPT5cbiAgb2JqICE9IG51bGwgJiYgaGFzT3duSW5Qcm90b3R5cGVDaGFpbihvYmosIHByb3ApID8gb2JqW3Byb3BdIDogdW5kZWZpbmVkO1xuXG5jb25zdCBraW5kT2YgPSAoKGNhY2hlKSA9PiAodGhpbmcpID0+IHtcbiAgY29uc3Qgc3RyID0gdG9TdHJpbmcuY2FsbCh0aGluZyk7XG4gIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZTtcbn07XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSAodHlwZSkgPT4gKHRoaW5nKSA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiAoXG4gICAgdmFsICE9PSBudWxsICYmXG4gICAgIWlzVW5kZWZpbmVkKHZhbCkgJiZcbiAgICB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiZcbiAgICAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKSAmJlxuICAgIGlzRnVuY3Rpb24kMSh2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmXG4gICAgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbClcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB2YWwgJiYgdmFsLmJ1ZmZlciAmJiBpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uJDEgPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9ICh0aGluZykgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAoXG4gICAgKHByb3RvdHlwZSA9PT0gbnVsbCB8fFxuICAgICAgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8XG4gICAgICBnZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJlxuICAgIC8vIFRyZWF0IGFueSBnZW51aW5lIChub24tT2JqZWN0LnByb3RvdHlwZS1wb2xsdXRlZCkgU3ltYm9sLnRvU3RyaW5nVGFnIG9yXG4gICAgLy8gU3ltYm9sLml0ZXJhdG9yIGFzIGV2aWRlbmNlIHRoZSB2YWx1ZSBpcyBhIHRhZ2dlZC9pdGVyYWJsZSB0eXBlIHJhdGhlclxuICAgIC8vIHRoYW4gYSBwbGFpbiBvYmplY3QsIHdoaWxlIGlnbm9yaW5nIGtleXMgaW5qZWN0ZWQgb250byBPYmplY3QucHJvdG90eXBlLlxuICAgICFoYXNPd25JblByb3RvdHlwZUNoYWluKHZhbCwgdG9TdHJpbmdUYWcpICYmXG4gICAgIWhhc093bkluUHJvdG90eXBlQ2hhaW4odmFsLCBpdGVyYXRvcilcbiAgKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gZW1wdHkgb2JqZWN0IChzYWZlbHkgaGFuZGxlcyBCdWZmZXJzKVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gZW1wdHkgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNFbXB0eU9iamVjdCA9ICh2YWwpID0+IHtcbiAgLy8gRWFybHkgcmV0dXJuIGZvciBub24tb2JqZWN0cyBvciBCdWZmZXJzIHRvIHByZXZlbnQgUmFuZ2VFcnJvclxuICBpZiAoIWlzT2JqZWN0KHZhbCkgfHwgaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09PSAwICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIGFueSBvdGhlciBvYmplY3RzIHRoYXQgbWlnaHQgY2F1c2UgUmFuZ2VFcnJvciB3aXRoIE9iamVjdC5rZXlzKClcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWFjdCBOYXRpdmUgQmxvYlxuICogUmVhY3QgTmF0aXZlIFwiYmxvYlwiOiBhbiBvYmplY3Qgd2l0aCBhIGB1cmlgIGF0dHJpYnV0ZS4gT3B0aW9uYWxseSwgaXQgY2FuXG4gKiBhbHNvIGhhdmUgYSBgbmFtZWAgYW5kIGB0eXBlYCBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBmaWxlbmFtZSBhbmQgY29udGVudCB0eXBlXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL2Jsb2IvMjY2ODRjZjNhZGY0MDk0ZWI2YzQwNWQzNDVhNzViZjhjN2MwYmY4OC9MaWJyYXJpZXMvTmV0d29yay9Gb3JtRGF0YS5qcyNMNjgtTDcxXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgUmVhY3QgTmF0aXZlIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlYWN0TmF0aXZlQmxvYiA9ICh2YWx1ZSkgPT4ge1xuICByZXR1cm4gISEodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnVyaSAhPT0gJ3VuZGVmaW5lZCcpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgZW52aXJvbm1lbnQgaXMgUmVhY3QgTmF0aXZlXG4gKiBSZWFjdE5hdGl2ZSBgRm9ybURhdGFgIGhhcyBhIG5vbi1zdGFuZGFyZCBgZ2V0UGFydHMoKWAgbWV0aG9kXG4gKlxuICogQHBhcmFtIHsqfSBmb3JtRGF0YSBUaGUgZm9ybURhdGEgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGVudmlyb25tZW50IGlzIFJlYWN0IE5hdGl2ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUmVhY3ROYXRpdmUgPSAoZm9ybURhdGEpID0+IGZvcm1EYXRhICYmIHR5cGVvZiBmb3JtRGF0YS5nZXRQYXJ0cyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlTGlzdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uJDEodmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBnbG9iYWxUaGlzO1xuICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gc2VsZjtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gd2luZG93O1xuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBnbG9iYWw7XG4gIHJldHVybiB7fTtcbn1cblxuY29uc3QgRyA9IGdldEdsb2JhbCgpO1xuY29uc3QgRm9ybURhdGFDdG9yID0gdHlwZW9mIEcuRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRy5Gb3JtRGF0YSA6IHVuZGVmaW5lZDtcblxuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBpZiAoIXRoaW5nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChGb3JtRGF0YUN0b3IgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YUN0b3IpIHJldHVybiB0cnVlO1xuICAvLyBSZWplY3QgcGxhaW4gb2JqZWN0cyBpbmhlcml0aW5nIGRpcmVjdGx5IGZyb20gT2JqZWN0LnByb3RvdHlwZSBzbyBwcm90b3R5cGUtcG9sbHV0aW9uIGdhZGdldHMgY2FuJ3Qgc3Bvb2YgRm9ybURhdGEuXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YodGhpbmcpO1xuICBpZiAoIXByb3RvIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghaXNGdW5jdGlvbiQxKHRoaW5nLmFwcGVuZCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qga2luZCA9IGtpbmRPZih0aGluZyk7XG4gIHJldHVybiAoXG4gICAga2luZCA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgIC8vIGRldGVjdCBmb3JtLWRhdGEgaW5zdGFuY2VcbiAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbiQxKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICApO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbXG4gICdSZWFkYWJsZVN0cmVhbScsXG4gICdSZXF1ZXN0JyxcbiAgJ1Jlc3BvbnNlJyxcbiAgJ0hlYWRlcnMnLFxuXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiB7XG4gIHJldHVybiBzdHIudHJpbSA/IHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcbn07XG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheTx1bmtub3duPn0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxPd25LZXlzID0gZmFsc2VdXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4sIHsgYWxsT3duS2V5cyA9IGZhbHNlIH0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQnVmZmVyIGNoZWNrXG4gICAgaWYgKGlzQnVmZmVyKG9iaikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZHMgYSBrZXkgaW4gYW4gb2JqZWN0LCBjYXNlLWluc2Vuc2l0aXZlLCByZXR1cm5pbmcgdGhlIGFjdHVhbCBrZXkgbmFtZS5cbiAqIFJldHVybnMgbnVsbCBpZiB0aGUgb2JqZWN0IGlzIGEgQnVmZmVyIG9yIGlmIG5vIG1hdGNoIGlzIGZvdW5kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIGZpbmQgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICogQHJldHVybnMgez9zdHJpbmd9IFRoZSBhY3R1YWwga2V5IG5hbWUgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICovXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGlmIChpc0J1ZmZlcihvYmopKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIGxldCBfa2V5O1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIF9rZXkgPSBrZXlzW2ldO1xuICAgIGlmIChrZXkgPT09IF9rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIF9rZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBfZ2xvYmFsID0gKCgpID0+IHtcbiAgLyplc2xpbnQgbm8tdW5kZWY6MCovXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsO1xufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLi4ub2Jqcykge1xuICBjb25zdCB7IGNhc2VsZXNzLCBza2lwVW5kZWZpbmVkIH0gPSAoaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzKSB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgLy8gU2tpcCBkYW5nZXJvdXMgcHJvcGVydHkgbmFtZXMgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmaW5kS2V5IGxvd2VyY2FzZXMgdGhlIGtleSwgc28gY2FzZWxlc3MgbG9va3VwIG9ubHkgYXBwbGllcyB0byBzdHJpbmdzIOKAlFxuICAgIC8vIHN5bWJvbCBrZXlzIGFyZSBpZGVudGl0eS1tYXRjaGVkLlxuICAgIGNvbnN0IHRhcmdldEtleSA9IChjYXNlbGVzcyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSkgfHwga2V5O1xuICAgIC8vIFJlYWQgdmlhIG93bi1wcm9wIG9ubHkg4oCUIGEgYmFyZSBgcmVzdWx0W3RhcmdldEtleV1gIHdhbGtzIHRoZSBwcm90b3R5cGVcbiAgICAvLyBjaGFpbiwgc28gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlIHZhbHVlIGNvdWxkIHN1cmZhY2UgaGVyZSBhbmQgZ2V0XG4gICAgLy8gY29waWVkIGludG8gdGhlIG1lcmdlZCByZXN1bHQuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBoYXNPd25Qcm9wZXJ0eShyZXN1bHQsIHRhcmdldEtleSkgPyByZXN1bHRbdGFyZ2V0S2V5XSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChleGlzdGluZykgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKGV4aXN0aW5nLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSBpZiAoIXNraXBVbmRlZmluZWQgfHwgIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IG9ianMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgc291cmNlID0gb2Jqc1tpXTtcbiAgICBpZiAoIXNvdXJjZSB8fCBpc0J1ZmZlcihzb3VyY2UpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3JFYWNoKHNvdXJjZSwgYXNzaWduVmFsdWUpO1xuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN5bWJvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IHN5bWJvbHNbal07XG4gICAgICBpZiAocHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIHN5bWJvbCkpIHtcbiAgICAgICAgYXNzaWduVmFsdWUoc291cmNlW3N5bWJvbF0sIHN5bWJvbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsbE93bktleXNdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmNvbnN0IGV4dGVuZCA9IChhLCBiLCB0aGlzQXJnLCB7IGFsbE93bktleXMgfSA9IHt9KSA9PiB7XG4gIGZvckVhY2goXG4gICAgYixcbiAgICAodmFsLCBrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24kMSh2YWwpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrZXksIHtcbiAgICAgICAgICAvLyBOdWxsLXByb3RvIGRlc2NyaXB0b3Igc28gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlLmdldCBjYW5ub3RcbiAgICAgICAgICAvLyBoaWphY2sgZGVmaW5lUHJvcGVydHkncyBhY2Nlc3Nvci12cy1kYXRhIHJlc29sdXRpb24uXG4gICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgIHZhbHVlOiBiaW5kKHZhbCwgdGhpc0FyZyksXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIGtleSwge1xuICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsT3duS2V5cyB9XG4gICk7XG4gIHJldHVybiBhO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweGZlZmYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn07XG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvclxuICogQHBhcmFtIHtvYmplY3R9IFtwcm9wc11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbZGVzY3JpcHRvcnNdXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGluaGVyaXRzID0gKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yLCBwcm9wcywgZGVzY3JpcHRvcnMpID0+IHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBjb25zdHJ1Y3RvcixcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLFxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IHNlYXJjaFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbj0gMF1cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZW5kc1dpdGggPSAoc3RyLCBzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PiB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA+IHN0ci5sZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IHN0ci5sZW5ndGg7XG4gIH1cbiAgcG9zaXRpb24gLT0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgbGFzdEluZGV4ID0gc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbik7XG4gIHJldHVybiBsYXN0SW5kZXggIT09IC0xICYmIGxhc3RJbmRleCA9PT0gcG9zaXRpb247XG59O1xuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoKFR5cGVkQXJyYXkpID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh0aGluZykgPT4ge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSk7XG5cbi8qKlxuICogRm9yIGVhY2ggZW50cnkgaW4gdGhlIG9iamVjdCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZm9yRWFjaEVudHJ5ID0gKG9iaiwgZm4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gb2JqICYmIG9ialtpdGVyYXRvcl07XG5cbiAgY29uc3QgX2l0ZXJhdG9yID0gZ2VuZXJhdG9yLmNhbGwob2JqKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIHdoaWxlICgocmVzdWx0ID0gX2l0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn07XG5cbi8qKlxuICogSXQgdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgc3RyaW5nLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPn1cbiAqL1xuY29uc3QgbWF0Y2hBbGwgPSAocmVnRXhwLCBzdHIpID0+IHtcbiAgbGV0IG1hdGNoZXM7XG4gIGNvbnN0IGFyciA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2hlcyA9IHJlZ0V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2gobWF0Y2hlcyk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSAoc3RyKSA9PiB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cXHNdKFthLXpcXGRdKShcXHcqKS9nLCBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICB9KTtcbn07XG5cbmNvbnN0IHsgcHJvcGVydHlJc0VudW1lcmFibGUgfSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbiQxKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24kMSh2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcihcIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICdcIiArIG5hbWUgKyBcIidcIik7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9yIGEgZGVsaW1pdGVkIHN0cmluZyBpbnRvIGFuIG9iamVjdCBzZXQgd2l0aCB2YWx1ZXMgYXMga2V5cyBhbmQgdHJ1ZSBhcyB2YWx1ZXMuXG4gKiBVc2VmdWwgZm9yIGZhc3QgbWVtYmVyc2hpcCBjaGVja3MuXG4gKlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGFycmF5T3JTdHJpbmcgLSBUaGUgYXJyYXkgb3Igc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVsaW1pdGVyIC0gVGhlIGRlbGltaXRlciB0byB1c2UgaWYgaW5wdXQgaXMgYSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBrZXlzIGZyb20gdGhlIGFycmF5IG9yIHN0cmluZywgdmFsdWVzIHNldCB0byB0cnVlLlxuICovXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoKHZhbHVlID0gK3ZhbHVlKSkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbn07XG5cbi8qKlxuICogSWYgdGhlIHRoaW5nIGlzIGEgRm9ybURhdGEgb2JqZWN0LCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHRoaW5nIC0gVGhlIHRoaW5nIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1NwZWNDb21wbGlhbnRGb3JtKHRoaW5nKSB7XG4gIHJldHVybiAhIShcbiAgICB0aGluZyAmJlxuICAgIGlzRnVuY3Rpb24kMSh0aGluZy5hcHBlbmQpICYmXG4gICAgdGhpbmdbdG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmXG4gICAgdGhpbmdbaXRlcmF0b3JdXG4gICk7XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY29udmVydHMgYW4gb2JqZWN0IHRvIGEgSlNPTi1jb21wYXRpYmxlIG9iamVjdCwgaGFuZGxpbmcgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgQnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEpTT04tY29tcGF0aWJsZSBvYmplY3QuXG4gKi9cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgY29uc3QgdmlzaXQgPSAoc291cmNlKSA9PiB7XG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy9CdWZmZXIgY2hlY2tcbiAgICAgIGlmIChpc0J1ZmZlcihzb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgLy8gYWRkLW9uIGRlc2NlbnQgLyBkZWxldGUtb24tYXNjZW50OiBwcmVzZXJ2ZXMgcGF0aCBzZW1hbnRpY3MsIHNvIERBRyBub2RlcyBzZXJpYWxpc2UgYXQgZXZlcnkgb2NjdXJyZW5jZSAoc2VlICM3MjMwKS5cbiAgICAgICAgdmlzaXRlZC5hZGQoc291cmNlKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSk7XG4gICAgICAgICAgIWlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkgJiYgKHRhcmdldFtrZXldID0gcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlzaXRlZC5kZWxldGUoc291cmNlKTtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIHZpc2l0KG9iaik7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhbiBhc3luYyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBhc3luYyBmdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIHRoZW5hYmxlIChoYXMgdGhlbiBhbmQgY2F0Y2ggbWV0aG9kcykuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgdGhlbmFibGUsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiZcbiAgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uJDEodGhpbmcpKSAmJlxuICBpc0Z1bmN0aW9uJDEodGhpbmcudGhlbikgJiZcbiAgaXNGdW5jdGlvbiQxKHRoaW5nLmNhdGNoKTtcblxuLy8gb3JpZ2luYWwgY29kZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpZ2l0YWxCcmFpbkpTL0F4aW9zUHJvbWlzZS9ibG9iLzE2ZGVhYjEzNzEwZWMwOTc3OTkyMjEzMWYzZmE1OTU0MzIwZjgzYWIvbGliL3V0aWxzLmpzI0wxMS1MMzRcblxuLyoqXG4gKiBQcm92aWRlcyBhIGNyb3NzLXBsYXRmb3JtIHNldEltbWVkaWF0ZSBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgbmF0aXZlIHNldEltbWVkaWF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHBvc3RNZXNzYWdlIG9yIHNldFRpbWVvdXQuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBzZXRJbW1lZGlhdGVTdXBwb3J0ZWQgLSBXaGV0aGVyIHNldEltbWVkaWF0ZSBpcyBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBvc3RNZXNzYWdlU3VwcG9ydGVkIC0gV2hldGhlciBwb3N0TWVzc2FnZSBpcyBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBhc3luY2hyb25vdXNseS5cbiAqL1xuY29uc3QgX3NldEltbWVkaWF0ZSA9ICgoc2V0SW1tZWRpYXRlU3VwcG9ydGVkLCBwb3N0TWVzc2FnZVN1cHBvcnRlZCkgPT4ge1xuICBpZiAoc2V0SW1tZWRpYXRlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgfVxuXG4gIHJldHVybiBwb3N0TWVzc2FnZVN1cHBvcnRlZFxuICAgID8gKCh0b2tlbiwgY2FsbGJhY2tzKSA9PiB7XG4gICAgICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgICAgKHsgc291cmNlLCBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IF9nbG9iYWwgJiYgZGF0YSA9PT0gdG9rZW4pIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2tzLmxlbmd0aCAmJiBjYWxsYmFja3Muc2hpZnQoKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKGNiKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgICAgIF9nbG9iYWwucG9zdE1lc3NhZ2UodG9rZW4sICcqJyk7XG4gICAgICAgIH07XG4gICAgICB9KShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsIFtdKVxuICAgIDogKGNiKSA9PiBzZXRUaW1lb3V0KGNiKTtcbn0pKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsIGlzRnVuY3Rpb24kMShfZ2xvYmFsLnBvc3RNZXNzYWdlKSk7XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgbWljcm90YXNrIG9yIGFzeW5jaHJvbm91cyBjYWxsYmFjayBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICogVXNlcyBxdWV1ZU1pY3JvdGFzayBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHByb2Nlc3MubmV4dFRpY2sgb3IgX3NldEltbWVkaWF0ZS5cbiAqXG4gKiBAdHlwZSB7RnVuY3Rpb259XG4gKi9cbmNvbnN0IGFzYXAgPVxuICB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnXG4gICAgPyBxdWV1ZU1pY3JvdGFzay5iaW5kKF9nbG9iYWwpXG4gICAgOiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2spIHx8IF9zZXRJbW1lZGlhdGU7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG5jb25zdCBpc0l0ZXJhYmxlID0gKHRoaW5nKSA9PiB0aGluZyAhPSBudWxsICYmIGlzRnVuY3Rpb24kMSh0aGluZ1tpdGVyYXRvcl0pO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGl0ZXJhYmxlIHZpYSBhbiBpdGVyYXRvciB0aGF0IGlzIE5PVCBzb3VyY2VkIHNvbGVseVxuICogZnJvbSBhIHBvbGx1dGVkIE9iamVjdC5wcm90b3R5cGUuIFVzZSB0aGlzIGluc3RlYWQgb2YgYGlzSXRlcmFibGVgIHdoZW5ldmVyXG4gKiB0aGUgaXRlcmFibGUgY29tZXMgZnJvbSB1bnRydXN0ZWQgaW5wdXQgKGUuZy4gdXNlci1zdXBwbGllZCBoZWFkZXIgc291cmNlcyksXG4gKiBzbyBgT2JqZWN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gLi4uYCBjYW5ub3QgdHVybiBhbiBvcmRpbmFyeSBvYmplY3RcbiAqIGludG8gYW4gYXR0YWNrZXItY29udHJvbGxlZCBlbnRyaWVzIGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBoYXMgYSBub24tcG9sbHV0ZWQgaXRlcmF0b3JcbiAqL1xuY29uc3QgaXNTYWZlSXRlcmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICE9IG51bGwgJiYgaGFzT3duSW5Qcm90b3R5cGVDaGFpbih0aGluZywgaXRlcmF0b3IpICYmIGlzSXRlcmFibGUodGhpbmcpO1xuXG52YXIgdXRpbHMkMSA9IHtcbiAgaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXIsXG4gIGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzRW1wdHlPYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzUmVxdWVzdCxcbiAgaXNSZXNwb25zZSxcbiAgaXNIZWFkZXJzLFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzUmVhY3ROYXRpdmVCbG9iLFxuICBpc1JlYWN0TmF0aXZlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uJDEsXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICBoYXNPd25JblByb3RvdHlwZUNoYWluLFxuICBnZXRTYWZlUHJvcCxcbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcCxcbiAgaXNJdGVyYWJsZSxcbiAgaXNTYWZlSXRlcmFibGUsXG59O1xuXG4vLyBSYXdBeGlvc0hlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG5jb25zdCBpZ25vcmVEdXBsaWNhdGVPZiA9IHV0aWxzJDEudG9PYmplY3RTZXQoW1xuICAnYWdlJyxcbiAgJ2F1dGhvcml6YXRpb24nLFxuICAnY29udGVudC1sZW5ndGgnLFxuICAnY29udGVudC10eXBlJyxcbiAgJ2V0YWcnLFxuICAnZXhwaXJlcycsXG4gICdmcm9tJyxcbiAgJ2hvc3QnLFxuICAnaWYtbW9kaWZpZWQtc2luY2UnLFxuICAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJyxcbiAgJ2xvY2F0aW9uJyxcbiAgJ21heC1mb3J3YXJkcycsXG4gICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLFxuICAncmV0cnktYWZ0ZXInLFxuICAndXNlci1hZ2VudCcsXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbnZhciBwYXJzZUhlYWRlcnMgPSAocmF3SGVhZGVycykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGtleTtcbiAgbGV0IHZhbDtcbiAgbGV0IGk7XG5cbiAgcmF3SGVhZGVycyAmJlxuICAgIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIGlmIChwYXJzZWRba2V5XSkge1xuICAgICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZWRba2V5XSA9IFt2YWxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG5mdW5jdGlvbiB0cmltU1BvckhUQUIoc3RyKSB7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBlbmQgPSBzdHIubGVuZ3RoO1xuXG4gIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChzdGFydCk7XG5cbiAgICBpZiAoY29kZSAhPT0gMHgwOSAmJiBjb2RlICE9PSAweDIwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdGFydCArPSAxO1xuICB9XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0KSB7XG4gICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGVuZCAtIDEpO1xuXG4gICAgaWYgKGNvZGUgIT09IDB4MDkgJiYgY29kZSAhPT0gMHgyMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZW5kIC09IDE7XG4gIH1cblxuICByZXR1cm4gc3RhcnQgPT09IDAgJiYgZW5kID09PSBzdHIubGVuZ3RoID8gc3RyIDogc3RyLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vLyBUaGUgY29udHJvbC1jb2RlIHJhbmdlcyBhcmUgaW50ZW50aW9uYWw6IGhlYWRlciBzYW5pdGl6YXRpb24gc3RyaXBzIEMwL0RFTCBieXRlcy5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBJTlZBTElEX1VOSUNPREVfSEVBREVSX1ZBTFVFX0NIQVJTID0gbmV3IFJlZ0V4cCgnW1xcXFx1MDAwMC1cXFxcdTAwMDhcXFxcdTAwMGEtXFxcXHUwMDFmXFxcXHUwMDdmXSsnLCAnZycpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IElOVkFMSURfQllURV9TVFJJTkdfSEVBREVSX1ZBTFVFX0NIQVJTID0gbmV3IFJlZ0V4cCgnW15cXFxcdTAwMDlcXFxcdTAwMjAtXFxcXHUwMDdlXFxcXHUwMDgwLVxcXFx1MDBmZl0rJywgJ2cnKTtcblxuZnVuY3Rpb24gc2FuaXRpemVWYWx1ZSh2YWx1ZSwgaW52YWxpZENoYXJzKSB7XG4gIGlmICh1dGlscyQxLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gc2FuaXRpemVWYWx1ZShpdGVtLCBpbnZhbGlkQ2hhcnMpKTtcbiAgfVxuXG4gIHJldHVybiB0cmltU1BvckhUQUIoU3RyaW5nKHZhbHVlKS5yZXBsYWNlKGludmFsaWRDaGFycywgJycpKTtcbn1cblxuY29uc3Qgc2FuaXRpemVIZWFkZXJWYWx1ZSA9ICh2YWx1ZSkgPT5cbiAgc2FuaXRpemVWYWx1ZSh2YWx1ZSwgSU5WQUxJRF9VTklDT0RFX0hFQURFUl9WQUxVRV9DSEFSUyk7XG5cbmNvbnN0IHNhbml0aXplQnl0ZVN0cmluZ0hlYWRlclZhbHVlID0gKHZhbHVlKSA9PlxuICBzYW5pdGl6ZVZhbHVlKHZhbHVlLCBJTlZBTElEX0JZVEVfU1RSSU5HX0hFQURFUl9WQUxVRV9DSEFSUyk7XG5cbmZ1bmN0aW9uIHRvQnl0ZVN0cmluZ0hlYWRlck9iamVjdChoZWFkZXJzKSB7XG4gIGNvbnN0IGJ5dGVTdHJpbmdIZWFkZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICB1dGlscyQxLmZvckVhY2goaGVhZGVycy50b0pTT04oKSwgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICBieXRlU3RyaW5nSGVhZGVyc1toZWFkZXJdID0gc2FuaXRpemVCeXRlU3RyaW5nSGVhZGVyVmFsdWUodmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gYnl0ZVN0cmluZ0hlYWRlcnM7XG59XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IHNhbml0aXplSGVhZGVyVmFsdWUoU3RyaW5nKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcywgdmFsdWUsIGhlYWRlcik7XG4gIH1cblxuICBpZiAoaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gICAgdmFsdWUgPSBoZWFkZXI7XG4gIH1cblxuICBpZiAoIXV0aWxzJDEuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzJDEuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNSZWdFeHAoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIudGVzdCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyXG4gICAgLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywgKHcsIGNoYXIsIHN0cikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKSArIHN0cjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBY2Nlc3NvcnMob2JqLCBoZWFkZXIpIHtcbiAgY29uc3QgYWNjZXNzb3JOYW1lID0gdXRpbHMkMS50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgLy8gTnVsbC1wcm90byBkZXNjcmlwdG9yIHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZS5nZXQgY2Fubm90IHR1cm5cbiAgICAgIC8vIHRoaXMgZGF0YSBkZXNjcmlwdG9yIGludG8gYW4gYWNjZXNzb3IgZGVzY3JpcHRvciBvbiB0aGUgd2F5IGluLlxuICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jbGFzcyBBeGlvc0hlYWRlcnMge1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XG4gICAgaGVhZGVycyAmJiB0aGlzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIHNldChoZWFkZXIsIHZhbHVlT3JSZXdyaXRlLCByZXdyaXRlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFsSGVhZGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICFrZXkgfHxcbiAgICAgICAgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgX3Jld3JpdGUgPT09IHRydWUgfHxcbiAgICAgICAgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSlcbiAgICAgICkge1xuICAgICAgICBzZWxmW2tleSB8fCBfaGVhZGVyXSA9IG5vcm1hbGl6ZVZhbHVlKF92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0SGVhZGVycyA9IChoZWFkZXJzLCBfcmV3cml0ZSkgPT5cbiAgICAgIHV0aWxzJDEuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzT2JqZWN0KGhlYWRlcikgJiYgdXRpbHMkMS5pc1NhZmVJdGVyYWJsZShoZWFkZXIpKSB7XG4gICAgICBsZXQgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgZGVzdCxcbiAgICAgICAga2V5O1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF1dGlscyQxLmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0IGl0ZXJhdG9yIG11c3QgcmV0dXJuIGEga2V5LXZhbHVlIHBhaXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleSA9IGVudHJ5WzBdO1xuXG4gICAgICAgIGlmICh1dGlscyQxLmhhc093blByb3Aob2JqLCBrZXkpKSB7XG4gICAgICAgICAgZGVzdCA9IG9ialtrZXldO1xuICAgICAgICAgIG9ialtrZXldID0gdXRpbHMkMS5pc0FycmF5KGRlc3QpID8gWy4uLmRlc3QsIGVudHJ5WzFdXSA6IFtkZXN0LCBlbnRyeVsxXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBlbnRyeVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRIZWFkZXJzKG9iaiwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgIT0gbnVsbCAmJiBzZXRIZWFkZXIodmFsdWVPclJld3JpdGUsIGhlYWRlciwgcmV3cml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQoaGVhZGVyLCBwYXJzZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc1JlZ0V4cChwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShcbiAgICAgICAga2V5ICYmXG4gICAgICAgIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyLmZvckVhY2goZGVsZXRlSGVhZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlSGVhZGVyKGhlYWRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBjbGVhcihtYXRjaGVyKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICAgIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgIHZhbHVlICE9PSBmYWxzZSAmJlxuICAgICAgICAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywgJykgOiB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVxuICAgICAgLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpXG4gICAgICAuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXRTZXRDb29raWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzZXQtY29va2llJykgfHwgW107XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9XG4gICAgICAodGhpc1skaW50ZXJuYWxzXSA9XG4gICAgICB0aGlzWyRpbnRlcm5hbHNdID1cbiAgICAgICAge1xuICAgICAgICAgIGFjY2Vzc29yczoge30sXG4gICAgICAgIH0pO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gaW50ZXJuYWxzLmFjY2Vzc29ycztcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcblxuICAgIGZ1bmN0aW9uIGRlZmluZUFjY2Vzc29yKF9oZWFkZXIpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghYWNjZXNzb3JzW2xIZWFkZXJdKSB7XG4gICAgICAgIGJ1aWxkQWNjZXNzb3JzKHByb3RvdHlwZSwgX2hlYWRlcik7XG4gICAgICAgIGFjY2Vzc29yc1tsSGVhZGVyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbHMkMS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFtcbiAgJ0NvbnRlbnQtVHlwZScsXG4gICdDb250ZW50LUxlbmd0aCcsXG4gICdBY2NlcHQnLFxuICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgJ1VzZXItQWdlbnQnLFxuICAnQXV0aG9yaXphdGlvbicsXG5dKTtcblxuLy8gcmVzZXJ2ZWQgbmFtZXMgaG90Zml4XG51dGlscyQxLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7IHZhbHVlIH0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9LFxuICB9O1xufSk7XG5cbnV0aWxzJDEuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5jb25zdCBSRURBQ1RFRCA9ICdbUkVEQUNURUQgKioqKl0nO1xuXG5mdW5jdGlvbiBoYXNPd25PclByb3RvdHlwZVRvSlNPTihzb3VyY2UpIHtcbiAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcChzb3VyY2UsICd0b0pTT04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuXG4gIHdoaWxlIChwcm90b3R5cGUgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcChwcm90b3R5cGUsICd0b0pTT04nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEJ1aWxkIGEgcGxhaW4tb2JqZWN0IHNuYXBzaG90IG9mIGBjb25maWdgIGFuZCByZXBsYWNlIHRoZSB2YWx1ZSBvZiBhbnkga2V5XG4vLyAoY2FzZS1pbnNlbnNpdGl2ZSkgbGlzdGVkIGluIGByZWRhY3RLZXlzYCB3aXRoIFJFREFDVEVELiBXYWxrcyB0aHJvdWdoIGFycmF5c1xuLy8gYW5kIEF4aW9zSGVhZGVycywgYW5kIHNob3J0LWNpcmN1aXRzIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG5mdW5jdGlvbiByZWRhY3RDb25maWcoY29uZmlnLCByZWRhY3RLZXlzKSB7XG4gIGNvbnN0IGxvd2VyS2V5cyA9IG5ldyBTZXQocmVkYWN0S2V5cy5tYXAoKGspID0+IFN0cmluZyhrKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNlZW4gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UpID0+IHtcbiAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gc291cmNlO1xuICAgIGlmICh1dGlscyQxLmlzQnVmZmVyKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgaWYgKHNlZW4uaW5kZXhPZihzb3VyY2UpICE9PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMpIHtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZS50b0pTT04oKTtcbiAgICB9XG5cbiAgICBzZWVuLnB1c2goc291cmNlKTtcblxuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIHNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZHVjZWRWYWx1ZSA9IHZpc2l0KHYpO1xuICAgICAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSkge1xuICAgICAgICAgIHJlc3VsdFtpXSA9IHJlZHVjZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkgJiYgaGFzT3duT3JQcm90b3R5cGVUb0pTT04oc291cmNlKSkge1xuICAgICAgICBzZWVuLnBvcCgpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSBsb3dlcktleXMuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSA/IFJFREFDVEVEIDogdmlzaXQodmFsdWUpO1xuICAgICAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gcmVkdWNlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2Vlbi5wb3AoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiB2aXNpdChjb25maWcpO1xufVxuXG5jbGFzcyBBeGlvc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMgZnJvbShlcnJvciwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSwgY3VzdG9tUHJvcHMpIHtcbiAgICBjb25zdCBheGlvc0Vycm9yID0gbmV3IEF4aW9zRXJyb3IoZXJyb3IubWVzc2FnZSwgY29kZSB8fCBlcnJvci5jb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAvLyBNYXRjaCBuYXRpdmUgYEVycm9yYCBgY2F1c2VgIHNlbWFudGljczogbm9uLWVudW1lcmFibGUuIFRoZSB3cmFwcGVkXG4gICAgLy8gZXJyb3Igb2Z0ZW4gY2FycmllcyBjaXJjdWxhciBpbnRlcm5hbHMgKHNvY2tldHMsIHJlcXVlc3RzLCBhZ2VudHMpLCBzb1xuICAgIC8vIGFuIGVudW1lcmFibGUgYGNhdXNlYCBtYWtlcyBzdHJ1Y3R1cmVkIGxvZ2dlcnMgKHBpbm8vd2luc3RvbikgYW5kIGFueVxuICAgIC8vIG93bi1wcm9wZXJ0eSB3YWxrIHRocm93IFwiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTlwiLlxuICAgIC8vIFJlZ3Jlc3Npb24gZnJvbSAjNjk4Mjsgc2VlICM3MjA1LiBgX19wcm90b19fOiBudWxsYCBtaXJyb3JzIHRoZVxuICAgIC8vIGBtZXNzYWdlYCBkZXNjcmlwdG9yIGJlbG93IChwcm90b3R5cGUtcG9sbHV0aW9uLXNhZmUgZGVzY3JpcHRvcikuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGF4aW9zRXJyb3IsICdjYXVzZScsIHtcbiAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgIHZhbHVlOiBlcnJvcixcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICAgIC8vIFByZXNlcnZlIHN0YXR1cyBmcm9tIHRoZSBvcmlnaW5hbCBlcnJvciBpZiBub3QgYWxyZWFkeSBzZXQgZnJvbSByZXNwb25zZVxuICAgIGlmIChlcnJvci5zdGF0dXMgIT0gbnVsbCAmJiBheGlvc0Vycm9yLnN0YXR1cyA9PSBudWxsKSB7XG4gICAgICBheGlvc0Vycm9yLnN0YXR1cyA9IGVycm9yLnN0YXR1cztcbiAgICB9XG5cbiAgICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcbiAgICByZXR1cm4gYXhpb3NFcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuXG4gICAgLy8gTWFrZSBtZXNzYWdlIGVudW1lcmFibGUgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIC8vIFRoZSBuYXRpdmUgRXJyb3IgY29uc3RydWN0b3Igc2V0cyBtZXNzYWdlIGFzIG5vbi1lbnVtZXJhYmxlLFxuICAgIC8vIGJ1dCBheGlvcyA8IHYxLjEzLjMgaGFkIGl0IGFzIGVudW1lcmFibGVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICAvLyBOdWxsLXByb3RvIGRlc2NyaXB0b3Igc28gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlLmdldCBjYW5ub3QgdHVyblxuICAgICAgLy8gdGhpcyBkYXRhIGRlc2NyaXB0b3IgaW50byBhbiBhY2Nlc3NvciBkZXNjcmlwdG9yIG9uIHRoZSB3YXkgaW4uXG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICB2YWx1ZTogbWVzc2FnZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgICB0aGlzLmlzQXhpb3NFcnJvciA9IHRydWU7XG4gICAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gICAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gICAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICB9XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgLy8gT3B0LWluIHJlZGFjdGlvbjogd2hlbiB0aGUgcmVxdWVzdCBjb25maWcgY2FycmllcyBhIGByZWRhY3RgIGFycmF5LCB0aGVcbiAgICAvLyB2YWx1ZSBvZiBhbnkgbWF0Y2hpbmcga2V5IChjYXNlLWluc2Vuc2l0aXZlLCBhdCBhbnkgZGVwdGgpIGlzIHJlcGxhY2VkXG4gICAgLy8gd2l0aCBSRURBQ1RFRCBpbiB0aGUgc2VyaWFsaXplZCBzbmFwc2hvdC4gVW5kZWZpbmVkIG9yIGVtcHR5IGxlYXZlcyB0aGVcbiAgICAvLyBleGlzdGluZyBzZXJpYWxpemF0aW9uIGJlaGF2aW9yIHVuY2hhbmdlZC5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCByZWRhY3RLZXlzID0gY29uZmlnICYmIHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcsICdyZWRhY3QnKSA/IGNvbmZpZy5yZWRhY3QgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc2VyaWFsaXplZENvbmZpZyA9XG4gICAgICB1dGlscyQxLmlzQXJyYXkocmVkYWN0S2V5cykgJiYgcmVkYWN0S2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gcmVkYWN0Q29uZmlnKGNvbmZpZywgcmVkYWN0S2V5cylcbiAgICAgICAgOiB1dGlscyQxLnRvSlNPTk9iamVjdChjb25maWcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogc2VyaWFsaXplZENvbmZpZyxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgfTtcbiAgfVxufVxuXG4vLyBUaGlzIGNhbiBiZSBjaGFuZ2VkIHRvIHN0YXRpYyBwcm9wZXJ0aWVzIGFzIHNvb24gYXMgdGhlIHBhcnNlciBvcHRpb25zIGluIC5lc2xpbnQuY2pzIGFyZSB1cGRhdGVkLlxuQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSA9ICdFUlJfQkFEX09QVElPTl9WQUxVRSc7XG5BeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OID0gJ0VSUl9CQURfT1BUSU9OJztcbkF4aW9zRXJyb3IuRUNPTk5BQk9SVEVEID0gJ0VDT05OQUJPUlRFRCc7XG5BeGlvc0Vycm9yLkVUSU1FRE9VVCA9ICdFVElNRURPVVQnO1xuQXhpb3NFcnJvci5FQ09OTlJFRlVTRUQgPSAnRUNPTk5SRUZVU0VEJztcbkF4aW9zRXJyb3IuRVJSX05FVFdPUksgPSAnRVJSX05FVFdPUksnO1xuQXhpb3NFcnJvci5FUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTID0gJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnO1xuQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRCA9ICdFUlJfREVQUkVDQVRFRCc7XG5BeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UgPSAnRVJSX0JBRF9SRVNQT05TRSc7XG5BeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCA9ICdFUlJfQkFEX1JFUVVFU1QnO1xuQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQgPSAnRVJSX0NBTkNFTEVEJztcbkF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JUID0gJ0VSUl9OT1RfU1VQUE9SVCc7XG5BeGlvc0Vycm9yLkVSUl9JTlZBTElEX1VSTCA9ICdFUlJfSU5WQUxJRF9VUkwnO1xuQXhpb3NFcnJvci5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEID0gJ0VSUl9GT1JNX0RBVEFfREVQVEhfRVhDRUVERUQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG52YXIgaHR0cEFkYXB0ZXIgPSBudWxsO1xuXG4vLyBEZWZhdWx0IG5lc3RpbmcgbGltaXQgc2hhcmVkIHdpdGggdGhlIGludmVyc2UgdHJhbnNmb3JtIChmb3JtRGF0YVRvSlNPTikgc29cbi8vIHRoZSBGb3JtRGF0YSA8LT4gSlNPTiByb3VuZC10cmlwIHN0YXlzIHN5bW1ldHJpYy5cbmNvbnN0IERFRkFVTFRfRk9STV9EQVRBX01BWF9ERVBUSCA9IDEwMDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscyQxLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzJDEuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGhcbiAgICAuY29uY2F0KGtleSlcbiAgICAubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdG9rZW4gPSByZW1vdmVCcmFja2V0cyh0b2tlbik7XG4gICAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gICAgfSlcbiAgICAuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscyQxLnRvRmxhdE9iamVjdCh1dGlscyQxLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMkMS50b0ZsYXRPYmplY3QoXG4gICAgb3B0aW9ucyxcbiAgICB7XG4gICAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgICAgZG90czogZmFsc2UsXG4gICAgICBpbmRleGVzOiBmYWxzZSxcbiAgICB9LFxuICAgIGZhbHNlLFxuICAgIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgICAgcmV0dXJuICF1dGlscyQxLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8ICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgQmxvYik7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucy5tYXhEZXB0aCA9PT0gdW5kZWZpbmVkID8gREVGQVVMVF9GT1JNX0RBVEFfTUFYX0RFUFRIIDogb3B0aW9ucy5tYXhEZXB0aDtcbiAgY29uc3QgdXNlQmxvYiA9IF9CbG9iICYmIHV0aWxzJDEuaXNTcGVjQ29tcGxpYW50Rm9ybShmb3JtRGF0YSk7XG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgaWYgKCF1dGlscyQxLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMkMS5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0Jvb2xlYW4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMkMS5pc0Jsb2IodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscyQxLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh1c2VCbG9iICYmIHR5cGVvZiBfQmxvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IF9CbG9iKFt2YWx1ZV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gdGhyb3dJZk1heERlcHRoRXhjZWVkZWQoZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICdPYmplY3QgaXMgdG9vIGRlZXBseSBuZXN0ZWQgKCcgKyBkZXB0aCArICcgbGV2ZWxzKS4gTWF4IGRlcHRoOiAnICsgbWF4RGVwdGgsXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0ZPUk1fREFUQV9ERVBUSF9FWENFRURFRFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmdpZnlXaXRoRGVwdGhMaW1pdCh2YWx1ZSwgZGVwdGgpIHtcbiAgICBpZiAobWF4RGVwdGggPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGFuY2VzdG9ycyA9IFtdO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBmdW5jdGlvbiBsaW1pdERlcHRoKF9rZXksIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKCF1dGlscyQxLmlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGFuY2VzdG9ycy5sZW5ndGggJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXSAhPT0gdGhpcykge1xuICAgICAgICBhbmNlc3RvcnMucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGFuY2VzdG9ycy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aHJvd0lmTWF4RGVwdGhFeGNlZWRlZChkZXB0aCArIGFuY2VzdG9ycy5sZW5ndGggLSAxKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh1dGlscyQxLmlzUmVhY3ROYXRpdmUoZm9ybURhdGEpICYmIHV0aWxzJDEuaXNSZWFjdE5hdGl2ZUJsb2IodmFsdWUpKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMkMS5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gc3RyaW5naWZ5V2l0aERlcHRoTGltaXQodmFsdWUsIDEpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzJDEuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMkMS50b0FycmF5KHZhbHVlKSkpXG4gICAgICApIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzJDEuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJlxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cylcbiAgICAgICAgICAgICAgICA6IGluZGV4ZXMgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8ga2V5XG4gICAgICAgICAgICAgICAgICA6IGtleSArICdbXScsXG4gICAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlLFxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCwgZGVwdGggPSAwKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICB0aHJvd0lmTWF4RGVwdGhFeGNlZWRlZChkZXB0aCk7XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmXG4gICAgICAgIHZpc2l0b3IuY2FsbChmb3JtRGF0YSwgZWwsIHV0aWxzJDEuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSQxKHN0cikge1xuICBjb25zdCBjaGFyTWFwID0ge1xuICAgICchJzogJyUyMScsXG4gICAgXCInXCI6ICclMjcnLFxuICAgICcoJzogJyUyOCcsXG4gICAgJyknOiAnJTI5JyxcbiAgICAnfic6ICclN0UnLFxuICAgICclMjAnOiAnKycsXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMC9nLCBmdW5jdGlvbiByZXBsYWNlcihtYXRjaCkge1xuICAgIHJldHVybiBjaGFyTWFwW21hdGNoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXJhbXMgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCB0byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgY29udmVydGVkIHRvIGEgRm9ybURhdGEgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgQXhpb3MgY29uc3RydWN0b3IuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykge1xuICB0aGlzLl9wYWlycyA9IFtdO1xuXG4gIHBhcmFtcyAmJiB0b0Zvcm1EYXRhKHBhcmFtcywgdGhpcywgb3B0aW9ucyk7XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcblxucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9wYWlycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xufTtcblxucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2Rlcikge1xuICBjb25zdCBfZW5jb2RlID0gZW5jb2RlclxuICAgID8gKHZhbHVlKSA9PiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSQxKVxuICAgIDogZW5jb2RlJDE7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzXG4gICAgLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICAgIHJldHVybiBfZW5jb2RlKHBhaXJbMF0pICsgJz0nICsgX2VuY29kZShwYWlyWzFdKTtcbiAgICB9LCAnJylcbiAgICAuam9pbignJicpO1xufTtcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBVUkwtZW5jb2RlZCBmb3JtcyBvZiBgOmAsIGAkYCwgYCxgLCBhbmQgc3BhY2VzIHdpdGhcbiAqIHRoZWlyIHBsYWluIGNvdW50ZXJwYXJ0cyAoYDpgLCBgJGAsIGAsYCwgYCtgKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKVxuICAgIC5yZXBsYWNlKC8lM0EvZ2ksICc6JylcbiAgICAucmVwbGFjZSgvJTI0L2csICckJylcbiAgICAucmVwbGFjZSgvJTJDL2dpLCAnLCcpXG4gICAgLnJlcGxhY2UoLyUyMC9nLCAnKycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7PyhvYmplY3R8RnVuY3Rpb24pfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IHVybCB8fCAnJztcblxuICBjb25zdCBfb3B0aW9ucyA9IHV0aWxzJDEuaXNGdW5jdGlvbihvcHRpb25zKVxuICAgID8ge1xuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnMsXG4gICAgICB9XG4gICAgOiBvcHRpb25zO1xuXG4gIC8vIFJlYWQgc2VyaWFsaXplciBvcHRpb25zIHBvbGx1dGlvbi1zYWZlbHk6IG93biBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIG9uIGFcbiAgLy8gY2xhc3MvdGVtcGxhdGUgcHJvdG90eXBlIGFyZSBob25vcmVkLCBidXQgdmFsdWVzIGluamVjdGVkIG9udG8gYSBwb2xsdXRlZFxuICAvLyBPYmplY3QucHJvdG90eXBlIGFyZSBpZ25vcmVkLlxuICBjb25zdCBfZW5jb2RlID0gdXRpbHMkMS5nZXRTYWZlUHJvcChfb3B0aW9ucywgJ2VuY29kZScpIHx8IGVuY29kZTtcbiAgY29uc3Qgc2VyaWFsaXplRm4gPSB1dGlscyQxLmdldFNhZmVQcm9wKF9vcHRpb25zLCAnc2VyaWFsaXplJyk7XG5cbiAgbGV0IHNlcmlhbGl6ZWRQYXJhbXM7XG5cbiAgaWYgKHNlcmlhbGl6ZUZuKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHNlcmlhbGl6ZUZuKHBhcmFtcywgX29wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKHBhcmFtcylcbiAgICAgID8gcGFyYW1zLnRvU3RyaW5nKClcbiAgICAgIDogbmV3IEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgX29wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgaW50ZXJjZXB0b3IsIHN5bmNocm9ub3VzIGFuZCBydW5XaGVuXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscyQxLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIHRyYW5zaXRpb25hbERlZmF1bHRzID0ge1xuICBzaWxlbnRKU09OUGFyc2luZzogdHJ1ZSxcbiAgZm9yY2VkSlNPTlBhcnNpbmc6IHRydWUsXG4gIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlLFxuICBsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nOiB0cnVlLFxuICBhZHZlcnRpc2Vac3RkQWNjZXB0RW5jb2Rpbmc6IGZhbHNlLFxuICB2YWxpZGF0ZVN0YXR1c1VuZGVmaW5lZFJlc29sdmVzOiB0cnVlLFxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtcyQxID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcblxudmFyIEZvcm1EYXRhJDEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuXG52YXIgQmxvYiQxID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGw7XG5cbnZhciBwbGF0Zm9ybSQxID0ge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyQxLFxuICAgIEZvcm1EYXRhOiBGb3JtRGF0YSQxLFxuICAgIEJsb2I6IEJsb2IkMSxcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ10sXG59O1xuXG5jb25zdCBoYXNCcm93c2VyRW52ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuY29uc3QgX25hdmlnYXRvciA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IpIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9XG4gIGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IChoYXNCcm93c2VyRW52ICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbnZhciB1dGlscyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBoYXNCcm93c2VyRW52OiBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJFbnY6IGhhc1N0YW5kYXJkQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIG5hdmlnYXRvcjogX25hdmlnYXRvcixcbiAgb3JpZ2luOiBvcmlnaW5cbn0pO1xuXG52YXIgcGxhdGZvcm0gPSB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybSQxLFxufTtcblxuZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCB7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24gKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMkMS5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuY29uc3QgTUFYX0RFUFRIID0gREVGQVVMVF9GT1JNX0RBVEFfTUFYX0RFUFRIO1xuXG5mdW5jdGlvbiB0aHJvd0lmRGVwdGhFeGNlZWRlZChpbmRleCkge1xuICBpZiAoaW5kZXggPiBNQVhfREVQVEgpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICdGb3JtRGF0YSBmaWVsZCBpcyB0b28gZGVlcGx5IG5lc3RlZCAoJyArIGluZGV4ICsgJyBsZXZlbHMpLiBNYXggZGVwdGg6ICcgKyBNQVhfREVQVEgsXG4gICAgICBBeGlvc0Vycm9yLkVSUl9GT1JNX0RBVEFfREVQVEhfRVhDRUVERURcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgY29uc3QgcGF0aCA9IFtdO1xuICBjb25zdCBwYXR0ZXJuID0gL1xcdyt8XFxbKFxcdyopXS9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHBhdHRlcm4uZXhlYyhuYW1lKSkgIT09IG51bGwpIHtcbiAgICB0aHJvd0lmRGVwdGhFeGNlZWRlZChwYXRoLmxlbmd0aCk7XG4gICAgcGF0aC5wdXNoKG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXSk7XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICB0aHJvd0lmRGVwdGhFeGNlZWRlZChpbmRleCk7XG5cbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscyQxLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB1dGlscyQxLmlzQXJyYXkodGFyZ2V0W25hbWVdKVxuICAgICAgICAgID8gdGFyZ2V0W25hbWVdLmNvbmNhdCh2YWx1ZSlcbiAgICAgICAgICA6IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXV0aWxzJDEuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpIHx8ICF1dGlscyQxLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzJDEuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBhcnJheVRvT2JqZWN0KHRhcmdldFtuYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gIH1cblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGZvcm1EYXRhKSAmJiB1dGlscyQxLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaEVudHJ5KGZvcm1EYXRhLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGJ1aWxkUGF0aChwYXJzZVByb3BQYXRoKG5hbWUpLCB2YWx1ZSwgb2JqLCAwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3Qgb3duID0gKG9iaiwga2V5KSA9PiAob2JqICE9IG51bGwgJiYgdXRpbHMkMS5oYXNPd25Qcm9wKG9iaiwga2V5KSA/IG9ialtrZXldIDogdW5kZWZpbmVkKTtcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzJDEuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzJDEudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJywgJ2ZldGNoJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzJDEuaXNPYmplY3QoZGF0YSk7XG5cbiAgICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMkMS5pc0hUTUxGb3JtKGRhdGEpKSB7XG4gICAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB1dGlscyQxLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICAgIHJldHVybiBoYXNKU09OQ29udGVudFR5cGUgPyBKU09OLnN0cmluZ2lmeShmb3JtRGF0YVRvSlNPTihkYXRhKSkgOiBkYXRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHV0aWxzJDEuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgICB1dGlscyQxLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICAgIHV0aWxzJDEuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgICAgdXRpbHMkMS5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgICAgdXRpbHMkMS5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgICAgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICB9XG4gICAgICBpZiAodXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgICAgY29uc3QgZm9ybVNlcmlhbGl6ZXIgPSBvd24odGhpcywgJ2Zvcm1TZXJpYWxpemVyJyk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGlzRmlsZUxpc3QgPSB1dGlscyQxLmlzRmlsZUxpc3QoZGF0YSkpIHx8XG4gICAgICAgICAgY29udGVudFR5cGUuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID4gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZW52ID0gb3duKHRoaXMsICdlbnYnKTtcbiAgICAgICAgICBjb25zdCBfRm9ybURhdGEgPSBlbnYgJiYgZW52LkZvcm1EYXRhO1xuXG4gICAgICAgICAgcmV0dXJuIHRvRm9ybURhdGEoXG4gICAgICAgICAgICBpc0ZpbGVMaXN0ID8geyAnZmlsZXNbXSc6IGRhdGEgfSA6IGRhdGEsXG4gICAgICAgICAgICBfRm9ybURhdGEgJiYgbmV3IF9Gb3JtRGF0YSgpLFxuICAgICAgICAgICAgZm9ybVNlcmlhbGl6ZXJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gIF0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtcbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBvd24odGhpcywgJ3RyYW5zaXRpb25hbCcpIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IG93bih0aGlzLCAncmVzcG9uc2VUeXBlJyk7XG4gICAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gcmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICAgIGlmICh1dGlscyQxLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGRhdGEgJiZcbiAgICAgICAgdXRpbHMkMS5pc1N0cmluZyhkYXRhKSAmJlxuICAgICAgICAoKGZvcmNlZEpTT05QYXJzaW5nICYmICFyZXNwb25zZVR5cGUpIHx8IEpTT05SZXF1ZXN0ZWQpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgICBjb25zdCBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiBKU09OUmVxdWVzdGVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSwgb3duKHRoaXMsICdwYXJzZVJldml2ZXInKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgb3duKHRoaXMsICdyZXNwb25zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gIF0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiBwbGF0Zm9ybS5jbGFzc2VzLkZvcm1EYXRhLFxuICAgIEJsb2I6IHBsYXRmb3JtLmNsYXNzZXMuQmxvYixcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH0sXG59O1xuXG51dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAncXVlcnknXSwgKG1ldGhvZCkgPT4ge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZm5zLCByZXNwb25zZSkge1xuICBjb25zdCBjb25maWcgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMkMS5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn1cblxuY2xhc3MgQ2FuY2VsZWRFcnJvciBleHRlbmRzIEF4aW9zRXJyb3Ige1xuICAvKipcbiAgICogQSBgQ2FuY2VsZWRFcnJvcmAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIFRoZSBjb25maWcuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAgICpcbiAgICogQHJldHVybnMge0NhbmNlbGVkRXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgc3VwZXIobWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICAgIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbiAgICB0aGlzLl9fQ0FOQ0VMX18gPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDAgPyBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCA6IEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSk6KD86XFwvXFwvKT8vLmV4ZWModXJsKTtcbiAgcmV0dXJuIChtYXRjaCAmJiBtYXRjaFsxXSkgfHwgJyc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRhdGEgbWF4UmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVzQ291bnQ9IDEwXVxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW49IDEwMDBdXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwZWVkb21ldGVyKHNhbXBsZXNDb3VudCwgbWluKSB7XG4gIHNhbXBsZXNDb3VudCA9IHNhbXBsZXNDb3VudCB8fCAxMDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBsZXQgaGVhZCA9IDA7XG4gIGxldCB0YWlsID0gMDtcbiAgbGV0IGZpcnN0U2FtcGxlVFM7XG5cbiAgbWluID0gbWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiAxMDAwO1xuXG4gIHJldHVybiBmdW5jdGlvbiBwdXNoKGNodW5rTGVuZ3RoKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHRpbWVzdGFtcHNbdGFpbF07XG5cbiAgICBpZiAoIWZpcnN0U2FtcGxlVFMpIHtcbiAgICAgIGZpcnN0U2FtcGxlVFMgPSBub3c7XG4gICAgfVxuXG4gICAgYnl0ZXNbaGVhZF0gPSBjaHVua0xlbmd0aDtcbiAgICB0aW1lc3RhbXBzW2hlYWRdID0gbm93O1xuXG4gICAgbGV0IGkgPSB0YWlsO1xuICAgIGxldCBieXRlc0NvdW50ID0gMDtcblxuICAgIHdoaWxlIChpICE9PSBoZWFkKSB7XG4gICAgICBieXRlc0NvdW50ICs9IGJ5dGVzW2krK107XG4gICAgICBpID0gaSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBoZWFkID0gKGhlYWQgKyAxKSAlIHNhbXBsZXNDb3VudDtcblxuICAgIGlmIChoZWFkID09PSB0YWlsKSB7XG4gICAgICB0YWlsID0gKHRhaWwgKyAxKSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBpZiAobm93IC0gZmlyc3RTYW1wbGVUUyA8IG1pbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHN0YXJ0ZWRBdCAmJiBub3cgLSBzdGFydGVkQXQ7XG5cbiAgICByZXR1cm4gcGFzc2VkID8gTWF0aC5yb3VuZCgoYnl0ZXNDb3VudCAqIDEwMDApIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuKC4uLmFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IHRocm90dGxlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBwYXNzZWQgPSBub3cgLSB0aW1lc3RhbXA7XG4gICAgaWYgKHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncyk7XG4gICAgICAgIH0sIHRocmVzaG9sZCAtIHBhc3NlZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5jb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoKGUpID0+IHtcbiAgICBpZiAoIWUgfHwgdHlwZW9mIGUubG9hZGVkICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByYXdMb2FkZWQgPSBlLmxvYWRlZDtcbiAgICBjb25zdCB0b3RhbCA9IGUubGVuZ3RoQ29tcHV0YWJsZSA/IGUudG90YWwgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbG9hZGVkID0gdG90YWwgIT0gbnVsbCA/IE1hdGgubWluKHJhd0xvYWRlZCwgdG90YWwpIDogcmF3TG9hZGVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBNYXRoLm1heCgwLCBsb2FkZWQgLSBieXRlc05vdGlmaWVkKTtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuXG4gICAgYnl0ZXNOb3RpZmllZCA9IE1hdGgubWF4KGJ5dGVzTm90aWZpZWQsIGxvYWRlZCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyBsb2FkZWQgLyB0b3RhbCA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgPyAodG90YWwgLSBsb2FkZWQpIC8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdG90YWwgIT0gbnVsbCxcbiAgICAgIFtpc0Rvd25sb2FkU3RyZWFtID8gJ2Rvd25sb2FkJyA6ICd1cGxvYWQnXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufTtcblxuY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbXG4gICAgKGxvYWRlZCkgPT5cbiAgICAgIHRocm90dGxlZFswXSh7XG4gICAgICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgIHRvdGFsLFxuICAgICAgICBsb2FkZWQsXG4gICAgICB9KSxcbiAgICB0aHJvdHRsZWRbMV0sXG4gIF07XG59O1xuXG5jb25zdCBhc3luY0RlY29yYXRvciA9XG4gIChmbikgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgdXRpbHMkMS5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcblxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudlxuICA/ICgob3JpZ2luLCBpc01TSUUpID0+ICh1cmwpID0+IHtcbiAgICAgIHVybCA9IG5ldyBVUkwodXJsLCBwbGF0Zm9ybS5vcmlnaW4pO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBvcmlnaW4ucHJvdG9jb2wgPT09IHVybC5wcm90b2NvbCAmJlxuICAgICAgICBvcmlnaW4uaG9zdCA9PT0gdXJsLmhvc3QgJiZcbiAgICAgICAgKGlzTVNJRSB8fCBvcmlnaW4ucG9ydCA9PT0gdXJsLnBvcnQpXG4gICAgICApO1xuICAgIH0pKFxuICAgICAgbmV3IFVSTChwbGF0Zm9ybS5vcmlnaW4pLFxuICAgICAgcGxhdGZvcm0ubmF2aWdhdG9yICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QocGxhdGZvcm0ubmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICApXG4gIDogKCkgPT4gdHJ1ZTtcblxudmFyIGNvb2tpZXMgPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnZcbiAgPyAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICB7XG4gICAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUsIHNhbWVTaXRlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY29va2llID0gW2Ake25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gXTtcblxuICAgICAgICBpZiAodXRpbHMkMS5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKGBleHBpcmVzPSR7bmV3IERhdGUoZXhwaXJlcykudG9VVENTdHJpbmcoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXRpbHMkMS5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKGBwYXRoPSR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXRpbHMkMS5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgY29va2llLnB1c2goYGRvbWFpbj0ke2RvbWFpbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1dGlscyQxLmlzU3RyaW5nKHNhbWVTaXRlKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKGBTYW1lU2l0ZT0ke3NhbWVTaXRlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICB9LFxuXG4gICAgICByZWFkKG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBNYXRjaCBuYW1lPXZhbHVlIGJ5IHNwbGl0dGluZyBvbiB0aGUgc2VtaWNvbG9uIHNlcGFyYXRvciBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGFcbiAgICAgICAgLy8gUmVnRXhwIGZyb20gYG5hbWVgIOKAlCBpbnRlcnBvbGF0aW5nIGFuIHVuZXNjYXBlZCBzdHJpbmcgaW50byBhIFJlZ0V4cCB3b3VsZCBsZXRcbiAgICAgICAgLy8gbWV0YWNoYXJhY3RlcnMgKGUuZy4gYC4rP2AgaW4gYW4gYXR0YWNrZXItaW5mbHVlbmNlZCBjb29raWUgbmFtZSkgY2F1c2UgUmVEb1Mgb3JcbiAgICAgICAgLy8gbWF0Y2ggdGhlIHdyb25nIGNvb2tpZS4gQnJvd3NlcnMgbWF5IHNlcmlhbGl6ZSBjb29raWUgcGFpcnMgYXMgZWl0aGVyIFwiO1wiIG9yXG4gICAgICAgIC8vIFwiOyBcIiwgc28gaWdub3JlIG9wdGlvbmFsIHdoaXRlc3BhY2UgYmVmb3JlIGVhY2ggY29va2llIG5hbWUuXG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY29va2llID0gY29va2llc1tpXS5yZXBsYWNlKC9eXFxzKy8sICcnKTtcbiAgICAgICAgICBjb25zdCBlcSA9IGNvb2tpZS5pbmRleE9mKCc9Jyk7XG4gICAgICAgICAgaWYgKGVxICE9PSAtMSAmJiBjb29raWUuc2xpY2UoMCwgZXEpID09PSBuYW1lKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zbGljZShlcSArIDEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvb2tpZS5zbGljZShlcSArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCwgJy8nKTtcbiAgICAgIH0sXG4gICAgfVxuICA6IC8vIE5vbi1zdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICB7XG4gICAgICB3cml0ZSgpIHt9LFxuICAgICAgcmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlKCkge30sXG4gICAgfTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5mdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cblxuY29uc3QgbWFsZm9ybWVkSHR0cFByb3RvY29sID0gL15odHRwcz86KD8hXFwvXFwvKS9pO1xuY29uc3QgaHR0cFByb3RvY29sQ29udHJvbENoYXJhY3RlcnMgPSAvW1xcdFxcblxccl0vZztcblxuZnVuY3Rpb24gc3RyaXBMZWFkaW5nQzBDb250cm9sT3JTcGFjZSh1cmwpIHtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IHVybC5sZW5ndGggJiYgdXJsLmNoYXJDb2RlQXQoaSkgPD0gMHgyMCkge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnNsaWNlKGkpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVUkxGb3JQcm90b2NvbENoZWNrKHVybCkge1xuICByZXR1cm4gc3RyaXBMZWFkaW5nQzBDb250cm9sT3JTcGFjZSh1cmwpLnJlcGxhY2UoaHR0cFByb3RvY29sQ29udHJvbENoYXJhY3RlcnMsICcnKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRIdHRwUHJvdG9jb2xVUkwodXJsLCBjb25maWcpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIG1hbGZvcm1lZEh0dHBQcm90b2NvbC50ZXN0KG5vcm1hbGl6ZVVSTEZvclByb3RvY29sQ2hlY2sodXJsKSkpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICdJbnZhbGlkIFVSTDogbWlzc2luZyBcIi8vXCIgYWZ0ZXIgcHJvdG9jb2wnLFxuICAgICAgQXhpb3NFcnJvci5FUlJfSU5WQUxJRF9VUkwsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5mdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCwgYWxsb3dBYnNvbHV0ZVVybHMsIGNvbmZpZykge1xuICBhc3NlcnRWYWxpZEh0dHBQcm90b2NvbFVSTChyZXF1ZXN0ZWRVUkwsIGNvbmZpZyk7XG4gIGxldCBpc1JlbGF0aXZlVXJsID0gIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKTtcbiAgaWYgKGJhc2VVUkwgJiYgKGlzUmVsYXRpdmVVcmwgfHwgYWxsb3dBYnNvbHV0ZVVybHMgPT09IGZhbHNlKSkge1xuICAgIGFzc2VydFZhbGlkSHR0cFByb3RvY29sVVJMKGJhc2VVUkwsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RlZFVSTDtcbn1cblxuY29uc3QgaGVhZGVyc1RvT2JqZWN0ID0gKHRoaW5nKSA9PiAodGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMgPyB7IC4uLnRoaW5nIH0gOiB0aGluZyk7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMSA9IGNvbmZpZzEgfHwge307XG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuXG4gIC8vIFVzZSBhIG51bGwtcHJvdG90eXBlIG9iamVjdCBzbyB0aGF0IGRvd25zdHJlYW0gcmVhZHMgc3VjaCBhcyBgY29uZmlnLmF1dGhgXG4gIC8vIG9yIGBjb25maWcuYmFzZVVSTGAgY2Fubm90IGluaGVyaXQgcG9sbHV0ZWQgdmFsdWVzIGZyb20gT2JqZWN0LnByb3RvdHlwZS5cbiAgLy8gYGhhc093blByb3BlcnR5YCBpcyByZXN0b3JlZCBhcyBhIG5vbi1lbnVtZXJhYmxlIG93biBzbG90IHRvIHByZXNlcnZlXG4gIC8vIGVyZ29ub21pY3MgZm9yIHVzZXIgY29kZSB0aGF0IHJlbGllcyBvbiBpdC5cbiAgY29uc3QgY29uZmlnID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbmZpZywgJ2hhc093blByb3BlcnR5Jywge1xuICAgIC8vIE51bGwtcHJvdG8gZGVzY3JpcHRvciBzbyBhIHBvbGx1dGVkIE9iamVjdC5wcm90b3R5cGUuZ2V0IGNhbm5vdCB0dXJuXG4gICAgLy8gdGhpcyBkYXRhIGRlc2NyaXB0b3IgaW50byBhbiBhY2Nlc3NvciBkZXNjcmlwdG9yIG9uIHRoZSB3YXkgaW4uXG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIHByb3AsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZS5jYWxsKHsgY2FzZWxlc3MgfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscyQxLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMoYSwgYiwgcHJvcCwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBwcm9wLCBjYXNlbGVzcyk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSwgcHJvcCwgY2FzZWxlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFRyYW5zaXRpb25hbE9wdGlvbihwcm9wKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsMiA9IHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcyLCAndHJhbnNpdGlvbmFsJykgPyBjb25maWcyLnRyYW5zaXRpb25hbCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZCh0cmFuc2l0aW9uYWwyKSkge1xuICAgICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0cmFuc2l0aW9uYWwyKSkge1xuICAgICAgICBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKHRyYW5zaXRpb25hbDIsIHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25hbDJbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNpdGlvbmFsMSA9IHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcxLCAndHJhbnNpdGlvbmFsJykgPyBjb25maWcxLnRyYW5zaXRpb25hbCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QodHJhbnNpdGlvbmFsMSkgJiYgdXRpbHMkMS5oYXNPd25Qcm9wKHRyYW5zaXRpb25hbDEsIHByb3ApKSB7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvbmFsMVtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcyLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZzEsIHByb3ApKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhbGxvd2VkU29ja2V0UGF0aHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VFbmNvZGluZzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB2YWxpZGF0ZVN0YXR1czogbWVyZ2VEaXJlY3RLZXlzLFxuICAgIGhlYWRlcnM6IChhLCBiLCBwcm9wKSA9PlxuICAgICAgbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSwgcHJvcCwgdHJ1ZSksXG4gIH07XG5cbiAgdXRpbHMkMS5mb3JFYWNoKE9iamVjdC5rZXlzKHsgLi4uY29uZmlnMSwgLi4uY29uZmlnMiB9KSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gJ19fcHJvdG9fXycgfHwgcHJvcCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBwcm9wID09PSAncHJvdG90eXBlJykgcmV0dXJuO1xuICAgIGNvbnN0IG1lcmdlID0gdXRpbHMkMS5oYXNPd25Qcm9wKG1lcmdlTWFwLCBwcm9wKSA/IG1lcmdlTWFwW3Byb3BdIDogbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBhID0gdXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZzEsIHByb3ApID8gY29uZmlnMVtwcm9wXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiID0gdXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZzIsIHByb3ApID8gY29uZmlnMltwcm9wXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGEsIGIsIHByb3ApO1xuICAgICh1dGlscyQxLmlzVW5kZWZpbmVkKGNvbmZpZ1ZhbHVlKSAmJiBtZXJnZSAhPT0gbWVyZ2VEaXJlY3RLZXlzKSB8fCAoY29uZmlnW3Byb3BdID0gY29uZmlnVmFsdWUpO1xuICB9KTtcblxuICBpZiAoXG4gICAgdXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZzIsICd2YWxpZGF0ZVN0YXR1cycpICYmXG4gICAgdXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWcyLnZhbGlkYXRlU3RhdHVzKSAmJlxuICAgIGdldE1lcmdlZFRyYW5zaXRpb25hbE9wdGlvbigndmFsaWRhdGVTdGF0dXNVbmRlZmluZWRSZXNvbHZlcycpID09PSBmYWxzZVxuICApIHtcbiAgICBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZzEsICd2YWxpZGF0ZVN0YXR1cycpKSB7XG4gICAgICBjb25maWcudmFsaWRhdGVTdGF0dXMgPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzEudmFsaWRhdGVTdGF0dXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmNvbnN0IEZPUk1fREFUQV9DT05URU5UX0hFQURFUlMgPSBbJ2NvbnRlbnQtdHlwZScsICdjb250ZW50LWxlbmd0aCddO1xuXG5mdW5jdGlvbiBzZXRGb3JtRGF0YUhlYWRlcnMoaGVhZGVycywgZm9ybUhlYWRlcnMsIHBvbGljeSkge1xuICBpZiAocG9saWN5ICE9PSAnY29udGVudC1vbmx5Jykge1xuICAgIGhlYWRlcnMuc2V0KGZvcm1IZWFkZXJzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBPYmplY3QuZW50cmllcyhmb3JtSGVhZGVycyB8fCB7fSkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgIGlmIChGT1JNX0RBVEFfQ09OVEVOVF9IRUFERVJTLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgaGVhZGVycy5zZXQoa2V5LCB2YWwpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIHRvIGEgTGF0aW4tMSBieXRlIHN0cmluZyBmb3IgdXNlIHdpdGggYnRvYSgpLlxuICogVGhpcyBpcyBhIG1vZGVybiByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpIHBhdHRlcm4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGVuY29kZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IGJ5dGVzIGFzIGEgTGF0aW4tMSBzdHJpbmdcbiAqL1xuY29uc3QgZW5jb2RlVVRGOCQxID0gKHN0cikgPT5cbiAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZ2ksIChfLCBoZXgpID0+XG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSlcbiAgKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUNvbmZpZyhjb25maWcpIHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgLy8gUmVhZCBvbmx5IG93biBwcm9wZXJ0aWVzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvbiBnYWRnZXRzXG4gIC8vIChlLmcuIE9iamVjdC5wcm90b3R5cGUuYmFzZVVSTCA9ICdodHRwczovL2V2aWwuY29tJykuXG4gIGNvbnN0IG93biA9IChrZXkpID0+ICh1dGlscyQxLmhhc093blByb3AobmV3Q29uZmlnLCBrZXkpID8gbmV3Q29uZmlnW2tleV0gOiB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGRhdGEgPSBvd24oJ2RhdGEnKTtcbiAgbGV0IHdpdGhYU1JGVG9rZW4gPSBvd24oJ3dpdGhYU1JGVG9rZW4nKTtcbiAgY29uc3QgeHNyZkhlYWRlck5hbWUgPSBvd24oJ3hzcmZIZWFkZXJOYW1lJyk7XG4gIGNvbnN0IHhzcmZDb29raWVOYW1lID0gb3duKCd4c3JmQ29va2llTmFtZScpO1xuICBsZXQgaGVhZGVycyA9IG93bignaGVhZGVycycpO1xuICBjb25zdCBhdXRoID0gb3duKCdhdXRoJyk7XG4gIGNvbnN0IGJhc2VVUkwgPSBvd24oJ2Jhc2VVUkwnKTtcbiAgY29uc3QgYWxsb3dBYnNvbHV0ZVVybHMgPSBvd24oJ2FsbG93QWJzb2x1dGVVcmxzJyk7XG4gIGNvbnN0IHVybCA9IG93bigndXJsJyk7XG5cbiAgbmV3Q29uZmlnLmhlYWRlcnMgPSBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKFxuICAgIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgdXJsLCBhbGxvd0Fic29sdXRlVXJscywgbmV3Q29uZmlnKSxcbiAgICBvd24oJ3BhcmFtcycpLFxuICAgIG93bigncGFyYW1zU2VyaWFsaXplcicpXG4gICk7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdXRpbHMkMS5nZXRTYWZlUHJvcChhdXRoLCAndXNlcm5hbWUnKSB8fCAnJztcbiAgICBjb25zdCBwYXNzd29yZCA9IHV0aWxzJDEuZ2V0U2FmZVByb3AoYXV0aCwgJ3Bhc3N3b3JkJykgfHwgJyc7XG5cbiAgICB0cnkge1xuICAgICAgaGVhZGVycy5zZXQoXG4gICAgICAgICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgKHBhc3N3b3JkID8gZW5jb2RlVVRGOCQxKHBhc3N3b3JkKSA6ICcnKSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUsIGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgIGlmIChcbiAgICAgIHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fFxuICAgICAgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52IHx8XG4gICAgICB1dGlscyQxLmlzUmVhY3ROYXRpdmUoZGF0YSlcbiAgICApIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gYnJvd3Nlci93ZWIgd29ya2VyL1JOIGhhbmRsZXMgaXRcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihkYXRhLmdldEhlYWRlcnMpKSB7XG4gICAgICAvLyBOb2RlLmpzIEZvcm1EYXRhIChsaWtlIGZvcm0tZGF0YSBwYWNrYWdlKVxuICAgICAgc2V0Rm9ybURhdGFIZWFkZXJzKGhlYWRlcnMsIGRhdGEuZ2V0SGVhZGVycygpLCBvd24oJ2Zvcm1EYXRhSGVhZGVyUG9saWN5JykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbih3aXRoWFNSRlRva2VuKSkge1xuICAgICAgd2l0aFhTUkZUb2tlbiA9IHdpdGhYU1JGVG9rZW4obmV3Q29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBTdHJpY3QgYm9vbGVhbiBjaGVjayDigJQgcHJldmVudHMgcHJvdG8tcG9sbHV0aW9uIGdhZGdldHMgKGUuZy4gT2JqZWN0LnByb3RvdHlwZS53aXRoWFNSRlRva2VuID0gMSlcbiAgICAvLyBhbmQgbWlzY29uZmlndXJhdGlvbnMgKGUuZy4gXCJmYWxzZVwiKSBmcm9tIHNob3J0LWNpcmN1aXRpbmcgdGhlIHNhbWUtb3JpZ2luIGNoZWNrIGFuZCBsZWFraW5nXG4gICAgLy8gdGhlIFhTUkYgdG9rZW4gY3Jvc3Mtb3JpZ2luLlxuICAgIGNvbnN0IHNob3VsZFNlbmRYU1JGID1cbiAgICAgIHdpdGhYU1JGVG9rZW4gPT09IHRydWUgfHwgKHdpdGhYU1JGVG9rZW4gPT0gbnVsbCAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpO1xuXG4gICAgaWYgKHNob3VsZFNlbmRYU1JGKSB7XG4gICAgICBjb25zdCB4c3JmVmFsdWUgPSB4c3JmSGVhZGVyTmFtZSAmJiB4c3JmQ29va2llTmFtZSAmJiBjb29raWVzLnJlYWQoeHNyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KHhzcmZIZWFkZXJOYW1lLCB4c3JmVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdDb25maWc7XG59XG5cbmNvbnN0IGlzWEhSQWRhcHRlclN1cHBvcnRlZCA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciB4aHJBZGFwdGVyID0gaXNYSFJBZGFwdGVyU3VwcG9ydGVkICYmXG4gIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgY29uc3QgX2NvbmZpZyA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcbiAgICAgIGxldCByZXF1ZXN0RGF0YSA9IF9jb25maWcuZGF0YTtcbiAgICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICAgIGxldCB7IHJlc3BvbnNlVHlwZSwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzIH0gPSBfY29uZmlnO1xuICAgICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICAgIGxldCBmbHVzaFVwbG9hZCwgZmx1c2hEb3dubG9hZDtcblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICAgIGZsdXNoRG93bmxvYWQgJiYgZmx1c2hEb3dubG9hZCgpOyAvLyBmbHVzaCBldmVudHNcblxuICAgICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG5cbiAgICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICAgIHJlcXVlc3QudGltZW91dCA9IF9jb25maWcudGltZW91dDtcblxuICAgICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICAgJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCAmJiByZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9XG4gICAgICAgICAgIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCByZXNwb25zZVR5cGUgPT09ICdqc29uJ1xuICAgICAgICAgICAgPyByZXF1ZXN0LnJlc3BvbnNlVGV4dFxuICAgICAgICAgICAgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldHRsZShcbiAgICAgICAgICBmdW5jdGlvbiBfcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNwb25zZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVxdWVzdC5zdGF0dXMgPT09IDAgJiZcbiAgICAgICAgICAgICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXZlbnQpIHtcbiAgICAgICAgLy8gQnJvd3NlcnMgZGVsaXZlciBhIFByb2dyZXNzRXZlbnQgaW4gWEhSIG9uZXJyb3JcbiAgICAgICAgLy8gKG1lc3NhZ2UgbWF5IGJlIGVtcHR5OyB3aGVuIHByZXNlbnQsIHN1cmZhY2UgaXQpXG4gICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QvZXJyb3JfZXZlbnRcbiAgICAgICAgY29uc3QgbXNnID0gZXZlbnQgJiYgZXZlbnQubWVzc2FnZSA/IGV2ZW50Lm1lc3NhZ2UgOiAnTmV0d29yayBFcnJvcic7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBBeGlvc0Vycm9yKG1zZywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgICAgLy8gYXR0YWNoIHRoZSB1bmRlcmx5aW5nIGV2ZW50IGZvciBjb25zdW1lcnMgd2hvIHdhbnQgZGV0YWlsc1xuICAgICAgICBlcnIuZXZlbnQgPSBldmVudCB8fCBudWxsO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0XG4gICAgICAgICAgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJ1xuICAgICAgICAgIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gQXhpb3NFcnJvci5FVElNRURPVVQgOiBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgcmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShudWxsKTtcblxuICAgICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgICB1dGlscyQxLmZvckVhY2godG9CeXRlU3RyaW5nSGVhZGVyT2JqZWN0KHJlcXVlc3RIZWFkZXJzKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoX2NvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IF9jb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAgIFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpO1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZG93bmxvYWRUaHJvdHRsZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgICAgaWYgKG9uVXBsb2FkUHJvZ3Jlc3MgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgICAgW3VwbG9hZFRocm90dGxlZCwgZmx1c2hVcGxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcyk7XG5cbiAgICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbHVzaFVwbG9hZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgICAgb25DYW5jZWxlZCA9IChjYW5jZWwpID0+IHtcbiAgICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICAgIF9jb25maWcuc2lnbmFsLmFib3J0ZWRcbiAgICAgICAgICAgID8gb25DYW5jZWxlZCgpXG4gICAgICAgICAgICA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgICAgaWYgKHByb3RvY29sICYmICFwbGF0Zm9ybS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2wpKSB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgICdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsXG4gICAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCxcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgICB9KTtcbiAgfTtcblxuY29uc3QgY29tcG9zZVNpZ25hbHMgPSAoc2lnbmFscywgdGltZW91dCkgPT4ge1xuICBzaWduYWxzID0gc2lnbmFscyA/IHNpZ25hbHMuZmlsdGVyKEJvb2xlYW4pIDogW107XG5cbiAgaWYgKCF0aW1lb3V0ICYmICFzaWduYWxzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcblxuICBjb25zdCBvbmFib3J0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgY29uc3QgZXJyID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiB0aGlzLnJlYXNvbjtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEF4aW9zRXJyb3JcbiAgICAgICAgICA/IGVyclxuICAgICAgICAgIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycilcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGxldCB0aW1lciA9XG4gICAgdGltZW91dCAmJlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCBvZiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLCBBeGlvc0Vycm9yLkVUSU1FRE9VVCkpO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGlmICghc2lnbmFscykgeyByZXR1cm47IH1cbiAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHRpbWVyID0gbnVsbDtcbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4ge1xuICAgICAgc2lnbmFsLnVuc3Vic2NyaWJlXG4gICAgICAgID8gc2lnbmFsLnVuc3Vic2NyaWJlKG9uYWJvcnQpXG4gICAgICAgIDogc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCk7XG4gICAgfSk7XG4gICAgc2lnbmFscyA9IG51bGw7XG4gIH07XG5cbiAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQsIHsgb25jZTogdHJ1ZSB9KSk7XG5cbiAgY29uc3QgeyBzaWduYWwgfSA9IGNvbnRyb2xsZXI7XG5cbiAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMkMS5hc2FwKHVuc3Vic2NyaWJlKTtcblxuICByZXR1cm4gc2lnbmFsO1xufTtcblxuY29uc3Qgc3RyZWFtQ2h1bmsgPSBmdW5jdGlvbiogKGNodW5rLCBjaHVua1NpemUpIHtcbiAgbGV0IGxlbiA9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgaWYgKGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufTtcblxuY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gIH1cbn07XG5cbmNvbnN0IHRyYWNrU3RyZWFtID0gKHN0cmVhbSwgY2h1bmtTaXplLCBvblByb2dyZXNzLCBvbkZpbmlzaCkgPT4ge1xuICBjb25zdCBpdGVyYXRvciA9IHJlYWRCeXRlcyhzdHJlYW0sIGNodW5rU2l6ZSk7XG5cbiAgbGV0IGJ5dGVzID0gMDtcbiAgbGV0IGRvbmU7XG4gIGxldCBfb25GaW5pc2ggPSAoZSkgPT4ge1xuICAgIGlmICghZG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaChlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbShcbiAgICB7XG4gICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGxlbiA9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IChieXRlcyArPSBsZW4pO1xuICAgICAgICAgICAgb25Qcm9ncmVzcyhsb2FkZWRCeXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYW5jZWwocmVhc29uKSB7XG4gICAgICAgIF9vbkZpbmlzaChyZWFzb24pO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaGlnaFdhdGVyTWFyazogMixcbiAgICB9XG4gICk7XG59O1xuXG4vKipcbiAqIEVzdGltYXRlIGRlY29kZWQgYnl0ZSBsZW5ndGggb2YgYSBkYXRhOi8vIFVSTCAqd2l0aG91dCogYWxsb2NhdGluZyBsYXJnZSBidWZmZXJzLlxuICogLSBGb3IgYmFzZTY0OiBjb21wdXRlIGV4YWN0IGRlY29kZWQgc2l6ZSB1c2luZyBsZW5ndGggYW5kIHBhZGRpbmc7XG4gKiAgICAgICAgICAgICAgIGhhbmRsZSAlWFggYXQgdGhlIGNoYXJhY3Rlci1jb3VudCBsZXZlbCAobm8gc3RyaW5nIGFsbG9jYXRpb24pLlxuICogLSBGb3Igbm9uLWJhc2U2NDogY29tcHV0ZSB0aGUgZXhhY3QgcGVyY2VudC1kZWNvZGVkIFVURi04IGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGlzSGV4RGlnaXQgPSAoY2hhckNvZGUpID0+XG4gIChjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1NykgfHxcbiAgKGNoYXJDb2RlID49IDY1ICYmIGNoYXJDb2RlIDw9IDcwKSB8fFxuICAoY2hhckNvZGUgPj0gOTcgJiYgY2hhckNvZGUgPD0gMTAyKTtcblxuY29uc3QgaXNQZXJjZW50RW5jb2RlZEJ5dGUgPSAoc3RyLCBpLCBsZW4pID0+XG4gIGkgKyAyIDwgbGVuICYmIGlzSGV4RGlnaXQoc3RyLmNoYXJDb2RlQXQoaSArIDEpKSAmJiBpc0hleERpZ2l0KHN0ci5jaGFyQ29kZUF0KGkgKyAyKSk7XG5cbmZ1bmN0aW9uIGVzdGltYXRlRGF0YVVSTERlY29kZWRCeXRlcyh1cmwpIHtcbiAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHJldHVybiAwO1xuICBpZiAoIXVybC5zdGFydHNXaXRoKCdkYXRhOicpKSByZXR1cm4gMDtcblxuICBjb25zdCBjb21tYSA9IHVybC5pbmRleE9mKCcsJyk7XG4gIGlmIChjb21tYSA8IDApIHJldHVybiAwO1xuXG4gIGNvbnN0IG1ldGEgPSB1cmwuc2xpY2UoNSwgY29tbWEpO1xuICBjb25zdCBib2R5ID0gdXJsLnNsaWNlKGNvbW1hICsgMSk7XG4gIGNvbnN0IGlzQmFzZTY0ID0gLztiYXNlNjQvaS50ZXN0KG1ldGEpO1xuXG4gIGlmIChpc0Jhc2U2NCkge1xuICAgIGxldCBlZmZlY3RpdmVMZW4gPSBib2R5Lmxlbmd0aDtcbiAgICBjb25zdCBsZW4gPSBib2R5Lmxlbmd0aDsgLy8gY2FjaGUgbGVuZ3RoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoYm9keS5jaGFyQ29kZUF0KGkpID09PSAzNyAvKiAnJScgKi8gJiYgaSArIDIgPCBsZW4pIHtcbiAgICAgICAgY29uc3QgYSA9IGJvZHkuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgIGNvbnN0IGIgPSBib2R5LmNoYXJDb2RlQXQoaSArIDIpO1xuICAgICAgICBjb25zdCBpc0hleCA9IGlzSGV4RGlnaXQoYSkgJiYgaXNIZXhEaWdpdChiKTtcblxuICAgICAgICBpZiAoaXNIZXgpIHtcbiAgICAgICAgICBlZmZlY3RpdmVMZW4gLT0gMjtcbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcGFkID0gMDtcbiAgICBsZXQgaWR4ID0gbGVuIC0gMTtcblxuICAgIGNvbnN0IHRhaWxJc1BjdDNEID0gKGopID0+XG4gICAgICBqID49IDIgJiZcbiAgICAgIGJvZHkuY2hhckNvZGVBdChqIC0gMikgPT09IDM3ICYmIC8vICclJ1xuICAgICAgYm9keS5jaGFyQ29kZUF0KGogLSAxKSA9PT0gNTEgJiYgLy8gJzMnXG4gICAgICAoYm9keS5jaGFyQ29kZUF0KGopID09PSA2OCB8fCBib2R5LmNoYXJDb2RlQXQoaikgPT09IDEwMCk7IC8vICdEJyBvciAnZCdcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgaWYgKGJvZHkuY2hhckNvZGVBdChpZHgpID09PSA2MSAvKiAnPScgKi8pIHtcbiAgICAgICAgcGFkKys7XG4gICAgICAgIGlkeC0tO1xuICAgICAgfSBlbHNlIGlmICh0YWlsSXNQY3QzRChpZHgpKSB7XG4gICAgICAgIHBhZCsrO1xuICAgICAgICBpZHggLT0gMztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFkID09PSAxICYmIGlkeCA+PSAwKSB7XG4gICAgICBpZiAoYm9keS5jaGFyQ29kZUF0KGlkeCkgPT09IDYxIC8qICc9JyAqLykge1xuICAgICAgICBwYWQrKztcbiAgICAgIH0gZWxzZSBpZiAodGFpbElzUGN0M0QoaWR4KSkge1xuICAgICAgICBwYWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBncm91cHMgPSBNYXRoLmZsb29yKGVmZmVjdGl2ZUxlbiAvIDQpO1xuICAgIGNvbnN0IGJ5dGVzID0gZ3JvdXBzICogMyAtIChwYWQgfHwgMCk7XG4gICAgcmV0dXJuIGJ5dGVzID4gMCA/IGJ5dGVzIDogMDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgVVRGLTggYnl0ZSBsZW5ndGggZGlyZWN0bHkgZnJvbSBVVEYtMTYgY29kZSB1bml0cyB3aXRob3V0IGFsbG9jYXRpbmdcbiAgLy8gYSBieXRlIGJ1ZmZlciAoVGV4dEVuY29kZXIuZW5jb2RlIHdvdWxkIGRlZmVhdCB0aGUgRG9TIGd1YXJkIG9uIGxhcmdlIGJvZGllcykuXG4gIC8vIFZhbGlkICVYWCB0cmlwbGV0cyBjb3VudCBhcyBvbmUgZGVjb2RlZCBieXRlOyB0aGlzIG1hdGNoZXMgdGhlIGJ5dGVzIHRoYXRcbiAgLy8gZGVjb2RlVVJJQ29tcG9uZW50KGJvZHkpIHdvdWxkIHByb2R1Y2UgYmVmb3JlIEJ1ZmZlciByZS1lbmNvZGVzIHRoZSBzdHJpbmcuXG4gIGxldCBieXRlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBib2R5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgYyA9IGJvZHkuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA9PT0gMzcgLyogJyUnICovICYmIGlzUGVyY2VudEVuY29kZWRCeXRlKGJvZHksIGksIGxlbikpIHtcbiAgICAgIGJ5dGVzICs9IDE7XG4gICAgICBpICs9IDI7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MCkge1xuICAgICAgYnl0ZXMgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgYnl0ZXMgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmICYmIGkgKyAxIDwgbGVuKSB7XG4gICAgICBjb25zdCBuZXh0ID0gYm9keS5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgICAgIGlmIChuZXh0ID49IDB4ZGMwMCAmJiBuZXh0IDw9IDB4ZGZmZikge1xuICAgICAgICBieXRlcyArPSA0O1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieXRlcyArPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcyArPSAzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmNvbnN0IFZFUlNJT04gPSBcIjEuMTguMVwiO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHsgaXNGdW5jdGlvbiB9ID0gdXRpbHMkMTtcblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgdG8gYSBMYXRpbi0xIGJ5dGUgc3RyaW5nIGZvciB1c2Ugd2l0aCBidG9hKCkuXG4gKiBUaGlzIGlzIGEgbW9kZXJuIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZCB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkgcGF0dGVybi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVVRGLTggYnl0ZXMgYXMgYSBMYXRpbi0xIHN0cmluZ1xuICovXG5jb25zdCBlbmNvZGVVVEY4ID0gKHN0cikgPT5cbiAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZ2ksIChfLCBoZXgpID0+XG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSlcbiAgKTtcblxuLy8gTm9kZSdzIFdIQVRXRyBVUkwgcGFyc2VyIHJldHVybnMgYHVzZXJuYW1lYCBhbmQgYHBhc3N3b3JkYCBwZXJjZW50LWVuY29kZWQuXG4vLyBEZWNvZGUgYmVmb3JlIGNvbXBvc2luZyB0aGUgYGF1dGhgIG9wdGlvbiBzbyBjcmVkZW50aWFscyBzdWNoIGFzXG4vLyBgbXklNDBlbWFpbC5jb206cGFzc2AgYXJlIHNlbnQgYXMgYG15QGVtYWlsLmNvbTpwYXNzYC4gRmFsbHMgYmFjayB0byB0aGVcbi8vIG9yaWdpbmFsIHZhbHVlIGZvciBtYWxmb3JtZWQgaW5wdXQgc28gYSBiYWQgZW5jb2RpbmcgbmV2ZXIgdGhyb3dzLlxuY29uc3QgZGVjb2RlVVJJQ29tcG9uZW50U2FmZSA9ICh2YWx1ZSkgPT4ge1xuICBpZiAoIXV0aWxzJDEuaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmNvbnN0IHRlc3QgPSAoZm4sIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgbWF5YmVXaXRoQXV0aENyZWRlbnRpYWxzID0gKHVybCkgPT4ge1xuICBjb25zdCBwcm90b2NvbEluZGV4ID0gdXJsLmluZGV4T2YoJzovLycpO1xuICBsZXQgdXJsVG9DaGVjayA9IHVybDtcbiAgaWYgKHByb3RvY29sSW5kZXggIT09IC0xKSB7XG4gICAgdXJsVG9DaGVjayA9IHVybFRvQ2hlY2suc2xpY2UocHJvdG9jb2xJbmRleCArIDMpO1xuICB9XG4gIHJldHVybiB1cmxUb0NoZWNrLmluY2x1ZGVzKCdAJykgfHwgdXJsVG9DaGVjay5pbmNsdWRlcygnOicpO1xufTtcblxuY29uc3QgZmFjdG9yeSA9IChlbnYpID0+IHtcbiAgY29uc3QgZ2xvYmFsT2JqZWN0ID1cbiAgICB1dGlscyQxLmdsb2JhbCAhPT0gdW5kZWZpbmVkICYmIHV0aWxzJDEuZ2xvYmFsICE9PSBudWxsXG4gICAgICA/IHV0aWxzJDEuZ2xvYmFsXG4gICAgICA6IGdsb2JhbFRoaXM7XG4gIGNvbnN0IHsgUmVhZGFibGVTdHJlYW0sIFRleHRFbmNvZGVyIH0gPSBnbG9iYWxPYmplY3Q7XG5cbiAgZW52ID0gdXRpbHMkMS5tZXJnZS5jYWxsKFxuICAgIHtcbiAgICAgIHNraXBVbmRlZmluZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBSZXF1ZXN0OiBnbG9iYWxPYmplY3QuUmVxdWVzdCxcbiAgICAgIFJlc3BvbnNlOiBnbG9iYWxPYmplY3QuUmVzcG9uc2UsXG4gICAgfSxcbiAgICBlbnZcbiAgKTtcblxuICBjb25zdCB7IGZldGNoOiBlbnZGZXRjaCwgUmVxdWVzdCwgUmVzcG9uc2UgfSA9IGVudjtcbiAgY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IGVudkZldGNoID8gaXNGdW5jdGlvbihlbnZGZXRjaCkgOiB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbic7XG4gIGNvbnN0IGlzUmVxdWVzdFN1cHBvcnRlZCA9IGlzRnVuY3Rpb24oUmVxdWVzdCk7XG4gIGNvbnN0IGlzUmVzcG9uc2VTdXBwb3J0ZWQgPSBpc0Z1bmN0aW9uKFJlc3BvbnNlKTtcblxuICBpZiAoIWlzRmV0Y2hTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiBpc0Z1bmN0aW9uKFJlYWRhYmxlU3RyZWFtKTtcblxuICBjb25zdCBlbmNvZGVUZXh0ID1cbiAgICBpc0ZldGNoU3VwcG9ydGVkICYmXG4gICAgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyAoXG4gICAgICAgICAgKGVuY29kZXIpID0+IChzdHIpID0+XG4gICAgICAgICAgICBlbmNvZGVyLmVuY29kZShzdHIpXG4gICAgICAgICkobmV3IFRleHRFbmNvZGVyKCkpXG4gICAgICA6IGFzeW5jIChzdHIpID0+IG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXF1ZXN0KHN0cikuYXJyYXlCdWZmZXIoKSkpO1xuXG4gIGNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9XG4gICAgaXNSZXF1ZXN0U3VwcG9ydGVkICYmXG4gICAgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICAgIHRlc3QoKCkgPT4ge1xuICAgICAgbGV0IGR1cGxleEFjY2Vzc2VkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICAgICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBnZXQgZHVwbGV4KCkge1xuICAgICAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gJ2hhbGYnO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gcmVxdWVzdC5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJyk7XG5cbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0LmJvZHkuY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG4gICAgfSk7XG5cbiAgY29uc3Qgc3VwcG9ydHNSZXNwb25zZVN0cmVhbSA9XG4gICAgaXNSZXNwb25zZVN1cHBvcnRlZCAmJlxuICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiZcbiAgICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuICBjb25zdCByZXNvbHZlcnMgPSB7XG4gICAgc3RyZWFtOiBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmICgocmVzKSA9PiByZXMuYm9keSksXG4gIH07XG5cbiAgaXNGZXRjaFN1cHBvcnRlZCAmJlxuICAgICgoKSA9PiB7XG4gICAgICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgICFyZXNvbHZlcnNbdHlwZV0gJiZcbiAgICAgICAgICAocmVzb2x2ZXJzW3R5cGVdID0gKHJlcywgY29uZmlnKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWV0aG9kID0gcmVzICYmIHJlc1t0eXBlXTtcblxuICAgICAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwocmVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXNwb25zZSB0eXBlICcke3R5cGV9JyBpcyBub3Qgc3VwcG9ydGVkYCxcbiAgICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQsXG4gICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pKCk7XG5cbiAgY29uc3QgZ2V0Qm9keUxlbmd0aCA9IGFzeW5jIChib2R5KSA9PiB7XG4gICAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNCbG9iKGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5zaXplO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICAgIGNvbnN0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKGF3YWl0IF9yZXF1ZXN0LmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMkMS5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG4gICAgICBib2R5ID0gYm9keSArICcnO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzU3RyaW5nKGJvZHkpKSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGVuY29kZVRleHQoYm9keSkpLmJ5dGVMZW5ndGg7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVCb2R5TGVuZ3RoID0gYXN5bmMgKGhlYWRlcnMsIGJvZHkpID0+IHtcbiAgICBjb25zdCBsZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICAgIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IGdldEJvZHlMZW5ndGgoYm9keSkgOiBsZW5ndGg7XG4gIH07XG5cbiAgcmV0dXJuIGFzeW5jIChjb25maWcpID0+IHtcbiAgICBsZXQge1xuICAgICAgdXJsLFxuICAgICAgbWV0aG9kLFxuICAgICAgZGF0YSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIGNhbmNlbFRva2VuLFxuICAgICAgdGltZW91dCxcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgICByZXNwb25zZVR5cGUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICAgIGZldGNoT3B0aW9ucyxcbiAgICAgIG1heENvbnRlbnRMZW5ndGgsXG4gICAgICBtYXhCb2R5TGVuZ3RoLFxuICAgIH0gPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG5cbiAgICBjb25zdCBoYXNNYXhDb250ZW50TGVuZ3RoID0gdXRpbHMkMS5pc051bWJlcihtYXhDb250ZW50TGVuZ3RoKSAmJiBtYXhDb250ZW50TGVuZ3RoID4gLTE7XG4gICAgY29uc3QgaGFzTWF4Qm9keUxlbmd0aCA9IHV0aWxzJDEuaXNOdW1iZXIobWF4Qm9keUxlbmd0aCkgJiYgbWF4Qm9keUxlbmd0aCA+IC0xO1xuICAgIGNvbnN0IG93biA9IChrZXkpID0+ICh1dGlscyQxLmhhc093blByb3AoY29uZmlnLCBrZXkpID8gY29uZmlnW2tleV0gOiB1bmRlZmluZWQpO1xuXG4gICAgbGV0IF9mZXRjaCA9IGVudkZldGNoIHx8IGZldGNoO1xuXG4gICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlID8gKHJlc3BvbnNlVHlwZSArICcnKS50b0xvd2VyQ2FzZSgpIDogJ3RleHQnO1xuXG4gICAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMoXG4gICAgICBbc2lnbmFsLCBjYW5jZWxUb2tlbiAmJiBjYW5jZWxUb2tlbi50b0Fib3J0U2lnbmFsKCldLFxuICAgICAgdGltZW91dFxuICAgICk7XG5cbiAgICBsZXQgcmVxdWVzdCA9IG51bGw7XG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9XG4gICAgICBjb21wb3NlZFNpZ25hbCAmJlxuICAgICAgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUgJiZcbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICAgIC8vIEF4aW9zRXJyb3Igd2UgcmFpc2Ugd2hpbGUgdGhlIHJlcXVlc3QgYm9keSBpcyBiZWluZyBzdHJlYW1lZC4gQ2FwdHVyZWRcbiAgICAvLyBieSBpZGVudGl0eSBzbyB0aGUgY2F0Y2ggYmxvY2sgY2FuIHN1cmZhY2UgaXQgZGlyZWN0bHksIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyBob3cgdGhlIHJ1bnRpbWUgd3JhcHMgdGhlIHJlc3VsdGluZyBmZXRjaCByZWplY3Rpb24gKHVuZGljaSBleHBvc2VzIGl0XG4gICAgLy8gYXMgYGVyci5jYXVzZWA7IHNvbWUgYnJvd3NlcnMgZHJvcCB0aGUgb3JpZ2luYWwgZXJyb3IgZW50aXJlbHkpLlxuICAgIGxldCBwZW5kaW5nQm9keUVycm9yID0gbnVsbDtcblxuICAgIGNvbnN0IG1heEJvZHlMZW5ndGhFcnJvciA9ICgpID0+XG4gICAgICBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgJ1JlcXVlc3QgYm9keSBsYXJnZXIgdGhhbiBtYXhCb2R5TGVuZ3RoIGxpbWl0JyxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgICBsZXQgYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNvbmZpZ0F1dGggPSBvd24oJ2F1dGgnKTtcblxuICAgICAgaWYgKGNvbmZpZ0F1dGgpIHtcbiAgICAgICAgY29uc3QgdXNlcm5hbWUgPSB1dGlscyQxLmdldFNhZmVQcm9wKGNvbmZpZ0F1dGgsICd1c2VybmFtZScpIHx8ICcnO1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IHV0aWxzJDEuZ2V0U2FmZVByb3AoY29uZmlnQXV0aCwgJ3Bhc3N3b3JkJykgfHwgJyc7XG4gICAgICAgIGF1dGggPSB7XG4gICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgcGFzc3dvcmRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1heWJlV2l0aEF1dGhDcmVkZW50aWFscyh1cmwpKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVSTCA9IG5ldyBVUkwodXJsLCBwbGF0Zm9ybS5vcmlnaW4pO1xuXG4gICAgICAgIGlmICghYXV0aCAmJiAocGFyc2VkVVJMLnVzZXJuYW1lIHx8IHBhcnNlZFVSTC5wYXNzd29yZCkpIHtcbiAgICAgICAgICBjb25zdCB1cmxVc2VybmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudFNhZmUocGFyc2VkVVJMLnVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCB1cmxQYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudFNhZmUocGFyc2VkVVJMLnBhc3N3b3JkKTtcbiAgICAgICAgICBhdXRoID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IHVybFVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVybFBhc3N3b3JkXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZWRVUkwudXNlcm5hbWUgfHwgcGFyc2VkVVJMLnBhc3N3b3JkKSB7XG4gICAgICAgICAgcGFyc2VkVVJMLnVzZXJuYW1lID0gJyc7XG4gICAgICAgICAgcGFyc2VkVVJMLnBhc3N3b3JkID0gJyc7XG4gICAgICAgICAgdXJsID0gcGFyc2VkVVJMLmhyZWY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF1dGgpIHtcbiAgICAgICAgaGVhZGVycy5kZWxldGUoJ2F1dGhvcml6YXRpb24nKTtcbiAgICAgICAgaGVhZGVycy5zZXQoXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nLFxuICAgICAgICAgICdCYXNpYyAnICsgYnRvYShlbmNvZGVVVEY4KChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkIHx8ICcnKSkpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZm9yY2UgbWF4Q29udGVudExlbmd0aCBmb3IgZGF0YTogVVJMcyB1cC1mcm9udCBzbyB3ZSBuZXZlciBtYXRlcmlhbGl6ZVxuICAgICAgLy8gYW4gb3ZlcnNpemVkIHBheWxvYWQuIFRoZSBIVFRQIGFkYXB0ZXIgYXBwbGllcyB0aGUgc2FtZSBjaGVjayAoc2VlIGh0dHAuanNcbiAgICAgIC8vIFwiaWYgKHByb3RvY29sID09PSAnZGF0YTonKVwiIGJyYW5jaCkuXG4gICAgICBpZiAoaGFzTWF4Q29udGVudExlbmd0aCAmJiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuc3RhcnRzV2l0aCgnZGF0YTonKSkge1xuICAgICAgICBjb25zdCBlc3RpbWF0ZWQgPSBlc3RpbWF0ZURhdGFVUkxEZWNvZGVkQnl0ZXModXJsKTtcbiAgICAgICAgaWYgKGVzdGltYXRlZCA+IG1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgICdtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgJyArIG1heENvbnRlbnRMZW5ndGggKyAnIGV4Y2VlZGVkJyxcbiAgICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZm9yY2UgbWF4Qm9keUxlbmd0aCBhZ2FpbnN0IGtub3duLXNpemUgYm9kaWVzIGJlZm9yZSBkaXNwYXRjaCB1c2luZ1xuICAgICAgLy8gdGhlIGJvZHkncyAqYWN0dWFsKiBzaXplIOKAlCBuZXZlciBhIGNhbGxlci1kZWNsYXJlZCBDb250ZW50LUxlbmd0aCxcbiAgICAgIC8vIHdoaWNoIGNvdWxkIHVuZGVyLXJlcG9ydCB0byBzbGlwIGFuIG92ZXJzaXplZCBib2R5IHBhc3QgdGhlIGNoZWNrLlxuICAgICAgLy8gVW5rbm93bi1zaXplIHN0cmVhbXMgcmV0dXJuIHVuZGVmaW5lZCBoZXJlIGFuZCBhcmUgY291bnRlZCBwZXItY2h1bmtcbiAgICAgIC8vIGJlbG93IGFzIGZldGNoIGNvbnN1bWVzIHRoZW0uXG4gICAgICBpZiAoaGFzTWF4Qm9keUxlbmd0aCAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnKSB7XG4gICAgICAgIGNvbnN0IG91dGJvdW5kTGVuZ3RoID0gYXdhaXQgZ2V0Qm9keUxlbmd0aChkYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRib3VuZExlbmd0aCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUob3V0Ym91bmRMZW5ndGgpKSB7XG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGggPSBvdXRib3VuZExlbmd0aDtcbiAgICAgICAgICBpZiAob3V0Ym91bmRMZW5ndGggPiBtYXhCb2R5TGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBtYXhCb2R5TGVuZ3RoRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQSBzdHJlYW1lZCBib2R5IHVuZGVyIG1heEJvZHlMZW5ndGggbXVzdCBiZSBjb3VudGVkIGFzIGZldGNoIGNvbnN1bWVzXG4gICAgICAvLyBpdDsgaXRzIHNpemUgaXMgbmV2ZXIgdHJ1c3RlZCBmcm9tIGEgY2FsbGVyLWRlY2xhcmVkIENvbnRlbnQtTGVuZ3RoLlxuICAgICAgY29uc3QgbXVzdEVuZm9yY2VTdHJlYW1Cb2R5ID1cbiAgICAgICAgaGFzTWF4Qm9keUxlbmd0aCAmJiAodXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpIHx8IHV0aWxzJDEuaXNTdHJlYW0oZGF0YSkpO1xuXG4gICAgICBjb25zdCB0cmFja1JlcXVlc3RTdHJlYW0gPSAoc3RyZWFtLCBvblByb2dyZXNzLCBmbHVzaCkgPT5cbiAgICAgICAgdHJhY2tTdHJlYW0oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIERFRkFVTFRfQ0hVTktfU0laRSxcbiAgICAgICAgICAobG9hZGVkQnl0ZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXNNYXhCb2R5TGVuZ3RoICYmIGxvYWRlZEJ5dGVzID4gbWF4Qm9keUxlbmd0aCkge1xuICAgICAgICAgICAgICB0aHJvdyAocGVuZGluZ0JvZHlFcnJvciA9IG1heEJvZHlMZW5ndGhFcnJvcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MgJiYgb25Qcm9ncmVzcyhsb2FkZWRCeXRlcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmbHVzaFxuICAgICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJlxuICAgICAgICBtZXRob2QgIT09ICdnZXQnICYmXG4gICAgICAgIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAgIChvblVwbG9hZFByb2dyZXNzIHx8IG11c3RFbmZvcmNlU3RyZWFtQm9keSlcbiAgICAgICkge1xuICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCA9XG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGggPT0gbnVsbCA/IGF3YWl0IHJlc29sdmVCb2R5TGVuZ3RoKGhlYWRlcnMsIGRhdGEpIDogcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgICAgICAgLy8gQSBkZWNsYXJlZCBsZW5ndGggb2YgMCBpcyBvbmx5IHRydXN0ZWQgdG8gc2tpcCB0aGUgd3JhcCB3aGVuIHdlIGFyZVxuICAgICAgICAvLyBub3QgZW5mb3JjaW5nIGEgc3RyZWFtIGxpbWl0ICh3aGljaCBtdXN0IG5vdCByZWx5IG9uIHRoYXQgaGVhZGVyKS5cbiAgICAgICAgaWYgKHJlcXVlc3RDb250ZW50TGVuZ3RoICE9PSAwIHx8IG11c3RFbmZvcmNlU3RyZWFtQm9keSkge1xuICAgICAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICAgICAgZHVwbGV4OiAnaGFsZicsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgY29udGVudFR5cGVIZWFkZXI7XG5cbiAgICAgICAgICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpICYmIChjb250ZW50VHlwZUhlYWRlciA9IF9yZXF1ZXN0LmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID1cbiAgICAgICAgICAgICAgKG9uVXBsb2FkUHJvZ3Jlc3MgJiZcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgICAgICAgICApKSB8fFxuICAgICAgICAgICAgICBbXTtcblxuICAgICAgICAgICAgZGF0YSA9IHRyYWNrUmVxdWVzdFN0cmVhbShfcmVxdWVzdC5ib2R5LCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBtdXN0RW5mb3JjZVN0cmVhbUJvZHkgJiZcbiAgICAgICAgIWlzUmVxdWVzdFN1cHBvcnRlZCAmJlxuICAgICAgICBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gICAgICAgIG1ldGhvZCAhPT0gJ2dldCcgJiZcbiAgICAgICAgbWV0aG9kICE9PSAnaGVhZCdcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gdHJhY2tSZXF1ZXN0U3RyZWFtKGRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbXVzdEVuZm9yY2VTdHJlYW1Cb2R5ICYmXG4gICAgICAgIGlzUmVxdWVzdFN1cHBvcnRlZCAmJlxuICAgICAgICAhc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmXG4gICAgICAgIG1ldGhvZCAhPT0gJ2dldCcgJiZcbiAgICAgICAgbWV0aG9kICE9PSAnaGVhZCdcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAnU3RyZWFtIHJlcXVlc3QgYm9kaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGZldGNoIGltcGxlbWVudGF0aW9uJyxcbiAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXV0aWxzJDEuaXNTdHJpbmcod2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgICB3aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnb21pdCc7XG4gICAgICB9XG5cbiAgICAgIC8vIENsb3VkZmxhcmUgV29ya2VycyB0aHJvd3Mgd2hlbiBjcmVkZW50aWFscyBhcmUgZGVmaW5lZFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGZsYXJlL3dvcmtlcmQvaXNzdWVzLzkwMlxuICAgICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IGlzUmVxdWVzdFN1cHBvcnRlZCAmJiAnY3JlZGVudGlhbHMnIGluIFJlcXVlc3QucHJvdG90eXBlO1xuXG4gICAgICAvLyBJZiBkYXRhIGlzIEZvcm1EYXRhIGFuZCBDb250ZW50LVR5cGUgaXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YSB3aXRob3V0IGJvdW5kYXJ5LFxuICAgICAgLy8gZGVsZXRlIGl0IHNvIGZldGNoIGNhbiBzZXQgaXQgY29ycmVjdGx5IHdpdGggdGhlIGJvdW5kYXJ5XG4gICAgICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29udGVudFR5cGUgJiZcbiAgICAgICAgICAvXm11bHRpcGFydFxcL2Zvcm0tZGF0YS9pLnRlc3QoY29udGVudFR5cGUpICYmXG4gICAgICAgICAgIS9ib3VuZGFyeT0vaS50ZXN0KGNvbnRlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBoZWFkZXJzLmRlbGV0ZSgnY29udGVudC10eXBlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IFVzZXItQWdlbnQgaGVhZGVyIGlmIG5vdCBhbHJlYWR5IHNldCAoZmV0Y2ggZGVmYXVsdHMgdG8gJ25vZGUnIGluIE5vZGUuanMpXG4gICAgICBoZWFkZXJzLnNldCgnVXNlci1BZ2VudCcsICdheGlvcy8nICsgVkVSU0lPTiwgZmFsc2UpO1xuXG4gICAgICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgICAgc2lnbmFsOiBjb21wb3NlZFNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgaGVhZGVyczogdG9CeXRlU3RyaW5nSGVhZGVyT2JqZWN0KGhlYWRlcnMubm9ybWFsaXplKCkpLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICBkdXBsZXg6ICdoYWxmJyxcbiAgICAgICAgY3JlZGVudGlhbHM6IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPyB3aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0ID0gaXNSZXF1ZXN0U3VwcG9ydGVkICYmIG5ldyBSZXF1ZXN0KHVybCwgcmVzb2x2ZWRPcHRpb25zKTtcblxuICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgKGlzUmVxdWVzdFN1cHBvcnRlZFxuICAgICAgICA/IF9mZXRjaChyZXF1ZXN0LCBmZXRjaE9wdGlvbnMpXG4gICAgICAgIDogX2ZldGNoKHVybCwgcmVzb2x2ZWRPcHRpb25zKSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICAvLyBDaGVhcCBwcmUtY2hlY2s6IGlmIHRoZSBzZXJ2ZXIgaG9uZXN0bHkgZGVjbGFyZXMgYSBjb250ZW50LWxlbmd0aCB0aGF0XG4gICAgICAvLyBhbHJlYWR5IGV4Y2VlZHMgdGhlIGNhcCwgcmVqZWN0IGJlZm9yZSB3ZSBzdGFydCBzdHJlYW1pbmcuXG4gICAgICBpZiAoaGFzTWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWNsYXJlZExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2VIZWFkZXJzLmdldENvbnRlbnRMZW5ndGgoKSk7XG4gICAgICAgIGlmIChkZWNsYXJlZExlbmd0aCAhPSBudWxsICYmIGRlY2xhcmVkTGVuZ3RoID4gbWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICAgJ21heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAnICsgbWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNTdHJlYW1SZXNwb25zZSA9XG4gICAgICAgIHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScgfHwgcmVzcG9uc2VUeXBlID09PSAncmVzcG9uc2UnKTtcblxuICAgICAgaWYgKFxuICAgICAgICBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcbiAgICAgICAgKG9uRG93bmxvYWRQcm9ncmVzcyB8fCBoYXNNYXhDb250ZW50TGVuZ3RoIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgIG9wdGlvbnNbcHJvcF0gPSByZXNwb25zZVtwcm9wXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50TGVuZ3RoID0gdXRpbHMkMS50b0Zpbml0ZU51bWJlcihyZXNwb25zZUhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID1cbiAgICAgICAgICAob25Eb3dubG9hZFByb2dyZXNzICYmXG4gICAgICAgICAgICBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgICAgICByZXNwb25zZUNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uRG93bmxvYWRQcm9ncmVzcyksIHRydWUpXG4gICAgICAgICAgICApKSB8fFxuICAgICAgICAgIFtdO1xuXG4gICAgICAgIGxldCBieXRlc1JlYWQgPSAwO1xuICAgICAgICBjb25zdCBvbkNodW5rUHJvZ3Jlc3MgPSAobG9hZGVkQnl0ZXMpID0+IHtcbiAgICAgICAgICBpZiAoaGFzTWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgYnl0ZXNSZWFkID0gbG9hZGVkQnl0ZXM7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID4gbWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgICAgICAnbWF4Q29udGVudExlbmd0aCBzaXplIG9mICcgKyBtYXhDb250ZW50TGVuZ3RoICsgJyBleGNlZWRlZCcsXG4gICAgICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9uUHJvZ3Jlc3MgJiYgb25Qcm9ncmVzcyhsb2FkZWRCeXRlcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoXG4gICAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvbkNodW5rUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICAgIGZsdXNoICYmIGZsdXNoKCk7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSAmJiB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlIHx8ICd0ZXh0JztcblxuICAgICAgbGV0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc29sdmVyc1t1dGlscyQxLmZpbmRLZXkocmVzb2x2ZXJzLCByZXNwb25zZVR5cGUpIHx8ICd0ZXh0J10oXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICBjb25maWdcbiAgICAgICk7XG5cbiAgICAgIC8vIEZhbGxiYWNrIGVuZm9yY2VtZW50IGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBSZWFkYWJsZVN0cmVhbSBzdXBwb3J0XG4gICAgICAvLyAobGVnYWN5IHJ1bnRpbWVzKS4gRGV0ZWN0IG1hdGVyaWFsaXplZCBzaXplIGZyb20gdHlwZWQgb3V0cHV0OyBza2lwXG4gICAgICAvLyBzdHJlYW1zL1Jlc3BvbnNlIHBhc3N0aHJvdWdoIHNpbmNlIHRoZSB1c2VyIHdpbGwgcmVhZCB0aG9zZSB0aGVtc2VsdmVzLlxuICAgICAgaWYgKGhhc01heENvbnRlbnRMZW5ndGggJiYgIXN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgIWlzU3RyZWFtUmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IG1hdGVyaWFsaXplZFNpemU7XG4gICAgICAgIGlmIChyZXNwb25zZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2VEYXRhLmJ5dGVMZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWRTaXplID0gcmVzcG9uc2VEYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VEYXRhLnNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWRTaXplID0gcmVzcG9uc2VEYXRhLnNpemU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VEYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbWF0ZXJpYWxpemVkU2l6ZSA9XG4gICAgICAgICAgICAgIHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHJlc3BvbnNlRGF0YSkuYnl0ZUxlbmd0aFxuICAgICAgICAgICAgICAgIDogcmVzcG9uc2VEYXRhLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRlcmlhbGl6ZWRTaXplID09PSAnbnVtYmVyJyAmJiBtYXRlcmlhbGl6ZWRTaXplID4gbWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICAgJ21heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAnICsgbWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBoZWFkZXJzOiBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgICAgLy8gU2FmYXJpIGNhbiBzdXJmYWNlIGZldGNoIGFib3J0cyBhcyBhIERPTUV4Y2VwdGlvbi1saWtlIG9iamVjdCB3aG9zZVxuICAgICAgLy8gYnJhbmRlZCBnZXR0ZXJzIHRocm93LiBQcmVmZXIgb3VyIGNvbXBvc2VkIHNpZ25hbCByZWFzb24gYmVmb3JlIHJlYWRpbmdcbiAgICAgIC8vIHRoZSBjYXVnaHQgZXJyb3IsIHByZXNlcnZpbmcgdGltZW91dCB2cyBjYW5jZWxsYXRpb24gc2VtYW50aWNzLlxuICAgICAgaWYgKGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLmFib3J0ZWQgJiYgY29tcG9zZWRTaWduYWwucmVhc29uIGluc3RhbmNlb2YgQXhpb3NFcnJvcikge1xuICAgICAgICBjb25zdCBjYW5jZWxlZEVycm9yID0gY29tcG9zZWRTaWduYWwucmVhc29uO1xuICAgICAgICBjYW5jZWxlZEVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgcmVxdWVzdCAmJiAoY2FuY2VsZWRFcnJvci5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gICAgICAgIGlmIChlcnIgIT09IGNhbmNlbGVkRXJyb3IpIHtcbiAgICAgICAgICAvLyBOb24tZW51bWVyYWJsZSB0byBtYXRjaCBuYXRpdmUgRXJyb3IgYGNhdXNlYCBzZW1hbnRpY3Mgc28gbG9nZ2Vyc1xuICAgICAgICAgIC8vIGRvbid0IHJlY3Vyc2UgaW50byBjaXJjdWxhciBmZXRjaCBpbnRlcm5hbHMgKHNlZSAjNzIwNSkuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhbmNlbGVkRXJyb3IsICdjYXVzZScsIHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGNhbmNlbGVkRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cmZhY2UgYSBtYXhCb2R5TGVuZ3RoIHZpb2xhdGlvbiB3ZSByYWlzZWQgd2hpbGUgdGhlIHJlcXVlc3QgYm9keSB3YXNcbiAgICAgIC8vIGJlaW5nIHN0cmVhbWVkLiBNYXRjaGluZyBieSBpZGVudGl0eSAocmF0aGVyIHRoYW4gcmVhZGluZ1xuICAgICAgLy8gYGVyci5jYXVzZS5pc0F4aW9zRXJyb3JgKSBrZWVwcyB0aGUgZXJyb3IgZGV0ZXJtaW5pc3RpYyBhY3Jvc3MgcnVudGltZXNcbiAgICAgIC8vIGFuZCBhdm9pZHMgYm90aCBwcm90b3R5cGUtcG9sbHV0aW9uIHJlYWRzIGFuZCBtaXMtYXR0cmlidXRpbmcgYSBmb3JlaWduXG4gICAgICAvLyBBeGlvc0Vycm9yIHRoYXQgbWVyZWx5IGhhcHBlbmVkIHRvIGxhbmQgaW4gYGVyci5jYXVzZWAuXG4gICAgICBpZiAocGVuZGluZ0JvZHlFcnJvcikge1xuICAgICAgICByZXF1ZXN0ICYmICFwZW5kaW5nQm9keUVycm9yLnJlcXVlc3QgJiYgKHBlbmRpbmdCb2R5RXJyb3IucmVxdWVzdCA9IHJlcXVlc3QpO1xuICAgICAgICB0aHJvdyBwZW5kaW5nQm9keUVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS10aHJvdyBBeGlvc0Vycm9ycyB3ZSByYWlzZWQgc3luY2hyb25vdXNseSAoZGF0YTogVVJMIC8gY29udGVudC1sZW5ndGhcbiAgICAgIC8vIHByZS1jaGVja3MsIHJlc3BvbnNlIHNpemUgZW5mb3JjZW1lbnQpIHdpdGhvdXQgcmUtd3JhcHBpbmcgdGhlbS5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yKSB7XG4gICAgICAgIHJlcXVlc3QgJiYgIWVyci5yZXF1ZXN0ICYmIChlcnIucmVxdWVzdCA9IHJlcXVlc3QpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdUeXBlRXJyb3InICYmIC9Mb2FkIGZhaWxlZHxmZXRjaC9pLnRlc3QoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIGNvbnN0IG5ldHdvcmtFcnJvciA9IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICdOZXR3b3JrIEVycm9yJyxcbiAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGVyciAmJiBlcnIucmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgICAgLy8gTm9uLWVudW1lcmFibGUgdG8gbWF0Y2ggbmF0aXZlIEVycm9yIGBjYXVzZWAgc2VtYW50aWNzIHNvIGxvZ2dlcnNcbiAgICAgICAgLy8gZG9uJ3QgcmVjdXJzZSBpbnRvIGNpcmN1bGFyIGZldGNoIGludGVybmFscyAoc2VlICM3MjA1KS5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ldHdvcmtFcnJvciwgJ2NhdXNlJywge1xuICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICB2YWx1ZTogZXJyLmNhdXNlIHx8IGVycixcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXR3b3JrRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0LCBlcnIgJiYgZXJyLnJlc3BvbnNlKTtcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBzZWVkQ2FjaGUgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IGdldEZldGNoID0gKGNvbmZpZykgPT4ge1xuICBsZXQgZW52ID0gKGNvbmZpZyAmJiBjb25maWcuZW52KSB8fCB7fTtcbiAgY29uc3QgeyBmZXRjaCwgUmVxdWVzdCwgUmVzcG9uc2UgfSA9IGVudjtcbiAgY29uc3Qgc2VlZHMgPSBbUmVxdWVzdCwgUmVzcG9uc2UsIGZldGNoXTtcblxuICBsZXQgbGVuID0gc2VlZHMubGVuZ3RoLFxuICAgIGkgPSBsZW4sXG4gICAgc2VlZCxcbiAgICB0YXJnZXQsXG4gICAgbWFwID0gc2VlZENhY2hlO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBzZWVkID0gc2VlZHNbaV07XG4gICAgdGFyZ2V0ID0gbWFwLmdldChzZWVkKTtcblxuICAgIHRhcmdldCA9PT0gdW5kZWZpbmVkICYmIG1hcC5zZXQoc2VlZCwgKHRhcmdldCA9IGkgPyBuZXcgTWFwKCkgOiBmYWN0b3J5KGVudikpKTtcblxuICAgIG1hcCA9IHRhcmdldDtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5nZXRGZXRjaCgpO1xuXG4vKipcbiAqIEtub3duIGFkYXB0ZXJzIG1hcHBpbmcuXG4gKiBQcm92aWRlcyBlbnZpcm9ubWVudC1zcGVjaWZpYyBhZGFwdGVycyBmb3IgQXhpb3M6XG4gKiAtIGBodHRwYCBmb3IgTm9kZS5qc1xuICogLSBgeGhyYCBmb3IgYnJvd3NlcnNcbiAqIC0gYGZldGNoYCBmb3IgZmV0Y2ggQVBJLWJhc2VkIHJlcXVlc3RzXG4gKlxuICogQHR5cGUge09iamVjdDxzdHJpbmcsIEZ1bmN0aW9ufE9iamVjdD59XG4gKi9cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiB7XG4gICAgZ2V0OiBnZXRGZXRjaCxcbiAgfSxcbn07XG5cbi8vIEFzc2lnbiBhZGFwdGVyIG5hbWVzIGZvciBlYXNpZXIgZGVidWdnaW5nIGFuZCBpZGVudGlmaWNhdGlvblxudXRpbHMkMS5mb3JFYWNoKGtub3duQWRhcHRlcnMsIChmbiwgdmFsdWUpID0+IHtcbiAgaWYgKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE51bGwtcHJvdG8gZGVzY3JpcHRvcnMgc28gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlLmdldCBjYW5ub3QgdHVyblxuICAgICAgLy8gdGhlc2UgZGF0YSBkZXNjcmlwdG9ycyBpbnRvIGFjY2Vzc29yIGRlc2NyaXB0b3JzIG9uIHRoZSB3YXkgaW4uXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywgeyBfX3Byb3RvX186IG51bGwsIHZhbHVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHsgX19wcm90b19fOiBudWxsLCB2YWx1ZSB9KTtcbiAgfVxufSk7XG5cbi8qKlxuICogUmVuZGVyIGEgcmVqZWN0aW9uIHJlYXNvbiBzdHJpbmcgZm9yIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgYWRhcHRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBhZGFwdGVyIGlzIHJlc29sdmVkIChmdW5jdGlvbiwgbnVsbCwgb3IgZmFsc2UpXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfGZhbHNlfSBhZGFwdGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PlxuICB1dGlscyQxLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgYWRhcHRlciA9PT0gbnVsbCB8fCBhZGFwdGVyID09PSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IHN1aXRhYmxlIGFkYXB0ZXIgZnJvbSB0aGUgcHJvdmlkZWQgbGlzdC5cbiAqIFRyaWVzIGVhY2ggYWRhcHRlciBpbiBvcmRlciB1bnRpbCBhIHN1cHBvcnRlZCBvbmUgaXMgZm91bmQuXG4gKiBUaHJvd3MgYW4gQXhpb3NFcnJvciBpZiBubyBhZGFwdGVyIGlzIHN1aXRhYmxlLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfEZ1bmN0aW9uPnxzdHJpbmd8RnVuY3Rpb259IGFkYXB0ZXJzIC0gQWRhcHRlcihzKSBieSBuYW1lIG9yIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAtIEF4aW9zIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICogQHRocm93cyB7QXhpb3NFcnJvcn0gSWYgbm8gc3VpdGFibGUgYWRhcHRlciBpcyBhdmFpbGFibGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVkIGFkYXB0ZXIgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWRhcHRlcihhZGFwdGVycywgY29uZmlnKSB7XG4gIGFkYXB0ZXJzID0gdXRpbHMkMS5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICBjb25zdCB7IGxlbmd0aCB9ID0gYWRhcHRlcnM7XG4gIGxldCBuYW1lT3JBZGFwdGVyO1xuICBsZXQgYWRhcHRlcjtcblxuICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgIGxldCBpZDtcblxuICAgIGFkYXB0ZXIgPSBuYW1lT3JBZGFwdGVyO1xuXG4gICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICBpZiAoYWRhcHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZGFwdGVyICYmICh1dGlscyQxLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgKGFkYXB0ZXIgPSBhZGFwdGVyLmdldChjb25maWcpKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJlamVjdGVkUmVhc29uc1tpZCB8fCAnIycgKyBpXSA9IGFkYXB0ZXI7XG4gIH1cblxuICBpZiAoIWFkYXB0ZXIpIHtcbiAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKS5tYXAoXG4gICAgICAoW2lkLCBzdGF0ZV0pID0+XG4gICAgICAgIGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAoc3RhdGUgPT09IGZhbHNlID8gJ2lzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGVudmlyb25tZW50JyA6ICdpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCcpXG4gICAgKTtcblxuICAgIGxldCBzID0gbGVuZ3RoXG4gICAgICA/IHJlYXNvbnMubGVuZ3RoID4gMVxuICAgICAgICA/ICdzaW5jZSA6XFxuJyArIHJlYXNvbnMubWFwKHJlbmRlclJlYXNvbikuam9pbignXFxuJylcbiAgICAgICAgOiAnICcgKyByZW5kZXJSZWFzb24ocmVhc29uc1swXSlcbiAgICAgIDogJ2FzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkJztcblxuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYWRhcHRlcjtcbn1cblxuLyoqXG4gKiBFeHBvcnRzIEF4aW9zIGFkYXB0ZXJzIGFuZCB1dGlsaXR5IHRvIHJlc29sdmUgYW4gYWRhcHRlclxuICovXG52YXIgYWRhcHRlcnMgPSB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGFkYXB0ZXIgZnJvbSBhIGxpc3Qgb2YgYWRhcHRlciBuYW1lcyBvciBmdW5jdGlvbnMuXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIGdldEFkYXB0ZXIsXG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgYWxsIGtub3duIGFkYXB0ZXJzXG4gICAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBGdW5jdGlvbnxPYmplY3Q+fVxuICAgKi9cbiAgYWRhcHRlcnM6IGtub3duQWRhcHRlcnMsXG59O1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoY29uZmlnLCBjb25maWcudHJhbnNmb3JtUmVxdWVzdCk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyLCBjb25maWcpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihcbiAgICBmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIEV4cG9zZSB0aGUgY3VycmVudCByZXNwb25zZSBvbiBjb25maWcgc28gdGhhdCB0cmFuc2Zvcm1SZXNwb25zZSBjYW5cbiAgICAgIC8vIGF0dGFjaCBpdCB0byBhbnkgQXhpb3NFcnJvciBpdCB0aHJvd3MgKGUuZy4gb24gSlNPTiBwYXJzZSBmYWlsdXJlKS5cbiAgICAgIC8vIFdlIGNsZWFuIGl0IHVwIGFmdGVyd2FyZHMgdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBjb25maWcgb2JqZWN0LlxuICAgICAgY29uZmlnLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKGNvbmZpZywgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLCByZXNwb25zZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgY29uZmlnLnJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25maWcucmVzcG9uc2UgPSByZWFzb24ucmVzcG9uc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLnJlc3BvbnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICB9XG4gICk7XG59XG5cbmNvbnN0IHZhbGlkYXRvcnMkMSA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9ycyQxW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMkMS50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICdbQXhpb3MgdicgK1xuICAgICAgVkVSU0lPTiArXG4gICAgICBcIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnXCIgK1xuICAgICAgb3B0ICtcbiAgICAgIFwiJ1wiICtcbiAgICAgIGRlc2MgK1xuICAgICAgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxudmFsaWRhdG9ycyQxLnNwZWxsaW5nID0gZnVuY3Rpb24gc3BlbGxpbmcoY29ycmVjdFNwZWxsaW5nKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGAke29wdH0gaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgJHtjb3JyZWN0U3BlbGxpbmd9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgfHwgb3B0aW9ucyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgLy8gVXNlIGhhc093blByb3BlcnR5IHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZS48b3B0PiBjYW5ub3Qgc3VwcGx5XG4gICAgLy8gYSBub24tZnVuY3Rpb24gdmFsaWRhdG9yIGFuZCBjYXVzZSBhIFR5cGVFcnJvci5cbiAgICBjb25zdCB2YWxpZGF0b3IgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLCBvcHQpID8gc2NoZW1hW29wdF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRvciA9IHtcbiAgYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9ycyQxLFxufTtcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnIHx8IHt9O1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teSA9IHt9O1xuXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZHVtbXkpIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWR1bW15LnN0YWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmlyc3ROZXdsaW5lSW5kZXggPSBkdW1teS5zdGFjay5pbmRleE9mKCdcXG4nKTtcblxuICAgICAgICAgIHJldHVybiBmaXJzdE5ld2xpbmVJbmRleCA9PT0gLTEgPyAnJyA6IGR1bW15LnN0YWNrLnNsaWNlKGZpcnN0TmV3bGluZUluZGV4ICsgMSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdE5ld2xpbmVJbmRleCA9IHN0YWNrLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kTmV3bGluZUluZGV4ID1cbiAgICAgICAgICAgICAgZmlyc3ROZXdsaW5lSW5kZXggPT09IC0xID8gLTEgOiBzdGFjay5pbmRleE9mKCdcXG4nLCBmaXJzdE5ld2xpbmVJbmRleCArIDEpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tXaXRob3V0VHdvVG9wTGluZXMgPVxuICAgICAgICAgICAgICBzZWNvbmROZXdsaW5lSW5kZXggPT09IC0xID8gJycgOiBzdGFjay5zbGljZShzZWNvbmROZXdsaW5lSW5kZXggKyAxKTtcblxuICAgICAgICAgICAgaWYgKCFTdHJpbmcoZXJyLnN0YWNrKS5lbmRzV2l0aChzdGFja1dpdGhvdXRUd29Ub3BMaW5lcykpIHtcbiAgICAgICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHRoZSBjYXNlIHdoZXJlIFwic3RhY2tcIiBpcyBhbiB1bi13cml0YWJsZSBwcm9wZXJ0eVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBfcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICAgIGlmICh0eXBlb2YgY29uZmlnT3JVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgICBjb25maWcudXJsID0gY29uZmlnT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZ09yVXJsIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7IHRyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVycyB9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhcbiAgICAgICAgdHJhbnNpdGlvbmFsLFxuICAgICAgICB7XG4gICAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgICBsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICAgIGFkdmVydGlzZVpzdGRBY2NlcHRFbmNvZGluZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1c1VuZGVmaW5lZFJlc29sdmVzOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICB9LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcmFtc1NlcmlhbGl6ZXIpKSB7XG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZTogcGFyYW1zU2VyaWFsaXplcixcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKFxuICAgICAgICAgIHBhcmFtc1NlcmlhbGl6ZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jb2RlOiB2YWxpZGF0b3JzLmZ1bmN0aW9uLFxuICAgICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHNcbiAgICBpZiAoY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzICE9PSB1bmRlZmluZWQpIDsgZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKFxuICAgICAgY29uZmlnLFxuICAgICAge1xuICAgICAgICBiYXNlVXJsOiB2YWxpZGF0b3JzLnNwZWxsaW5nKCdiYXNlVVJMJyksXG4gICAgICAgIHdpdGhYc3JmVG9rZW46IHZhbGlkYXRvcnMuc3BlbGxpbmcoJ3dpdGhYU1JGVG9rZW4nKSxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscyQxLm1lcmdlKGhlYWRlcnMuY29tbW9uLCBoZWFkZXJzW2NvbmZpZy5tZXRob2RdKTtcblxuICAgIGhlYWRlcnMgJiZcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdxdWVyeScsICdjb21tb24nXSwgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfSk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGNvbnN0IGxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmcgPVxuICAgICAgICB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLmxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc7XG5cbiAgICAgIGlmIChsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nKSB7XG4gICAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0KC4uLnJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2goLi4ucmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCwgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzLCBjb25maWcpO1xuICAgIHJldHVybiBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xuICB9XG59XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMkMS5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFxuICAgICAgbWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhOiBjb25maWcgJiYgdXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZywgJ2RhdGEnKSA/IGNvbmZpZy5kYXRhIDogdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICApO1xuICB9O1xufSk7XG5cbnV0aWxzJDEuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ3F1ZXJ5J10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFxuICAgICAgICBtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgaGVhZGVyczogaXNGb3JtXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9LFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICAvLyBRVUVSWSBpcyBhIHNhZmUvaWRlbXBvdGVudCByZWFkIG1ldGhvZDsgbXVsdGlwYXJ0IGZvcm0gYm9kaWVzIGRvbid0IGZpdFxuICAvLyBpdHMgc2VtYW50aWNzLCBzbyBubyBxdWVyeUZvcm0gc2hvcnRoYW5kIGlzIGdlbmVyYXRlZC5cbiAgaWYgKG1ldGhvZCAhPT0gJ3F1ZXJ5Jykge1xuICAgIEF4aW9zLnByb3RvdHlwZVttZXRob2QgKyAnRm9ybSddID0gZ2VuZXJhdGVIVFRQTWV0aG9kKHRydWUpO1xuICB9XG59KTtcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oKGNhbmNlbCkgPT4ge1xuICAgICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgIHRva2VuLl9saXN0ZW5lcnNbaV0oY2FuY2VsKTtcbiAgICAgIH1cbiAgICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbiA9IChvbmZ1bGZpbGxlZCkgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICB0b0Fib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCBhYm9ydCA9IChlcnIpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzY3JpYmUoYWJvcnQpO1xuXG4gICAgY29udHJvbGxlci5zaWduYWwudW5zdWJzY3JpYmUgPSAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gICAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gICAqL1xuICBzdGF0aWMgc291cmNlKCkge1xuICAgIGxldCBjYW5jZWw7XG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgICAgY2FuY2VsID0gYztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBjYW5jZWwsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgY29uc3QgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMkMS5pc09iamVjdChwYXlsb2FkKSAmJiBwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZTtcbn1cblxuY29uc3QgSHR0cFN0YXR1c0NvZGUgPSB7XG4gIENvbnRpbnVlOiAxMDAsXG4gIFN3aXRjaGluZ1Byb3RvY29sczogMTAxLFxuICBQcm9jZXNzaW5nOiAxMDIsXG4gIEVhcmx5SGludHM6IDEwMyxcbiAgT2s6IDIwMCxcbiAgQ3JlYXRlZDogMjAxLFxuICBBY2NlcHRlZDogMjAyLFxuICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246IDIwMyxcbiAgTm9Db250ZW50OiAyMDQsXG4gIFJlc2V0Q29udGVudDogMjA1LFxuICBQYXJ0aWFsQ29udGVudDogMjA2LFxuICBNdWx0aVN0YXR1czogMjA3LFxuICBBbHJlYWR5UmVwb3J0ZWQ6IDIwOCxcbiAgSW1Vc2VkOiAyMjYsXG4gIE11bHRpcGxlQ2hvaWNlczogMzAwLFxuICBNb3ZlZFBlcm1hbmVudGx5OiAzMDEsXG4gIEZvdW5kOiAzMDIsXG4gIFNlZU90aGVyOiAzMDMsXG4gIE5vdE1vZGlmaWVkOiAzMDQsXG4gIFVzZVByb3h5OiAzMDUsXG4gIFVudXNlZDogMzA2LFxuICBUZW1wb3JhcnlSZWRpcmVjdDogMzA3LFxuICBQZXJtYW5lbnRSZWRpcmVjdDogMzA4LFxuICBCYWRSZXF1ZXN0OiA0MDAsXG4gIFVuYXV0aG9yaXplZDogNDAxLFxuICBQYXltZW50UmVxdWlyZWQ6IDQwMixcbiAgRm9yYmlkZGVuOiA0MDMsXG4gIE5vdEZvdW5kOiA0MDQsXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IDQwNSxcbiAgTm90QWNjZXB0YWJsZTogNDA2LFxuICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDQwNyxcbiAgUmVxdWVzdFRpbWVvdXQ6IDQwOCxcbiAgQ29uZmxpY3Q6IDQwOSxcbiAgR29uZTogNDEwLFxuICBMZW5ndGhSZXF1aXJlZDogNDExLFxuICBQcmVjb25kaXRpb25GYWlsZWQ6IDQxMixcbiAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXG4gIFVyaVRvb0xvbmc6IDQxNCxcbiAgVW5zdXBwb3J0ZWRNZWRpYVR5cGU6IDQxNSxcbiAgUmFuZ2VOb3RTYXRpc2ZpYWJsZTogNDE2LFxuICBFeHBlY3RhdGlvbkZhaWxlZDogNDE3LFxuICBJbUFUZWFwb3Q6IDQxOCxcbiAgTWlzZGlyZWN0ZWRSZXF1ZXN0OiA0MjEsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHk6IDQyMixcbiAgTG9ja2VkOiA0MjMsXG4gIEZhaWxlZERlcGVuZGVuY3k6IDQyNCxcbiAgVG9vRWFybHk6IDQyNSxcbiAgVXBncmFkZVJlcXVpcmVkOiA0MjYsXG4gIFByZWNvbmRpdGlvblJlcXVpcmVkOiA0MjgsXG4gIFRvb01hbnlSZXF1ZXN0czogNDI5LFxuICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6IDQzMSxcbiAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6IDQ1MSxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogNTAwLFxuICBOb3RJbXBsZW1lbnRlZDogNTAxLFxuICBCYWRHYXRld2F5OiA1MDIsXG4gIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICBHYXRld2F5VGltZW91dDogNTA0LFxuICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDogNTA1LFxuICBWYXJpYW50QWxzb05lZ290aWF0ZXM6IDUwNixcbiAgSW5zdWZmaWNpZW50U3RvcmFnZTogNTA3LFxuICBMb29wRGV0ZWN0ZWQ6IDUwOCxcbiAgTm90RXh0ZW5kZWQ6IDUxMCxcbiAgTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDUxMSxcbiAgV2ViU2VydmVySXNEb3duOiA1MjEsXG4gIENvbm5lY3Rpb25UaW1lZE91dDogNTIyLFxuICBPcmlnaW5Jc1VucmVhY2hhYmxlOiA1MjMsXG4gIFRpbWVvdXRPY2N1cnJlZDogNTI0LFxuICBTc2xIYW5kc2hha2VGYWlsZWQ6IDUyNSxcbiAgSW52YWxpZFNzbENlcnRpZmljYXRlOiA1MjYsXG59O1xuXG5PYmplY3QuZW50cmllcyhIdHRwU3RhdHVzQ29kZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gIEh0dHBTdGF0dXNDb2RlW3ZhbHVlXSA9IGtleTtcbn0pO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybnMge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIGNvbnN0IGluc3RhbmNlID0gYmluZChBeGlvcy5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMkMS5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCwgeyBhbGxPd25LZXlzOiB0cnVlIH0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCwgbnVsbCwgeyBhbGxPd25LZXlzOiB0cnVlIH0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycztcblxuYXhpb3MuZm9ybVRvSlNPTiA9ICh0aGluZykgPT4gZm9ybURhdGFUb0pTT04odXRpbHMkMS5pc0hUTUxGb3JtKHRoaW5nKSA/IG5ldyBGb3JtRGF0YSh0aGluZykgOiB0aGluZyk7XG5cbmF4aW9zLmdldEFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlO1xuXG5heGlvcy5kZWZhdWx0ID0gYXhpb3M7XG5cbm1vZHVsZS5leHBvcnRzID0gYXhpb3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlvcy5janMubWFwXG4iLCJpbXBvcnQgZ2V0R2VuZXJhdG9yRnVuY3Rpb24gZnJvbSAnLi9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGdldEdlbmVyYXRvckZ1bmN0aW9uO1xuXG5leHBvcnQgeyBnZXRHZW5lcmF0b3JGdW5jdGlvbiBhcyAnbW9kdWxlLmV4cG9ydHMnIH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG5jb25zdCBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdGNvbnN0IGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHRjb25zdCBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyL3ZhbHVlIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRpZihBcnJheS5pc0FycmF5KGRlZmluaXRpb24pKSB7XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHdoaWxlKGkgPCBkZWZpbml0aW9uLmxlbmd0aCkge1xuXHRcdFx0dmFyIGtleSA9IGRlZmluaXRpb25baSsrXTtcblx0XHRcdHZhciBiaW5kaW5nID0gZGVmaW5pdGlvbltpKytdO1xuXHRcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRcdGlmKGJpbmRpbmcgPT09IDApIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBkZWZpbml0aW9uW2krK10gfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGJpbmRpbmcgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZihiaW5kaW5nID09PSAwKSB7IGkrKzsgfVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYoU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbmxldCBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MzU1KTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
15489
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Qsa0M7Ozs7Ozs7O0FDblFhO0FBQ2I7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0NBQWtDLEdBQUcsZ0NBQWdDLEdBQUcsK0JBQStCLEdBQUcsOEJBQThCLEdBQUcsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsMkJBQTJCLEdBQUcsNEJBQTRCLEdBQUcsNEJBQTRCLEdBQUcseUJBQXlCLEdBQUcsMEJBQTBCLEdBQUcsNkJBQTZCLEdBQUcsMkJBQTJCLEdBQUcsOEJBQThCLEdBQUcsMEJBQTBCLEdBQUcseUJBQXlCLEdBQUcsc0JBQXNCLEdBQUcsaUNBQWlDLEdBQUcseUJB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RUEsY0FBYztBQUNkLHlCQUFrQjtBQUNsQix5QkFBeUI7O0FBRXpCO0FBQ0EseUJBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsRUFBRTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsR0FBRztBQUNILGdEQUFnRDtBQUNoRCxHQUFHO0FBQ0gsc0RBQXNEO0FBQ3RELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxLQUFlO0FBQ2xDLGFBQWEsbUJBQU8sQ0FBQyxJQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQixrQkFBa0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUN6WGE7O0FBRWIsY0FBYyxtQkFBTyxDQUFDLEtBQWlCOztBQUV2QyxXQUFXLG1DQUFtQztBQUM5Qzs7Ozs7Ozs7O0FDTGE7O0FBRWIsV0FBVyxvQ0FBb0M7QUFDL0M7Ozs7Ozs7OztBQ0hhOztBQUViLHNCQUFzQixtQkFBTyxDQUFDLEtBQTBCO0FBQ3hELHVCQUF1QixtQkFBTyxDQUFDLEtBQXlCOztBQUV4RCxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFL0MsV0FBVyxhQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUMxQmE7O0FBRWIsV0FBVyxrQkFBa0I7QUFDN0I7Ozs7Ozs7OztBQ0hhOztBQUViLFdBQVcsYUFBYTtBQUN4QixZQUFZLG1CQUFPLENBQUMsSUFBUTs7QUFFNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7QUNkYTs7QUFFYixzQkFBc0IsbUJBQU8sQ0FBQyxLQUFvQjs7QUFFbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxVQUFVO0FBQ25ELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDckJhOztBQUViO0FBQ0Esb0JBQW9CLG1CQUFPLENBQUMsS0FBUzs7QUFFckMsV0FBVyxhQUFhO0FBQ3hCO0FBQ0EseUNBQXlDO0FBQ3pDLHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsMENBQTBDOztBQUUxQztBQUNBOzs7Ozs7Ozs7QUNiYTs7QUFFYixXQUFXLG1CQUFtQjtBQUM5QjtBQUNBO0FBQ0EsMkZBQTJGO0FBQzNGLDRDQUE0Qzs7QUFFNUMsY0FBYywyQkFBMkI7QUFDekM7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQyxrRUFBa0U7QUFDbEUscUVBQXFFOztBQUVyRTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLHVDQUF1Qzs7QUFFdkMsMkRBQTJEO0FBQzNELCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEMsMkVBQTJFOztBQUUzRSx5R0FBeUc7O0FBRXpHO0FBQ0EsNkNBQTZDOztBQUU3Qyw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQSw4QkFBOEIsb0JBQW9CO0FBQ2xELHVFQUF1RTtBQUN2RTs7QUFFQTtBQUNBOzs7Ozs7Ozs7QUM1Q2E7O0FBRWIsaUJBQWlCLG1CQUFPLENBQUMsS0FBbUI7O0FBRTVDLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7Ozs7Ozs7OztBQ1BhOztBQUViO0FBQ0E7QUFDQSxXQUFXLG1CQUFPLENBQUMsS0FBZTs7QUFFbEMsV0FBVyxhQUFhO0FBQ3hCOzs7Ozs7OztBQ1BBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXOztBQUVwQjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVc7O0FBRXBCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLFNBQVMsVUFBVTs7QUFFbkI7QUFDQTs7Ozs7Ozs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDMUJhOztBQUViLHFCQUFxQixtQkFBTyxDQUFDLEtBQXVCO0FBQ3BELGdCQUFnQixtQkFBTyxDQUFDLEtBQVk7O0FBRXBDOztBQUVBLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBLDJEQUEyRDs7QUFFM0QsV0FBVyxhQUFhO0FBQ3hCOzs7Ozs7Ozs7QUMzQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkJBQTZCLFdBQVc7QUFDeEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSwyQ0FBMkM7QUFDM0MsMkVBQTJFOztBQUUzRSwwQkFBMEI7O0FBRTFCLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsTUFBTSxZQUFZO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixnQkFBZ0I7QUFDaEIsa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQSxJQUFJO0FBQ0osaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLGdCQUFnQjtBQUNoQixrRUFBa0U7QUFDbEUsd0JBQXdCO0FBQ3hCLDZCQUE2QjtBQUM3QjtBQUNBLDZGQUE2RjtBQUM3RjtBQUNBOzs7Ozs7Ozs7QUNwR2E7O0FBRWIsZ0JBQWdCLG1CQUFPLENBQUMsS0FBWTtBQUNwQyxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFpQjtBQUM3QztBQUNBLHFCQUFxQixtQkFBTyxDQUFDLEtBQXVCO0FBQ3BELGVBQWUsbUJBQU8sQ0FBQyxLQUFXOztBQUVsQztBQUNBOztBQUVBLDJCQUEyQixtQkFBTyxDQUFDLEtBQW9CLENBQUM7O0FBRXhELFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUM5QmE7O0FBRWIsZ0JBQWdCLG1CQUFPLENBQUMsS0FBWTtBQUNwQyxxQkFBcUIsbUJBQU8sQ0FBQyxLQUF1QjtBQUNwRCxhQUFhLG1CQUFPLENBQUMsSUFBUTtBQUM3QixXQUFXLG1CQUFPLENBQUMsS0FBTTs7QUFFekIsV0FBVyxhQUFhO0FBQ3hCOztBQUVBO0FBQ0EsWUFBWSw0SkFBNEo7QUFDeEs7QUFDQSxZQUFZLFFBQVE7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyx1RUFBdUU7QUFDckY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsMEJBQTBCLHVCQUF1Qix1QkFBdUI7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQixRQUFRLGVBQWUsU0FBUztBQUMzRCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLFlBQVksd0tBQXdLO0FBQ3BMO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0Qzs7QUFFQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQ3BFYTs7QUFFYixzQkFBc0IsbUJBQU8sQ0FBQyxLQUFtQjs7QUFFakQsV0FBVyxhQUFhO0FBQ3hCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ1BBLGNBQWMsZUFBZSwrREFBK0QscUZBQXFGLGtDQUFrQyxrR0FBa0cseUJBQXlCLGdCQUFnQixzSkFBc0osVUFBVSxjQUFjLDRDQUE0QyxtQkFBbUIsYUFBYSxlQUFlLE1BQU0sY0FBYyxNQUFNLHlDQUF5QyxJQUFJLG1CQUFtQiw2REFBNkQsaURBQWlELG1DQUFtQyxJQUFJLElBQUksU0FBUyxhQUFhLGNBQWMsZUFBZSxnQkFBZ0IsNkRBQTZELG1CQUFtQixhQUFhLElBQUksc0NBQXNDLFNBQVMsb0RBQW9ELDJEQUEyRCxpRUFBZSxDQUFDLEVBQWdDO0FBQzVzQzs7Ozs7Ozs7Ozs7OztBQ0RhOztBQUViLFdBQVcsaUJBQWlCO0FBQzVCOzs7Ozs7Ozs7QUNIYTs7QUFFYixXQUFXLG1CQUFtQjtBQUM5Qjs7Ozs7Ozs7O0FDSGE7O0FBRWIsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBOzs7Ozs7Ozs7QUNMYTs7QUFFYixXQUFXLGlCQUFpQjtBQUM1Qjs7Ozs7Ozs7O0FDSGE7O0FBRWIsV0FBVyxpQkFBaUI7QUFDNUI7Ozs7Ozs7OztBQ0hhOztBQUViLFdBQVcsaUJBQWlCO0FBQzVCOzs7Ozs7Ozs7QUNIYTs7QUFFYixXQUFXLG1CQUFtQjtBQUM5Qjs7Ozs7Ozs7O0FDSGE7O0FBRWIsYUFBYSxtQkFBTyxDQUFDLEtBQVM7O0FBRTlCLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDVmE7O0FBRWIsV0FBVyxhQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDaEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOzs7Ozs7Ozs7QUN2TGhCOztBQUViLGdCQUFnQixtQkFBTyxDQUFDLEtBQVk7QUFDcEMsY0FBYyxtQkFBTyxDQUFDLEtBQVU7O0FBRWhDO0FBQ0EsaUJBQWlCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRXpDLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUNoQmE7O0FBRWIsbUJBQW1CLG1CQUFPLENBQUMsS0FBZTtBQUMxQyxhQUFhLG1CQUFPLENBQUMsS0FBc0I7QUFDM0MscUJBQXFCLG1CQUFPLENBQUMsS0FBMEI7QUFDdkQsV0FBVyxtQkFBTyxDQUFDLEtBQU07O0FBRXpCLGlCQUFpQixtQkFBTyxDQUFDLEtBQWdCO0FBQ3pDOztBQUVBLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDLElBQUk7QUFDSixxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekNBLDBDQUErQztBQUUvQyw0Q0FBK0M7QUFFL0MsMkNBQW9DO0FBQ3BDLDZEQUErRTtBQUMvRSxpREFBMkM7QUFDM0MscURBQW1EO0FBQ25ELHdEQUF5RDtBQUN6RCxxQ0FBZ0Q7QUFFaEQsTUFBYSxXQUFXO0lBT3RCLFlBQ1UsU0FBaUIsRUFDakIsVUFBc0IsRUFDdEIsYUFBNEIsRUFDNUIsYUFBa0M7UUFIbEMsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQVZyQyxhQUFRLEdBQUcsRUFBRTtRQUNiLGlCQUFZLEdBQUcsRUFBRTtRQUdoQix1QkFBa0IsR0FBRyxXQUFXLEVBQUMsaUlBQWlJO1FBd1JsSyxvQkFBZSxHQUFHLENBQUMsUUFBYSxFQUFVLEVBQUU7WUFDbEQsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUN2QixLQUFLLGtCQUFVLENBQUMsT0FBTztvQkFDckIsT0FBTyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsRUFBRTtnQkFFckIsS0FBSyxrQkFBVSxDQUFDLElBQUk7b0JBQ2xCLE9BQU8sRUFBRTtnQkFFWCxLQUFLLGtCQUFVLENBQUMsS0FBSztvQkFDbkIsT0FBTyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsUUFBUTtnQkFFM0I7b0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQztvQkFDbEUsT0FBTyxFQUFFO2FBQ1o7UUFDSCxDQUFDO1FBRU8sd0JBQW1CLEdBQUcsQ0FBQyxRQUFhLEVBQVUsRUFBRTtZQUN0RCxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZCLEtBQUssa0JBQVUsQ0FBQyxPQUFPO29CQUNyQixPQUFPLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxJQUFJO2dCQUV2QixLQUFLLGtCQUFVLENBQUMsSUFBSTtvQkFDbEIsT0FBTyxxREFBdUIsRUFBQyxRQUFRLENBQUM7Z0JBRTFDLEtBQUssa0JBQVUsQ0FBQyxLQUFLO29CQUNuQixPQUFPLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxXQUFXO2dCQUU5QjtvQkFDRSxPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDO29CQUNsRSxPQUFPLEVBQUU7YUFDWjtRQUNILENBQUM7UUEwQk8sZ0JBQVcsR0FBRyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDOUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTO29CQUNsQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsRUFBRTtvQkFDbEMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFO2dCQUVsQixNQUFNLFFBQVEsR0FBRyxhQUFhO2dCQUU5QixJQUFJLENBQUMsUUFBUTtvQkFDWCxJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsT0FBTzt3QkFDcEMsQ0FBQyxDQUFDLGFBQWE7d0JBQ2YsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7YUFDaEU7UUFDSCxDQUFDO1FBMVZDLElBQUksQ0FBQyxRQUFRLEdBQUcsaUJBQWlCO1FBQ2pDLElBQUksQ0FBQyxTQUFTO1lBQ1osSUFBSSxDQUFDLFVBQVUsS0FBSyxrQkFBVSxDQUFDLElBQUk7Z0JBQ2pDLENBQUMsQ0FBQyxtQkFBbUI7Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsT0FBTztvQkFDdEMsQ0FBQyxDQUFDLHNCQUFzQjtvQkFDeEIsQ0FBQyxDQUFDLGtCQUFrQjtRQUUxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCO0lBQ3BFLENBQUM7SUFFRDs7O09BR0c7SUFDVSxlQUFlLENBQUMsRUFDM0IsV0FBVyxFQUNFOztZQUNiLE1BQU0sRUFDSixVQUFVLEVBQUUsaUJBQWlCLEVBQzdCLFFBQVEsRUFBRSxzQkFBc0IsRUFDaEMsWUFBWSxFQUFFLDBCQUEwQixFQUN6QyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUU5QixJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU87Z0JBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUM7Z0JBRXZFLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFFMUIsT0FBTztvQkFDTCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsWUFBWSxFQUFFLDBCQUEwQjtpQkFDekM7YUFDRjtZQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sNkJBQVcsRUFDbEMsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixVQUFVLEVBQ1Y7Z0JBQ0UsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7YUFDWixFQUNELFdBQVcsQ0FDWjtZQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO2FBQzdEO1lBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUNsQixJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsT0FBTztnQkFDcEMsQ0FBQyxDQUFDLE1BQU0sMkNBQWtCLEVBQUMsVUFBVSxDQUFDO2dCQUN0QyxDQUFDLENBQUMsTUFBTSxxQ0FBZSxFQUFDLFVBQVUsQ0FBQztZQUV2QyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBRWxCLElBQUksVUFBVSxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxrQkFBVSxDQUFDLElBQUksRUFBRTtvQkFDdkMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7aUJBQ3JDO2dCQUVELE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUU3RCxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBRTFCLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7YUFDcEQ7WUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7UUFDOUQsQ0FBQztLQUFBO0lBRUQ7Ozs7O09BS0c7SUFDVSxLQUFLLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjs7WUFDbkQsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRO2dCQUNSLFFBQVE7YUFDVDtZQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUU7WUFFdEIsSUFBSSxFQUNGLFVBQVUsRUFBRSxpQkFBaUIsRUFDN0IsU0FBUyxFQUNULFlBQVksRUFBRSwwQkFBMEIsRUFDekMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFFN0IsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPO2dCQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLDJEQUEyRCxDQUFDO2dCQUV2RSxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBRTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVE7Z0JBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsMEJBQTBCO2dCQUM5QyxPQUFPO29CQUNMLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDaEM7YUFDRjtZQUVELElBQUksYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7WUFFdkUsSUFBSSxVQUFVLEdBQUcsa0NBQTJCLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUM7WUFFNUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDZixJQUFJLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxFQUFFO29CQUMzQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO29CQUUzRCxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztpQkFDdkU7Z0JBRUQsNkZBQTZGO2dCQUM3RiwwRkFBMEY7Z0JBQzFGLDBDQUEwQztnQkFFMUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVU7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVk7YUFDckM7WUFFRCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssa0JBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFO2lCQUNyQztnQkFFRCxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRO2FBQ3JDO1lBRUQsT0FBTztnQkFDTCxVQUFVO2dCQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ2hDO1FBQ0gsQ0FBQztLQUFBO0lBRWEsdUJBQXVCOztZQUNuQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsK0NBQStDO1lBRTdGLE1BQU0sSUFBSSxDQUFDLGFBQWE7aUJBQ3JCLEdBQUcsQ0FBUywyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLENBQUM7aUJBQ3pFLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLHNCQUFhLENBQUM7b0JBQUUsTUFBTSxHQUFHO1lBQ2hELENBQUMsQ0FBQztRQUNOLENBQUM7S0FBQTtJQUVhLGdCQUFnQixDQUM1QixTQUFpQyxFQUNqQyxXQUFtQzs7WUFFbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsS0FBSyxFQUFFO2dCQUN4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLFdBQVc7Z0JBQzFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDN0QsSUFBSSxDQUFDLFFBQVEsRUFDYixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFDdEIsU0FBUyxDQUNWO2dCQUVELE9BQU8sYUFBYTthQUNyQjtZQUVELEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO2dCQUMzQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQzthQUNsQztZQUNELE1BQU0sY0FBYyxHQUFHLHFCQUFTLEVBQUMsV0FBVyxDQUFDO1lBRTdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDN0QsSUFBSSxDQUFDLFFBQVEsRUFDYixjQUFjLEVBQ2QsU0FBUyxFQUNULFlBQVksRUFDWjtnQkFDRSxjQUFjLEVBQUUsbUNBQW1DO2dCQUNuRCxNQUFNLEVBQUUsS0FBSzthQUNkLENBQ0Y7WUFFRCxPQUFPLGFBQWE7UUFDdEIsQ0FBQztLQUFBO0lBRUQ7Ozs7Ozs7T0FPRztJQUNVLFlBQVk7O1lBQ3ZCLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN6RSxJQUFJLFNBQVMsR0FBRyxJQUFJO1lBRXBCLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsNkVBQTZFO2dCQUM3RSxrREFBa0Q7Z0JBQ2xELE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFFbkIsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRTthQUN6QztZQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsVUFBVTtnQkFDVixRQUFRO2dCQUNSLFlBQVk7Z0JBQ1osU0FBUzthQUNWLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFYSxlQUFlOztZQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssa0JBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hDLGlEQUFpRDtnQkFDakQsa0NBQWtDO2dCQUNsQyx3Q0FBd0M7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTs7b0JBQ2hFLE1BQU0sTUFBTSxHQUNWLHVHQUFpRyxDQUFDLElBQUksQ0FDcEcsTUFBZ0IsQ0FDakIsMENBQUcsQ0FBQyxDQUFDO29CQUVSLElBQUksTUFBTTt3QkFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU07Z0JBQ3RDLENBQUMsQ0FBQzthQUNIO1lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQyxFQUM5RCxTQUFTLEVBQ1QsWUFBWSxDQUNiO1lBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQzlDLENBQUM7S0FBQTtJQUVhLGFBQWE7O1lBQ3pCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxVQUFVLEtBQUssa0JBQVUsQ0FBQyxPQUFPO2dCQUNwQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxnQ0FBZ0M7Z0JBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsSUFBSTtvQkFDbkMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsbUJBQW1CO29CQUN0QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxtQkFBbUI7WUFFNUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhO2lCQUN2RCxHQUFHLENBQVMsR0FBRyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7aUJBQ3pDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUM5QixDQUFDLENBQUM7WUFFSixNQUFNLFVBQVUsR0FBRyxhQUFhLEtBQUssU0FBUztZQUU5QyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLDZFQUE2RTtnQkFDN0Usa0RBQWtEO2dCQUNsRCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO2FBQ3REO1lBRUQsT0FBTztnQkFDTCxVQUFVO2dCQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztnQkFDN0MsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7YUFDdEQ7UUFDSCxDQUFDO0tBQUE7SUFvQ08sWUFBWSxDQUFDLFFBQWE7UUFDaEMsTUFBTSxPQUFPLEdBQVcsMENBQTBDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFRLEVBQUU7UUFFMUIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUN6QixRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO1lBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUM7WUFFeEQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtvQkFDbEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFFbkUsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTt3QkFDbkMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO2dCQUNILENBQUMsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7SUFDM0QsQ0FBQztJQW9CRDs7O09BR0c7SUFDVSxNQUFNOztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFO1lBRTNDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQzNFLENBQUM7S0FBQTtDQUNGO0FBbFhELGtDQWtYQztBQUVELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxRQUFnQixFQUFXLEVBQUUsQ0FDN0QsMkdBQTJHLENBQUMsSUFBSSxDQUM5RyxRQUFRLENBQ1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsWUgsa0RBQTZCO0FBQzdCLGtEQUF5QztBQUN6QyxrREFBaUM7QUFDakMsa0RBQTZCOzs7Ozs7Ozs7Ozs7QUNIdEIsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFFBQWdCLEVBQVcsRUFBRTtJQUNuRSxPQUFPLHNEQUFzRCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDOUUsQ0FBQztBQUZZLCtCQUF1QiwyQkFFbkM7Ozs7Ozs7Ozs7OztBQ0ZNLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBZ0IsRUFBVyxFQUFFO0lBQzNELE1BQU0sT0FBTyxHQUFXLDhDQUE4QztJQUN0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN0QyxPQUFPLE9BQU87QUFDaEIsQ0FBQztBQUpZLHVCQUFlLG1CQUkzQjs7Ozs7Ozs7Ozs7O0FDSkQsMENBQStDO0FBQy9DLDJDQUEwQztBQUUxQyxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQjtBQUVyQywrQkFBdUIsR0FBRyxTQUFTO0FBRWhELHdHQUF3RztBQUMzRiwyQkFBbUIsR0FBOEI7SUFDNUQsRUFBRSxFQUFFLG1DQUFtQztJQUN2QyxFQUFFLEVBQUUsMEhBQTBIO0lBQzlILEVBQUUsRUFBRSw4REFBOEQ7SUFDbEUsRUFBRSxFQUFFLDRCQUE0QjtJQUNoQyxFQUFFLEVBQUUsbUJBQW1CO0lBQ3ZCLEVBQUUsRUFBRSx3Q0FBd0M7SUFDNUMsRUFBRSxFQUFFLHlCQUF5QjtJQUM3QixLQUFLLEVBQUUsZ0NBQWdDO0lBQ3ZDLEtBQUssRUFBRSxnQ0FBZ0M7SUFDdkMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxFQUFFLEVBQUUsbUJBQW1CO0lBQ3ZCLEVBQUUsRUFBRSxpQ0FBaUM7SUFDckMsRUFBRSxFQUFFLHdCQUF3QjtJQUM1QixFQUFFLEVBQUUsZ0NBQWdDO0lBQ3BDLEVBQUUsRUFBRSw2Q0FBNkM7SUFDakQsS0FBSyxFQUFFLGdDQUFnQztJQUN2QyxFQUFFLEVBQUUsZ0NBQWdDO0lBQ3BDLEVBQUUsRUFBRSxpQ0FBaUM7SUFDckMsRUFBRSxFQUFFLCtCQUErQjtJQUNuQyxFQUFFLEVBQUUsdUpBQXVKO0lBQzNKLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsRUFBRSxFQUFFLDRCQUE0QjtJQUNoQyxFQUFFLEVBQUUsaUNBQWlDO0lBQ3JDLEVBQUUsRUFBRSxvQ0FBb0M7SUFDeEMsRUFBRSxFQUFFLGlKQUFpSjtJQUNySixFQUFFLEVBQUUsa0ZBQWtGO0lBQ3RGLEVBQUUsRUFBRSxtQkFBbUI7SUFDdkIsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixFQUFFLEVBQUUsNEJBQTRCO0lBQ2hDLEVBQUUsRUFBRSxrQkFBa0I7SUFDdEIsRUFBRSxFQUFFLHNCQUFzQjtJQUMxQixFQUFFLEVBQUUsaUJBQWlCO0lBQ3JCLEVBQUUsRUFBRSxrQkFBa0I7SUFDdEIsRUFBRSxFQUFFLG9CQUFvQjtJQUN4QixDQUFDLCtCQUF1QixDQUFDLEVBQUUsb0JBQW9CO0NBQ2hEO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxHQUFXLEVBQUU7SUFDeEQsNkJBQTZCO0lBQzdCLElBQUksYUFBYSxHQUFHLDJCQUFtQixDQUFDLCtCQUF1QixDQUFDO0lBRWhFLDhEQUE4RDtJQUM5RCxNQUFNLFFBQVEsR0FBRywyQkFBZSxHQUFFO0lBRWxDLElBQUksUUFBUSxFQUFFO1FBQ1oseURBQXlEO1FBQ3pELElBQUkscUJBQXFCLEdBQUcsMkJBQW1CLENBQUMsUUFBUSxDQUFDO1FBRXpELGdFQUFnRTtRQUNoRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDMUIsbUNBQW1DO1lBQ25DLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQW1CLENBQUM7WUFFeEQsc0NBQXNDO1lBQ3RDLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN2RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QztZQUVELHFEQUFxRDtZQUNyRCxJQUFJLGNBQWMsRUFBRTtnQkFDbEIsYUFBYSxHQUFHLDJCQUFtQixDQUFDLGNBQWMsQ0FBQzthQUNwRDtTQUNGO2FBQU07WUFDTCxhQUFhLEdBQUcscUJBQXFCO1NBQ3RDO0tBQ0Y7SUFFRCxPQUFPLGFBQWE7QUFDdEIsQ0FBQztBQS9CWSxxQ0FBNkIsaUNBK0J6QztBQUVEOzs7OztHQUtHO0FBQ0ksTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxVQUFzQixFQUN0QixRQUFhLEVBQ0osRUFBRTtJQUNYLElBQUksVUFBVSxLQUFLLGtCQUFVLENBQUMsS0FBSztRQUFFLE9BQU8sUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFFBQVE7SUFFOUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyx5Q0FBNkIsR0FBRSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDekUsQ0FBQztBQVBZLG1DQUEyQiwrQkFPdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hHRCxpREFBc0Q7QUFPdEQsTUFBTSxxQkFBcUIsR0FBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFFekUsU0FBc0IsV0FBVyxDQUMvQixHQUFXLEVBQ1gsYUFBcUIsRUFBRSxFQUN2QixpQkFBaUMscUJBQXFCLEVBQ3RELFdBQW9DOztRQUVwQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLGNBQWM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDNUIsR0FBRyxFQUNILFVBQVUsRUFDVix3Q0FBd0MsS0FBSyxXQUFXLE1BQU0sU0FBUyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQ3pGO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE1BQU0sYUFBYSxHQUEyQixXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSw2QkFBZTtZQUU1RSxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsRUFBRTtZQUNyQyxPQUFPLE9BQU87Z0JBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxFQUNILFVBQVUsRUFDVix3Q0FBd0MsS0FBSyxXQUFXLE1BQU0sU0FBUyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQ3pGO2dCQUNILENBQUMsQ0FBQyxJQUFJO1NBQ1Q7UUFFRCxPQUFPLFVBQVU7SUFDbkIsQ0FBQztDQUFBO0FBOUJELGtDQThCQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkNELDJDQUFnQztBQUNoQyxxQ0FBa0Q7QUFFbEQsU0FBc0IsZUFBZSxDQUFDLFVBQWtCOztRQUd0RCxJQUFJLFVBQVUsR0FBRyxLQUFLO1FBQ3RCLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQzFCLElBQUksY0FBYyxHQUFHLENBQUM7UUFFdEIsR0FBRztZQUNELE1BQU0saUJBQUssRUFBQyxJQUFJLENBQUM7WUFDakIsSUFBSSxVQUFVLENBQUMsTUFBTTtnQkFBRSxNQUFLO1lBRTVCLFVBQVU7Z0JBQ1IsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7b0JBQ3BELFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNoRCxvQ0FBNkIsR0FBRSxDQUNoQztZQUVILGNBQWMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSTtTQUNyRSxRQUFRLENBQUMsVUFBVSxJQUFJLGNBQWMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFDO1FBRWhELE9BQU8sRUFBRSxVQUFVLEVBQUU7SUFDdkIsQ0FBQztDQUFBO0FBckJELDBDQXFCQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEJELDJDQUFnQztBQUNoQyxxQ0FBa0Q7QUFFbEQsU0FBc0Isa0JBQWtCLENBQUMsVUFBa0I7OztRQUd6RCxJQUFJLFVBQVUsR0FBRyxLQUFLO1FBQ3RCLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQzFCLElBQUksY0FBYyxHQUFHLENBQUM7UUFFdEIsR0FBRztZQUNELE1BQU0saUJBQUssRUFBQyxJQUFJLENBQUM7WUFFakIsSUFBSSxVQUFVLENBQUMsTUFBTTtnQkFBRSxNQUFLO1lBRTVCLFVBQVUsR0FBRyw2QkFBaUIsR0FBRTtZQUVoQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUk7U0FDckUsUUFBUSxDQUFDLFVBQVUsSUFBSSxjQUFjLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBQztRQUVoRCxJQUFJLFlBQVksR0FBRyxLQUFLO1FBRXhCLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRTtRQUV0QixHQUFHO1lBQ0QsTUFBTSxpQkFBSyxFQUFDLElBQUksQ0FBQztZQUVqQixJQUFJLFVBQVUsQ0FBQyxNQUFNO2dCQUFFLE1BQUs7WUFFNUIsWUFBWTtnQkFDVixVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztxQkFDcEQsc0JBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksMENBQUUsU0FBUywwQ0FBRSxRQUFRLENBQ2xELG9DQUE2QixHQUFFLENBQ2hDO1lBRUgsY0FBYyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJO1NBQ3JFLFFBQVEsQ0FBQyxZQUFZLElBQUksY0FBYyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUM7UUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksWUFBWSxFQUFFOztDQUNsRDtBQXBDRCxnREFvQ0M7QUFFTSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxDQUNwQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFEbkUseUJBQWlCLHFCQUNrRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUNoRiwyQ0FJaUI7QUFFakIsNENBSXdCO0FBRXhCLDBDQUErQztBQUMvQyxpREFBK0M7QUFPL0MsTUFBYSxZQUFhLFNBQVEsNkJBQWU7SUFDL0MsWUFDRSxTQUFpQixFQUNqQixVQUFzQixFQUNkLFFBQWdCLEVBQ2hCLGFBQTRCO1FBRXBDLEtBQUssQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO1FBSHBCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFHdEMsQ0FBQztJQUVZLE9BQU8sQ0FDbEIsTUFBYyxFQUNkLElBQVMsRUFDVCxNQUFXLEVBQ1gscUJBQTJCOztZQUUzQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFtQixJQUFJO1lBQzlDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXhFLElBQUksQ0FBQyxNQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsTUFBTTtnQkFDaEIsTUFBTSxJQUFJLHNCQUFhLENBQUMscUNBQXFDLENBQUM7WUFFaEUsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssRUFBRTtnQkFDMUIsTUFBTSxJQUFJLHNCQUFhLENBQUMsMEJBQTBCLENBQUM7WUFFckQsSUFBSSxZQUFZLEdBQUcsRUFBRTtZQUVyQixLQUFLLElBQUksS0FBSyxJQUFJLE1BQU07Z0JBQ3RCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7b0JBQzlCLFlBQVksSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFFaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU07Z0JBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNoRSxDQUFDLENBQUMsTUFBTTtZQUNWLE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FDaEMsV0FBVyxHQUFHLE9BQ2hCLEdBQUcsWUFBWSxFQUFFO1lBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFO1lBRS9CLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFO2dCQUN0QixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDbEQ7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDekQsSUFBSSxTQUFTO2dCQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDeEQsSUFBSSxNQUFNLENBQUMsS0FBSztnQkFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7WUFDbEQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLGtCQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxXQUFXO2dCQUNoRSxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDO1lBRXJELE1BQU0sT0FBTyxHQUFHO2dCQUNkLGVBQWUsRUFBRSxVQUFVO2dCQUMzQixNQUFNLEVBQUUsS0FBSztnQkFDYixjQUFjLEVBQUUsWUFBWTthQUM3QjtZQUVELDJEQUEyRDtZQUMzRCwwRUFBMEU7WUFDMUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxhQUFhO3FCQUNmLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLENBQUM7cUJBQ2pFLElBQUksQ0FBQyxDQUFPLEdBQVEsRUFBRSxFQUFFO29CQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBRTNELElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNO29CQUU3QixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7d0JBQ2hCLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRTs0QkFDdkIsS0FBSyxrQkFBVSxDQUFDLE9BQU87Z0NBQ3JCLFlBQVksR0FBRyxNQUFNLHFDQUF5QixFQUM1QyxHQUFHLENBQUMsTUFBTSxFQUNWLElBQUksQ0FBQyxhQUFhLEVBQ2xCLE1BQU0sQ0FBQyxTQUFTLENBQ2pCO2dDQUVELE1BQUs7NEJBQ1AsS0FBSyxrQkFBVSxDQUFDLElBQUk7Z0NBQ2xCLFlBQVk7b0NBQ1YsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVE7d0NBQzVCLENBQUMsQ0FBQywrQkFBbUIsRUFBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQzt3Q0FDNUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO2dDQUVoQixNQUFLOzRCQUNQLEtBQUssa0JBQVUsQ0FBQyxLQUFLO2dDQUNuQixZQUFZO29DQUNWLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRO3dDQUM1QixDQUFDLENBQUMsd0JBQVksRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDO3dDQUMxQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU07Z0NBRWhCLE1BQUs7eUJBQ1I7cUJBQ0Y7eUJBQU07d0JBQ0wsWUFBWTs0QkFDVixPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssUUFBUTtnQ0FDNUIsQ0FBQyxDQUFDLHdCQUFZLEVBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQ0FDMUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO3FCQUNqQjtvQkFFRCxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN2QixDQUFDLEVBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQU8sQ0FBUSxFQUFFLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxZQUFZLDBCQUFpQixFQUFFO3dCQUNsQyxJQUFJLENBQUMsYUFBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7d0JBQzFELE1BQU0sQ0FBQyxJQUFJLHNCQUFhLENBQUMsQ0FBQyxhQUFELENBQUMsdUJBQUQsQ0FBQyxDQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDekM7b0JBRUQsSUFBSSxDQUFDLFlBQVksMkJBQWtCLEVBQUU7d0JBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUU7NEJBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04scUJBQXFCLENBQ3RCLENBQUMsSUFBSSxDQUNKLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0NBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQzs0QkFDZCxDQUFDLEVBQ0QsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQ0FDWCxNQUFNLENBQUMsR0FBRyxDQUFDOzRCQUNiLENBQUMsQ0FDRjt3QkFDSCxDQUFDLENBQUM7d0JBRUYsTUFBTSxhQUFhLEVBQUU7cUJBQ3RCO3lCQUFNO3dCQUNMLE1BQU0sQ0FBQyxJQUFJLHNCQUFhLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVEO2dCQUNILENBQUMsRUFBQztZQUNOLENBQUMsQ0FBQztZQUNGLE9BQU8sY0FBYztRQUN2QixDQUFDO0tBQUE7Q0FDRjtBQW5JRCxvQ0FtSUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JKRCwyQ0FBdUQ7QUFnQnZELE1BQXNCLGVBQWU7SUFDbkMsWUFDWSxTQUFpQixFQUNqQixVQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFHMUIsb0JBQWUsR0FBc0IsRUFBRTtRQVcvQywwQkFBcUIsR0FBRyxHQUFTLEVBQUU7WUFDakMsTUFBTSx3QkFBWSxFQUNoQixJQUFJLENBQUMsZUFBZSxFQUNwQixDQUFPLGNBQStCLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxjQUFjLEVBQUU7WUFDeEIsQ0FBQyxFQUNGO1lBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFO1lBQ3pCLE9BQU07UUFDUixDQUFDO0lBdkJFLENBQUM7SUF5Qk0sb0JBQW9CLENBQUMsT0FBd0I7UUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3BDLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxNQUFXO1FBQ3BDLE1BQU0sYUFBYSxHQUFRLEVBQUU7UUFFN0IsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2hCLGFBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxPQUFPO1lBQ3ZDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLE9BQU87WUFDOUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUc7U0FDOUI7UUFFRCxPQUFPLGFBQWE7SUFDdEIsQ0FBQztDQUNGO0FBNUNELDBDQTRDQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5REQsMkNBQThEO0FBQzlELDJDQUFxRTtBQUNyRSx5Q0FBd0M7QUFDeEMsMENBSTJCO0FBQzNCLG1EQUEyRDtBQUMzRCxrREFBK0Q7QUFDL0Qsb0RBQWlEO0FBQ2pELG1EQUFnRTtBQUdoRSxNQUFNLGFBQWEsR0FBZ0I7SUFDakMsU0FBUyxFQUFFLEVBQUU7SUFDYixTQUFTLEVBQUUsdUJBQXVCO0lBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7SUFDaEMsV0FBVyxFQUFFLGtCQUFrQjtJQUMvQixNQUFNLEVBQUUsaUJBQWlCO0lBQ3pCLFVBQVUsRUFBRSxrQkFBVSxDQUFDLElBQUk7SUFDM0IsS0FBSyxFQUFFLEtBQUs7SUFDWixXQUFXLEVBQUUsbUNBQW1DO0lBQ2hELGFBQWEsRUFBRSxJQUFJO0lBQ25CLGNBQWMsRUFBRSxzQkFBYyxDQUFDLE9BQU87Q0FDdkM7QUFFRDs7O0dBR0c7QUFDSCxNQUFxQixLQUFLO0lBUXhCLFlBQVksTUFBNkI7UUFQakMsZ0JBQVcsR0FBZ0IsSUFBSSxtQkFBVyxFQUFFO1FBQzVDLGFBQVEsR0FBVyxFQUFFO1FBQ3JCLGlCQUFZLEdBQXdCLElBQUk7UUFDeEMsZ0JBQVcsR0FBdUIsSUFBSTtRQUN0QyxrQkFBYSxHQUF5QixJQUFJO1FBQzFDLG1CQUFjLEdBQTBCLElBQUk7UUF3TzVDLDBCQUFxQixHQUFHLEdBQVMsRUFBRTs7WUFDekMsTUFBTSxXQUFJLENBQUMsY0FBYywwQ0FBRSxxQkFBcUIsRUFBRTtZQUNsRCxNQUFNLFdBQUksQ0FBQyxZQUFZLDBDQUFFLHFCQUFxQixFQUFFO1FBQ2xELENBQUM7UUF4T0MsSUFBSSxDQUFDLFdBQVcsbUNBQ1gsYUFBYSxHQUNiLE1BQU0sQ0FDVjtRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDVSxLQUFLLENBQ2hCLFFBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLFVBQXdCLEVBQUU7O1lBRTFCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEtBQUssc0JBQWMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRO29CQUN4QixNQUFNLElBQUksS0FBSyxDQUNiLDhFQUE4RSxDQUMvRTtnQkFFSCxPQUFPLElBQUksQ0FBQyxXQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7YUFDbkQ7WUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLE9BQU8sU0FBUyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUNiLDBFQUEwRSxDQUMzRTthQUNGO1lBRUQsT0FBTyxJQUFJLENBQUMsV0FBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFDbkQsQ0FBQztLQUFBO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBWSxDQUFDLE1BQU0sRUFBRTtJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjO1FBQ25CLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMseUJBQWlCLENBQUM7UUFDdkQsT0FBTyxjQUFjO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxhQUFhLENBQUMsS0FBYztRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxLQUFLO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ1UsVUFBVSxDQUNyQixNQUFjLEVBQ2QsS0FBbUIsRUFDbkIsTUFBcUMsRUFDckMsU0FBaUMsRUFBRSxFQUNuQyxxQkFBaUM7O1lBRWpDLE1BQU0sbUNBQ0QsSUFBSSxDQUFDLFdBQVcsR0FDaEIsTUFBTSxDQUNWO1lBQ0QsTUFBTSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBRTlCLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBYSxDQUFDLE9BQU8sQ0FDckMsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04scUJBQXFCLENBQ3RCO1FBQ0gsQ0FBQztLQUFBO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ1UsT0FBTyxDQUNsQixNQUFjLEVBQ2QsSUFBbUMsRUFDbkMsU0FBaUMsRUFBRSxFQUNuQyxxQkFBaUMsRUFDakMsVUFBdUIsRUFDdkIsMEJBQXFELEVBQUU7O1lBRXZELE1BQU0sbUNBQ0QsSUFBSSxDQUFDLFdBQVcsR0FDaEIsTUFBTSxDQUNWO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyx5QkFBYSxFQUFDLElBQUksQ0FBQztZQUU1Qyw0REFBNEQ7WUFDNUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBZSxDQUFDLE9BQU8sQ0FDdkMsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04scUJBQXFCLEVBQ3JCLFVBQVUsRUFDVix1QkFBdUIsQ0FDeEI7YUFDRjtpQkFBTTtnQkFDTCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSw2QkFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9EO1FBQ0gsQ0FBQztLQUFBO0lBRUQ7OztPQUdHO0lBQ1UsWUFBWTs7WUFDdkIsT0FBTyxJQUFJLENBQUMsV0FBWSxDQUFDLFlBQVksRUFBRTtRQUN6QyxDQUFDO0tBQUE7SUFFTyxrQkFBa0I7UUFDeEIsSUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLEVBQUUsRUFDakM7WUFDQSxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTtnQkFDbkMsSUFBSSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxRQUFRLEVBQUU7Z0JBRXRELElBQUksUUFBUSxDQUFDLElBQUk7b0JBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBRWxELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEdBQUc7YUFDakM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsRUFBRTthQUNoQztTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQ3pCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FDbkM7U0FDRjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1FBRXpDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxrQkFBVyxDQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFXLEVBQzVCLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0I7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksMkJBQVksQ0FDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVyxFQUM1QixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxhQUFhLENBQ25CO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVcsRUFDNUIsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsYUFBYSxDQUNuQjtJQUNILENBQUM7Q0FNRjtBQWxQRCwyQkFrUEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVRRCw0Q0FJMkI7QUFFM0IsMkNBSW9CO0FBQ3BCLGlEQUFpRTtBQUNqRSx5REFBcUU7QUFPckUsTUFBYSxjQUFlLFNBQVEsNkJBQWU7SUFDakQsWUFDRSxTQUFpQixFQUNqQixVQUFzQixFQUNkLFFBQWdCLEVBQ2hCLGFBQTRCO1FBRXBDLEtBQUssQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO1FBSHBCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFHdEMsQ0FBQztJQUVLLE9BQU8sQ0FDWCxNQUFjLEVBQ2QsSUFBUyxFQUNULE1BQVcsRUFDWCxxQkFBMkIsRUFDM0IsVUFBdUIsRUFDdkIsMEJBQXFELEVBQUU7O1lBRXZELE1BQU0sYUFBYSxHQUFHLHFCQUFxQjtZQUMzQyxNQUFNLE9BQU8sR0FBRywwQkFBYyxFQUFDLE1BQU0sQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUNoRSxDQUFDLENBQUMsTUFBTTtnQkFDVixDQUFDLENBQUMsTUFBTTtZQUNWLElBQUksTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsR0FBRyxPQUFPLEVBQUU7WUFFNUUsSUFBSSxhQUFhLHFCQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FDakM7WUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUU3QixJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJO29CQUNGLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO2lCQUNsRDtnQkFBQyxPQUFPLENBQU0sRUFBRTtvQkFDZixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFBYSxDQUFDLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3hEO2FBQ0Y7WUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRTtnQkFDL0IsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3pDO2FBQ0Y7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGFBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsWUFBWSxDQUFDO3FCQUNqRSxJQUFJLENBQUMsQ0FBTyxHQUFRLEVBQUUsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGFBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUU1RCxNQUFNLFlBQVksR0FDaEIsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssUUFBUTt3QkFDNUMsQ0FBQyxDQUFDLDZDQUFtQixFQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO3dCQUN6QyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU07b0JBRWhCLE1BQU0sY0FBYyxHQUFHLHlDQUE2QixFQUNsRCxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFDdEMsdUJBQXVCLENBQ3hCO29CQUNELE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQ3pCLENBQUMsRUFBQztxQkFDRCxLQUFLLENBQUMsQ0FBTyxDQUFRLEVBQUUsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLFlBQVksMEJBQWlCLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxhQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQzt3QkFDMUQsTUFBTSxDQUFDLElBQUksc0JBQWEsQ0FBQyxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN6QztvQkFFRCxJQUFJLENBQUMsWUFBWSwyQkFBa0IsRUFBRTt3QkFDbkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzRCQUMxQixNQUFNLENBQ0osSUFBSSxzQkFBYSxDQUNmLGtGQUFrRixFQUNsRixDQUFDLENBQ0YsQ0FDRjt5QkFDRjt3QkFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFOzRCQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLE1BQU0sRUFDTixJQUFJLEVBQ0osTUFBTSxFQUNOLHFCQUFxQixFQUNyQixVQUFVLEVBQ1YsdUJBQXVCLENBQ3hCLENBQUMsSUFBSSxDQUNKLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0NBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQzs0QkFDZCxDQUFDLEVBQ0QsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQ0FDWCxNQUFNLENBQUMsR0FBRyxDQUFDOzRCQUNiLENBQUMsQ0FDRjt3QkFDSCxDQUFDLENBQUM7d0JBRUYsSUFBSSxhQUFhOzRCQUFFLE1BQU0sYUFBYSxFQUFFO3FCQUN6Qzs7d0JBQU0sTUFBTSxDQUFDLElBQUksc0JBQWEsQ0FBQyxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLEVBQUM7WUFDTixDQUFDLENBQUM7WUFFRixPQUFPLGNBQWM7UUFDdkIsQ0FBQztLQUFBO0NBQ0Y7QUF2R0Qsd0NBdUdDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUFrQixFQUFFLElBQVMsRUFBWSxFQUFFO0lBQ3pFLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxFQUFFO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUFFLFNBQVE7UUFFN0MsTUFBTSxJQUFJLEdBQUcsU0FBUztRQUN0QixNQUFNLEdBQUcsR0FBRyx3QkFBWSxFQUFDLElBQUksRUFBRSxTQUFTLENBQUM7UUFFekMsSUFBSSxHQUFHLEtBQUssNEJBQTRCLEVBQUU7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsQ0FDakU7U0FDRjtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUFDO1FBRUYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUM7S0FDM0M7SUFFRCxPQUFPLFFBQVE7QUFDakIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNKRCw0REFBMkI7QUFDM0Isa0RBQTJCO0FBQzNCLHFCQUFlLGVBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0twQix1REFBOEI7QUFFOUIseUNBQWtFO0FBQ2xFLDRDQU93QjtBQUV4Qix5REFBa0U7QUFDbEUsMENBQWtEO0FBQ2xELG1EQUE2RDtBQUM3RCwyQ0FJaUI7QUFDakIsMkRBQTZFO0FBQzdFLDBDQUE4QjtBQUU5QixNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FDckIsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU87QUFFL0QsTUFBYSxhQUFhO0lBV3hCLFlBQ1ksT0FBZSxFQUN6QixpQkFBc0MsRUFDdEMsYUFBc0IsRUFDdEIsV0FBeUI7UUFIZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBWG5CLGFBQVEsR0FBbUIsRUFBRTtRQUM3QixrQkFBYSxHQUFXLEVBQUU7UUFFMUIsZ0JBQVcsR0FBZ0IsS0FBSztRQUU5QixjQUFTLEdBQWMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFHdEQsaUNBQTRCLEdBQUcsS0FBSztRQWdFNUM7OztXQUdHO1FBQ0ksZ0JBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUTtRQUV4Qzs7V0FFRztRQUNJLGtCQUFhLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRTtRQUNwQixDQUFDO1FBOE9NLGNBQVMsR0FBRyxDQUFPLFFBQWdCLEVBQUUsRUFBRTtZQUM1QyxJQUFJLE9BQU8sR0FBa0IsSUFBSTtZQUNqQyxNQUFNLE1BQU0sR0FBUSxFQUFFO1lBRXRCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUNqRCxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVk7WUFFcEMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztZQUNwRSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFFbEUsTUFBTSxNQUFNLEdBQVEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztZQUVuRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtnQkFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixFQUFFO29CQUN4QyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU07aUJBQ3JCO2dCQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUs7YUFDakM7WUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2xELENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNsQztZQUVELElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxjQUFjO2FBQ3hFO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUU7WUFFL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDOUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQzthQUNGO1lBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZEO1lBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVO2lCQUN6QixJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRTtnQkFDdkIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRTthQUN6RCxDQUFDO2lCQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztpQkFDdkIsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFO2dCQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixDQUFDLENBQUM7UUFDTixDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSyxtQkFBYyxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDcEMsa0JBQU8sRUFBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUUzRDs7OztXQUlHO1FBQ0sseUJBQW9CLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEVBQUU7WUFFcEIsSUFBSSxVQUFVO1lBRWQsd0NBQXdDO1lBQ3hDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QixJQUFJO29CQUNGLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztpQkFDOUI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsVUFBVSxHQUFHLElBQUk7aUJBQ2xCO2FBQ0Y7aUJBQU07Z0JBQ0wsVUFBVSxHQUFHLElBQUk7YUFDbEI7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFN0Qsd0JBQXdCO1lBQ3hCLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7Z0JBQ3pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNwQixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN0QjtZQUVELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUVPLHdCQUFtQixHQUFHLENBQUMsUUFBdUIsRUFBRSxFQUFFOztZQUN4RCxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUTtZQUVsRCxNQUFNLFVBQVUsR0FBRyxhQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxtQ0FBSSxnQkFBZ0I7WUFDdkQsTUFBTSxVQUFVLEdBQUcsbUJBQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxHQUFHLDBDQUFFLFVBQVUsbUNBQUksQ0FBQyxjQUFjLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUVyRCxhQUFPLENBQUMsTUFBTSwwQ0FBRSxJQUFJLENBQUM7RUFDdkIsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDOztzQkFFL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7OztFQUcvQyxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQ3pELENBQUM7WUFFRSxPQUFPLFFBQVE7UUFDakIsQ0FBQztRQUVPLHFCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFOztZQUMvQyxtQ0FBbUM7WUFDbkMsTUFBTSxjQUFjLEdBQUcsY0FBYztZQUNyQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLO1lBRTNDLDJFQUEyRTtZQUMzRSxzREFBc0Q7WUFDdEQsMERBQTBEO1lBQzFELElBQUksZUFBZSxHQUFHO2dCQUNwQixPQUFPLEVBQUUsR0FBRyxjQUFjLElBQUk7Z0JBQzlCLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2FBQ3RDO1lBRUQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsZUFBZSxHQUFHO29CQUNoQixPQUFPLEVBQ0wsbUJBQU8sQ0FBQyxPQUFPLG1DQUFJLGFBQU8sQ0FBQyxlQUFlLDBDQUFFLE9BQU8sbUNBQUksY0FBYztvQkFDdkUsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLG1CQUFPLENBQUMsR0FBRywwQ0FBRSxVQUFVLG1DQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7aUJBQ2pFO2FBQ0Y7WUFFRCw2RUFBNkU7WUFDN0UsSUFBSSxnQkFBZ0IsR0FBRyxRQUFRLElBQUk7Z0JBQ2pDLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLE1BQU0sSUFBSTtvQkFDaEIsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLE9BQU8sRUFBRSxFQUF5QjtpQkFDbkM7Z0JBQ0QsSUFBSSxFQUFFLGNBQWM7YUFDckI7WUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLGdCQUFnQjtZQUNoRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO1lBRXhDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDO1lBRXhELGFBQU8sQ0FBQyxNQUFNLDBDQUFFLElBQUksQ0FBQztFQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLENBQUM7O3NCQUVoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzs7O0VBRy9DLFVBQVUsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsQ0FBQztZQUVFLE9BQU8sS0FBSztRQUNkLENBQUM7UUFFRCwrRUFBK0U7UUFDL0UsOEJBQThCO1FBQ3RCLGtCQUFhLEdBQUcsQ0FBQyxVQUFvQixFQUFVLEVBQUU7WUFDdkQsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDZixHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUU7aUJBQ3hDO3FCQUFNO29CQUNMLEdBQUcsSUFBSSxLQUFLLEtBQUssRUFBRTtpQkFDcEI7Z0JBQ0QsT0FBTyxHQUFHO1lBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxtQkFBYyxHQUFHLENBQUMsV0FBd0IsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVztZQUU5QixJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRTs7Z0JBQ3pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUNoQyxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLHNCQUFpQixHQUFHLENBQ3pCLGVBQWUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQzFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JDLEVBQUU7WUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQzlELGVBQWUsRUFDZixhQUFhLENBQ2Q7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSx1QkFBa0IsR0FBRyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDbEU7UUFDSCxDQUFDO1FBRVMsZUFBVSxHQUFHLENBQ3JCLFdBQStCLEVBQy9CLFdBQW1CLEVBQ25CLEVBQUU7WUFDRixNQUFNLE9BQU8sR0FBUSxFQUFFO1lBRXZCLElBQUksV0FBVyxLQUFLLG1DQUFtQyxFQUFFO2dCQUN2RCxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsV0FBVzthQUN0QztZQUVELElBQUksV0FBVyxLQUFLLGtCQUFrQixFQUFFO2dCQUN0QyxPQUFPLENBQUMsTUFBTSxHQUFHLGtCQUFrQjthQUNwQztpQkFBTTtnQkFDTCxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUs7YUFDdkI7WUFDRCxJQUFJLFdBQVcsRUFBRTtnQkFDZixPQUFPLENBQUMsYUFBYSxHQUFHLFVBQVUsV0FBVyxFQUFFO2FBQ2hEO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO2FBQzFEO1lBRUQsT0FBTyxPQUFPO1FBQ2hCLENBQUM7UUFFUyxtQ0FBOEIsR0FBRyxDQUFDLFFBQXVCLEVBQUUsRUFBRTtZQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUUzQyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSzthQUNqQztRQUNILENBQUM7UUFFUyx5QkFBb0IsR0FBRyxDQUFDLFFBQXVCLEVBQUUsRUFBRTtZQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUUzQyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUs7YUFDdkI7UUFDSCxDQUFDO1FBRU8sbUJBQWMsR0FBRyxDQUFDLFFBQXVCLEVBQXlCLEVBQUU7O1lBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQ2xCLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUNqQywwQ0FBRSxXQUFXLEVBQUU7WUFFaEIsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQzNDLE1BQU0sU0FBUyxHQUFHO29CQUNoQixVQUFVLEVBQUUsV0FBVztvQkFDdkIsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO2lCQUNuQjtnQkFFRCxPQUFPLFNBQVM7YUFDakI7UUFDSCxDQUFDO1FBRVMsZ0JBQVcsR0FBRyxDQUN0QixDQUFNLEVBQ04sUUFBYSxFQUNiLFFBQWlCLEtBQUssRUFDdEIsRUFBRTs7WUFDRixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBeUI7WUFFNUMsSUFBSSxDQUFDLFlBQVksdUJBQWMsRUFBRTtnQkFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVTtxQkFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7b0JBQ2pCLFlBQVksRUFBRSxNQUFNO29CQUNwQixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7aUJBQ3pELENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsTUFBTSx5QkFBYSxFQUFDLEdBQUcsRUFBRSx3Q0FBd0MsQ0FBQztnQkFDcEUsQ0FBQyxDQUFDO2dCQUVKLElBQUksa0NBQXVCLEVBQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQWMsQ0FBQyxFQUFFO29CQUNoRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNyRCxNQUFNLHlCQUFhLEVBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDO29CQUMvRCxDQUFDLENBQUM7aUJBQ0g7Z0JBRUQsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUN6QyxNQUFNLHlCQUFhLEVBQ2pCLEdBQUcsRUFDSCxpREFBaUQsQ0FDbEQ7Z0JBQ0gsQ0FBQyxDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsWUFBWSwyQkFBa0IsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFFdEIsTUFBTSxDQUFDO2FBQ1I7WUFFRCxJQUFJLENBQUMsWUFBWSw2Q0FBcUIsRUFBRTtnQkFDdEMseUNBQXlDO2dCQUN6QyxNQUFNLElBQUksQ0FBQyxVQUFVO3FCQUNsQixHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNSLGFBQWEsRUFBRSxJQUFJO2lCQUNwQixDQUFDO3FCQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFOztvQkFDakIsTUFBTSxNQUFNLEdBQ1YsdUdBQWlHLENBQUMsSUFBSSxDQUNwRyxRQUFRLENBQUMsSUFBSSxDQUNkLDBDQUFHLENBQUMsQ0FBQztvQkFFUixJQUFJLE1BQU07d0JBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNO2dCQUN0QyxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsTUFBTSx5QkFBYSxFQUFDLEdBQUcsRUFBRSxxQ0FBcUMsQ0FBQztnQkFDakUsQ0FBQyxDQUFDO2dCQUVKLE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDekMsTUFBTSx5QkFBYSxFQUNqQixHQUFHLEVBQ0gsaURBQWlELENBQ2xEO2dCQUNILENBQUMsQ0FBQzthQUNIO1lBRUQsSUFBSSxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsTUFBTSxNQUFLLEdBQUcsSUFBSSxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsTUFBTSxNQUFLLEdBQUcsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztnQkFFbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtvQkFDckQsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUN6QyxNQUFNLHlCQUFhLEVBQ2pCLEdBQUcsRUFDSCxpREFBaUQsQ0FDbEQ7b0JBQ0gsQ0FBQyxDQUFDO2lCQUNIO2dCQUVELE1BQU0sQ0FBQzthQUNSO2lCQUFNLElBQUksU0FBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sTUFBSyxHQUFHLEVBQUU7Z0JBQ25DLE1BQU0sSUFBSSxzQkFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBSSxDQUFDO2FBQzlDO2lCQUFNLElBQUksU0FBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sTUFBSyxHQUFHLEVBQUU7Z0JBQ25DLElBQUksS0FBSztvQkFBRSxNQUFNLElBQUksNEJBQW1CLEVBQUU7O29CQUNyQyxPQUFNO2FBQ1o7WUFFRCxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxpQ0FBaUMsRUFBRTtnQkFDbEUsTUFBTSxJQUFJLHlCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7YUFDdEM7WUFFRCxJQUNFLENBQUMsQ0FBQyxZQUFZO2dCQUNkLENBQUMsUUFBUTtnQkFDVCxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWE7Z0JBQ3hCLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUNsQztnQkFDQSwwRUFBMEU7Z0JBQzFFLDZEQUE2RDtnQkFDN0QsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJO2dCQUN4QyxJQUFJO29CQUNGLHVDQUF1QztvQkFDdkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVTt5QkFDdkMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzt5QkFDakMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO29CQUUvQixJQUFJLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxJQUFJLEVBQUU7d0JBQ3RCLE1BQU0sTUFBTSxHQUNWLHVHQUFpRyxDQUFDLElBQUksQ0FDcEcsWUFBWSxDQUFDLElBQUksQ0FDbEIsMENBQUcsQ0FBQyxDQUFDO3dCQUVSLElBQUksTUFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTs0QkFDN0MsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNO3lCQUN6Qjt3QkFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDO3FCQUN4QztvQkFFRCxPQUFPLE1BQU0sUUFBUSxFQUFFO2lCQUN4QjtnQkFBQyxXQUFNO29CQUNOLDhEQUE4RDtvQkFDOUQsTUFBTSxJQUFJLDJCQUFrQixFQUFFO2lCQUMvQjt3QkFBUztvQkFDUixJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSztpQkFDMUM7YUFDRjtZQUVELElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQUUsTUFBTSxDQUFDOztnQkFDakIsTUFBTSx5QkFBYSxFQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQztRQUM3RCxDQUFDO1FBaHNCQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDO1FBRWpELElBQUksYUFBYTtZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYTtRQUVyRCxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtTQUN6QjtJQUNILENBQUM7SUFFTSxTQUFTLENBQUMsT0FBZSxFQUFFLGlCQUFzQztRQUN0RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxXQUFtQixFQUFFLFlBQW9CO1FBQ3BFLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQztRQUNoRCxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUM7SUFDcEQsQ0FBQztJQUVNLFlBQVksQ0FBQyxPQUEyQixTQUFTO1FBQ3RELE9BQU8sSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztJQUNwRSxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxDQUFDO0lBRU0sdUJBQXVCO1FBQzVCLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUN2QyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLHNCQUFzQjtRQUMzQixJQUFJLENBQUMsZUFBZSxFQUFFO1FBQ3RCLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtTQUMvQjtRQUNELElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUU7U0FDdkI7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDMUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDeEMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsU0FBUTtZQUNuQixRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSx1QkFBdUI7U0FDakQ7SUFDSCxDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7SUFDL0MsQ0FBQztJQWVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFFBQWEsRUFBRSxPQUFlLEVBQUUsS0FBYztRQUNqRSxJQUFJLFVBQVUsR0FBRyxFQUFFO1FBQ25CLElBQUksYUFBYSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBSTtRQUVsQixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLEdBQUcsRUFBRTtnQkFDakIsVUFBVSxHQUFHLDJCQUFlLEVBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsYUFBYSxHQUFHLDhCQUFrQixFQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBRWhELElBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sRUFBRTtvQkFDcEIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSTtpQkFDL0I7cUJBQU07b0JBQ0wsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHO2lCQUN2QjthQUNGO2lCQUFNLElBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sRUFBRTtnQkFDM0IsaUVBQWlFO2dCQUNqRSxJQUFJLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQ3ZDLFVBQVUsR0FBRywyQkFBZSxFQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQzdDLGFBQWEsR0FBRyw4QkFBa0IsRUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2lCQUNwRDtnQkFFRCxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2FBQy9CO1NBQ0Y7UUFFRCxNQUFNLGlCQUFpQixHQUNyQixPQUFPLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxNQUFNLE1BQUssUUFBUTtZQUNsQyxDQUFDLENBQUMsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU07WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLE9BQU8sRUFBRSxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsR0FBRyxLQUFJLGlCQUFpQixJQUFJLFFBQVE7WUFDdkQsV0FBVyxFQUFFLE9BQU87WUFDcEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLFVBQVU7WUFDVixhQUFhO1lBQ2IsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVZLEdBQUcsQ0FDZCxHQUFXLEVBQ1gsV0FBK0IsRUFDL0IsY0FBc0Isa0JBQWtCLEVBQ3hDLGtCQUFzRCxFQUFFLEVBQ3hELFFBQWlCLEtBQUs7O1lBRXRCLE1BQU0sT0FBTyxtQ0FDUixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FDekMsZUFBZSxDQUNuQjtZQUVELE1BQU0sYUFBYSxHQUF1QjtnQkFDeEMsT0FBTztnQkFDUCxZQUFZLEVBQUUsV0FBVyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUM1RCxhQUFhLEVBQUUsSUFBSTthQUNwQjtZQUVELElBQUksV0FBVyxLQUFLLFlBQVksRUFBRTtnQkFDaEMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLFNBQVM7YUFDNUM7WUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVO2lCQUNuQixHQUFHLENBQUksR0FBRyxFQUFFLGFBQWEsQ0FBQztpQkFDMUIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLHdCQUFZLEVBQUMsUUFBUSxDQUFDO2dCQUV0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUksUUFBUSxDQUFDO1lBQ3hDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBTyxDQUFNLEVBQUUsRUFBRTtnQkFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQzNCLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FDSCxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FDL0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDTixNQUFNLHlCQUFhLEVBQ2pCLEdBQUcsRUFDSCwrQ0FBK0MsQ0FDaEQ7Z0JBQ0gsQ0FBQyxDQUNGLEVBQ0gsS0FBSyxDQUNOO1lBQ0gsQ0FBQyxFQUFDO1FBQ04sQ0FBQztLQUFBO0lBRUQ7Ozs7OztPQU1HO0lBQ1UsSUFBSSxDQUNmLEdBQVcsRUFDWCxJQUFTLEVBQ1QsV0FBK0IsRUFDL0IsV0FBVyxHQUFHLGtCQUFrQixFQUNoQyxrQkFBc0QsRUFBRSxFQUN4RCxxQkFBeUQsRUFBRTs7WUFFM0QsTUFBTSxPQUFPLG1DQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUN6QyxlQUFlLENBQ25CO1lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVTtpQkFDbkIsSUFBSSxDQUFJLEdBQUcsRUFBRSxJQUFJLGtCQUNoQixPQUFPLEVBQ1AsYUFBYSxFQUFFLElBQUksSUFDaEIsa0JBQWtCLEVBQ3JCO2lCQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQix3QkFBWSxFQUFDLFFBQVEsQ0FBQztnQkFFdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFJLFFBQVEsQ0FBQztZQUN4QyxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQU8sQ0FBTSxFQUFFLEVBQUU7Z0JBQ3RCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FDcEMsSUFBSSxDQUFDLElBQUksQ0FBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQ25FO1lBQ0gsQ0FBQyxFQUFDO1FBQ04sQ0FBQztLQUFBO0lBRVksR0FBRyxDQUNkLEdBQVcsRUFDWCxJQUFTLEVBQ1QsV0FBK0IsRUFDL0Isa0JBQXNELEVBQUU7O1lBRXhELE1BQU0sT0FBTyxtQ0FDUixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxHQUNoRCxlQUFlLENBQ25CO1lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVTtpQkFDbkIsR0FBRyxDQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNuRCxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakIsd0JBQVksRUFBQyxRQUFRLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBSSxRQUFRLENBQUM7WUFDeEMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFPLENBQU0sRUFBRSxFQUFFO2dCQUN0QixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQ3JEO1lBQ0gsQ0FBQyxFQUFDO1FBQ04sQ0FBQztLQUFBO0lBRVksTUFBTSxDQUNqQixHQUFXLEVBQ1gsV0FBb0I7O1lBRXBCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDO1lBRWhFLE9BQU8sSUFBSSxDQUFDLFVBQVU7aUJBQ25CLE1BQU0sQ0FBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNoRCxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakIsd0JBQVksRUFBQyxRQUFRLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBSSxRQUFRLENBQUM7WUFDeEMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFPLENBQU0sRUFBRSxFQUFFO2dCQUN0QixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxFQUFDO1FBQ04sQ0FBQztLQUFBO0lBRVksS0FBSyxDQUNoQixHQUFXLEVBQ1gsT0FBWSxFQUFFLEVBQ2QsV0FBb0IsRUFDcEIsa0JBQXNELEVBQUU7O1lBRXhELE1BQU0sT0FBTyxtQ0FDUixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxHQUNoRCxlQUFlLENBQ25CO1lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVTtpQkFDbkIsS0FBSyxDQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyRCxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakIsd0JBQVksRUFBQyxRQUFRLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBSSxRQUFRLENBQUM7WUFDeEMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFPLENBQU0sRUFBRSxFQUFFO2dCQUN0QixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FDdEM7WUFDSCxDQUFDLEVBQUM7UUFDTixDQUFDO0tBQUE7SUFFWSxVQUFVLENBQ3JCLEdBQVcsRUFDWCxPQUFlLEVBQ2YsV0FBb0I7OztZQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQztZQUVoRSxJQUFJLFVBQUksQ0FBQyxtQkFBbUIsMENBQUUsS0FBSyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7YUFDakM7WUFFRCxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRTtvQkFDeEQsT0FBTztvQkFDUCxnQkFBZ0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztpQkFDL0MsQ0FBQztnQkFFRixPQUFPO29CQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDckIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFXO2lCQUN6QzthQUNGO1lBQUMsT0FBTyxDQUFNLEVBQUU7Z0JBQ2YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQXlCO2dCQUM1QyxJQUFJLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxNQUFNLE1BQUssR0FBRyxJQUFJLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxNQUFNLE1BQUssR0FBRyxFQUFFO29CQUN4RCxJQUFJLENBQUMsOEJBQThCLENBQUMsUUFBUSxDQUFDO29CQUU3QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTt3QkFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO3FCQUNsRDtvQkFDRCxNQUFNLENBQUM7aUJBQ1I7Z0JBQ0QsTUFBTSxDQUFDO2FBQ1I7O0tBQ0Y7SUFtWlMsYUFBYSxDQUFJLFFBQTRCO1FBQ3JELE1BQU0sSUFBSSxHQUFHLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDOUQsSUFBSSxjQUFjO1FBQ2xCLElBQUksY0FBYyxHQUFZLEtBQUs7UUFFbkMsSUFBSTtZQUNGLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDckMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzthQUMzQztpQkFBTTtnQkFDTCxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUk7YUFDL0I7U0FDRjtRQUFDLFdBQU07WUFDTixJQUFJO2dCQUNGLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDZDQUFtQixFQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoRTtZQUFDLFdBQU07Z0JBQ04sY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJO2FBQy9CO1lBRUQsY0FBYyxHQUFHLElBQUk7U0FDdEI7UUFFRCxJQUFJLGdCQUFnQixHQUtoQjtZQUNGLE1BQU0sRUFBRSxjQUFtQjtZQUMzQixJQUFJO1lBQ0osTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1NBQ3hCO1FBRUQsSUFBSSxjQUFjLEVBQUU7WUFDbEIsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJO1NBQ3JDO1FBRUQsT0FBTyxnQkFBZ0I7SUFDekIsQ0FBQztJQUVPLGdCQUFnQixDQUN0QixPQUFlLEVBQ2YsaUJBQXNDO1FBRXRDLE1BQU0sVUFBVSxHQUFHLGlCQUFpQjtZQUNsQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1lBQ3BDLENBQUMsQ0FBQyxTQUFTO1FBRWIsSUFBSSxDQUFDLFVBQVUsR0FBRywrQkFBbUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO1FBRTFELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25ELE9BQU8sTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBeHdCRCxzQ0F3d0JDO0FBRU0sTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUF1QixFQUFFLEVBQUU7O0lBQ3RELFFBQVEsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUN2QixLQUFLLEdBQUc7WUFDTixJQUNFLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLEVBQ3ZDO2dCQUNBLDRJQUE0STtnQkFDNUksTUFBTSxJQUFJLDJCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDNUM7WUFFRCxJQUNFLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLHFCQUFxQixFQUNyRDtnQkFDQSxNQUFNLElBQUksNkNBQXFCLEVBQUU7YUFDbEM7WUFDRCxNQUFLO1FBQ1AsS0FBSyxHQUFHO1lBQ04sSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUNyQyxNQUFNLElBQUksMkJBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzthQUM1QztpQkFBTTtnQkFDTCxNQUFNLElBQUksMkJBQWtCLEVBQUU7YUFDL0I7S0FDSjtJQUVELElBQUksb0JBQVEsQ0FBQyxJQUFJLDBDQUFFLFFBQVEsMENBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzlDLE1BQU0sSUFBSSwyQkFBa0IsRUFBRTtLQUMvQjtJQUVELElBQ0UsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDakMsa0NBQXVCLEVBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUN0QztRQUNBLE1BQU0sSUFBSSx1QkFBYyxDQUN0Qix3QkFBd0IsRUFDeEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQzdCO0tBQ0Y7SUFFRCxJQUNFLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ2pDLDBCQUFlLEVBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5QixDQUFDLHFCQUFRLENBQUMsTUFBTSwwQ0FBRSxHQUFHLDBDQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUNsRDtRQUNBLE1BQU0sSUFBSSwyQkFBa0IsRUFBRTtLQUMvQjtJQUNELElBQUksY0FBUSxDQUFDLElBQUksMENBQUUsWUFBWSxFQUFFO1FBQy9CLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1FBQ3hELE1BQU0sSUFBSSx1QkFBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO0tBQ3JFO0lBRUQsSUFBSSxvQkFBUSxDQUFDLE1BQU0sMENBQUUsR0FBRywwQ0FBRSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDbEQsTUFBTSxJQUFJLDZCQUFhLEVBQUU7S0FDMUI7SUFFRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQWMsQ0FBQztJQUVqRCxJQUFJLEtBQUssRUFBRTtRQUNULE1BQU0sS0FBSztLQUNaO0FBQ0gsQ0FBQztBQTdEWSxvQkFBWSxnQkE2RHhCO0FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUNsQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSTtJQUV0QixJQUFJO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLFlBQVksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUNsRCxPQUFPLElBQUksMEJBQWlCLENBQzFCLFlBQVksQ0FBQyxTQUFTLEVBQ3RCLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUM5QjtTQUNGO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0lBRWQsSUFBSTtRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDdkMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDcEIsTUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtnQkFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxJQUFJLDBCQUFpQixDQUMxQixTQUFTLENBQUMsU0FBUyxFQUNuQixTQUFTLENBQUMsT0FBTyxFQUNqQixJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FDL0I7YUFDRjtTQUNGO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0lBRWQsSUFBSTtRQUNGLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxDQUFDLDZCQUE2QixDQUFDO1FBQzdELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztZQUN2RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLG9JQUFvSTtvQkFDdEksQ0FBQyxDQUFDLDZCQUE2QixpQkFBaUIsRUFBRTtnQkFDcEQsT0FBTyxJQUFJLDBCQUFpQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO2FBQy9DO1NBQ0Y7S0FDRjtJQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7SUFFZCxJQUFJO1FBQ0YsNERBQTREO1FBQzVELDJEQUEyRDtRQUMzRCw2REFBNkQ7UUFDN0QsMkRBQTJEO1FBQzNELDJEQUEyRDtRQUMzRCx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQ1osQ0FBQyxLQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1lBQy9CLENBQUMsQ0FBQyxLQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDO1lBQ3RDLENBQUMsQ0FBQyxLQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxDQUFDLHNDQUFzQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUM1QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sT0FBTyxHQUFHLHFDQUFxQztnQkFDckQsT0FBTyxJQUFJLDBCQUFpQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO2FBQ2hEO1NBQ0Y7S0FDRjtJQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7SUFFZCxPQUFPLElBQUk7QUFDYixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QWF4NkJEOzs7R0FHRztBQUNILE1BQWEsV0FBVztJQUF4QjtRQUNFOzs7O1dBSUc7UUFDSCxjQUFTLEdBQVcsRUFBRTtRQUN0Qjs7O1dBR0c7UUFDSCxjQUFTLEdBQVcsRUFBRTtRQUN0Qjs7O1dBR0c7UUFDSCxhQUFRLEdBQVcsRUFBRTtRQUNyQjs7O1dBR0c7UUFDSCxnQkFBVyxHQUFXLEVBQUU7UUFDeEI7Ozs7Ozs7O1dBUUc7UUFDSCxXQUFNLEdBQVcsRUFBRTtRQUNuQjs7V0FFRztRQUNILGVBQVUsR0FBc0IsSUFBSTtRQUNwQzs7V0FFRztRQUNILFVBQUssR0FBWSxJQUFJO1FBQ3JCOztXQUVHO1FBQ0gsWUFBTyxHQUFpQixJQUFJO1FBQzVCOzs7V0FHRztRQUNILGdCQUFXLEdBQVcsRUFBRTtRQUN4Qjs7Ozs7OztXQU9HO1FBQ0gsa0JBQWEsR0FBbUIsSUFBSTtRQU9wQzs7V0FFRztRQUNILG1CQUFjLEdBQW1CLGNBQWMsQ0FBQyxPQUFPO1FBQ3ZEOzs7V0FHRztRQUNILHdCQUFtQixHQUFZLEVBQUU7UUFDakM7Ozs7OztXQU1HO1FBQ0gsY0FBUyxHQUFhLEtBQUs7SUFDN0IsQ0FBQztDQUFBO0FBakZELGtDQWlGQztBQUVELElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4QixxQ0FBbUI7SUFDbkIsMkNBQXlCO0FBQzNCLENBQUMsRUFIVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUd6Qjs7Ozs7Ozs7Ozs7O0FDM0ZELElBQVksWUFTWDtBQVRELFdBQVksWUFBWTtJQUN0Qix1Q0FBdUI7SUFDdkIsbUNBQW1CO0lBQ25CLG1DQUFtQjtJQUNuQiw2QkFBYTtJQUNiLDJDQUEyQjtJQUMzQiw0QkFBWTtJQUNaLGlDQUFpQjtJQUNqQiwrQkFBZTtBQUNqQixDQUFDLEVBVFcsWUFBWSxHQUFaLG9CQUFZLEtBQVosb0JBQVksUUFTdkI7Ozs7Ozs7Ozs7OztBQ1pELDRDQUF3QztBQUV4QyxNQUFhLE1BQU07SUFHakIsWUFBWSxLQUEwQixFQUFFLFNBQWlCO1FBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRTtRQUVqQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7SUFDNUIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFpQyxFQUFFLFNBQWlCO1FBQ3RELElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDhCQUE4QixDQUFDO2FBQ3hEO1lBQ0QsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxzQkFBYSxDQUFDLGdDQUFnQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNuRCxNQUFNLElBQUksc0JBQWEsQ0FBQywwQ0FBMEMsQ0FBQzthQUNwRTtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUksc0JBQWEsQ0FBQyxtQkFBbUIsQ0FBQztTQUM3QztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSztJQUNqQyxDQUFDO0NBQ0Y7QUExQkQsd0JBMEJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRzVCRCxNQUFhLGFBQWMsU0FBUSxLQUFLO0lBQ3RDLFlBQW1CLE9BQWU7UUFDaEMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQURHLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFFaEMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlO1FBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBTkQsc0NBTUM7Ozs7Ozs7Ozs7OztBQ05ELE1BQWEsY0FBZSxTQUFRLEtBQUs7SUFDdkMsWUFDUyxPQUFlLEVBQ2YsVUFBa0I7UUFFekIsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUhQLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBR3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCO1FBQzVCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBVEQsd0NBU0M7Ozs7Ozs7Ozs7OztBQ1RELE1BQU0saUJBQWlCLEdBQ3JCLGtFQUFrRTtBQUVwRSxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFDekMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FDSCxHQUFHLE9BQU8sMkVBQTJFLGlCQUFpQixJQUFJLENBQzNHO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0I7UUFDOUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQVJELDRDQVFDOzs7Ozs7Ozs7Ozs7QUNURCxNQUFhLHdCQUF5QixTQUFRLEtBQUs7SUFDakQsWUFDUyxHQUFRLEVBQ1IsR0FBVztRQUVsQixLQUFLLENBQUMsNkJBQTZCLENBQUM7UUFIN0IsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUNSLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFHbEIsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEI7UUFDdEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsU0FBUyxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQVRELDREQVNDOzs7Ozs7Ozs7Ozs7QUNYRCxNQUFhLGFBQWE7SUFHeEIsWUFBWSxPQUFlLEVBQUUsT0FBYSxFQUFFLEdBQVM7UUFDbkQsSUFBSSxhQUFhLEdBQUcsT0FBTztRQUUzQixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUMvQixJQUFJO2dCQUNGLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUNwQztZQUFDLFdBQU07Z0JBQ04sR0FBRyxHQUFHLE9BQU87Z0JBQ2IsYUFBYSxHQUFHLEVBQUU7YUFDbkI7U0FDRjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxPQUFPO1lBQ1AsT0FBTyxFQUFFLGFBQWE7WUFDdEIsR0FBRztTQUNKO0lBQ0gsQ0FBQztDQUNGO0FBckJELHNDQXFCQzs7Ozs7Ozs7Ozs7O0FDckJELE1BQWEsbUJBQW9CLFNBQVEsS0FBSztJQUM1QztRQUNFLEtBQUssQ0FBQywrQkFBK0IsQ0FBQztRQUV0QyxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQjtRQUVqQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7SUFDNUQsQ0FBQztDQUNGO0FBUkQsa0RBUUM7Ozs7Ozs7Ozs7OztBQ1JELE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztJQUN6QztRQUNFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQjtRQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBTkQsNENBTUM7Ozs7Ozs7Ozs7Ozs7QUNORCxNQUFhLHFCQUFzQixTQUFRLEtBQUs7SUFDOUM7UUFDRSxNQUFNLE9BQU8sR0FBRyxxQkFBcUI7UUFFckMsS0FBSyxDQUFDLGVBQWUsT0FBTyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUI7UUFDbkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsU0FBUyxDQUFDO0lBQzlELENBQUM7Q0FDRjtBQVJELHNEQVFDOzs7Ozs7Ozs7Ozs7QUNSRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFDMUMsWUFDUyxTQUFpQixFQUNqQixZQUFvQixFQUNwQixNQUFjO1FBRXJCLEtBQUssQ0FBQyxjQUFjLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUoxQyxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFHckIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUI7UUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQVZELDhDQVVDOzs7Ozs7Ozs7Ozs7QUNWRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFDMUMsWUFDRSxFQUFVLEVBQ0gsYUFBb0I7UUFFM0IsS0FBSyxDQUNILHlDQUF5QyxFQUFFLEtBQ3pDLGFBQWEsQ0FBQyxPQUFPLElBQUksYUFDM0IsRUFBRSxDQUNIO1FBTk0sa0JBQWEsR0FBYixhQUFhLENBQU87UUFPM0IsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUI7UUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQWJELDhDQWFDOzs7Ozs7Ozs7Ozs7QUNiRCxNQUFhLG1CQUFvQixTQUFRLEtBQUs7SUFDNUM7UUFDRSxLQUFLLENBQUMscUNBQXFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUI7UUFDakMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDO0lBQzVELENBQUM7Q0FDRjtBQU5ELGtEQU1DOzs7Ozs7Ozs7Ozs7QUNORCxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsWUFBWSxPQUFhO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU87WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLCtDQUErQztRQUVuRCxLQUFLLENBQUMsZUFBZSxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQjtRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBVkQsZ0RBVUM7Ozs7Ozs7Ozs7OztBQ1ZELE1BQWEsbUJBQW9CLFNBQVEsS0FBSztJQUM1QyxZQUNTLG9CQUE0QixFQUM1QixlQUF1QixFQUN2QixNQUFjO1FBRXJCLEtBQUssQ0FDSCxzREFBc0Qsb0JBQW9CLDJCQUEyQixlQUFlLEVBQUUsQ0FDdkg7UUFOTSx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVE7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQVE7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQU1yQixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQjtRQUU3QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7SUFDNUQsQ0FBQztDQUNGO0FBZEQsa0RBY0M7Ozs7Ozs7Ozs7OztBQ2RELE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFBbUIsR0FBVztRQUM1QixLQUFLLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7UUFEL0IsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUU1QixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWU7UUFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFORCxzQ0FNQzs7Ozs7Ozs7Ozs7O0FDTkQsMENBQStDO0FBRS9DLE1BQWEsdUJBQXdCLFNBQVEsS0FBSztJQUNoRCxZQUNFLGdCQUF3QixFQUN4QixTQUFpQixFQUNqQixXQUFvQjtRQUVwQixJQUFJLE9BQU8sR0FDVCxlQUFlLGdCQUFnQixpQkFBaUI7WUFDaEQsa0JBQWtCLFNBQVMsWUFBWTtZQUN2QyxzRUFBc0U7UUFDeEUsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLFlBQVksR0FBRyxzQkFBVyxFQUFDLFdBQVcsQ0FBQztZQUM3QyxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSztZQUM5QixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztZQUM5QyxPQUFPO2dCQUNMLG9EQUFvRCxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzFFO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcseUJBQXlCO1FBQ3JDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLFNBQVMsQ0FBQztJQUNoRSxDQUFDO0NBQ0Y7QUFyQkQsMERBcUJDOzs7Ozs7Ozs7Ozs7O0FDdkJELE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFDdEM7UUFDRSxLQUFLLENBQ0gsa0dBQWtHLENBQ25HO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0I7UUFDNUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFSRCxzQ0FRQzs7Ozs7Ozs7Ozs7O0FDUkQsTUFBYSxtQkFBb0IsU0FBUSxLQUFLO0lBQzVDLFlBQW1CLEdBQVc7UUFDNUIsS0FBSyxDQUFDLDRDQUE0QyxHQUFHLEVBQUUsQ0FBQztRQUR2QyxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBRTVCLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCO1FBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUFORCxrREFNQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05ELGtEQUErQjtBQUMvQixpREFBZ0M7QUFDaEMsa0RBQWtDO0FBQ2xDLGtEQUEwQztBQUMxQyxrREFBK0I7QUFDL0Isa0RBQXFDO0FBQ3JDLGtEQUFrQztBQUNsQyxrREFBbUM7QUFDbkMsa0RBQW1DO0FBQ25DLGlEQUFxQztBQUNyQyxrREFBb0M7QUFDcEMsa0RBQXFDO0FBQ3JDLGtEQUErQjtBQUMvQixrREFBeUM7QUFDekMsa0RBQXFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZHJDLGtEQUF5QjtBQUN6QixrREFBMkI7QUFDM0Isa0RBQXdCO0FBQ3hCLGtEQUFzQjtBQUN0QixrREFBcUI7QUFDckIsa0RBQStCO0FBQy9CLGtEQUEyQjtBQUMzQixrREFBc0I7QUFDdEIsa0RBQXVCO0FBQ3ZCLGtEQUE2QjtBQUM3QixpREFBK0I7QUFDL0Isa0RBQXlCO0FBQ3pCLGtEQUE0QjtBQUM1QixrREFBNkI7QUFDN0Isa0RBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixrREFBd0I7QUFDeEIsa0RBQXdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmeEIsU0FBc0IsNkJBQTZCLENBQ2pELFFBQWEsRUFDYix1QkFBa0Q7O1FBRWxELElBQUksY0FBYyxHQUFHLEVBQUU7UUFFdkIsSUFBSSx1QkFBdUIsYUFBdkIsdUJBQXVCLHVCQUF2Qix1QkFBdUIsQ0FBRSxNQUFNLEVBQUU7WUFDbkMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUNwRCxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQ3pELEVBQUUsQ0FDSDtZQUVELGNBQWMsbUJBQ1osTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQ3BCLGVBQWUsQ0FDbkI7U0FDRjs7WUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE1BQU07UUFFdkMsT0FBTyxjQUFjO0lBQ3ZCLENBQUM7Q0FBQTtBQW5CRCxzRUFtQkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCRCxTQUFzQixZQUFZLENBQUMsS0FBWSxFQUFFLFFBQWE7O1FBQzVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pELE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztDQUFBO0FBSkQsb0NBSUM7Ozs7Ozs7Ozs7OztBQ0ZEOzs7R0FHRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFlLEVBQUUsQ0FBZSxFQUFFLEVBQUU7SUFDcEUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0FBQ3RELENBQUM7QUFGWSx5QkFBaUIscUJBRTdCOzs7Ozs7Ozs7Ozs7QUNSRCxnREFBZ0U7QUFDaEUsMENBQWtEO0FBRWxEOzs7R0FHRztBQUNJLE1BQU0sWUFBWSxHQUFHLENBQzFCLElBQTRCLEVBQzVCLFNBQWlCLEVBQ2pCLEVBQUU7O0lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNwQixNQUFNLEtBQUssR0FBRyx5QkFBYSxFQUN6QiwyQ0FBMkMsRUFDM0MsaUNBQWlDLENBQ2xDO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFckQsTUFBTSxLQUFLO0tBQ1o7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBRTdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRTtJQUVwQyxJQUFJLE9BQU8sR0FBRyxVQUFJLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQywwQ0FBRSxPQUFPO0lBQzVDLElBQUksT0FBTyxHQUFhLEVBQUU7SUFDMUIsSUFBSSxPQUFPO0lBQ1gsSUFBSSxhQUFhLEdBQUcsS0FBSztJQUV6QixJQUFJLE9BQU8sRUFBRTtRQUNYLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksT0FBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7S0FDdkU7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDN0IsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELElBQUksZUFBZSxHQUFHLEtBQUs7WUFDM0IsSUFBSSx1QkFBdUIsR0FBRyxLQUFLO1lBRW5DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUEyQixFQUFFLEVBQUU7Z0JBQzVDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ3pELGVBQWUsR0FBRyxJQUFJO2lCQUN2QjtxQkFBTSxJQUNMLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVE7b0JBQzlCLGlDQUFnQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1QjtvQkFDQSx1QkFBdUIsR0FBRyxJQUFJO2lCQUMvQjtZQUNILENBQUMsQ0FBQztZQUVGLElBQUksZUFBZSxJQUFJLHVCQUF1QixFQUFFO2dCQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUM7Z0JBRTlCLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU8sR0FBRyxFQUFFO2dCQUUxQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLGNBQWMsR0FBa0IsSUFBSTtnQkFDeEMsSUFBSSxhQUFhLEdBQVksS0FBSztnQkFDbEMsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDO2dCQUU1QixNQUFNLG9CQUFvQixHQUFHLEtBQUs7cUJBQy9CLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDL0IsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDbkMsSUFBSSxjQUFjLEVBQUU7NEJBQ2xCLElBQUksZ0JBQWdCLEdBQ2xCLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUTtnQ0FDakQsQ0FBQyxDQUFDLE9BQU87Z0NBQ1QsQ0FBQyxDQUFDLFFBQVE7NEJBRWQsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQ0FDbEIsYUFBYSxHQUFHLGdCQUFnQixLQUFLLGNBQWM7Z0NBQ25ELFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDN0M7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFO2dDQUNyQixjQUFjLEdBQUcsT0FBTzs2QkFDekI7aUNBQU07Z0NBQ0wsY0FBYztvQ0FDWixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUTs2QkFDdEQ7eUJBQ0Y7d0JBRUQsSUFBSSxRQUFRO3dCQUVaLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFOzRCQUNsQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDbkM7d0JBRUQsT0FBTyxRQUFRO3FCQUNoQjtnQkFDSCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFckMsSUFBSSxvQkFBb0IsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLEVBQUU7b0JBQ3hELGFBQWEsR0FBRyxJQUFJO2lCQUNyQjtnQkFFRCxJQUFJLGFBQWEsRUFBRTtvQkFDakIsT0FBTyxDQUFDLEtBQUssQ0FDWCxRQUFRLFdBQVcsY0FBYyxLQUFLLDBCQUEwQixDQUNqRTtpQkFDRjtnQkFFRCxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsS0FBSyxJQUFJLGNBQWMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUNuRCxvQkFBb0I7b0JBQ2xCLENBQUMsQ0FBQyxvQkFBb0I7b0JBQ3RCLENBQUMsQ0FBQyxjQUFjLEtBQUssT0FBTzt3QkFDMUIsQ0FBQyxDQUFDLEdBQUc7d0JBQ0wsQ0FBQyxDQUFDLE1BQ1IsR0FBRyxDQUNKO2FBQ0Y7U0FDRjtJQUNILENBQUMsQ0FBQztJQUVGLElBQUksT0FBTyxFQUFFO1FBQ1gsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQ3BCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ1AsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQzdDO0tBQ0Y7SUFFRCxJQUFJLGFBQWE7UUFBRSxPQUFPLDRCQUE0QjtJQUV0RCxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZELElBQUksS0FBSztZQUNULE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFFbEMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO2dCQUFFLE9BQU8sV0FBVztZQUV2RCxnRUFBZ0U7WUFDaEUsS0FBSyxHQUFHLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVztZQUUvQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUM3QyxJQUFJLEtBQUssSUFBSSxDQUFDLGlDQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNyQyxNQUFNLElBQUksS0FBSyxDQUNiLDZGQUE2RixDQUM5RjtpQkFDRjtnQkFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUc7Z0JBRTFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO2FBQ3RDO1lBRUQsa0VBQWtFO1lBQ2xFLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7WUFFakMsd0NBQXdDO1lBQ3hDLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRztZQUVwQixJQUNFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUN2RTtnQkFDQSwwRUFBMEU7Z0JBQzFFLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUM3QztZQUVELEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFFckMsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ25ELEtBQUssR0FBRyxHQUFHO2FBQ1o7WUFFRCxPQUFPLEtBQUs7UUFDZCxDQUFDLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ3pCLENBQUMsQ0FBQztJQUVGLElBQUksUUFBUSxHQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFdEUsT0FBTyxRQUFRO0FBQ2pCLENBQUM7QUE3S1ksb0JBQVksZ0JBNkt4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0sY0FBYyxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7QUFBL0Qsc0JBQWMsa0JBQWlEO0FBRTVFLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDbEMsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU07SUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLElBQUksS0FBSztZQUFFLFFBQVEsRUFBRTthQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU07WUFBRSxRQUFRLElBQUksQ0FBQztRQUN0RCxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU07WUFBRSxDQUFDLEVBQUUsRUFBQyxpQkFBaUI7S0FDNUQ7SUFDRCxPQUFPLFFBQVE7QUFDakIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDck1ELDREQUF5QjtBQUdsQixNQUFNLG1CQUFtQixHQUFHLENBQ2pDLE9BQWUsRUFDZixVQUF3QixFQUN4QixFQUFFLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUg3QiwyQkFBbUIsdUJBR1U7Ozs7Ozs7Ozs7OztBQ05uQyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQ2xDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRHRDLGFBQUssU0FDaUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBbkQsMENBQWtEO0FBRWxEOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQzlCLGFBQTRCLEVBQzVCLFdBQW1CLEVBQ25CLE1BQWMsRUFDZCxRQUFnQixFQUNDLEVBQUU7SUFDbkIsT0FBTyxNQUFNLG9CQUFRLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUN4RSxDQUFDO0FBUFksd0JBQWdCLG9CQU81QjtBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSxRQUFRLEdBQUcsQ0FDdEIsYUFBNEIsRUFDNUIsV0FBbUIsRUFDbkIsTUFBYyxFQUNkLEtBQWEsRUFDYixHQUFXLEVBQ00sRUFBRTtJQUNuQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU87SUFFeEMsSUFBSSxHQUFHLEdBQVcsRUFBRTtJQUVwQixNQUFNLFFBQVEsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUs7SUFDMUMsR0FBRztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQ1QsK0JBQStCLEtBQUssR0FBRyxDQUFDLE9BQ3RDLEtBQUssR0FBRyxRQUNWLE9BQU8sR0FBRyxHQUFHLENBQ2Q7UUFDRCxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWM7YUFDdEMsR0FBRyxDQUFNLEdBQUcsTUFBTSxVQUFVLEtBQUssVUFBVSxRQUFRLEVBQUUsRUFBRSxXQUFXLENBQUM7YUFDbkUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2FBQzlCLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsTUFBTSx5QkFBYSxFQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQztRQUN2RCxDQUFDLENBQUM7UUFFSixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFLO1FBRTFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0RSxHQUFHLElBQUksUUFBUTtRQUVmLEtBQUssSUFBSSxRQUFRO0tBQ2xCLFFBQVEsS0FBSyxHQUFHLEdBQUcsRUFBQztJQUNyQixPQUFPLEdBQUc7QUFDWixDQUFDO0FBakNZLGdCQUFRLFlBaUNwQjs7Ozs7Ozs7Ozs7Ozs7O0FDOURELHNDQUEyQjtBQUMzQixnRUFBb0M7QUFFN0IsTUFBTSxXQUFXLEdBQUcsR0FBNEIsRUFBRSxDQUN2RCxhQUFNLEdBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFO0FBRG5DLG1CQUFXLGVBQ3dCOzs7Ozs7Ozs7Ozs7QUNBaEQ7OztHQUdHO0FBQ0ksTUFBTSxlQUFlLEdBQUcsR0FBRyxFQUFFLENBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFLLE1BQU0sQ0FBQyxTQUF5QixDQUFDLFlBQVk7QUFEaEUsdUJBQWUsbUJBQ2lEOzs7Ozs7Ozs7Ozs7QUNUN0UsNENBQXVFO0FBRXZFOzs7R0FHRztBQUNJLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBb0IsRUFBVSxFQUFFO0lBQzNELElBQUk7UUFDRixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxNQUFNLElBQUkseUJBQWdCLEVBQUU7UUFFbkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sSUFBSSw0QkFBbUIsRUFBRTtRQUV2RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUc7UUFFdkMsSUFBSSxHQUFHLEtBQUssRUFBRTtZQUFFLE9BQU8sRUFBRTtRQUV6QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ3ZCO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixJQUFJLENBQUMsWUFBWSw0QkFBbUI7WUFBRSxNQUFNLENBQUM7UUFFN0MsTUFBTSxJQUFJLHlCQUFnQixFQUFFO0tBQzdCO0FBQ0gsQ0FBQztBQWhCWSxvQkFBWSxnQkFnQnhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJELGtEQUErQztBQUMvQyxrREFBOEI7QUFDOUIsa0RBQW1DO0FBQ25DLGlEQUE4QjtBQUM5QixrREFBcUM7QUFDckMsa0RBQXVCO0FBQ3ZCLGtEQUFrQztBQUNsQyxrREFBOEI7QUFDOUIsa0RBQXdCO0FBQ3hCLGtEQUFnQztBQUNoQyxrREFBdUI7QUFDdkIsa0RBQXVCO0FBQ3ZCLGtEQUE0QjtBQUM1QixrREFBb0M7QUFDcEMsaURBQWlDO0FBQ2pDLGtEQUFpQztBQUNqQyxrREFBd0M7QUFDeEMsa0RBQTJDO0FBQzNDLGtEQUFxQztBQUNyQyxrREFBMkI7QUFDM0Isa0RBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixrREFBNkI7QUFDN0Isa0RBQWlDOzs7Ozs7Ozs7Ozs7O0FDdkIxQixNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FDekIsT0FBTyxPQUFPLEtBQUssV0FBVztJQUM5QixPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7SUFDeEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSTtBQUhsQixjQUFNLFVBR1k7Ozs7Ozs7Ozs7OztBQ0h4QixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBVyxFQUFFLENBQ3JELENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztBQURsQixzQkFBYyxrQkFDSTs7Ozs7Ozs7Ozs7O0FDRC9COzs7R0FHRztBQUNJLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQW5FLGFBQUssU0FBOEQ7Ozs7Ozs7Ozs7OztBQ0poRjs7O0dBR0c7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQVcsRUFBVyxFQUFFO0lBQzVDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO0lBRTlDLElBQUk7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFFeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxLQUFLO0tBQzdEO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLEtBQUs7S0FDYjtJQUVELE9BQU8sSUFBSTtBQUNiLENBQUM7QUFaWSxhQUFLLFNBWWpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQkQsSUFBSyxNQUlKO0FBSkQsV0FBSyxNQUFNO0lBQ1QsdUNBQTZCO0lBQzdCLCtDQUFxQztJQUNyQyw0Q0FBa0M7QUFDcEMsQ0FBQyxFQUpJLE1BQU0sS0FBTixNQUFNLFFBSVY7QUFDRCxNQUFNLFNBQVMsR0FBRyxlQUFlO0FBRWpDLE1BQU0sT0FBTyxHQUFHO0lBQ2QsS0FBSyxFQUFFLEdBQUcsU0FBUyxPQUFPO0lBQzFCLE9BQU8sRUFBRSxHQUFHLFNBQVMsU0FBUztDQUMvQjtBQUVNLE1BQU0sZUFBZSxHQUFHLEdBQXFCLEVBQUU7SUFDcEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFPLE9BQU8sRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBQzdDLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU07UUFDeEIsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFVO1FBRTVCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ25ELGFBQWEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU87UUFDakMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUU1QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNqRCxXQUFXLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNO1FBQzlCLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFeEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDMUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxrQkFBa0I7UUFDcEMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFFOUIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyx5Q0FBeUM7UUFDMUQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDNUIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFFbkMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDckQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3BDLFlBQVksQ0FBQyxTQUFTLEdBQUcsUUFBUTtRQUNqQyxZQUFZLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUMxQixnQkFBZ0IsRUFBRTtZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUNqRCxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDakMsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJO1FBQ3pCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLGdCQUFnQixFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDZixDQUFDO1FBQ0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFFakMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVE7UUFFdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQyxFQUFDO0FBQ0osQ0FBQztBQWhEWSx1QkFBZSxtQkFnRDNCO0FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7SUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTs7UUFDbkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDeEMsVUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsMENBQUUsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTTtBQUN2QyxDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQUc7R0FDaEIsT0FBTyxDQUFDLE9BQU87R0FDZixPQUFPLENBQUMsS0FBSzs7O0dBR2IsT0FBTyxDQUFDLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJiLE9BQU8sQ0FBQyxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7R0FlYixPQUFPLENBQUMsS0FBSzs7Ozs7Ozs7Ozs7Ozs7O0dBZWIsT0FBTyxDQUFDLEtBQUs7Ozs7Ozs7Ozs7OztHQVliLE9BQU8sQ0FBQyxLQUFLOzs7R0FHYixPQUFPLENBQUMsS0FBSzs7O0dBR2IsT0FBTyxDQUFDLEtBQUs7Ozs7Ozs7Ozs7Ozs7O0dBY2IsT0FBTyxDQUFDLEtBQUs7OztHQUdiLE9BQU8sQ0FBQyxPQUFPOzs7Ozs7Ozs7Ozs7O0NBYWpCOzs7Ozs7Ozs7Ozs7QUNoTE0sTUFBTSxVQUFVLEdBQUcsQ0FBQyxZQUFvQixFQUFXLEVBQUU7SUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxZQUFZO1FBQ2QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDOUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO2dCQUNwQyxZQUFZLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDL0MsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztnQkFDcEMsWUFBWSxDQUFDLFFBQVEsQ0FDbkIsZ0RBQWdELENBQ2pELENBQUMsQ0FBQyxDQUNSO0FBQ0gsQ0FBQztBQWJZLGtCQUFVLGNBYXRCOzs7Ozs7Ozs7Ozs7QUNiTSxNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDaEQsTUFBTSxVQUFVLEdBQUcsUUFBUTtJQUMzQixNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDM0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7SUFDNUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM5QixDQUFDO0FBTlksMEJBQWtCLHNCQU05Qjs7Ozs7Ozs7Ozs7O0FDTk0sTUFBTSxlQUFlLEdBQUcsQ0FBQyxXQUE2QixFQUFFLEVBQUU7SUFDL0QsSUFBSSxHQUFHO0lBQ1AsSUFBSTtRQUNGLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSztZQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztLQUNoQztJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxzREFBc0QsRUFBRSxDQUFDLENBQUM7UUFDeEUsR0FBRyxHQUFHLFdBQVc7S0FDbEI7SUFDRCxPQUFPLEdBQUc7QUFDWixDQUFDO0FBWFksdUJBQWUsbUJBVzNCOzs7Ozs7Ozs7Ozs7QUNYTSxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFO0lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQ3pELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUIsQ0FBQztBQUxZLHVCQUFlLG1CQUszQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSkQsMkNBQXVDO0FBRXZDOzs7Ozs7Ozs7R0FTRztBQUNJLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsUUFBZ0IsRUFDaEIsYUFBNEIsRUFDNUIsU0FBaUIsRUFDakIsRUFBRTtJQUNGLDRGQUE0RjtJQUM1RixrSEFBa0g7SUFFbEgsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FDaEMsMEhBQTBILENBQzNILENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSxPQUFPLEdBQUcsV0FBVztRQUN6QixDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsSUFBSTtJQUNSLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDO0tBQ25EO0lBRUQsT0FBTyxhQUFhO1NBQ2pCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7U0FDakQsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyx3QkFBWSxFQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBckJZLGlDQUF5Qiw2QkFxQnJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQ0Qsa0RBQTZDO0FBQzdDLHlEQUEyRDtBQUUzRDs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sNEJBQTRCLEdBQUcsQ0FBTyxRQUFhLEVBQUUsRUFBRTtJQUNsRSwwRUFBMEU7SUFDMUUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDaEMsT0FBTyxRQUFRO0tBQ2hCO0lBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FDOUIsaUZBQWlGLENBQ2xGO0lBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUM7S0FDckU7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLDZDQUFtQixFQUFDLFdBQVcsQ0FBQztRQUNsQyxDQUFDLENBQUMsV0FBVztJQUVmLE9BQU8sK0JBQVksRUFBQyxRQUFRLENBQUM7QUFDL0IsQ0FBQztBQW5CWSxvQ0FBNEIsZ0NBbUJ4Qzs7Ozs7Ozs7Ozs7O0FDL0JELDRDQUFxRDtBQUU5QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxHQUFZLEVBQVUsRUFBRTtJQUM1RSxJQUFJLFdBQVcsR0FBRyxFQUFFO0lBRXBCLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hDLElBQUk7WUFDRixXQUFXLEdBQUcsUUFBUTtpQkFDbkIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixJQUFJLEdBQUc7Z0JBQUUsTUFBTSxJQUFJLDRCQUFtQixDQUFDLEdBQUcsQ0FBQztZQUUzQyxXQUFXLEdBQUcsRUFBRTtZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNqQjtLQUNGO0lBRUQsT0FBTyxXQUFXO0FBQ3BCLENBQUM7QUFqQlksMkJBQW1CLHVCQWlCL0I7Ozs7Ozs7Ozs7Ozs7QUNuQkQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFTLENBQUM7QUFFOUI7Ozs7R0FJRztBQUNJLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDMUQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCO0lBRWhDLE1BQU0sT0FBTyxHQUFHLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3RDLElBQUksUUFBUSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFO0lBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLENBQUMsR0FBRyxDQUFDO0lBRXZDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxTQUFTO0lBRS9CLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUM1QixNQUFNLEtBQUssR0FBRyxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNkLFVBQVUsR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU07U0FDdkM7SUFDSCxDQUFDLENBQUM7SUFFRixlQUFlO0lBQ2YsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtBQUM5QyxDQUFDO0FBbkJZLCtCQUF1QiwyQkFtQm5DOzs7Ozs7Ozs7Ozs7QUM5Qk0sTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtJQUNwQyxNQUFNLEdBQUcsR0FBVSxFQUFFO0lBQ3JCLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLEVBQUU7Z0JBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN0RTthQUNGO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25FO1NBQ0Y7S0FDRjtJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEIsQ0FBQztBQWRZLGlCQUFTLGFBY3JCOzs7Ozs7Ozs7Ozs7QUNkTSxNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUs7SUFFbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztLQUNwQztJQUVELE9BQU8sTUFBTTtBQUNmLENBQUM7QUFYWSxtQkFBVyxlQVd2Qjs7Ozs7Ozs7Ozs7O0FDWFksaUJBQVMsR0FDcEIsb0VBQW9FO0FBQ3pELCtCQUF1QixHQUFHLG9EQUFvRCxpQkFBUyxFQUFFO0FBRXRHOzs7OztHQUtHO0FBQ0ksTUFBTSxhQUFhLEdBQUcsQ0FDM0IsSUFBbUMsRUFJbkMsRUFBRTtJQUNGLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBRW5ELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUM5QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLEVBQUUsK0JBQXVCO1NBQzdCO0tBQ0Y7SUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDeEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUUxRSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsR0FBRyxFQUFFLHlEQUF5RDthQUMvRDtTQUNGO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxvQ0FBb0MsRUFBRTtTQUNwRTtRQUVELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDbkIsT0FBTztnQkFDTCxNQUFNLEVBQUUsS0FBSztnQkFDYixHQUFHLEVBQUUsdURBQXVEO2FBQzdEO1NBQ0Y7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3RCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxLQUFLO2dCQUNiLEdBQUcsRUFBRSwrQkFBdUI7YUFDN0I7U0FDRjtRQUVELCtEQUErRDtRQUMvRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDNUIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDOUIsT0FBTzt3QkFDTCxNQUFNLEVBQUUsS0FBSzt3QkFDYixHQUFHLEVBQUUsU0FBUyxHQUFHLGdDQUFnQyxpQkFBUyxFQUFFO3FCQUM3RDtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDcEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7d0JBQ2xDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTs0QkFDakMsT0FBTztnQ0FDTCxNQUFNLEVBQUUsS0FBSztnQ0FDYixHQUFHLEVBQUUsa0JBQWtCLEdBQUcsc0RBQXNELFNBQVMsR0FBRzs2QkFDN0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0FBQ2xDLENBQUM7QUFwRVkscUJBQWEsaUJBb0V6QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFTLEVBQVUsRUFBRTtJQUNwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdkIsT0FBTyxPQUFPO0tBQ2Y7U0FBTTtRQUNMLE9BQU8sT0FBTyxJQUFJO0tBQ25CO0FBQ0gsQ0FBQzs7Ozs7Ozs7QUM1RkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7O0FDTEE7QUFDQTs7QUFFYTs7QUFFYix3QkFBd0IsbUJBQU8sQ0FBQyxLQUFjO0FBQzlDLDBCQUEwQixtQkFBTyxDQUFDLEtBQXVCO0FBQ3pELHNCQUFzQixtQkFBTyxDQUFDLEtBQW1CO0FBQ2pELG1CQUFtQixtQkFBTyxDQUFDLEtBQWdCOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCO0FBQ3pCLDJCQUEyQjtBQUMzQixvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOzs7QUFHekI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjs7QUFFcEI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7Ozs7Ozs7O0FDN1VEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWEsT0FBTyxvQkFBb0IsT0FBTztBQUMvQztBQUNBOztBQUVBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBLFFBQVEsU0FBUyxPQUFPO0FBQ3hCO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLElBQUksT0FBTztBQUNYLGlCQUFpQixPQUFPO0FBQ3hCLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlOzs7QUFHZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDLEtBQUs7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtB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QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFCQUFNLHlCQUF5QixxQkFBTTtBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBLDRCQUE0QixxQkFBcUIsSUFBSTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RixxQkFBTTtBQUM3RixDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFNBQVMsR0FBRyxTQUFTO0FBQzlDLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxVQUFVLDBCQUEwQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGtDQUFrQztBQUNsQyxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsaUNBQWlDLGFBQWEsSUFBSTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsUUFBUSx1QkFBdUI7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxXQUFXLGNBQWM7QUFDaEM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPLG9CQUFvQixPQUFPOztBQUVoRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIsbUJBQW1CO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQsT0FBTztBQUM1RCxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRDtBQUNuRDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsUUFBUTtBQUNuQixXQUFXLHFCQUFxQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsTUFBTTtBQUN2QixlQUFlLE1BQU07QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxlQUFlO0FBQzVCLGFBQWEsc0JBQXNCO0FBQ25DLFlBQVk7QUFDWjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsb0JBQW9CO0FBQy9CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZ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QUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscURBQXFEO0FBQ2pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QywwQ0FBMEM7O0FBRTFDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFF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QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLDhCQUE4Qjs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLFVBQVUscUNBQXFDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxlQUFlO0FBQzVCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBLFlBQVksMENBQTBDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1REFBdUQsa0JBQWtCOztBQUV6RTtBQUNBLDRDQUE0QyxrQkFBa0I7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDemhLOEM7O0FBRTlDLHNFQUFlLG9FQUFvQixJQUFDOztBQUVnQjs7Ozs7OztVQ0pwRDtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDekJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLDJDQUEyQywwQ0FBMEM7V0FDckYsTUFBTTtXQUNOLDJDQUEyQyxnQ0FBZ0M7V0FDM0U7V0FDQSxLQUFLLHlCQUF5QjtXQUM5QjtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsMENBQTBDLHdDQUF3QztXQUNsRjtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsQ0FBQyxJOzs7OztXQ1BELHdGOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RCxFOzs7OztXQ05BO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7VUVKQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1NBU2pzL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvYXV0aC9hdXRoLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9hdXRoL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9lcnJvci9lcnJvck1vZGlmaWVyLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9lcnJvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvZXJyb3Ivc2VydmVyVHlwZUVycm9yLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy9pbnB1dC92YWxpZGF0b3JzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2NvbmZpZ3VyYXRpb24uanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2RlY29kZWRUb2tlbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2ZpbGUuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL2ZpbGVUcmVlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9oYXNoLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9odHRwc0FnZW50T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL21hY3JvLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zYXNBdXRoUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL3Nhc0pzRmlsZVR5cGUuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvQHNhc2pzL3V0aWxzL3R5cGVzL3NlcnZlckVycm9yLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zZXJ2ZXJUeXBlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy9zZXJ2aWNlUGFjay5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9Ac2FzanMvdXRpbHMvdHlwZXMvdGFyZ2V0LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL0BzYXNqcy91dGlscy90eXBlcy90YXJnZXRWYWxpZGF0b3JzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYWN0dWFsQXBwbHkuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYXBwbHlCaW5kLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHkuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL3JlZmxlY3RBcHBseS5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9kdW5kZXItcHJvdG8vZ2V0LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdXJpLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2VzLW9iamVjdC1hdG9tcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mb3JtLWRhdGEvbGliL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dlbmVyYXRvci1mdW5jdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dvcGQvZ09QRC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaGFzb3duL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaXMtY2FsbGFibGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvaXMtZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2lzLXR5cGVkLWFycmF5L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2p3dC1kZWNvZGUvYnVpbGQvand0LWRlY29kZS5lc20uanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Ficy5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2lzTmFOLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9tYXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvcG93LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9wb3NzaWJsZS10eXBlZC1hcnJheS1uYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvc2FmZS1yZWdleC10ZXN0L2luZGV4LmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3NldC1mdW5jdGlvbi1sZW5ndGgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9BdXRoTWFuYWdlci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9hdXRoL2luZGV4LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvaXNBdXRob3JpemVGb3JtUmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9pc0xvZ2luUmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvYXV0aC9sb2dpbkhlYWRlci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9hdXRoL29wZW5XZWJQYWdlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvdmVyaWZ5U2FzOUxvZ2luLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2F1dGgvdmVyaWZ5U2FzVml5YUxvZ2luLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2pvYi1leGVjdXRpb24vRmlsZVVwbG9hZGVyLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL2pvYi1leGVjdXRpb24vSm9iRXhlY3V0b3IudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvbWluaWZpZWQvc2FzOS9TQVNqcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy9taW5pZmllZC9zYXM5L1dlYkpvYkV4ZWN1dG9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL21pbmlmaWVkL3NhczkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvcmVxdWVzdC9SZXF1ZXN0Q2xpZW50LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvQ3NyZlRva2VuLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0V4ZWN1dGVTY3JpcHQudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvRmlsZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9Gb2xkZXIudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvSm9iLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0pvYkRlZmluaXRpb24udHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvSm9iUmVzdWx0LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL0xpbmsudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvTG9naW4udHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvUG9sbE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvUmVxdWVzdENsaWVudC50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9TQVNqc0NvbmZpZy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9TZXNzaW9uLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL1RhYmxlcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9VcGxvYWRGaWxlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL1dyaXRlU3RyZWFtLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Bcmd1bWVudEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9BdXRob3JpemVFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvQ2VydGlmaWNhdGVFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvQ29tcHV0ZUpvYkV4ZWN1dGlvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9FcnJvclJlc3BvbnNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnRlcm5hbFNlcnZlckVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnZhbGlkSnNvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9JbnZhbGlkU0FTanNDc3JmRXJyb3IudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvZXJyb3JzL0pvYkV4ZWN1dGlvbkVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Kb2JTdGF0ZVBvbGxFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvSnNvblBhcnNlQXJyYXlFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvTG9naW5SZXF1aXJlZEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Ob1Nlc3Npb25TdGF0ZUVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Ob3RGb3VuZEVycm9yLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3R5cGVzL2Vycm9ycy9Sb290Rm9sZGVyTm90Rm91bmRFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvU0FTOUF1dGhFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvV2Vib3V0UmVzcG9uc2VFcnJvci50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy90eXBlcy9lcnJvcnMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvYXBwZW5kRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvYXN5bmNGb3JFYWNoLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2NvbXBhcmVUaW1lc3RhbXBzLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2NvbnZlcnRUb0Nzdi50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9jcmVhdGVBeGlvc0luc3RhbmNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2RlbGF5LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2ZldGNoTG9nQnlDaHVua3MudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvZ2V0Rm9ybURhdGEudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvZ2V0VXNlckxhbmd1YWdlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL2dldFZhbGlkSnNvbi50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9pbmRleC50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9pc05vZGUudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNSZWxhdGl2ZVBhdGgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNVcmkudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvaXNVcmwudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvbG9naW5Qcm9tcHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvbmVlZHNSZXRyeS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9wYXJzZUdlbmVyYXRlZENvZGUudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvcGFyc2VTYXNWaXlhTG9nLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3BhcnNlU291cmNlQ29kZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9wYXJzZVZpeWFEZWJ1Z1Jlc3BvbnNlLnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3BhcnNlVml5YUxvZ0RlYnVnUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9zcmMvdXRpbHMvcGFyc2VXZWJvdXRSZXNwb25zZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9zYXM5L2V4dHJhY3RVc2VyTG9uZ05hbWVTYXM5LnRzIiwid2VicGFjazovL1NBU2pzLy4vc3JjL3V0aWxzL3NlcmlhbGl6ZS50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy9zcGxpdENodW5rcy50cyIsIndlYnBhY2s6Ly9TQVNqcy8uL3NyYy91dGlscy92YWxpZGF0ZUlucHV0LnRzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L3R5cGVzLmpzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy92YWxpZC11cmwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvd2hpY2gtdHlwZWQtYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vU0FTanMvaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9hZGFwdGVyL2FkYXB0ZXIvc3JjL3JlcXVlc3R8aHR0cHMiLCJ3ZWJwYWNrOi8vU0FTanMvLi9ub2RlX21vZHVsZXMvYXZhaWxhYmxlLXR5cGVkLWFycmF5cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9TQVNqcy8uL25vZGVfbW9kdWxlcy9heGlvcy9kaXN0L2Jyb3dzZXIvYXhpb3MuY2pzIiwid2VicGFjazovL1NBU2pzLy4vbm9kZV9tb2R1bGVzL2dlbmVyYXRvci1mdW5jdGlvbi9yZXF1aXJlLm1qcyIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vU0FTanMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1NBU2pzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vU0FTanMvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL1NBU2pzL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9TQVNqcy93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU0FTanNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiU0FTanNcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb2RlVG9rZW4gPSBleHBvcnRzLmhhc1Rva2VuRXhwaXJlZCA9IGV4cG9ydHMuaXNSZWZyZXNoVG9rZW5FeHBpcmluZyA9IGV4cG9ydHMuaXNBY2Nlc3NUb2tlbkV4cGlyaW5nID0gdm9pZCAwO1xuY29uc3Qgand0X2RlY29kZV8xID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJqd3QtZGVjb2RlXCIpKTtcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBBY2Nlc3MgVG9rZW4gaXMgZXhwaXJlZCBvciBpcyBleHBpcmluZyBpbiAxIGhvdXIuICBBIGRlZmF1bHQgQWNjZXNzIFRva2VuXG4gKiBsYXN0cyAxMiBob3Vycy4gSWYgdGhlIEFjY2VzcyBUb2tlbiBleHBpcmVzLCB0aGUgUmVmcmVzaCBUb2tlbiBpcyB1c2VkIHRvIGZldGNoIGEgbmV3XG4gKiBBY2Nlc3MgVG9rZW4uIEluIHRoZSBjYXNlIHRoYXQgdGhlIFJlZnJlc2ggVG9rZW4gaXMgZXhwaXJlZCwgMSBob3VyIGlzIGVub3VnaCB0byBsZXRcbiAqIG1vc3Qgam9icyBmaW5pc2guXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW4tIHRva2VuIHN0cmluZyB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZVRvTGl2ZVNlY29uZHMgLSB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgdG9rZW4gaGFzIGJlZm9yZSBpdCBleHBpcmVzLCBkZWZhdWx0cyB0byAzNjAwXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRva2VuIGlzIGFib3V0IHRvIGV4cGlyZVxuICovXG5mdW5jdGlvbiBpc0FjY2Vzc1Rva2VuRXhwaXJpbmcodG9rZW4sIHRpbWVUb0xpdmVTZWNvbmRzID0gMzYwMCkge1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc1Rva2VuRXhwaXJpbmcodG9rZW4sIHRpbWVUb0xpdmVTZWNvbmRzKTtcbn1cbmV4cG9ydHMuaXNBY2Nlc3NUb2tlbkV4cGlyaW5nID0gaXNBY2Nlc3NUb2tlbkV4cGlyaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgdGhlIFJlZnJlc2ggVG9rZW4gaXMgZXhwaXJlZCBvciBleHBpcmluZyBpbiAzMCBzZWNzLiBBIGRlZmF1bHQgUmVmcmVzaCBUb2tlblxuICogbGFzdHMgMzAgZGF5cy4gIE9uY2UgdGhlIFJlZnJlc2ggVG9rZW4gZXhwaXJlcywgdGhlIHVzZXIgbXVzdCByZS1hdXRoZW50aWNhdGUgKHByb3ZpZGVcbiAqIGNyZWRlbnRpYWxzIGluIGEgYnJvd3NlciB0byBvYnRhaW4gYW4gYXV0aG9yaXNhdGlvbiBjb2RlKS4gMzAgc2Vjb25kcyBpcyBlbm91Z2ggdGltZVxuICogdG8gbWFrZSBhIHJlcXVlc3QgZm9yIGEgZmluYWwgQWNjZXNzIFRva2VuLlxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuLSB0b2tlbiBzdHJpbmcgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVUb0xpdmVTZWNvbmRzIC0gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHRva2VuIGhhcyBiZWZvcmUgaXQgZXhwaXJlcywgZGVmYXVsdHMgdG8gMzBcbiAqIEByZXR1cm5zIHtib29sZWFufSBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gaXMgYWJvdXQgdG8gZXhwaXJlXG4gKi9cbmZ1bmN0aW9uIGlzUmVmcmVzaFRva2VuRXhwaXJpbmcodG9rZW4sIHRpbWVUb0xpdmVTZWNvbmRzID0gMzApIHtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNUb2tlbkV4cGlyaW5nKHRva2VuLCB0aW1lVG9MaXZlU2Vjb25kcyk7XG59XG5leHBvcnRzLmlzUmVmcmVzaFRva2VuRXhwaXJpbmcgPSBpc1JlZnJlc2hUb2tlbkV4cGlyaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRva2VuIGhhcyBleHBpcmVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuLSB0b2tlbiBzdHJpbmcgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0b2tlbiBoYXMgZXhwaXJlZFxuICovXG5mdW5jdGlvbiBoYXNUb2tlbkV4cGlyZWQodG9rZW4pIHtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNUb2tlbkV4cGlyaW5nKHRva2VuLCAwKTtcbn1cbmV4cG9ydHMuaGFzVG9rZW5FeHBpcmVkID0gaGFzVG9rZW5FeHBpcmVkO1xuZnVuY3Rpb24gaXNUb2tlbkV4cGlyaW5nKHRva2VuLCB0aW1lVG9MaXZlU2Vjb25kcykge1xuICAgIGxldCBwYXlsb2FkO1xuICAgIHRyeSB7XG4gICAgICAgIHBheWxvYWQgPSAoMCwgand0X2RlY29kZV8xLmRlZmF1bHQpKHRva2VuKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBPbmx5IHRvbGVyYXRlIHVuZGVjb2RhYmxlIChvcGFxdWUgLyBub24tSldUKSB0b2tlbnMgLSBhbnl0aGluZyBlbHNlXG4gICAgICAgIC8vIGlzIGEgZ2VudWluZSBidWcgYW5kIHNob3VsZCBzdXJmYWNlLlxuICAgICAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBqd3RfZGVjb2RlXzEuSW52YWxpZFRva2VuRXJyb3IpKVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAvLyBPcGFxdWUgdG9rZW5zIGNhbm5vdCBiZSBleHBpcnktY2hlY2tlZCBjbGllbnQtc2lkZS5cbiAgICAgICAgLy8gQXNzdW1lIHRoZSB0b2tlbiBpcyB1c2FibGUgYW5kIGxldCB0aGUgc2VydmVyIHJlamVjdCBpdCBpZiBleHBpcmVkLlxuICAgICAgICBjb25zb2xlLmRlYnVnKCdpc1Rva2VuRXhwaXJpbmc6IHRva2VuIGlzIG5vdCBhIGRlY29kYWJsZSBKV1QsIHRyZWF0aW5nIGl0IGFzIG5vdCBleHBpcmluZy4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBIEpXVCB3aXRob3V0IGFuIGBleHBgIGNsYWltIGNhbm5vdCBiZSBleHBpcnktY2hlY2tlZCBlaXRoZXIuXG4gICAgLy8gTm90ZTogYD09IG51bGxgIChub3QgYCFgKSAtIGV4cCBvZiAwIGlzIGEgcmVhbCAobG9uZy1leHBpcmVkKSBjbGFpbSxcbiAgICAvLyBub3QgYSBtaXNzaW5nIG9uZS5cbiAgICBpZiAocGF5bG9hZC5leHAgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRpbWVUb0xpdmUgPSBwYXlsb2FkLmV4cCAtIG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMDtcbiAgICByZXR1cm4gdGltZVRvTGl2ZSA8PSB0aW1lVG9MaXZlU2Vjb25kcztcbn1cbmZ1bmN0aW9uIGRlY29kZVRva2VuKHRva2VuKSB7XG4gICAgbGV0IHBheWxvYWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9ICgwLCBqd3RfZGVjb2RlXzEuZGVmYXVsdCkodG9rZW4pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBzdXBwbGllZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnRzLmRlY29kZVRva2VuID0gZGVjb2RlVG9rZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdXRoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vYXV0aFwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlZml4TWVzc2FnZSA9IHZvaWQgMDtcbmNvbnN0IHByZWZpeE1lc3NhZ2UgPSAoZXJyLCBtZXNzYWdlUHJlZml4KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChlcnIuaGFzT3duUHJvcGVydHkoJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSBtZXNzYWdlUHJlZml4ICsgZXJyLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXJyLmhhc093blByb3BlcnR5KCdib2R5JykpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVyci5ib2R5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9IGVyci5ib2R5Lm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZVByZWZpeCArIGVyci5ib2R5Lm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZVByZWZpeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnIuYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShlcnIuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9IG1lc3NhZ2VQcmVmaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJvZHkubWVzc2FnZSA9IGJvZHkubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlUHJlZml4ICsgYm9keS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VQcmVmaXg7XG4gICAgICAgICAgICAgICAgICAgIGVyci5ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXJyKSwgeyBtZXNzYWdlOiBtZXNzYWdlUHJlZml4IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJylcbiAgICAgICAgZXJyID0gbWVzc2FnZVByZWZpeCArIGVycjtcbiAgICByZXR1cm4gZXJyO1xufTtcbmV4cG9ydHMucHJlZml4TWVzc2FnZSA9IHByZWZpeE1lc3NhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvck1vZGlmaWVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXJyb3JNb2RpZmllclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2VydmVyVHlwZUVycm9yXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXJ2ZXJUeXBlRXJyb3IgPSB2b2lkIDA7XG5jb25zdCB0eXBlc18xID0gcmVxdWlyZShcIi4uL3R5cGVzXCIpO1xuY2xhc3MgU2VydmVyVHlwZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHZhbGlkT3B0aW9ucyA9IFtdKSB7XG4gICAgICAgIHZhbGlkT3B0aW9ucyA9IFsuLi5uZXcgU2V0KHZhbGlkT3B0aW9ucyldO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHZhbGlkT3B0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgID8gdmFsaWRPcHRpb25zLmpvaW4oJywgJykudHJpbSgpXG4gICAgICAgICAgICA6IFt0eXBlc18xLlNlcnZlclR5cGUuU2FzVml5YSwgdHlwZXNfMS5TZXJ2ZXJUeXBlLlNhczksIHR5cGVzXzEuU2VydmVyVHlwZS5TYXNqc11cbiAgICAgICAgICAgICAgICAuam9pbignLCAnKVxuICAgICAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnJlcGxhY2UoLyxcXHMoW14sXSopJC8sICcgYW5kICQxJyk7XG4gICAgICAgIHN1cGVyKGBJbnZhbGlkIHNlcnZlciB0eXBlOiB2YWxpZCBvcHRpb24ke3ZhbGlkT3B0aW9ucy5sZW5ndGggIT09IDEgPyAncycgOiAnJ30gJHt2YWxpZE9wdGlvbnMubGVuZ3RoICE9PSAxID8gJ2FyZScgOiAnaXMnfSAke29wdGlvbnN9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdTZXJ2ZXJUeXBlRXJyb3InO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU2VydmVyVHlwZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5TZXJ2ZXJUeXBlRXJyb3IgPSBTZXJ2ZXJUeXBlRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJ2ZXJUeXBlRXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzU3BlY2lhbE1pc3NpbmcgPSBleHBvcnRzLmNob2ljZVZhbGlkYXRvciA9IGV4cG9ydHMuY29uZmlybWF0aW9uVmFsaWRhdG9yID0gZXhwb3J0cy51cmxWYWxpZGF0b3IgPSB2b2lkIDA7XG5jb25zdCB2YWxpZF91cmxfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwidmFsaWQtdXJsXCIpKTtcbmNvbnN0IHVybFZhbGlkYXRvciA9ICh2YWx1ZSwgZXJyb3JNZXNzYWdlKSA9PiAhIXZhbGlkX3VybF8xLmRlZmF1bHQuaXNIdHRwVXJpKHZhbHVlKSB8fFxuICAgICEhdmFsaWRfdXJsXzEuZGVmYXVsdC5pc0h0dHBzVXJpKHZhbHVlKSB8fFxuICAgIHZhbHVlID09PSAnJyB8fFxuICAgIGVycm9yTWVzc2FnZTtcbmV4cG9ydHMudXJsVmFsaWRhdG9yID0gdXJsVmFsaWRhdG9yO1xuY29uc3QgY29uZmlybWF0aW9uVmFsaWRhdG9yID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG5leHBvcnRzLmNvbmZpcm1hdGlvblZhbGlkYXRvciA9IGNvbmZpcm1hdGlvblZhbGlkYXRvcjtcbmNvbnN0IGNob2ljZVZhbGlkYXRvciA9ICh2YWx1ZSwgbnVtYmVyT2ZDaG9pY2VzLCBlcnJvck1lc3NhZ2UpID0+ICh2YWx1ZSA+IDAgJiYgdmFsdWUgPD0gbnVtYmVyT2ZDaG9pY2VzKSB8fCBlcnJvck1lc3NhZ2U7XG5leHBvcnRzLmNob2ljZVZhbGlkYXRvciA9IGNob2ljZVZhbGlkYXRvcjtcbi8vIFRoaXMgcmVnZXggd2lsbCBtYXRjaCBzcGVjaWFsIG1pc3Npbmdcbi8vIGBhLXpgIG9yIGBfYCBvciBgLmAgb3IgJy5bYS16XSdcbmNvbnN0IGlzU3BlY2lhbE1pc3NpbmcgPSAodmFsdWUpID0+IHtcbiAgICAvLyBUaGlzIHJlZ2V4IGNhbid0IGNvdmVyIHRoZSBjYXNlIHdpdGggYC4uYCB0d28gZG90cywgc28gaWYgd2UgcmVjZWl2ZSBpdCB0aGF0IGlzIGZhbHNlIHNwZWNpYWwgbWlzc2luZ1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmluY2x1ZGVzKCcuLicpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeKFxcXFwuKT9bYS16Xy5dezF9JCcsICdpJyk7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsdWUpO1xufTtcbmV4cG9ydHMuaXNTcGVjaWFsTWlzc2luZyA9IGlzU3BlY2lhbE1pc3Npbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZGF0b3JzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db25maWdUeXBlcyA9IHZvaWQgMDtcbnZhciBDb25maWdUeXBlcztcbihmdW5jdGlvbiAoQ29uZmlnVHlwZXMpIHtcbiAgICBDb25maWdUeXBlc1tcIkJ1aWxkXCJdID0gXCJidWlsZENvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiU2VydmljZVwiXSA9IFwic2VydmljZUNvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiSm9iXCJdID0gXCJqb2JDb25maWdcIjtcbiAgICBDb25maWdUeXBlc1tcIlRlc3RcIl0gPSBcInRlc3RDb25maWdcIjtcbiAgICBDb25maWdUeXBlc1tcIkRvY1wiXSA9IFwiZG9jQ29uZmlnXCI7XG4gICAgQ29uZmlnVHlwZXNbXCJEZXBsb3lcIl0gPSBcImRlcGxveUNvbmZpZ1wiO1xuICAgIENvbmZpZ1R5cGVzW1wiU3RyZWFtXCJdID0gXCJzdHJlYW1Db25maWdcIjtcbiAgICBDb25maWdUeXBlc1tcIkF1dGhcIl0gPSBcImF1dGhDb25maWdcIjtcbn0pKENvbmZpZ1R5cGVzID0gZXhwb3J0cy5Db25maWdUeXBlcyB8fCAoZXhwb3J0cy5Db25maWdUeXBlcyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWd1cmF0aW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb2RlZFRva2VuLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxpbmVFbmRpbmdzID0gdm9pZCAwO1xudmFyIExpbmVFbmRpbmdzO1xuKGZ1bmN0aW9uIChMaW5lRW5kaW5ncykge1xuICAgIExpbmVFbmRpbmdzW1wiQ1JMRlwiXSA9IFwiXFxyXFxuXCI7XG4gICAgTGluZUVuZGluZ3NbXCJMRlwiXSA9IFwiXFxuXCI7XG59KShMaW5lRW5kaW5ncyA9IGV4cG9ydHMuTGluZUVuZGluZ3MgfHwgKGV4cG9ydHMuTGluZUVuZGluZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWVtYmVyVHlwZSA9IHZvaWQgMDtcbnZhciBNZW1iZXJUeXBlO1xuKGZ1bmN0aW9uIChNZW1iZXJUeXBlKSB7XG4gICAgTWVtYmVyVHlwZVtcInNlcnZpY2VcIl0gPSBcInNlcnZpY2VcIjtcbiAgICBNZW1iZXJUeXBlW1wiZmlsZVwiXSA9IFwiZmlsZVwiO1xuICAgIE1lbWJlclR5cGVbXCJmb2xkZXJcIl0gPSBcImZvbGRlclwiO1xufSkoTWVtYmVyVHlwZSA9IGV4cG9ydHMuTWVtYmVyVHlwZSB8fCAoZXhwb3J0cy5NZW1iZXJUeXBlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGVUcmVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHBzQWdlbnRPcHRpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY29uZmlnXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jb25maWd1cmF0aW9uXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9kZWNvZGVkVG9rZW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2V4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9maWxlVHJlZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGFzaFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaHR0cHNBZ2VudE9wdGlvbnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL21hY3JvXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zYXNBdXRoUmVzcG9uc2VcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Nhc0pzRmlsZVR5cGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NlcnZlckVycm9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zZXJ2ZXJUeXBlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zZXJ2aWNlUGFja1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdGFyZ2V0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9maWxlXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc01hY3JvVmFycyA9IHZvaWQgMDtcbmNvbnN0IGlzTWFjcm9WYXJzID0gKGFyZykgPT4gYXJnICYmIHR5cGVvZiBhcmcubWFjcm9WYXJzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmcubWFjcm9WYXJzKTtcbmV4cG9ydHMuaXNNYWNyb1ZhcnMgPSBpc01hY3JvVmFycztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hY3JvLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2FzQXV0aFJlc3BvbnNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TQVNKc0ZpbGVUeXBlID0gdm9pZCAwO1xudmFyIFNBU0pzRmlsZVR5cGU7XG4oZnVuY3Rpb24gKFNBU0pzRmlsZVR5cGUpIHtcbiAgICBTQVNKc0ZpbGVUeXBlW1wic2VydmljZVwiXSA9IFwiU2VydmljZVwiO1xuICAgIFNBU0pzRmlsZVR5cGVbXCJqb2JcIl0gPSBcIkpvYlwiO1xuICAgIFNBU0pzRmlsZVR5cGVbXCJ0ZXN0XCJdID0gXCJUZXN0XCI7XG4gICAgU0FTSnNGaWxlVHlwZVtcImZpbGVcIl0gPSBcIkZpbGVcIjsgLy8gU2hvdWxkIGJlIHVzZWQgd2hlbiBmaWxlIGNvbnRlbnQgaXMgbm90IGNvbnNpZGVyZWQgYXMgU2VydmljZSwgSm9iIG9yIFRlc3QgYW5kIGlzIHVzZWQgYXMgcmF3IGNvbnRlbnRcbn0pKFNBU0pzRmlsZVR5cGUgPSBleHBvcnRzLlNBU0pzRmlsZVR5cGUgfHwgKGV4cG9ydHMuU0FTSnNGaWxlVHlwZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zYXNKc0ZpbGVUeXBlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VydmVyRXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlcnZlclR5cGUgPSB2b2lkIDA7XG52YXIgU2VydmVyVHlwZTtcbihmdW5jdGlvbiAoU2VydmVyVHlwZSkge1xuICAgIFNlcnZlclR5cGVbXCJTYXNWaXlhXCJdID0gXCJTQVNWSVlBXCI7XG4gICAgU2VydmVyVHlwZVtcIlNhczlcIl0gPSBcIlNBUzlcIjtcbiAgICBTZXJ2ZXJUeXBlW1wiU2FzanNcIl0gPSBcIlNBU0pTXCI7XG59KShTZXJ2ZXJUeXBlID0gZXhwb3J0cy5TZXJ2ZXJUeXBlIHx8IChleHBvcnRzLlNlcnZlclR5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VydmVyVHlwZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcnZpY2VQYWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UYXJnZXQgPSB2b2lkIDA7XG5jb25zdCBjb25maWdfMSA9IHJlcXVpcmUoXCIuL2NvbmZpZ1wiKTtcbmNvbnN0IHNlcnZlclR5cGVfMSA9IHJlcXVpcmUoXCIuL3NlcnZlclR5cGVcIik7XG5jb25zdCB0YXJnZXRWYWxpZGF0b3JzXzEgPSByZXF1aXJlKFwiLi90YXJnZXRWYWxpZGF0b3JzXCIpO1xuY2xhc3MgVGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3Rvcihqc29uLCBjb25maWcgPSB7fSkge1xuICAgICAgICB0aGlzLl9zZXJ2ZXJUeXBlID0gc2VydmVyVHlwZV8xLlNlcnZlclR5cGUuU2FzVml5YTtcbiAgICAgICAgdGhpcy5nZXRDb25maWcgPSAoa2V5LCBqc29uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jb25maWdba2V5XSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyksIGpzb25ba2V5XSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWpzb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyZ2V0OiBJbnB1dCBKU09OIGlzIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVUYXJnZXROYW1lKShqc29uLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fc2VydmVyVXJsID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVNlcnZlclVybCkoanNvbi5zZXJ2ZXJVcmwpO1xuICAgICAgICAgICAgdGhpcy5fc2VydmVyVHlwZSA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTZXJ2ZXJUeXBlKShqc29uLnNlcnZlclR5cGUpO1xuICAgICAgICAgICAgdGhpcy5faHR0cHNBZ2VudE9wdGlvbnMgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlSHR0cHNBZ2VudE9wdGlvbnMpKGpzb24uaHR0cHNBZ2VudE9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fYXBwTG9jID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZUFwcExvYykoanNvbi5hcHBMb2MpO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dE5hbWUgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlQ29udGV4dE5hbWUpKGpzb24uY29udGV4dE5hbWUsIHRoaXMuX3NlcnZlclR5cGUpO1xuICAgICAgICAgICAgdGhpcy5fc2VydmVyTmFtZSA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTZXJ2ZXJOYW1lKShqc29uLnNlcnZlck5hbWUsIHRoaXMuX3NlcnZlclR5cGUpO1xuICAgICAgICAgICAgdGhpcy5fc3luY0ZvbGRlciA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTeW5jRm9sZGVyKShqc29uLnN5bmNGb2xkZXIpO1xuICAgICAgICAgICAgdGhpcy5fcmVwb3NpdG9yeU5hbWUgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlUmVwb3NpdG9yeU5hbWUpKGpzb24ucmVwb3NpdG9yeU5hbWUsIHRoaXMuX3NlcnZlclR5cGUpO1xuICAgICAgICAgICAgaWYgKGpzb24uZG9jQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jQ29uZmlnID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZURvY0NvbmZpZykodGhpcy5nZXRDb25maWcoY29uZmlnXzEuQ29uZmlnVHlwZXMuRG9jLCBqc29uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5hdXRoQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aENvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVBdXRoQ29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5BdXRoLCBqc29uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5hdXRoQ29uZmlnU2FzOSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhDb25maWdTYXM5ID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZUF1dGhDb25maWdTYXM5KShqc29uLmF1dGhDb25maWdTYXM5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLmJ1aWxkQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRDb25maWcgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlQnVpbGRDb25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLkJ1aWxkLCBqc29uKSwgdGhpcy5fbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5kZXBsb3lDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXBsb3lDb25maWcgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlRGVwbG95Q29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5EZXBsb3ksIGpzb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlcGxveUNvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVEZXBsb3lDb25maWcpKHtcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95U2VydmljZVBhY2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlcGxveVNjcmlwdHM6IFtdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5zZXJ2aWNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZUNvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTZXJ2aWNlQ29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5TZXJ2aWNlLCBqc29uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5qb2JDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9qb2JDb25maWcgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlSm9iQ29uZmlnKSh0aGlzLmdldENvbmZpZyhjb25maWdfMS5Db25maWdUeXBlcy5Kb2IsIGpzb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLnN0cmVhbUNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0cmVhbUNvbmZpZyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTdHJlYW1Db25maWcpKHRoaXMuZ2V0Q29uZmlnKGNvbmZpZ18xLkNvbmZpZ1R5cGVzLlN0cmVhbSwganNvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24udGVzdENvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlc3RDb25maWcgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlVGVzdENvbmZpZykodGhpcy5nZXRDb25maWcoY29uZmlnXzEuQ29uZmlnVHlwZXMuVGVzdCwganNvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24ubWFjcm9Gb2xkZXJzICYmIGpzb24ubWFjcm9Gb2xkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hY3JvRm9sZGVycyA9IGpzb24ubWFjcm9Gb2xkZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24ucHJvZ3JhbUZvbGRlcnMgJiYganNvbi5wcm9ncmFtRm9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtRm9sZGVycyA9IGpzb24ucHJvZ3JhbUZvbGRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5iaW5hcnlGb2xkZXJzICYmIGpzb24uYmluYXJ5Rm9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5hcnlGb2xkZXJzID0ganNvbi5iaW5hcnlGb2xkZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGpzb24uc3luY0RpcmVjdG9yaWVzICYmIGpzb24uc3luY0RpcmVjdG9yaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNEaXJlY3RvcmllcyA9ICgwLCB0YXJnZXRWYWxpZGF0b3JzXzEudmFsaWRhdGVTeW5jRGlyZWN0b3JpZXMpKGpzb24uc3luY0RpcmVjdG9yaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqc29uLnNhc2pzQnVpbGRGb2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zYXNqc0J1aWxkRm9sZGVyID0gKDAsIHRhcmdldFZhbGlkYXRvcnNfMS52YWxpZGF0ZVNhc2pzQnVpbGRGb2xkZXIpKGpzb24uc2FzanNCdWlsZEZvbGRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbi5zYXNqc1Jlc3VsdHNGb2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zYXNqc1Jlc3VsdHNGb2xkZXIgPSAoMCwgdGFyZ2V0VmFsaWRhdG9yc18xLnZhbGlkYXRlU2FzanNSZXN1bHRzRm9sZGVyKShqc29uLnNhc2pzUmVzdWx0c0ZvbGRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyB0YXJnZXQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgZ2V0IHNlcnZlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlclVybDtcbiAgICB9XG4gICAgZ2V0IHNlcnZlclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJUeXBlO1xuICAgIH1cbiAgICBnZXQgaHR0cHNBZ2VudE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwc0FnZW50T3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IGFwcExvYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcExvYztcbiAgICB9XG4gICAgZ2V0IGRvY0NvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY0NvbmZpZztcbiAgICB9XG4gICAgZ2V0IGF1dGhDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRoQ29uZmlnO1xuICAgIH1cbiAgICBnZXQgYXV0aENvbmZpZ1NhczkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRoQ29uZmlnU2FzOTtcbiAgICB9XG4gICAgZ2V0IGJ1aWxkQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRDb25maWc7XG4gICAgfVxuICAgIGdldCBkZXBsb3lDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXBsb3lDb25maWc7XG4gICAgfVxuICAgIGdldCBzZXJ2aWNlQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VydmljZUNvbmZpZztcbiAgICB9XG4gICAgZ2V0IGpvYkNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvYkNvbmZpZztcbiAgICB9XG4gICAgZ2V0IHN0cmVhbUNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmVhbUNvbmZpZztcbiAgICB9XG4gICAgZ2V0IG1hY3JvRm9sZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hY3JvRm9sZGVycztcbiAgICB9XG4gICAgZ2V0IHByb2dyYW1Gb2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbUZvbGRlcnM7XG4gICAgfVxuICAgIGdldCBiaW5hcnlGb2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluYXJ5Rm9sZGVycztcbiAgICB9XG4gICAgZ2V0IGNvbnRleHROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dE5hbWU7XG4gICAgfVxuICAgIGdldCBzZXJ2ZXJOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VydmVyTmFtZTtcbiAgICB9XG4gICAgZ2V0IHJlcG9zaXRvcnlOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3NpdG9yeU5hbWU7XG4gICAgfVxuICAgIGdldCB0ZXN0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVzdENvbmZpZztcbiAgICB9XG4gICAgZ2V0IHN5bmNGb2xkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zeW5jRm9sZGVyO1xuICAgIH1cbiAgICBnZXQgc3luY0RpcmVjdG9yaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3luY0RpcmVjdG9yaWVzO1xuICAgIH1cbiAgICBnZXQgc2FzanNCdWlsZEZvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nhc2pzQnVpbGRGb2xkZXI7XG4gICAgfVxuICAgIGdldCBzYXNqc1Jlc3VsdHNGb2xkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zYXNqc1Jlc3VsdHNGb2xkZXI7XG4gICAgfVxuICAgIHRvSnNvbih3aXRoRGVmYXVsdHMgPSB0cnVlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgc2VydmVyVXJsOiB0aGlzLnNlcnZlclVybCxcbiAgICAgICAgICAgIHNlcnZlclR5cGU6IHRoaXMuc2VydmVyVHlwZSxcbiAgICAgICAgICAgIGh0dHBzQWdlbnRPcHRpb25zOiB0aGlzLmh0dHBzQWdlbnRPcHRpb25zLFxuICAgICAgICAgICAgYXBwTG9jOiB0aGlzLmFwcExvYyxcbiAgICAgICAgICAgIGRvY0NvbmZpZzogdGhpcy5kb2NDb25maWcsXG4gICAgICAgICAgICBkZXBsb3lDb25maWc6IHRoaXMuZGVwbG95Q29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGlmICgoX2EgPSB0aGlzLm1hY3JvRm9sZGVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aClcbiAgICAgICAgICAgIGpzb24ubWFjcm9Gb2xkZXJzID0gdGhpcy5tYWNyb0ZvbGRlcnM7XG4gICAgICAgIGlmICgoX2IgPSB0aGlzLnByb2dyYW1Gb2xkZXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKVxuICAgICAgICAgICAganNvbi5wcm9ncmFtRm9sZGVycyA9IHRoaXMucHJvZ3JhbUZvbGRlcnM7XG4gICAgICAgIGlmICgoX2MgPSB0aGlzLmJpbmFyeUZvbGRlcnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sZW5ndGgpXG4gICAgICAgICAgICBqc29uLmJpbmFyeUZvbGRlcnMgPSB0aGlzLmJpbmFyeUZvbGRlcnM7XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb25maWcpIHtcbiAgICAgICAgICAgIGpzb24uYXV0aENvbmZpZyA9IHRoaXMuYXV0aENvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdXRoQ29uZmlnU2FzOSkge1xuICAgICAgICAgICAganNvbi5hdXRoQ29uZmlnU2FzOSA9IHRoaXMuYXV0aENvbmZpZ1Nhczk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2FzanNCdWlsZEZvbGRlcikge1xuICAgICAgICAgICAganNvbi5zYXNqc0J1aWxkRm9sZGVyID0gdGhpcy5zYXNqc0J1aWxkRm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhEZWZhdWx0cykge1xuICAgICAgICAgICAganNvbi5zYXNqc0J1aWxkRm9sZGVyID0gdGFyZ2V0VmFsaWRhdG9yc18xLkRFRkFVTFRfU0FTSlNfQlVJTERfRk9MREVSO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNhc2pzUmVzdWx0c0ZvbGRlcikge1xuICAgICAgICAgICAganNvbi5zYXNqc1Jlc3VsdHNGb2xkZXIgPSB0aGlzLnNhc2pzUmVzdWx0c0ZvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIGpzb24uc2FzanNSZXN1bHRzRm9sZGVyID0gdGFyZ2V0VmFsaWRhdG9yc18xLkRFRkFVTFRfU0FTSlNfUkVTVUxUU19GT0xERVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3luY0RpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICBqc29uLnN5bmNEaXJlY3RvcmllcyA9IHRoaXMuc3luY0RpcmVjdG9yaWVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhEZWZhdWx0cykge1xuICAgICAgICAgICAganNvbi5zeW5jRGlyZWN0b3JpZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5idWlsZENvbmZpZykge1xuICAgICAgICAgICAganNvbi5idWlsZENvbmZpZyA9IHRoaXMuYnVpbGRDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKVxuICAgICAgICAgICAganNvbi5idWlsZENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpbml0UHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgdGVybVByb2dyYW06ICcnLFxuICAgICAgICAgICAgICAgIGJ1aWxkT3V0cHV0RmlsZU5hbWU6IGAke3RoaXMubmFtZX0uc2FzYCxcbiAgICAgICAgICAgICAgICBtYWNyb1ZhcnM6IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5qb2JDb25maWcpIHtcbiAgICAgICAgICAgIGpzb24uam9iQ29uZmlnID0gdGhpcy5qb2JDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKVxuICAgICAgICAgICAganNvbi5qb2JDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgam9iRm9sZGVyczogW10sXG4gICAgICAgICAgICAgICAgaW5pdFByb2dyYW06ICcnLFxuICAgICAgICAgICAgICAgIHRlcm1Qcm9ncmFtOiAnJyxcbiAgICAgICAgICAgICAgICBtYWNyb1ZhcnM6IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlQ29uZmlnKSB7XG4gICAgICAgICAgICBqc29uLnNlcnZpY2VDb25maWcgPSB0aGlzLnNlcnZpY2VDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKVxuICAgICAgICAgICAganNvbi5zZXJ2aWNlQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHNlcnZpY2VGb2xkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBpbml0UHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgdGVybVByb2dyYW06ICcnLFxuICAgICAgICAgICAgICAgIG1hY3JvVmFyczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbmZpZykge1xuICAgICAgICAgICAganNvbi5zdHJlYW1Db25maWcgPSB0aGlzLnN0cmVhbUNvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aXRoRGVmYXVsdHMpXG4gICAgICAgICAgICBqc29uLnN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBzdHJlYW1XZWJGb2xkZXI6ICcnLFxuICAgICAgICAgICAgICAgIHN0cmVhbVdlYjogZmFsc2UsXG4gICAgICAgICAgICAgICAgd2ViU291cmNlUGF0aDogJycsXG4gICAgICAgICAgICAgICAgc3RyZWFtU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGFzc2V0UGF0aHM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy50ZXN0Q29uZmlnKSB7XG4gICAgICAgICAgICBqc29uLnRlc3RDb25maWcgPSB0aGlzLnRlc3RDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2l0aERlZmF1bHRzKVxuICAgICAgICAgICAganNvbi50ZXN0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGluaXRQcm9ncmFtOiAnJyxcbiAgICAgICAgICAgICAgICB0ZXJtUHJvZ3JhbTogJycsXG4gICAgICAgICAgICAgICAgbWFjcm9WYXJzOiB7fSxcbiAgICAgICAgICAgICAgICB0ZXN0U2V0VXA6ICcnLFxuICAgICAgICAgICAgICAgIHRlc3RUZWFyRG93bjogJydcbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnNlcnZlclR5cGUgPT09IHNlcnZlclR5cGVfMS5TZXJ2ZXJUeXBlLlNhc1ZpeWEpIHtcbiAgICAgICAgICAgIGpzb24uY29udGV4dE5hbWUgPSB0aGlzLmNvbnRleHROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2VydmVyVHlwZSA9PT0gc2VydmVyVHlwZV8xLlNlcnZlclR5cGUuU2FzOSkge1xuICAgICAgICAgICAganNvbi5zZXJ2ZXJOYW1lID0gdGhpcy5zZXJ2ZXJOYW1lO1xuICAgICAgICAgICAganNvbi5yZXBvc2l0b3J5TmFtZSA9IHRoaXMucmVwb3NpdG9yeU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuZXhwb3J0cy5UYXJnZXQgPSBUYXJnZXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXJnZXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhbGlkYXRlU2FzanNSZXN1bHRzRm9sZGVyID0gZXhwb3J0cy52YWxpZGF0ZVNhc2pzQnVpbGRGb2xkZXIgPSBleHBvcnRzLnZhbGlkYXRlU3luY0RpcmVjdG9yaWVzID0gZXhwb3J0cy52YWxpZGF0ZVJlcG9zaXRvcnlOYW1lID0gZXhwb3J0cy52YWxpZGF0ZVN5bmNGb2xkZXIgPSBleHBvcnRzLnZhbGlkYXRlU2VydmVyTmFtZSA9IGV4cG9ydHMudmFsaWRhdGVDb250ZXh0TmFtZSA9IGV4cG9ydHMudmFsaWRhdGVTdHJlYW1Db25maWcgPSBleHBvcnRzLnZhbGlkYXRlRGVwbG95Q29uZmlnID0gZXhwb3J0cy52YWxpZGF0ZUpvYkNvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVUZXN0Q29uZmlnID0gZXhwb3J0cy52YWxpZGF0ZVNlcnZpY2VDb25maWcgPSBleHBvcnRzLnZhbGlkYXRlQnVpbGRDb25maWcgPSBleHBvcnRzLnZhbGlkYXRlQXV0aENvbmZpZ1NhczkgPSBleHBvcnRzLnZhbGlkYXRlQXV0aENvbmZpZyA9IGV4cG9ydHMudmFsaWRhdGVEb2NDb25maWcgPSBleHBvcnRzLnZhbGlkYXRlQXBwTG9jID0gZXhwb3J0cy52YWxpZGF0ZUh0dHBzQWdlbnRPcHRpb25zID0gZXhwb3J0cy52YWxpZGF0ZVNlcnZlclVybCA9IGV4cG9ydHMudmFsaWRhdGVUYXJnZXROYW1lID0gZXhwb3J0cy52YWxpZGF0ZVNlcnZlclR5cGUgPSBleHBvcnRzLkRFRkFVTFRfU0FTSlNfUkVTVUxUU19GT0xERVIgPSBleHBvcnRzLkRFRkFVTFRfU0FTSlNfQlVJTERfRk9MREVSID0gdm9pZCAwO1xuY29uc3QgdmFsaWRfdXJsXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInZhbGlkLXVybFwiKSk7XG5jb25zdCBfMSA9IHJlcXVpcmUoXCIuXCIpO1xuY29uc3QgREVGQVVMVF9DT05URVhUX05BTUUgPSAnU0FTIEpvYiBFeGVjdXRpb24gY29tcHV0ZSBjb250ZXh0JztcbmNvbnN0IERFRkFVTFRfU0VSVkVSX05BTUUgPSAnU0FTQXBwJztcbmNvbnN0IERFRkFVTFRfUkVQT1NJVE9SWV9OQU1FID0gJ0ZvdW5kYXRpb24nO1xuZXhwb3J0cy5ERUZBVUxUX1NBU0pTX0JVSUxEX0ZPTERFUiA9ICdzYXNqc2J1aWxkJztcbmV4cG9ydHMuREVGQVVMVF9TQVNKU19SRVNVTFRTX0ZPTERFUiA9ICdzYXNqc3Jlc3VsdHMnO1xuY29uc3QgdmFsaWRhdGVTZXJ2ZXJUeXBlID0gKHNlcnZlclR5cGUpID0+IHtcbiAgICBpZiAoIXNlcnZlclR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlcnZlciB0eXBlOiBgc2VydmVyVHlwZWAgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIShzZXJ2ZXJUeXBlID09PSBfMS5TZXJ2ZXJUeXBlLlNhczkgfHxcbiAgICAgICAgc2VydmVyVHlwZSA9PT0gXzEuU2VydmVyVHlwZS5TYXNWaXlhIHx8XG4gICAgICAgIHNlcnZlclR5cGUgPT09IF8xLlNlcnZlclR5cGUuU2FzanMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2ZXIgdHlwZTogU3VwcG9ydGVkIHZhbHVlcyBmb3IgIFxcYHNlcnZlclR5cGVcXGAgYXJlICR7XzEuU2VydmVyVHlwZS5TYXNWaXlhfSwgJHtfMS5TZXJ2ZXJUeXBlLlNhczl9IGFuZCAke18xLlNlcnZlclR5cGUuU2FzanN9LmApO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmVyVHlwZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlU2VydmVyVHlwZSA9IHZhbGlkYXRlU2VydmVyVHlwZTtcbmNvbnN0IHZhbGlkYXRlVGFyZ2V0TmFtZSA9ICh0YXJnZXROYW1lKSA9PiB7XG4gICAgaWYgKCF0YXJnZXROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXJnZXQgbmFtZTogYG5hbWVgIGNhbm5vdCBiZSBlbXB0eSwgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICh0YXJnZXROYW1lLnRyaW0oKS5pbmNsdWRlcygnICcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXJnZXQgbmFtZTogYG5hbWVgIGNhbm5vdCBpbmNsdWRlIHNwYWNlcy4nKTtcbiAgICB9XG4gICAgaWYgKCEvXlthLXpBLVowLTlcXC1dKyQvaS50ZXN0KHRhcmdldE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXJnZXQgbmFtZTogYG5hbWVgIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGRhc2hlcy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE5hbWU7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVRhcmdldE5hbWUgPSB2YWxpZGF0ZVRhcmdldE5hbWU7XG5jb25zdCB2YWxpZGF0ZVNlcnZlclVybCA9IChzZXJ2ZXJVcmwpID0+IHtcbiAgICBpZiAoc2VydmVyVXJsID09PSBudWxsIHx8IHNlcnZlclVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlcnZlclVybCA9ICcnO1xuICAgIH1cbiAgICBpZiAoc2VydmVyVXJsICE9PSAnJyAmJlxuICAgICAgICAhdmFsaWRfdXJsXzEuZGVmYXVsdC5pc0h0dHBVcmkoc2VydmVyVXJsKSAmJlxuICAgICAgICAhdmFsaWRfdXJsXzEuZGVmYXVsdC5pc0h0dHBzVXJpKHNlcnZlclVybCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlcnZlciBVUkw6IGBzZXJ2ZXJVcmxgIHNob3VsZCBlaXRoZXIgYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgVVJMIG9mIHRoZSBmb3JtIGh0dHAocyk6Ly95b3VyLXNlcnZlci5jb20oOnBvcnQpLicpO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmVyVXJsO1xufTtcbmV4cG9ydHMudmFsaWRhdGVTZXJ2ZXJVcmwgPSB2YWxpZGF0ZVNlcnZlclVybDtcbmNvbnN0IHZhbGlkYXRlSHR0cHNBZ2VudE9wdGlvbnMgPSAoaHR0cHNBZ2VudE9wdGlvbnMpID0+IHtcbiAgICBpZiAoIWh0dHBzQWdlbnRPcHRpb25zKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBodHRwc0FnZW50T3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlOiBgaHR0cHNBZ2VudE9wdGlvbnNgIHNob3VsZCBlaXRoZXIgYmUgYW4gZW1wdHkgb3IgYW4gb2JqZWN0IG9mIGBIdHRwc0FnZW50T3B0aW9uc2AnKTtcbiAgICB9XG4gICAgaWYgKGh0dHBzQWdlbnRPcHRpb25zLmFsbG93SW5zZWN1cmVSZXF1ZXN0cyA9PT0gbnVsbCB8fFxuICAgICAgICBodHRwc0FnZW50T3B0aW9ucy5hbGxvd0luc2VjdXJlUmVxdWVzdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBodHRwc0FnZW50T3B0aW9ucy5hbGxvd0luc2VjdXJlUmVxdWVzdHMgPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGh0dHBzQWdlbnRPcHRpb25zLmFsbG93SW5zZWN1cmVSZXF1ZXN0cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZTogYGh0dHBzQWdlbnRPcHRpb25zLmFsbG93SW5zZWN1cmVSZXF1ZXN0c2Agc2hvdWxkIGVpdGhlciBiZSBhbiBlbXB0eSBvciBhIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBodHRwc0FnZW50T3B0aW9ucy5jYVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGh0dHBzQWdlbnRPcHRpb25zLmNhUGF0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBodHRwc0FnZW50T3B0aW9ucy5rZXlQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICBodHRwc0FnZW50T3B0aW9ucy5rZXlQYXRoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGh0dHBzQWdlbnRPcHRpb25zLmNlcnRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICBodHRwc0FnZW50T3B0aW9ucy5jZXJ0UGF0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGh0dHBzQWdlbnRPcHRpb25zO1xufTtcbmV4cG9ydHMudmFsaWRhdGVIdHRwc0FnZW50T3B0aW9ucyA9IHZhbGlkYXRlSHR0cHNBZ2VudE9wdGlvbnM7XG5jb25zdCB2YWxpZGF0ZUFwcExvYyA9IChhcHBMb2MpID0+IHtcbiAgICBpZiAoIWFwcExvYykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXBwIGxvY2F0aW9uOiBgYXBwTG9jYCBjYW5ub3QgYmUgZW1wdHksIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIWFwcExvYy5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFwcCBsb2NhdGlvbjogYGFwcExvY2AgbXVzdCBzdGFydCB3aXRoIGEgYC9gLicpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwTG9jO1xufTtcbmV4cG9ydHMudmFsaWRhdGVBcHBMb2MgPSB2YWxpZGF0ZUFwcExvYztcbmNvbnN0IHZhbGlkYXRlRG9jQ29uZmlnID0gKGRvY0NvbmZpZykgPT4ge1xuICAgIGlmICghZG9jQ29uZmlnKSB7XG4gICAgICAgIGRvY0NvbmZpZyA9IHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY0NvbmZpZy5kaXNwbGF5TWFjcm9Db3JlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgZG9jQ29uZmlnLmRpc3BsYXlNYWNyb0NvcmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZG9jQ29uZmlnLmVuYWJsZUxpbmVhZ2UgIT09ICdib29sZWFuJykge1xuICAgICAgICBkb2NDb25maWcuZW5hYmxlTGluZWFnZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2NDb25maWcub3V0RGlyZWN0b3J5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBkb2NDb25maWcub3V0RGlyZWN0b3J5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY0NvbmZpZy5kYXRhQ29udHJvbGxlclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvY0NvbmZpZy5kYXRhQ29udHJvbGxlclVybCAhPT0gJycgJiZcbiAgICAgICAgICAgICF2YWxpZF91cmxfMS5kZWZhdWx0LmlzSHR0cFVyaShkb2NDb25maWcuZGF0YUNvbnRyb2xsZXJVcmwpICYmXG4gICAgICAgICAgICAhdmFsaWRfdXJsXzEuZGVmYXVsdC5pc0h0dHBzVXJpKGRvY0NvbmZpZy5kYXRhQ29udHJvbGxlclVybCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBEYXRhIENvbnRyb2xsZXIgVXJsOiBgZGF0YUNvbnRyb2xsZXJVcmxgIHNob3VsZCBlaXRoZXIgYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgVVJMIG9mIHRoZSBmb3JtIGh0dHAocyk6Ly95b3VyLXNlcnZlci5jb20oOnBvcnQpLicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkb2NDb25maWcuZGF0YUNvbnRyb2xsZXJVcmwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkb2NDb25maWc7XG59O1xuZXhwb3J0cy52YWxpZGF0ZURvY0NvbmZpZyA9IHZhbGlkYXRlRG9jQ29uZmlnO1xuY29uc3QgdmFsaWRhdGVBdXRoQ29uZmlnID0gKGF1dGhDb25maWcpID0+IHtcbiAgICBpZiAoIWF1dGhDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGF1dGggY29uZmlnOiBKU09OIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGhDb25maWc7XG59O1xuZXhwb3J0cy52YWxpZGF0ZUF1dGhDb25maWcgPSB2YWxpZGF0ZUF1dGhDb25maWc7XG5jb25zdCB2YWxpZGF0ZUF1dGhDb25maWdTYXM5ID0gKGF1dGhDb25maWdTYXM5KSA9PiB7XG4gICAgaWYgKCFhdXRoQ29uZmlnU2FzOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXV0aCBjb25maWcgZm9yIHNhczk6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIWF1dGhDb25maWdTYXM5LnVzZXJOYW1lIHx8ICFhdXRoQ29uZmlnU2FzOS5wYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXV0aCBjb25maWcgZm9yIHNhczk6IHVzZXJOYW1lIGFuZCBwYXNzd29yZCBjYW4gbm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIHJldHVybiBhdXRoQ29uZmlnU2FzOTtcbn07XG5leHBvcnRzLnZhbGlkYXRlQXV0aENvbmZpZ1NhczkgPSB2YWxpZGF0ZUF1dGhDb25maWdTYXM5O1xuY29uc3QgdmFsaWRhdGVCdWlsZENvbmZpZyA9IChidWlsZENvbmZpZywgZGVmYXVsdE5hbWUpID0+IHtcbiAgICBpZiAoIWJ1aWxkQ29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBjb25maWc6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIWJ1aWxkQ29uZmlnLmJ1aWxkT3V0cHV0RmlsZU5hbWUpIHtcbiAgICAgICAgYnVpbGRDb25maWcuYnVpbGRPdXRwdXRGaWxlTmFtZSA9IGAke2RlZmF1bHROYW1lfS5zYXNgO1xuICAgIH1cbiAgICBpZiAoIWJ1aWxkQ29uZmlnLmluaXRQcm9ncmFtKSB7XG4gICAgICAgIGJ1aWxkQ29uZmlnLmluaXRQcm9ncmFtID0gJyc7XG4gICAgfVxuICAgIGlmICghYnVpbGRDb25maWcudGVybVByb2dyYW0pIHtcbiAgICAgICAgYnVpbGRDb25maWcudGVybVByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFidWlsZENvbmZpZy5tYWNyb1ZhcnMpIHtcbiAgICAgICAgYnVpbGRDb25maWcubWFjcm9WYXJzID0ge307XG4gICAgfVxuICAgIHJldHVybiBidWlsZENvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlQnVpbGRDb25maWcgPSB2YWxpZGF0ZUJ1aWxkQ29uZmlnO1xuY29uc3QgdmFsaWRhdGVTZXJ2aWNlQ29uZmlnID0gKHNlcnZpY2VDb25maWcpID0+IHtcbiAgICBpZiAoIXNlcnZpY2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlcnZpY2UgY29uZmlnOiBKU09OIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgaWYgKCFzZXJ2aWNlQ29uZmlnLmluaXRQcm9ncmFtKSB7XG4gICAgICAgIHNlcnZpY2VDb25maWcuaW5pdFByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFzZXJ2aWNlQ29uZmlnLnRlcm1Qcm9ncmFtKSB7XG4gICAgICAgIHNlcnZpY2VDb25maWcudGVybVByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFzZXJ2aWNlQ29uZmlnLnNlcnZpY2VGb2xkZXJzKSB7XG4gICAgICAgIHNlcnZpY2VDb25maWcuc2VydmljZUZvbGRlcnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzZXJ2aWNlQ29uZmlnLm1hY3JvVmFycykge1xuICAgICAgICBzZXJ2aWNlQ29uZmlnLm1hY3JvVmFycyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZUNvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlU2VydmljZUNvbmZpZyA9IHZhbGlkYXRlU2VydmljZUNvbmZpZztcbmNvbnN0IHZhbGlkYXRlVGVzdENvbmZpZyA9ICh0ZXN0Q29uZmlnKSA9PiB7XG4gICAgaWYgKCF0ZXN0Q29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0ZXN0IGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmICghdGVzdENvbmZpZy5pbml0UHJvZ3JhbSlcbiAgICAgICAgdGVzdENvbmZpZy5pbml0UHJvZ3JhbSA9ICcnO1xuICAgIGlmICghdGVzdENvbmZpZy50ZXJtUHJvZ3JhbSlcbiAgICAgICAgdGVzdENvbmZpZy50ZXJtUHJvZ3JhbSA9ICcnO1xuICAgIGlmICghdGVzdENvbmZpZy5tYWNyb1ZhcnMpXG4gICAgICAgIHRlc3RDb25maWcubWFjcm9WYXJzID0ge307XG4gICAgaWYgKCF0ZXN0Q29uZmlnLnRlc3RTZXRVcClcbiAgICAgICAgdGVzdENvbmZpZy50ZXN0U2V0VXAgPSAnJztcbiAgICBpZiAoIXRlc3RDb25maWcudGVzdFRlYXJEb3duKVxuICAgICAgICB0ZXN0Q29uZmlnLnRlc3RUZWFyRG93biA9ICcnO1xuICAgIHJldHVybiB0ZXN0Q29uZmlnO1xufTtcbmV4cG9ydHMudmFsaWRhdGVUZXN0Q29uZmlnID0gdmFsaWRhdGVUZXN0Q29uZmlnO1xuY29uc3QgdmFsaWRhdGVKb2JDb25maWcgPSAoam9iQ29uZmlnKSA9PiB7XG4gICAgaWYgKCFqb2JDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGpvYiBjb25maWc6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBpZiAoIWpvYkNvbmZpZy5pbml0UHJvZ3JhbSkge1xuICAgICAgICBqb2JDb25maWcuaW5pdFByb2dyYW0gPSAnJztcbiAgICB9XG4gICAgaWYgKCFqb2JDb25maWcudGVybVByb2dyYW0pIHtcbiAgICAgICAgam9iQ29uZmlnLnRlcm1Qcm9ncmFtID0gJyc7XG4gICAgfVxuICAgIGlmICgham9iQ29uZmlnLmpvYkZvbGRlcnMpIHtcbiAgICAgICAgam9iQ29uZmlnLmpvYkZvbGRlcnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFqb2JDb25maWcubWFjcm9WYXJzKSB7XG4gICAgICAgIGpvYkNvbmZpZy5tYWNyb1ZhcnMgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIGpvYkNvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlSm9iQ29uZmlnID0gdmFsaWRhdGVKb2JDb25maWc7XG5jb25zdCB2YWxpZGF0ZURlcGxveUNvbmZpZyA9IChkZXBsb3lDb25maWcpID0+IHtcbiAgICBpZiAoIWRlcGxveUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVwbG95IGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGRlcGxveUNvbmZpZy5kZXBsb3lTZXJ2aWNlUGFjayA9ICEhZGVwbG95Q29uZmlnLmRlcGxveVNlcnZpY2VQYWNrO1xuICAgIGlmICghZGVwbG95Q29uZmlnLmRlcGxveVNjcmlwdHMpIHtcbiAgICAgICAgZGVwbG95Q29uZmlnLmRlcGxveVNjcmlwdHMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGRlcGxveUNvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlRGVwbG95Q29uZmlnID0gdmFsaWRhdGVEZXBsb3lDb25maWc7XG5jb25zdCB2YWxpZGF0ZVN0cmVhbUNvbmZpZyA9IChzdHJlYW1Db25maWcpID0+IHtcbiAgICBpZiAoIXN0cmVhbUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyZWFtIGNvbmZpZzogSlNPTiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICAgIGlmIChzdHJlYW1Db25maWcuc3RyZWFtV2ViICE9PSB0cnVlICYmIHN0cmVhbUNvbmZpZy5zdHJlYW1XZWIgIT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJlYW0gY29uZmlnOiBgc3RyZWFtV2ViYCBjYW5ub3QgYmUgYSBub24tYm9vbGVhbiB2YWx1ZS4nKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbUNvbmZpZy5zdHJlYW1XZWIgJiYgIXN0cmVhbUNvbmZpZy5zdHJlYW1XZWJGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmVhbSBjb25maWc6IGBzdHJlYW1XZWJGb2xkZXJgIGNhbm5vdCBiZSBlbXB0eSwgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBgc3RyZWFtV2ViYCBpcyB0cnVlLicpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtQ29uZmlnLnN0cmVhbVdlYiAmJiAhc3RyZWFtQ29uZmlnLndlYlNvdXJjZVBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmVhbSBjb25maWc6IGB3ZWJTb3VyY2VQYXRoYCBzaG91bGQgY29udGFpbiB0aGUgcGF0aCB0byB5b3VyIGZyb250ZW5kIGFwcGxpY2F0aW9uIGVnIGJ1aWxkLCBkaXN0LCBvciBzcmMuJyk7XG4gICAgfVxuICAgIGlmIChzdHJlYW1Db25maWcuc3RyZWFtTG9nbyAmJiB0eXBlb2Ygc3RyZWFtQ29uZmlnLnN0cmVhbUxvZ28gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbUNvbmZpZy5zdHJlYW1Mb2dvID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXN0cmVhbUNvbmZpZy5hc3NldFBhdGhzKSB7XG4gICAgICAgIHN0cmVhbUNvbmZpZy5hc3NldFBhdGhzID0gW107XG4gICAgfVxuICAgIGlmICghc3RyZWFtQ29uZmlnLnN0cmVhbVNlcnZpY2VOYW1lKSB7XG4gICAgICAgIHN0cmVhbUNvbmZpZy5zdHJlYW1TZXJ2aWNlTmFtZSA9ICdjbGlja21lJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbUNvbmZpZztcbn07XG5leHBvcnRzLnZhbGlkYXRlU3RyZWFtQ29uZmlnID0gdmFsaWRhdGVTdHJlYW1Db25maWc7XG5jb25zdCB2YWxpZGF0ZUNvbnRleHROYW1lID0gKGNvbnRleHROYW1lLCBzZXJ2ZXJUeXBlKSA9PiB7XG4gICAgaWYgKHNlcnZlclR5cGUgPT09IF8xLlNlcnZlclR5cGUuU2FzVml5YSAmJiAhY29udGV4dE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09OVEVYVF9OQU1FO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dE5hbWU7XG59O1xuZXhwb3J0cy52YWxpZGF0ZUNvbnRleHROYW1lID0gdmFsaWRhdGVDb250ZXh0TmFtZTtcbmNvbnN0IHZhbGlkYXRlU2VydmVyTmFtZSA9IChzZXJ2ZXJOYW1lLCBzZXJ2ZXJUeXBlKSA9PiB7XG4gICAgaWYgKHNlcnZlclR5cGUgPT09IF8xLlNlcnZlclR5cGUuU2FzOSAmJiAhc2VydmVyTmFtZSkge1xuICAgICAgICByZXR1cm4gREVGQVVMVF9TRVJWRVJfTkFNRTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcnZlck5hbWU7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVNlcnZlck5hbWUgPSB2YWxpZGF0ZVNlcnZlck5hbWU7XG5jb25zdCB2YWxpZGF0ZVN5bmNGb2xkZXIgPSAoc3luY0ZvbGRlcikgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3luY0ZvbGRlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXN5bmNGb2xkZXIpXG4gICAgICAgIHJldHVybjtcbiAgICByZXR1cm4gc3luY0ZvbGRlcjtcbn07XG5leHBvcnRzLnZhbGlkYXRlU3luY0ZvbGRlciA9IHZhbGlkYXRlU3luY0ZvbGRlcjtcbmNvbnN0IHZhbGlkYXRlUmVwb3NpdG9yeU5hbWUgPSAocmVwb3NpdG9yeU5hbWUsIHNlcnZlclR5cGUpID0+IHtcbiAgICBpZiAoc2VydmVyVHlwZSA9PT0gXzEuU2VydmVyVHlwZS5TYXM5ICYmICFyZXBvc2l0b3J5TmFtZSkge1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SRVBPU0lUT1JZX05BTUU7XG4gICAgfVxuICAgIHJldHVybiByZXBvc2l0b3J5TmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlUmVwb3NpdG9yeU5hbWUgPSB2YWxpZGF0ZVJlcG9zaXRvcnlOYW1lO1xuY29uc3QgdmFsaWRhdGVTeW5jRGlyZWN0b3JpZXMgPSAoc3luY0RpcmVjdG9yaWVzKSA9PiB7XG4gICAgaWYgKCFzeW5jRGlyZWN0b3JpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN5bmNEaXJlY3RvcmllcyBjb25maWc6IEpTT04gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgICBzeW5jRGlyZWN0b3JpZXMuZm9yRWFjaCgob2JqKSA9PiB7XG4gICAgICAgIGlmICghb2JqLmxvY2FsIHx8ICFvYmoucmVtb3RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmNEaXJlY3RvcnkgY29uZmlnOiB2YWx1ZXMgb2YgcHJvcGVydHkgJ2xvY2FsJyBhbmQgJ3JlbW90ZSBjYW4gbm90IGJlIGVtcHR5IG9yIHVuZGVmaW5lZGApO1xuICAgIH0pO1xuICAgIHJldHVybiBzeW5jRGlyZWN0b3JpZXM7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVN5bmNEaXJlY3RvcmllcyA9IHZhbGlkYXRlU3luY0RpcmVjdG9yaWVzO1xuY29uc3QgdmFsaWRhdGVTYXNqc0J1aWxkRm9sZGVyID0gKGZvbGRlck5hbWUpID0+IHtcbiAgICBpZiAodHlwZW9mIGZvbGRlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlIG9mIHZhbHVlICgke3R5cGVvZiBmb2xkZXJOYW1lfSkgaXMgcHJvdmlkZWQgZm9yIHByb3BlcnR5ICdzYXNqc0J1aWxkRm9sZGVyJyBpbiBjb25maWcuIFJlcXVpcmVkIGlzIHN0cmluZy5gKTtcbiAgICB9XG4gICAgaWYgKCFmb2xkZXJOYW1lKVxuICAgICAgICByZXR1cm4gZXhwb3J0cy5ERUZBVUxUX1NBU0pTX0JVSUxEX0ZPTERFUjtcbiAgICByZXR1cm4gZm9sZGVyTmFtZTtcbn07XG5leHBvcnRzLnZhbGlkYXRlU2FzanNCdWlsZEZvbGRlciA9IHZhbGlkYXRlU2FzanNCdWlsZEZvbGRlcjtcbmNvbnN0IHZhbGlkYXRlU2FzanNSZXN1bHRzRm9sZGVyID0gKGZvbGRlck5hbWUpID0+IHtcbiAgICBpZiAodHlwZW9mIGZvbGRlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlIG9mIHZhbHVlICgke3R5cGVvZiBmb2xkZXJOYW1lfSkgaXMgcHJvdmlkZWQgZm9yIHByb3BlcnR5ICdzYXNqc1Jlc3VsdHNGb2xkZXInIGluIGNvbmZpZy4gUmVxdWlyZWQgaXMgc3RyaW5nLmApO1xuICAgIH1cbiAgICBpZiAoIWZvbGRlck5hbWUpXG4gICAgICAgIHJldHVybiBleHBvcnRzLkRFRkFVTFRfU0FTSlNfUkVTVUxUU19GT0xERVI7XG4gICAgcmV0dXJuIGZvbGRlck5hbWU7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVNhc2pzUmVzdWx0c0ZvbGRlciA9IHZhbGlkYXRlU2FzanNSZXN1bHRzRm9sZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFyZ2V0VmFsaWRhdG9ycy5qcy5tYXAiLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBjdXN0b21JbnNwZWN0U3ltYm9sID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFsnZm9yJ10gPT09ICdmdW5jdGlvbicpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgPyBTeW1ib2xbJ2ZvciddKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgOiBudWxsXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxudmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmZcbmV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBjb25zb2xlLmVycm9yKFxuICAgICdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArXG4gICAgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJ1xuICApXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIHZhciBwcm90byA9IHsgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5Vmlldyh2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgICApXG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKGlzSW5zdGFuY2UodmFsdWUsIFNoYXJlZEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICApXG4gIH1cblxuICB2YXIgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgdmFyIGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aFxuICAgIClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLCBVaW50OEFycmF5KVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlWaWV3IChhcnJheVZpZXcpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYXJyYXlWaWV3LCBVaW50OEFycmF5KSkge1xuICAgIHZhciBjb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWaWV3KVxuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIoY29weS5idWZmZXIsIGNvcHkuYnl0ZU9mZnNldCwgY29weS5ieXRlTGVuZ3RoKVxuICB9XG4gIHJldHVybiBmcm9tQXJyYXlMaWtlKGFycmF5Vmlldylcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIHZhciBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAocG9zICsgYnVmLmxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgQnVmZmVyLmZyb20oYnVmKS5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBwb3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICB9XG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJjaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmdcblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5pZiAoY3VzdG9tSW5zcGVjdFN5bWJvbCkge1xuICBCdWZmZXIucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRilcbiAgICAgID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERilcbiAgICAgICAgICA/IDNcbiAgICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKVxuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICAvLyBJZiBieXRlcy5sZW5ndGggaXMgb2RkLCB0aGUgbGFzdCA4IGJpdHMgbXVzdCBiZSBpZ25vcmVkIChzYW1lIGFzIG5vZGUuanMpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyAoYnl0ZXNbaSArIDFdICogMjU2KSlcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoKGVuY29kaW5nID09PSAndXRmOCcgJiYgY29kZSA8IDEyOCkgfHxcbiAgICAgICAgICBlbmNvZGluZyA9PT0gJ2xhdGluMScpIHtcbiAgICAgICAgLy8gRmFzdCBwYXRoOiBJZiBgdmFsYCBmaXRzIGludG8gYSBzaW5nbGUgYnl0ZSwgdXNlIHRoYXQgbnVtZXJpYyB2YWx1ZS5cbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgIHZhbCA9IE51bWJlcih2YWwpXG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVyIG9yIFVpbnQ4QXJyYXkgb2JqZWN0cyBmcm9tIG90aGVyIGNvbnRleHRzIChpLmUuIGlmcmFtZXMpIGRvIG5vdCBwYXNzXG4vLyB0aGUgYGluc3RhbmNlb2ZgIGNoZWNrIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mIHRoYXQgdHlwZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuZnVuY3Rpb24gaXNJbnN0YW5jZSAob2JqLCB0eXBlKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlIHx8XG4gICAgKG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9IG51bGwgJiZcbiAgICAgIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWUpXG59XG5mdW5jdGlvbiBudW1iZXJJc05hTiAob2JqKSB7XG4gIC8vIEZvciBJRTExIHN1cHBvcnRcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cbi8vIENyZWF0ZSBsb29rdXAgdGFibGUgZm9yIGB0b1N0cmluZygnaGV4JylgXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8yMTlcbnZhciBoZXhTbGljZUxvb2t1cFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnXG4gIHZhciB0YWJsZSA9IG5ldyBBcnJheSgyNTYpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIHZhciBpMTYgPSBpICogMTZcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaV0gKyBhbHBoYWJldFtqXVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFibGVcbn0pKClcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IHJlcXVpcmUoJy4vcmVmbGVjdEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FjdHVhbEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRyZWZsZWN0QXBwbHkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciAkYXBwbHkgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQXBwbHknKTtcbnZhciBhY3R1YWxBcHBseSA9IHJlcXVpcmUoJy4vYWN0dWFsQXBwbHknKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vYXBwbHlCaW5kJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcblx0cmV0dXJuIGFjdHVhbEFwcGx5KGJpbmQsICRhcHBseSwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Z1bmN0aW9uQXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mdW5jdGlvbkNhbGwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgJGNhbGwgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQ2FsbCcpO1xudmFyICRhY3R1YWxBcHBseSA9IHJlcXVpcmUoJy4vYWN0dWFsQXBwbHknKTtcblxuLyoqIEB0eXBlIHsoYXJnczogW0Z1bmN0aW9uLCB0aGlzQXJnPzogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdXSkgPT4gRnVuY3Rpb259IFRPRE8gRklYTUUsIGZpbmQgYSB3YXkgdG8gdXNlIGltcG9ydCgnLicpICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kQmFzaWMoYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggPCAxIHx8IHR5cGVvZiBhcmdzWzBdICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2EgZnVuY3Rpb24gaXMgcmVxdWlyZWQnKTtcblx0fVxuXHRyZXR1cm4gJGFjdHVhbEFwcGx5KGJpbmQsICRjYWxsLCBhcmdzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZmxlY3RBcHBseScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdCAmJiBSZWZsZWN0LmFwcGx5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2V0RnVuY3Rpb25MZW5ndGggPSByZXF1aXJlKCdzZXQtZnVuY3Rpb24tbGVuZ3RoJyk7XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdlcy1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIGNhbGxCaW5kQmFzaWMgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xudmFyIGFwcGx5QmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2FwcGx5QmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0dmFyIGZ1bmMgPSBjYWxsQmluZEJhc2ljKGFyZ3VtZW50cyk7XG5cdHZhciBhZGp1c3RlZExlbmd0aCA9IDEgKyBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG5cdHJldHVybiBzZXRGdW5jdGlvbkxlbmd0aChcblx0XHRmdW5jLFxuXHRcdGFkanVzdGVkTGVuZ3RoID4gMCA/IGFkanVzdGVkTGVuZ3RoIDogMCxcblx0XHR0cnVlXG5cdCk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciBjYWxsQmluZEJhc2ljID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMnKTtcblxuLyoqIEB0eXBlIHsodGhpc0FyZzogc3RyaW5nLCBzZWFyY2hTdHJpbmc6IHN0cmluZywgcG9zaXRpb24/OiBudW1iZXIpID0+IG51bWJlcn0gKi9cbnZhciAkaW5kZXhPZiA9IGNhbGxCaW5kQmFzaWMoW0dldEludHJpbnNpYygnJVN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiUnKV0pO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdC8qIGVzbGludCBuby1leHRyYS1wYXJlbnM6IDAgKi9cblxuXHR2YXIgaW50cmluc2ljID0gLyoqIEB0eXBlIHsodGhpczogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3dufSAqLyAoR2V0SW50cmluc2ljKG5hbWUsICEhYWxsb3dNaXNzaW5nKSk7XG5cdGlmICh0eXBlb2YgaW50cmluc2ljID09PSAnZnVuY3Rpb24nICYmICRpbmRleE9mKG5hbWUsICcucHJvdG90eXBlLicpID4gLTEpIHtcblx0XHRyZXR1cm4gY2FsbEJpbmRCYXNpYygvKiogQHR5cGUge2NvbnN0fSAqLyAoW2ludHJpbnNpY10pKTtcblx0fVxuXHRyZXR1cm4gaW50cmluc2ljO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgZ29wZCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lRGF0YVByb3BlcnR5KFxuXHRvYmosXG5cdHByb3BlcnR5LFxuXHR2YWx1ZVxuKSB7XG5cdGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCcpO1xuXHR9XG5cdGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzNdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgdHlwZW9mIGFyZ3VtZW50c1s0XSAhPT0gJ2Jvb2xlYW4nICYmIGFyZ3VtZW50c1s0XSAhPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbm9uV3JpdGFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNSAmJiB0eXBlb2YgYXJndW1lbnRzWzVdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzVdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNiAmJiB0eXBlb2YgYXJndW1lbnRzWzZdICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxvb3NlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHR2YXIgbm9uRW51bWVyYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblx0dmFyIG5vbldyaXRhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiBudWxsO1xuXHR2YXIgbm9uQ29uZmlndXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiBudWxsO1xuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IGZhbHNlO1xuXG5cdC8qIEB0eXBlIHtmYWxzZSB8IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+fSAqL1xuXHR2YXIgZGVzYyA9ICEhZ29wZCAmJiBnb3BkKG9iaiwgcHJvcGVydHkpO1xuXG5cdGlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0XHQkZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiBub25Db25maWd1cmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuY29uZmlndXJhYmxlIDogIW5vbkNvbmZpZ3VyYWJsZSxcblx0XHRcdGVudW1lcmFibGU6IG5vbkVudW1lcmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuZW51bWVyYWJsZSA6ICFub25FbnVtZXJhYmxlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IG5vbldyaXRhYmxlID09PSBudWxsICYmIGRlc2MgPyBkZXNjLndyaXRhYmxlIDogIW5vbldyaXRhYmxlXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAobG9vc2UgfHwgKCFub25FbnVtZXJhYmxlICYmICFub25Xcml0YWJsZSAmJiAhbm9uQ29uZmlndXJhYmxlKSkge1xuXHRcdC8vIG11c3QgZmFsbCBiYWNrIHRvIFtbU2V0XV0sIGFuZCB3YXMgbm90IGV4cGxpY2l0bHkgYXNrZWQgdG8gbWFrZSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tY29uZmlndXJhYmxlXG5cdFx0b2JqW3Byb3BlcnR5XSA9IHZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4nKTtcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG52YXIgaGFzUHJvdG9BY2Nlc3NvcjtcbnRyeSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnMsIG5vLXByb3RvXG5cdGhhc1Byb3RvQWNjZXNzb3IgPSAvKiogQHR5cGUge3sgX19wcm90b19fPzogdHlwZW9mIEFycmF5LnByb3RvdHlwZSB9fSAqLyAoW10pLl9fcHJvdG9fXyA9PT0gQXJyYXkucHJvdG90eXBlO1xufSBjYXRjaCAoZSkge1xuXHRpZiAoIWUgfHwgdHlwZW9mIGUgIT09ICdvYmplY3QnIHx8ICEoJ2NvZGUnIGluIGUpIHx8IGUuY29kZSAhPT0gJ0VSUl9QUk9UT19BQ0NFU1MnKSB7XG5cdFx0dGhyb3cgZTtcblx0fVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG52YXIgZGVzYyA9ICEhaGFzUHJvdG9BY2Nlc3NvciAmJiBnT1BEICYmIGdPUEQoT2JqZWN0LnByb3RvdHlwZSwgLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgT2JqZWN0LnByb3RvdHlwZX0gKi8gKCdfX3Byb3RvX18nKSk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyICRnZXRQcm90b3R5cGVPZiA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dldCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBkZXNjICYmIHR5cGVvZiBkZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJ1xuXHQ/IGNhbGxCaW5kKFtkZXNjLmdldF0pXG5cdDogdHlwZW9mICRnZXRQcm90b3R5cGVPZiA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdD8gLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ2V0Jyl9ICovIGZ1bmN0aW9uIGdldER1bmRlcih2YWx1ZSkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0cmV0dXJuICRnZXRQcm90b3R5cGVPZih2YWx1ZSA9PSBudWxsID8gdmFsdWUgOiAkT2JqZWN0KHZhbHVlKSk7XG5cdFx0fVxuXHRcdDogZmFsc2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZXZhbCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFdmFsRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yYW5nZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSYW5nZUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWYnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVmZXJlbmNlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3N5bnRheCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBTeW50YXhFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBUeXBlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3VyaScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBVUklFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKiogQHR5cGUgezxUaGlzLCBBIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihhcnI6IEEsIGl0ZXJhdG9yOiAodGhpczogVGhpcyB8IHZvaWQsIHZhbHVlOiBBW251bWJlcl0sIGluZGV4OiBudW1iZXIsIGFycjogQSkgPT4gdm9pZCwgcmVjZWl2ZXI6IFRoaXMgfCB1bmRlZmluZWQpID0+IHZvaWR9ICovXG52YXIgZm9yRWFjaEFycmF5ID0gZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksIGkpKSB7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldLCBpLCBhcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIGFycmF5W2ldLCBpLCBhcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKiogQHR5cGUgezxUaGlzLCBTIGV4dGVuZHMgc3RyaW5nPihzdHJpbmc6IFMsIGl0ZXJhdG9yOiAodGhpczogVGhpcyB8IHZvaWQsIHZhbHVlOiBTW251bWJlcl0sIGluZGV4OiBudW1iZXIsIHN0cmluZzogUykgPT4gdm9pZCwgcmVjZWl2ZXI6IFRoaXMgfCB1bmRlZmluZWQpID0+IHZvaWR9ICovXG52YXIgZm9yRWFjaFN0cmluZyA9IGZ1bmN0aW9uIGZvckVhY2hTdHJpbmcoc3RyaW5nLCBpdGVyYXRvciwgcmVjZWl2ZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaXRlcmF0b3Ioc3RyaW5nLmNoYXJBdChpKSwgaSwgc3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKiogQHR5cGUgezxUaGlzLCBPPihvYmo6IE8sIGl0ZXJhdG9yOiAodGhpczogVGhpcyB8IHZvaWQsIHZhbHVlOiBPW2tleW9mIE9dLCBpbmRleDoga2V5b2YgTywgb2JqOiBPKSA9PiB2b2lkLCByZWNlaXZlcjogVGhpcyB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gKi9cbnZhciBmb3JFYWNoT2JqZWN0ID0gZnVuY3Rpb24gZm9yRWFjaE9iamVjdChvYmplY3QsIGl0ZXJhdG9yLCByZWNlaXZlcikge1xuICAgIGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaykpIHtcbiAgICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3Iob2JqZWN0W2tdLCBrLCBvYmplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBvYmplY3Rba10sIGssIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKiogQHR5cGUgeyh4OiB1bmtub3duKSA9PiB4IGlzIHJlYWRvbmx5IHVua25vd25bXX0gKi9cbmZ1bmN0aW9uIGlzQXJyYXkoeCkge1xuICAgIHJldHVybiB0b1N0ci5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpLl9pbnRlcm5hbH0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZm9yRWFjaChsaXN0LCBpdGVyYXRvciwgdGhpc0FyZykge1xuICAgIGlmICghaXNDYWxsYWJsZShpdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVyO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgcmVjZWl2ZXIgPSB0aGlzQXJnO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIGZvckVhY2hBcnJheShsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JFYWNoT2JqZWN0KGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBicm93c2VyICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYuRm9ybURhdGEgOiB3aW5kb3cuRm9ybURhdGE7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbnZhciBjb25jYXR0eSA9IGZ1bmN0aW9uIGNvbmNhdHR5KGEsIGIpIHtcbiAgICB2YXIgYXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyW2ldID0gYVtpXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGFycltqICsgYS5sZW5ndGhdID0gYltqXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIHNsaWN5ID0gZnVuY3Rpb24gc2xpY3koYXJyTGlrZSwgb2Zmc2V0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQgfHwgMCwgaiA9IDA7IGkgPCBhcnJMaWtlLmxlbmd0aDsgaSArPSAxLCBqICs9IDEpIHtcbiAgICAgICAgYXJyW2pdID0gYXJyTGlrZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBqb2lueSA9IGZ1bmN0aW9uIChhcnIsIGpvaW5lcikge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gYXJyW2ldO1xuICAgICAgICBpZiAoaSArIDEgPCBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdHIgKz0gam9pbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmFwcGx5KHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY3koYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICApO1xuXG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IG1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzW2ldID0gJyQnICsgaTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgam9pbnkoYm91bmRBcmdzLCAnLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVucywgbm8tZW1wdHktZnVuY3Rpb25cbmNvbnN0IGNhY2hlZCA9IC8qKiBAdHlwZSB7R2VuZXJhdG9yRnVuY3Rpb25Db25zdHJ1Y3Rvcn0gKi8gKGZ1bmN0aW9uKiAoKSB7fS5jb25zdHJ1Y3Rvcik7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICgpID0+IGNhY2hlZDtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5kZWZpbmVkO1xuXG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJ2VzLW9iamVjdC1hdG9tcycpO1xuXG52YXIgJEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzJyk7XG52YXIgJEV2YWxFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9ldmFsJyk7XG52YXIgJFJhbmdlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvcmFuZ2UnKTtcbnZhciAkUmVmZXJlbmNlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvcmVmJyk7XG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRVUklFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy91cmknKTtcblxudmFyIGFicyA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9hYnMnKTtcbnZhciBmbG9vciA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9mbG9vcicpO1xudmFyIG1heCA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9tYXgnKTtcbnZhciBtaW4gPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvbWluJyk7XG52YXIgcG93ID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3BvdycpO1xudmFyIHJvdW5kID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3JvdW5kJyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9zaWduJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgZ2V0RXZhbGxlZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGV4cHJlc3Npb25TeW50YXgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gJEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjsgcmV0dXJuICgnICsgZXhwcmVzc2lvblN5bnRheCArICcpLmNvbnN0cnVjdG9yOycpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG59O1xuXG52YXIgJGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRFxuXHQ/IChmdW5jdGlvbiAoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0XHRhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHR9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcblx0XHRcdFx0cmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcblx0XHRcdH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcblx0XHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSgpKVxuXHQ6IHRocm93VHlwZUVycm9yO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIGdldFByb3RvID0gcmVxdWlyZSgnZ2V0LXByb3RvJyk7XG52YXIgJE9iamVjdEdQTyA9IHJlcXVpcmUoJ2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKTtcbnZhciAkUmVmbGVjdEdQTyA9IHJlcXVpcmUoJ2dldC1wcm90by9SZWZsZWN0LmdldFByb3RvdHlwZU9mJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkFwcGx5Jyk7XG52YXIgJGNhbGwgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwnKTtcblxudmFyIG5lZWRzRXZhbCA9IHt9O1xuXG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogJEVycm9yLFxuXHQnJWV2YWwlJzogZXZhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG5cdCclRXZhbEVycm9yJSc6ICRFdmFsRXJyb3IsXG5cdCclRmxvYXQxNkFycmF5JSc6IHR5cGVvZiBGbG9hdDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQxNkFycmF5LFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6ICRPYmplY3QsXG5cdCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnOiAkZ09QRCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0LFxuXG5cdCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJzogJGNhbGwsXG5cdCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JSc6ICRhcHBseSxcblx0JyVPYmplY3QuZGVmaW5lUHJvcGVydHklJzogJGRlZmluZVByb3BlcnR5LFxuXHQnJU9iamVjdC5nZXRQcm90b3R5cGVPZiUnOiAkT2JqZWN0R1BPLFxuXHQnJU1hdGguYWJzJSc6IGFicyxcblx0JyVNYXRoLmZsb29yJSc6IGZsb29yLFxuXHQnJU1hdGgubWF4JSc6IG1heCxcblx0JyVNYXRoLm1pbiUnOiBtaW4sXG5cdCclTWF0aC5wb3clJzogcG93LFxuXHQnJU1hdGgucm91bmQlJzogcm91bmQsXG5cdCclTWF0aC5zaWduJSc6IHNpZ24sXG5cdCclUmVmbGVjdC5nZXRQcm90b3R5cGVPZiUnOiAkUmVmbGVjdEdQT1xufTtcblxuaWYgKGdldFByb3RvKSB7XG5cdHRyeSB7XG5cdFx0bnVsbC5lcnJvcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNoYWRvd3JlYWxtL3B1bGwvMzg0I2lzc3VlY29tbWVudC0xMzY0MjY0MjI5XG5cdFx0dmFyIGVycm9yUHJvdG8gPSBnZXRQcm90byhnZXRQcm90byhlKSk7XG5cdFx0SU5UUklOU0lDU1snJUVycm9yLnByb3RvdHlwZSUnXSA9IGVycm9yUHJvdG87XG5cdH1cbn1cblxudmFyIGRvRXZhbCA9IGZ1bmN0aW9uIGRvRXZhbChuYW1lKSB7XG5cdHZhciB2YWx1ZTtcblx0aWYgKG5hbWUgPT09ICclQXN5bmNGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2Z1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3IlJykge1xuXHRcdHZhciBmbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJyk7XG5cdFx0aWYgKGZuKSB7XG5cdFx0XHR2YWx1ZSA9IGZuLnByb3RvdHlwZTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJScpIHtcblx0XHR2YXIgZ2VuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3IlJyk7XG5cdFx0aWYgKGdlbiAmJiBnZXRQcm90bykge1xuXHRcdFx0dmFsdWUgPSBnZXRQcm90byhnZW4ucHJvdG90eXBlKTtcblx0XHR9XG5cdH1cblxuXHRJTlRSSU5TSUNTW25hbWVdID0gdmFsdWU7XG5cblx0cmV0dXJuIHZhbHVlO1xufTtcblxudmFyIExFR0FDWV9BTElBU0VTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzb3duJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbCgkY2FsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgJHNwbGljZUFwcGx5ID0gYmluZC5jYWxsKCRhcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoJGNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKCRjYWxsLCBTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciAkZXhlYyA9IGJpbmQuY2FsbCgkY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnZXMtb2JqZWN0LWF0b21zJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL09iamVjdC5nZXRQcm90b3R5cGVPZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAkT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKSB8fCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmbGVjdEdldFByb3RvID0gcmVxdWlyZSgnLi9SZWZsZWN0LmdldFByb3RvdHlwZU9mJyk7XG52YXIgb3JpZ2luYWxHZXRQcm90byA9IHJlcXVpcmUoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyk7XG5cbnZhciBnZXREdW5kZXJQcm90byA9IHJlcXVpcmUoJ2R1bmRlci1wcm90by9nZXQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVmbGVjdEdldFByb3RvXG5cdD8gZnVuY3Rpb24gZ2V0UHJvdG8oTykge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdHJldHVybiByZWZsZWN0R2V0UHJvdG8oTyk7XG5cdH1cblx0OiBvcmlnaW5hbEdldFByb3RvXG5cdFx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0XHRpZiAoIU8gfHwgKHR5cGVvZiBPICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgTyAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0UHJvdG86IG5vdCBhbiBvYmplY3QnKTtcblx0XHRcdH1cblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdFx0cmV0dXJuIG9yaWdpbmFsR2V0UHJvdG8oTyk7XG5cdFx0fVxuXHRcdDogZ2V0RHVuZGVyUHJvdG9cblx0XHRcdD8gZnVuY3Rpb24gZ2V0UHJvdG8oTykge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlLCBmb3Igc29tZSByZWFzb25cblx0XHRcdFx0cmV0dXJuIGdldER1bmRlclByb3RvKE8pO1xuXHRcdFx0fVxuXHRcdFx0OiBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9nT1BEJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGdPUEQgPSByZXF1aXJlKCcuL2dPUEQnKTtcblxuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoW10sICdsZW5ndGgnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGdPUERcblx0XHQkZ09QRCA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAkZ09QRDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9zaGFtcycpfSAqL1xuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHQvKiogQHR5cGUge3sgW2sgaW4gc3ltYm9sXT86IHVua25vd24gfX0gKi9cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0dmFyIGRlc2NyaXB0b3IgPSAvKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi8gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scy9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNUb1N0cmluZ1RhZ1NoYW1zKCkge1xuXHRyZXR1cm4gaGFzU3ltYm9scygpICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciAkaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoY2FsbCwgJGhhc093bik7XG4iLCIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoXG5cdFx0aGFzVG9TdHJpbmdUYWdcblx0XHQmJiB2YWx1ZVxuXHRcdCYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcblx0XHQmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiAkdG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgaXNMZWdhY3lBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoaXNTdGFuZGFyZEFyZ3VtZW50cyh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUgIT09IG51bGxcblx0XHQmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdFx0JiYgJ2xlbmd0aCcgaW4gdmFsdWVcblx0XHQmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJ1xuXHRcdCYmIHZhbHVlLmxlbmd0aCA+PSAwXG5cdFx0JiYgJHRvU3RyaW5nKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJ1xuXHRcdCYmICdjYWxsZWUnIGluIHZhbHVlXG5cdFx0JiYgJHRvU3RyaW5nKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCkpO1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yIFRPRE8gbWFrZSB0aGlzIG5vdCBlcnJvclxuaXNTdGFuZGFyZEFyZ3VtZW50cy5pc0xlZ2FjeUFyZ3VtZW50cyA9IGlzTGVnYWN5QXJndW1lbnRzOyAvLyBmb3IgdGVzdHNcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgcmVmbGVjdEFwcGx5ID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U7XG52YXIgaXNDYWxsYWJsZU1hcmtlcjtcbmlmICh0eXBlb2YgcmVmbGVjdEFwcGx5ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0dHJ5IHtcblx0XHRiYWRBcnJheUxpa2UgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdsZW5ndGgnLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpc0NhbGxhYmxlTWFya2VyID0ge307XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcblx0XHRyZWZsZWN0QXBwbHkoZnVuY3Rpb24gKCkgeyB0aHJvdyA0MjsgfSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcblx0fSBjYXRjaCAoXykge1xuXHRcdGlmIChfICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkgPSBudWxsO1xuXHRcdH1cblx0fVxufSBlbHNlIHtcblx0cmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0dmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cblx0fVxufTtcblxudmFyIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25Ub1N0cih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgZm5DbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG52YXIgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xudmFyIGRkYUNsYXNzID0gJ1tvYmplY3QgSFRNTEFsbENvbGxlY3Rpb25dJzsgLy8gSUUgMTFcbnZhciBkZGFDbGFzczIgPSAnW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10nO1xudmFyIGRkYUNsYXNzMyA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7IC8vIElFIDktMTBcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7IC8vIGJldHRlcjogdXNlIGBoYXMtdG9zdHJpbmd0YWdgXG5cbnZhciBpc0lFNjggPSAhKDAgaW4gWyxdKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zcGFyc2UtYXJyYXlzLCBjb21tYS1zcGFjaW5nXG5cbnZhciBpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG5cdC8vIEZpcmVmb3ggMyBjYW5vbmljYWxpemVzIEREQSB0byB1bmRlZmluZWQgd2hlbiBpdCdzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseVxuXHR2YXIgYWxsID0gZG9jdW1lbnQuYWxsO1xuXHRpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcblx0XHRpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpIHtcblx0XHRcdC8qIGdsb2JhbHMgZG9jdW1lbnQ6IGZhbHNlICovXG5cdFx0XHQvLyBpbiBJRSA2LTgsIHR5cGVvZiBkb2N1bWVudC5hbGwgaXMgXCJvYmplY3RcIiBhbmQgaXQncyB0cnV0aHlcblx0XHRcdGlmICgoaXNJRTY4IHx8ICF2YWx1ZSkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdHN0ciA9PT0gZGRhQ2xhc3Ncblx0XHRcdFx0XHRcdHx8IHN0ciA9PT0gZGRhQ2xhc3MyXG5cdFx0XHRcdFx0XHR8fCBzdHIgPT09IGRkYUNsYXNzMyAvLyBvcGVyYSAxMi4xNlxuXHRcdFx0XHRcdFx0fHwgc3RyID09PSBvYmplY3RDbGFzcyAvLyBJRSA2LThcblx0XHRcdFx0XHQpICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7IC8qKi8gfVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0QXBwbHlcblx0PyBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdHRyeSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0fVxuXHRcdHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG5cdH1cblx0OiBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9XG5cdFx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0dmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0aWYgKHN0ckNsYXNzICE9PSBmbkNsYXNzICYmIHN0ckNsYXNzICE9PSBnZW5DbGFzcyAmJiAhKC9eXFxbb2JqZWN0IEhUTUwvKS50ZXN0KHN0ckNsYXNzKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRyZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xuXHR9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xudmFyIHNhZmVSZWdleFRlc3QgPSByZXF1aXJlKCdzYWZlLXJlZ2V4LXRlc3QnKTtcbnZhciBpc0ZuUmVnZXggPSBzYWZlUmVnZXhUZXN0KC9eXFxzKig/OmZ1bmN0aW9uKT9cXCovKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCdnZXQtcHJvdG8nKTtcblxudmFyIHRvU3RyID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgZm5Ub1N0ciA9IGNhbGxCb3VuZCgnRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciBnZXRHZW5lcmF0b3JGdW5jdGlvbiA9IHJlcXVpcmUoJ2dlbmVyYXRvci1mdW5jdGlvbicpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dlbmVyYXRvckZ1bmN0aW9uKGZuKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKGlzRm5SZWdleChmblRvU3RyKGZuKSkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRpZiAoIWhhc1RvU3RyaW5nVGFnKSB7XG5cdFx0dmFyIHN0ciA9IHRvU3RyKGZuKTtcblx0XHRyZXR1cm4gc3RyID09PSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xuXHR9XG5cdGlmICghZ2V0UHJvdG8pIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dmFyIEdlbmVyYXRvckZ1bmN0aW9uID0gZ2V0R2VuZXJhdG9yRnVuY3Rpb24oKTtcblx0cmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uICYmIGdldFByb3RvKGZuKSA9PT0gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzb3duJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciBmbjtcblxuaWYgKGhhc1RvU3RyaW5nVGFnKSB7XG5cdC8qKiBAdHlwZSB7KHJlY2VpdmVyOiBUaGlzUGFyYW1ldGVyVHlwZTx0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5leGVjPiwgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5leGVjPikgPT4gUmV0dXJuVHlwZTx0eXBlb2YgUmVnRXhwLnByb3RvdHlwZS5leGVjPn0gKi9cblx0dmFyICRleGVjID0gY2FsbEJvdW5kKCdSZWdFeHAucHJvdG90eXBlLmV4ZWMnKTtcblx0LyoqIEB0eXBlIHtvYmplY3R9ICovXG5cdHZhciBpc1JlZ2V4TWFya2VyID0ge307XG5cblx0dmFyIHRocm93UmVnZXhNYXJrZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhyb3cgaXNSZWdleE1hcmtlcjtcblx0fTtcblx0LyoqIEB0eXBlIHt7IHRvU3RyaW5nKCk6IG5ldmVyLCB2YWx1ZU9mKCk6IG5ldmVyLCBbU3ltYm9sLnRvUHJpbWl0aXZlXT8oKTogbmV2ZXIgfX0gKi9cblx0dmFyIGJhZFN0cmluZ2lmaWVyID0ge1xuXHRcdHRvU3RyaW5nOiB0aHJvd1JlZ2V4TWFya2VyLFxuXHRcdHZhbHVlT2Y6IHRocm93UmVnZXhNYXJrZXJcblx0fTtcblxuXHRpZiAodHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRiYWRTdHJpbmdpZmllcltTeW1ib2wudG9QcmltaXRpdmVdID0gdGhyb3dSZWdleE1hcmtlcjtcblx0fVxuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgZmlndXJlIG91dCB0aGF0IHRoZSAkZXhlYyBjYWxsIGFsd2F5cyB0aHJvd3Ncblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdGZuID0gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHR2YXIgZGVzY3JpcHRvciA9IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIGdPUEQ+fSAqLyAoZ09QRCkoLyoqIEB0eXBlIHt7IGxhc3RJbmRleD86IHVua25vd24gfX0gKi8gKHZhbHVlKSwgJ2xhc3RJbmRleCcpO1xuXHRcdHZhciBoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKTtcblx0XHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHQkZXhlYyh2YWx1ZSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChiYWRTdHJpbmdpZmllcikpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZSA9PT0gaXNSZWdleE1hcmtlcjtcblx0XHR9XG5cdH07XG59IGVsc2Uge1xuXHQvKiogQHR5cGUgeyhyZWNlaXZlcjogVGhpc1BhcmFtZXRlclR5cGU8dHlwZW9mIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc+LCAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nPikgPT4gUmV0dXJuVHlwZTx0eXBlb2YgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz59ICovXG5cdHZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblx0LyoqIEBjb25zdCBAdHlwZSB7J1tvYmplY3QgUmVnRXhwXSd9ICovXG5cdHZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cblx0Zm4gPSBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0Ly8gSW4gb2xkZXIgYnJvd3NlcnMsIHR5cGVvZiByZWdleCBpbmNvcnJlY3RseSByZXR1cm5zICdmdW5jdGlvbidcblx0XHRpZiAoIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJHRvU3RyaW5nKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRyZXR1cm4gISF3aGljaFR5cGVkQXJyYXkodmFsdWUpO1xufTtcbiIsImZ1bmN0aW9uIGUoZSl7dGhpcy5tZXNzYWdlPWV9ZS5wcm90b3R5cGU9bmV3IEVycm9yLGUucHJvdG90eXBlLm5hbWU9XCJJbnZhbGlkQ2hhcmFjdGVyRXJyb3JcIjt2YXIgcj1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuYXRvYiYmd2luZG93LmF0b2IuYmluZCh3aW5kb3cpfHxmdW5jdGlvbihyKXt2YXIgdD1TdHJpbmcocikucmVwbGFjZSgvPSskLyxcIlwiKTtpZih0Lmxlbmd0aCU0PT0xKXRocm93IG5ldyBlKFwiJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7Zm9yKHZhciBuLG8sYT0wLGk9MCxjPVwiXCI7bz10LmNoYXJBdChpKyspO35vJiYobj1hJTQ/NjQqbitvOm8sYSsrJTQpP2MrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjU1Jm4+PigtMiphJjYpKTowKW89XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2Yobyk7cmV0dXJuIGN9O2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZS5yZXBsYWNlKC8tL2csXCIrXCIpLnJlcGxhY2UoL18vZyxcIi9cIik7c3dpdGNoKHQubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6dCs9XCI9PVwiO2JyZWFrO2Nhc2UgMzp0Kz1cIj1cIjticmVhaztkZWZhdWx0OnRocm93XCJJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchXCJ9dHJ5e3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHIoZSkucmVwbGFjZSgvKC4pL2csKGZ1bmN0aW9uKGUscil7dmFyIHQ9ci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiB0Lmxlbmd0aDwyJiYodD1cIjBcIit0KSxcIiVcIit0fSkpKX0odCl9Y2F0Y2goZSl7cmV0dXJuIHIodCl9fWZ1bmN0aW9uIG4oZSl7dGhpcy5tZXNzYWdlPWV9ZnVuY3Rpb24gbyhlLHIpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBlKXRocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWRcIik7dmFyIG89ITA9PT0ocj1yfHx7fSkuaGVhZGVyPzA6MTt0cnl7cmV0dXJuIEpTT04ucGFyc2UodChlLnNwbGl0KFwiLlwiKVtvXSkpfWNhdGNoKGUpe3Rocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IFwiK2UubWVzc2FnZSl9fW4ucHJvdG90eXBlPW5ldyBFcnJvcixuLnByb3RvdHlwZS5uYW1lPVwiSW52YWxpZFRva2VuRXJyb3JcIjtleHBvcnQgZGVmYXVsdCBvO2V4cG9ydHtuIGFzIEludmFsaWRUb2tlbkVycm9yfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWp3dC1kZWNvZGUuZXNtLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9hYnMnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5hYnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Zsb29yJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZmxvb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2lzTmFOJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc05hTihhKSB7XG5cdHJldHVybiBhICE9PSBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbWF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubWF4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9taW4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5taW47XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3BvdycpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnBvdztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcm91bmQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5yb3VuZDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRpc05hTiA9IHJlcXVpcmUoJy4vaXNOYU4nKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2lnbicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaWduKG51bWJlcikge1xuXHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09PSAwKSB7XG5cdFx0cmV0dXJuIG51bWJlcjtcblx0fVxuXHRyZXR1cm4gbnVtYmVyIDwgMCA/IC0xIDogKzE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBbXG5cdCdGbG9hdDE2QXJyYXknLFxuXHQnRmxvYXQzMkFycmF5Jyxcblx0J0Zsb2F0NjRBcnJheScsXG5cdCdJbnQ4QXJyYXknLFxuXHQnSW50MTZBcnJheScsXG5cdCdJbnQzMkFycmF5Jyxcblx0J1VpbnQ4QXJyYXknLFxuXHQnVWludDhDbGFtcGVkQXJyYXknLFxuXHQnVWludDE2QXJyYXknLFxuXHQnVWludDMyQXJyYXknLFxuXHQnQmlnSW50NjRBcnJheScsXG5cdCdCaWdVaW50NjRBcnJheSdcbl07XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1ib3VuZCcpO1xudmFyIGlzUmVnZXggPSByZXF1aXJlKCdpcy1yZWdleCcpO1xuXG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZWdleFRlc3RlcihyZWdleCkge1xuXHRpZiAoIWlzUmVnZXgocmVnZXgpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ByZWdleGAgbXVzdCBiZSBhIFJlZ0V4cCcpO1xuXHR9XG5cdHJldHVybiBmdW5jdGlvbiB0ZXN0KHMpIHtcblx0XHRyZXR1cm4gJGV4ZWMocmVnZXgsIHMpICE9PSBudWxsO1xuXHR9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtZGF0YS1wcm9wZXJ0eScpO1xudmFyIGhhc0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzJykoKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJGZsb29yID0gR2V0SW50cmluc2ljKCclTWF0aC5mbG9vciUnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2V0RnVuY3Rpb25MZW5ndGgoZm4sIGxlbmd0aCkge1xuXHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BmbmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fVxuXHRpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ251bWJlcicgfHwgbGVuZ3RoIDwgMCB8fCBsZW5ndGggPiAweEZGRkZGRkZGIHx8ICRmbG9vcihsZW5ndGgpICE9PSBsZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyJyk7XG5cdH1cblxuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblxuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdHZhciBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSB0cnVlO1xuXHRpZiAoJ2xlbmd0aCcgaW4gZm4gJiYgZ09QRCkge1xuXHRcdHZhciBkZXNjID0gZ09QRChmbiwgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoZGVzYyAmJiAhZGVzYy53cml0YWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgfHwgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlIHx8ICFsb29zZSkge1xuXHRcdGlmIChoYXNEZXNjcmlwdG9ycykge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoLCB0cnVlLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZuO1xufTtcbiIsImltcG9ydCB7IFNlcnZlclR5cGUgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHsgTm90Rm91bmRFcnJvciB9IGZyb20gJy4uL3R5cGVzL2Vycm9ycydcbmltcG9ydCB7IExvZ2luT3B0aW9ucywgTG9naW5SZXN1bHQsIExvZ2luUmVzdWx0SW50ZXJuYWwgfSBmcm9tICcuLi90eXBlcy9Mb2dpbidcbmltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgZXh0cmFjdFVzZXJMb25nTmFtZVNhczkgfSBmcm9tICcuLi91dGlscy9zYXM5L2V4dHJhY3RVc2VyTG9uZ05hbWVTYXM5J1xuaW1wb3J0IHsgb3BlbldlYlBhZ2UgfSBmcm9tICcuL29wZW5XZWJQYWdlJ1xuaW1wb3J0IHsgdmVyaWZ5U2FzOUxvZ2luIH0gZnJvbSAnLi92ZXJpZnlTYXM5TG9naW4nXG5pbXBvcnQgeyB2ZXJpZnlTYXNWaXlhTG9naW4gfSBmcm9tICcuL3ZlcmlmeVNhc1ZpeWFMb2dpbidcbmltcG9ydCB7IGlzTG9nSW5TdWNjZXNzSGVhZGVyUHJlc2VudCB9IGZyb20gJy4vJ1xuXG5leHBvcnQgY2xhc3MgQXV0aE1hbmFnZXIge1xuICBwdWJsaWMgdXNlck5hbWUgPSAnJ1xuICBwdWJsaWMgdXNlckxvbmdOYW1lID0gJydcbiAgcHJpdmF0ZSBsb2dpblVybDogc3RyaW5nXG4gIHByaXZhdGUgbG9nb3V0VXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWRpcmVjdGVkTG9naW5VcmwgPSBgL1NBU0xvZ29uYCAvL1NBUyA5IE04IG5vIGxvbmdlciByZWRpcmVjdHMgZnJvbSBgL1NBU0xvZ29uL2hvbWVgIHRvIHRoZSBsb2dpbiBwYWdlLiBgL1NBU0xvZ29uYCBzZWVtcyB0byBiZSBzdGFibGUgZW5vdWdoIGFjcm9zcyBTQVMgdmVyc2lvbnNcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlcnZlclVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgc2VydmVyVHlwZTogU2VydmVyVHlwZSxcbiAgICBwcml2YXRlIHJlcXVlc3RDbGllbnQ6IFJlcXVlc3RDbGllbnQsXG4gICAgcHJpdmF0ZSBsb2dpbkNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gICkge1xuICAgIHRoaXMubG9naW5VcmwgPSBgL1NBU0xvZ29uL2xvZ2luYFxuICAgIHRoaXMubG9nb3V0VXJsID1cbiAgICAgIHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXM5XG4gICAgICAgID8gJy9TQVNMb2dvbi9sb2dvdXQ/J1xuICAgICAgICA6IHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNWaXlhXG4gICAgICAgICAgPyAnL1NBU0xvZ29uL2xvZ291dC5kbz8nXG4gICAgICAgICAgOiAnL1NBU0xvZ29uL2xvZ291dCdcblxuICAgIHRoaXMucmVkaXJlY3RlZExvZ2luVXJsID0gdGhpcy5zZXJ2ZXJVcmwgKyB0aGlzLnJlZGlyZWN0ZWRMb2dpblVybFxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIFBvcCB1cCB3aW5kb3cgdG8gU0FTIExvZ2luIHNjcmVlbi5cbiAgICogQW5kIGNoZWNrcyBpZiB1c2VyIGhhcyBmaW5pc2hlZCBsb2dpbiBwcm9jZXNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZGlyZWN0ZWRMb2dJbih7XG4gICAgb25Mb2dnZWRPdXRcbiAgfTogTG9naW5PcHRpb25zKTogUHJvbWlzZTxMb2dpblJlc3VsdD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTG9nZ2VkSW46IGlzTG9nZ2VkSW5BbHJlYWR5LFxuICAgICAgdXNlck5hbWU6IGN1cnJlbnRTZXNzaW9uVXNlck5hbWUsXG4gICAgICB1c2VyTG9uZ05hbWU6IGN1cnJlbnRTZXNzaW9uVXNlckxvbmdOYW1lXG4gICAgfSA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VyTmFtZSgpXG5cbiAgICBpZiAoaXNMb2dnZWRJbkFscmVhZHkpIHtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IHByb2Nlc3MubG9nZ2VyIHx8IGNvbnNvbGVcbiAgICAgIGxvZ2dlci5sb2coJ2xvZ2luIHdhcyBub3QgYXR0ZW1wdGVkIGFzIGEgdmFsaWQgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0cycpXG5cbiAgICAgIGF3YWl0IHRoaXMubG9naW5DYWxsYmFjaygpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTG9nZ2VkSW46IHRydWUsXG4gICAgICAgIHVzZXJOYW1lOiBjdXJyZW50U2Vzc2lvblVzZXJOYW1lLFxuICAgICAgICB1c2VyTG9uZ05hbWU6IGN1cnJlbnRTZXNzaW9uVXNlckxvbmdOYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5Qb3B1cCA9IGF3YWl0IG9wZW5XZWJQYWdlKFxuICAgICAgdGhpcy5yZWRpcmVjdGVkTG9naW5VcmwsXG4gICAgICAnU0FTTG9nb24nLFxuICAgICAge1xuICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICBoZWlnaHQ6IDYwMFxuICAgICAgfSxcbiAgICAgIG9uTG9nZ2VkT3V0XG4gICAgKVxuXG4gICAgaWYgKCFsb2dpblBvcHVwKSB7XG4gICAgICByZXR1cm4geyBpc0xvZ2dlZEluOiBmYWxzZSwgdXNlck5hbWU6ICcnLCB1c2VyTG9uZ05hbWU6ICcnIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IGlzTG9nZ2VkSW4gfSA9XG4gICAgICB0aGlzLnNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzVml5YVxuICAgICAgICA/IGF3YWl0IHZlcmlmeVNhc1ZpeWFMb2dpbihsb2dpblBvcHVwKVxuICAgICAgICA6IGF3YWl0IHZlcmlmeVNhczlMb2dpbihsb2dpblBvcHVwKVxuXG4gICAgbG9naW5Qb3B1cC5jbG9zZSgpXG5cbiAgICBpZiAoaXNMb2dnZWRJbikge1xuICAgICAgaWYgKHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXM5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybUNBU1NlY3VyaXR5Q2hlY2soKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCB1c2VyTG9uZ05hbWUgfSA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VyTmFtZSgpXG5cbiAgICAgIGF3YWl0IHRoaXMubG9naW5DYWxsYmFjaygpXG5cbiAgICAgIHJldHVybiB7IGlzTG9nZ2VkSW46IHRydWUsIHVzZXJOYW1lLCB1c2VyTG9uZ05hbWUgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGlzTG9nZ2VkSW46IGZhbHNlLCB1c2VyTmFtZTogJycsIHVzZXJMb25nTmFtZTogJycgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW50byB0aGUgU0FTIHNlcnZlciB3aXRoIHRoZSBzdXBwbGllZCBjcmVkZW50aWFscy5cbiAgICogQHBhcmFtIHVzZXJuYW1lIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VybmFtZS5cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXNzd29yZC5cbiAgICogQHJldHVybnMgLSBhIGJvb2xlYW4gYGlzTG9nZ2VkaW5gIGFuZCBhIHN0cmluZyBgdXNlcm5hbWVgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9nSW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8TG9naW5SZXN1bHQ+IHtcbiAgICBjb25zdCBsb2dpblBhcmFtcyA9IHtcbiAgICAgIF9zZXJ2aWNlOiAnZGVmYXVsdCcsXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkXG4gICAgfVxuICAgIHRoaXMudXNlck5hbWUgPSAnJ1xuICAgIHRoaXMudXNlckxvbmdOYW1lID0gJydcblxuICAgIGxldCB7XG4gICAgICBpc0xvZ2dlZEluOiBpc0xvZ2dlZEluQWxyZWFkeSxcbiAgICAgIGxvZ2luRm9ybSxcbiAgICAgIHVzZXJMb25nTmFtZTogY3VycmVudFNlc3Npb25Vc2VyTG9uZ05hbWVcbiAgICB9ID0gYXdhaXQgdGhpcy5jaGVja1Nlc3Npb24oKVxuXG4gICAgaWYgKGlzTG9nZ2VkSW5BbHJlYWR5KSB7XG4gICAgICBjb25zdCBsb2dnZXIgPSBwcm9jZXNzLmxvZ2dlciB8fCBjb25zb2xlXG4gICAgICBsb2dnZXIubG9nKCdsb2dpbiB3YXMgbm90IGF0dGVtcHRlZCBhcyBhIHZhbGlkIHNlc3Npb24gYWxyZWFkeSBleGlzdHMnKVxuXG4gICAgICBhd2FpdCB0aGlzLmxvZ2luQ2FsbGJhY2soKVxuXG4gICAgICB0aGlzLnVzZXJOYW1lID0gbG9naW5QYXJhbXMudXNlcm5hbWVcbiAgICAgIHRoaXMudXNlckxvbmdOYW1lID0gY3VycmVudFNlc3Npb25Vc2VyTG9uZ05hbWVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTG9nZ2VkSW46IHRydWUsXG4gICAgICAgIHVzZXJOYW1lOiB0aGlzLnVzZXJOYW1lLFxuICAgICAgICB1c2VyTG9uZ05hbWU6IHRoaXMudXNlckxvbmdOYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxvZ2luUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRMb2dpblJlcXVlc3QobG9naW5Gb3JtLCBsb2dpblBhcmFtcylcblxuICAgIGxldCBpc0xvZ2dlZEluID0gaXNMb2dJblN1Y2Nlc3NIZWFkZXJQcmVzZW50KHRoaXMuc2VydmVyVHlwZSwgbG9naW5SZXNwb25zZSlcblxuICAgIGlmICghaXNMb2dnZWRJbikge1xuICAgICAgaWYgKGlzQ3JlZGVudGlhbHNWZXJpZnlFcnJvcihsb2dpblJlc3BvbnNlKSkge1xuICAgICAgICBjb25zdCBuZXdMb2dpbkZvcm0gPSBhd2FpdCB0aGlzLmdldExvZ2luRm9ybShsb2dpblJlc3BvbnNlKVxuXG4gICAgICAgIGxvZ2luUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRMb2dpblJlcXVlc3QobmV3TG9naW5Gb3JtLCBsb2dpblBhcmFtcylcbiAgICAgIH1cblxuICAgICAgLy8gU29tZXRpbWVzIGR1ZSB0byByZWRpcmVjdGlvbiBvbiBTQVM5IGFuZCBTQVNWaXlhIHdlIGRvbid0IGdldCB0aGUgbG9naW4gcmVzcG9uc2UgdGhhdCBzYXlzXG4gICAgICAvLyBZb3UgaGF2ZSBzaWduZWQgaW4uIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBtYWtlIGFuIGV4dHJhIHJlcXVlc3QgZm9yIGNoZWNraW5nIHNlc3Npb24gdG9cbiAgICAgIC8vIGVuc3VyZSBlaXRoZXIgdXNlciBpcyBsb2dnZWQgaW4gb3Igbm90LlxuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNoZWNrU2Vzc2lvbigpXG4gICAgICBpc0xvZ2dlZEluID0gcmVzLmlzTG9nZ2VkSW5cbiAgICAgIHRoaXMudXNlckxvbmdOYW1lID0gcmVzLnVzZXJMb25nTmFtZVxuICAgIH1cblxuICAgIGlmIChpc0xvZ2dlZEluKSB7XG4gICAgICBpZiAodGhpcy5zZXJ2ZXJUeXBlID09PSBTZXJ2ZXJUeXBlLlNhczkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtQ0FTU2VjdXJpdHlDaGVjaygpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9naW5DYWxsYmFjaygpXG4gICAgICB0aGlzLnVzZXJOYW1lID0gbG9naW5QYXJhbXMudXNlcm5hbWVcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2dnZWRJbixcbiAgICAgIHVzZXJOYW1lOiB0aGlzLnVzZXJOYW1lLFxuICAgICAgdXNlckxvbmdOYW1lOiB0aGlzLnVzZXJMb25nTmFtZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUNBU1NlY3VyaXR5Q2hlY2soKSB7XG4gICAgY29uc3QgY2FzQXV0aGVudGljYXRpb25VcmwgPSBgJHt0aGlzLnNlcnZlclVybH0vU0FTU3RvcmVkUHJvY2Vzcy9qX3NwcmluZ19jYXNfc2VjdXJpdHlfY2hlY2tgXG5cbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RDbGllbnRcbiAgICAgIC5nZXQ8c3RyaW5nPihgL1NBU0xvZ29uL2xvZ2luP3NlcnZpY2U9JHtjYXNBdXRoZW50aWNhdGlvblVybH1gLCB1bmRlZmluZWQpXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAvLyBpZ25vcmUgaWYgcmVzb3VyY2Ugbm90IGZvdW5kIGVycm9yXG4gICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlcnJcbiAgICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRMb2dpblJlcXVlc3QoXG4gICAgbG9naW5Gb3JtOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICAgIGxvZ2luUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9XG4gICkge1xuICAgIGlmICh0aGlzLnNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzanMpIHtcbiAgICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSBsb2dpblBhcmFtc1xuICAgICAgY29uc3QgeyByZXN1bHQ6IGxvZ2luUmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudC5wb3N0PHN0cmluZz4oXG4gICAgICAgIHRoaXMubG9naW5VcmwsXG4gICAgICAgIHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0sXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbG9naW5SZXNwb25zZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGxvZ2luRm9ybSkge1xuICAgICAgbG9naW5QYXJhbXNba2V5XSA9IGxvZ2luRm9ybVtrZXldXG4gICAgfVxuICAgIGNvbnN0IGxvZ2luUGFyYW1zU3RyID0gc2VyaWFsaXplKGxvZ2luUGFyYW1zKVxuXG4gICAgY29uc3QgeyByZXN1bHQ6IGxvZ2luUmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudC5wb3N0PHN0cmluZz4oXG4gICAgICB0aGlzLmxvZ2luVXJsLFxuICAgICAgbG9naW5QYXJhbXNTdHIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAndGV4dC9wbGFpbicsXG4gICAgICB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgQWNjZXB0OiAnKi8qJ1xuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiBsb2dpblJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBzZXNzaW9uIGlzIGFjdGl2ZSwgb3IgbG9naW4gaXMgcmVxdWlyZWQuXG4gICAqIEByZXR1cm5zIC0gYSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhyZWUgdmFsdWVzXG4gICAqICAtIGEgYm9vbGVhbiBgaXNMb2dnZWRJbmBcbiAgICogIC0gYSBzdHJpbmcgYHVzZXJOYW1lYCxcbiAgICogIC0gYSBzdHJpbmcgYHVzZXJGdWxsTmFtZWAgYW5kXG4gICAqICAtIGEgZm9ybSBgbG9naW5Gb3JtYCBpZiBub3QgbG9nZ2VkSW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hlY2tTZXNzaW9uKCk6IFByb21pc2U8TG9naW5SZXN1bHRJbnRlcm5hbD4ge1xuICAgIGNvbnN0IHsgaXNMb2dnZWRJbiwgdXNlck5hbWUsIHVzZXJMb25nTmFtZSB9ID0gYXdhaXQgdGhpcy5mZXRjaFVzZXJOYW1lKClcbiAgICBsZXQgbG9naW5Gb3JtID0gbnVsbFxuXG4gICAgaWYgKCFpc0xvZ2dlZEluKSB7XG4gICAgICAvL1dlIHdpbGwgbG9nb3V0IHRvIG1ha2Ugc3VyZSBjb29raWVzIGFyZSByZW1vdmVkIGFuZCBsb2dpbiBmb3JtIGlzIHByZXNlbnRlZFxuICAgICAgLy9SZXNpZHVlIGNhbiBoYXBwZW4gaW4gY2FzZSBvZiBzZXNzaW9uIGV4cGlyYXRpb25cbiAgICAgIGF3YWl0IHRoaXMubG9nT3V0KClcblxuICAgICAgbG9naW5Gb3JtID0gYXdhaXQgdGhpcy5nZXROZXdMb2dpbkZvcm0oKVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgaXNMb2dnZWRJbixcbiAgICAgIHVzZXJOYW1lLFxuICAgICAgdXNlckxvbmdOYW1lLFxuICAgICAgbG9naW5Gb3JtXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TmV3TG9naW5Gb3JtKCkge1xuICAgIGlmICh0aGlzLnNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzanMpIHtcbiAgICAgIC8vIHNlcnZlciB3aWxsIGJlIHNlbmRpbmcgQ1NSRiB0b2tlbiBpbiByZXNwb25zZSxcbiAgICAgIC8vIG5lZWQgdG8gc2F2ZSBpbiBjb29raWUgc28gdGhhdCxcbiAgICAgIC8vIGh0dHAgY2xpZW50IHdpbGwgdXNlIGl0IGF1dG9tYXRpY2FsbHlcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RDbGllbnQuZ2V0KCcvJywgdW5kZWZpbmVkKS50aGVuKCh7IHJlc3VsdCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvb2tpZSA9XG4gICAgICAgICAgLzxzY3JpcHQ+ZG9jdW1lbnQuY29va2llID0gJyhYU1JGLVRPS0VOPS4qOyBNYXgtQWdlPTg2NDAwOyBTYW1lU2l0ZT1TdHJpY3Q7IFBhdGg9XFwvOyknPFxcL3NjcmlwdD4vLmV4ZWMoXG4gICAgICAgICAgICByZXN1bHQgYXMgc3RyaW5nXG4gICAgICAgICAgKT8uWzFdXG5cbiAgICAgICAgaWYgKGNvb2tpZSkgZG9jdW1lbnQuY29va2llID0gY29va2llXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHsgcmVzdWx0OiBmb3JtUmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudC5nZXQ8c3RyaW5nPihcbiAgICAgIHRoaXMubG9naW5VcmwucmVwbGFjZSgnL1NBU0xvZ29uL2xvZ2luLmRvJywgJy9TQVNMb2dvbi9sb2dpbicpLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3RleHQvcGxhaW4nXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TG9naW5Gb3JtKGZvcm1SZXNwb25zZSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hVc2VyTmFtZSgpOiBQcm9taXNlPExvZ2luUmVzdWx0PiB7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNWaXlhXG4gICAgICAgID8gYCR7dGhpcy5zZXJ2ZXJVcmx9L2lkZW50aXRpZXMvdXNlcnMvQGN1cnJlbnRVc2VyYFxuICAgICAgICA6IHRoaXMuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXM5XG4gICAgICAgICAgPyBgJHt0aGlzLnNlcnZlclVybH0vU0FTU3RvcmVkUHJvY2Vzc2BcbiAgICAgICAgICA6IGAke3RoaXMuc2VydmVyVXJsfS9TQVNqc0FwaS9zZXNzaW9uYFxuXG4gICAgY29uc3QgeyByZXN1bHQ6IGxvZ2luUmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudFxuICAgICAgLmdldDxzdHJpbmc+KHVybCwgdW5kZWZpbmVkLCAndGV4dC9wbGFpbicpXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdDogJ2F1dGhFcnInIH1cbiAgICAgIH0pXG5cbiAgICBjb25zdCBpc0xvZ2dlZEluID0gbG9naW5SZXNwb25zZSAhPT0gJ2F1dGhFcnInXG5cbiAgICBpZiAoIWlzTG9nZ2VkSW4pIHtcbiAgICAgIC8vV2Ugd2lsbCBsb2dvdXQgdG8gbWFrZSBzdXJlIGNvb2tpZXMgYXJlIHJlbW92ZWQgYW5kIGxvZ2luIGZvcm0gaXMgcHJlc2VudGVkXG4gICAgICAvL1Jlc2lkdWUgY2FuIGhhcHBlbiBpbiBjYXNlIG9mIHNlc3Npb24gZXhwaXJhdGlvblxuICAgICAgYXdhaXQgdGhpcy5sb2dPdXQoKVxuICAgICAgcmV0dXJuIHsgaXNMb2dnZWRJbiwgdXNlck5hbWU6ICcnLCB1c2VyTG9uZ05hbWU6ICcnIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2dnZWRJbixcbiAgICAgIHVzZXJOYW1lOiB0aGlzLmV4dHJhY3RVc2VyTmFtZShsb2dpblJlc3BvbnNlKSxcbiAgICAgIHVzZXJMb25nTmFtZTogdGhpcy5leHRyYWN0VXNlckxvbmdOYW1lKGxvZ2luUmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0VXNlck5hbWUgPSAocmVzcG9uc2U6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnNlcnZlclR5cGUpIHtcbiAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXNWaXlhOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2U/LmlkXG5cbiAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXM5OlxuICAgICAgICByZXR1cm4gJydcblxuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhc2pzOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2U/LnVzZXJuYW1lXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NlcnZlciBUeXBlIG5vdCBmb3VuZCBpbiBleHRyYWN0VXNlck5hbWUgZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RVc2VyTG9uZ05hbWUgPSAocmVzcG9uc2U6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnNlcnZlclR5cGUpIHtcbiAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXNWaXlhOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2U/Lm5hbWVcblxuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhczk6XG4gICAgICAgIHJldHVybiBleHRyYWN0VXNlckxvbmdOYW1lU2FzOShyZXNwb25zZSlcblxuICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlNhc2pzOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2U/LmRpc3BsYXlOYW1lXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NlcnZlciBUeXBlIG5vdCBmb3VuZCBpbiBleHRyYWN0VXNlck5hbWUgZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldExvZ2luRm9ybShyZXNwb25zZTogYW55KSB7XG4gICAgY29uc3QgcGF0dGVybjogUmVnRXhwID0gLzxmb3JtLithY3Rpb249XCIoLiooTG9nb258bG9naW4pW15cIl0qKS4qPi9cbiAgICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5leGVjKHJlc3BvbnNlKVxuICAgIGNvbnN0IGZvcm1JbnB1dHM6IGFueSA9IHt9XG5cbiAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZXRMb2dpblVybChtYXRjaGVzKVxuICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5yZXBsYWNlKC88aW5wdXQvZywgJ1xcbjxpbnB1dCcpXG4gICAgICBjb25zdCBpbnB1dHMgPSByZXNwb25zZS5tYXRjaCgvPGlucHV0LipcImhpZGRlblwiW14+XSo+L2cpXG5cbiAgICAgIGlmIChpbnB1dHMpIHtcbiAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0U3RyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZU1hdGNoID0gaW5wdXRTdHIubWF0Y2goL25hbWU9XCIoW15cIl0qKVwiXFxzdmFsdWU9XCIoW15cIl0qKS8pXG5cbiAgICAgICAgICBpZiAodmFsdWVNYXRjaCAmJiB2YWx1ZU1hdGNoLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9ybUlucHV0c1t2YWx1ZU1hdGNoWzFdXSA9IHZhbHVlTWF0Y2hbMl1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZvcm1JbnB1dHMpLmxlbmd0aCA/IGZvcm1JbnB1dHMgOiBudWxsXG4gIH1cblxuICBwcml2YXRlIHNldExvZ2luVXJsID0gKG1hdGNoZXM6IFJlZ0V4cEV4ZWNBcnJheSkgPT4ge1xuICAgIGxldCBwYXJzZWRVUkwgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1xcPy4qLywgJycpXG4gICAgaWYgKHBhcnNlZFVSTFswXSA9PT0gJy8nKSB7XG4gICAgICBwYXJzZWRVUkwgPSBwYXJzZWRVUkwuc3Vic3RyKDEpXG5cbiAgICAgIGNvbnN0IHRlbXBMb2dpbkxpbmsgPSB0aGlzLnNlcnZlclVybFxuICAgICAgICA/IGAke3RoaXMuc2VydmVyVXJsfS8ke3BhcnNlZFVSTH1gXG4gICAgICAgIDogYCR7cGFyc2VkVVJMfWBcblxuICAgICAgY29uc3QgbG9naW5VcmwgPSB0ZW1wTG9naW5MaW5rXG5cbiAgICAgIHRoaXMubG9naW5VcmwgPVxuICAgICAgICB0aGlzLnNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzVml5YVxuICAgICAgICAgID8gdGVtcExvZ2luTGlua1xuICAgICAgICAgIDogbG9naW5VcmwucmVwbGFjZSgnL1NBU0xvZ29uL2xvZ2luLmRvJywgJy9TQVNMb2dvbi9sb2dpbicpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3Mgb3V0IG9mIHRoZSBjb25maWd1cmVkIFNBUyBzZXJ2ZXIuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9nT3V0KCkge1xuICAgIHRoaXMucmVxdWVzdENsaWVudC5yZXNldEluTWVtb3J5QXV0aFN0YXRlKClcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDbGllbnQuZ2V0KHRoaXMubG9nb3V0VXJsLCB1bmRlZmluZWQpLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgfVxufVxuXG5jb25zdCBpc0NyZWRlbnRpYWxzVmVyaWZ5RXJyb3IgPSAocmVzcG9uc2U6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgL0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRoZSBzeXN0ZW0gd2FzIHZlcmlmeWluZyB5b3VyIGNyZWRlbnRpYWxzLiBQbGVhc2UgZW50ZXIgeW91ciBjcmVkZW50aWFscyBhZ2Fpbi4vZ20udGVzdChcbiAgICByZXNwb25zZVxuICApXG4iLCJleHBvcnQgKiBmcm9tICcuL0F1dGhNYW5hZ2VyJ1xuZXhwb3J0ICogZnJvbSAnLi9pc0F1dGhvcml6ZUZvcm1SZXF1aXJlZCdcbmV4cG9ydCAqIGZyb20gJy4vaXNMb2dpblJlcXVpcmVkJ1xuZXhwb3J0ICogZnJvbSAnLi9sb2dpbkhlYWRlcidcbiIsImV4cG9ydCBjb25zdCBpc0F1dGhvcml6ZUZvcm1SZXF1aXJlZCA9IChyZXNwb25zZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiAvPGZvcm0uK2FjdGlvbj1cIiguKkxvZ29uXFwvb2F1dGhcXC9hdXRob3JpemVbXlwiXSopLio+L2dtLnRlc3QocmVzcG9uc2UpXG59XG4iLCJleHBvcnQgY29uc3QgaXNMb2dJblJlcXVpcmVkID0gKHJlc3BvbnNlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGF0dGVybjogUmVnRXhwID0gLzxmb3JtLithY3Rpb249XCIoLiooTG9nb24pfChsb2dpbilbXlwiXSopLio+L2dtXG4gIGNvbnN0IG1hdGNoZXMgPSBwYXR0ZXJuLnRlc3QocmVzcG9uc2UpXG4gIHJldHVybiBtYXRjaGVzXG59XG4iLCJpbXBvcnQgeyBTZXJ2ZXJUeXBlIH0gZnJvbSAnQHNhc2pzL3V0aWxzL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0VXNlckxhbmd1YWdlIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmNvbnN0IGVuTG9naW5TdWNjZXNzSGVhZGVyID0gJ1lvdSBoYXZlIHNpZ25lZCBpbi4nXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3VjY2Vzc0hlYWRlcktleSA9ICdkZWZhdWx0J1xuXG4vLyBUaGUgZm9sbG93aW5nIGhlYWRlcnMgcHJvdmlkZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL3Nhc2pzL2FkYXB0ZXIvaXNzdWVzLzgzNSNpc3N1ZWNvbW1lbnQtMjE3NzgxODYwMVxuZXhwb3J0IGNvbnN0IGxvZ2luU3VjY2Vzc0hlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gIGVzOiBgWWEgc2UgaGEgaW5pY2lhZG8gbGEgc2VzaVxcdTAwZjNuLmAsXG4gIHRoOiBgXFx1MGUwNFxcdTBlMzhcXHUwZTEzXFx1MGUyNVxcdTBlMDdcXHUwZTBhXFx1MGUzN1xcdTBlNDhcXHUwZTJkXFx1MGU0MFxcdTBlMDJcXHUwZTQ5XFx1MGUzMlxcdTBlNDNcXHUwZTBhXFx1MGU0OVxcdTBlNDFcXHUwZTI1XFx1MGU0OVxcdTBlMjdgLFxuICBqYTogYFxcdTMwYjVcXHUzMGE0XFx1MzBmM1xcdTMwYTRcXHUzMGYzXFx1MzA1N1xcdTMwN2VcXHUzMDU3XFx1MzA1ZlxcdTMwMDJgLFxuICBuYjogYER1IGhhciBsb2dnZXQgZGVnIHBcXHUwMGU1LmAsXG4gIHNsOiBgUHJpamF2aWxpIHN0ZSBzZS5gLFxuICBhcjogYFxcdTA2NDRcXHUwNjQyXFx1MDYyZiBcXHUwNjQyXFx1MDY0NVxcdTA2MmEgYCxcbiAgc2s6IGBQcmlobFxcdTAwZTFzaWxpIHN0ZSBzYS5gLFxuICB6aF9ISzogYFxcdTYwYThcXHU1ZGYyXFx1NzY3YlxcdTUxNjVcXHUzMDAyYCxcbiAgemhfQ046IGBcXHU2MGE4XFx1NWRmMlxcdTc2N2JcXHU1ZjU1XFx1MzAwMmAsXG4gIGl0OiBgTCd1dGVudGUgc2kgXFx1MDBlOCBjb25uZXNzby5gLFxuICBzdjogYER1IGhhciBsb2dnYXQgaW4uYCxcbiAgaGU6IGBcXHUwNWUwXFx1MDVkYlxcdTA1ZTBcXHUwNWUxXFx1MDVlYSBgLFxuICBubDogYFUgaGVidCB6aWNoIGFhbmdlbWVsZC5gLFxuICBwbDogYFpvc3RhXFx1MDE0MmVcXHUwMTViIHphbG9nb3dhbnkuYCxcbiAga286IGBcXHViODVjXFx1YWRmOFxcdWM3NzhcXHVkNTg4XFx1YzJiNVxcdWIyYzhcXHViMmU0LmAsXG4gIHpoX1RXOiBgXFx1NjBhOFxcdTVkZjJcXHU3NjdiXFx1NTE2NVxcdTMwMDJgLFxuICB0cjogYE90dXJ1bSBhXFx1MDBlN3RcXHUwMTMxblxcdTAxMzF6LmAsXG4gIGl3OiBgXFx1MDVlMFxcdTA1ZGJcXHUwNWUwXFx1MDVlMVxcdTA1ZWEgYCxcbiAgZnI6IGBWb3VzIFxcdTAwZWF0ZXMgY29ubmVjdFxcdTAwZTkuYCxcbiAgdWs6IGBcXHUwNDEyXFx1MDQzOCBcXHUwNDMyXFx1MDQzMlxcdTA0NTZcXHUwNDM5XFx1MDQ0OFxcdTA0M2JcXHUwNDM4IFxcdTA0MzIgXFx1MDQzZVxcdTA0MzFcXHUwNDNiXFx1MDQ1NlxcdTA0M2FcXHUwNDNlXFx1MDQzMlxcdTA0MzhcXHUwNDM5IFxcdTA0MzdcXHUwNDMwXFx1MDQzZlxcdTA0MzhcXHUwNDQxLmAsXG4gIHB0X0JSOiBgVm9jXFx1MDBlYSBzZSBjb25lY3RvdS5gLFxuICBubzogYER1IGhhciBsb2dnZXQgZGVnIHBcXHUwMGU1LmAsXG4gIGNzOiBgSnN0ZSBwXFx1MDE1OWlobFxcdTAwZTFcXHUwMTYxZW5pLmAsXG4gIGZpOiBgT2xldCBraXJqYXV0dW51dCBzaXNcXHUwMGU0XFx1MDBlNG4uYCxcbiAgcnU6IGBcXHUwNDEyXFx1MDQ0YiBcXHUwNDMyXFx1MDQ0YlxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0M2RcXHUwNDM4XFx1MDQzYlxcdTA0MzggXFx1MDQzMlxcdTA0NDVcXHUwNDNlXFx1MDQzNCBcXHUwNDMyIFxcdTA0NDFcXHUwNDM4XFx1MDQ0MVxcdTA0NDJcXHUwNDM1XFx1MDQzY1xcdTA0NDMuYCxcbiAgZWw6IGBcXHUwMzg4XFx1MDNjN1xcdTAzYjVcXHUwM2M0XFx1MDNiNSBcXHUwM2MzXFx1MDNjNVxcdTAzYmRcXHUwM2I0XFx1MDNiNVxcdTAzYjhcXHUwM2I1XFx1MDNhZi5gLFxuICBocjogYFByaWphdmlsaSBzdGUgc2UuYCxcbiAgZGE6IGBEdSBlciBsb2dnZXQgcFxcdTAwZTUuYCxcbiAgZGU6IGBTaWUgc2luZCBqZXR6dCBhbmdlbWVsZGV0LmAsXG4gIHNoOiBgUHJpamF2bGplbmkgc3RlLmAsXG4gIHB0OiBgSW5pY2lvdSBzZXNzXFx1MDBlM28uYCxcbiAgaHU6IGBCZWplbGVudGtlemV0dC5gLFxuICBzcjogYFByaWphdmxqZW5pIHN0ZS5gLFxuICBlbjogZW5Mb2dpblN1Y2Nlc3NIZWFkZXIsXG4gIFtkZWZhdWx0U3VjY2Vzc0hlYWRlcktleV06IGVuTG9naW5TdWNjZXNzSGVhZGVyXG59XG5cbi8qKlxuICogUHJvdmlkZXMgZXhwZWN0ZWQgbG9naW4gaGVhZGVyIGJhc2VkIG9uIGxhbmd1YWdlIHNldHRpbmdzIG9mIHRoZSBicm93c2VyLlxuICogQHJldHVybnMgLSBleHBlY3RlZCBoZWFkZXIgYXMgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlciA9ICgpOiBzdHJpbmcgPT4ge1xuICAvLyBnZXQgZGVmYXVsdCBzdWNjZXNzIGhlYWRlclxuICBsZXQgc3VjY2Vzc0hlYWRlciA9IGxvZ2luU3VjY2Vzc0hlYWRlcnNbZGVmYXVsdFN1Y2Nlc3NIZWFkZXJLZXldXG5cbiAgLy8gZ2V0IHVzZXIgbGFuZ3VhZ2UgYmFzZWQgb24gbGFuZ3VhZ2Ugc2V0dGluZ3Mgb2YgdGhlIGJyb3dzZXJcbiAgY29uc3QgdXNlckxhbmcgPSBnZXRVc2VyTGFuZ3VhZ2UoKVxuXG4gIGlmICh1c2VyTGFuZykge1xuICAgIC8vIGdldCBzdWNjZXNzIGhlYWRlciBvbiBleGFjdCBtYXRjaCBvZiB0aGUgbGFuZ3VhZ2UgY29kZVxuICAgIGxldCB1c2VyTGFuZ1N1Y2Nlc3NIZWFkZXIgPSBsb2dpblN1Y2Nlc3NIZWFkZXJzW3VzZXJMYW5nXVxuXG4gICAgLy8gaGFuZGxlIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCBvZiB0aGUgbGFuZ3VhZ2UgY29kZVxuICAgIGlmICghdXNlckxhbmdTdWNjZXNzSGVhZGVyKSB7XG4gICAgICAvLyBnZXQgYWxsIHN1cHBvcnRlZCBsYW5ndWFnZSBjb2Rlc1xuICAgICAgY29uc3QgaGVhZGVyTGFuZ3VhZ2VzID0gT2JqZWN0LmtleXMobG9naW5TdWNjZXNzSGVhZGVycylcblxuICAgICAgLy8gZmluZCBsYW5ndWFnZSBjb2RlIG9uIHBhcnRpYWwgbWF0Y2hcbiAgICAgIGNvbnN0IGhlYWRlckxhbmd1YWdlID0gaGVhZGVyTGFuZ3VhZ2VzLmZpbmQoKGxhbmd1YWdlKSA9PlxuICAgICAgICBuZXcgUmVnRXhwKGxhbmd1YWdlLCAnaScpLnRlc3QodXNlckxhbmcpXG4gICAgICApXG5cbiAgICAgIC8vIHJlYXNzaWduIHN1Y2Nlc3MgaGVhZGVyIGlmIHBhcnRpYWwgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICBpZiAoaGVhZGVyTGFuZ3VhZ2UpIHtcbiAgICAgICAgc3VjY2Vzc0hlYWRlciA9IGxvZ2luU3VjY2Vzc0hlYWRlcnNbaGVhZGVyTGFuZ3VhZ2VdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Y2Nlc3NIZWFkZXIgPSB1c2VyTGFuZ1N1Y2Nlc3NIZWFkZXJcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VjY2Vzc0hlYWRlclxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBMb2dpbiBzdWNjZXNzIGhlYWRlciBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZSBiYXNlZCBvbiBsYW5ndWFnZSBzZXR0aW5ncyBvZiB0aGUgYnJvd3Nlci5cbiAqIEBwYXJhbSBzZXJ2ZXJUeXBlIC0gc2VydmVyIHR5cGUuXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSByZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJucyAtIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBMb2dpbiBzdWNjZXNzIGhlYWRlciBpcyBwcmVzZW50LlxuICovXG5leHBvcnQgY29uc3QgaXNMb2dJblN1Y2Nlc3NIZWFkZXJQcmVzZW50ID0gKFxuICBzZXJ2ZXJUeXBlOiBTZXJ2ZXJUeXBlLFxuICByZXNwb25zZTogYW55XG4pOiBib29sZWFuID0+IHtcbiAgaWYgKHNlcnZlclR5cGUgPT09IFNlcnZlclR5cGUuU2FzanMpIHJldHVybiByZXNwb25zZT8ubG9nZ2VkSW5cblxuICByZXR1cm4gbmV3IFJlZ0V4cChnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlcigpLCAnZ20nKS50ZXN0KHJlc3BvbnNlKVxufVxuIiwiaW1wb3J0IHsgb3BlbkxvZ2luUHJvbXB0IH0gZnJvbSAnLi4vdXRpbHMvbG9naW5Qcm9tcHQnXG5cbmludGVyZmFjZSBXaW5kb3dGZWF0dXJlcyB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbn1cblxuY29uc3QgZGVmYXVsdFdpbmRvd0ZlYXR1cmVzOiBXaW5kb3dGZWF0dXJlcyA9IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA2MDAgfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbldlYlBhZ2UoXG4gIHVybDogc3RyaW5nLFxuICB3aW5kb3dOYW1lOiBzdHJpbmcgPSAnJyxcbiAgV2luZG93RmVhdHVyZXM6IFdpbmRvd0ZlYXR1cmVzID0gZGVmYXVsdFdpbmRvd0ZlYXR1cmVzLFxuICBvbkxvZ2dlZE91dD86ICgpID0+IFByb21pc2U8Qm9vbGVhbj5cbik6IFByb21pc2U8V2luZG93IHwgbnVsbD4ge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IFdpbmRvd0ZlYXR1cmVzXG4gIGNvbnN0IGxlZnQgPSBzY3JlZW4ud2lkdGggLyAyIC0gd2lkdGggLyAyXG4gIGNvbnN0IHRvcCA9IHNjcmVlbi5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMlxuXG4gIGNvbnN0IGxvZ2luUG9wdXAgPSB3aW5kb3cub3BlbihcbiAgICB1cmwsXG4gICAgd2luZG93TmFtZSxcbiAgICBgdG9vbGJhcj0wLGxvY2F0aW9uPTAsbWVudWJhcj0wLHdpZHRoPSR7d2lkdGh9LGhlaWdodD0ke2hlaWdodH0sbGVmdD0ke2xlZnR9LHRvcD0ke3RvcH1gXG4gIClcblxuICBpZiAoIWxvZ2luUG9wdXApIHtcbiAgICBjb25zdCBnZXRVc2VyQWN0aW9uOiAoKSA9PiBQcm9taXNlPEJvb2xlYW4+ID0gb25Mb2dnZWRPdXQgPz8gb3BlbkxvZ2luUHJvbXB0XG5cbiAgICBjb25zdCBkb0xvZ2luID0gYXdhaXQgZ2V0VXNlckFjdGlvbigpXG4gICAgcmV0dXJuIGRvTG9naW5cbiAgICAgID8gd2luZG93Lm9wZW4oXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHdpbmRvd05hbWUsXG4gICAgICAgICAgYHRvb2xiYXI9MCxsb2NhdGlvbj0wLG1lbnViYXI9MCx3aWR0aD0ke3dpZHRofSxoZWlnaHQ9JHtoZWlnaHR9LGxlZnQ9JHtsZWZ0fSx0b3A9JHt0b3B9YFxuICAgICAgICApXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBsb2dpblBvcHVwXG59XG4iLCJpbXBvcnQgeyBkZWxheSB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0RXhwZWN0ZWRMb2dJblN1Y2Nlc3NIZWFkZXIgfSBmcm9tICcuLydcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVNhczlMb2dpbihsb2dpblBvcHVwOiBXaW5kb3cpOiBQcm9taXNlPHtcbiAgaXNMb2dnZWRJbjogYm9vbGVhblxufT4ge1xuICBsZXQgaXNMb2dnZWRJbiA9IGZhbHNlXG4gIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXG4gIGxldCBlbGFwc2VkU2Vjb25kcyA9IDBcblxuICBkbyB7XG4gICAgYXdhaXQgZGVsYXkoMTAwMClcbiAgICBpZiAobG9naW5Qb3B1cC5jbG9zZWQpIGJyZWFrXG5cbiAgICBpc0xvZ2dlZEluID1cbiAgICAgIGxvZ2luUG9wdXAud2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ1NBU0xvZ29uJykgJiZcbiAgICAgIGxvZ2luUG9wdXAud2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJUZXh0LmluY2x1ZGVzKFxuICAgICAgICBnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlcigpXG4gICAgICApXG5cbiAgICBlbGFwc2VkU2Vjb25kcyA9IChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHN0YXJ0VGltZS52YWx1ZU9mKCkpIC8gMTAwMFxuICB9IHdoaWxlICghaXNMb2dnZWRJbiAmJiBlbGFwc2VkU2Vjb25kcyA8IDUgKiA2MClcblxuICByZXR1cm4geyBpc0xvZ2dlZEluIH1cbn1cbiIsImltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlciB9IGZyb20gJy4vJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2FzVml5YUxvZ2luKGxvZ2luUG9wdXA6IFdpbmRvdyk6IFByb21pc2U8e1xuICBpc0xvZ2dlZEluOiBib29sZWFuXG59PiB7XG4gIGxldCBpc0xvZ2dlZEluID0gZmFsc2VcbiAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcbiAgbGV0IGVsYXBzZWRTZWNvbmRzID0gMFxuXG4gIGRvIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKVxuXG4gICAgaWYgKGxvZ2luUG9wdXAuY2xvc2VkKSBicmVha1xuXG4gICAgaXNMb2dnZWRJbiA9IGlzTG9nZ2VkSW5TQVNWSVlBKClcblxuICAgIGVsYXBzZWRTZWNvbmRzID0gKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnRUaW1lLnZhbHVlT2YoKSkgLyAxMDAwXG4gIH0gd2hpbGUgKCFpc0xvZ2dlZEluICYmIGVsYXBzZWRTZWNvbmRzIDwgNSAqIDYwKVxuXG4gIGxldCBpc0F1dGhvcml6ZWQgPSBmYWxzZVxuXG4gIHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcblxuICBkbyB7XG4gICAgYXdhaXQgZGVsYXkoMTAwMClcblxuICAgIGlmIChsb2dpblBvcHVwLmNsb3NlZCkgYnJlYWtcblxuICAgIGlzQXV0aG9yaXplZCA9XG4gICAgICBsb2dpblBvcHVwLndpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdTQVNMb2dvbicpIHx8XG4gICAgICBsb2dpblBvcHVwLndpbmRvdy5kb2N1bWVudC5ib2R5Py5pbm5lclRleHQ/LmluY2x1ZGVzKFxuICAgICAgICBnZXRFeHBlY3RlZExvZ0luU3VjY2Vzc0hlYWRlcigpXG4gICAgICApXG5cbiAgICBlbGFwc2VkU2Vjb25kcyA9IChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHN0YXJ0VGltZS52YWx1ZU9mKCkpIC8gMTAwMFxuICB9IHdoaWxlICghaXNBdXRob3JpemVkICYmIGVsYXBzZWRTZWNvbmRzIDwgNSAqIDYwKVxuXG4gIHJldHVybiB7IGlzTG9nZ2VkSW46IGlzTG9nZ2VkSW4gJiYgaXNBdXRob3JpemVkIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlzTG9nZ2VkSW5TQVNWSVlBID0gKCkgPT5cbiAgZG9jdW1lbnQuY29va2llLmluY2x1ZGVzKCdDdXJyZW50LVVzZXInKSAmJiBkb2N1bWVudC5jb29raWUuaW5jbHVkZXMoJ3VzZXJJZCcpXG4iLCJpbXBvcnQge1xuICBnZXRWYWxpZEpzb24sXG4gIHBhcnNlU2FzVml5YURlYnVnUmVzcG9uc2UsXG4gIHBhcnNlV2Vib3V0UmVzcG9uc2Vcbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBVcGxvYWRGaWxlIH0gZnJvbSAnLi4vdHlwZXMvVXBsb2FkRmlsZSdcbmltcG9ydCB7XG4gIEVycm9yUmVzcG9uc2UsXG4gIEpvYkV4ZWN1dGlvbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3Jcbn0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuaW1wb3J0IHsgUmVxdWVzdENsaWVudCB9IGZyb20gJy4uL3JlcXVlc3QvUmVxdWVzdENsaWVudCdcbmltcG9ydCB7IFNlcnZlclR5cGUgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBCYXNlSm9iRXhlY3V0b3IgfSBmcm9tICcuL0pvYkV4ZWN1dG9yJ1xuXG5pbnRlcmZhY2UgZGF0YUZpbGVVcGxvYWQge1xuICBmaWxlczogVXBsb2FkRmlsZVtdXG4gIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGxcbn1cblxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciBleHRlbmRzIEJhc2VKb2JFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNlcnZlclVybDogc3RyaW5nLFxuICAgIHNlcnZlclR5cGU6IFNlcnZlclR5cGUsXG4gICAgcHJpdmF0ZSBqb2JzUGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVxdWVzdENsaWVudDogUmVxdWVzdENsaWVudFxuICApIHtcbiAgICBzdXBlcihzZXJ2ZXJVcmwsIHNlcnZlclR5cGUpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShcbiAgICBzYXNKb2I6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgY29uZmlnOiBhbnksXG4gICAgbG9naW5SZXF1aXJlZENhbGxiYWNrPzogYW55XG4gICkge1xuICAgIGNvbnN0IHsgZmlsZXMsIHBhcmFtcyB9OiBkYXRhRmlsZVVwbG9hZCA9IGRhdGFcbiAgICBjb25zdCBsb2dpbkNhbGxiYWNrID0gbG9naW5SZXF1aXJlZENhbGxiYWNrIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIGlmICghZmlsZXM/Lmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvclJlc3BvbnNlKCdBdCBsZWFzdCBvbmUgZmlsZSBtdXN0IGJlIHByb3ZpZGVkLicpXG5cbiAgICBpZiAoIXNhc0pvYiB8fCBzYXNKb2IgPT09ICcnKVxuICAgICAgdGhyb3cgbmV3IEVycm9yUmVzcG9uc2UoJ3Nhc0pvYiBtdXN0IGJlIHByb3ZpZGVkLicpXG5cbiAgICBsZXQgcGFyYW1zU3RyaW5nID0gJydcblxuICAgIGZvciAobGV0IHBhcmFtIGluIHBhcmFtcylcbiAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW0pKVxuICAgICAgICBwYXJhbXNTdHJpbmcgKz0gYCYke3BhcmFtfT0ke3BhcmFtc1twYXJhbV19YFxuXG4gICAgY29uc3QgcHJvZ3JhbSA9IGNvbmZpZy5hcHBMb2NcbiAgICAgID8gY29uZmlnLmFwcExvYy5yZXBsYWNlKC9cXC8/JC8sICcvJykgKyBzYXNKb2IucmVwbGFjZSgvXlxcLy8sICcnKVxuICAgICAgOiBzYXNKb2JcbiAgICBjb25zdCB1cGxvYWRVcmwgPSBgJHt0aGlzLmpvYnNQYXRofS8/JHtcbiAgICAgICdfcHJvZ3JhbT0nICsgcHJvZ3JhbVxuICAgIH0ke3BhcmFtc1N0cmluZ31gXG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLmZpbGUsIGZpbGUuZmlsZU5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgY3NyZlRva2VuID0gdGhpcy5yZXF1ZXN0Q2xpZW50LmdldENzcmZUb2tlbignZmlsZScpXG4gICAgaWYgKGNzcmZUb2tlbikgZm9ybURhdGEuYXBwZW5kKCdfY3NyZicsIGNzcmZUb2tlbi52YWx1ZSlcbiAgICBpZiAoY29uZmlnLmRlYnVnKSBmb3JtRGF0YS5hcHBlbmQoJ19kZWJ1ZycsICcxMzEnKVxuICAgIGlmIChjb25maWcuc2VydmVyVHlwZSA9PT0gU2VydmVyVHlwZS5TYXNWaXlhICYmIGNvbmZpZy5jb250ZXh0TmFtZSlcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnX2NvbnRleHRuYW1lJywgY29uZmlnLmNvbnRleHROYW1lKVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcbiAgICAgIEFjY2VwdDogJyovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXG4gICAgfVxuXG4gICAgLy8gY3VycmVudGx5IG9ubHkgd2ViIGFwcHJvYWNoIGlzIHN1cHBvcnRlZCBmb3IgZmlsZSB1cGxvYWRcbiAgICAvLyB0aGVyZWZvcmUgbG9nIGlzIHBhcnQgb2YgcmVzcG9uc2Ugd2l0aCBkZWJ1ZyBlbmFibGVkIGFuZCBtdXN0IGJlIHBhcnNlZFxuICAgIGNvbnN0IHJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50XG4gICAgICAgIC5wb3N0KHVwbG9hZFVybCwgZm9ybURhdGEsIHVuZGVmaW5lZCwgJ2FwcGxpY2F0aW9uL2pzb24nLCBoZWFkZXJzKVxuICAgICAgICAudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RDbGllbnQuYXBwZW5kUmVxdWVzdChyZXMsIHNhc0pvYiwgY29uZmlnLmRlYnVnKVxuXG4gICAgICAgICAgbGV0IGpzb25SZXNwb25zZSA9IHJlcy5yZXN1bHRcblxuICAgICAgICAgIGlmIChjb25maWcuZGVidWcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXJ2ZXJUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXNWaXlhOlxuICAgICAgICAgICAgICAgIGpzb25SZXNwb25zZSA9IGF3YWl0IHBhcnNlU2FzVml5YURlYnVnUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICByZXMucmVzdWx0LFxuICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50LFxuICAgICAgICAgICAgICAgICAgY29uZmlnLnNlcnZlclVybFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5TYXM5OlxuICAgICAgICAgICAgICAgIGpzb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzLnJlc3VsdCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZVdlYm91dFJlc3BvbnNlKHJlcy5yZXN1bHQsIHVwbG9hZFVybClcbiAgICAgICAgICAgICAgICAgICAgOiByZXMucmVzdWx0XG5cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuU2FzanM6XG4gICAgICAgICAgICAgICAganNvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXMucmVzdWx0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGdldFZhbGlkSnNvbihyZXMucmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICA6IHJlcy5yZXN1bHRcblxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpzb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgIHR5cGVvZiByZXMucmVzdWx0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZ2V0VmFsaWRKc29uKHJlcy5yZXN1bHQpXG4gICAgICAgICAgICAgICAgOiByZXMucmVzdWx0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShqc29uUmVzcG9uc2UpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChhc3luYyAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEpvYkV4ZWN1dGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RDbGllbnQhLmFwcGVuZFJlcXVlc3QoZSwgc2FzSm9iLCBjb25maWcuZGVidWcpXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yUmVzcG9uc2UoZT8ubWVzc2FnZSwgZSkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kV2FpdGluZ1JlcXVlc3QoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgICAgICAgICAgIHNhc0pvYixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2tcbiAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCBsb2dpbkNhbGxiYWNrKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKCdGaWxlIHVwbG9hZCByZXF1ZXN0IGZhaWxlZC4nLCBlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gcmVxdWVzdFByb21pc2VcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXV0aENvbmZpZywgU2VydmVyVHlwZSB9IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHNhc2pzL3V0aWxzL3R5cGVzJ1xuaW1wb3J0IHsgYXN5bmNGb3JFYWNoLCBpc1JlbGF0aXZlUGF0aCB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBFeGVjdXRlRnVuY3Rpb24gPSAoKSA9PiBQcm9taXNlPGFueT5cblxuZXhwb3J0IGludGVyZmFjZSBKb2JFeGVjdXRvciB7XG4gIGV4ZWN1dGU6IChcbiAgICBzYXNKb2I6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgY29uZmlnOiBhbnksXG4gICAgbG9naW5SZXF1aXJlZENhbGxiYWNrPzogYW55LFxuICAgIGF1dGhDb25maWc/OiBBdXRoQ29uZmlnLFxuICAgIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzPzogRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXNbXVxuICApID0+IFByb21pc2U8YW55PlxuICByZXNlbmRXYWl0aW5nUmVxdWVzdHM6ICgpID0+IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VKb2JFeGVjdXRvciBpbXBsZW1lbnRzIEpvYkV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNlcnZlclVybDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBzZXJ2ZXJUeXBlOiBTZXJ2ZXJUeXBlXG4gICkge31cblxuICBwcml2YXRlIHdhaXRpbmdSZXF1ZXN0czogRXhlY3V0ZUZ1bmN0aW9uW10gPSBbXVxuXG4gIGFic3RyYWN0IGV4ZWN1dGUoXG4gICAgc2FzSm9iOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIGxvZ2luUmVxdWlyZWRDYWxsYmFjaz86IGFueSxcbiAgICBhdXRoQ29uZmlnPzogQXV0aENvbmZpZyB8IHVuZGVmaW5lZCxcbiAgICBleHRyYVJlc3BvbnNlQXR0cmlidXRlcz86IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzW11cbiAgKTogUHJvbWlzZTxhbnk+XG5cbiAgcmVzZW5kV2FpdGluZ1JlcXVlc3RzID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGFzeW5jRm9yRWFjaChcbiAgICAgIHRoaXMud2FpdGluZ1JlcXVlc3RzLFxuICAgICAgYXN5bmMgKHdhaXRpbmdSZXF1ZXN0OiBFeGVjdXRlRnVuY3Rpb24pID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdGluZ1JlcXVlc3QoKVxuICAgICAgfVxuICAgIClcblxuICAgIHRoaXMud2FpdGluZ1JlcXVlc3RzID0gW11cbiAgICByZXR1cm5cbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBlbmRXYWl0aW5nUmVxdWVzdChyZXF1ZXN0OiBFeGVjdXRlRnVuY3Rpb24pIHtcbiAgICB0aGlzLndhaXRpbmdSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpXG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVxdWVzdFBhcmFtcyhjb25maWc6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcmVxdWVzdFBhcmFtczogYW55ID0ge31cblxuICAgIGlmIChjb25maWcuZGVidWcpIHtcbiAgICAgIHJlcXVlc3RQYXJhbXNbJ19vbWl0dGV4dGxvZyddID0gJ2ZhbHNlJ1xuICAgICAgcmVxdWVzdFBhcmFtc1snX29taXRTZXNzaW9uUmVzdWx0cyddID0gJ2ZhbHNlJ1xuICAgICAgcmVxdWVzdFBhcmFtc1snX2RlYnVnJ10gPSAxMzFcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdFBhcmFtc1xuICB9XG59XG4iLCJpbXBvcnQgeyB2YWxpZGF0ZUlucHV0LCBjb21wYXJlVGltZXN0YW1wcyB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgU0FTanNDb25maWcsIFVwbG9hZEZpbGUsIExvZ2luTWVjaGFuaXNtIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBBdXRoTWFuYWdlciB9IGZyb20gJy4uLy4uL2F1dGgnXG5pbXBvcnQge1xuICBTZXJ2ZXJUeXBlLFxuICBBdXRoQ29uZmlnLFxuICBFeHRyYVJlc3BvbnNlQXR0cmlidXRlc1xufSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi4vLi4vam9iLWV4ZWN1dGlvbi9GaWxlVXBsb2FkZXInXG5pbXBvcnQgeyBXZWJKb2JFeGVjdXRvciB9IGZyb20gJy4vV2ViSm9iRXhlY3V0b3InXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXJyb3JzL0Vycm9yUmVzcG9uc2UnXG5pbXBvcnQgeyBMb2dpbk9wdGlvbnMsIExvZ2luUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvTG9naW4nXG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFNBU2pzQ29uZmlnID0ge1xuICBzZXJ2ZXJVcmw6ICcnLFxuICBwYXRoU0FTSlM6ICcvU0FTanNBcGkvc3RwL2V4ZWN1dGUnLFxuICBwYXRoU0FTOTogJy9TQVNTdG9yZWRQcm9jZXNzL2RvJyxcbiAgcGF0aFNBU1ZpeWE6ICcvU0FTSm9iRXhlY3V0aW9uJyxcbiAgYXBwTG9jOiAnL1B1YmxpYy9zZWVkYXBwJyxcbiAgc2VydmVyVHlwZTogU2VydmVyVHlwZS5TYXM5LFxuICBkZWJ1ZzogZmFsc2UsXG4gIGNvbnRleHROYW1lOiAnU0FTIEpvYiBFeGVjdXRpb24gY29tcHV0ZSBjb250ZXh0JyxcbiAgdXNlQ29tcHV0ZUFwaTogbnVsbCxcbiAgbG9naW5NZWNoYW5pc206IExvZ2luTWVjaGFuaXNtLkRlZmF1bHRcbn1cblxuLyoqXG4gKiBTQVNqcyBpcyBhIEphdmFTY3JpcHQgYWRhcHRlciBmb3IgU0FTLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0FTanMge1xuICBwcml2YXRlIHNhc2pzQ29uZmlnOiBTQVNqc0NvbmZpZyA9IG5ldyBTQVNqc0NvbmZpZygpXG4gIHByaXZhdGUgam9ic1BhdGg6IHN0cmluZyA9ICcnXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBGaWxlVXBsb2FkZXIgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGF1dGhNYW5hZ2VyOiBBdXRoTWFuYWdlciB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgcmVxdWVzdENsaWVudDogUmVxdWVzdENsaWVudCB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgd2ViSm9iRXhlY3V0b3I6IFdlYkpvYkV4ZWN1dG9yIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBQYXJ0aWFsPFNBU2pzQ29uZmlnPikge1xuICAgIHRoaXMuc2FzanNDb25maWcgPSB7XG4gICAgICAuLi5kZWZhdWx0Q29uZmlnLFxuICAgICAgLi4uY29uZmlnXG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cENvbmZpZ3VyYXRpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW50byB0aGUgU0FTIHNlcnZlciB3aXRoIHRoZSBzdXBwbGllZCBjcmVkZW50aWFscy5cbiAgICogQHBhcmFtIHVzZXJuYW1lIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VybmFtZS5cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXNzd29yZC5cbiAgICogQHBhcmFtIGNsaWVudElkIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQgSUQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9nSW4oXG4gICAgdXNlcm5hbWU/OiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgY2xpZW50SWQ/OiBzdHJpbmcsXG4gICAgb3B0aW9uczogTG9naW5PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxMb2dpblJlc3VsdD4ge1xuICAgIGlmICh0aGlzLnNhc2pzQ29uZmlnLmxvZ2luTWVjaGFuaXNtID09PSBMb2dpbk1lY2hhbmlzbS5EZWZhdWx0KSB7XG4gICAgICBpZiAoIXVzZXJuYW1lIHx8ICFwYXNzd29yZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdBIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcmUgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCBsb2dpbiBtZWNoYW5pc20uJ1xuICAgICAgICApXG5cbiAgICAgIHJldHVybiB0aGlzLmF1dGhNYW5hZ2VyIS5sb2dJbih1c2VybmFtZSwgcGFzc3dvcmQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSByZWRpcmVjdGVkIGxvZ2luIG1lY2hhbmlzbSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIHRoZSBicm93c2VyLidcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hdXRoTWFuYWdlciEucmVkaXJlY3RlZExvZ0luKG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogTG9ncyBvdXQgb2YgdGhlIGNvbmZpZ3VyZWQgU0FTIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBsb2dPdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aE1hbmFnZXIhLmxvZ091dCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBTQVNqcyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldFNhc2pzQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnNhc2pzQ29uZmlnXG4gIH1cblxuICAvKipcbiAgICogdGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBTQVNqc1JlcXVlc3RcbiAgICogQHJldHVybnMgU0FTanNSZXF1ZXN0W11cbiAgICovXG4gIHB1YmxpYyBnZXRTYXNSZXF1ZXN0cygpIHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IFsuLi50aGlzLnJlcXVlc3RDbGllbnQhLmdldFJlcXVlc3RzKCldXG4gICAgY29uc3Qgc29ydGVkUmVxdWVzdHMgPSByZXF1ZXN0cy5zb3J0KGNvbXBhcmVUaW1lc3RhbXBzKVxuICAgIHJldHVybiBzb3J0ZWRSZXF1ZXN0c1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlYnVnIHN0YXRlLiBUdXJuaW5nIHRoaXMgb24gd2lsbCBlbmFibGUgYWRkaXRpb25hbCBsb2dnaW5nIGluIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBib29sZWFuIGluZGljYXRpbmcgZGVidWcgc3RhdGUgKG9uL29mZikuXG4gICAqL1xuICBwdWJsaWMgc2V0RGVidWdTdGF0ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2FzanNDb25maWcuZGVidWcgPSB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgYSBmaWxlIHRvIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gc2FzSm9iIC0gdGhlIHBhdGggdG8gdGhlIFNBUyBwcm9ncmFtICh1bHRpbWF0ZWx5IHJlc29sdmVzIHRvXG4gICAqICB0aGUgU0FTIGBfcHJvZ3JhbWAgcGFyYW1ldGVyIHRvIHJ1biBhIEpvYiBEZWZpbml0aW9uIG9yIFNBUyA5IFN0b3JlZFxuICAgKiAgUHJvY2VzcykuIElzIHByZXBlbmRlZCBhdCBydW50aW1lIHdpdGggdGhlIHZhbHVlIG9mIGBhcHBMb2NgLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBhcnJheSBvZiBmaWxlcyB0byBiZSB1cGxvYWRlZCwgaW5jbHVkaW5nIEZpbGUgb2JqZWN0IGFuZCBmaWxlIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSByZXF1ZXN0IFVSTCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gY29uZmlnIC0gcHJvdmlkZSBhbnkgY2hhbmdlcyB0byB0aGUgY29uZmlnIGhlcmUsIGZvciBpbnN0YW5jZSB0b1xuICAgKiBlbmFibGUvZGlzYWJsZSBgZGVidWdgLiBBbnkgY2hhbmdlIHByb3ZpZGVkIHdpbGwgb3ZlcnJpZGUgdGhlIGdsb2JhbCBjb25maWcsXG4gICAqIGZvciB0aGF0IHBhcnRpY3VsYXIgZnVuY3Rpb24gY2FsbC5cbiAgICogQHBhcmFtIGxvZ2luUmVxdWlyZWRDYWxsYmFjayAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgaWYgdGhlXG4gICAqIHVzZXIgaXMgbm90IGxvZ2dlZCBpbiAoZWcgdG8gZGlzcGxheSBhIGxvZ2luIGZvcm0pLiBUaGUgcmVxdWVzdCB3aWxsIGJlXG4gICAqIHJlc3VibWl0dGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbG9naW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBsb2FkRmlsZShcbiAgICBzYXNKb2I6IHN0cmluZyxcbiAgICBmaWxlczogVXBsb2FkRmlsZVtdLFxuICAgIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgY29uZmlnOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbG9naW5SZXF1aXJlZENhbGxiYWNrPzogKCkgPT4gYW55XG4gICkge1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc2FzanNDb25maWcsXG4gICAgICAuLi5jb25maWdcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHsgZmlsZXMsIHBhcmFtcyB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlVXBsb2FkZXIhLmV4ZWN1dGUoXG4gICAgICBzYXNKb2IsXG4gICAgICBkYXRhLFxuICAgICAgY29uZmlnLFxuICAgICAgbG9naW5SZXF1aXJlZENhbGxiYWNrXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgcmVxdWVzdCB0byBwcm9ncmFtIHNwZWNpZmllZCBpbiBgU0FTam9iYCAoY291bGQgYmUgYSBWaXlhIEpvYiwgYVxuICAgKiBTQVMgOSBTdG9yZWQgUHJvY2Vzcywgb3IgYSBTQVNqcyBTZXJ2ZXIgU3RvcmVkIFByb2dyYW0pLiBUaGUgcmVzcG9uc2VcbiAgICogb2JqZWN0IHdpbGwgYWx3YXlzIGNvbnRhaW4gdGFibGUgbmFtZXMgaW4gbG93ZXJjYXNlLCBhbmQgY29sdW1uIG5hbWVzIGluXG4gICAqIHVwcGVyY2FzZS4gVmFsdWVzIGFyZSByZXR1cm5lZCBmb3JtYXR0ZWQgYnkgZGVmYXVsdCwgdW5mb3JtYXR0ZWRcbiAgICogdmFsdWVzIGNhbiBiZSBjb25maWd1cmVkIGFzIGFuIG9wdGlvbiBpbiB0aGUgYCV3ZWJvdXRgIG1hY3JvLlxuICAgKlxuICAgKiBAcGFyYW0gc2FzSm9iIC0gdGhlIHBhdGggdG8gdGhlIFNBUyBwcm9ncmFtICh1bHRpbWF0ZWx5IHJlc29sdmVzIHRvXG4gICAqICB0aGUgU0FTIGBfcHJvZ3JhbWAgcGFyYW1ldGVyIHRvIHJ1biBhIEpvYiBEZWZpbml0aW9uIG9yIFNBUyA5IFN0b3JlZFxuICAgKiAgUHJvY2VzcykuIElzIHByZXBlbmRlZCBhdCBydW50aW1lIHdpdGggdGhlIHZhbHVlIG9mIGBhcHBMb2NgLlxuICAgKiBAcGFyYW0gZGF0YSAtIGEgSlNPTiBvYmplY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSB0YWJsZXMgdG8gYmUgc2VudCB0b1xuICAgKiBTQVMuICBGb3IgYW4gZXhhbXBsZSBvZiB0aGUgdGFibGUgc3RydWN0dXJlLCBzZWUgdGhlIHByb2plY3QgUkVBRE1FLiBUaGlzXG4gICAqIHZhbHVlIGNhbiBiZSBgbnVsbGAgaWYgbm8gaW5wdXRzIGFyZSByZXF1aXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZyAtIHByb3ZpZGUgYW55IGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBoZXJlLCBmb3IgaW5zdGFuY2UgdG9cbiAgICogZW5hYmxlL2Rpc2FibGUgYGRlYnVnYC4gQW55IGNoYW5nZSBwcm92aWRlZCB3aWxsIG92ZXJyaWRlIHRoZSBnbG9iYWwgY29uZmlnLFxuICAgKiBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSBsb2dpblJlcXVpcmVkQ2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZVxuICAgKiB1c2VyIGlzIG5vdCBsb2dnZWQgaW4gKGVnIHRvIGRpc3BsYXkgYSBsb2dpbiBmb3JtKS4gVGhlIHJlcXVlc3Qgd2lsbCBiZVxuICAgKiByZXN1Ym1pdHRlZCBhZnRlciBzdWNjZXNzZnVsIGxvZ2luLlxuICAgKiBXaGVuIHVzaW5nIGEgYGxvZ2luUmVxdWlyZWRDYWxsYmFja2AsIHRoZSBjYWxsIHRvIHRoZSByZXF1ZXN0IHdpbGwgbG9vaywgZm9yIGV4YW1wbGUsIGxpa2Ugc286XG4gICAqIGBhd2FpdCByZXF1ZXN0KHNhc0pvYlBhdGgsIGRhdGEsIGNvbmZpZywgKCkgPT4gc2V0SXNMb2dnZWRJbihmYWxzZSkpYFxuICAgKiBJZiB5b3UgYXJlIG5vdCBwYXNzaW5nIGluIGFueSBkYXRhIGFuZCBjb25maWd1cmF0aW9uLCBpdCB3aWxsIGxvb2sgbGlrZSBzbzpcbiAgICogYGF3YWl0IHJlcXVlc3Qoc2FzSm9iUGF0aCwge30sIHt9LCAoKSA9PiBzZXRJc0xvZ2dlZEluKGZhbHNlKSlgXG4gICAqIEBwYXJhbSBleHRyYVJlc3BvbnNlQXR0cmlidXRlcyAtIGEgYXJyYXkgb2YgcHJlZGVmaW5lZCB2YWx1ZXMgdGhhdCBhcmUgdXNlZFxuICAgKiB0byBwcm92aWRlIGV4dHJhIGF0dHJpYnV0ZXMgKHNhbWUgbmFtZXMgYXMgdGhvc2UgdmFsdWVzKSB0byBiZSBhZGRlZCBpbiByZXNwb25zZVxuICAgKiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBkZWNsYXJlZCBpbiBFeHRyYVJlc3BvbnNlQXR0cmlidXRlcyB0eXBlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3QoXG4gICAgc2FzSm9iOiBzdHJpbmcsXG4gICAgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgY29uZmlnOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbG9naW5SZXF1aXJlZENhbGxiYWNrPzogKCkgPT4gYW55LFxuICAgIGF1dGhDb25maWc/OiBBdXRoQ29uZmlnLFxuICAgIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzOiBFeHRyYVJlc3BvbnNlQXR0cmlidXRlc1tdID0gW11cbiAgKSB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zYXNqc0NvbmZpZyxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUlucHV0KGRhdGEpXG5cbiAgICAvLyBzdGF0dXMgaXMgdHJ1ZSBpZiB0aGUgZGF0YSBwYXNzZXMgdmFsaWRhdGlvbiBjaGVja3MgYWJvdmVcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5zdGF0dXMpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLndlYkpvYkV4ZWN1dG9yIS5leGVjdXRlKFxuICAgICAgICBzYXNKb2IsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbG9naW5SZXF1aXJlZENhbGxiYWNrLFxuICAgICAgICBhdXRoQ29uZmlnLFxuICAgICAgICBleHRyYVJlc3BvbnNlQXR0cmlidXRlc1xuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UodmFsaWRhdGlvblJlc3VsdC5tc2cpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHNlc3Npb24gaXMgYWN0aXZlLCBvciBsb2dpbiBpcyByZXF1aXJlZC5cbiAgICogQHJldHVybnMgLSBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0d28gdmFsdWVzIC0gYSBib29sZWFuIGBpc0xvZ2dlZEluYCwgYW5kIGEgc3RyaW5nIGB1c2VyTmFtZWAuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hlY2tTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhNYW5hZ2VyIS5jaGVja1Nlc3Npb24oKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENvbmZpZ3VyYXRpb24oKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwgPT09ICcnXG4gICAgKSB7XG4gICAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgdXJsID0gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3RuYW1lfWBcblxuICAgICAgICBpZiAobG9jYXRpb24ucG9ydCkgdXJsID0gYCR7dXJsfToke2xvY2F0aW9uLnBvcnR9YFxuXG4gICAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsID0gdXJsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCA9ICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCA9IHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsLnNsaWNlKDAsIC0xKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5yZXF1ZXN0Q2xpZW50KSB7XG4gICAgICB0aGlzLnJlcXVlc3RDbGllbnQgPSBuZXcgUmVxdWVzdENsaWVudChcbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwsXG4gICAgICAgIHRoaXMuc2FzanNDb25maWcuaHR0cHNBZ2VudE9wdGlvbnMsXG4gICAgICAgIHRoaXMuc2FzanNDb25maWcucmVxdWVzdEhpc3RvcnlMaW1pdCxcbiAgICAgICAgdGhpcy5zYXNqc0NvbmZpZy52ZXJib3NlXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudC5zZXRDb25maWcoXG4gICAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsLFxuICAgICAgICB0aGlzLnNhc2pzQ29uZmlnLmh0dHBzQWdlbnRPcHRpb25zXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5qb2JzUGF0aCA9IHRoaXMuc2FzanNDb25maWcucGF0aFNBUzlcblxuICAgIHRoaXMuYXV0aE1hbmFnZXIgPSBuZXcgQXV0aE1hbmFnZXIoXG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclVybCxcbiAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVHlwZSEsXG4gICAgICB0aGlzLnJlcXVlc3RDbGllbnQsXG4gICAgICB0aGlzLnJlc2VuZFdhaXRpbmdSZXF1ZXN0c1xuICAgIClcblxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcihcbiAgICAgIHRoaXMuc2FzanNDb25maWcuc2VydmVyVXJsLFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJUeXBlISxcbiAgICAgIHRoaXMuam9ic1BhdGgsXG4gICAgICB0aGlzLnJlcXVlc3RDbGllbnRcbiAgICApXG5cbiAgICB0aGlzLndlYkpvYkV4ZWN1dG9yID0gbmV3IFdlYkpvYkV4ZWN1dG9yKFxuICAgICAgdGhpcy5zYXNqc0NvbmZpZy5zZXJ2ZXJVcmwsXG4gICAgICB0aGlzLnNhc2pzQ29uZmlnLnNlcnZlclR5cGUhLFxuICAgICAgdGhpcy5qb2JzUGF0aCxcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcmVzZW5kV2FpdGluZ1JlcXVlc3RzID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMud2ViSm9iRXhlY3V0b3I/LnJlc2VuZFdhaXRpbmdSZXF1ZXN0cygpXG4gICAgYXdhaXQgdGhpcy5maWxlVXBsb2FkZXI/LnJlc2VuZFdhaXRpbmdSZXF1ZXN0cygpXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhDb25maWcsXG4gIEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBTZXJ2ZXJUeXBlXG59IGZyb20gJ0BzYXNqcy91dGlscy90eXBlcydcbmltcG9ydCB7XG4gIEVycm9yUmVzcG9uc2UsXG4gIEpvYkV4ZWN1dGlvbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3Jcbn0gZnJvbSAnLi4vLi4vdHlwZXMvZXJyb3JzJ1xuaW1wb3J0IHsgUmVxdWVzdENsaWVudCB9IGZyb20gJy4uLy4uL3JlcXVlc3QvUmVxdWVzdENsaWVudCdcbmltcG9ydCB7XG4gIGlzUmVsYXRpdmVQYXRoLFxuICBhcHBlbmRFeHRyYVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgY29udmVydFRvQ1NWXG59IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgQmFzZUpvYkV4ZWN1dG9yIH0gZnJvbSAnLi4vLi4vam9iLWV4ZWN1dGlvbi9Kb2JFeGVjdXRvcidcbmltcG9ydCB7IHBhcnNlV2Vib3V0UmVzcG9uc2UgfSBmcm9tICcuLi8uLi91dGlscy9wYXJzZVdlYm91dFJlc3BvbnNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRpbmdSZXF1c3RQcm9taXNlIHtcbiAgcHJvbWlzZTogUHJvbWlzZTxhbnk+IHwgbnVsbFxuICByZXNvbHZlOiBhbnlcbiAgcmVqZWN0OiBhbnlcbn1cbmV4cG9ydCBjbGFzcyBXZWJKb2JFeGVjdXRvciBleHRlbmRzIEJhc2VKb2JFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNlcnZlclVybDogc3RyaW5nLFxuICAgIHNlcnZlclR5cGU6IFNlcnZlclR5cGUsXG4gICAgcHJpdmF0ZSBqb2JzUGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVxdWVzdENsaWVudDogUmVxdWVzdENsaWVudFxuICApIHtcbiAgICBzdXBlcihzZXJ2ZXJVcmwsIHNlcnZlclR5cGUpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKFxuICAgIHNhc0pvYjogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBjb25maWc6IGFueSxcbiAgICBsb2dpblJlcXVpcmVkQ2FsbGJhY2s/OiBhbnksXG4gICAgYXV0aENvbmZpZz86IEF1dGhDb25maWcsXG4gICAgZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXM6IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzW10gPSBbXVxuICApIHtcbiAgICBjb25zdCBsb2dpbkNhbGxiYWNrID0gbG9naW5SZXF1aXJlZENhbGxiYWNrXG4gICAgY29uc3QgcHJvZ3JhbSA9IGlzUmVsYXRpdmVQYXRoKHNhc0pvYilcbiAgICAgID8gY29uZmlnLmFwcExvY1xuICAgICAgICA/IGNvbmZpZy5hcHBMb2MucmVwbGFjZSgvXFwvPyQvLCAnLycpICsgc2FzSm9iLnJlcGxhY2UoL15cXC8vLCAnJylcbiAgICAgICAgOiBzYXNKb2JcbiAgICAgIDogc2FzSm9iXG4gICAgbGV0IGFwaVVybCA9IGAke2NvbmZpZy5zZXJ2ZXJVcmx9JHt0aGlzLmpvYnNQYXRofS8/JHsnX3Byb2dyYW09JyArIHByb2dyYW19YFxuXG4gICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7XG4gICAgICAuLi50aGlzLmdldFJlcXVlc3RQYXJhbXMoY29uZmlnKVxuICAgIH1cblxuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9ybURhdGEgPSBnZW5lcmF0ZUZpbGVVcGxvYWRGb3JtKGZvcm1EYXRhLCBkYXRhKVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShlPy5tZXNzYWdlLCBlKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1ZXN0UGFyYW1zKSB7XG4gICAgICBpZiAocmVxdWVzdFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHJlcXVlc3RQYXJhbXNba2V5XSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVxdWVzdENsaWVudCEucG9zdChhcGlVcmwsIGZvcm1EYXRhLCBhdXRoQ29uZmlnPy5hY2Nlc3NfdG9rZW4pXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdENsaWVudCEuYXBwZW5kUmVxdWVzdChyZXMsIHNhc0pvYiwgY29uZmlnLmRlYnVnKVxuXG4gICAgICAgICAgY29uc3QganNvblJlc3BvbnNlID1cbiAgICAgICAgICAgIGNvbmZpZy5kZWJ1ZyAmJiB0eXBlb2YgcmVzLnJlc3VsdCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgPyBwYXJzZVdlYm91dFJlc3BvbnNlKHJlcy5yZXN1bHQsIGFwaVVybClcbiAgICAgICAgICAgICAgOiByZXMucmVzdWx0XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IGFwcGVuZEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgeyByZXN1bHQ6IGpzb25SZXNwb25zZSwgbG9nOiByZXMubG9nIH0sXG4gICAgICAgICAgICBleHRyYVJlc3BvbnNlQXR0cmlidXRlc1xuICAgICAgICAgIClcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goYXN5bmMgKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBKb2JFeGVjdXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50IS5hcHBlbmRSZXF1ZXN0KGUsIHNhc0pvYiwgY29uZmlnLmRlYnVnKVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKGU/Lm1lc3NhZ2UsIGUpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIWxvZ2luUmVxdWlyZWRDYWxsYmFjaykge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICAnUmVxdWVzdCBpcyBub3QgYXV0aGVudGljYXRlZC4gTWFrZSBzdXJlIC5lbnYgZmlsZSBleGlzdHMgd2l0aCB2YWxpZCBjcmVkZW50aWFscy4nLFxuICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFwcGVuZFdhaXRpbmdSZXF1ZXN0KCgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICAgICAgICAgICBzYXNKb2IsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgbG9naW5SZXF1aXJlZENhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGF1dGhDb25maWcsXG4gICAgICAgICAgICAgICAgZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAobG9naW5DYWxsYmFjaykgYXdhaXQgbG9naW5DYWxsYmFjaygpXG4gICAgICAgICAgfSBlbHNlIHJlamVjdChuZXcgRXJyb3JSZXNwb25zZShlPy5tZXNzYWdlLCBlKSlcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlXG4gIH1cbn1cblxuLyoqXG4gKiBPbmUgb2YgdGhlIGFwcHJvYWNoZXMgU0FTanMgdGFrZXMgdG8gc2VuZCB0YWJsZXMtZm9ybWF0dGVkIEpTT04gKHNlZSBSRUFETUUpXG4gKiB0byBTQVMgaXMgYXMgbXVsdGlwYXJ0IGZvcm0gZGF0YSwgd2hlcmUgZWFjaCB0YWJsZSBpcyBwcm92aWRlZCBhcyBhIHNwZWNpYWxseVxuICogZm9ybWF0dGVkIENTViBmaWxlLlxuICovXG5jb25zdCBnZW5lcmF0ZUZpbGVVcGxvYWRGb3JtID0gKGZvcm1EYXRhOiBGb3JtRGF0YSwgZGF0YTogYW55KTogRm9ybURhdGEgPT4ge1xuICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBpbiBkYXRhKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGFbdGFibGVOYW1lXSkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBuYW1lID0gdGFibGVOYW1lXG4gICAgY29uc3QgY3N2ID0gY29udmVydFRvQ1NWKGRhdGEsIHRhYmxlTmFtZSlcblxuICAgIGlmIChjc3YgPT09ICdFUlJPUjogTEFSR0UgU1RSSU5HIExFTkdUSCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBtYXggbGVuZ3RoIG9mIGEgc3RyaW5nIHZhbHVlIGluIFNBU2pzIGlzIDMyNzY1IGNoYXJhY3RlcnMuJ1xuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBuZXcgQmxvYihbY3N2XSwge1xuICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL2NzdidcbiAgICB9KVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIGZpbGUsIGAke25hbWV9LmNzdmApXG4gIH1cblxuICByZXR1cm4gZm9ybURhdGFcbn1cbiIsImltcG9ydCBTQVNqcyBmcm9tICcuL1NBU2pzJ1xuZXhwb3J0ICogZnJvbSAnLi4vLi4vdHlwZXMnXG5leHBvcnQgZGVmYXVsdCBTQVNqc1xuIiwiaW1wb3J0IHtcbiAgQXhpb3NFcnJvcixcbiAgQXhpb3NJbnN0YW5jZSxcbiAgQXhpb3NSZXF1ZXN0Q29uZmlnLFxuICBBeGlvc1JlcXVlc3RIZWFkZXJzLFxuICBBeGlvc1Jlc3BvbnNlXG59IGZyb20gJ2F4aW9zJ1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnXG5pbXBvcnQgeyBDc3JmVG9rZW4gfSBmcm9tICcuLidcbmltcG9ydCB7IGlzQXV0aG9yaXplRm9ybVJlcXVpcmVkLCBpc0xvZ0luUmVxdWlyZWQgfSBmcm9tICcuLi9hdXRoJ1xuaW1wb3J0IHtcbiAgQXV0aG9yaXplRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgSm9iRXhlY3V0aW9uRXJyb3IsXG4gIENlcnRpZmljYXRlRXJyb3Jcbn0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuaW1wb3J0IHsgU0FTanNSZXF1ZXN0LCBIdHRwQ2xpZW50LCBWZXJib3NlTW9kZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgcGFyc2VXZWJvdXRSZXNwb25zZSB9IGZyb20gJy4uL3V0aWxzL3BhcnNlV2Vib3V0UmVzcG9uc2UnXG5pbXBvcnQgeyBwcmVmaXhNZXNzYWdlIH0gZnJvbSAnQHNhc2pzL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgU0FTOUF1dGhFcnJvciB9IGZyb20gJy4uL3R5cGVzL2Vycm9ycy9TQVM5QXV0aEVycm9yJ1xuaW1wb3J0IHtcbiAgcGFyc2VHZW5lcmF0ZWRDb2RlLFxuICBwYXJzZVNvdXJjZUNvZGUsXG4gIGNyZWF0ZUF4aW9zSW5zdGFuY2Vcbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBJbnZhbGlkU0FTanNDc3JmRXJyb3IgfSBmcm9tICcuLi90eXBlcy9lcnJvcnMvSW52YWxpZFNBU2pzQ3NyZkVycm9yJ1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gJ3V0aWwnXG5cbmNvbnN0IGdldExvZ2dlciA9ICgpID0+XG4gICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5sb2dnZXIpIHx8IGNvbnNvbGVcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDbGllbnQgaW1wbGVtZW50cyBIdHRwQ2xpZW50IHtcbiAgcHJpdmF0ZSByZXF1ZXN0czogU0FTanNSZXF1ZXN0W10gPSBbXVxuICBwcml2YXRlIHJlcXVlc3RzTGltaXQ6IG51bWJlciA9IDEwXG4gIHByaXZhdGUgaHR0cEludGVyY2VwdG9yPzogbnVtYmVyXG4gIHByaXZhdGUgdmVyYm9zZU1vZGU6IFZlcmJvc2VNb2RlID0gZmFsc2VcblxuICBwcm90ZWN0ZWQgY3NyZlRva2VuOiBDc3JmVG9rZW4gPSB7IGhlYWRlck5hbWU6ICcnLCB2YWx1ZTogJycgfVxuICBwcm90ZWN0ZWQgZmlsZVVwbG9hZENzcmZUb2tlbjogQ3NyZlRva2VuIHwgdW5kZWZpbmVkXG4gIHByb3RlY3RlZCBodHRwQ2xpZW50ITogQXhpb3NJbnN0YW5jZVxuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21OZXR3b3JrRXJyb3IgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBiYXNlVXJsOiBzdHJpbmcsXG4gICAgaHR0cHNBZ2VudE9wdGlvbnM/OiBodHRwcy5BZ2VudE9wdGlvbnMsXG4gICAgcmVxdWVzdHNMaW1pdD86IG51bWJlcixcbiAgICB2ZXJib3NlTW9kZT86IFZlcmJvc2VNb2RlXG4gICkge1xuICAgIHRoaXMuY3JlYXRlSHR0cENsaWVudChiYXNlVXJsLCBodHRwc0FnZW50T3B0aW9ucylcblxuICAgIGlmIChyZXF1ZXN0c0xpbWl0KSB0aGlzLnJlcXVlc3RzTGltaXQgPSByZXF1ZXN0c0xpbWl0XG5cbiAgICBpZiAodmVyYm9zZU1vZGUpIHtcbiAgICAgIHRoaXMuc2V0VmVyYm9zZU1vZGUodmVyYm9zZU1vZGUpXG4gICAgICB0aGlzLmVuYWJsZVZlcmJvc2VNb2RlKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGJhc2VVcmw6IHN0cmluZywgaHR0cHNBZ2VudE9wdGlvbnM/OiBodHRwcy5BZ2VudE9wdGlvbnMpIHtcbiAgICB0aGlzLmNyZWF0ZUh0dHBDbGllbnQoYmFzZVVybCwgaHR0cHNBZ2VudE9wdGlvbnMpXG4gIH1cblxuICBwdWJsaWMgc2F2ZUxvY2FsU3RvcmFnZVRva2VuKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZnJlc2hUb2tlbicsIHJlZnJlc2hUb2tlbilcbiAgfVxuXG4gIHB1YmxpYyBnZXRDc3JmVG9rZW4odHlwZTogJ2dlbmVyYWwnIHwgJ2ZpbGUnID0gJ2dlbmVyYWwnKSB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdmaWxlJyA/IHRoaXMuZmlsZVVwbG9hZENzcmZUb2tlbiA6IHRoaXMuY3NyZlRva2VuXG4gIH1cblxuICBwdWJsaWMgY2xlYXJDc3JmVG9rZW5zKCkge1xuICAgIHRoaXMuY3NyZlRva2VuID0geyBoZWFkZXJOYW1lOiAnJywgdmFsdWU6ICcnIH1cbiAgICB0aGlzLmZpbGVVcGxvYWRDc3JmVG9rZW4gPSB7IGhlYWRlck5hbWU6ICcnLCB2YWx1ZTogJycgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyTG9jYWxTdG9yYWdlVG9rZW5zKCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhY2Nlc3NUb2tlbicsICcnKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWZyZXNoVG9rZW4nLCAnJylcbiAgfVxuXG4gIHB1YmxpYyByZXNldEluTWVtb3J5QXV0aFN0YXRlKCkge1xuICAgIHRoaXMuY2xlYXJDc3JmVG9rZW5zKClcbiAgICBpZiAodHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY2xlYXJMb2NhbFN0b3JhZ2VUb2tlbnMoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jbGVhckFsbENvb2tpZXMoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJBbGxDb29raWVzKCkge1xuICAgIGNvbnN0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKVxuICAgIGZvciAoY29uc3QgY29va2llIG9mIGNvb2tpZXMpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjb29raWUuc3BsaXQoJz0nKVswXS50cmltKClcbiAgICAgIGlmICghbmFtZSkgY29udGludWVcbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgTWF4LUFnZT0wOyBQYXRoPS87YFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRCYXNlVXJsKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZGVmYXVsdHMuYmFzZVVSTCB8fCAnJ1xuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHJlcXVlc3RzLCBhbiBhcnJheSBvZiBTQVNqc1JlcXVlc3QgdHlwZVxuICAgKiBAcmV0dXJucyBTQVNqc1JlcXVlc3RbXVxuICAgKi9cbiAgcHVibGljIGdldFJlcXVlc3RzID0gKCkgPT4gdGhpcy5yZXF1ZXN0c1xuXG4gIC8qKlxuICAgKiB0aGlzIG1ldGhvZCBjbGVhcnMgdGhlIHJlcXVlc3RzIGFycmF5LCBpLmUgc2V0IHRvIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgY2xlYXJSZXF1ZXN0cyA9ICgpID0+IHtcbiAgICB0aGlzLnJlcXVlc3RzID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIG1ldGhvZCBhcHBlbmRzIHRoZSByZXNwb25zZSBmcm9tIHNhc2pzIHJlcXVlc3QgdG8gcmVxdWVzdHMgYXJyYXlcbiAgICogQHBhcmFtIHJlc3BvbnNlIC0gcmVzcG9uc2UgZnJvbSBzYXNqcyByZXF1ZXN0XG4gICAqIEBwYXJhbSBwcm9ncmFtIC0gbmFtZSBvZiBwcm9ncmFtXG4gICAqIEBwYXJhbSBkZWJ1ZyAtIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGRlYnVnIHdhcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgcHVibGljIGFwcGVuZFJlcXVlc3QocmVzcG9uc2U6IGFueSwgcHJvZ3JhbTogc3RyaW5nLCBkZWJ1ZzogYm9vbGVhbikge1xuICAgIGxldCBzb3VyY2VDb2RlID0gJydcbiAgICBsZXQgZ2VuZXJhdGVkQ29kZSA9ICcnXG4gICAgbGV0IHNhc1dvcmsgPSBudWxsXG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGlmIChyZXNwb25zZT8ubG9nKSB7XG4gICAgICAgIHNvdXJjZUNvZGUgPSBwYXJzZVNvdXJjZUNvZGUocmVzcG9uc2UubG9nKVxuICAgICAgICBnZW5lcmF0ZWRDb2RlID0gcGFyc2VHZW5lcmF0ZWRDb2RlKHJlc3BvbnNlLmxvZylcblxuICAgICAgICBpZiAocmVzcG9uc2U/LnJlc3VsdCkge1xuICAgICAgICAgIHNhc1dvcmsgPSByZXNwb25zZS5yZXN1bHQuV09SS1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhc1dvcmsgPSByZXNwb25zZS5sb2dcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZT8ucmVzdWx0KSB7XG4gICAgICAgIC8vIFdlIHBhcnNlIG9ubHkgaWYgaXQncyBhIHN0cmluZywgb3RoZXJ3aXNlIGl0IHdvdWxkIHRocm93IGVycm9yXG4gICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UucmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNvdXJjZUNvZGUgPSBwYXJzZVNvdXJjZUNvZGUocmVzcG9uc2UucmVzdWx0KVxuICAgICAgICAgIGdlbmVyYXRlZENvZGUgPSBwYXJzZUdlbmVyYXRlZENvZGUocmVzcG9uc2UucmVzdWx0KVxuICAgICAgICB9XG5cbiAgICAgICAgc2FzV29yayA9IHJlc3BvbnNlLnJlc3VsdC5XT1JLXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyaW5naWZpZWRSZXN1bHQgPVxuICAgICAgdHlwZW9mIHJlc3BvbnNlPy5yZXN1bHQgPT09ICdzdHJpbmcnXG4gICAgICAgID8gcmVzcG9uc2U/LnJlc3VsdFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlPy5yZXN1bHQsIG51bGwsIDIpXG5cbiAgICB0aGlzLnJlcXVlc3RzLnB1c2goe1xuICAgICAgbG9nRmlsZTogcmVzcG9uc2U/LmxvZyB8fCBzdHJpbmdpZmllZFJlc3VsdCB8fCByZXNwb25zZSxcbiAgICAgIHNlcnZpY2VMaW5rOiBwcm9ncmFtLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgc291cmNlQ29kZSxcbiAgICAgIGdlbmVyYXRlZENvZGUsXG4gICAgICBTQVNXT1JLOiBzYXNXb3JrXG4gICAgfSlcblxuICAgIGlmICh0aGlzLnJlcXVlc3RzLmxlbmd0aCA+IHRoaXMucmVxdWVzdHNMaW1pdCkge1xuICAgICAgdGhpcy5yZXF1ZXN0cy5zcGxpY2UoMCwgMSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGU6IHN0cmluZyA9ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBvdmVycmlkZUhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fSxcbiAgICBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFQ7IGV0YWc6IHN0cmluZzsgc3RhdHVzOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoYWNjZXNzVG9rZW4sIGNvbnRlbnRUeXBlKSxcbiAgICAgIC4uLm92ZXJyaWRlSGVhZGVyc1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RDb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZXNwb25zZVR5cGU6IGNvbnRlbnRUeXBlID09PSAndGV4dC9wbGFpbicgPyAndGV4dCcgOiAnanNvbicsXG4gICAgICB3aXRoWFNSRlRva2VuOiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRUeXBlID09PSAndGV4dC9wbGFpbicpIHtcbiAgICAgIHJlcXVlc3RDb25maWcudHJhbnNmb3JtUmVzcG9uc2UgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZ2V0PFQ+KHVybCwgcmVxdWVzdENvbmZpZylcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aHJvd0lmRXJyb3IocmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihyZXNwb25zZSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICB0aGlzLmdldDxUPih1cmwsIGFjY2Vzc1Rva2VuLCBjb250ZW50VHlwZSwgb3ZlcnJpZGVIZWFkZXJzKS5jYXRjaChcbiAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IHByZWZpeE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAnRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGhhbmRsZSBlcnJvciBjYWxsYmFjay4gJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBkZWJ1Z1xuICAgICAgICApXG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb250ZW50VHlwZSAgTmV3ZXIgdmVyc2lvbiBvZiBBeGlvcyBpcyBtb3JlIHN0cmljdCBzbyBpZiB5b3UgZG9uJ3RcbiAgICogc2V0IHRoZSBjb250ZW50VHlwZSB0byBgZm9ybSBkYXRhYCB3aGlsZSBzZW5kaW5nIGEgRm9ybURhdGEgb2JqZWN0XG4gICAqIGFwcGxpY2F0aW9uL2pzb24gd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQsIGF4aW9zIHdvbuKAmXQgdHJlYXQgaXQgYXMgRm9ybURhdGEuXG4gICAqIEluc3RlYWQsIGl0IHNlcmlhbGl6ZXMgZGF0YSBhcyBKU09O4oCUcmVzdWx0aW5nIGluIGEgcGF5bG9hZCBsaWtlXG4gICAqIHtcInNvbWV0YWJsZVwiOnt9fSBhbmQgd2UgbG9zZSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBmb3JtYXR0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBvc3Q8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbicsXG4gICAgb3ZlcnJpZGVIZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge30sXG4gICAgYWRkaXRpb25hbFNldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge31cbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgLi4udGhpcy5nZXRIZWFkZXJzKGFjY2Vzc1Rva2VuLCBjb250ZW50VHlwZSksXG4gICAgICAuLi5vdmVycmlkZUhlYWRlcnNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucG9zdDxUPih1cmwsIGRhdGEsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgd2l0aFhTUkZUb2tlbjogdHJ1ZSxcbiAgICAgICAgLi4uYWRkaXRpb25hbFNldHRpbmdzXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRocm93SWZFcnJvcihyZXNwb25zZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKGUsICgpID0+XG4gICAgICAgICAgdGhpcy5wb3N0PFQ+KHVybCwgZGF0YSwgYWNjZXNzVG9rZW4sIGNvbnRlbnRUeXBlLCBvdmVycmlkZUhlYWRlcnMpXG4gICAgICAgIClcbiAgICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHV0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG92ZXJyaWRlSGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSA9IHt9XG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFQ7IGV0YWc6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0SGVhZGVycyhhY2Nlc3NUb2tlbiwgJ2FwcGxpY2F0aW9uL2pzb24nKSxcbiAgICAgIC4uLm92ZXJyaWRlSGVhZGVyc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5wdXQ8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMsIHdpdGhYU1JGVG9rZW46IHRydWUgfSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aHJvd0lmRXJyb3IocmVzcG9uc2UpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IoZSwgKCkgPT5cbiAgICAgICAgICB0aGlzLnB1dDxUPih1cmwsIGRhdGEsIGFjY2Vzc1Rva2VuLCBvdmVycmlkZUhlYWRlcnMpXG4gICAgICAgIClcbiAgICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nXG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFQ7IGV0YWc6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyhhY2Nlc3NUb2tlbiwgJ2FwcGxpY2F0aW9uL2pzb24nKVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLmRlbGV0ZTxUPih1cmwsIHsgaGVhZGVycywgd2l0aFhTUkZUb2tlbjogdHJ1ZSB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRocm93SWZFcnJvcihyZXNwb25zZSlcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihyZXNwb25zZSlcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihlLCAoKSA9PiB0aGlzLmRlbGV0ZTxUPih1cmwsIGFjY2Vzc1Rva2VuKSlcbiAgICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGF0Y2g8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogYW55ID0ge30sXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVIZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge31cbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgLi4udGhpcy5nZXRIZWFkZXJzKGFjY2Vzc1Rva2VuLCAnYXBwbGljYXRpb24vanNvbicpLFxuICAgICAgLi4ub3ZlcnJpZGVIZWFkZXJzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBhdGNoPFQ+KHVybCwgZGF0YSwgeyBoZWFkZXJzLCB3aXRoWFNSRlRva2VuOiB0cnVlIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhyb3dJZkVycm9yKHJlc3BvbnNlKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKGUsICgpID0+XG4gICAgICAgICAgdGhpcy5wYXRjaDxUPih1cmwsIGRhdGEsIGFjY2Vzc1Rva2VuKVxuICAgICAgICApXG4gICAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwbG9hZEZpbGUoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyhhY2Nlc3NUb2tlbiwgJ2FwcGxpY2F0aW9uL2pzb24nKVxuXG4gICAgaWYgKHRoaXMuZmlsZVVwbG9hZENzcmZUb2tlbj8udmFsdWUpIHtcbiAgICAgIGhlYWRlcnNbdGhpcy5maWxlVXBsb2FkQ3NyZlRva2VuLmhlYWRlck5hbWVdID1cbiAgICAgICAgdGhpcy5maWxlVXBsb2FkQ3NyZlRva2VuLnZhbHVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5odHRwQ2xpZW50LnBvc3QodXJsLCBjb250ZW50LCB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IChyZXF1ZXN0Qm9keSkgPT4gcmVxdWVzdEJvZHlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogcmVzcG9uc2UuZGF0YSxcbiAgICAgICAgZXRhZzogcmVzcG9uc2UuaGVhZGVyc1snZXRhZyddIGFzIHN0cmluZ1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBlLnJlc3BvbnNlIGFzIEF4aW9zUmVzcG9uc2VcbiAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHwgcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDQ5KSB7XG4gICAgICAgIHRoaXMucGFyc2VBbmRTZXRGaWxlVXBsb2FkQ3NyZlRva2VuKHJlc3BvbnNlKVxuXG4gICAgICAgIGlmICh0aGlzLmZpbGVVcGxvYWRDc3JmVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlKHVybCwgY29udGVudCwgYWNjZXNzVG9rZW4pXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhdXRob3JpemUgPSBhc3luYyAocmVzcG9uc2U6IHN0cmluZykgPT4ge1xuICAgIGxldCBhdXRoVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge31cblxuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnNwbGl0KCc8Ym9keT4nKVsxXS5zcGxpdCgnPC9ib2R5PicpWzBdXG4gICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIGJvZHlFbGVtZW50LmlubmVySFRNTCA9IHJlc3BvbnNlQm9keVxuXG4gICAgY29uc3QgZm9ybSA9IGJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHBsaWNhdGlvbl9hdXRob3JpemF0aW9uJylcbiAgICBhdXRoVXJsID0gZm9ybSA/IHRoaXMuYmFzZVVybCArIGZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKSA6IG51bGxcblxuICAgIGNvbnN0IGlucHV0czogYW55ID0gZm9ybT8ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKVxuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgIGlmIChpbnB1dC5uYW1lID09PSAndXNlcl9vYXV0aF9hcHByb3ZhbCcpIHtcbiAgICAgICAgaW5wdXQudmFsdWUgPSAndHJ1ZSdcbiAgICAgIH1cblxuICAgICAgcGFyYW1zW2lucHV0Lm5hbWVdID0gaW5wdXQudmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCBjc3JmVG9rZW5LZXkgPSBPYmplY3Qua2V5cyhwYXJhbXMpLmZpbmQoKGspID0+XG4gICAgICBrPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjc3JmJylcbiAgICApXG5cbiAgICBpZiAoY3NyZlRva2VuS2V5KSB7XG4gICAgICB0aGlzLmNzcmZUb2tlbi52YWx1ZSA9IHBhcmFtc1tjc3JmVG9rZW5LZXldXG4gICAgICB0aGlzLmNzcmZUb2tlbi5oZWFkZXJOYW1lID0gdGhpcy5jc3JmVG9rZW4uaGVhZGVyTmFtZSB8fCAneC1jc3JmLXRva2VuJ1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHBhcmFtc1trZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXV0aFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoIEZvcm0gVVJMIGlzIG51bGwgb3IgdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QoYXV0aFVybCwgZm9ybURhdGEsIHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiAnKi8qJywgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpXG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb2xvcnMgdG8gdGhlIHN0cmluZy5cbiAgICogSWYgdmVyYm9zZU1vZGUgaXMgc2V0IHRvICdibGVhY2hlZCcsIGNvbG9ycyBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICogQHBhcmFtIHN0ciAtIHN0cmluZyB0byBiZSBwcmV0dGlmaWVkLlxuICAgKiBAcmV0dXJucyAtIHByZXR0aWZpZWQgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHByZXR0aWZ5U3RyaW5nID0gKHN0cjogYW55KSA9PlxuICAgIGluc3BlY3Qoc3RyLCB7IGNvbG9yczogdGhpcy52ZXJib3NlTW9kZSAhPT0gJ2JsZWFjaGVkJyB9KVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBib2R5LlxuICAgKiBAcGFyYW0gYm9keSAtIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBib2R5LlxuICAgKiBAcmV0dXJucyAtIGZvcm1hdHRlZCBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlSW50ZXJjZXB0ZWRCb2R5ID0gKGJvZHk6IGFueSkgPT4ge1xuICAgIGlmICghYm9keSkgcmV0dXJuICcnXG5cbiAgICBsZXQgcGFyc2VkQm9keVxuXG4gICAgLy8gVHJpZXMgdG8gcGFyc2UgYm9keSBpbnRvIEpTT04gb2JqZWN0LlxuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZEJvZHkgPSBKU09OLnBhcnNlKGJvZHkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBwYXJzZWRCb2R5ID0gYm9keVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRCb2R5ID0gYm9keVxuICAgIH1cblxuICAgIGNvbnN0IGJvZHlMaW5lcyA9IHRoaXMucHJldHRpZnlTdHJpbmcocGFyc2VkQm9keSkuc3BsaXQoJ1xcbicpXG5cbiAgICAvLyBMZWF2ZXMgZmlyc3QgNTAgbGluZXNcbiAgICBpZiAoYm9keUxpbmVzLmxlbmd0aCA+IDUxKSB7XG4gICAgICBib2R5TGluZXMuc3BsaWNlKDUwKVxuICAgICAgYm9keUxpbmVzLnB1c2goJy4uLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHlMaW5lcy5qb2luKCdcXG4nKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBeGlvc1Jlc3BvbnNlID0gKHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0dXMsIGNvbmZpZywgcmVxdWVzdCwgZGF0YSB9ID0gcmVzcG9uc2VcblxuICAgIGNvbnN0IHJlcUhlYWRlcnMgPSByZXF1ZXN0Py5faGVhZGVyID8/ICdOb3QgcHJvdmlkZWRcXG4nXG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHJlcXVlc3Q/LnJlcz8ucmF3SGVhZGVycyA/PyBbJ05vdCBwcm92aWRlZCddXG5cbiAgICBjb25zdCByZXNIZWFkZXJzID0gdGhpcy5mb3JtYXRIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgY29uc3QgcGFyc2VkUmVzQm9keSA9IHRoaXMucGFyc2VJbnRlcmNlcHRlZEJvZHkoZGF0YSlcblxuICAgIHByb2Nlc3MubG9nZ2VyPy5pbmZvKGBIVFRQIFJlcXVlc3QgKGZpcnN0IDUwIGxpbmVzKTpcbiR7cmVxSGVhZGVyc30ke3RoaXMucGFyc2VJbnRlcmNlcHRlZEJvZHkoY29uZmlnLmRhdGEpfVxuXG5IVFRQIFJlc3BvbnNlIENvZGU6ICR7dGhpcy5wcmV0dGlmeVN0cmluZyhzdGF0dXMpfVxuXG5IVFRQIFJlc3BvbnNlIChmaXJzdCA1MCBsaW5lcyk6XG4ke3Jlc0hlYWRlcnN9JHtwYXJzZWRSZXNCb2R5ID8gYFxcblxcbiR7cGFyc2VkUmVzQm9keX1gIDogJyd9XG5gKVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF4aW9zRXJyb3IgPSAoZXJyb3I6IEF4aW9zRXJyb3IpID0+IHtcbiAgICAvLyBNZXNzYWdlIGluZGljYXRpbmcgYWJzZW50IHZhbHVlLlxuICAgIGNvbnN0IG5vVmFsdWVNZXNzYWdlID0gJ05vdCBwcm92aWRlZCdcbiAgICBjb25zdCB7IHJlc3BvbnNlLCByZXF1ZXN0LCBjb25maWcgfSA9IGVycm9yXG5cbiAgICAvLyBGYWxsYmFjayByZXF1ZXN0IG9iamVjdCB0aGF0IGNhbiBiZSBzYWZlbHkgdXNlZCB0byBmb3JtIHJlcXVlc3Qgc3VtbWFyeS5cbiAgICAvLyBfaGVhZGVyIGlzIG5vdCBwcmVzZW50IGluIHJlc3BvbnNlcyB3aXRoIHN0YXR1cyAxKipcbiAgICAvLyByYXdIZWFkZXJzIGFyZSBub3QgcHJlc2VudCBpbiByZXNwb25zZXMgd2l0aCBzdGF0dXMgMSoqXG4gICAgbGV0IGZhbGxiYWNrUmVxdWVzdCA9IHtcbiAgICAgIF9oZWFkZXI6IGAke25vVmFsdWVNZXNzYWdlfVxcbmAsXG4gICAgICByZXM6IHsgcmF3SGVhZGVyczogW25vVmFsdWVNZXNzYWdlXSB9XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgIGZhbGxiYWNrUmVxdWVzdCA9IHtcbiAgICAgICAgX2hlYWRlcjpcbiAgICAgICAgICByZXF1ZXN0Ll9oZWFkZXIgPz8gcmVxdWVzdC5fY3VycmVudFJlcXVlc3Q/Ll9oZWFkZXIgPz8gbm9WYWx1ZU1lc3NhZ2UsXG4gICAgICAgIHJlczogeyByYXdIZWFkZXJzOiByZXF1ZXN0LnJlcz8ucmF3SGVhZGVycyA/PyBbbm9WYWx1ZU1lc3NhZ2VdIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayByZXNwb25zZSBvYmplY3QgdGhhdCBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gZm9ybSByZXNwb25zZSBzdW1tYXJ5LlxuICAgIGxldCBmYWxsYmFja1Jlc3BvbnNlID0gcmVzcG9uc2UgfHwge1xuICAgICAgc3RhdHVzOiBub1ZhbHVlTWVzc2FnZSxcbiAgICAgIHJlcXVlc3Q6IGZhbGxiYWNrUmVxdWVzdCxcbiAgICAgIGNvbmZpZzogY29uZmlnIHx8IHtcbiAgICAgICAgZGF0YTogbm9WYWx1ZU1lc3NhZ2UsXG4gICAgICAgIGhlYWRlcnM6IHt9IGFzIEF4aW9zUmVxdWVzdEhlYWRlcnNcbiAgICAgIH0sXG4gICAgICBkYXRhOiBub1ZhbHVlTWVzc2FnZVxuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhdHVzLCByZXF1ZXN0OiByZXEsIGRhdGE6IHJlc0RhdGEgfSA9IGZhbGxiYWNrUmVzcG9uc2VcbiAgICBjb25zdCB7IF9oZWFkZXI6IHJlcUhlYWRlcnMsIHJlcyB9ID0gcmVxXG5cbiAgICBjb25zdCByZXNIZWFkZXJzID0gdGhpcy5mb3JtYXRIZWFkZXJzKHJlcy5yYXdIZWFkZXJzKVxuICAgIGNvbnN0IHBhcnNlZFJlc0JvZHkgPSB0aGlzLnBhcnNlSW50ZXJjZXB0ZWRCb2R5KHJlc0RhdGEpXG5cbiAgICBwcm9jZXNzLmxvZ2dlcj8uaW5mbyhgSFRUUCBSZXF1ZXN0IChmaXJzdCA1MCBsaW5lcyk6XG4ke3JlcUhlYWRlcnN9JHt0aGlzLnBhcnNlSW50ZXJjZXB0ZWRCb2R5KGNvbmZpZz8uZGF0YSl9XG5cbkhUVFAgUmVzcG9uc2UgQ29kZTogJHt0aGlzLnByZXR0aWZ5U3RyaW5nKHN0YXR1cyl9XG5cbkhUVFAgUmVzcG9uc2UgKGZpcnN0IDUwIGxpbmVzKTpcbiR7cmVzSGVhZGVyc30ke3BhcnNlZFJlc0JvZHkgPyBgXFxuXFxuJHtwYXJzZWRSZXNCb2R5fWAgOiAnJ31cbmApXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8vIENvbnZlcnRzIGFuIGFycmF5IG9mIHN0cmluZ3MgaW50byBhIHNpbmdsZSBzdHJpbmcgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgLy8gPGhlYWRlck5hbWU+OiA8aGVhZGVyVmFsdWU+XG4gIHByaXZhdGUgZm9ybWF0SGVhZGVycyA9IChyYXdIZWFkZXJzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIHJhd0hlYWRlcnMucmVkdWNlKChhY2MsIHZhbHVlLCBpKSA9PiB7XG4gICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgYWNjICs9IGAke2kgPT09IDAgPyAnJyA6ICdcXG4nfSR7dmFsdWV9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjICs9IGA6ICR7dmFsdWV9YFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdmVyYm9zZSBtb2RlLlxuICAgKiBAcGFyYW0gdmVyYm9zZU1vZGUgLSB2YWx1ZSBvZiB0aGUgdmVyYm9zZSBtb2RlLCBjYW4gYmUgdHJ1ZSwgZmFsc2Ugb3IgYmxlYWNoZWQod2l0aG91dCBleHRyYSBjb2xvcnMpLlxuICAgKi9cbiAgcHVibGljIHNldFZlcmJvc2VNb2RlID0gKHZlcmJvc2VNb2RlOiBWZXJib3NlTW9kZSkgPT4ge1xuICAgIHRoaXMudmVyYm9zZU1vZGUgPSB2ZXJib3NlTW9kZVxuXG4gICAgaWYgKHRoaXMudmVyYm9zZU1vZGUpIHRoaXMuZW5hYmxlVmVyYm9zZU1vZGUoKVxuICAgIGVsc2UgdGhpcy5kaXNhYmxlVmVyYm9zZU1vZGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIG9uIHZlcmJvc2UgbW9kZSB0byBsb2cgZXZlcnkgSFRUUCByZXNwb25zZS5cbiAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsQmFjayAtIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHRyaWdnZXJlZCBvbiBldmVyeSBIVFRQIHJlc3BvbnNlIHdpdGggdGhlIHN0YXR1cyAyKiouXG4gICAqIEBwYXJhbSBlcnJvckNhbGxCYWNrIC0gZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgdHJpZ2dlcmVkIG9uIGV2ZXJ5IEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgc3RhdHVzIGRpZmZlcmVudCBmcm9tIDIqKi5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVWZXJib3NlTW9kZSA9IChcbiAgICBzdWNjZXNzQ2FsbEJhY2sgPSB0aGlzLmhhbmRsZUF4aW9zUmVzcG9uc2UsXG4gICAgZXJyb3JDYWxsQmFjayA9IHRoaXMuaGFuZGxlQXhpb3NFcnJvclxuICApID0+IHtcbiAgICB0aGlzLmh0dHBJbnRlcmNlcHRvciA9IHRoaXMuaHR0cENsaWVudC5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxuICAgICAgc3VjY2Vzc0NhbGxCYWNrLFxuICAgICAgZXJyb3JDYWxsQmFja1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJucyBvZmYgdmVyYm9zZSBtb2RlIHRvIGxvZyBldmVyeSBIVFRQIHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVWZXJib3NlTW9kZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5odHRwSW50ZXJjZXB0b3IpIHtcbiAgICAgIHRoaXMuaHR0cENsaWVudC5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZWplY3QodGhpcy5odHRwSW50ZXJjZXB0b3IpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEhlYWRlcnMgPSAoXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogc3RyaW5nXG4gICkgPT4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHt9XG5cbiAgICBpZiAoY29udGVudFR5cGUgIT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICAgIGhlYWRlcnMuQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMuQWNjZXB0ID0gJyovKidcbiAgICB9XG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7YWNjZXNzVG9rZW59YFxuICAgIH1cbiAgICBpZiAodGhpcy5jc3JmVG9rZW4uaGVhZGVyTmFtZSAmJiB0aGlzLmNzcmZUb2tlbi52YWx1ZSkge1xuICAgICAgaGVhZGVyc1t0aGlzLmNzcmZUb2tlbi5oZWFkZXJOYW1lXSA9IHRoaXMuY3NyZlRva2VuLnZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUFuZFNldEZpbGVVcGxvYWRDc3JmVG9rZW4gPSAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGFyc2VDc3JmVG9rZW4ocmVzcG9uc2UpXG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIHRoaXMuZmlsZVVwbG9hZENzcmZUb2tlbiA9IHRva2VuXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQW5kU2V0Q3NyZlRva2VuID0gKHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBhcnNlQ3NyZlRva2VuKHJlc3BvbnNlKVxuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB0aGlzLmNzcmZUb2tlbiA9IHRva2VuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNzcmZUb2tlbiA9IChyZXNwb25zZTogQXhpb3NSZXNwb25zZSk6IENzcmZUb2tlbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdG9rZW5IZWFkZXIgPSAoXG4gICAgICByZXNwb25zZS5oZWFkZXJzWyd4LWNzcmYtaGVhZGVyJ10gYXMgc3RyaW5nXG4gICAgKT8udG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKHRva2VuSGVhZGVyKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHJlc3BvbnNlLmhlYWRlcnNbdG9rZW5IZWFkZXJdXG4gICAgICBjb25zdCBjc3JmVG9rZW4gPSB7XG4gICAgICAgIGhlYWRlck5hbWU6IHRva2VuSGVhZGVyLFxuICAgICAgICB2YWx1ZTogdG9rZW4gfHwgJydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNzcmZUb2tlblxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVFcnJvciA9IGFzeW5jIChcbiAgICBlOiBhbnksXG4gICAgY2FsbGJhY2s6IGFueSxcbiAgICBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gZS5yZXNwb25zZSBhcyBBeGlvc1Jlc3BvbnNlXG5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhvcml6ZUVycm9yKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnRcbiAgICAgICAgLmdldChlLmNvbmZpcm1VcmwsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicsIEFjY2VwdDogJyovKicgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHRocm93IHByZWZpeE1lc3NhZ2UoZXJyLCAnRXJyb3Igd2hpbGUgZ2V0dGluZyBlcnJvciBjb25maXJtVXJsLiAnKVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoaXNBdXRob3JpemVGb3JtUmVxdWlyZWQocmVzPy5kYXRhIGFzIHN0cmluZykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRob3JpemUocmVzLmRhdGEgYXMgc3RyaW5nKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShlcnIsICdFcnJvciB3aGlsZSBhdXRob3JpemluZyByZXF1ZXN0LiAnKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShcbiAgICAgICAgICBlcnIsXG4gICAgICAgICAgJ0Vycm9yIHdoaWxlIGV4ZWN1dGluZyBjYWxsYmFjayBpbiBoYW5kbGVFcnJvci4gJ1xuICAgICAgICApXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChlIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyQ3NyZlRva2VucygpXG5cbiAgICAgIHRocm93IGVcbiAgICB9XG5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEludmFsaWRTQVNqc0NzcmZFcnJvcikge1xuICAgICAgLy8gRmV0Y2hpbmcgcm9vdCBhbmQgY3JlYXRpbmcgQ1NSRiBjb29raWVcbiAgICAgIGF3YWl0IHRoaXMuaHR0cENsaWVudFxuICAgICAgICAuZ2V0KCcvJywge1xuICAgICAgICAgIHdpdGhYU1JGVG9rZW46IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29va2llID1cbiAgICAgICAgICAgIC88c2NyaXB0PmRvY3VtZW50LmNvb2tpZSA9ICcoWFNSRi1UT0tFTj0uKjsgTWF4LUFnZT04NjQwMDsgU2FtZVNpdGU9U3RyaWN0OyBQYXRoPVxcLzspJzxcXC9zY3JpcHQ+Ly5leGVjKFxuICAgICAgICAgICAgICByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICApPy5bMV1cblxuICAgICAgICAgIGlmIChjb29raWUpIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHRocm93IHByZWZpeE1lc3NhZ2UoZXJyLCAnRXJyb3Igd2hpbGUgcmUtZmV0Y2hpbmcgQ1NSRiB0b2tlbi4nKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShcbiAgICAgICAgICBlcnIsXG4gICAgICAgICAgJ0Vycm9yIHdoaWxlIGV4ZWN1dGluZyBjYWxsYmFjayBpbiBoYW5kbGVFcnJvci4gJ1xuICAgICAgICApXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHwgcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDQ5KSB7XG4gICAgICB0aGlzLnBhcnNlQW5kU2V0Q3NyZlRva2VuKHJlc3BvbnNlKVxuXG4gICAgICBpZiAodGhpcy5jc3JmVG9rZW4uaGVhZGVyTmFtZSAmJiB0aGlzLmNzcmZUb2tlbi52YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aHJvdyBwcmVmaXhNZXNzYWdlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgJ0Vycm9yIHdoaWxlIGV4ZWN1dGluZyBjYWxsYmFjayBpbiBoYW5kbGVFcnJvci4gJ1xuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihyZXNwb25zZS5jb25maWcudXJsISlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09IDUwMikge1xuICAgICAgaWYgKGRlYnVnKSB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvcigpXG4gICAgICBlbHNlIHJldHVyblxuICAgIH1cblxuICAgIGlmIChlLmlzQXhpb3NFcnJvciAmJiBlLmNvZGUgPT09ICdVTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFJykge1xuICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXJyb3IoZS5tZXNzYWdlKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGUuaXNBeGlvc0Vycm9yICYmXG4gICAgICAhcmVzcG9uc2UgJiZcbiAgICAgIGUuY29kZSA9PT0gJ0VSUl9ORVRXT1JLJyAmJlxuICAgICAgIXRoaXMuaXNSZWNvdmVyaW5nRnJvbU5ldHdvcmtFcnJvclxuICAgICkge1xuICAgICAgLy8gT3BhcXVlIEVSUl9ORVRXT1JLIHVzdWFsbHkgbWVhbnMgdGhlIHNlcnZlciByZWplY3RlZCBzdGFsZSBjcmVkZW50aWFscy5cbiAgICAgIC8vIFdpcGUgaW4tbWVtb3J5IGF1dGggc3RhdGUsIHJlLWVzdGFibGlzaCBzZXNzaW9uIHZpYSBHRVQgLyxcbiAgICAgIC8vIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIHJlcXVlc3QuXG4gICAgICB0aGlzLnJlc2V0SW5NZW1vcnlBdXRoU3RhdGUoKVxuICAgICAgdGhpcy5pc1JlY292ZXJpbmdGcm9tTmV0d29ya0Vycm9yID0gdHJ1ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmUtZXN0YWJsaXNoIHNlc3Npb24gYW5kIENTUkYgY29va2llXG4gICAgICAgIGNvbnN0IHJvb3RSZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cENsaWVudFxuICAgICAgICAgIC5nZXQoJy8nLCB7IHdpdGhYU1JGVG9rZW46IHRydWUgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4gZXJyLnJlc3BvbnNlKVxuXG4gICAgICAgIGlmIChyb290UmVzcG9uc2U/LmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBjb29raWUgPVxuICAgICAgICAgICAgLzxzY3JpcHQ+ZG9jdW1lbnQuY29va2llID0gJyhYU1JGLVRPS0VOPS4qOyBNYXgtQWdlPTg2NDAwOyBTYW1lU2l0ZT1TdHJpY3Q7IFBhdGg9XFwvOyknPFxcL3NjcmlwdD4vLmV4ZWMoXG4gICAgICAgICAgICAgIHJvb3RSZXNwb25zZS5kYXRhXG4gICAgICAgICAgICApPy5bMV1cblxuICAgICAgICAgIGlmIChjb29raWUgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5wYXJzZUFuZFNldENzcmZUb2tlbihyb290UmVzcG9uc2UpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNlc3Npb24gY291bGQgbm90IGJlIHJlY292ZXJlZCDigJQgc3VyZmFjZSBMb2dpblJlcXVpcmVkRXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21OZXR3b3JrRXJyb3IgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlLm1lc3NhZ2UpIHRocm93IGVcbiAgICBlbHNlIHRocm93IHByZWZpeE1lc3NhZ2UoZSwgJ0Vycm9yIHdoaWxlIGhhbmRsaW5nIGVycm9yLiAnKVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2U8YW55Pikge1xuICAgIGNvbnN0IGV0YWcgPSByZXNwb25zZT8uaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnNbJ2V0YWcnXSA6ICcnXG4gICAgbGV0IHBhcnNlZFJlc3BvbnNlXG4gICAgbGV0IGluY2x1ZGVTQVM5TG9nOiBib29sZWFuID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZS5kYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UgPSByZXNwb25zZS5kYXRhXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IEpTT04ucGFyc2UocGFyc2VXZWJvdXRSZXNwb25zZShyZXNwb25zZS5kYXRhKSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IHJlc3BvbnNlLmRhdGFcbiAgICAgIH1cblxuICAgICAgaW5jbHVkZVNBUzlMb2cgPSB0cnVlXG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlVG9SZXR1cm46IHtcbiAgICAgIHJlc3VsdDogVFxuICAgICAgZXRhZzogYW55XG4gICAgICBsb2c/OiBzdHJpbmdcbiAgICAgIHN0YXR1czogbnVtYmVyXG4gICAgfSA9IHtcbiAgICAgIHJlc3VsdDogcGFyc2VkUmVzcG9uc2UgYXMgVCxcbiAgICAgIGV0YWcsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgIH1cblxuICAgIGlmIChpbmNsdWRlU0FTOUxvZykge1xuICAgICAgcmVzcG9uc2VUb1JldHVybi5sb2cgPSByZXNwb25zZS5kYXRhXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlVG9SZXR1cm5cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSHR0cENsaWVudChcbiAgICBiYXNlVXJsOiBzdHJpbmcsXG4gICAgaHR0cHNBZ2VudE9wdGlvbnM/OiBodHRwcy5BZ2VudE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgaHR0cHNBZ2VudCA9IGh0dHBzQWdlbnRPcHRpb25zXG4gICAgICA/IG5ldyBodHRwcy5BZ2VudChodHRwc0FnZW50T3B0aW9ucylcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLmh0dHBDbGllbnQgPSBjcmVhdGVBeGlvc0luc3RhbmNlKGJhc2VVcmwsIGh0dHBzQWdlbnQpXG5cbiAgICB0aGlzLmh0dHBDbGllbnQuZGVmYXVsdHMudmFsaWRhdGVTdGF0dXMgPSAoc3RhdHVzKSA9PiB7XG4gICAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPD0gNDAxXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0aHJvd0lmRXJyb3IgPSAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpID0+IHtcbiAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICBjYXNlIDQwMDpcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHJlc3BvbnNlLmRhdGEuZXJyb3IgPT09ICdpbnZhbGlkX2dyYW50J1xuICAgICAgKSB7XG4gICAgICAgIC8vIEluIFNBU1ZJWUEgd2hlbiB0cnlpbmcgdG8gZ2V0IGFjY2VzcyB0b2tlbiwgaWYgYXV0aCBjb2RlIGlzIHdyb25nIHN0YXR1cyBjb2RlIHdpbGwgYmUgNDAwIHNvIGluIHN1Y2ggY2FzZSB3ZSByZXR1cm4gbG9naW4gcmVxdWlyZWQgZXJyb3IuXG4gICAgICAgIHRocm93IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IocmVzcG9uc2UuZGF0YSlcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgcmVzcG9uc2UuZGF0YS50b0xvd2VyQ2FzZSgpID09PSAnaW52YWxpZCBjc3JmIHRva2VuISdcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFNBU2pzQ3NyZkVycm9yKClcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gICAgY2FzZSA0MDE6XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IocmVzcG9uc2UuZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoKVxuICAgICAgfVxuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmRhdGE/LmVudGl0eUlEPy5pbmNsdWRlcygnbG9naW4nKSkge1xuICAgIHRocm93IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoKVxuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnc3RyaW5nJyAmJlxuICAgIGlzQXV0aG9yaXplRm9ybVJlcXVpcmVkKHJlc3BvbnNlLmRhdGEpXG4gICkge1xuICAgIHRocm93IG5ldyBBdXRob3JpemVFcnJvcihcbiAgICAgICdBdXRob3JpemF0aW9uIHJlcXVpcmVkJyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QucmVzcG9uc2VVUkxcbiAgICApXG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdzdHJpbmcnICYmXG4gICAgaXNMb2dJblJlcXVpcmVkKHJlc3BvbnNlLmRhdGEpICYmXG4gICAgIXJlc3BvbnNlLmNvbmZpZz8udXJsPy5pbmNsdWRlcygnL1NBU0xvZ29uL2xvZ2luJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IExvZ2luUmVxdWlyZWRFcnJvcigpXG4gIH1cbiAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhfcmVxdWVzdCkge1xuICAgIGNvbnN0IGF1dGhvcml6ZVJlcXVlc3RVcmwgPSByZXNwb25zZS5yZXF1ZXN0LnJlc3BvbnNlVVJMXG4gICAgdGhyb3cgbmV3IEF1dGhvcml6ZUVycm9yKHJlc3BvbnNlLmRhdGEubWVzc2FnZSwgYXV0aG9yaXplUmVxdWVzdFVybClcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jb25maWc/LnVybD8uaW5jbHVkZXMoJ3Nhc0F1dGhFcnJvcicpKSB7XG4gICAgdGhyb3cgbmV3IFNBUzlBdXRoRXJyb3IoKVxuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBwYXJzZUVycm9yKHJlc3BvbnNlLmRhdGEgYXMgc3RyaW5nKVxuXG4gIGlmIChlcnJvcikge1xuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuY29uc3QgcGFyc2VFcnJvciA9IChkYXRhOiBzdHJpbmcpID0+IHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2VKc29uID0gSlNPTi5wYXJzZShkYXRhPy5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnICcpKVxuICAgIGlmIChyZXNwb25zZUpzb24uZXJyb3JDb2RlICYmIHJlc3BvbnNlSnNvbi5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGlvbkVycm9yKFxuICAgICAgICByZXNwb25zZUpzb24uZXJyb3JDb2RlLFxuICAgICAgICByZXNwb25zZUpzb24ubWVzc2FnZSxcbiAgICAgICAgZGF0YT8ucmVwbGFjZSgvW1xcblxccl0vZywgJyAnKVxuICAgICAgKVxuICAgIH1cbiAgfSBjYXRjaCAoXykge31cblxuICB0cnkge1xuICAgIGNvbnN0IGhhc0Vycm9yID0gZGF0YT8uaW5jbHVkZXMoJ3tcImVycm9yQ29kZScpXG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGRhdGEuc3BsaXQoJ3tcImVycm9yQ29kZScpXG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBlcnJvciA9ICd7XCJlcnJvckNvZGUnICsgcGFydHNbMV0uc3BsaXQoJ1wifScpWzBdICsgJ1wifSdcbiAgICAgICAgY29uc3QgZXJyb3JKc29uID0gSlNPTi5wYXJzZShlcnJvci5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnICcpKVxuICAgICAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIGVycm9ySnNvbi5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JKc29uLm1lc3NhZ2UsXG4gICAgICAgICAgZGF0YT8ucmVwbGFjZSgvW1xcblxccl0vZywgJ1xcbicpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBoYXNFcnJvciA9ICEhZGF0YT8ubWF0Y2goL3N0b3JlZCBwcm9jZXNzIG5vdCBmb3VuZDogL2kpXG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGRhdGEuc3BsaXQoL3N0b3JlZCBwcm9jZXNzIG5vdCBmb3VuZDogL2kpXG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzdG9yZWRQcm9jZXNzUGF0aCA9IHBhcnRzWzFdLnNwbGl0KCc8aT4nKVsxXS5zcGxpdCgnPC9pPicpWzBdXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBzdG9yZWRQcm9jZXNzUGF0aC5lbmRzV2l0aCgncnVubmVyJylcbiAgICAgICAgICA/IGBTQVNKUyBydW5uZXIgbm90IGZvdW5kLiBIZXJlJ3MgdGhlIGxpbmsgKGh0dHBzOi8vY2xpLnNhc2pzLmlvL2F1dGgvI3Nhc2pzLXJ1bm5lcikgdG8gdGhlIFNBUyBjb2RlIGZvciByZWdpc3RlcmluZyB0aGUgU0FTanMgcnVubmVyYFxuICAgICAgICAgIDogYFN0b3JlZCBwcm9jZXNzIG5vdCBmb3VuZDogJHtzdG9yZWRQcm9jZXNzUGF0aH1gXG4gICAgICAgIHJldHVybiBuZXcgSm9iRXhlY3V0aW9uRXJyb3IoNTAwLCBtZXNzYWdlLCAnJylcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGVyZSBhcmUgc29tZSBlZGdlIGNhc2VzIGluIHdoaWNoIHRoZSBTQVMgbXBfYWJvcnQgbWFjcm9cbiAgICAvLyAoaHR0cHM6Ly9jb3JlLnNhc2pzLmlvL21wX19hYm9ydF84c2FzLmh0bWwpIGlzIHVuYWJsZSB0b1xuICAgIC8vIHByb3ZpZGUgYSBjbGVhbiBleGl0LiAgSW4gdGhpcyBjYXNlIHRoZSBKU09OIHJlc3BvbnNlIHdpbGxcbiAgICAvLyBiZSB3cmFwcGVkIGluID4+d2Vib3V0QkVHSU48PCBhbmQgPj53ZWJvdXRFTkQ8PCBzdHJpbmdzLlxuICAgIC8vIFRoZXJlZm9yZSwgaWYgdGhlIGZpcnN0IHN0cmluZyBleGlzdHMsIHdlIHdvbid0IHRocm93IGFuXG4gICAgLy8gZXJyb3IganVzdCB5ZXQgKHRoZSBwYXJzZXIgbWF5IHlldCB0aHJvdyBvbmUgaW5zdGVhZClcbiAgICBjb25zdCBoYXNFcnJvciA9XG4gICAgICAhZGF0YT8ubWF0Y2goLz4+d2Vib3V0QkVHSU48PC8pICYmXG4gICAgICAhIWRhdGE/Lm1hdGNoKC9TdG9yZWQgUHJvY2VzcyBFcnJvci9pKSAmJlxuICAgICAgISFkYXRhPy5tYXRjaCgvVGhpcyByZXF1ZXN0IGNvbXBsZXRlZCB3aXRoIGVycm9ycy4vaSlcbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZGF0YS5zcGxpdCgnPGgyPlNBUyBMb2c8L2gyPicpXG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBsb2cgPSBwYXJ0c1sxXS5zcGxpdCgnPHByZT4nKVsxXS5zcGxpdCgnPC9wcmU+JylbMF1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBUaGlzIHJlcXVlc3QgY29tcGxldGVkIHdpdGggZXJyb3JzLmBcbiAgICAgICAgcmV0dXJuIG5ldyBKb2JFeGVjdXRpb25FcnJvcig1MDAsIG1lc3NhZ2UsIGxvZylcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dCB7XG4gIG5hbWU6IHN0cmluZ1xuICBpZDogc3RyaW5nXG4gIGNyZWF0ZWRCeTogc3RyaW5nXG4gIHZlcnNpb246IG51bWJlclxuICBhdHRyaWJ1dGVzPzogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdENvbnRleHRJbnB1dCB7XG4gIG5hbWU/OiBzdHJpbmdcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgbGF1bmNoQ29udGV4dD86IHsgbmFtZTogc3RyaW5nIH1cbiAgZW52aXJvbm1lbnQ/OiB7IG9wdGlvbnM/OiBzdHJpbmdbXTsgYXV0b0V4ZWNMaW5lcz86IHN0cmluZ1tdIH1cbiAgYXR0cmlidXRlcz86IGFueVxuICBhdXRob3JpemVkVXNlcnM/OiBzdHJpbmdbXVxuICBhdXRob3JpemVBbGxBdXRoZW50aWNhdGVkVXNlcnM/OiBib29sZWFuXG4gIGlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEFsbEF0dHJpYnV0ZXMge1xuICBhdHRyaWJ1dGVzOiB7XG4gICAgcmV1c2VTZXJ2ZXJQcm9jZXNzZXM6IGJvb2xlYW5cbiAgICBydW5TZXJ2ZXJBczogc3RyaW5nXG4gIH1cbiAgbW9kaWZpZWRUaW1lU3RhbXA6IHN0cmluZ1xuICBjcmVhdGVkQnk6IHN0cmluZ1xuICBjcmVhdGlvblRpbWVTdGFtcDogc3RyaW5nXG4gIGxhdW5jaFR5cGU6IHN0cmluZ1xuICBlbnZpcm9ubWVudDoge1xuICAgIGF1dG9FeGVjTGluZXM6IFtzdHJpbmddXG4gIH1cbiAgbGF1bmNoQ29udGV4dDoge1xuICAgIGNvbnRleHROYW1lOiBzdHJpbmdcbiAgfVxuICBtb2RpZmllZEJ5OiBzdHJpbmdcbiAgaWQ6IHN0cmluZ1xuICB2ZXJzaW9uOiBudW1iZXJcbiAgbmFtZTogc3RyaW5nXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENzcmZUb2tlbiB7XG4gIGhlYWRlck5hbWU6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblF1ZXJ5IHtcbiAgX3Byb2dyYW06IHN0cmluZ1xuICBfZGVidWc/OiBudW1iZXJcbn1cbiIsImltcG9ydCB7IExpbmsgfSBmcm9tICcuL0xpbmsnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHBhcmVudFVyaTogc3RyaW5nXG4gIGxpbmtzOiBMaW5rW11cbn1cbiIsImltcG9ydCB7IExpbmsgfSBmcm9tICcuL0xpbmsnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9sZGVyIHtcbiAgaWQ6IHN0cmluZ1xuICB1cmk6IHN0cmluZ1xuICBsaW5rczogTGlua1tdXG4gIG1lbWJlckNvdW50OiBudW1iZXJcbn1cbiIsImltcG9ydCB7IExpbmsgfSBmcm9tICcuL0xpbmsnXG5pbXBvcnQgeyBKb2JSZXN1bHQgfSBmcm9tICcuL0pvYlJlc3VsdCdcbmltcG9ydCB7IExvZ1N0YXRpc3RpY3MgfSBmcm9tICcuL0xvZ1N0YXRpc3RpY3MnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9iIHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgdXJpOiBzdHJpbmdcbiAgY3JlYXRlZEJ5OiBzdHJpbmdcbiAgY29kZT86IHN0cmluZ1xuICBsaW5rczogTGlua1tdXG4gIHJlc3VsdHM6IEpvYlJlc3VsdFxuICBlcnJvcj86IGFueVxuICBsb2dTdGF0aXN0aWNzOiBMb2dTdGF0aXN0aWNzXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIEpvYkRlZmluaXRpb24ge1xuICBjb2RlOiBzdHJpbmdcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgSm9iUmVzdWx0IHtcbiAgJ193ZWJvdXQuanNvbic6IHN0cmluZ1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBMaW5rIHtcbiAgbWV0aG9kOiBzdHJpbmdcbiAgcmVsOiBzdHJpbmdcbiAgaHJlZjogc3RyaW5nXG4gIHVyaTogc3RyaW5nXG4gIHR5cGU6IHN0cmluZ1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBMb2dpbk9wdGlvbnMge1xuICBvbkxvZ2dlZE91dD86ICgpID0+IFByb21pc2U8Ym9vbGVhbj5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2dpblJlc3VsdCB7XG4gIGlzTG9nZ2VkSW46IGJvb2xlYW5cbiAgdXNlck5hbWU6IHN0cmluZ1xuICB1c2VyTG9uZ05hbWU6IHN0cmluZ1xufVxuZXhwb3J0IGludGVyZmFjZSBMb2dpblJlc3VsdEludGVybmFsIHtcbiAgaXNMb2dnZWRJbjogYm9vbGVhblxuICB1c2VyTmFtZTogc3RyaW5nXG4gIHVzZXJMb25nTmFtZTogc3RyaW5nXG4gIGxvZ2luRm9ybT86IGFueVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb2xsT3B0aW9ucyB7XG4gIG1heFBvbGxDb3VudDogbnVtYmVyXG4gIHBvbGxJbnRlcnZhbDogbnVtYmVyIC8vIG1pbGxpc2Vjb25kc1xuICBwb2xsU3RyYXRlZ3k/OiBQb2xsU3RyYXRlZ3lcbiAgc3RyZWFtTG9nPzogYm9vbGVhblxuICBsb2dGb2xkZXJQYXRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFBvbGxTdHJhdGVneSA9IFBvbGxPcHRpb25zW11cbiIsImltcG9ydCB7IENzcmZUb2tlbiB9IGZyb20gJy4uJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnQge1xuICBnZXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogc3RyaW5nLFxuICAgIG92ZXJyaWRlSGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfVxuICApOiBQcm9taXNlPHsgcmVzdWx0OiBUOyBldGFnOiBzdHJpbmcgfT5cblxuICBwb3N0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVIZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9XG4gICk6IFByb21pc2U8eyByZXN1bHQ6IFQ7IGV0YWc6IHN0cmluZyB9PlxuXG4gIHB1dDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvdmVycmlkZUhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH1cbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+XG5cbiAgZGVsZXRlPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogVDsgZXRhZzogc3RyaW5nIH0+XG5cbiAgZ2V0Q3NyZlRva2VuKHR5cGU6ICdnZW5lcmFsJyB8ICdmaWxlJyk6IENzcmZUb2tlbiB8IHVuZGVmaW5lZFxuICBzYXZlTG9jYWxTdG9yYWdlVG9rZW4oYWNjZXNzVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpOiB2b2lkXG4gIGNsZWFyQ3NyZlRva2VucygpOiB2b2lkXG4gIGNsZWFyTG9jYWxTdG9yYWdlVG9rZW5zKCk6IHZvaWRcbiAgZ2V0QmFzZVVybCgpOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTQVNqc1JlcXVlc3Qge1xuICBzZXJ2aWNlTGluazogc3RyaW5nXG4gIHRpbWVzdGFtcDogRGF0ZVxuICBzb3VyY2VDb2RlOiBzdHJpbmdcbiAgZ2VuZXJhdGVkQ29kZTogc3RyaW5nXG4gIGxvZ0ZpbGU6IHN0cmluZ1xuICBTQVNXT1JLOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXNqc1BhcnNlZFJlc3BvbnNlPFQ+IHtcbiAgcmVzdWx0OiBUXG4gIGxvZzogc3RyaW5nXG4gIGV0YWc6IHN0cmluZ1xuICBzdGF0dXM6IG51bWJlclxuICBwcmludE91dHB1dD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBWZXJib3NlTW9kZSA9IGJvb2xlYW4gfCAnYmxlYWNoZWQnXG4iLCJpbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcydcbmltcG9ydCB7IFNlcnZlclR5cGUgfSBmcm9tICdAc2FzanMvdXRpbHMvdHlwZXMnXG5pbXBvcnQgeyBWZXJib3NlTW9kZSB9IGZyb20gJy4uL3R5cGVzJ1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFNBU2pzIGluc3RhbmNlIC0gZWcgd2hlcmUgYW5kIGhvdyB0b1xuICogY29ubmVjdCB0byBTQVMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTQVNqc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gKGluY2x1ZGluZyBodHRwIHByb3RvY29sIGFuZCBwb3J0KSBvZiB0aGUgU0FTIFNlcnZlci5cbiAgICogQ2FuIGJlIG9taXR0ZWQsIGVnIGlmIHNlcnZpbmcgZGlyZWN0bHkgZnJvbSB0aGUgU0FTIFdlYiBTZXJ2ZXIgb3IgYmVpbmdcbiAgICogc3RyZWFtZWQuXG4gICAqL1xuICBzZXJ2ZXJVcmw6IHN0cmluZyA9ICcnXG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIFNUUCBQcm9jZXNzIFdlYiBBcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQgdGhlIGFkYXB0ZXJcbiAgICogd2lsbCB1c2UgJy9TQVNqc0FwaS9zdHAvZXhlY3V0ZScgb24gU0FTIEpTLlxuICAgKi9cbiAgcGF0aFNBU0pTOiBzdHJpbmcgPSAnJ1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBTdG9yZWQgUHJvY2VzcyBXZWIgQXBwbGljYXRpb24uICBCeSBkZWZhdWx0IHRoZSBhZGFwdGVyXG4gICAqIHdpbGwgdXNlICcvU0FTU3RvcmVkUHJvY2Vzcy9kbycgb24gU0FTIDkuXG4gICAqL1xuICBwYXRoU0FTOTogc3RyaW5nID0gJydcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgSm9iIEV4ZWN1dGlvbiBXZWIgQXBwbGljYXRpb24uICBCeSBkZWZhdWx0IHRoZSBhZGFwdGVyXG4gICAqIHdpbGwgdXNlICcvU0FTSm9iRXhlY3V0aW9uJyBvbiBTQVMgVml5YS5cbiAgICovXG4gIHBhdGhTQVNWaXlhOiBzdHJpbmcgPSAnJ1xuICAvKipcbiAgICogVGhlIGFwcExvYyBpcyB0aGUgcGFyZW50IGZvbGRlciB1bmRlciB3aGljaCB0aGUgU0FTIHNlcnZpY2VzIChTVFBzIG9yIEpvYlxuICAgKiBFeGVjdXRpb24gU2VydmljZXMpIGFyZSBzdG9yZWQuICBXZSByZWNvbW1lbmQgdGhhdCBlYWNoIGFwcCBpcyBzdG9yZWQgaW5cbiAgICogYSBkZWRpY2F0ZWQgcGFyZW50IGZvbGRlciAodGhlIGFwcExvYykgYW5kIHRoZSBzZXJ2aWNlcyBhcmUgZ3JvdXBlZCBpbnNpZGVcbiAgICogc3ViZm9sZGVycyB3aXRoaW4gdGhlIGFwcExvYyAtIGFsbG93aW5nIGZ1bmN0aW9uYWxpdHkgdG8gYmUgcmVzdHJpY3RlZFxuICAgKiBhY2NvcmRpbmcgdG8gdGhvc2UgZ3JvdXBzIGF0IGJhY2tlbmQuXG4gICAqIFdoZW4gdXNpbmcgYXBwTG9jLCB0aGUgcGF0aHMgcHJvdmlkZWQgaW4gdGhlIGByZXF1ZXN0YCBmdW5jdGlvbiBzaG91bGQgYmVcbiAgICogX3dpdGhvdXRfIGEgbGVhZGluZyBzbGFzaCAoLykuXG4gICAqL1xuICBhcHBMb2M6IHN0cmluZyA9ICcnXG4gIC8qKlxuICAgKiBDYW4gYmUgYFNBUzlgIG9yIGBTQVNWSVlBYC5cbiAgICovXG4gIHNlcnZlclR5cGU6IFNlcnZlclR5cGUgfCBudWxsID0gbnVsbFxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBlbmFibGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcuXG4gICAqL1xuICBkZWJ1ZzogYm9vbGVhbiA9IHRydWVcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZSB0aGF0IHdpbGwgbG9nIGEgc3VtbWFyeSBvZiBldmVyeSBIVFRQIHJlc3BvbnNlLlxuICAgKi9cbiAgdmVyYm9zZT86IFZlcmJvc2VNb2RlID0gdHJ1ZVxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXB1dGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBWaXlhIHNlcnZpY2VzIGRpcmVjdGx5LlxuICAgKiBFeGFtcGxlIHZhbHVlOiAnU0FTIEpvYiBFeGVjdXRpb24gY29tcHV0ZSBjb250ZXh0J1xuICAgKi9cbiAgY29udGV4dE5hbWU6IHN0cmluZyA9ICcnXG4gIC8qKlxuICAgKiBJZiBpdCdzIGBmYWxzZWAgYWRhcHRlciB3aWxsIHVzZSB0aGUgSkVTIEFQSSBhcyBjb25uZWN0aW9uIGFwcHJvYWNoLiAgVG8gZW5oYW5jZSBWSVlBXG4gICAqIHBlcmZvcm1hbmNlLCBzZXQgdG8gYHRydWVgIGFuZCBwcm92aWRlIGEgYGNvbnRleHROYW1lYCBvbiB3aGljaCB0byBydW5cbiAgICogdGhlIGNvZGUuICBXaGVuIHJ1bm5pbmcgb24gYSBuYW1lZCBjb250ZXh0LCB0aGUgY29kZSBleGVjdXRlcyB1bmRlciB0aGVcbiAgICogdXNlciBpZGVudGl0eS4gIFdoZW4gcnVubmluZyBhcyBhIEpvYiBFeGVjdXRpb24gc2VydmljZSwgdGhlIGNvZGUgcnVuc1xuICAgKiB1bmRlciB0aGUgaWRlbnRpdHkgaW4gdGhlIEpFUyBjb250ZXh0LiAgSWYgYHVzZUNvbXB1dGVBcGlgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgdGhlIHNlcnZpY2Ugd2lsbCBydW4gYXMgYSBKb2IsIGV4Y2VwdFxuICAgKiB0cmlnZ2VyZWQgdXNpbmcgdGhlIEFQSXMgaW5zdGVhZCBvZiB0aGUgSm9iIEV4ZWN1dGlvbiBXZWIgU2VydmljZSBicm9rZXIuXG4gICAqL1xuICB1c2VDb21wdXRlQXBpOiBib29sZWFuIHwgbnVsbCA9IG51bGxcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNldHRpbmcgdG8gY29uZmlndXJlIEhUVFBTIEFnZW50LlxuICAgKiBCeSBwcm92aWRpbmcgYGtleWAsIGBjZXJ0YCwgYGNhYCB0byBjb25uZWN0IHdpdGggc2VydmVyXG4gICAqIE90aGVyIG9wdGlvbnMgY2FuIGJlIHNldCBgcmVqZWN0VW5hdXRob3JpemVkYCBhbmQgYHJlcXVlc3RDZXJ0YFxuICAgKi9cbiAgaHR0cHNBZ2VudE9wdGlvbnM/OiBodHRwcy5BZ2VudE9wdGlvbnNcbiAgLyoqXG4gICAqIFN1cHBvcnRlZCBsb2dpbiBtZWNoYW5pc21zIGFyZSAtIFJlZGlyZWN0ZWQgYW5kIERlZmF1bHRcbiAgICovXG4gIGxvZ2luTWVjaGFuaXNtOiBMb2dpbk1lY2hhbmlzbSA9IExvZ2luTWVjaGFuaXNtLkRlZmF1bHRcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNldHRpbmcgdG8gY29uZmlndXJlIHJlcXVlc3QgaGlzdG9yeSBsaW1pdC4gSW5jcmVhc2luZyB0aGlzIGxpbWl0XG4gICAqIG1heSBhZmZlY3QgYnJvd3NlciBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aXRoIGRlYnVnIChsb2dzKSBlbmFibGVkLlxuICAgKi9cbiAgcmVxdWVzdEhpc3RvcnlMaW1pdD86IG51bWJlciA9IDEwXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzZXR0aW5nLiBXaGVuIGB0cnVlYCwgdGhlIHJlcXVlc3QgcnVucyBhcyBhIFZpeWEgZXhlY3V0aW9uIHRhc2sg4oCUXG4gICAqIGFwcGVuZHMgYF9leGVjdXRpb25UYXNrcz10cnVlYCB0byB0aGUgcmVxdWVzdCBVUkwuIE9ubHkgYXBwbGllcyB0byB0aGUgVml5YVxuICAgKiB3ZWIgam9icyBwYXRoLCBpLmUuIHdoZW4gYHNlcnZlclR5cGUgPT09IFNBU1ZJWUFgIEFORFxuICAgKiBgdXNlQ29tcHV0ZUFwaWAgaXMgYG51bGxgL2B1bmRlZmluZWRgLiBIYXMgbm8gZWZmZWN0IHdoZW4gYHVzZUNvbXB1dGVBcGlgXG4gICAqIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgLlxuICAgKi9cbiAgcnVuQXNUYXNrPzogYm9vbGVhbiA9IGZhbHNlXG59XG5cbmV4cG9ydCBlbnVtIExvZ2luTWVjaGFuaXNtIHtcbiAgRGVmYXVsdCA9ICdEZWZhdWx0JyxcbiAgUmVkaXJlY3RlZCA9ICdSZWRpcmVjdGVkJ1xufVxuIiwiaW1wb3J0IHsgTGluayB9IGZyb20gJy4vTGluaydcbmltcG9ydCB7IFNlc3Npb25NYW5hZ2VyIH0gZnJvbSAnLi4vU2Vzc2lvbk1hbmFnZXInXG5cbmV4cG9ydCBlbnVtIFNlc3Npb25TdGF0ZSB7XG4gIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICBSdW5uaW5nID0gJ3J1bm5pbmcnLFxuICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICBJZGxlID0gJ2lkbGUnLFxuICBVbmF2YWlsYWJsZSA9ICd1bmF2YWlsYWJsZScsXG4gIE5vU3RhdGUgPSAnJyxcbiAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gIEVycm9yID0gJ2Vycm9yJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICBpZDogc3RyaW5nXG4gIHN0YXRlOiBTZXNzaW9uU3RhdGVcbiAgc3RhdGVVcmw6IHN0cmluZ1xuICBsaW5rczogTGlua1tdXG4gIGF0dHJpYnV0ZXM6IHtcbiAgICBzZXNzaW9uSW5hY3RpdmVUaW1lb3V0OiBudW1iZXJcbiAgfVxuICBjcmVhdGlvblRpbWVTdGFtcDogc3RyaW5nXG4gIGV0YWc6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25WYXJpYWJsZSB7XG4gIHZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKb2JTZXNzaW9uTWFuYWdlciB7XG4gIHNlc3Npb246IFNlc3Npb25cbiAgc2Vzc2lvbk1hbmFnZXI6IFNlc3Npb25NYW5hZ2VyXG59XG4iLCJpbXBvcnQgeyBBcmd1bWVudEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnXG5cbmV4cG9ydCBjbGFzcyBUYWJsZXMge1xuICBfdGFibGVzOiB7IFttYWNyb05hbWU6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIGFueT4gfVxuXG4gIGNvbnN0cnVjdG9yKHRhYmxlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBtYWNyb05hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhYmxlcyA9IHt9XG5cbiAgICB0aGlzLmFkZCh0YWJsZSwgbWFjcm9OYW1lKVxuICB9XG5cbiAgYWRkKHRhYmxlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgbWFjcm9OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGFibGUgJiYgbWFjcm9OYW1lKSB7XG4gICAgICBpZiAoISh0YWJsZSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhcnJheScpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG1hY3JvTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ1NlY29uZCBhcmd1bWVudCBtdXN0IGJlIHN0cmluZycpXG4gICAgICB9XG4gICAgICBpZiAoIWlzTmFOKE51bWJlcihtYWNyb05hbWVbbWFjcm9OYW1lLmxlbmd0aCAtIDFdKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01hY3JvIG5hbWUgY2Fubm90IGhhdmUgbnVtYmVyIGF0IHRoZSBlbmQnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBhcmd1bWVudHMnKVxuICAgIH1cblxuICAgIHRoaXMuX3RhYmxlc1ttYWNyb05hbWVdID0gdGFibGVcbiAgfVxufVxuIiwiLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgZmlsZSB1cGxvYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkRmlsZSB7XG4gIGZpbGU6IEZpbGVcbiAgZmlsZU5hbWU6IHN0cmluZ1xufVxuIiwiaW1wb3J0IHsgV3JpdGVTdHJlYW0gYXMgRnNXcml0ZVN0cmVhbSB9IGZyb20gJ2ZzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlU3RyZWFtIGV4dGVuZHMgRnNXcml0ZVN0cmVhbSB7XG4gIHdyaXRlKFxuICAgIGNodW5rOiBhbnksXG4gICAgZW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZCksXG4gICAgY2I/OiAoZXJyb3I6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApOiBib29sZWFuXG4gIHBhdGg6IHN0cmluZyB8IEJ1ZmZlclxufVxuIiwiZXhwb3J0IGNsYXNzIEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBcmd1bWVudEVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBBcmd1bWVudEVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEF1dGhvcml6ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjb25maXJtVXJsOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQXV0aG9yaXplRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEF1dGhvcml6ZUVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiY29uc3QgaW5zdHJ1Y3Rpb25zVG9GaXggPVxuICAnaHR0cHM6Ly9naXRodWIuY29tL3Nhc2pzL2NsaS9pc3N1ZXMvMTE4MSNpc3N1ZWNvbW1lbnQtMTA5MDYzODU4NCdcblxuZXhwb3J0IGNsYXNzIENlcnRpZmljYXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYCR7bWVzc2FnZX1cXG5QbGVhc2UgdmlzaXQgdGhlIGxpbmsgYmVsb3cgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhpcyBpc3N1ZTpcXG4tICR7aW5zdHJ1Y3Rpb25zVG9GaXh9XFxuYFxuICAgIClcbiAgICB0aGlzLm5hbWUgPSAnQ2VydGlmaWNhdGVFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQ2VydGlmaWNhdGVFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IEpvYiB9IGZyb20gJy4uL0pvYidcblxuZXhwb3J0IGNsYXNzIENvbXB1dGVKb2JFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGpvYjogSm9iLFxuICAgIHB1YmxpYyBsb2c6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcignRXJyb3I6IEpvYiBleGVjdXRpb24gZmFpbGVkJylcbiAgICB0aGlzLm5hbWUgPSAnQ29tcHV0ZUpvYkV4ZWN1dGlvbkVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb21wdXRlSm9iRXhlY3V0aW9uRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgRXJyb3JSZXNwb25zZSB7XG4gIGVycm9yOiBFcnJvckJvZHlcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbHM/OiBhbnksIHJhdz86IGFueSkge1xuICAgIGxldCBkZXRhaWxzU3RyaW5nID0gZGV0YWlsc1xuXG4gICAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGV0YWlsc1N0cmluZyA9IEpTT04ucGFyc2UoZGV0YWlscylcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByYXcgPSBkZXRhaWxzXG4gICAgICAgIGRldGFpbHNTdHJpbmcgPSAnJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZXJyb3IgPSB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgZGV0YWlsczogZGV0YWlsc1N0cmluZyxcbiAgICAgIHJhd1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQm9keSB7XG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBkZXRhaWxzOiBhbnlcbiAgcmF3OiBhbnlcbn1cbiIsImV4cG9ydCBjbGFzcyBJbnRlcm5hbFNlcnZlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignRXJyb3I6IEludGVybmFsIHNlcnZlciBlcnJvci4nKVxuXG4gICAgdGhpcy5uYW1lID0gJ0ludGVybmFsU2VydmVyRXJyb3InXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSW50ZXJuYWxTZXJ2ZXJFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBJbnZhbGlkSnNvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignRXJyb3I6IGludmFsaWQgSnNvbiBzdHJpbmcnKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkSnNvbkVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBJbnZhbGlkSnNvbkVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEludmFsaWRTQVNqc0NzcmZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIENTUkYgdG9rZW4hJ1xuXG4gICAgc3VwZXIoYEF1dGggZXJyb3I6ICR7bWVzc2FnZX1gKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkU0FTanNDc3JmRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEludmFsaWRTQVNqc0NzcmZFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBKb2JFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVycm9yQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVzdWx0OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYEVycm9yIENvZGUgJHtlcnJvckNvZGV9OiAke2Vycm9yTWVzc2FnZX1gKVxuICAgIHRoaXMubmFtZSA9ICdKb2JFeGVjdXRpb25FcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSm9iRXhlY3V0aW9uRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgSm9iU3RhdGVQb2xsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHVibGljIG9yaWdpbmFsRXJyb3I6IEVycm9yXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYEVycm9yIHdoaWxlIHBvbGxpbmcgam9iIHN0YXRlIGZvciBqb2IgJHtpZH06ICR7XG4gICAgICAgIG9yaWdpbmFsRXJyb3IubWVzc2FnZSB8fCBvcmlnaW5hbEVycm9yXG4gICAgICB9YFxuICAgIClcbiAgICB0aGlzLm5hbWUgPSAnSm9iU3RhdGVQb2xsRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEpvYlN0YXRlUG9sbEVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEpzb25QYXJzZUFycmF5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdDYW4gbm90IHBhcnNlIGFycmF5IG9iamVjdCB0byBqc29uLicpXG4gICAgdGhpcy5uYW1lID0gJ0pzb25QYXJzZUFycmF5RXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEpzb25QYXJzZUFycmF5RXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgTG9naW5SZXF1aXJlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWxzPzogYW55KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGRldGFpbHNcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZGV0YWlscywgbnVsbCwgMilcbiAgICAgIDogJ1lvdSBtdXN0IGJlIGxvZ2dlZCBpbiB0byBhY2Nlc3MgdGhpcyByZXNvdXJjZSdcblxuICAgIHN1cGVyKGBBdXRoIGVycm9yOiAke21lc3NhZ2V9YClcbiAgICB0aGlzLm5hbWUgPSAnTG9naW5SZXF1aXJlZEVycm9yJ1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBMb2dpblJlcXVpcmVkRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgTm9TZXNzaW9uU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlcnZlclJlc3BvbnNlU3RhdHVzOiBudW1iZXIsXG4gICAgcHVibGljIHNlc3Npb25TdGF0ZVVybDogc3RyaW5nLFxuICAgIHB1YmxpYyBsb2dVcmw6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGBDb3VsZCBub3QgZ2V0IHNlc3Npb24gc3RhdGUuIFNlcnZlciByZXNwb25kZWQgd2l0aCAke3NlcnZlclJlc3BvbnNlU3RhdHVzfSB3aGlsc3QgY2hlY2tpbmcgc3RhdGU6ICR7c2Vzc2lvblN0YXRlVXJsfWBcbiAgICApXG5cbiAgICB0aGlzLm5hbWUgPSAnTm9TZXNzaW9uU3RhdHVzJ1xuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE5vU2Vzc2lvblN0YXRlRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEVycm9yOiBSZXNvdXJjZSBhdCAke3VybH0gd2FzIG5vdCBmb3VuZGApXG4gICAgdGhpcy5uYW1lID0gJ05vdEZvdW5kRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE5vdEZvdW5kRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBkZWNvZGVUb2tlbiB9IGZyb20gJ0BzYXNqcy91dGlscy9hdXRoJ1xuXG5leHBvcnQgY2xhc3MgUm9vdEZvbGRlck5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudEZvbGRlclBhdGg6IHN0cmluZyxcbiAgICBzZXJ2ZXJVcmw6IHN0cmluZyxcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbWVzc2FnZTogc3RyaW5nID1cbiAgICAgIGBSb290IGZvbGRlciAke3BhcmVudEZvbGRlclBhdGh9IHdhcyBub3QgZm91bmQuYCArXG4gICAgICBgXFxuUGxlYXNlIGNoZWNrICR7c2VydmVyVXJsfS9TQVNEcml2ZS5gICtcbiAgICAgIGBcXG5JZiB0aGUgZm9sZGVyIERPRVMgZXhpc3QgdGhlbiBpdCBpcyBsaWtlbHkgYSBwZXJtaXNzaW9uIHByb2JsZW0uXFxuYFxuICAgIGlmIChhY2Nlc3NUb2tlbikge1xuICAgICAgY29uc3QgZGVjb2RlZFRva2VuID0gZGVjb2RlVG9rZW4oYWNjZXNzVG9rZW4pXG4gICAgICBsZXQgc2NvcGUgPSBkZWNvZGVkVG9rZW4uc2NvcGVcbiAgICAgIHNjb3BlID0gc2NvcGUubWFwKChlbGVtZW50KSA9PiAnKiAnICsgZWxlbWVudClcbiAgICAgIG1lc3NhZ2UgKz1cbiAgICAgICAgYFlvdXIgYWNjZXNzIHRva2VuIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc2NvcGVzOlxcbmAgKyBzY29wZS5qb2luKCdcXG4nKVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdSb290Rm9sZGVyTm90Rm91bmRFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgUm9vdEZvbGRlck5vdEZvdW5kRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU0FTOUF1dGhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICAnVGhlIGNyZWRlbnRpYWxzIHlvdSBwcm92aWRlZCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZC4gUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBzZXQgb2YgY3JlZGVudGlhbHMuJ1xuICAgIClcbiAgICB0aGlzLm5hbWUgPSAnQXV0aG9yaXplRXJyb3InXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFNBUzlBdXRoRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV2Vib3V0UmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEVycm9yOiBlcnJvciB3aGlsZSBwYXJzaW5nIHJlc3BvbnNlIGZyb20gJHt1cmx9YClcbiAgICB0aGlzLm5hbWUgPSAnV2Vib3V0UmVzcG9uc2VFcnJvcidcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgV2Vib3V0UmVzcG9uc2VFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXJndW1lbnRFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vQXV0aG9yaXplRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL0NlcnRpZmljYXRlRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL0NvbXB1dGVKb2JFeGVjdXRpb25FcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JSZXNwb25zZSdcbmV4cG9ydCAqIGZyb20gJy4vSW50ZXJuYWxTZXJ2ZXJFcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vSW52YWxpZEpzb25FcnJvcidcbmV4cG9ydCAqIGZyb20gJy4vSm9iRXhlY3V0aW9uRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL0pvYlN0YXRlUG9sbEVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9Kc29uUGFyc2VBcnJheUVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9Mb2dpblJlcXVpcmVkRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL05vU2Vzc2lvblN0YXRlRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL05vdEZvdW5kRXJyb3InXG5leHBvcnQgKiBmcm9tICcuL1Jvb3RGb2xkZXJOb3RGb3VuZEVycm9yJ1xuZXhwb3J0ICogZnJvbSAnLi9XZWJvdXRSZXNwb25zZUVycm9yJ1xuIiwiZXhwb3J0ICogZnJvbSAnLi9Db250ZXh0J1xuZXhwb3J0ICogZnJvbSAnLi9Dc3JmVG9rZW4nXG5leHBvcnQgKiBmcm9tICcuL0ZvbGRlcidcbmV4cG9ydCAqIGZyb20gJy4vRmlsZSdcbmV4cG9ydCAqIGZyb20gJy4vSm9iJ1xuZXhwb3J0ICogZnJvbSAnLi9Kb2JEZWZpbml0aW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9Kb2JSZXN1bHQnXG5leHBvcnQgKiBmcm9tICcuL0xpbmsnXG5leHBvcnQgKiBmcm9tICcuL0xvZ2luJ1xuZXhwb3J0ICogZnJvbSAnLi9TQVNqc0NvbmZpZydcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdENsaWVudCdcbmV4cG9ydCAqIGZyb20gJy4vU2Vzc2lvbidcbmV4cG9ydCAqIGZyb20gJy4vVXBsb2FkRmlsZSdcbmV4cG9ydCAqIGZyb20gJy4vUG9sbE9wdGlvbnMnXG5leHBvcnQgKiBmcm9tICcuL1dyaXRlU3RyZWFtJ1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0J1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnXG5leHBvcnQgKiBmcm9tICcuL1RhYmxlcydcbiIsImltcG9ydCB7IEV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHNhc2pzL3V0aWxzL3R5cGVzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwZW5kRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMoXG4gIHJlc3BvbnNlOiBhbnksXG4gIGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzOiBFeHRyYVJlc3BvbnNlQXR0cmlidXRlc1tdXG4pIHtcbiAgbGV0IHJlc3BvbnNlT2JqZWN0ID0ge31cblxuICBpZiAoZXh0cmFSZXNwb25zZUF0dHJpYnV0ZXM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGV4dHJhQXR0cmlidXRlcyA9IGV4dHJhUmVzcG9uc2VBdHRyaWJ1dGVzLnJlZHVjZShcbiAgICAgIChtYXA6IGFueSwgb2JqOiBhbnkpID0+ICgobWFwW29ial0gPSByZXNwb25zZVtvYmpdKSwgbWFwKSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgcmVzcG9uc2VPYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHJlc3BvbnNlLnJlc3VsdCxcbiAgICAgIC4uLmV4dHJhQXR0cmlidXRlc1xuICAgIH1cbiAgfSBlbHNlIHJlc3BvbnNlT2JqZWN0ID0gcmVzcG9uc2UucmVzdWx0XG5cbiAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGb3JFYWNoKGFycmF5OiBhbnlbXSwgY2FsbGJhY2s6IGFueSkge1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgYXdhaXQgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpXG4gIH1cbn1cbiIsImltcG9ydCB7IFNBU2pzUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xuXG4vKipcbiAqIENvbXBhcmF0b3IgZm9yIFNBU2pzIHJlcXVlc3QgdGltZXN0YW1wcy5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wYXJlVGltZXN0YW1wcyA9IChhOiBTQVNqc1JlcXVlc3QsIGI6IFNBU2pzUmVxdWVzdCkgPT4ge1xuICByZXR1cm4gYi50aW1lc3RhbXAuZ2V0VGltZSgpIC0gYS50aW1lc3RhbXAuZ2V0VGltZSgpXG59XG4iLCJpbXBvcnQgeyBpc1NwZWNpYWxNaXNzaW5nIH0gZnJvbSAnQHNhc2pzL3V0aWxzL2lucHV0L3ZhbGlkYXRvcnMnXG5pbXBvcnQgeyBwcmVmaXhNZXNzYWdlIH0gZnJvbSAnQHNhc2pzL3V0aWxzL2Vycm9yJ1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBKU09OIG9iamVjdCBhcnJheSB0byBhIENTViBzdHJpbmcuXG4gKiBAcGFyYW0gZGF0YSAtIHRoZSBhcnJheSBvZiBKU09OIG9iamVjdHMgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRUb0NTViA9IChcbiAgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgdGFibGVOYW1lOiBzdHJpbmdcbikgPT4ge1xuICBpZiAoIWRhdGFbdGFibGVOYW1lXSkge1xuICAgIGNvbnN0IGVycm9yID0gcHJlZml4TWVzc2FnZShcbiAgICAgICdObyB0YWJsZSBwcm92aWRlZCB0byBiZSBjb252ZXJ0ZWQgdG8gQ1NWLicsXG4gICAgICAnRXJyb3Igd2hpbGUgY29udmVydGluZyB0byBDU1YuICdcbiAgICApXG5cbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKGVycm9yKVxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZU5hbWVdXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHRhYmxlKSkgcmV0dXJuICcnXG5cbiAgbGV0IGZvcm1hdHMgPSBkYXRhW2AkJHt0YWJsZU5hbWV9YF0/LmZvcm1hdHNcbiAgbGV0IGhlYWRlcnM6IHN0cmluZ1tdID0gW11cbiAgbGV0IGNzdlRlc3RcbiAgbGV0IGludmFsaWRTdHJpbmcgPSBmYWxzZVxuXG4gIGlmIChmb3JtYXRzKSB7XG4gICAgaGVhZGVycyA9IE9iamVjdC5rZXlzKGZvcm1hdHMpLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiR7Zm9ybWF0cyFba2V5XX1gKVxuICB9XG5cbiAgY29uc3QgaGVhZGVyRmllbGRzID0gT2JqZWN0LmtleXModGFibGVbMF0pXG5cbiAgaGVhZGVyRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgaWYgKCFmb3JtYXRzIHx8ICFPYmplY3Qua2V5cyhmb3JtYXRzKS5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIGxldCBoYXNOdWxsT3JOdW1iZXIgPSBmYWxzZVxuICAgICAgbGV0IGhhc1NwZWNpYWxNaXNzaW5nU3RyaW5nID0gZmFsc2VcblxuICAgICAgdGFibGUuZm9yRWFjaCgocm93OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiB7XG4gICAgICAgIGlmIChyb3dbZmllbGRdID09PSBudWxsIHx8IHR5cGVvZiByb3dbZmllbGRdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGhhc051bGxPck51bWJlciA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2Ygcm93W2ZpZWxkXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBpc1NwZWNpYWxNaXNzaW5nKHJvd1tmaWVsZF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc1NwZWNpYWxNaXNzaW5nU3RyaW5nID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoaGFzTnVsbE9yTnVtYmVyICYmIGhhc1NwZWNpYWxNaXNzaW5nU3RyaW5nKSB7XG4gICAgICAgIGhlYWRlcnMucHVzaChgJHtmaWVsZH06YmVzdC5gKVxuXG4gICAgICAgIGlmICghZm9ybWF0cykgZm9ybWF0cyA9IHt9XG5cbiAgICAgICAgZm9ybWF0c1tmaWVsZF0gPSAnYmVzdC4nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZmlyc3RGb3VuZFR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgICAgIGxldCBoYXNNaXhlZFR5cGVzOiBib29sZWFuID0gZmFsc2VcbiAgICAgICAgbGV0IHJvd051bUVycm9yOiBudW1iZXIgPSAtMVxuXG4gICAgICAgIGNvbnN0IGxvbmdlc3RWYWx1ZUZvckZpZWxkID0gdGFibGVcbiAgICAgICAgICAubWFwKChyb3c6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKHJvd1tmaWVsZF0gfHwgcm93W2ZpZWxkXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0Rm91bmRUeXBlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRGaWVsZFR5cGUgPVxuICAgICAgICAgICAgICAgICAgcm93W2ZpZWxkXSA9PT0gJycgfHwgdHlwZW9mIHJvd1tmaWVsZF0gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gJ2NoYXJzJ1xuICAgICAgICAgICAgICAgICAgICA6ICdudW1iZXInXG5cbiAgICAgICAgICAgICAgICBpZiAoIWhhc01peGVkVHlwZXMpIHtcbiAgICAgICAgICAgICAgICAgIGhhc01peGVkVHlwZXMgPSBjdXJyZW50RmllbGRUeXBlICE9PSBmaXJzdEZvdW5kVHlwZVxuICAgICAgICAgICAgICAgICAgcm93TnVtRXJyb3IgPSBoYXNNaXhlZFR5cGVzID8gaW5kZXggKyAxIDogLTFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvd1tmaWVsZF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICBmaXJzdEZvdW5kVHlwZSA9ICdjaGFycydcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZmlyc3RGb3VuZFR5cGUgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygcm93W2ZpZWxkXSA9PT0gJ3N0cmluZycgPyAnY2hhcnMnIDogJ251bWJlcidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgYnl0ZVNpemVcblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvd1tmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYnl0ZVNpemUgPSBnZXRCeXRlU2l6ZShyb3dbZmllbGRdKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVTaXplXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIgLSBhKVswXVxuXG4gICAgICAgIGlmIChsb25nZXN0VmFsdWVGb3JGaWVsZCAmJiBsb25nZXN0VmFsdWVGb3JGaWVsZCA+IDMyNzY1KSB7XG4gICAgICAgICAgaW52YWxpZFN0cmluZyA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNNaXhlZFR5cGVzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBSb3cgKCR7cm93TnVtRXJyb3J9KSwgQ29sdW1uICgke2ZpZWxkfSkgaGFzIG1peGVkIHR5cGVzOiBFUlJPUmBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBoZWFkZXJzLnB1c2goXG4gICAgICAgICAgYCR7ZmllbGR9OiR7Zmlyc3RGb3VuZFR5cGUgPT09ICdjaGFycycgPyAnJGNoYXInIDogJyd9JHtcbiAgICAgICAgICAgIGxvbmdlc3RWYWx1ZUZvckZpZWxkXG4gICAgICAgICAgICAgID8gbG9uZ2VzdFZhbHVlRm9yRmllbGRcbiAgICAgICAgICAgICAgOiBmaXJzdEZvdW5kVHlwZSA9PT0gJ2NoYXJzJ1xuICAgICAgICAgICAgICAgID8gJzEnXG4gICAgICAgICAgICAgICAgOiAnYmVzdCdcbiAgICAgICAgICB9LmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpZiAoZm9ybWF0cykge1xuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNvcnQoXG4gICAgICAoYSwgYikgPT5cbiAgICAgICAgaGVhZGVyRmllbGRzLmluZGV4T2YoYS5yZXBsYWNlKC86LiovLCAnJykpIC1cbiAgICAgICAgaGVhZGVyRmllbGRzLmluZGV4T2YoYi5yZXBsYWNlKC86LiovLCAnJykpXG4gICAgKVxuICB9XG5cbiAgaWYgKGludmFsaWRTdHJpbmcpIHJldHVybiAnRVJST1I6IExBUkdFIFNUUklORyBMRU5HVEgnXG5cbiAgY3N2VGVzdCA9IHRhYmxlLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhyb3cpLm1hcCgoZmllbGROYW1lLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHZhbHVlXG4gICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHJvd1tmaWVsZE5hbWVdXG5cbiAgICAgIGlmICh0eXBlb2YgY3VycmVudENlbGwgPT09ICdudW1iZXInKSByZXR1cm4gY3VycmVudENlbGxcblxuICAgICAgLy8gc3RyaW5naWZ5IHdpdGggcmVwbGFjZXIgY29udmVydHMgbnVsbCB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5nc1xuICAgICAgdmFsdWUgPSBjdXJyZW50Q2VsbCA9PT0gbnVsbCA/ICcnIDogY3VycmVudENlbGxcblxuICAgICAgaWYgKGZvcm1hdHMgJiYgZm9ybWF0c1tmaWVsZE5hbWVdID09PSAnYmVzdC4nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhaXNTcGVjaWFsTWlzc2luZyh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQSBTcGVjaWFsIG1pc3NpbmcgdmFsdWUgY2FuIG9ubHkgYmUgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gJ0EnIHRvICdaJywgJ18nLCAnLlthLXpdJywgJy5fJ2BcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkb3QgPSB2YWx1ZS5pbmNsdWRlcygnLicpID8gJycgOiAnLidcblxuICAgICAgICByZXR1cm4gYCR7ZG90fSR7dmFsdWUudG9Mb3dlckNhc2UoKX1gXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZXJlIGFueSBwcmVzZW50LCBpdCBzaG91bGQgaGF2ZSBwcmVjZWRpbmcgKFwiKSBmb3IgZXNjYXBpbmdcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXCIvZywgYFwiXCJgKVxuXG4gICAgICAvLyBhbHNvIHdyYXBzIHRoZSB2YWx1ZSBpbiBkb3VibGUgcXVvdGVzXG4gICAgICB2YWx1ZSA9IGBcIiR7dmFsdWV9XCJgXG5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpLnNlYXJjaCgvKFxcdHxcXG58XFxyfCx8XFwnfFxcXCIpL2dtKSA8IDBcbiAgICAgICkge1xuICAgICAgICAvLyBSZW1vdmUgd3JhcHBpbmcgcXVvdGVzIGZvciB2YWx1ZXMgdGhhdCBkb24ndCBjb250YWluIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKVxuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nbSwgJ1xcbicpXG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gJycgJiYgaGVhZGVyc1tpbmRleF0uaW5jbHVkZXMoJ2Jlc3QnKSkge1xuICAgICAgICB2YWx1ZSA9ICcuJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9KVxuICAgIHJldHVybiBmaWVsZHMuam9pbignLCcpXG4gIH0pXG5cbiAgbGV0IGZpbmFsQ1NWID1cbiAgICBoZWFkZXJzLmpvaW4oJywnKS5yZXBsYWNlKC8sL2csICcgJykgKyAnXFxyXFxuJyArIGNzdlRlc3Quam9pbignXFxyXFxuJylcblxuICByZXR1cm4gZmluYWxDU1Zcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGFibGUgaXMgdGFibGUgb2YgZm9ybWF0cyAodGFibGUgbmFtZSBzaG91bGQgc3RhcnQgZnJvbSAnJCcgY2hhcmFjdGVyKS5cbiAqIEBwYXJhbSB0YWJsZU5hbWUgLSB0YWJsZSBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgaXNGb3JtYXRzVGFibGUgPSAodGFibGVOYW1lOiBzdHJpbmcpID0+IC9eXFwkLiovLnRlc3QodGFibGVOYW1lKVxuXG5jb25zdCBnZXRCeXRlU2l6ZSA9IChzdHI6IHN0cmluZykgPT4ge1xuICBsZXQgYnl0ZVNpemUgPSBzdHIubGVuZ3RoXG4gIGZvciAobGV0IGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoY29kZSA+IDB4N2YgJiYgY29kZSA8PSAweDdmZikgYnl0ZVNpemUrK1xuICAgIGVsc2UgaWYgKGNvZGUgPiAweDdmZiAmJiBjb2RlIDw9IDB4ZmZmZikgYnl0ZVNpemUgKz0gMlxuICAgIGlmIChjb2RlID49IDB4ZGMwMCAmJiBjb2RlIDw9IDB4ZGZmZikgaS0tIC8vdHJhaWwgc3Vycm9nYXRlXG4gIH1cbiAgcmV0dXJuIGJ5dGVTaXplXG59XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcydcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUF4aW9zSW5zdGFuY2UgPSAoXG4gIGJhc2VVUkw6IHN0cmluZyxcbiAgaHR0cHNBZ2VudD86IGh0dHBzLkFnZW50XG4pID0+IGF4aW9zLmNyZWF0ZSh7IGJhc2VVUkwsIGh0dHBzQWdlbnQgfSlcbiIsImV4cG9ydCBjb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PlxuICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q2xpZW50IH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0Q2xpZW50J1xuaW1wb3J0IHsgcHJlZml4TWVzc2FnZSB9IGZyb20gJ0BzYXNqcy91dGlscy9lcnJvcidcblxuLyoqXG4gKiBGZXRjaGVzIGNvbnRlbnQgb2YgdGhlIGxvZyBmaWxlXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxdWVzdENsaWVudCAtIGNsaWVudCBvYmplY3Qgb2YgUmVxdWVzdCBDbGllbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWNjZXNzVG9rZW4gLSBhbiBhY2Nlc3MgdG9rZW4gZm9yIGFuIGF1dGhvcml6ZWQgdXNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2dVcmwgLSB1cmwgb2YgdGhlIGxvZyBmaWxlLlxuICogQHBhcmFtIHtudW1iZXJ9IGxvZ0NvdW50LSB0b3RhbCBudW1iZXIgb2YgbG9nIGxpbmVzIGluIGZpbGUuXG4gKiBAcmV0dXJucyBhbiBzdHJpbmcgY29udGFpbmluZyBsb2cgbGluZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaExvZ0J5Q2h1bmtzID0gYXN5bmMgKFxuICByZXF1ZXN0Q2xpZW50OiBSZXF1ZXN0Q2xpZW50LFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICBsb2dVcmw6IHN0cmluZyxcbiAgbG9nQ291bnQ6IG51bWJlclxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgcmV0dXJuIGF3YWl0IGZldGNoTG9nKHJlcXVlc3RDbGllbnQsIGFjY2Vzc1Rva2VuLCBsb2dVcmwsIDAsIGxvZ0NvdW50KVxufVxuXG4vKipcbiAqIEZldGNoZXMgYSBzZWN0aW9uIG9mIHRoZSBsb2cgZmlsZSBkZWxpbmVhdGVkIGJ5IHN0YXJ0IGFuZCBlbmQgbGluZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXF1ZXN0Q2xpZW50IC0gY2xpZW50IG9iamVjdCBvZiBSZXF1ZXN0IENsaWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY2Nlc3NUb2tlbiAtIGFuIGFjY2VzcyB0b2tlbiBmb3IgYW4gYXV0aG9yaXplZCB1c2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IGxvZ1VybCAtIHVybCBvZiB0aGUgbG9nIGZpbGUuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSB0aGUgbGluZSBhdCB3aGljaCB0byBzdGFydCBmZXRjaGluZyB0aGUgbG9nLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCAtIHRoZSBsaW5lIGF0IHdoaWNoIHRvIHN0b3AgZmV0Y2hpbmcgdGhlIGxvZy5cbiAqIEByZXR1cm5zIGFuIHN0cmluZyBjb250YWluaW5nIGxvZyBsaW5lcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZldGNoTG9nID0gYXN5bmMgKFxuICByZXF1ZXN0Q2xpZW50OiBSZXF1ZXN0Q2xpZW50LFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICBsb2dVcmw6IHN0cmluZyxcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXJcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGxvZ2dlciA9IHByb2Nlc3MubG9nZ2VyIHx8IGNvbnNvbGVcblxuICBsZXQgbG9nOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0IGxvZ2xpbWl0ID0gZW5kIDwgMTAwMDAgPyBlbmQgOiAxMDAwMFxuICBkbyB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgRmV0Y2hpbmcgbG9ncyBmcm9tIGxpbmUgbm86ICR7c3RhcnQgKyAxfSB0byAke1xuICAgICAgICBzdGFydCArIGxvZ2xpbWl0XG4gICAgICB9IG9mICR7ZW5kfS5gXG4gICAgKVxuICAgIGNvbnN0IGxvZ0NodW5rSnNvbiA9IGF3YWl0IHJlcXVlc3RDbGllbnQhXG4gICAgICAuZ2V0PGFueT4oYCR7bG9nVXJsfT9zdGFydD0ke3N0YXJ0fSZsaW1pdD0ke2xvZ2xpbWl0fWAsIGFjY2Vzc1Rva2VuKVxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiByZXMucmVzdWx0KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhyb3cgcHJlZml4TWVzc2FnZShlcnIsICdFcnJvciB3aGlsZSBnZXR0aW5nIGxvZy4gJylcbiAgICAgIH0pXG5cbiAgICBpZiAobG9nQ2h1bmtKc29uLml0ZW1zLmxlbmd0aCA9PT0gMCkgYnJlYWtcblxuICAgIGNvbnN0IGxvZ0NodW5rID0gbG9nQ2h1bmtKc29uLml0ZW1zLm1hcCgoaTogYW55KSA9PiBpLmxpbmUpLmpvaW4oJ1xcbicpXG4gICAgbG9nICs9IGxvZ0NodW5rXG5cbiAgICBzdGFydCArPSBsb2dsaW1pdFxuICB9IHdoaWxlIChzdGFydCA8IGVuZClcbiAgcmV0dXJuIGxvZ1xufVxuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi8nXG5pbXBvcnQgTm9kZUZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSdcblxuZXhwb3J0IGNvbnN0IGdldEZvcm1EYXRhID0gKCk6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhID0+XG4gIGlzTm9kZSgpID8gbmV3IE5vZGVGb3JtRGF0YSgpIDogbmV3IEZvcm1EYXRhKClcbiIsImludGVyZmFjZSBJRW5hdmlnYXRvciB7XG4gIHVzZXJMYW5ndWFnZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHByZWZlcnJlZCBsYW5ndWFnZSBvZiB0aGUgdXNlci5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZmVycmVkIGxhbmd1YWdlIG9mIHRoZSB1c2VyLCB1c3VhbGx5IHRoZSBsYW5ndWFnZSBvZiB0aGUgYnJvd3NlciBVSS4gRXhhbXBsZXMgb2YgdmFsaWQgbGFuZ3VhZ2UgY29kZXMgaW5jbHVkZSBcImVuXCIsIFwiZW4tVVNcIiwgXCJmclwiLCBcImZyLUZSXCIsIFwiZXMtRVNcIi4gTW9yZSBpbmZvIGF2YWlsYWJsZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU2NDZcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFVzZXJMYW5ndWFnZSA9ICgpID0+XG4gIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgKHdpbmRvdy5uYXZpZ2F0b3IgYXMgSUVuYXZpZ2F0b3IpLnVzZXJMYW5ndWFnZVxuIiwiaW1wb3J0IHsgSnNvblBhcnNlQXJyYXlFcnJvciwgSW52YWxpZEpzb25FcnJvciB9IGZyb20gJy4uL3R5cGVzL2Vycm9ycydcblxuLyoqXG4gKiBpZiBzdHJpbmcgcGFzc2VkIHRoZW4gcGFyc2UgdGhlIHN0cmluZyB0byBqc29uIGVsc2UgaWYgdGhyb3cgZXJyb3IgZm9yIGFsbCBvdGhlciB0eXBlcyB1bmxlc3MgaXQgaXMgbm90IGEgdmFsaWQganNvbiBvYmplY3QuXG4gKiBAcGFyYW0gc3RyIC0gc3RyaW5nIHRvIGNoZWNrLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRKc29uID0gKHN0cjogc3RyaW5nIHwgb2JqZWN0KTogb2JqZWN0ID0+IHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RyID09PSBudWxsIHx8IHN0ciA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgSW52YWxpZEpzb25FcnJvcigpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHIpKSB0aHJvdyBuZXcgSnNvblBhcnNlQXJyYXlFcnJvcigpXG5cbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ29iamVjdCcpIHJldHVybiBzdHJcblxuICAgIGlmIChzdHIgPT09ICcnKSByZXR1cm4ge31cblxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBKc29uUGFyc2VBcnJheUVycm9yKSB0aHJvdyBlXG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEpzb25FcnJvcigpXG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vYXBwZW5kRXh0cmFSZXNwb25zZUF0dHJpYnV0ZXMnXG5leHBvcnQgKiBmcm9tICcuL2FzeW5jRm9yRWFjaCdcbmV4cG9ydCAqIGZyb20gJy4vY29tcGFyZVRpbWVzdGFtcHMnXG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRUb0NzdidcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlQXhpb3NJbnN0YW5jZSdcbmV4cG9ydCAqIGZyb20gJy4vZGVsYXknXG5leHBvcnQgKiBmcm9tICcuL2ZldGNoTG9nQnlDaHVua3MnXG5leHBvcnQgKiBmcm9tICcuL2dldFZhbGlkSnNvbidcbmV4cG9ydCAqIGZyb20gJy4vaXNOb2RlJ1xuZXhwb3J0ICogZnJvbSAnLi9pc1JlbGF0aXZlUGF0aCdcbmV4cG9ydCAqIGZyb20gJy4vaXNVcmknXG5leHBvcnQgKiBmcm9tICcuL2lzVXJsJ1xuZXhwb3J0ICogZnJvbSAnLi9uZWVkc1JldHJ5J1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZUdlbmVyYXRlZENvZGUnXG5leHBvcnQgKiBmcm9tICcuL3BhcnNlU2FzVml5YUxvZydcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2VTb3VyY2VDb2RlJ1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZVZpeWFEZWJ1Z1Jlc3BvbnNlJ1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZVZpeWFMb2dEZWJ1Z1Jlc3BvbnNlJ1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZVdlYm91dFJlc3BvbnNlJ1xuZXhwb3J0ICogZnJvbSAnLi9zZXJpYWxpemUnXG5leHBvcnQgKiBmcm9tICcuL3NwbGl0Q2h1bmtzJ1xuZXhwb3J0ICogZnJvbSAnLi92YWxpZGF0ZUlucHV0J1xuZXhwb3J0ICogZnJvbSAnLi9nZXRGb3JtRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vZ2V0VXNlckxhbmd1YWdlJ1xuIiwiZXhwb3J0IGNvbnN0IGlzTm9kZSA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICBwcm9jZXNzLnZlcnNpb25zICE9IG51bGwgJiZcbiAgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlICE9IG51bGxcbiIsImV4cG9ydCBjb25zdCBpc1JlbGF0aXZlUGF0aCA9ICh1cmk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgISF1cmkgJiYgIXVyaS5zdGFydHNXaXRoKCcvJylcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHN0cmluZyBpcyBpbiBVUkkgZm9ybWF0LlxuICogQHBhcmFtIHN0ciAtIHN0cmluZyB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVXJpID0gKHN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiAvXlxcL2ZvbGRlcnNcXC9mb2xkZXJzXFwvLy50ZXN0KHN0cilcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHN0cmluZyBpcyBpbiBVUkwgZm9ybWF0LlxuICogQHBhcmFtIHN0ciAtIHN0cmluZyB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHN1cHBvcnRlZFByb3RvY29scyA9IFsnaHR0cDonLCAnaHR0cHM6J11cblxuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc3RyKVxuXG4gICAgaWYgKCFzdXBwb3J0ZWRQcm90b2NvbHMuaW5jbHVkZXModXJsLnByb3RvY29sKSkgcmV0dXJuIGZhbHNlXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCJlbnVtIGRvbUlEcyB7XG4gIHN0eWxlcyA9ICdzYXNqc0FkYXB0ZXJTdHlsZXMnLFxuICBvdmVybGF5ID0gJ3Nhc2pzQWRhcHRlckxvZ2luUHJvbXB0QkcnLFxuICBkaWFsb2cgPSAnc2FzanNBZGFwdGVyTG9naW5Qcm9tcHQnXG59XG5jb25zdCBjc3NQcmVmaXggPSAnc2FzanMtYWRhcHRlcidcblxuY29uc3QgY2xhc3NlcyA9IHtcbiAgcG9wVXA6IGAke2Nzc1ByZWZpeH1wb3BVcGAsXG4gIHBvcFVwQkc6IGAke2Nzc1ByZWZpeH1wb3BVcEJHYFxufVxuXG5leHBvcnQgY29uc3Qgb3BlbkxvZ2luUHJvbXB0ID0gKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICBzdHlsZS5pZCA9IGRvbUlEcy5zdHlsZXNcbiAgICBzdHlsZS5pbm5lclRleHQgPSBjc3NDb250ZW50XG5cbiAgICBjb25zdCBsb2dpblByb21wdEJHID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBsb2dpblByb21wdEJHLmlkID0gZG9tSURzLm92ZXJsYXlcbiAgICBsb2dpblByb21wdEJHLmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5wb3BVcEJHKVxuXG4gICAgY29uc3QgbG9naW5Qcm9tcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIGxvZ2luUHJvbXB0LmlkID0gZG9tSURzLmRpYWxvZ1xuICAgIGxvZ2luUHJvbXB0LmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5wb3BVcClcblxuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKVxuICAgIHRpdGxlLmlubmVyVGV4dCA9ICdTZXNzaW9uIEV4cGlyZWQhJ1xuICAgIGxvZ2luUHJvbXB0LmFwcGVuZENoaWxkKHRpdGxlKVxuXG4gICAgY29uc3QgZGVzY0hvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY29uc3QgZGVzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgIGRlc2MuaW5uZXJUZXh0ID0gJ1lvdSBuZWVkIHRvIHJlbG9naW4sIGNsaWNrIE9LIHRvIGxvZ2luLidcbiAgICBkZXNjSG9sZGVyLmFwcGVuZENoaWxkKGRlc2MpXG4gICAgbG9naW5Qcm9tcHQuYXBwZW5kQ2hpbGQoZGVzY0hvbGRlcilcblxuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpXG4gICAgYnV0dG9uQ2FuY2VsLmNsYXNzTGlzdC5hZGQoJ2NhbmNlbCcpXG4gICAgYnV0dG9uQ2FuY2VsLmlubmVyVGV4dCA9ICdDYW5jZWwnXG4gICAgYnV0dG9uQ2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBjbG9zZUxvZ2luUHJvbXB0KClcbiAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgfVxuICAgIGxvZ2luUHJvbXB0LmFwcGVuZENoaWxkKGJ1dHRvbkNhbmNlbClcblxuICAgIGNvbnN0IGJ1dHRvbk9rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJylcbiAgICBidXR0b25Pay5jbGFzc0xpc3QuYWRkKCdjb25maXJtJylcbiAgICBidXR0b25Pay5pbm5lclRleHQgPSAnT2snXG4gICAgYnV0dG9uT2sub25jbGljayA9ICgpID0+IHtcbiAgICAgIGNsb3NlTG9naW5Qcm9tcHQoKVxuICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgIH1cbiAgICBsb2dpblByb21wdC5hcHBlbmRDaGlsZChidXR0b25PaylcblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSlcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxvZ2luUHJvbXB0QkcpXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsb2dpblByb21wdClcbiAgfSlcbn1cbmNvbnN0IGNsb3NlTG9naW5Qcm9tcHQgPSAoKSA9PiB7XG4gIE9iamVjdC52YWx1ZXMoZG9tSURzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgIGNvbnN0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICBlbGVtPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChlbGVtKVxuICB9KVxuXG4gIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbn1cblxuY29uc3QgY3NzQ29udGVudCA9IGBcbi4ke2NsYXNzZXMucG9wVXBCR30gLFxuLiR7Y2xhc3Nlcy5wb3BVcH0ge1xuICB6LWluZGV4OiAxMDAwMDtcbn1cbi4ke2NsYXNzZXMucG9wVXB9IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNDAlO1xuICBsZWZ0OiA1MCU7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC1mYW1pbHk6ICdQVCBTYW5zJywgc2Fucy1zZXJpZjtcbiAgY29sb3I6ICNmZmY7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgei1pbmRleDogOTk5O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMzAwcHg7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogMzAwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gPiBoMSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiA1cHg7XG4gIG1pbi1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMS4yZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBib3JkZXItd2lkdGg6IDVweDtcbiAgYm9yZGVyLWNvbG9yOiBibGFjaztcbn1cbi4ke2NsYXNzZXMucG9wVXB9ID4gZGl2IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogY2FsYygxMDAlIC0xMDhweCk7XG4gIG1hcmdpbjogMDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiA1JTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xuICBib3JkZXItc3R5bGU6IG5vbmUgbm9uZSBzb2xpZCBub25lO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi4ke2NsYXNzZXMucG9wVXB9ID4gZGl2ID4gc3BhbiB7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIHdpZHRoOiAzMDBweDtcbiAgaGVpZ2h0OiAxMDhweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gLmNhbmNlbCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gLmNvbmZpcm0ge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uJHtjbGFzc2VzLnBvcFVwfSA+IGJ1dHRvbiB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHg7XG4gIHdpZHRoOiA1MCU7XG4gIGJvcmRlcjogMXB4IG5vbmUgI2NjYztcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGhlaWdodDogNTBweDtcbiAgYmFja2dyb3VuZDogcmdiYSgxLCAxLCAxLCAwLjIpO1xufVxuLiR7Y2xhc3Nlcy5wb3BVcH0gPiBidXR0b246aG92ZXIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7XG59XG4uJHtjbGFzc2VzLnBvcFVwQkd9IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG9wYWNpdHk6IDAuOTU7XG4gIHotaW5kZXg6IDUwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoIzAzNzhjZCwgIzAxMjAzNik7XG59XG5gXG4iLCJleHBvcnQgY29uc3QgbmVlZHNSZXRyeSA9IChyZXNwb25zZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhcmVzcG9uc2VUZXh0ICYmXG4gICAgKChyZXNwb25zZVRleHQuaW5jbHVkZXMoJ1wiZXJyb3JDb2RlXCI6NDAzJykgJiZcbiAgICAgIHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnX2NzcmYnKSAmJlxuICAgICAgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdYLUNTUkYtVE9LRU4nKSkgfHxcbiAgICAgIChyZXNwb25zZVRleHQuaW5jbHVkZXMoJ1wic3RhdHVzXCI6NDAzJykgJiZcbiAgICAgICAgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdcImVycm9yXCI6XCJGb3JiaWRkZW5cIicpKSB8fFxuICAgICAgKHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnXCJzdGF0dXNcIjo0NDknKSAmJlxuICAgICAgICByZXNwb25zZVRleHQuaW5jbHVkZXMoXG4gICAgICAgICAgJ0F1dGhlbnRpY2F0aW9uIHN1Y2Nlc3MsIHJldHJ5IG9yaWdpbmFsIHJlcXVlc3QnXG4gICAgICAgICkpKVxuICApXG59XG4iLCJleHBvcnQgY29uc3QgcGFyc2VHZW5lcmF0ZWRDb2RlID0gKGxvZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHN0YXJ0c1dpdGggPSAnTVBSSU5UJ1xuICBjb25zdCBpc0dlbmVyYXRlZENvZGVMaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbiAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKHN0YXJ0c1dpdGgpXG4gIGNvbnN0IGxvZ0xpbmVzID0gbG9nLnNwbGl0KCdcXG4nKS5maWx0ZXIoaXNHZW5lcmF0ZWRDb2RlTGluZSlcbiAgcmV0dXJuIGxvZ0xpbmVzLmpvaW4oJ1xcclxcbicpXG59XG4iLCJleHBvcnQgY29uc3QgcGFyc2VTYXNWaXlhTG9nID0gKGxvZ1Jlc3BvbnNlOiB7IGl0ZW1zOiBhbnlbXSB9KSA9PiB7XG4gIGxldCBsb2dcbiAgdHJ5IHtcbiAgICBsb2cgPSBsb2dSZXNwb25zZS5pdGVtc1xuICAgICAgPyBsb2dSZXNwb25zZS5pdGVtcy5tYXAoKGkpID0+IGkubGluZSkuam9pbignXFxuJylcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkobG9nUmVzcG9uc2UpXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBsb2cgcmVzcG9uc2UnLCBlKVxuICAgIGxvZyA9IGxvZ1Jlc3BvbnNlXG4gIH1cbiAgcmV0dXJuIGxvZ1xufVxuIiwiZXhwb3J0IGNvbnN0IHBhcnNlU291cmNlQ29kZSA9IChsb2c6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGlzU291cmNlQ29kZUxpbmUgPSAobGluZTogc3RyaW5nKSA9PlxuICAgIGxpbmUudHJpbSgpLnN1YnN0cmluZygwLCAxMCkudHJpbVN0YXJ0KCkubWF0Y2goL15cXGQvKVxuICBjb25zdCBsb2dMaW5lcyA9IGxvZy5zcGxpdCgnXFxuJykuZmlsdGVyKGlzU291cmNlQ29kZUxpbmUpXG4gIHJldHVybiBsb2dMaW5lcy5qb2luKCdcXHJcXG4nKVxufVxuIiwiaW1wb3J0IHsgUmVxdWVzdENsaWVudCB9IGZyb20gJy4uL3JlcXVlc3QvUmVxdWVzdENsaWVudCdcbmltcG9ydCB7IGdldFZhbGlkSnNvbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG4vKipcbiAqIFdoZW4gcXVlcnlpbmcgYSBWaXlhIGpvYiB1c2luZyB0aGUgV2ViIGFwcHJvYWNoIChhcyBvcHBvc2VkIHRvIHVzaW5nIHRoZSBBUElzKSB3aXRoIF9ERUJVRyBlbmFibGVkLFxuICogdGhlIGZpcnN0IHJlc3BvbnNlIGNvbnRhaW5zIHRoZSBsb2cgd2l0aCB0aGUgY29udGVudCBpbiBhbiBpZnJhbWUuIFRoZXJlZm9yZSB3aGVuIGRlYnVnIGlzIGVuYWJsZWQsXG4gKiBhbmQgdGhlIHNlcnZlclR5cGUgaXMgVklZQSwgYW5kIHVzZUNvbXB1dGVBcGkgaXMgbnVsbCAoV0VCKSwgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlXG4gKiAoX3dlYm91dCkgY29udGVudCBmcm9tIHRoZSBpZnJhbWUuXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBmaXJzdCByZXNwb25zZSBmcm9tIHZpeWEgam9iXG4gKiBAcGFyYW0gcmVxdWVzdENsaWVudFxuICogQHBhcmFtIHNlcnZlclVybFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlU2FzVml5YURlYnVnUmVzcG9uc2UgPSBhc3luYyAoXG4gIHJlc3BvbnNlOiBzdHJpbmcsXG4gIHJlcXVlc3RDbGllbnQ6IFJlcXVlc3RDbGllbnQsXG4gIHNlcnZlclVybDogc3RyaW5nXG4pID0+IHtcbiAgLy8gT24gdml5YSAzLjUsIGlmcmFtZSBpcyBsaWtlIDxpZnJhbWUgc3R5bGU9XCJ3aWR0aDogOTklOyBoZWlnaHQ6IDUwMHB4XCIgc3JjPVwiLi4uXCI+PC9pZnJhbWU+XG4gIC8vIE9uIHZpeWEgNCwgaWZyYW1lIGlzIGxpa2UgPGlmcmFtZSBzdHlsZT1cIndpZHRoOiA5OSU7IGhlaWdodDogNTAwcHg7IGJhY2tncm91bmQtY29sb3I6Q2FudmFzO1wiIHNyYz0uLi4+PC9pZnJhbWU+XG5cbiAgY29uc3QgaWZyYW1lU3RhcnQgPSByZXNwb25zZS5zcGxpdChcbiAgICAvPGlmcmFtZSBzdHlsZT1cIndpZHRoOiA5OSU7IGhlaWdodDogNTAwcHhcIiBzcmM9XCJ8PGlmcmFtZSBzdHlsZT1cIndpZHRoOiA5OSU7IGhlaWdodDogNTAwcHg7IGJhY2tncm91bmQtY29sb3I6Q2FudmFzO1wiIHNyYz0vXG4gIClbMV1cbiAgY29uc3QganNvblVybCA9IGlmcmFtZVN0YXJ0XG4gICAgPyBpZnJhbWVTdGFydC5zcGxpdCgvXCI+PFxcL2lmcmFtZT58PjxcXC9pZnJhbWU+LylbMF1cbiAgICA6IG51bGxcbiAgaWYgKCFqc29uVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB3ZWJvdXQgZmlsZSBVUkwuJylcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0Q2xpZW50XG4gICAgLmdldChzZXJ2ZXJVcmwgKyBqc29uVXJsLCB1bmRlZmluZWQsICd0ZXh0L3BsYWluJylcbiAgICAudGhlbigocmVzOiBhbnkpID0+IGdldFZhbGlkSnNvbihyZXMucmVzdWx0KSlcbn1cbiIsImltcG9ydCB7IGdldFZhbGlkSnNvbiB9IGZyb20gJy4vZ2V0VmFsaWRKc29uJ1xuaW1wb3J0IHsgcGFyc2VXZWJvdXRSZXNwb25zZSB9IGZyb20gJy4vcGFyc2VXZWJvdXRSZXNwb25zZSdcblxuLyoqXG4gKiBXaGVuIHF1ZXJ5aW5nIGEgVml5YSBqb2IgdXNpbmcgdGhlIFdlYiBhcHByb2FjaCB3aXRoIF9ERUJVRz0xMjggKHVzZWQgd2hlblxuICogcnVuQXNUYXNrIGlzIHRydWUpLCB0aGUgd2Vib3V0IEpTT04gaXMgaW5saW5lZCBpbnRvIHRoZSByZXNwb25zZSB2aWE6XG4gKiAgIHZhciBibG9iID0gbmV3IEJsb2IoW2B7Li4ufWBdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nfSk7XG4gKiBPbiBhYm9ydC9lcnJvciBwYXRocyB0aGUgc2FtZSBzaGFwZSBpcyB1c2VkIGJ1dCB3aXRoIHRleHQvcGxhaW4gYW5kXG4gKiB3ZWJvdXRCRUdJTi9FTkQgbWFya2VycyBhcm91bmQgdGhlIEpTT046XG4gKiAgIHZhciBibG9iID0gbmV3IEJsb2IoW2A+PndlYm91dEJFR0lOPDxcXG57Li4ufVxcbj4+d2Vib3V0RU5EPDxcXG5gXSwge3R5cGU6ICd0ZXh0L3BsYWluJ30pO1xuICogTm8gZm9sbG93LXVwIHJlcXVlc3QgaXMgbmVlZGVkIOKAlCBleHRyYWN0IGFuZCBwYXJzZSB0aGUgSlNPTiBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlU2FzVml5YUxvZ0RlYnVnUmVzcG9uc2UgPSBhc3luYyAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAvLyBJZiB1cHN0cmVhbSBhbHJlYWR5IHBhcnNlZCB0aGUgcmVzcG9uc2UgYXMgSlNPTiAob2JqZWN0KSwgcGFzcyB0aHJvdWdoLlxuICBpZiAodHlwZW9mIHJlc3BvbnNlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgY29uc3QgYmxvYk1hdGNoID0gcmVzcG9uc2UubWF0Y2goXG4gICAgL25ldyBCbG9iXFwoXFxbYChbXFxzXFxTXSo/KWBcXF0sXFxzKlxce3R5cGU6XFxzKicoPzphcHBsaWNhdGlvblxcL2pzb258dGV4dFxcL3BsYWluKSdcXH1cXCkvXG4gIClcbiAgaWYgKCFibG9iTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHdlYm91dCBibG9iIGluIGRlYnVnIGxvZyByZXNwb25zZS4nKVxuICB9XG5cbiAgY29uc3QgYmxvYkNvbnRlbnQgPSBibG9iTWF0Y2hbMV1cbiAgY29uc3Qgc3RyaXBwZWQgPSBibG9iQ29udGVudC5pbmNsdWRlcygnPj53ZWJvdXRCRUdJTjw8JylcbiAgICA/IHBhcnNlV2Vib3V0UmVzcG9uc2UoYmxvYkNvbnRlbnQpXG4gICAgOiBibG9iQ29udGVudFxuXG4gIHJldHVybiBnZXRWYWxpZEpzb24oc3RyaXBwZWQpXG59XG4iLCJpbXBvcnQgeyBXZWJvdXRSZXNwb25zZUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuXG5leHBvcnQgY29uc3QgcGFyc2VXZWJvdXRSZXNwb25zZSA9IChyZXNwb25zZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgc2FzUmVzcG9uc2UgPSAnJ1xuXG4gIGlmIChyZXNwb25zZS5pbmNsdWRlcygnPj53ZWJvdXRCRUdJTjw8JykpIHtcbiAgICB0cnkge1xuICAgICAgc2FzUmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICAuc3BsaXQoJz4+d2Vib3V0QkVHSU48PCcpWzFdXG4gICAgICAgIC5zcGxpdCgnPj53ZWJvdXRFTkQ8PCcpWzBdXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAodXJsKSB0aHJvdyBuZXcgV2Vib3V0UmVzcG9uc2VFcnJvcih1cmwpXG5cbiAgICAgIHNhc1Jlc3BvbnNlID0gJydcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2FzUmVzcG9uc2Vcbn1cbiIsIi8qKlxuICogRGljdGlvbmFyeSBzaG91bGQgY29udGFpbiBvbmx5IGxhbmd1YWdlcyBpbiBTQVMgd2hlcmUgYGxvZ291dGAgdGV4dFxuICogaXMgcmVwcmVzZW50ZWQgd2l0aCBtb3JlIHRoZW4gb25lIHdvcmRcbiAqL1xuY29uc3QgZGljdGlvbmFyeSA9IFsnTG9nIE9mZiddXG5cbi8qKlxuICogRXh0cmFjdHMgdXNlciBmdWxsIG5hbWUgYXNzdW1pbmcgdGhlIGZpcnN0IHdvcmQgYWZ0ZXIgXCJ0aXRsZVwiIG1lYW5zIGxvZyBvZmYgaWYgbm90IGZvdW5kIG90aGVyd2lzZSBpbiB0aGUgZGljdGlvbmFyeVxuICogQHBhcmFtIHJlc3BvbnNlIFNBUyByZXNwb25zZSBjb250ZW50XG4gKiBAcmV0dXJucyB1c2VyIGZ1bGwgbmFtZVxuICovXG5leHBvcnQgY29uc3QgZXh0cmFjdFVzZXJMb25nTmFtZVNhczkgPSAocmVzcG9uc2U6IHN0cmluZykgPT4ge1xuICBjb25zdCByZWdleCA9IC9cInRpdGxlXCI6XFxzP1wiLio/XCIvXG5cbiAgY29uc3QgbWF0Y2hlZCA9IHJlc3BvbnNlPy5tYXRjaChyZWdleClcbiAgbGV0IGZ1bGxOYW1lID0gbWF0Y2hlZD8uWzBdLnNwbGl0KCc6JylbMV0udHJpbSgpXG4gIGxldCBicmVha0luZGV4ID0gZnVsbE5hbWU/LmluZGV4T2YoJyAnKVxuXG4gIGlmICghZnVsbE5hbWUpIHJldHVybiAndW5rbm93bidcblxuICBkaWN0aW9uYXJ5Lm1hcCgobG9nb3V0V29yZCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gZnVsbE5hbWU/LmluZGV4T2YobG9nb3V0V29yZCkgfHwgLTFcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBicmVha0luZGV4ID0gaW5kZXggKyBsb2dvdXRXb3JkLmxlbmd0aFxuICAgIH1cbiAgfSlcblxuICAvL0N1dCBvbmx5IG5hbWVcbiAgcmV0dXJuIGZ1bGxOYW1lLnNsaWNlKGJyZWFrSW5kZXgsIC0xKS50cmltKClcbn1cbiIsImV4cG9ydCBjb25zdCBzZXJpYWxpemUgPSAob2JqOiBhbnkpID0+IHtcbiAgY29uc3Qgc3RyOiBhbnlbXSA9IFtdXG4gIGZvciAoY29uc3QgcCBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICBpZiAob2JqW3BdIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBvYmpbcF0ubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgc3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtwXVtpXSkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ci5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbcF0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyLmpvaW4oJyYnKVxufVxuIiwiZXhwb3J0IGNvbnN0IHNwbGl0Q2h1bmtzID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBzaXplID0gMTYwMDBcblxuICBjb25zdCBudW1DaHVua3MgPSBNYXRoLmNlaWwoY29udGVudC5sZW5ndGggLyBzaXplKVxuICBjb25zdCBjaHVua3MgPSBuZXcgQXJyYXkobnVtQ2h1bmtzKVxuXG4gIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG51bUNodW5rczsgKytpLCBvICs9IHNpemUpIHtcbiAgICBjaHVua3NbaV0gPSBjb250ZW50LnN1YnN0cihvLCBzaXplKVxuICB9XG5cbiAgcmV0dXJuIGNodW5rc1xufVxuIiwiZXhwb3J0IGNvbnN0IE1PUkVfSU5GTyA9XG4gICdGb3IgbW9yZSBpbmZvIHNlZSBodHRwczovL3Nhc2pzLmlvL3Nhc2pzLWFkYXB0ZXIvI3JlcXVlc3QtcmVzcG9uc2UnXG5leHBvcnQgY29uc3QgSU5WQUxJRF9UQUJMRV9TVFJVQ1RVUkUgPSBgUGFyYW1ldGVyIGRhdGEgY29udGFpbnMgaW52YWxpZCB0YWJsZSBzdHJ1Y3R1cmUuICR7TU9SRV9JTkZPfWBcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgaW5wdXQgZGF0YSBzdHJ1Y3R1cmUgYW5kIHRhYmxlIG5hbWluZyBjb252ZW50aW9uXG4gKlxuICogQHBhcmFtIGRhdGEgQSBqc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIHRhYmxlcywgaXQgY2FuIGFsc28gYmUgbnVsbFxuICogQHJldHVybnMgQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHR3byBhdHRyaWJ1dGVzOiAxKSBzdGF0dXM6IGJvb2xlYW4sIDIpIG1zZzogc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUlucHV0ID0gKFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbFxuKToge1xuICBzdGF0dXM6IGJvb2xlYW5cbiAgbXNnOiBzdHJpbmdcbn0gPT4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHsgc3RhdHVzOiB0cnVlLCBtc2c6ICcnIH1cblxuICBpZiAoZ2V0VHlwZShkYXRhKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIG1zZzogSU5WQUxJRF9UQUJMRV9TVFJVQ1RVUkVcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc1Nhc0Zvcm1hdHNUYWJsZSA9IChrZXk6IHN0cmluZykgPT5cbiAgICBrZXkubWF0Y2goL15cXCQuKi8pICYmIE9iamVjdC5rZXlzKGRhdGEpLmluY2x1ZGVzKGtleS5yZXBsYWNlKC9eXFwkLywgJycpKVxuXG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlthLXpBLVpfXS8pICYmICFpc1Nhc0Zvcm1hdHNUYWJsZShrZXkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICBtc2c6ICdGaXJzdCBsZXR0ZXIgb2YgdGFibGUgc2hvdWxkIGJlIGFscGhhYmV0IG9yIHVuZGVyc2NvcmUuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgha2V5Lm1hdGNoKC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvKSAmJiAhaXNTYXNGb3JtYXRzVGFibGUoa2V5KSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBmYWxzZSwgbXNnOiAnVGFibGUgbmFtZSBzaG91bGQgYmUgYWxwaGFudW1lcmljLicgfVxuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID4gMzIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgIG1zZzogJ01heGltdW0gbGVuZ3RoIGZvciB0YWJsZSBuYW1lIGNvdWxkIGJlIDMyIGNoYXJhY3RlcnMuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGRhdGFba2V5XSkgIT09ICdBcnJheScgJiYgIWlzU2FzRm9ybWF0c1RhYmxlKGtleSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgIG1zZzogSU5WQUxJRF9UQUJMRV9TVFJVQ1RVUkVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFUzYgaXMgc3RyaWN0ZXIgc28gd2UgaGFkIHRvIGluY2x1ZGUgdGhlIGNoZWNrIGZvciB0aGUgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YVtrZXldKSB7XG4gICAgICAgIGlmIChnZXRUeXBlKGl0ZW0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgbXNnOiBgVGFibGUgJHtrZXl9IGNvbnRhaW5zIGludmFsaWQgc3RydWN0dXJlLiAke01PUkVfSU5GT31gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhpdGVtKVxuICAgICAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmIChpdGVtW2F0dHJpYnV0ZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbXNnOiBgQSByb3cgaW4gdGFibGUgJHtrZXl9IGNvbnRhaW5zIGludmFsaWQgdmFsdWUuIENhbid0IGFzc2lnbiB1bmRlZmluZWQgdG8gJHthdHRyaWJ1dGV9LmBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHN0YXR1czogdHJ1ZSwgbXNnOiAnJyB9XG59XG5cbi8qKlxuICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0eXBlIG9mIHZhcmlhYmxlXG4gKlxuICogQHBhcmFtIGRhdGEgaXQgY291bGQgYmUgYW55dGhpbmcsIGxpa2Ugc3RyaW5nLCBhcnJheSwgb2JqZWN0IGV0Yy5cbiAqIEByZXR1cm5zIGEgc3RyaW5nIHdoaWNoIHRlbGxzIHRoZSB0eXBlIG9mIGlucHV0IHBhcmFtZXRlclxuICovXG5jb25zdCBnZXRUeXBlID0gKGRhdGE6IGFueSk6IHN0cmluZyA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuICdBcnJheSdcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGFcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIEN1cnJlbnRseSBpbiBzeW5jIHdpdGggTm9kZS5qcyBsaWIvaW50ZXJuYWwvdXRpbC90eXBlcy5qc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2NvbW1pdC8xMTJjYzdjMjc1NTEyNTRhYTJiMTcwOThmYjc3NDg2N2YwNWVkMGQ5XG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJndW1lbnRzT2JqZWN0ID0gcmVxdWlyZSgnaXMtYXJndW1lbnRzJyk7XG52YXIgaXNHZW5lcmF0b3JGdW5jdGlvbiA9IHJlcXVpcmUoJ2lzLWdlbmVyYXRvci1mdW5jdGlvbicpO1xudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG52YXIgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnaXMtdHlwZWQtYXJyYXknKTtcblxuZnVuY3Rpb24gdW5jdXJyeVRoaXMoZikge1xuICByZXR1cm4gZi5jYWxsLmJpbmQoZik7XG59XG5cbnZhciBCaWdJbnRTdXBwb3J0ZWQgPSB0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBTeW1ib2xTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcblxudmFyIE9iamVjdFRvU3RyaW5nID0gdW5jdXJyeVRoaXMoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyk7XG5cbnZhciBudW1iZXJWYWx1ZSA9IHVuY3VycnlUaGlzKE51bWJlci5wcm90b3R5cGUudmFsdWVPZik7XG52YXIgc3RyaW5nVmFsdWUgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnZhbHVlT2YpO1xudmFyIGJvb2xlYW5WYWx1ZSA9IHVuY3VycnlUaGlzKEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YpO1xuXG5pZiAoQmlnSW50U3VwcG9ydGVkKSB7XG4gIHZhciBiaWdJbnRWYWx1ZSA9IHVuY3VycnlUaGlzKEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZik7XG59XG5cbmlmIChTeW1ib2xTdXBwb3J0ZWQpIHtcbiAgdmFyIHN5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgcHJvdG90eXBlVmFsdWVPZikge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIHByb3RvdHlwZVZhbHVlT2YodmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0cy5pc0FyZ3VtZW50c09iamVjdCA9IGlzQXJndW1lbnRzT2JqZWN0O1xuZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gaXNHZW5lcmF0b3JGdW5jdGlvbjtcbmV4cG9ydHMuaXNUeXBlZEFycmF5ID0gaXNUeXBlZEFycmF5O1xuXG4vLyBUYWtlbiBmcm9tIGhlcmUgYW5kIG1vZGlmaWVkIGZvciBiZXR0ZXIgYnJvd3NlciBzdXBwb3J0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3AtaXMtcHJvbWlzZS9ibG9iL2NkYTM1YTUxM2JkYTAzZjk3N2FkNWNkZTNhMDc5ZDIzN2U4MmQ3ZWYvaW5kZXguanNcbmZ1bmN0aW9uIGlzUHJvbWlzZShpbnB1dCkge1xuXHRyZXR1cm4gKFxuXHRcdChcblx0XHRcdHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdFx0aW5wdXQgaW5zdGFuY2VvZiBQcm9taXNlXG5cdFx0KSB8fFxuXHRcdChcblx0XHRcdGlucHV0ICE9PSBudWxsICYmXG5cdFx0XHR0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG5cdFx0XHR0eXBlb2YgaW5wdXQudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0dHlwZW9mIGlucHV0LmNhdGNoID09PSAnZnVuY3Rpb24nXG5cdFx0KVxuXHQpO1xufVxuZXhwb3J0cy5pc1Byb21pc2UgPSBpc1Byb21pc2U7XG5cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEFycmF5QnVmZmVyLmlzVmlldykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBpc1R5cGVkQXJyYXkodmFsdWUpIHx8XG4gICAgaXNEYXRhVmlldyh2YWx1ZSlcbiAgKTtcbn1cbmV4cG9ydHMuaXNBcnJheUJ1ZmZlclZpZXcgPSBpc0FycmF5QnVmZmVyVmlldztcblxuXG5mdW5jdGlvbiBpc1VpbnQ4QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdVaW50OEFycmF5Jztcbn1cbmV4cG9ydHMuaXNVaW50OEFycmF5ID0gaXNVaW50OEFycmF5O1xuXG5mdW5jdGlvbiBpc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnVWludDhDbGFtcGVkQXJyYXknO1xufVxuZXhwb3J0cy5pc1VpbnQ4Q2xhbXBlZEFycmF5ID0gaXNVaW50OENsYW1wZWRBcnJheTtcblxuZnVuY3Rpb24gaXNVaW50MTZBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ1VpbnQxNkFycmF5Jztcbn1cbmV4cG9ydHMuaXNVaW50MTZBcnJheSA9IGlzVWludDE2QXJyYXk7XG5cbmZ1bmN0aW9uIGlzVWludDMyQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdVaW50MzJBcnJheSc7XG59XG5leHBvcnRzLmlzVWludDMyQXJyYXkgPSBpc1VpbnQzMkFycmF5O1xuXG5mdW5jdGlvbiBpc0ludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0ludDhBcnJheSc7XG59XG5leHBvcnRzLmlzSW50OEFycmF5ID0gaXNJbnQ4QXJyYXk7XG5cbmZ1bmN0aW9uIGlzSW50MTZBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0ludDE2QXJyYXknO1xufVxuZXhwb3J0cy5pc0ludDE2QXJyYXkgPSBpc0ludDE2QXJyYXk7XG5cbmZ1bmN0aW9uIGlzSW50MzJBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gd2hpY2hUeXBlZEFycmF5KHZhbHVlKSA9PT0gJ0ludDMyQXJyYXknO1xufVxuZXhwb3J0cy5pc0ludDMyQXJyYXkgPSBpc0ludDMyQXJyYXk7XG5cbmZ1bmN0aW9uIGlzRmxvYXQzMkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnRmxvYXQzMkFycmF5Jztcbn1cbmV4cG9ydHMuaXNGbG9hdDMyQXJyYXkgPSBpc0Zsb2F0MzJBcnJheTtcblxuZnVuY3Rpb24gaXNGbG9hdDY0QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdGbG9hdDY0QXJyYXknO1xufVxuZXhwb3J0cy5pc0Zsb2F0NjRBcnJheSA9IGlzRmxvYXQ2NEFycmF5O1xuXG5mdW5jdGlvbiBpc0JpZ0ludDY0QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkgPT09ICdCaWdJbnQ2NEFycmF5Jztcbn1cbmV4cG9ydHMuaXNCaWdJbnQ2NEFycmF5ID0gaXNCaWdJbnQ2NEFycmF5O1xuXG5mdW5jdGlvbiBpc0JpZ1VpbnQ2NEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB3aGljaFR5cGVkQXJyYXkodmFsdWUpID09PSAnQmlnVWludDY0QXJyYXknO1xufVxuZXhwb3J0cy5pc0JpZ1VpbnQ2NEFycmF5ID0gaXNCaWdVaW50NjRBcnJheTtcblxuZnVuY3Rpb24gaXNNYXBUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBNYXBdJztcbn1cbmlzTWFwVG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgaXNNYXBUb1N0cmluZyhuZXcgTWFwKCkpXG4pO1xuXG5mdW5jdGlvbiBpc01hcCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNNYXBUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc01hcFRvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBNYXA7XG59XG5leHBvcnRzLmlzTWFwID0gaXNNYXA7XG5cbmZ1bmN0aW9uIGlzU2V0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgU2V0XSc7XG59XG5pc1NldFRvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzU2V0VG9TdHJpbmcobmV3IFNldCgpKVxuKTtcbmZ1bmN0aW9uIGlzU2V0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc1NldFRvU3RyaW5nLndvcmtpbmdcbiAgICA/IGlzU2V0VG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIFNldDtcbn1cbmV4cG9ydHMuaXNTZXQgPSBpc1NldDtcblxuZnVuY3Rpb24gaXNXZWFrTWFwVG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgV2Vha01hcF0nO1xufVxuaXNXZWFrTWFwVG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzV2Vha01hcFRvU3RyaW5nKG5ldyBXZWFrTWFwKCkpXG4pO1xuZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNXZWFrTWFwVG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNXZWFrTWFwVG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIFdlYWtNYXA7XG59XG5leHBvcnRzLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcblxuZnVuY3Rpb24gaXNXZWFrU2V0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgV2Vha1NldF0nO1xufVxuaXNXZWFrU2V0VG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIFdlYWtTZXQgIT09ICd1bmRlZmluZWQnICYmXG4gIGlzV2Vha1NldFRvU3RyaW5nKG5ldyBXZWFrU2V0KCkpXG4pO1xuZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gIHJldHVybiBpc1dlYWtTZXRUb1N0cmluZyh2YWx1ZSk7XG59XG5leHBvcnRzLmlzV2Vha1NldCA9IGlzV2Vha1NldDtcblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5pc0FycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZyA9IChcbiAgdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc0FycmF5QnVmZmVyVG9TdHJpbmcobmV3IEFycmF5QnVmZmVyKCkpXG4pO1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc0FycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNBcnJheUJ1ZmZlclRvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn1cbmV4cG9ydHMuaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG5cbmZ1bmN0aW9uIGlzRGF0YVZpZXdUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBEYXRhVmlld10nO1xufVxuaXNEYXRhVmlld1RvU3RyaW5nLndvcmtpbmcgPSAoXG4gIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIERhdGFWaWV3ICE9PSAndW5kZWZpbmVkJyAmJlxuICBpc0RhdGFWaWV3VG9TdHJpbmcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSwgMCwgMSkpXG4pO1xuZnVuY3Rpb24gaXNEYXRhVmlldyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc0RhdGFWaWV3VG9TdHJpbmcud29ya2luZ1xuICAgID8gaXNEYXRhVmlld1RvU3RyaW5nKHZhbHVlKVxuICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRhVmlldztcbn1cbmV4cG9ydHMuaXNEYXRhVmlldyA9IGlzRGF0YVZpZXc7XG5cbi8vIFN0b3JlIGEgY29weSBvZiBTaGFyZWRBcnJheUJ1ZmZlciBpbiBjYXNlIGl0J3MgZGVsZXRlZCBlbHNld2hlcmVcbnZhciBTaGFyZWRBcnJheUJ1ZmZlckNvcHkgPSB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnID8gU2hhcmVkQXJyYXlCdWZmZXIgOiB1bmRlZmluZWQ7XG5mdW5jdGlvbiBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdJztcbn1cbmZ1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlckNvcHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZyA9IGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZyhuZXcgU2hhcmVkQXJyYXlCdWZmZXJDb3B5KCkpO1xuICB9XG5cbiAgcmV0dXJuIGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nXG4gICAgPyBpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcodmFsdWUpXG4gICAgOiB2YWx1ZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyQ29weTtcbn1cbmV4cG9ydHMuaXNTaGFyZWRBcnJheUJ1ZmZlciA9IGlzU2hhcmVkQXJyYXlCdWZmZXI7XG5cbmZ1bmN0aW9uIGlzQXN5bmNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXSc7XG59XG5leHBvcnRzLmlzQXN5bmNGdW5jdGlvbiA9IGlzQXN5bmNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNNYXBJdGVyYXRvcih2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBNYXAgSXRlcmF0b3JdJztcbn1cbmV4cG9ydHMuaXNNYXBJdGVyYXRvciA9IGlzTWFwSXRlcmF0b3I7XG5cbmZ1bmN0aW9uIGlzU2V0SXRlcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgU2V0IEl0ZXJhdG9yXSc7XG59XG5leHBvcnRzLmlzU2V0SXRlcmF0b3IgPSBpc1NldEl0ZXJhdG9yO1xuXG5mdW5jdGlvbiBpc0dlbmVyYXRvck9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0VG9TdHJpbmcodmFsdWUpID09PSAnW29iamVjdCBHZW5lcmF0b3JdJztcbn1cbmV4cG9ydHMuaXNHZW5lcmF0b3JPYmplY3QgPSBpc0dlbmVyYXRvck9iamVjdDtcblxuZnVuY3Rpb24gaXNXZWJBc3NlbWJseUNvbXBpbGVkTW9kdWxlKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3RUb1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFdlYkFzc2VtYmx5Lk1vZHVsZV0nO1xufVxuZXhwb3J0cy5pc1dlYkFzc2VtYmx5Q29tcGlsZWRNb2R1bGUgPSBpc1dlYkFzc2VtYmx5Q29tcGlsZWRNb2R1bGU7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBudW1iZXJWYWx1ZSk7XG59XG5leHBvcnRzLmlzTnVtYmVyT2JqZWN0ID0gaXNOdW1iZXJPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBzdHJpbmdWYWx1ZSk7XG59XG5leHBvcnRzLmlzU3RyaW5nT2JqZWN0ID0gaXNTdHJpbmdPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSwgYm9vbGVhblZhbHVlKTtcbn1cbmV4cG9ydHMuaXNCb29sZWFuT2JqZWN0ID0gaXNCb29sZWFuT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0JpZ0ludE9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gQmlnSW50U3VwcG9ydGVkICYmIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsIGJpZ0ludFZhbHVlKTtcbn1cbmV4cG9ydHMuaXNCaWdJbnRPYmplY3QgPSBpc0JpZ0ludE9iamVjdDtcblxuZnVuY3Rpb24gaXNTeW1ib2xPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIFN5bWJvbFN1cHBvcnRlZCAmJiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLCBzeW1ib2xWYWx1ZSk7XG59XG5leHBvcnRzLmlzU3ltYm9sT2JqZWN0ID0gaXNTeW1ib2xPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzQm94ZWRQcmltaXRpdmUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICBpc051bWJlck9iamVjdCh2YWx1ZSkgfHxcbiAgICBpc1N0cmluZ09iamVjdCh2YWx1ZSkgfHxcbiAgICBpc0Jvb2xlYW5PYmplY3QodmFsdWUpIHx8XG4gICAgaXNCaWdJbnRPYmplY3QodmFsdWUpIHx8XG4gICAgaXNTeW1ib2xPYmplY3QodmFsdWUpXG4gICk7XG59XG5leHBvcnRzLmlzQm94ZWRQcmltaXRpdmUgPSBpc0JveGVkUHJpbWl0aXZlO1xuXG5mdW5jdGlvbiBpc0FueUFycmF5QnVmZmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgKFxuICAgIGlzQXJyYXlCdWZmZXIodmFsdWUpIHx8XG4gICAgaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZSlcbiAgKTtcbn1cbmV4cG9ydHMuaXNBbnlBcnJheUJ1ZmZlciA9IGlzQW55QXJyYXlCdWZmZXI7XG5cblsnaXNQcm94eScsICdpc0V4dGVybmFsJywgJ2lzTW9kdWxlTmFtZXNwYWNlT2JqZWN0J10uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG1ldGhvZCwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXRob2QgKyAnIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdXNlcmxhbmQnKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB8fFxuICBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaikge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc2NyaXB0b3JzW2tleXNbaV1dID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcnM7XG4gIH07XG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52UmVnZXggPSAvXiQvO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykge1xuICB2YXIgZGVidWdFbnYgPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHO1xuICBkZWJ1Z0VudiA9IGRlYnVnRW52LnJlcGxhY2UoL1t8XFxcXHt9KClbXFxdXiQrPy5dL2csICdcXFxcJCYnKVxuICAgIC5yZXBsYWNlKC9cXCovZywgJy4qJylcbiAgICAucmVwbGFjZSgvLC9nLCAnJHxeJylcbiAgICAudG9VcHBlckNhc2UoKTtcbiAgZGVidWdFbnZSZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgZGVidWdFbnYgKyAnJCcsICdpJyk7XG59XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKGRlYnVnRW52UmVnZXgudGVzdChzZXQpKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnNsaWNlKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMSwgLTEpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmV4cG9ydHMudHlwZXMgPSByZXF1aXJlKCcuL3N1cHBvcnQvdHlwZXMnKTtcblxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbmV4cG9ydHMudHlwZXMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5leHBvcnRzLnR5cGVzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuZXhwb3J0cy50eXBlcy5pc05hdGl2ZUVycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxudmFyIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gU3ltYm9sKCd1dGlsLnByb21pc2lmeS5jdXN0b20nKSA6IHVuZGVmaW5lZDtcblxuZXhwb3J0cy5wcm9taXNpZnkgPSBmdW5jdGlvbiBwcm9taXNpZnkob3JpZ2luYWwpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcmlnaW5hbFwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuXG4gIGlmIChrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wgJiYgb3JpZ2luYWxba0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXSkge1xuICAgIHZhciBmbiA9IG9yaWdpbmFsW2tDdXN0b21Qcm9taXNpZmllZFN5bWJvbF07XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidXRpbC5wcm9taXNpZnkuY3VzdG9tXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZm4sIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZuKCkge1xuICAgIHZhciBwcm9taXNlUmVzb2x2ZSwgcHJvbWlzZVJlamVjdDtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHByb21pc2VSZWplY3QoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2VSZXNvbHZlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHByb21pc2VSZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihmbiwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsKSk7XG5cbiAgaWYgKGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wsIHtcbiAgICB2YWx1ZTogZm4sIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFxuICAgIGZuLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpXG4gICk7XG59XG5cbmV4cG9ydHMucHJvbWlzaWZ5LmN1c3RvbSA9IGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbFxuXG5mdW5jdGlvbiBjYWxsYmFja2lmeU9uUmVqZWN0ZWQocmVhc29uLCBjYikge1xuICAvLyBgIXJlYXNvbmAgZ3VhcmQgaW5zcGlyZWQgYnkgYmx1ZWJpcmQgKFJlZjogaHR0cHM6Ly9nb28uZ2wvdDVJUzZNKS5cbiAgLy8gQmVjYXVzZSBgbnVsbGAgaXMgYSBzcGVjaWFsIGVycm9yIHZhbHVlIGluIGNhbGxiYWNrcyB3aGljaCBtZWFucyBcIm5vIGVycm9yXG4gIC8vIG9jY3VycmVkXCIsIHdlIGVycm9yLXdyYXAgc28gdGhlIGNhbGxiYWNrIGNvbnN1bWVyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuXG4gIC8vIFwidGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBudWxsXCIgb3IgXCJ0aGUgcHJvbWlzZSBmdWxmaWxsZWQgd2l0aCB1bmRlZmluZWRcIi5cbiAgaWYgKCFyZWFzb24pIHtcbiAgICB2YXIgbmV3UmVhc29uID0gbmV3IEVycm9yKCdQcm9taXNlIHdhcyByZWplY3RlZCB3aXRoIGEgZmFsc3kgdmFsdWUnKTtcbiAgICBuZXdSZWFzb24ucmVhc29uID0gcmVhc29uO1xuICAgIHJlYXNvbiA9IG5ld1JlYXNvbjtcbiAgfVxuICByZXR1cm4gY2IocmVhc29uKTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tpZnkob3JpZ2luYWwpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9yaWdpbmFsXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG4gIH1cblxuICAvLyBXZSBETyBOT1QgcmV0dXJuIHRoZSBwcm9taXNlIGFzIGl0IGdpdmVzIHRoZSB1c2VyIGEgZmFsc2Ugc2Vuc2UgdGhhdFxuICAvLyB0aGUgcHJvbWlzZSBpcyBhY3R1YWxseSBzb21laG93IHJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrJ3MgZXhlY3V0aW9uXG4gIC8vIGFuZCB0aGF0IHRoZSBjYWxsYmFjayB0aHJvd2luZyB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZS5cbiAgZnVuY3Rpb24gY2FsbGJhY2tpZmllZCgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICB2YXIgbWF5YmVDYiA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiBtYXliZUNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG1heWJlQ2IuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIC8vIEluIHRydWUgbm9kZSBzdHlsZSB3ZSBwcm9jZXNzIHRoZSBjYWxsYmFjayBvbiBgbmV4dFRpY2tgIHdpdGggYWxsIHRoZVxuICAgIC8vIGltcGxpY2F0aW9ucyAoc3RhY2ssIGB1bmNhdWdodEV4Y2VwdGlvbmAsIGBhc3luY19ob29rc2ApXG4gICAgb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncylcbiAgICAgIC50aGVuKGZ1bmN0aW9uKHJldCkgeyBwcm9jZXNzLm5leHRUaWNrKGNiLmJpbmQobnVsbCwgbnVsbCwgcmV0KSkgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHJlaikgeyBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNraWZ5T25SZWplY3RlZC5iaW5kKG51bGwsIHJlaiwgY2IpKSB9KTtcbiAgfVxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihjYWxsYmFja2lmaWVkLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2FsbGJhY2tpZmllZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCkpO1xuICByZXR1cm4gY2FsbGJhY2tpZmllZDtcbn1cbmV4cG9ydHMuY2FsbGJhY2tpZnkgPSBjYWxsYmFja2lmeTtcbiIsIihmdW5jdGlvbihtb2R1bGUpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBtb2R1bGUuZXhwb3J0cy5pc191cmkgPSBpc19pcmk7XG4gICAgbW9kdWxlLmV4cG9ydHMuaXNfaHR0cF91cmkgPSBpc19odHRwX2lyaTtcbiAgICBtb2R1bGUuZXhwb3J0cy5pc19odHRwc191cmkgPSBpc19odHRwc19pcmk7XG4gICAgbW9kdWxlLmV4cG9ydHMuaXNfd2ViX3VyaSA9IGlzX3dlYl9pcmk7XG4gICAgLy8gQ3JlYXRlIGFsaWFzZXNcbiAgICBtb2R1bGUuZXhwb3J0cy5pc1VyaSA9IGlzX2lyaTtcbiAgICBtb2R1bGUuZXhwb3J0cy5pc0h0dHBVcmkgPSBpc19odHRwX2lyaTtcbiAgICBtb2R1bGUuZXhwb3J0cy5pc0h0dHBzVXJpID0gaXNfaHR0cHNfaXJpO1xuICAgIG1vZHVsZS5leHBvcnRzLmlzV2ViVXJpID0gaXNfd2ViX2lyaTtcblxuXG4gICAgLy8gcHJpdmF0ZSBmdW5jdGlvblxuICAgIC8vIGludGVybmFsIFVSSSBzcGl0dGVyIG1ldGhvZCAtIGRpcmVjdCBmcm9tIFJGQyAzOTg2XG4gICAgdmFyIHNwbGl0VXJpID0gZnVuY3Rpb24odXJpKSB7XG4gICAgICAgIHZhciBzcGxpdHRlZCA9IHVyaS5tYXRjaCgvKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKFteXFwvPyNdKikpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IyguKikpPy8pO1xuICAgICAgICByZXR1cm4gc3BsaXR0ZWQ7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGlzX2lyaSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjaGFyYWN0ZXJzXG4gICAgICAgIGlmICgvW15hLXowLTlcXDpcXC9cXD9cXCNcXFtcXF1cXEBcXCFcXCRcXCZcXCdcXChcXClcXCpcXCtcXCxcXDtcXD1cXC5cXC1cXF9cXH5cXCVdL2kudGVzdCh2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBmb3IgaGV4IGVzY2FwZXMgdGhhdCBhcmVuJ3QgY29tcGxldGVcbiAgICAgICAgaWYgKC8lW14wLTlhLWZdL2kudGVzdCh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKC8lWzAtOWEtZl0oOj9bXjAtOWEtZl18JCkvaS50ZXN0KHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBzcGxpdHRlZCA9IFtdO1xuICAgICAgICB2YXIgc2NoZW1lID0gJyc7XG4gICAgICAgIHZhciBhdXRob3JpdHkgPSAnJztcbiAgICAgICAgdmFyIHBhdGggPSAnJztcbiAgICAgICAgdmFyIHF1ZXJ5ID0gJyc7XG4gICAgICAgIHZhciBmcmFnbWVudCA9ICcnO1xuICAgICAgICB2YXIgb3V0ID0gJyc7XG5cbiAgICAgICAgLy8gZnJvbSBSRkMgMzk4NlxuICAgICAgICBzcGxpdHRlZCA9IHNwbGl0VXJpKHZhbHVlKTtcbiAgICAgICAgc2NoZW1lID0gc3BsaXR0ZWRbMV07IFxuICAgICAgICBhdXRob3JpdHkgPSBzcGxpdHRlZFsyXTtcbiAgICAgICAgcGF0aCA9IHNwbGl0dGVkWzNdO1xuICAgICAgICBxdWVyeSA9IHNwbGl0dGVkWzRdO1xuICAgICAgICBmcmFnbWVudCA9IHNwbGl0dGVkWzVdO1xuXG4gICAgICAgIC8vIHNjaGVtZSBhbmQgcGF0aCBhcmUgcmVxdWlyZWQsIHRob3VnaCB0aGUgcGF0aCBjYW4gYmUgZW1wdHlcbiAgICAgICAgaWYgKCEoc2NoZW1lICYmIHNjaGVtZS5sZW5ndGggJiYgcGF0aC5sZW5ndGggPj0gMCkpIHJldHVybjtcblxuICAgICAgICAvLyBpZiBhdXRob3JpdHkgaXMgcHJlc2VudCwgdGhlIHBhdGggbXVzdCBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgL1xuICAgICAgICBpZiAoYXV0aG9yaXR5ICYmIGF1dGhvcml0eS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghKHBhdGgubGVuZ3RoID09PSAwIHx8IC9eXFwvLy50ZXN0KHBhdGgpKSkgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgYXV0aG9yaXR5IGlzIG5vdCBwcmVzZW50LCB0aGUgcGF0aCBtdXN0IG5vdCBzdGFydCB3aXRoIC8vXG4gICAgICAgICAgICBpZiAoL15cXC9cXC8vLnRlc3QocGF0aCkpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjaGVtZSBtdXN0IGJlZ2luIHdpdGggYSBsZXR0ZXIsIHRoZW4gY29uc2lzdCBvZiBsZXR0ZXJzLCBkaWdpdHMsICssIC4sIG9yIC1cbiAgICAgICAgaWYgKCEvXlthLXpdW2EtejAtOVxcK1xcLVxcLl0qJC8udGVzdChzY2hlbWUudG9Mb3dlckNhc2UoKSkpICByZXR1cm47XG5cbiAgICAgICAgLy8gcmUtYXNzZW1ibGUgdGhlIFVSTCBwZXIgc2VjdGlvbiA1LjMgaW4gUkZDIDM5ODZcbiAgICAgICAgb3V0ICs9IHNjaGVtZSArICc6JztcbiAgICAgICAgaWYgKGF1dGhvcml0eSAmJiBhdXRob3JpdHkubGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXQgKz0gJy8vJyArIGF1dGhvcml0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dCArPSBwYXRoO1xuXG4gICAgICAgIGlmIChxdWVyeSAmJiBxdWVyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG91dCArPSAnPycgKyBxdWVyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnbWVudCAmJiBmcmFnbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIG91dCArPSAnIycgKyBmcmFnbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNfaHR0cF9pcmkodmFsdWUsIGFsbG93SHR0cHMpIHtcbiAgICAgICAgaWYgKCFpc19pcmkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3BsaXR0ZWQgPSBbXTtcbiAgICAgICAgdmFyIHNjaGVtZSA9ICcnO1xuICAgICAgICB2YXIgYXV0aG9yaXR5ID0gJyc7XG4gICAgICAgIHZhciBwYXRoID0gJyc7XG4gICAgICAgIHZhciBwb3J0ID0gJyc7XG4gICAgICAgIHZhciBxdWVyeSA9ICcnO1xuICAgICAgICB2YXIgZnJhZ21lbnQgPSAnJztcbiAgICAgICAgdmFyIG91dCA9ICcnO1xuXG4gICAgICAgIC8vIGZyb20gUkZDIDM5ODZcbiAgICAgICAgc3BsaXR0ZWQgPSBzcGxpdFVyaSh2YWx1ZSk7XG4gICAgICAgIHNjaGVtZSA9IHNwbGl0dGVkWzFdOyBcbiAgICAgICAgYXV0aG9yaXR5ID0gc3BsaXR0ZWRbMl07XG4gICAgICAgIHBhdGggPSBzcGxpdHRlZFszXTtcbiAgICAgICAgcXVlcnkgPSBzcGxpdHRlZFs0XTtcbiAgICAgICAgZnJhZ21lbnQgPSBzcGxpdHRlZFs1XTtcblxuICAgICAgICBpZiAoIXNjaGVtZSkgIHJldHVybjtcblxuICAgICAgICBpZihhbGxvd0h0dHBzKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2h0dHBzJykgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNjaGVtZS50b0xvd2VyQ2FzZSgpICE9ICdodHRwJykgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZnVsbHktcXVhbGlmaWVkIFVSSXMgbXVzdCBoYXZlIGFuIGF1dGhvcml0eSBzZWN0aW9uIHRoYXQgaXNcbiAgICAgICAgLy8gYSB2YWxpZCBob3N0XG4gICAgICAgIGlmICghYXV0aG9yaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmFibGUgcG9ydCBjb21wb25lbnRcbiAgICAgICAgaWYgKC86KFxcZCspJC8udGVzdChhdXRob3JpdHkpKSB7XG4gICAgICAgICAgICBwb3J0ID0gYXV0aG9yaXR5Lm1hdGNoKC86KFxcZCspJC8pWzBdO1xuICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnJlcGxhY2UoLzpcXGQrJC8sICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dCArPSBzY2hlbWUgKyAnOic7XG4gICAgICAgIG91dCArPSAnLy8nICsgYXV0aG9yaXR5O1xuICAgICAgICBcbiAgICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgICAgIG91dCArPSBwb3J0O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBvdXQgKz0gcGF0aDtcbiAgICAgICAgXG4gICAgICAgIGlmKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCl7XG4gICAgICAgICAgICBvdXQgKz0gJz8nICsgcXVlcnk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihmcmFnbWVudCAmJiBmcmFnbWVudC5sZW5ndGgpe1xuICAgICAgICAgICAgb3V0ICs9ICcjJyArIGZyYWdtZW50O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzX2h0dHBzX2lyaSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaXNfaHR0cF9pcmkodmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzX3dlYl9pcmkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChpc19odHRwX2lyaSh2YWx1ZSkgfHwgaXNfaHR0cHNfaXJpKHZhbHVlKSk7XG4gICAgfVxuXG59KShtb2R1bGUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJ2Zvci1lYWNoJyk7XG52YXIgYXZhaWxhYmxlVHlwZWRBcnJheXMgPSByZXF1aXJlKCdhdmFpbGFibGUtdHlwZWQtYXJyYXlzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJ2dldC1wcm90bycpO1xuXG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG52YXIgZyA9IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IGdsb2JhbFRoaXM7XG52YXIgdHlwZWRBcnJheXMgPSBhdmFpbGFibGVUeXBlZEFycmF5cygpO1xuXG52YXIgJHNsaWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnNsaWNlJyk7XG5cbi8qKiBAaW1wb3J0IHsgQm91bmRTZXQsIEJvdW5kU2xpY2UsIENhY2hlLCBHZXR0ZXIgfSBmcm9tICcuL3R5cGVzJyAqL1xuLyoqIEBpbXBvcnQgeyBUeXBlZEFycmF5TmFtZSB9IGZyb20gJy4nICovXG5cbi8qKiBAdHlwZSB7PFQgPSB1bmtub3duPihhcnJheTogcmVhZG9ubHkgVFtdLCB2YWx1ZTogdW5rbm93bikgPT4gbnVtYmVyfSAqL1xudmFyICRpbmRleE9mID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUuaW5kZXhPZicsIHRydWUpIHx8IGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRpZiAoYXJyYXlbaV0gPT09IHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufTtcblxuLyoqIEB0eXBlIHtDYWNoZX0gKi9cbnZhciBjYWNoZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5pZiAoaGFzVG9TdHJpbmdUYWcgJiYgZ09QRCAmJiBnZXRQcm90bykge1xuXHRmb3JFYWNoKHR5cGVkQXJyYXlzLCBmdW5jdGlvbiAodHlwZWRBcnJheSkge1xuXHRcdHZhciBhcnIgPSBuZXcgZ1t0eXBlZEFycmF5XSgpO1xuXHRcdGlmIChTeW1ib2wudG9TdHJpbmdUYWcgaW4gYXJyICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YXIgcHJvdG8gPSBnZXRQcm90byhhcnIpO1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyB3b24ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZVxuXHRcdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHByb3RvLCBTeW1ib2wudG9TdHJpbmdUYWcpO1xuXHRcdFx0aWYgKCFkZXNjcmlwdG9yICYmIHByb3RvKSB7XG5cdFx0XHRcdHZhciBzdXBlclByb3RvID0gZ2V0UHJvdG8ocHJvdG8pO1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIHdvbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlXG5cdFx0XHRcdGRlc2NyaXB0b3IgPSBnT1BEKHN1cGVyUHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmdldCkge1xuXHRcdFx0XHR2YXIgYm91bmQgPSBjYWxsQmluZChkZXNjcmlwdG9yLmdldCk7XG5cdFx0XHRcdGNhY2hlW1xuXHRcdFx0XHRcdC8qKiBAdHlwZSB7YCQke1R5cGVkQXJyYXlOYW1lfWB9ICovXG5cdFx0XHRcdFx0KCckJyArIHR5cGVkQXJyYXkpXG5cdFx0XHRcdF0gPSBib3VuZDtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSBlbHNlIHtcblx0Zm9yRWFjaCh0eXBlZEFycmF5cywgZnVuY3Rpb24gKHR5cGVkQXJyYXkpIHtcblx0XHR2YXIgYXJyID0gbmV3IGdbdHlwZWRBcnJheV0oKTtcblx0XHR2YXIgZm4gPSBhcnIuc2xpY2UgfHwgYXJyLnNldDtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhciBib3VuZCA9IC8qKiBAdHlwZSB7Qm91bmRTbGljZSB8IEJvdW5kU2V0fSAqLyAoXG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBGSVhNRVxuXHRcdFx0XHRjYWxsQmluZChmbilcblx0XHRcdCk7XG5cdFx0XHRjYWNoZVtcblx0XHRcdFx0LyoqIEB0eXBlIHtgJCR7VHlwZWRBcnJheU5hbWV9YH0gKi9cblx0XHRcdFx0KCckJyArIHR5cGVkQXJyYXkpXG5cdFx0XHRdID0gYm91bmQ7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqIEB0eXBlIHsodmFsdWU6IG9iamVjdCkgPT4gZmFsc2UgfCBUeXBlZEFycmF5TmFtZX0gKi9cbmZ1bmN0aW9uIHRyeVR5cGVkQXJyYXlzKHZhbHVlKSB7XG5cdC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgdHJ5VHlwZWRBcnJheXM+fSAqLyB2YXIgZm91bmQgPSBmYWxzZTtcblx0Zm9yRWFjaChcblx0XHQvKiogQHR5cGUge1JlY29yZDxgJCR7VHlwZWRBcnJheU5hbWV9YCwgR2V0dGVyPn0gKi8gKGNhY2hlKSxcblx0XHQvKiogQHBhcmFtIHtHZXR0ZXJ9IGdldHRlciBAcGFyYW0ge2AkJHtUeXBlZEFycmF5TmFtZX1gfSB0eXBlZEFycmF5ICovXG5cdFx0ZnVuY3Rpb24gKGdldHRlciwgdHlwZWRBcnJheSkge1xuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgYSB0aHJvdyBpcyBmaW5lIGhlcmVcblx0XHRcdFx0XHRpZiAoJyQnICsgZ2V0dGVyKHZhbHVlKSA9PT0gdHlwZWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAvKiogQHR5cGUge1R5cGVkQXJyYXlOYW1lfSAqLyAoJHNsaWNlKHR5cGVkQXJyYXksIDEpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xuXHRyZXR1cm4gZm91bmQ7XG59XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiBvYmplY3QpID0+IGZhbHNlIHwgVHlwZWRBcnJheU5hbWV9ICovXG5mdW5jdGlvbiB0cnlTbGljZXModmFsdWUpIHtcblx0LyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cnlTbGljZXM+fSAqLyB2YXIgZm91bmQgPSBmYWxzZTtcblx0Zm9yRWFjaChcblx0XHQvKiogQHR5cGUge1JlY29yZDxgJCR7VHlwZWRBcnJheU5hbWV9YCwgR2V0dGVyPn0gKi8oY2FjaGUpLFxuXHRcdC8qKiBAcGFyYW0ge0dldHRlcn0gZ2V0dGVyIEBwYXJhbSB7YCQke1R5cGVkQXJyYXlOYW1lfWB9IG5hbWUgKi8gZnVuY3Rpb24gKGdldHRlciwgbmFtZSkge1xuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgYSB0aHJvdyBpcyBmaW5lIGhlcmVcblx0XHRcdFx0XHRnZXR0ZXIodmFsdWUpO1xuXHRcdFx0XHRcdGZvdW5kID0gLyoqIEB0eXBlIHtUeXBlZEFycmF5TmFtZX0gKi8gKCRzbGljZShuYW1lLCAxKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xuXHRyZXR1cm4gZm91bmQ7XG59XG5cbi8qKiBAdHlwZSB7KHRhZzogdW5rbm93bikgPT4gdGFnIGlzIHR5cGVvZiB0eXBlZEFycmF5c1tudW1iZXJdfSAqL1xuZnVuY3Rpb24gaXNUQVRhZyh0YWcpIHtcblx0cmV0dXJuICRpbmRleE9mKHR5cGVkQXJyYXlzLCB0YWcpID4gLTE7XG59XG5cbi8qKlxuICogQHR5cGUge2ltcG9ydCgnLicpfVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKCFoYXNUb1N0cmluZ1RhZykge1xuXHRcdHZhciB0YWcgPSAkc2xpY2UoJHRvU3RyaW5nKHZhbHVlKSwgOCwgLTEpO1xuXHRcdGlmIChpc1RBVGFnKHRhZykpIHtcblx0XHRcdHJldHVybiB0YWc7XG5cdFx0fVxuXHRcdGlmICh0YWcgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIG5vZGUgPCAwLjYgaGl0cyBoZXJlIG9uIHJlYWwgVHlwZWQgQXJyYXlzXG5cdFx0cmV0dXJuIHRyeVNsaWNlcyh2YWx1ZSk7XG5cdH1cblx0aWYgKCFnT1BEKSB7IHJldHVybiBudWxsOyB9IC8vIHVua25vd24gZW5naW5lXG5cdHJldHVybiB0cnlUeXBlZEFycmF5cyh2YWx1ZSk7XG59O1xuIiwiLyogKGlnbm9yZWQpICovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcG9zc2libGVOYW1lcyA9IHJlcXVpcmUoJ3Bvc3NpYmxlLXR5cGVkLWFycmF5LW5hbWVzJyk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXZhaWxhYmxlVHlwZWRBcnJheXMoKSB7XG5cdHZhciAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGF2YWlsYWJsZVR5cGVkQXJyYXlzPn0gKi8gb3V0ID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcG9zc2libGVOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgZ1twb3NzaWJsZU5hbWVzW2ldXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvclxuXHRcdFx0b3V0W291dC5sZW5ndGhdID0gcG9zc2libGVOYW1lc1tpXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dDtcbn07XG4iLCIvKiEgQXhpb3MgdjEuMTguMSBDb3B5cmlnaHQgKGMpIDIwMjYgTWF0dCBaYWJyaXNraWUgYW5kIGNvbnRyaWJ1dG9ycyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZSBhIGJvdW5kIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIGB0aGlzYCBjb250ZXh0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmluZFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIC0gVGhlIHZhbHVlIHRvIGJlIHBhc3NlZCBhcyB0aGUgYHRoaXNgIHBhcmFtZXRlclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGB0aGlzYCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHsgdG9TdHJpbmcgfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IGl0ZXJhdG9yLCB0b1N0cmluZ1RhZyB9ID0gU3ltYm9sO1xuXG4vKiBDcmVhdGluZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGEgcHJvcGVydHkuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IChcbiAgKHsgaGFzT3duUHJvcGVydHkgfSkgPT5cbiAgKG9iaiwgcHJvcCkgPT5cbiAgICBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbikoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogV2FsayB0aGUgcHJvdG90eXBlIGNoYWluIChleGNsdWRpbmcgdGhlIHNoYXJlZCBPYmplY3QucHJvdG90eXBlKSBsb29raW5nIGZvclxuICogYW4gb3duIGBwcm9wYC4gVGhpcyBkaXN0aW5ndWlzaGVzIGdlbnVpbmUgb3duL2luaGVyaXRlZCBtZW1iZXJzIOKAlCBpbmNsdWRpbmdcbiAqIGNsYXNzIGFjY2Vzc29ycyBhbmQgdGVtcGxhdGUgcHJvdG90eXBlcyDigJQgZnJvbSBtZW1iZXJzIGluamVjdGVkIHZpYVxuICogT2JqZWN0LnByb3RvdHlwZSBwb2xsdXRpb24gKGUuZy4gYE9iamVjdC5wcm90b3R5cGUudXNlcm5hbWUgPSAnLi4uJ2ApLCB3aGljaFxuICogbGl2ZSBvbiBPYmplY3QucHJvdG90eXBlIGl0c2VsZiBhbmQgYXJlIHRoZXJlZm9yZSBuZXZlciBtYXRjaGVkLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHdob3NlIGNoYWluIHRvIGluc3BlY3RcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gcHJvcCBUaGUgcHJvcGVydHkga2V5IHRvIGxvb2sgZm9yXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBgcHJvcGAgaXMgb3duZWQgYmVsb3cgT2JqZWN0LnByb3RvdHlwZVxuICovXG5jb25zdCBoYXNPd25JblByb3RvdHlwZUNoYWluID0gKHRoaW5nLCBwcm9wKSA9PiB7XG4gIGxldCBvYmogPSB0aGluZztcbiAgY29uc3Qgc2VlbiA9IFtdO1xuXG4gIHdoaWxlIChvYmogIT0gbnVsbCAmJiBvYmogIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBpZiAoc2Vlbi5pbmRleE9mKG9iaikgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNlZW4ucHVzaChvYmopO1xuXG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBvYmogPSBnZXRQcm90b3R5cGVPZihvYmopO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmVhZCBgb2JqW3Byb3BdYCBvbmx5IHdoZW4gaXQgaXMgc2FmZSBmcm9tIE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uLiBPd25cbiAqIHByb3BlcnRpZXMgYW5kIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gYSBub24tT2JqZWN0LnByb3RvdHlwZSBzb3VyY2UgKGEgY2xhc3NcbiAqIGluc3RhbmNlIG9yIHRlbXBsYXRlIG9iamVjdCkgYXJlIGhvbm9yZWQ7IGEgdmFsdWUgcmVhY2hhYmxlIG9ubHkgdGhyb3VnaCBhXG4gKiBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlIGlzIGlnbm9yZWQgYW5kIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IHByb3AgVGhlIHByb3BlcnR5IGtleSB0byByZWFkXG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXNvbHZlZCB2YWx1ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdW5zYWZlL2Fic2VudFxuICovXG5jb25zdCBnZXRTYWZlUHJvcCA9IChvYmosIHByb3ApID0+XG4gIG9iaiAhPSBudWxsICYmIGhhc093bkluUHJvdG90eXBlQ2hhaW4ob2JqLCBwcm9wKSA/IG9ialtwcm9wXSA6IHVuZGVmaW5lZDtcblxuY29uc3Qga2luZE9mID0gKChjYWNoZSkgPT4gKHRoaW5nKSA9PiB7XG4gIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGU7XG59O1xuXG5jb25zdCB0eXBlT2ZUZXN0ID0gKHR5cGUpID0+ICh0aGluZykgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgbm9uLW51bGwgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gKFxuICAgIHZhbCAhPT0gbnVsbCAmJlxuICAgICFpc1VuZGVmaW5lZCh2YWwpICYmXG4gICAgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmXG4gICAgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcikgJiZcbiAgICBpc0Z1bmN0aW9uJDEodmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJlxuICAgIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdmFsICYmIHZhbC5idWZmZXIgJiYgaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiQxID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSAodGhpbmcpID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKFxuICAgIChwcm90b3R5cGUgPT09IG51bGwgfHxcbiAgICAgIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiZcbiAgICAvLyBUcmVhdCBhbnkgZ2VudWluZSAobm9uLU9iamVjdC5wcm90b3R5cGUtcG9sbHV0ZWQpIFN5bWJvbC50b1N0cmluZ1RhZyBvclxuICAgIC8vIFN5bWJvbC5pdGVyYXRvciBhcyBldmlkZW5jZSB0aGUgdmFsdWUgaXMgYSB0YWdnZWQvaXRlcmFibGUgdHlwZSByYXRoZXJcbiAgICAvLyB0aGFuIGEgcGxhaW4gb2JqZWN0LCB3aGlsZSBpZ25vcmluZyBrZXlzIGluamVjdGVkIG9udG8gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAhaGFzT3duSW5Qcm90b3R5cGVDaGFpbih2YWwsIHRvU3RyaW5nVGFnKSAmJlxuICAgICFoYXNPd25JblByb3RvdHlwZUNoYWluKHZhbCwgaXRlcmF0b3IpXG4gICk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIGVtcHR5IG9iamVjdCAoc2FmZWx5IGhhbmRsZXMgQnVmZmVycylcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIGVtcHR5IG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRW1wdHlPYmplY3QgPSAodmFsKSA9PiB7XG4gIC8vIEVhcmx5IHJldHVybiBmb3Igbm9uLW9iamVjdHMgb3IgQnVmZmVycyB0byBwcmV2ZW50IFJhbmdlRXJyb3JcbiAgaWYgKCFpc09iamVjdCh2YWwpIHx8IGlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PT0gMCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEZhbGxiYWNrIGZvciBhbnkgb3RoZXIgb2JqZWN0cyB0aGF0IG1pZ2h0IGNhdXNlIFJhbmdlRXJyb3Igd2l0aCBPYmplY3Qua2V5cygpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVhY3QgTmF0aXZlIEJsb2JcbiAqIFJlYWN0IE5hdGl2ZSBcImJsb2JcIjogYW4gb2JqZWN0IHdpdGggYSBgdXJpYCBhdHRyaWJ1dGUuIE9wdGlvbmFsbHksIGl0IGNhblxuICogYWxzbyBoYXZlIGEgYG5hbWVgIGFuZCBgdHlwZWAgYXR0cmlidXRlIHRvIHNwZWNpZnkgZmlsZW5hbWUgYW5kIGNvbnRlbnQgdHlwZVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9ibG9iLzI2Njg0Y2YzYWRmNDA5NGViNmM0MDVkMzQ1YTc1YmY4YzdjMGJmODgvTGlicmFyaWVzL05ldHdvcmsvRm9ybURhdGEuanMjTDY4LUw3MVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlYWN0IE5hdGl2ZSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWFjdE5hdGl2ZUJsb2IgPSAodmFsdWUpID0+IHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51cmkgIT09ICd1bmRlZmluZWQnKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGVudmlyb25tZW50IGlzIFJlYWN0IE5hdGl2ZVxuICogUmVhY3ROYXRpdmUgYEZvcm1EYXRhYCBoYXMgYSBub24tc3RhbmRhcmQgYGdldFBhcnRzKClgIG1ldGhvZFxuICpcbiAqIEBwYXJhbSB7Kn0gZm9ybURhdGEgVGhlIGZvcm1EYXRhIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbnZpcm9ubWVudCBpcyBSZWFjdCBOYXRpdmUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlYWN0TmF0aXZlID0gKGZvcm1EYXRhKSA9PiBmb3JtRGF0YSAmJiB0eXBlb2YgZm9ybURhdGEuZ2V0UGFydHMgIT09ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZUxpc3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGVMaXN0ID0ga2luZE9mVGVzdCgnRmlsZUxpc3QnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmVhbSA9ICh2YWwpID0+IGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbiQxKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gZ2V0R2xvYmFsKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHNlbGY7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHdpbmRvdztcbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZ2xvYmFsO1xuICByZXR1cm4ge307XG59XG5cbmNvbnN0IEcgPSBnZXRHbG9iYWwoKTtcbmNvbnN0IEZvcm1EYXRhQ3RvciA9IHR5cGVvZiBHLkZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEcuRm9ybURhdGEgOiB1bmRlZmluZWQ7XG5cbmNvbnN0IGlzRm9ybURhdGEgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIGZhbHNlO1xuICBpZiAoRm9ybURhdGFDdG9yICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGFDdG9yKSByZXR1cm4gdHJ1ZTtcbiAgLy8gUmVqZWN0IHBsYWluIG9iamVjdHMgaW5oZXJpdGluZyBkaXJlY3RseSBmcm9tIE9iamVjdC5wcm90b3R5cGUgc28gcHJvdG90eXBlLXBvbGx1dGlvbiBnYWRnZXRzIGNhbid0IHNwb29mIEZvcm1EYXRhLlxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKHRoaW5nKTtcbiAgaWYgKCFwcm90byB8fCBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzRnVuY3Rpb24kMSh0aGluZy5hcHBlbmQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGtpbmQgPSBraW5kT2YodGhpbmcpO1xuICByZXR1cm4gKFxuICAgIGtpbmQgPT09ICdmb3JtZGF0YScgfHxcbiAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgKGtpbmQgPT09ICdvYmplY3QnICYmIGlzRnVuY3Rpb24kMSh0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdIZWFkZXJzJyxcbl0ubWFwKGtpbmRPZlRlc3QpO1xuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5jb25zdCB0cmltID0gKHN0cikgPT4ge1xuICByZXR1cm4gc3RyLnRyaW0gPyBzdHIudHJpbSgpIDogc3RyLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCAnJyk7XG59O1xuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXk8dW5rbm93bj59IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7IGFsbE93bktleXMgPSBmYWxzZSB9ID0ge30pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaTtcbiAgbGV0IGw7XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEJ1ZmZlciBjaGVja1xuICAgIGlmIChpc0J1ZmZlcihvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIGEga2V5IGluIGFuIG9iamVjdCwgY2FzZS1pbnNlbnNpdGl2ZSwgcmV0dXJuaW5nIHRoZSBhY3R1YWwga2V5IG5hbWUuXG4gKiBSZXR1cm5zIG51bGwgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciBvciBpZiBubyBtYXRjaCBpcyBmb3VuZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byBzZWFyY2guXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBmaW5kIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfSBUaGUgYWN0dWFsIGtleSBuYW1lIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZmluZEtleShvYmosIGtleSkge1xuICBpZiAoaXNCdWZmZXIob2JqKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC4uLm9ianMpIHtcbiAgY29uc3QgeyBjYXNlbGVzcywgc2tpcFVuZGVmaW5lZCB9ID0gKGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcykgfHwge307XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBhc3NpZ25WYWx1ZSA9ICh2YWwsIGtleSkgPT4ge1xuICAgIC8vIFNraXAgZGFuZ2Vyb3VzIHByb3BlcnR5IG5hbWVzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZmluZEtleSBsb3dlcmNhc2VzIHRoZSBrZXksIHNvIGNhc2VsZXNzIGxvb2t1cCBvbmx5IGFwcGxpZXMgdG8gc3RyaW5ncyDigJRcbiAgICAvLyBzeW1ib2wga2V5cyBhcmUgaWRlbnRpdHktbWF0Y2hlZC5cbiAgICBjb25zdCB0YXJnZXRLZXkgPSAoY2FzZWxlc3MgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgZmluZEtleShyZXN1bHQsIGtleSkpIHx8IGtleTtcbiAgICAvLyBSZWFkIHZpYSBvd24tcHJvcCBvbmx5IOKAlCBhIGJhcmUgYHJlc3VsdFt0YXJnZXRLZXldYCB3YWxrcyB0aGUgcHJvdG90eXBlXG4gICAgLy8gY2hhaW4sIHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZSB2YWx1ZSBjb3VsZCBzdXJmYWNlIGhlcmUgYW5kIGdldFxuICAgIC8vIGNvcGllZCBpbnRvIHRoZSBtZXJnZWQgcmVzdWx0LlxuICAgIGNvbnN0IGV4aXN0aW5nID0gaGFzT3duUHJvcGVydHkocmVzdWx0LCB0YXJnZXRLZXkpID8gcmVzdWx0W3RhcmdldEtleV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZXhpc3RpbmcpICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShleGlzdGluZywgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2UgaWYgKCFza2lwVW5kZWZpbmVkIHx8ICFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmpzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHNvdXJjZSA9IG9ianNbaV07XG4gICAgaWYgKCFzb3VyY2UgfHwgaXNCdWZmZXIoc291cmNlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yRWFjaChzb3VyY2UsIGFzc2lnblZhbHVlKTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBzeW1ib2xzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBzeW1ib2xzW2pdO1xuICAgICAgaWYgKHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBzeW1ib2wpKSB7XG4gICAgICAgIGFzc2lnblZhbHVlKHNvdXJjZVtzeW1ib2xdLCBzeW1ib2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywgeyBhbGxPd25LZXlzIH0gPSB7fSkgPT4ge1xuICBmb3JFYWNoKFxuICAgIGIsXG4gICAgKHZhbCwga2V5KSA9PiB7XG4gICAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uJDEodmFsKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwga2V5LCB7XG4gICAgICAgICAgLy8gTnVsbC1wcm90byBkZXNjcmlwdG9yIHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZS5nZXQgY2Fubm90XG4gICAgICAgICAgLy8gaGlqYWNrIGRlZmluZVByb3BlcnR5J3MgYWNjZXNzb3ItdnMtZGF0YSByZXNvbHV0aW9uLlxuICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICB2YWx1ZTogYmluZCh2YWwsIHRoaXNBcmcpLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrZXksIHtcbiAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbE93bktleXMgfVxuICApO1xuICByZXR1cm4gYTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmNvbnN0IHN0cmlwQk9NID0gKGNvbnRlbnQpID0+IHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhmZWZmKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59O1xuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogY29uc3RydWN0b3IsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCAnc3VwZXInLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZSxcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIG5ldyBhcnJheSBmcm9tIGFycmF5IGxpa2Ugb2JqZWN0IG9yIG51bGwgaWYgZmFpbGVkXG4gKlxuICogQHBhcmFtIHsqfSBbdGhpbmddXG4gKlxuICogQHJldHVybnMgez9BcnJheX1cbiAqL1xuY29uc3QgdG9BcnJheSA9ICh0aGluZykgPT4ge1xuICBpZiAoIXRoaW5nKSByZXR1cm4gbnVsbDtcbiAgaWYgKGlzQXJyYXkodGhpbmcpKSByZXR1cm4gdGhpbmc7XG4gIGxldCBpID0gdGhpbmcubGVuZ3RoO1xuICBpZiAoIWlzTnVtYmVyKGkpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGFycltpXSA9IHRoaW5nW2ldO1xuICB9XG4gIHJldHVybiBhcnI7XG59O1xuXG4vKipcbiAqIENoZWNraW5nIGlmIHRoZSBVaW50OEFycmF5IGV4aXN0cyBhbmQgaWYgaXQgZG9lcywgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZVxuICogdGhpbmcgcGFzc2VkIGluIGlzIGFuIGluc3RhbmNlIG9mIFVpbnQ4QXJyYXlcbiAqXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9XG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKChUeXBlZEFycmF5KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodGhpbmcpID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbaXRlcmF0b3JdO1xuXG4gIGNvbnN0IF9pdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IF9pdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHN0cikgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZywgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnRvVXBwZXJDYXNlKCkgKyBwMjtcbiAgfSk7XG59O1xuXG5jb25zdCB7IHByb3BlcnR5SXNFbnVtZXJhYmxlIH0gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24kMShvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uJDEodmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCAnXCIgKyBuYW1lICsgXCInXCIpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBvciBhIGRlbGltaXRlZCBzdHJpbmcgaW50byBhbiBvYmplY3Qgc2V0IHdpdGggdmFsdWVzIGFzIGtleXMgYW5kIHRydWUgYXMgdmFsdWVzLlxuICogVXNlZnVsIGZvciBmYXN0IG1lbWJlcnNoaXAgY2hlY2tzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBhcnJheU9yU3RyaW5nIC0gVGhlIGFycmF5IG9yIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlbGltaXRlciAtIFRoZSBkZWxpbWl0ZXIgdG8gdXNlIGlmIGlucHV0IGlzIGEgc3RyaW5nLlxuICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHdpdGgga2V5cyBmcm9tIHRoZSBhcnJheSBvciBzdHJpbmcsIHZhbHVlcyBzZXQgdG8gdHJ1ZS5cbiAqL1xuY29uc3QgdG9PYmplY3RTZXQgPSAoYXJyYXlPclN0cmluZywgZGVsaW1pdGVyKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuXG4gIGNvbnN0IGRlZmluZSA9IChhcnIpID0+IHtcbiAgICBhcnIuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKCh2YWx1ZSA9ICt2YWx1ZSkpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEoXG4gICAgdGhpbmcgJiZcbiAgICBpc0Z1bmN0aW9uJDEodGhpbmcuYXBwZW5kKSAmJlxuICAgIHRoaW5nW3RvU3RyaW5nVGFnXSA9PT0gJ0Zvcm1EYXRhJyAmJlxuICAgIHRoaW5nW2l0ZXJhdG9yXVxuICApO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIGFuIG9iamVjdCB0byBhIEpTT04tY29tcGF0aWJsZSBvYmplY3QsIGhhbmRsaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIEJ1ZmZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBKU09OLWNvbXBhdGlibGUgb2JqZWN0LlxuICovXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSkgPT4ge1xuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoc291cmNlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vQnVmZmVyIGNoZWNrXG4gICAgICBpZiAoaXNCdWZmZXIoc291cmNlKSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoISgndG9KU09OJyBpbiBzb3VyY2UpKSB7XG4gICAgICAgIC8vIGFkZC1vbiBkZXNjZW50IC8gZGVsZXRlLW9uLWFzY2VudDogcHJlc2VydmVzIHBhdGggc2VtYW50aWNzLCBzbyBEQUcgbm9kZXMgc2VyaWFsaXNlIGF0IGV2ZXJ5IG9jY3VycmVuY2UgKHNlZSAjNzIzMCkuXG4gICAgICAgIHZpc2l0ZWQuYWRkKHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZpc2l0ZWQuZGVsZXRlKHNvdXJjZSk7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9O1xuXG4gIHJldHVybiB2aXNpdChvYmopO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYW4gYXN5bmMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gYXN5bmMgZnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuY29uc3QgaXNBc3luY0ZuID0ga2luZE9mVGVzdCgnQXN5bmNGdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyB0aGVuYWJsZSAoaGFzIHRoZW4gYW5kIGNhdGNoIG1ldGhvZHMpLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIHRoZW5hYmxlLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmXG4gIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbiQxKHRoaW5nKSkgJiZcbiAgaXNGdW5jdGlvbiQxKHRoaW5nLnRoZW4pICYmXG4gIGlzRnVuY3Rpb24kMSh0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbi8qKlxuICogUHJvdmlkZXMgYSBjcm9zcy1wbGF0Zm9ybSBzZXRJbW1lZGlhdGUgaW1wbGVtZW50YXRpb24uXG4gKiBVc2VzIG5hdGl2ZSBzZXRJbW1lZGlhdGUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBwb3N0TWVzc2FnZSBvciBzZXRUaW1lb3V0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2V0SW1tZWRpYXRlU3VwcG9ydGVkIC0gV2hldGhlciBzZXRJbW1lZGlhdGUgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtib29sZWFufSBwb3N0TWVzc2FnZVN1cHBvcnRlZCAtIFdoZXRoZXIgcG9zdE1lc3NhZ2UgaXMgc3VwcG9ydGVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHkuXG4gKi9cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWRcbiAgICA/ICgodG9rZW4sIGNhbGxiYWNrcykgPT4ge1xuICAgICAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ21lc3NhZ2UnLFxuICAgICAgICAgICh7IHNvdXJjZSwgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBfZ2xvYmFsICYmIGRhdGEgPT09IHRva2VuKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5sZW5ndGggJiYgY2FsbGJhY2tzLnNoaWZ0KCkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKHRva2VuLCAnKicpO1xuICAgICAgICB9O1xuICAgICAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSlcbiAgICA6IChjYikgPT4gc2V0VGltZW91dChjYik7XG59KSh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nLCBpc0Z1bmN0aW9uJDEoX2dsb2JhbC5wb3N0TWVzc2FnZSkpO1xuXG4vKipcbiAqIFNjaGVkdWxlcyBhIG1pY3JvdGFzayBvciBhc3luY2hyb25vdXMgY2FsbGJhY2sgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAqIFVzZXMgcXVldWVNaWNyb3Rhc2sgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBwcm9jZXNzLm5leHRUaWNrIG9yIF9zZXRJbW1lZGlhdGUuXG4gKlxuICogQHR5cGUge0Z1bmN0aW9ufVxuICovXG5jb25zdCBhc2FwID1cbiAgdHlwZW9mIHF1ZXVlTWljcm90YXNrICE9PSAndW5kZWZpbmVkJ1xuICAgID8gcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKVxuICAgIDogKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5leHRUaWNrKSB8fCBfc2V0SW1tZWRpYXRlO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKipcblxuY29uc3QgaXNJdGVyYWJsZSA9ICh0aGluZykgPT4gdGhpbmcgIT0gbnVsbCAmJiBpc0Z1bmN0aW9uJDEodGhpbmdbaXRlcmF0b3JdKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBpdGVyYWJsZSB2aWEgYW4gaXRlcmF0b3IgdGhhdCBpcyBOT1Qgc291cmNlZCBzb2xlbHlcbiAqIGZyb20gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlLiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGBpc0l0ZXJhYmxlYCB3aGVuZXZlclxuICogdGhlIGl0ZXJhYmxlIGNvbWVzIGZyb20gdW50cnVzdGVkIGlucHV0IChlLmcuIHVzZXItc3VwcGxpZWQgaGVhZGVyIHNvdXJjZXMpLFxuICogc28gYE9iamVjdC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IC4uLmAgY2Fubm90IHR1cm4gYW4gb3JkaW5hcnkgb2JqZWN0XG4gKiBpbnRvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgZW50cmllcyBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaGFzIGEgbm9uLXBvbGx1dGVkIGl0ZXJhdG9yXG4gKi9cbmNvbnN0IGlzU2FmZUl0ZXJhYmxlID0gKHRoaW5nKSA9PlxuICB0aGluZyAhPSBudWxsICYmIGhhc093bkluUHJvdG90eXBlQ2hhaW4odGhpbmcsIGl0ZXJhdG9yKSAmJiBpc0l0ZXJhYmxlKHRoaW5nKTtcblxudmFyIHV0aWxzJDEgPSB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc0VtcHR5T2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlcXVlc3QsXG4gIGlzUmVzcG9uc2UsXG4gIGlzSGVhZGVycyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc1JlYWN0TmF0aXZlQmxvYixcbiAgaXNSZWFjdE5hdGl2ZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbiQxLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgaGFzT3duSW5Qcm90b3R5cGVDaGFpbixcbiAgZ2V0U2FmZVByb3AsXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdCxcbiAgaXNBc3luY0ZuLFxuICBpc1RoZW5hYmxlLFxuICBzZXRJbW1lZGlhdGU6IF9zZXRJbW1lZGlhdGUsXG4gIGFzYXAsXG4gIGlzSXRlcmFibGUsXG4gIGlzU2FmZUl0ZXJhYmxlLFxufTtcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscyQxLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsXG4gICdhdXRob3JpemF0aW9uJyxcbiAgJ2NvbnRlbnQtbGVuZ3RoJyxcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdldGFnJyxcbiAgJ2V4cGlyZXMnLFxuICAnZnJvbScsXG4gICdob3N0JyxcbiAgJ2lmLW1vZGlmaWVkLXNpbmNlJyxcbiAgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsXG4gICdsb2NhdGlvbicsXG4gICdtYXgtZm9yd2FyZHMnLFxuICAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJyxcbiAgJ3JldHJ5LWFmdGVyJyxcbiAgJ3VzZXItYWdlbnQnLFxuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG52YXIgcGFyc2VIZWFkZXJzID0gKHJhd0hlYWRlcnMpID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiZcbiAgICByYXdIZWFkZXJzLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7XG5cbiAgICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgICBwYXJzZWRba2V5XS5wdXNoKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuZnVuY3Rpb24gdHJpbVNQb3JIVEFCKHN0cikge1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgZW5kID0gc3RyLmxlbmd0aDtcblxuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQpO1xuXG4gICAgaWYgKGNvZGUgIT09IDB4MDkgJiYgY29kZSAhPT0gMHgyMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3RhcnQgKz0gMTtcbiAgfVxuXG4gIHdoaWxlIChlbmQgPiBzdGFydCkge1xuICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChlbmQgLSAxKTtcblxuICAgIGlmIChjb2RlICE9PSAweDA5ICYmIGNvZGUgIT09IDB4MjApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGVuZCAtPSAxO1xuICB9XG5cbiAgcmV0dXJuIHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gc3RyLmxlbmd0aCA/IHN0ciA6IHN0ci5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuLy8gVGhlIGNvbnRyb2wtY29kZSByYW5nZXMgYXJlIGludGVudGlvbmFsOiBoZWFkZXIgc2FuaXRpemF0aW9uIHN0cmlwcyBDMC9ERUwgYnl0ZXMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgSU5WQUxJRF9VTklDT0RFX0hFQURFUl9WQUxVRV9DSEFSUyA9IG5ldyBSZWdFeHAoJ1tcXFxcdTAwMDAtXFxcXHUwMDA4XFxcXHUwMDBhLVxcXFx1MDAxZlxcXFx1MDA3Zl0rJywgJ2cnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBJTlZBTElEX0JZVEVfU1RSSU5HX0hFQURFUl9WQUxVRV9DSEFSUyA9IG5ldyBSZWdFeHAoJ1teXFxcXHUwMDA5XFxcXHUwMDIwLVxcXFx1MDA3ZVxcXFx1MDA4MC1cXFxcdTAwZmZdKycsICdnJyk7XG5cbmZ1bmN0aW9uIHNhbml0aXplVmFsdWUodmFsdWUsIGludmFsaWRDaGFycykge1xuICBpZiAodXRpbHMkMS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHNhbml0aXplVmFsdWUoaXRlbSwgaW52YWxpZENoYXJzKSk7XG4gIH1cblxuICByZXR1cm4gdHJpbVNQb3JIVEFCKFN0cmluZyh2YWx1ZSkucmVwbGFjZShpbnZhbGlkQ2hhcnMsICcnKSk7XG59XG5cbmNvbnN0IHNhbml0aXplSGVhZGVyVmFsdWUgPSAodmFsdWUpID0+XG4gIHNhbml0aXplVmFsdWUodmFsdWUsIElOVkFMSURfVU5JQ09ERV9IRUFERVJfVkFMVUVfQ0hBUlMpO1xuXG5jb25zdCBzYW5pdGl6ZUJ5dGVTdHJpbmdIZWFkZXJWYWx1ZSA9ICh2YWx1ZSkgPT5cbiAgc2FuaXRpemVWYWx1ZSh2YWx1ZSwgSU5WQUxJRF9CWVRFX1NUUklOR19IRUFERVJfVkFMVUVfQ0hBUlMpO1xuXG5mdW5jdGlvbiB0b0J5dGVTdHJpbmdIZWFkZXJPYmplY3QoaGVhZGVycykge1xuICBjb25zdCBieXRlU3RyaW5nSGVhZGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgdXRpbHMkMS5mb3JFYWNoKGhlYWRlcnMudG9KU09OKCksICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgYnl0ZVN0cmluZ0hlYWRlcnNbaGVhZGVyXSA9IHNhbml0aXplQnl0ZVN0cmluZ0hlYWRlclZhbHVlKHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJ5dGVTdHJpbmdIZWFkZXJzO1xufVxuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBzYW5pdGl6ZUhlYWRlclZhbHVlKFN0cmluZyh2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlclxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzJDEudG9DYW1lbENhc2UoJyAnICsgaGVhZGVyKTtcblxuICBbJ2dldCcsICdzZXQnLCAnaGFzJ10uZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIC8vIE51bGwtcHJvdG8gZGVzY3JpcHRvciBzbyBhIHBvbGx1dGVkIE9iamVjdC5wcm90b3R5cGUuZ2V0IGNhbm5vdCB0dXJuXG4gICAgICAvLyB0aGlzIGRhdGEgZGVzY3JpcHRvciBpbnRvIGFuIGFjY2Vzc29yIGRlc2NyaXB0b3Igb24gdGhlIHdheSBpbi5cbiAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXS5jYWxsKHRoaXMsIGhlYWRlciwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBsSGVhZGVyKTtcblxuICAgICAgaWYgKFxuICAgICAgICAha2V5IHx8XG4gICAgICAgIHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIF9yZXdyaXRlID09PSB0cnVlIHx8XG4gICAgICAgIChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpXG4gICAgICApIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscyQxLmZvckVhY2goaGVhZGVycywgKF92YWx1ZSwgX2hlYWRlcikgPT4gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpKTtcblxuICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc1N0cmluZyhoZWFkZXIpICYmIChoZWFkZXIgPSBoZWFkZXIudHJpbSgpKSAmJiAhaXNWYWxpZEhlYWRlck5hbWUoaGVhZGVyKSkge1xuICAgICAgc2V0SGVhZGVycyhwYXJzZUhlYWRlcnMoaGVhZGVyKSwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc09iamVjdChoZWFkZXIpICYmIHV0aWxzJDEuaXNTYWZlSXRlcmFibGUoaGVhZGVyKSkge1xuICAgICAgbGV0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgIGRlc3QsXG4gICAgICAgIGtleTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgaGVhZGVyKSB7XG4gICAgICAgIGlmICghdXRpbHMkMS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdCBpdGVyYXRvciBtdXN0IHJldHVybiBhIGtleS12YWx1ZSBwYWlyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBrZXkgPSBlbnRyeVswXTtcblxuICAgICAgICBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKG9iaiwga2V5KSkge1xuICAgICAgICAgIGRlc3QgPSBvYmpba2V5XTtcbiAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzJDEuaXNBcnJheShkZXN0KSA/IFsuLi5kZXN0LCBlbnRyeVsxXV0gOiBbZGVzdCwgZW50cnlbMV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ialtrZXldID0gZW50cnlbMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SGVhZGVycyhvYmosIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbnModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIGtleSAmJlxuICAgICAgICB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZShoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gZGVsZXRlSGVhZGVyKF9oZWFkZXIpIHtcbiAgICAgIF9oZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmIChfaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KGhlYWRlcnMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgc2VsZltrZXldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmb3JtYXQgPyBmb3JtYXRIZWFkZXIoaGVhZGVyKSA6IFN0cmluZyhoZWFkZXIpLnRyaW0oKTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZWQgIT09IGhlYWRlcikge1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgfVxuXG4gICAgICBzZWxmW25vcm1hbGl6ZWRdID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWRdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29uY2F0KC4uLnRhcmdldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywgLi4udGFyZ2V0cyk7XG4gIH1cblxuICB0b0pTT04oYXNTdHJpbmdzKSB7XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICB2YWx1ZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlcbiAgICAgIC5tYXAoKFtoZWFkZXIsIHZhbHVlXSkgPT4gaGVhZGVyICsgJzogJyArIHZhbHVlKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0U2V0Q29va2llKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2V0LWNvb2tpZScpIHx8IFtdO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPVxuICAgICAgKHRoaXNbJGludGVybmFsc10gPVxuICAgICAgdGhpc1skaW50ZXJuYWxzXSA9XG4gICAgICAgIHtcbiAgICAgICAgICBhY2Nlc3NvcnM6IHt9LFxuICAgICAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzJDEuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyLmZvckVhY2goZGVmaW5lQWNjZXNzb3IpIDogZGVmaW5lQWNjZXNzb3IoaGVhZGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbkF4aW9zSGVhZGVycy5hY2Nlc3NvcihbXG4gICdDb250ZW50LVR5cGUnLFxuICAnQ29udGVudC1MZW5ndGgnLFxuICAnQWNjZXB0JyxcbiAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICdVc2VyLUFnZW50JyxcbiAgJ0F1dGhvcml6YXRpb24nLFxuXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMkMS5yZWR1Y2VEZXNjcmlwdG9ycyhBeGlvc0hlYWRlcnMucHJvdG90eXBlLCAoeyB2YWx1ZSB9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfSxcbiAgfTtcbn0pO1xuXG51dGlscyQxLmZyZWV6ZU1ldGhvZHMoQXhpb3NIZWFkZXJzKTtcblxuY29uc3QgUkVEQUNURUQgPSAnW1JFREFDVEVEICoqKipdJztcblxuZnVuY3Rpb24gaGFzT3duT3JQcm90b3R5cGVUb0pTT04oc291cmNlKSB7XG4gIGlmICh1dGlscyQxLmhhc093blByb3Aoc291cmNlLCAndG9KU09OJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcblxuICB3aGlsZSAocHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGlmICh1dGlscyQxLmhhc093blByb3AocHJvdG90eXBlLCAndG9KU09OJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBCdWlsZCBhIHBsYWluLW9iamVjdCBzbmFwc2hvdCBvZiBgY29uZmlnYCBhbmQgcmVwbGFjZSB0aGUgdmFsdWUgb2YgYW55IGtleVxuLy8gKGNhc2UtaW5zZW5zaXRpdmUpIGxpc3RlZCBpbiBgcmVkYWN0S2V5c2Agd2l0aCBSRURBQ1RFRC4gV2Fsa3MgdGhyb3VnaCBhcnJheXNcbi8vIGFuZCBBeGlvc0hlYWRlcnMsIGFuZCBzaG9ydC1jaXJjdWl0cyBvbiBjaXJjdWxhciByZWZlcmVuY2VzLlxuZnVuY3Rpb24gcmVkYWN0Q29uZmlnKGNvbmZpZywgcmVkYWN0S2V5cykge1xuICBjb25zdCBsb3dlcktleXMgPSBuZXcgU2V0KHJlZGFjdEtleXMubWFwKChrKSA9PiBTdHJpbmcoaykudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBzZWVuID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAoc291cmNlKSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0JykgcmV0dXJuIHNvdXJjZTtcbiAgICBpZiAodXRpbHMkMS5pc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gc291cmNlO1xuICAgIGlmIChzZWVuLmluZGV4T2Yoc291cmNlKSAhPT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzKSB7XG4gICAgICBzb3VyY2UgPSBzb3VyY2UudG9KU09OKCk7XG4gICAgfVxuXG4gICAgc2Vlbi5wdXNoKHNvdXJjZSk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh1dGlscyQxLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmVzdWx0ID0gW107XG4gICAgICBzb3VyY2UuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2KTtcbiAgICAgICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRbaV0gPSByZWR1Y2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpICYmIGhhc093bk9yUHJvdG90eXBlVG9KU09OKHNvdXJjZSkpIHtcbiAgICAgICAgc2Vlbi5wb3AoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gbG93ZXJLZXlzLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkgPyBSRURBQ1RFRCA6IHZpc2l0KHZhbHVlKTtcbiAgICAgICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHJlZHVjZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNlZW4ucG9wKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gdmlzaXQoY29uZmlnKTtcbn1cblxuY2xhc3MgQXhpb3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIGZyb20oZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSB7XG4gICAgY29uc3QgYXhpb3NFcnJvciA9IG5ldyBBeGlvc0Vycm9yKGVycm9yLm1lc3NhZ2UsIGNvZGUgfHwgZXJyb3IuY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgLy8gTWF0Y2ggbmF0aXZlIGBFcnJvcmAgYGNhdXNlYCBzZW1hbnRpY3M6IG5vbi1lbnVtZXJhYmxlLiBUaGUgd3JhcHBlZFxuICAgIC8vIGVycm9yIG9mdGVuIGNhcnJpZXMgY2lyY3VsYXIgaW50ZXJuYWxzIChzb2NrZXRzLCByZXF1ZXN0cywgYWdlbnRzKSwgc29cbiAgICAvLyBhbiBlbnVtZXJhYmxlIGBjYXVzZWAgbWFrZXMgc3RydWN0dXJlZCBsb2dnZXJzIChwaW5vL3dpbnN0b24pIGFuZCBhbnlcbiAgICAvLyBvd24tcHJvcGVydHkgd2FsayB0aHJvdyBcIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT05cIi5cbiAgICAvLyBSZWdyZXNzaW9uIGZyb20gIzY5ODI7IHNlZSAjNzIwNS4gYF9fcHJvdG9fXzogbnVsbGAgbWlycm9ycyB0aGVcbiAgICAvLyBgbWVzc2FnZWAgZGVzY3JpcHRvciBiZWxvdyAocHJvdG90eXBlLXBvbGx1dGlvbi1zYWZlIGRlc2NyaXB0b3IpLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShheGlvc0Vycm9yLCAnY2F1c2UnLCB7XG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICB2YWx1ZTogZXJyb3IsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgICAvLyBQcmVzZXJ2ZSBzdGF0dXMgZnJvbSB0aGUgb3JpZ2luYWwgZXJyb3IgaWYgbm90IGFscmVhZHkgc2V0IGZyb20gcmVzcG9uc2VcbiAgICBpZiAoZXJyb3Iuc3RhdHVzICE9IG51bGwgJiYgYXhpb3NFcnJvci5zdGF0dXMgPT0gbnVsbCkge1xuICAgICAgYXhpb3NFcnJvci5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgfVxuXG4gICAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG4gICAgcmV0dXJuIGF4aW9zRXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcblxuICAgIC8vIE1ha2UgbWVzc2FnZSBlbnVtZXJhYmxlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAvLyBUaGUgbmF0aXZlIEVycm9yIGNvbnN0cnVjdG9yIHNldHMgbWVzc2FnZSBhcyBub24tZW51bWVyYWJsZSxcbiAgICAvLyBidXQgYXhpb3MgPCB2MS4xMy4zIGhhZCBpdCBhcyBlbnVtZXJhYmxlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgLy8gTnVsbC1wcm90byBkZXNjcmlwdG9yIHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZS5nZXQgY2Fubm90IHR1cm5cbiAgICAgIC8vIHRoaXMgZGF0YSBkZXNjcmlwdG9yIGludG8gYW4gYWNjZXNzb3IgZGVzY3JpcHRvciBvbiB0aGUgd2F5IGluLlxuICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgdmFsdWU6IG1lc3NhZ2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gICAgdGhpcy5pc0F4aW9zRXJyb3IgPSB0cnVlO1xuICAgIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICAgIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICAgIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIC8vIE9wdC1pbiByZWRhY3Rpb246IHdoZW4gdGhlIHJlcXVlc3QgY29uZmlnIGNhcnJpZXMgYSBgcmVkYWN0YCBhcnJheSwgdGhlXG4gICAgLy8gdmFsdWUgb2YgYW55IG1hdGNoaW5nIGtleSAoY2FzZS1pbnNlbnNpdGl2ZSwgYXQgYW55IGRlcHRoKSBpcyByZXBsYWNlZFxuICAgIC8vIHdpdGggUkVEQUNURUQgaW4gdGhlIHNlcmlhbGl6ZWQgc25hcHNob3QuIFVuZGVmaW5lZCBvciBlbXB0eSBsZWF2ZXMgdGhlXG4gICAgLy8gZXhpc3Rpbmcgc2VyaWFsaXphdGlvbiBiZWhhdmlvciB1bmNoYW5nZWQuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgcmVkYWN0S2V5cyA9IGNvbmZpZyAmJiB1dGlscyQxLmhhc093blByb3AoY29uZmlnLCAncmVkYWN0JykgPyBjb25maWcucmVkYWN0IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRDb25maWcgPVxuICAgICAgdXRpbHMkMS5pc0FycmF5KHJlZGFjdEtleXMpICYmIHJlZGFjdEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IHJlZGFjdENvbmZpZyhjb25maWcsIHJlZGFjdEtleXMpXG4gICAgICAgIDogdXRpbHMkMS50b0pTT05PYmplY3QoY29uZmlnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHNlcmlhbGl6ZWRDb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBzdGF0aWMgcHJvcGVydGllcyBhcyBzb29uIGFzIHRoZSBwYXJzZXIgb3B0aW9ucyBpbiAuZXNsaW50LmNqcyBhcmUgdXBkYXRlZC5cbkF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUgPSAnRVJSX0JBRF9PUFRJT05fVkFMVUUnO1xuQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTiA9ICdFUlJfQkFEX09QVElPTic7XG5BeGlvc0Vycm9yLkVDT05OQUJPUlRFRCA9ICdFQ09OTkFCT1JURUQnO1xuQXhpb3NFcnJvci5FVElNRURPVVQgPSAnRVRJTUVET1VUJztcbkF4aW9zRXJyb3IuRUNPTk5SRUZVU0VEID0gJ0VDT05OUkVGVVNFRCc7XG5BeGlvc0Vycm9yLkVSUl9ORVRXT1JLID0gJ0VSUl9ORVRXT1JLJztcbkF4aW9zRXJyb3IuRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyA9ICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJztcbkF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURUQgPSAnRVJSX0RFUFJFQ0FURUQnO1xuQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFID0gJ0VSUl9CQURfUkVTUE9OU0UnO1xuQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QgPSAnRVJSX0JBRF9SRVFVRVNUJztcbkF4aW9zRXJyb3IuRVJSX0NBTkNFTEVEID0gJ0VSUl9DQU5DRUxFRCc7XG5BeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCA9ICdFUlJfTk9UX1NVUFBPUlQnO1xuQXhpb3NFcnJvci5FUlJfSU5WQUxJRF9VUkwgPSAnRVJSX0lOVkFMSURfVVJMJztcbkF4aW9zRXJyb3IuRVJSX0ZPUk1fREFUQV9ERVBUSF9FWENFRURFRCA9ICdFUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0cmljdFxudmFyIGh0dHBBZGFwdGVyID0gbnVsbDtcblxuLy8gRGVmYXVsdCBuZXN0aW5nIGxpbWl0IHNoYXJlZCB3aXRoIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSAoZm9ybURhdGFUb0pTT04pIHNvXG4vLyB0aGUgRm9ybURhdGEgPC0+IEpTT04gcm91bmQtdHJpcCBzdGF5cyBzeW1tZXRyaWMuXG5jb25zdCBERUZBVUxUX0ZPUk1fREFUQV9NQVhfREVQVEggPSAxMDA7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGhpbmcgaXMgYSBhcnJheSBvciBqcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRoaW5nIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSB2aXNpdGVkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1Zpc2l0YWJsZSh0aGluZykge1xuICByZXR1cm4gdXRpbHMkMS5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscyQxLmlzQXJyYXkodGhpbmcpO1xufVxuXG4vKipcbiAqIEl0IHJlbW92ZXMgdGhlIGJyYWNrZXRzIGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGtleSB3aXRob3V0IHRoZSBicmFja2V0cy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHMoa2V5KSB7XG4gIHJldHVybiB1dGlscyQxLmVuZHNXaXRoKGtleSwgJ1tdJykgPyBrZXkuc2xpY2UoMCwgLTIpIDoga2V5O1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGF0aCwgYSBrZXksIGFuZCBhIGJvb2xlYW4sIGFuZCByZXR1cm5zIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkb3RzIC0gSWYgdHJ1ZSwgdGhlIGtleSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggZG90cyBpbnN0ZWFkIG9mIGJyYWNrZXRzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cykge1xuICBpZiAoIXBhdGgpIHJldHVybiBrZXk7XG4gIHJldHVybiBwYXRoXG4gICAgLmNvbmNhdChrZXkpXG4gICAgLm1hcChmdW5jdGlvbiBlYWNoKHRva2VuLCBpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgICAgcmV0dXJuICFkb3RzICYmIGkgPyAnWycgKyB0b2tlbiArICddJyA6IHRva2VuO1xuICAgIH0pXG4gICAgLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMkMS50b0ZsYXRPYmplY3QodXRpbHMkMSwge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzJDEuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzJDEudG9GbGF0T2JqZWN0KFxuICAgIG9wdGlvbnMsXG4gICAge1xuICAgICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICAgIGRvdHM6IGZhbHNlLFxuICAgICAgaW5kZXhlczogZmFsc2UsXG4gICAgfSxcbiAgICBmYWxzZSxcbiAgICBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICAgIHJldHVybiAhdXRpbHMkMS5pc1VuZGVmaW5lZChzb3VyY2Vbb3B0aW9uXSk7XG4gICAgfVxuICApO1xuXG4gIGNvbnN0IG1ldGFUb2tlbnMgPSBvcHRpb25zLm1ldGFUb2tlbnM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjb25zdCB2aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yIHx8IGRlZmF1bHRWaXNpdG9yO1xuICBjb25zdCBkb3RzID0gb3B0aW9ucy5kb3RzO1xuICBjb25zdCBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzO1xuICBjb25zdCBfQmxvYiA9IG9wdGlvbnMuQmxvYiB8fCAodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2IpO1xuICBjb25zdCBtYXhEZXB0aCA9IG9wdGlvbnMubWF4RGVwdGggPT09IHVuZGVmaW5lZCA/IERFRkFVTFRfRk9STV9EQVRBX01BWF9ERVBUSCA6IG9wdGlvbnMubWF4RGVwdGg7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGlmICghdXRpbHMkMS5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNCb29sZWFuKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzJDEuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMkMS5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodXNlQmxvYiAmJiB0eXBlb2YgX0Jsb2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfQmxvYihbdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJywgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRocm93SWZNYXhEZXB0aEV4Y2VlZGVkKGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAnT2JqZWN0IGlzIHRvbyBkZWVwbHkgbmVzdGVkICgnICsgZGVwdGggKyAnIGxldmVscykuIE1heCBkZXB0aDogJyArIG1heERlcHRoLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9GT1JNX0RBVEFfREVQVEhfRVhDRUVERURcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaW5naWZ5V2l0aERlcHRoTGltaXQodmFsdWUsIGRlcHRoKSB7XG4gICAgaWYgKG1heERlcHRoID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvcnMgPSBbXTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgZnVuY3Rpb24gbGltaXREZXB0aChfa2V5LCBjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmICghdXRpbHMkMS5pc09iamVjdChjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChhbmNlc3RvcnMubGVuZ3RoICYmIGFuY2VzdG9yc1thbmNlc3RvcnMubGVuZ3RoIC0gMV0gIT09IHRoaXMpIHtcbiAgICAgICAgYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICBhbmNlc3RvcnMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgdGhyb3dJZk1heERlcHRoRXhjZWVkZWQoZGVwdGggKyBhbmNlc3RvcnMubGVuZ3RoIC0gMSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodXRpbHMkMS5pc1JlYWN0TmF0aXZlKGZvcm1EYXRhKSAmJiB1dGlscyQxLmlzUmVhY3ROYXRpdmVCbG9iKHZhbHVlKSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IHN0cmluZ2lmeVdpdGhEZXB0aExpbWl0KHZhbHVlLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscyQxLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscyQxLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzJDEudG9BcnJheSh2YWx1ZSkpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscyQxLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiZcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWVcbiAgICAgICAgICAgICAgICA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpXG4gICAgICAgICAgICAgICAgOiBpbmRleGVzID09PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IGtleVxuICAgICAgICAgICAgICAgICAgOiBrZXkgKyAnW10nLFxuICAgICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZSxcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgsIGRlcHRoID0gMCkge1xuICAgIGlmICh1dGlscyQxLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgdGhyb3dJZk1heERlcHRoRXhjZWVkZWQoZGVwdGgpO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJyArIHBhdGguam9pbignLicpKTtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAhKHV0aWxzJDEuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJlxuICAgICAgICB2aXNpdG9yLmNhbGwoZm9ybURhdGEsIGVsLCB1dGlscyQxLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVycyk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgYnVpbGQoZWwsIHBhdGggPyBwYXRoLmNvbmNhdChrZXkpIDogW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUkMShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXJcbiAgICA/ICh2YWx1ZSkgPT4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUkMSlcbiAgICA6IGVuY29kZSQxO1xuXG4gIHJldHVybiB0aGlzLl9wYWlyc1xuICAgIC5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gICAgfSwgJycpXG4gICAgLmpvaW4oJyYnKTtcbn07XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgVVJMLWVuY29kZWQgZm9ybXMgb2YgYDpgLCBgJGAsIGAsYCwgYW5kIHNwYWNlcyB3aXRoXG4gKiB0aGVpciBwbGFpbiBjb3VudGVycGFydHMgKGA6YCwgYCRgLCBgLGAsIGArYCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbClcbiAgICAucmVwbGFjZSgvJTNBL2dpLCAnOicpXG4gICAgLnJlcGxhY2UoLyUyNC9nLCAnJCcpXG4gICAgLnJlcGxhY2UoLyUyQy9naSwgJywnKVxuICAgIC5yZXBsYWNlKC8lMjAvZywgJysnKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez8ob2JqZWN0fEZ1bmN0aW9uKX0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICB1cmwgPSB1cmwgfHwgJyc7XG5cbiAgY29uc3QgX29wdGlvbnMgPSB1dGlscyQxLmlzRnVuY3Rpb24ob3B0aW9ucylcbiAgICA/IHtcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zLFxuICAgICAgfVxuICAgIDogb3B0aW9ucztcblxuICAvLyBSZWFkIHNlcmlhbGl6ZXIgb3B0aW9ucyBwb2xsdXRpb24tc2FmZWx5OiBvd24gcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvbiBhXG4gIC8vIGNsYXNzL3RlbXBsYXRlIHByb3RvdHlwZSBhcmUgaG9ub3JlZCwgYnV0IHZhbHVlcyBpbmplY3RlZCBvbnRvIGEgcG9sbHV0ZWRcbiAgLy8gT2JqZWN0LnByb3RvdHlwZSBhcmUgaWdub3JlZC5cbiAgY29uc3QgX2VuY29kZSA9IHV0aWxzJDEuZ2V0U2FmZVByb3AoX29wdGlvbnMsICdlbmNvZGUnKSB8fCBlbmNvZGU7XG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gdXRpbHMkMS5nZXRTYWZlUHJvcChfb3B0aW9ucywgJ3NlcmlhbGl6ZScpO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIF9vcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpXG4gICAgICA/IHBhcmFtcy50b1N0cmluZygpXG4gICAgICA6IG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIF9vcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG5cbiAgICBpZiAoaGFzaG1hcmtJbmRleCAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcbiAgICB9XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGludGVyY2VwdG9yLCBzeW5jaHJvbm91cyBhbmQgcnVuV2hlblxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICAgIGZuKGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZSxcbiAgbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzogdHJ1ZSxcbiAgYWR2ZXJ0aXNlWnN0ZEFjY2VwdEVuY29kaW5nOiBmYWxzZSxcbiAgdmFsaWRhdGVTdGF0dXNVbmRlZmluZWRSZXNvbHZlczogdHJ1ZSxcbn07XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMkMSA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG5cbnZhciBGb3JtRGF0YSQxID0gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcblxudmFyIEJsb2IkMSA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsO1xuXG52YXIgcGxhdGZvcm0kMSA9IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMkMSxcbiAgICBGb3JtRGF0YTogRm9ybURhdGEkMSxcbiAgICBCbG9iOiBCbG9iJDEsXG4gIH0sXG4gIHByb3RvY29sczogWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnYmxvYicsICd1cmwnLCAnZGF0YSddLFxufTtcblxuY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yKSB8fCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJFbnYgPVxuICBoYXNCcm93c2VyRW52ICYmXG4gICghX25hdmlnYXRvciB8fCBbJ1JlYWN0TmF0aXZlJywgJ05hdGl2ZVNjcmlwdCcsICdOUyddLmluZGV4T2YoX25hdmlnYXRvci5wcm9kdWN0KSA8IDApO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciB3ZWJXb3JrZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBBbHRob3VnaCB0aGUgYGlzU3RhbmRhcmRCcm93c2VyRW52YCBtZXRob2QgaW5kaWNhdGVzIHRoYXRcbiAqIGBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlcmAsIHRoZSBXZWJXb3JrZXIgd2lsbCBzdGlsbCBiZVxuICogZmlsdGVyZWQgb3V0IGR1ZSB0byBpdHMganVkZ21lbnQgc3RhbmRhcmRcbiAqIGB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnYC5cbiAqIFRoaXMgbGVhZHMgdG8gYSBwcm9ibGVtIHdoZW4gYXhpb3MgcG9zdCBgRm9ybURhdGFgIGluIHdlYldvcmtlclxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYgPSAoKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiZcbiAgICB0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nXG4gICk7XG59KSgpO1xuXG5jb25zdCBvcmlnaW4gPSAoaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZikgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG52YXIgdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgaGFzQnJvd3NlckVudjogaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjogaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBuYXZpZ2F0b3I6IF9uYXZpZ2F0b3IsXG4gIG9yaWdpbjogb3JpZ2luXG59KTtcblxudmFyIHBsYXRmb3JtID0ge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm0kMSxcbn07XG5cbmZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwge1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uICh2YWx1ZSwga2V5LCBwYXRoLCBoZWxwZXJzKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaXNOb2RlICYmIHV0aWxzJDEuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbmNvbnN0IE1BWF9ERVBUSCA9IERFRkFVTFRfRk9STV9EQVRBX01BWF9ERVBUSDtcblxuZnVuY3Rpb24gdGhyb3dJZkRlcHRoRXhjZWVkZWQoaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4gTUFYX0RFUFRIKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAnRm9ybURhdGEgZmllbGQgaXMgdG9vIGRlZXBseSBuZXN0ZWQgKCcgKyBpbmRleCArICcgbGV2ZWxzKS4gTWF4IGRlcHRoOiAnICsgTUFYX0RFUFRILFxuICAgICAgQXhpb3NFcnJvci5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIGNvbnN0IHBhdGggPSBbXTtcbiAgY29uc3QgcGF0dGVybiA9IC9cXHcrfFxcWyhcXHcqKV0vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWMobmFtZSkpICE9PSBudWxsKSB7XG4gICAgdGhyb3dJZkRlcHRoRXhjZWVkZWQocGF0aC5sZW5ndGgpO1xuICAgIHBhdGgucHVzaChtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF0pO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgdGhyb3dJZkRlcHRoRXhjZWVkZWQoaW5kZXgpO1xuXG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzJDEuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0Lmxlbmd0aCA6IG5hbWU7XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBpZiAodXRpbHMkMS5oYXNPd25Qcm9wKHRhcmdldCwgbmFtZSkpIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gdXRpbHMkMS5pc0FycmF5KHRhcmdldFtuYW1lXSlcbiAgICAgICAgICA/IHRhcmdldFtuYW1lXS5jb25jYXQodmFsdWUpXG4gICAgICAgICAgOiBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscyQxLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSB8fCAhdXRpbHMkMS5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscyQxLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMkMS5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscyQxLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IG93biA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsICYmIHV0aWxzJDEuaGFzT3duUHJvcChvYmosIGtleSkgPyBvYmpba2V5XSA6IHVuZGVmaW5lZCk7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscyQxLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtcbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscyQxLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzJDEuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB1dGlscyQxLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgICAgdXRpbHMkMS5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgICB1dGlscyQxLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICAgIHV0aWxzJDEuaXNGaWxlKGRhdGEpIHx8XG4gICAgICAgIHV0aWxzJDEuaXNCbG9iKGRhdGEpIHx8XG4gICAgICAgIHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgICAgfVxuICAgICAgaWYgKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpc0ZpbGVMaXN0O1xuXG4gICAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IGZvcm1TZXJpYWxpemVyID0gb3duKHRoaXMsICdmb3JtU2VyaWFsaXplcicpO1xuICAgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIGZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChpc0ZpbGVMaXN0ID0gdXRpbHMkMS5pc0ZpbGVMaXN0KGRhdGEpKSB8fFxuICAgICAgICAgIGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGVudiA9IG93bih0aGlzLCAnZW52Jyk7XG4gICAgICAgICAgY29uc3QgX0Zvcm1EYXRhID0gZW52ICYmIGVudi5Gb3JtRGF0YTtcblxuICAgICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgICAgaXNGaWxlTGlzdCA/IHsgJ2ZpbGVzW10nOiBkYXRhIH0gOiBkYXRhLFxuICAgICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICAgIGZvcm1TZXJpYWxpemVyXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3RQYXlsb2FkIHx8IGhhc0pTT05Db250ZW50VHlwZSkge1xuICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICBdLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gb3duKHRoaXMsICd0cmFuc2l0aW9uYWwnKSB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgICBjb25zdCByZXNwb25zZVR5cGUgPSBvd24odGhpcywgJ3Jlc3BvbnNlVHlwZScpO1xuICAgICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xuXG4gICAgICBpZiAodXRpbHMkMS5pc1Jlc3BvbnNlKGRhdGEpIHx8IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBkYXRhICYmXG4gICAgICAgIHV0aWxzJDEuaXNTdHJpbmcoZGF0YSkgJiZcbiAgICAgICAgKChmb3JjZWRKU09OUGFyc2luZyAmJiAhcmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEsIG93bih0aGlzLCAncGFyc2VSZXZpdmVyJykpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIG93bih0aGlzLCAncmVzcG9uc2UnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICBdLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2IsXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZCxcbiAgICB9LFxuICB9LFxufTtcblxudXRpbHMkMS5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ3F1ZXJ5J10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzJDEuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbmZpZywgZGF0YSwgaGVhZGVycy5ub3JtYWxpemUoKSwgcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBoZWFkZXJzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG5cbmNsYXNzIENhbmNlbGVkRXJyb3IgZXh0ZW5kcyBBeGlvc0Vycm9yIHtcbiAgLyoqXG4gICAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICAgKiBAcGFyYW0ge09iamVjdD19IHJlcXVlc3QgVGhlIHJlcXVlc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPT0gbnVsbCA/ICdjYW5jZWxlZCcgOiBtZXNzYWdlLCBBeGlvc0Vycm9yLkVSUl9DQU5DRUxFRCwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG4gICAgdGhpcy5fX0NBTkNFTF9fID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA+PSA0MDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgNTAwID8gQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QgOiBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pOig/OlxcL1xcLyk/Ly5leGVjKHVybCk7XG4gIHJldHVybiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8ICcnO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoKGJ5dGVzQ291bnQgKiAxMDAwKSAvIHBhc3NlZCkgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8qKlxuICogVGhyb3R0bGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IGZyZXFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgZnJlcSkge1xuICBsZXQgdGltZXN0YW1wID0gMDtcbiAgbGV0IHRocmVzaG9sZCA9IDEwMDAgLyBmcmVxO1xuICBsZXQgbGFzdEFyZ3M7XG4gIGxldCB0aW1lcjtcblxuICBjb25zdCBpbnZva2UgPSAoYXJncywgbm93ID0gRGF0ZS5ub3coKSkgPT4ge1xuICAgIHRpbWVzdGFtcCA9IG5vdztcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBmbiguLi5hcmdzKTtcbiAgfTtcblxuICBjb25zdCB0aHJvdHRsZWQgPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcGFzc2VkID0gbm93IC0gdGltZXN0YW1wO1xuICAgIGlmIChwYXNzZWQgPj0gdGhyZXNob2xkKSB7XG4gICAgICBpbnZva2UoYXJncywgbm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICBpbnZva2UobGFzdEFyZ3MpO1xuICAgICAgICB9LCB0aHJlc2hvbGQgLSBwYXNzZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKChlKSA9PiB7XG4gICAgaWYgKCFlIHx8IHR5cGVvZiBlLmxvYWRlZCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmF3TG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxvYWRlZCA9IHRvdGFsICE9IG51bGwgPyBNYXRoLm1pbihyYXdMb2FkZWQsIHRvdGFsKSA6IHJhd0xvYWRlZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gTWF0aC5tYXgoMCwgbG9hZGVkIC0gYnl0ZXNOb3RpZmllZCk7XG4gICAgY29uc3QgcmF0ZSA9IF9zcGVlZG9tZXRlcihwcm9ncmVzc0J5dGVzKTtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBNYXRoLm1heChieXRlc05vdGlmaWVkLCBsb2FkZWQpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gbG9hZGVkIC8gdG90YWwgOiB1bmRlZmluZWQsXG4gICAgICBieXRlczogcHJvZ3Jlc3NCeXRlcyxcbiAgICAgIHJhdGU6IHJhdGUgPyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXN0aW1hdGVkOiByYXRlICYmIHRvdGFsID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWUsXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn07XG5cbmNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gW1xuICAgIChsb2FkZWQpID0+XG4gICAgICB0aHJvdHRsZWRbMF0oe1xuICAgICAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICB0b3RhbCxcbiAgICAgICAgbG9hZGVkLFxuICAgICAgfSksXG4gICAgdGhyb3R0bGVkWzFdLFxuICBdO1xufTtcblxuY29uc3QgYXN5bmNEZWNvcmF0b3IgPVxuICAoZm4pID0+XG4gICguLi5hcmdzKSA9PlxuICAgIHV0aWxzJDEuYXNhcCgoKSA9PiBmbiguLi5hcmdzKSk7XG5cbnZhciBpc1VSTFNhbWVPcmlnaW4gPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnZcbiAgPyAoKG9yaWdpbiwgaXNNU0lFKSA9PiAodXJsKSA9PiB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHVybCwgcGxhdGZvcm0ub3JpZ2luKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgb3JpZ2luLnByb3RvY29sID09PSB1cmwucHJvdG9jb2wgJiZcbiAgICAgICAgb3JpZ2luLmhvc3QgPT09IHVybC5ob3N0ICYmXG4gICAgICAgIChpc01TSUUgfHwgb3JpZ2luLnBvcnQgPT09IHVybC5wb3J0KVxuICAgICAgKTtcbiAgICB9KShcbiAgICAgIG5ldyBVUkwocGxhdGZvcm0ub3JpZ2luKSxcbiAgICAgIHBsYXRmb3JtLm5hdmlnYXRvciAmJiAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KHBsYXRmb3JtLm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgKVxuICA6ICgpID0+IHRydWU7XG5cbnZhciBjb29raWVzID0gcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52XG4gID8gLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gICAge1xuICAgICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlLCBzYW1lU2l0ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvb2tpZSA9IFtgJHtuYW1lfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YF07XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICBjb29raWUucHVzaChgZXhwaXJlcz0ke25ldyBEYXRlKGV4cGlyZXMpLnRvVVRDU3RyaW5nKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICBjb29raWUucHVzaChgcGF0aD0ke3BhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKGBkb21haW49JHtkb21haW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXRpbHMkMS5pc1N0cmluZyhzYW1lU2l0ZSkpIHtcbiAgICAgICAgICBjb29raWUucHVzaChgU2FtZVNpdGU9JHtzYW1lU2l0ZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgfSxcblxuICAgICAgcmVhZChuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gTWF0Y2ggbmFtZT12YWx1ZSBieSBzcGxpdHRpbmcgb24gdGhlIHNlbWljb2xvbiBzZXBhcmF0b3IgaW5zdGVhZCBvZiBidWlsZGluZyBhXG4gICAgICAgIC8vIFJlZ0V4cCBmcm9tIGBuYW1lYCDigJQgaW50ZXJwb2xhdGluZyBhbiB1bmVzY2FwZWQgc3RyaW5nIGludG8gYSBSZWdFeHAgd291bGQgbGV0XG4gICAgICAgIC8vIG1ldGFjaGFyYWN0ZXJzIChlLmcuIGAuKz9gIGluIGFuIGF0dGFja2VyLWluZmx1ZW5jZWQgY29va2llIG5hbWUpIGNhdXNlIFJlRG9TIG9yXG4gICAgICAgIC8vIG1hdGNoIHRoZSB3cm9uZyBjb29raWUuIEJyb3dzZXJzIG1heSBzZXJpYWxpemUgY29va2llIHBhaXJzIGFzIGVpdGhlciBcIjtcIiBvclxuICAgICAgICAvLyBcIjsgXCIsIHNvIGlnbm9yZSBvcHRpb25hbCB3aGl0ZXNwYWNlIGJlZm9yZSBlYWNoIGNvb2tpZSBuYW1lLlxuICAgICAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0ucmVwbGFjZSgvXlxccysvLCAnJyk7XG4gICAgICAgICAgY29uc3QgZXEgPSBjb29raWUuaW5kZXhPZignPScpO1xuICAgICAgICAgIGlmIChlcSAhPT0gLTEgJiYgY29va2llLnNsaWNlKDAsIGVxKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChjb29raWUuc2xpY2UoZXEgKyAxKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb29raWUuc2xpY2UoZXEgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmUobmFtZSkge1xuICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDAsICcvJyk7XG4gICAgICB9LFxuICAgIH1cbiAgOiAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAge1xuICAgICAgd3JpdGUoKSB7fSxcbiAgICAgIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZSgpIHt9LFxuICAgIH07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xuZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLz9cXC8kLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59XG5cbmNvbnN0IG1hbGZvcm1lZEh0dHBQcm90b2NvbCA9IC9eaHR0cHM/Oig/IVxcL1xcLykvaTtcbmNvbnN0IGh0dHBQcm90b2NvbENvbnRyb2xDaGFyYWN0ZXJzID0gL1tcXHRcXG5cXHJdL2c7XG5cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ0MwQ29udHJvbE9yU3BhY2UodXJsKSB7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCB1cmwubGVuZ3RoICYmIHVybC5jaGFyQ29kZUF0KGkpIDw9IDB4MjApIHtcbiAgICBpKys7XG4gIH1cbiAgcmV0dXJuIHVybC5zbGljZShpKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVVJMRm9yUHJvdG9jb2xDaGVjayh1cmwpIHtcbiAgcmV0dXJuIHN0cmlwTGVhZGluZ0MwQ29udHJvbE9yU3BhY2UodXJsKS5yZXBsYWNlKGh0dHBQcm90b2NvbENvbnRyb2xDaGFyYWN0ZXJzLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkSHR0cFByb3RvY29sVVJMKHVybCwgY29uZmlnKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBtYWxmb3JtZWRIdHRwUHJvdG9jb2wudGVzdChub3JtYWxpemVVUkxGb3JQcm90b2NvbENoZWNrKHVybCkpKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAnSW52YWxpZCBVUkw6IG1pc3NpbmcgXCIvL1wiIGFmdGVyIHByb3RvY29sJyxcbiAgICAgIEF4aW9zRXJyb3IuRVJSX0lOVkFMSURfVVJMLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwsIGFsbG93QWJzb2x1dGVVcmxzLCBjb25maWcpIHtcbiAgYXNzZXJ0VmFsaWRIdHRwUHJvdG9jb2xVUkwocmVxdWVzdGVkVVJMLCBjb25maWcpO1xuICBsZXQgaXNSZWxhdGl2ZVVybCA9ICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCk7XG4gIGlmIChiYXNlVVJMICYmIChpc1JlbGF0aXZlVXJsIHx8IGFsbG93QWJzb2x1dGVVcmxzID09PSBmYWxzZSkpIHtcbiAgICBhc3NlcnRWYWxpZEh0dHBQcm90b2NvbFVSTChiYXNlVVJMLCBjb25maWcpO1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gKHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8geyAuLi50aGluZyB9IDogdGhpbmcpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzEgPSBjb25maWcxIHx8IHt9O1xuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcblxuICAvLyBVc2UgYSBudWxsLXByb3RvdHlwZSBvYmplY3Qgc28gdGhhdCBkb3duc3RyZWFtIHJlYWRzIHN1Y2ggYXMgYGNvbmZpZy5hdXRoYFxuICAvLyBvciBgY29uZmlnLmJhc2VVUkxgIGNhbm5vdCBpbmhlcml0IHBvbGx1dGVkIHZhbHVlcyBmcm9tIE9iamVjdC5wcm90b3R5cGUuXG4gIC8vIGBoYXNPd25Qcm9wZXJ0eWAgaXMgcmVzdG9yZWQgYXMgYSBub24tZW51bWVyYWJsZSBvd24gc2xvdCB0byBwcmVzZXJ2ZVxuICAvLyBlcmdvbm9taWNzIGZvciB1c2VyIGNvZGUgdGhhdCByZWxpZXMgb24gaXQuXG4gIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25maWcsICdoYXNPd25Qcm9wZXJ0eScsIHtcbiAgICAvLyBOdWxsLXByb3RvIGRlc2NyaXB0b3Igc28gYSBwb2xsdXRlZCBPYmplY3QucHJvdG90eXBlLmdldCBjYW5ub3QgdHVyblxuICAgIC8vIHRoaXMgZGF0YSBkZXNjcmlwdG9yIGludG8gYW4gYWNjZXNzb3IgZGVzY3JpcHRvciBvbiB0aGUgd2F5IGluLlxuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlLCBwcm9wLCBjYXNlbGVzcykge1xuICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscyQxLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzJDEubWVyZ2UuY2FsbCh7IGNhc2VsZXNzIH0sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIHByb3AsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgcHJvcCwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIHByb3AsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXJnZWRUcmFuc2l0aW9uYWxPcHRpb24ocHJvcCkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbDIgPSB1dGlscyQxLmhhc093blByb3AoY29uZmlnMiwgJ3RyYW5zaXRpb25hbCcpID8gY29uZmlnMi50cmFuc2l0aW9uYWwgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQodHJhbnNpdGlvbmFsMikpIHtcbiAgICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QodHJhbnNpdGlvbmFsMikpIHtcbiAgICAgICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcCh0cmFuc2l0aW9uYWwyLCBwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uYWwyW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zaXRpb25hbDEgPSB1dGlscyQxLmhhc093blByb3AoY29uZmlnMSwgJ3RyYW5zaXRpb25hbCcpID8gY29uZmlnMS50cmFuc2l0aW9uYWwgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHRyYW5zaXRpb25hbDEpICYmIHV0aWxzJDEuaGFzT3duUHJvcCh0cmFuc2l0aW9uYWwxLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25hbDFbcHJvcF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMoYSwgYiwgcHJvcCkge1xuICAgIGlmICh1dGlscyQxLmhhc093blByb3AoY29uZmlnMiwgcHJvcCkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcxLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVyZ2VNYXAgPSB7XG4gICAgdXJsOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIG1ldGhvZDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBkYXRhOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGJhc2VVUkw6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBwYXJhbXNTZXJpYWxpemVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dE1lc3NhZ2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhYU1JGVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWRhcHRlcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZVR5cGU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkNvb2tpZU5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkhlYWRlck5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25VcGxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgZGVjb21wcmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heEJvZHlMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYmVmb3JlUmVkaXJlY3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNwb3J0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwc0FnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGNhbmNlbFRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHNvY2tldFBhdGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWxsb3dlZFNvY2tldFBhdGhzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYiwgcHJvcCkgPT5cbiAgICAgIG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHByb3AsIHRydWUpLFxuICB9O1xuXG4gIHV0aWxzJDEuZm9yRWFjaChPYmplY3Qua2V5cyh7IC4uLmNvbmZpZzEsIC4uLmNvbmZpZzIgfSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09ICdfX3Byb3RvX18nIHx8IHByb3AgPT09ICdjb25zdHJ1Y3RvcicgfHwgcHJvcCA9PT0gJ3Byb3RvdHlwZScpIHJldHVybjtcbiAgICBjb25zdCBtZXJnZSA9IHV0aWxzJDEuaGFzT3duUHJvcChtZXJnZU1hcCwgcHJvcCkgPyBtZXJnZU1hcFtwcm9wXSA6IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgYSA9IHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcxLCBwcm9wKSA/IGNvbmZpZzFbcHJvcF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYiA9IHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcyLCBwcm9wKSA/IGNvbmZpZzJbcHJvcF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShhLCBiLCBwcm9wKTtcbiAgICAodXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgaWYgKFxuICAgIHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcyLCAndmFsaWRhdGVTdGF0dXMnKSAmJlxuICAgIHV0aWxzJDEuaXNVbmRlZmluZWQoY29uZmlnMi52YWxpZGF0ZVN0YXR1cykgJiZcbiAgICBnZXRNZXJnZWRUcmFuc2l0aW9uYWxPcHRpb24oJ3ZhbGlkYXRlU3RhdHVzVW5kZWZpbmVkUmVzb2x2ZXMnKSA9PT0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcxLCAndmFsaWRhdGVTdGF0dXMnKSkge1xuICAgICAgY29uZmlnLnZhbGlkYXRlU3RhdHVzID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxLnZhbGlkYXRlU3RhdHVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuXG5jb25zdCBGT1JNX0RBVEFfQ09OVEVOVF9IRUFERVJTID0gWydjb250ZW50LXR5cGUnLCAnY29udGVudC1sZW5ndGgnXTtcblxuZnVuY3Rpb24gc2V0Rm9ybURhdGFIZWFkZXJzKGhlYWRlcnMsIGZvcm1IZWFkZXJzLCBwb2xpY3kpIHtcbiAgaWYgKHBvbGljeSAhPT0gJ2NvbnRlbnQtb25seScpIHtcbiAgICBoZWFkZXJzLnNldChmb3JtSGVhZGVycyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgT2JqZWN0LmVudHJpZXMoZm9ybUhlYWRlcnMgfHwge30pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICBpZiAoRk9STV9EQVRBX0NPTlRFTlRfSEVBREVSUy5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0KGtleSwgdmFsKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyB0byBhIExhdGluLTEgYnl0ZSBzdHJpbmcgZm9yIHVzZSB3aXRoIGJ0b2EoKS5cbiAqIFRoaXMgaXMgYSBtb2Rlcm4gcmVwbGFjZW1lbnQgZm9yIHRoZSBkZXByZWNhdGVkIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBlbmNvZGVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtOCBieXRlcyBhcyBhIExhdGluLTEgc3RyaW5nXG4gKi9cbmNvbnN0IGVuY29kZVVURjgkMSA9IChzdHIpID0+XG4gIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2dpLCAoXywgaGV4KSA9PlxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpXG4gICk7XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25maWcoY29uZmlnKSB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIC8vIFJlYWQgb25seSBvd24gcHJvcGVydGllcyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb24gZ2FkZ2V0c1xuICAvLyAoZS5nLiBPYmplY3QucHJvdG90eXBlLmJhc2VVUkwgPSAnaHR0cHM6Ly9ldmlsLmNvbScpLlxuICBjb25zdCBvd24gPSAoa2V5KSA9PiAodXRpbHMkMS5oYXNPd25Qcm9wKG5ld0NvbmZpZywga2V5KSA/IG5ld0NvbmZpZ1trZXldIDogdW5kZWZpbmVkKTtcblxuICBjb25zdCBkYXRhID0gb3duKCdkYXRhJyk7XG4gIGxldCB3aXRoWFNSRlRva2VuID0gb3duKCd3aXRoWFNSRlRva2VuJyk7XG4gIGNvbnN0IHhzcmZIZWFkZXJOYW1lID0gb3duKCd4c3JmSGVhZGVyTmFtZScpO1xuICBjb25zdCB4c3JmQ29va2llTmFtZSA9IG93bigneHNyZkNvb2tpZU5hbWUnKTtcbiAgbGV0IGhlYWRlcnMgPSBvd24oJ2hlYWRlcnMnKTtcbiAgY29uc3QgYXV0aCA9IG93bignYXV0aCcpO1xuICBjb25zdCBiYXNlVVJMID0gb3duKCdiYXNlVVJMJyk7XG4gIGNvbnN0IGFsbG93QWJzb2x1dGVVcmxzID0gb3duKCdhbGxvd0Fic29sdXRlVXJscycpO1xuICBjb25zdCB1cmwgPSBvd24oJ3VybCcpO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChcbiAgICBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHVybCwgYWxsb3dBYnNvbHV0ZVVybHMsIG5ld0NvbmZpZyksXG4gICAgb3duKCdwYXJhbXMnKSxcbiAgICBvd24oJ3BhcmFtc1NlcmlhbGl6ZXInKVxuICApO1xuXG4gIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgaWYgKGF1dGgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHV0aWxzJDEuZ2V0U2FmZVByb3AoYXV0aCwgJ3VzZXJuYW1lJykgfHwgJyc7XG4gICAgY29uc3QgcGFzc3dvcmQgPSB1dGlscyQxLmdldFNhZmVQcm9wKGF1dGgsICdwYXNzd29yZCcpIHx8ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhlYWRlcnMuc2V0KFxuICAgICAgICAnQXV0aG9yaXphdGlvbicsXG4gICAgICAgICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIChwYXNzd29yZCA/IGVuY29kZVVURjgkMShwYXNzd29yZCkgOiAnJykpXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFLCBjb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICBpZiAoXG4gICAgICBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgfHxcbiAgICAgIHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiB8fFxuICAgICAgdXRpbHMkMS5pc1JlYWN0TmF0aXZlKGRhdGEpXG4gICAgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKHVuZGVmaW5lZCk7IC8vIGJyb3dzZXIvd2ViIHdvcmtlci9STiBoYW5kbGVzIGl0XG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzRnVuY3Rpb24oZGF0YS5nZXRIZWFkZXJzKSkge1xuICAgICAgLy8gTm9kZS5qcyBGb3JtRGF0YSAobGlrZSBmb3JtLWRhdGEgcGFja2FnZSlcbiAgICAgIHNldEZvcm1EYXRhSGVhZGVycyhoZWFkZXJzLCBkYXRhLmdldEhlYWRlcnMoKSwgb3duKCdmb3JtRGF0YUhlYWRlclBvbGljeScpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG5cbiAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgIGlmICh1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikpIHtcbiAgICAgIHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gU3RyaWN0IGJvb2xlYW4gY2hlY2sg4oCUIHByZXZlbnRzIHByb3RvLXBvbGx1dGlvbiBnYWRnZXRzIChlLmcuIE9iamVjdC5wcm90b3R5cGUud2l0aFhTUkZUb2tlbiA9IDEpXG4gICAgLy8gYW5kIG1pc2NvbmZpZ3VyYXRpb25zIChlLmcuIFwiZmFsc2VcIikgZnJvbSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBzYW1lLW9yaWdpbiBjaGVjayBhbmQgbGVha2luZ1xuICAgIC8vIHRoZSBYU1JGIHRva2VuIGNyb3NzLW9yaWdpbi5cbiAgICBjb25zdCBzaG91bGRTZW5kWFNSRiA9XG4gICAgICB3aXRoWFNSRlRva2VuID09PSB0cnVlIHx8ICh3aXRoWFNSRlRva2VuID09IG51bGwgJiYgaXNVUkxTYW1lT3JpZ2luKG5ld0NvbmZpZy51cmwpKTtcblxuICAgIGlmIChzaG91bGRTZW5kWFNSRikge1xuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufVxuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG52YXIgeGhyQWRhcHRlciA9IGlzWEhSQWRhcHRlclN1cHBvcnRlZCAmJlxuICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgICBsZXQgcmVxdWVzdERhdGEgPSBfY29uZmlnLmRhdGE7XG4gICAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKF9jb25maWcuaGVhZGVycykubm9ybWFsaXplKCk7XG4gICAgICBsZXQgeyByZXNwb25zZVR5cGUsIG9uVXBsb2FkUHJvZ3Jlc3MsIG9uRG93bmxvYWRQcm9ncmVzcyB9ID0gX2NvbmZpZztcbiAgICAgIGxldCBvbkNhbmNlbGVkO1xuICAgICAgbGV0IHVwbG9hZFRocm90dGxlZCwgZG93bmxvYWRUaHJvdHRsZWQ7XG4gICAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIGZsdXNoVXBsb2FkICYmIGZsdXNoVXBsb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuICAgICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuXG4gICAgICAgIF9jb25maWcuc2lnbmFsICYmIF9jb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHJlcXVlc3Qub3BlbihfY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBfY29uZmlnLnVybCwgdHJ1ZSk7XG5cbiAgICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgICByZXF1ZXN0LnRpbWVvdXQgPSBfY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKFxuICAgICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPVxuICAgICAgICAgICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbidcbiAgICAgICAgICAgID8gcmVxdWVzdC5yZXNwb25zZVRleHRcbiAgICAgICAgICAgIDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXR0bGUoXG4gICAgICAgICAgZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gX3JlamVjdChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlcXVlc3Quc3RhdHVzID09PSAwICYmXG4gICAgICAgICAgICAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5zdGFydHNXaXRoKCdmaWxlOicpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsIGNvbmZpZywgcmVxdWVzdCkpO1xuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGV2ZW50KSB7XG4gICAgICAgIC8vIEJyb3dzZXJzIGRlbGl2ZXIgYSBQcm9ncmVzc0V2ZW50IGluIFhIUiBvbmVycm9yXG4gICAgICAgIC8vIChtZXNzYWdlIG1heSBiZSBlbXB0eTsgd2hlbiBwcmVzZW50LCBzdXJmYWNlIGl0KVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L2Vycm9yX2V2ZW50XG4gICAgICAgIGNvbnN0IG1zZyA9IGV2ZW50ICYmIGV2ZW50Lm1lc3NhZ2UgPyBldmVudC5tZXNzYWdlIDogJ05ldHdvcmsgRXJyb3InO1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgQXhpb3NFcnJvcihtc2csIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICAgIC8vIGF0dGFjaCB0aGUgdW5kZXJseWluZyBldmVudCBmb3IgY29uc3VtZXJzIHdobyB3YW50IGRldGFpbHNcbiAgICAgICAgZXJyLmV2ZW50ID0gZXZlbnQgfHwgbnVsbDtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgICBsZXQgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dFxuICAgICAgICAgID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCdcbiAgICAgICAgICA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gX2NvbmZpZy50cmFuc2l0aW9uYWwgfHwgdHJhbnNpdGlvbmFsRGVmYXVsdHM7XG4gICAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICByZXF1ZXN0XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICAgIHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQgJiYgcmVxdWVzdEhlYWRlcnMuc2V0Q29udGVudFR5cGUobnVsbCk7XG5cbiAgICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgICAgdXRpbHMkMS5mb3JFYWNoKHRvQnl0ZVN0cmluZ0hlYWRlck9iamVjdChyZXF1ZXN0SGVhZGVycyksIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKF9jb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhX2NvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgICBbZG93bmxvYWRUaHJvdHRsZWQsIGZsdXNoRG93bmxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKTtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGRvd25sb2FkVGhyb3R0bGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICAgIGlmIChvblVwbG9hZFByb2dyZXNzICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAgIFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdXBsb2FkVGhyb3R0bGVkKTtcblxuICAgICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICAgIG9uQ2FuY2VsZWQgPSAoY2FuY2VsKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdCghY2FuY2VsIHx8IGNhbmNlbC50eXBlID8gbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnLCByZXF1ZXN0KSA6IGNhbmNlbCk7XG4gICAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkXG4gICAgICAgICAgICA/IG9uQ2FuY2VsZWQoKVxuICAgICAgICAgICAgOiBfY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChfY29uZmlnLnVybCk7XG5cbiAgICAgIGlmIChwcm90b2NvbCAmJiAhcGxhdGZvcm0ucHJvdG9jb2xzLmluY2x1ZGVzKHByb3RvY29sKSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAnVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLFxuICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgICAgICBjb25maWdcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gICAgfSk7XG4gIH07XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgc2lnbmFscyA9IHNpZ25hbHMgPyBzaWduYWxzLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuXG4gIGlmICghdGltZW91dCAmJiAhc2lnbmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCBhYm9ydGVkID0gZmFsc2U7XG5cbiAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICBpZiAoIWFib3J0ZWQpIHtcbiAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIGNvbnN0IGVyciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogdGhpcy5yZWFzb247XG4gICAgICBjb250cm9sbGVyLmFib3J0KFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yXG4gICAgICAgICAgPyBlcnJcbiAgICAgICAgICA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBsZXQgdGltZXIgPVxuICAgIHRpbWVvdXQgJiZcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIG9uYWJvcnQobmV3IEF4aW9zRXJyb3IoYHRpbWVvdXQgb2YgJHt0aW1lb3V0fW1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICBpZiAoIXNpZ25hbHMpIHsgcmV0dXJuOyB9XG4gICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IG51bGw7XG4gICAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHtcbiAgICAgIHNpZ25hbC51bnN1YnNjcmliZVxuICAgICAgICA/IHNpZ25hbC51bnN1YnNjcmliZShvbmFib3J0KVxuICAgICAgICA6IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpO1xuICAgIH0pO1xuICAgIHNpZ25hbHMgPSBudWxsO1xuICB9O1xuXG4gIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0LCB7IG9uY2U6IHRydWUgfSkpO1xuXG4gIGNvbnN0IHsgc2lnbmFsIH0gPSBjb250cm9sbGVyO1xuXG4gIHNpZ25hbC51bnN1YnNjcmliZSA9ICgpID0+IHV0aWxzJDEuYXNhcCh1bnN1YnNjcmliZSk7XG5cbiAgcmV0dXJuIHNpZ25hbDtcbn07XG5cbmNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmIChsZW4gPCBjaHVua1NpemUpIHtcbiAgICB5aWVsZCBjaHVuaztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zID0gMDtcbiAgbGV0IGVuZDtcblxuICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgZW5kID0gcG9zICsgY2h1bmtTaXplO1xuICAgIHlpZWxkIGNodW5rLnNsaWNlKHBvcywgZW5kKTtcbiAgICBwb3MgPSBlbmQ7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRCeXRlcyA9IGFzeW5jIGZ1bmN0aW9uKiAoaXRlcmFibGUsIGNodW5rU2l6ZSkge1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRTdHJlYW0oaXRlcmFibGUpKSB7XG4gICAgeWllbGQqIHN0cmVhbUNodW5rKGNodW5rLCBjaHVua1NpemUpO1xuICB9XG59O1xuXG5jb25zdCByZWFkU3RyZWFtID0gYXN5bmMgZnVuY3Rpb24qIChzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICB5aWVsZCogc3RyZWFtO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgdHJ5IHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59O1xuXG5jb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oXG4gICAge1xuICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIF9vbkZpbmlzaCgpO1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgICBsZXQgbG9hZGVkQnl0ZXMgPSAoYnl0ZXMgKz0gbGVuKTtcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MobG9hZGVkQnl0ZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX29uRmluaXNoKGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgICBfb25GaW5pc2gocmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGhpZ2hXYXRlck1hcms6IDIsXG4gICAgfVxuICApO1xufTtcblxuLyoqXG4gKiBFc3RpbWF0ZSBkZWNvZGVkIGJ5dGUgbGVuZ3RoIG9mIGEgZGF0YTovLyBVUkwgKndpdGhvdXQqIGFsbG9jYXRpbmcgbGFyZ2UgYnVmZmVycy5cbiAqIC0gRm9yIGJhc2U2NDogY29tcHV0ZSBleGFjdCBkZWNvZGVkIHNpemUgdXNpbmcgbGVuZ3RoIGFuZCBwYWRkaW5nO1xuICogICAgICAgICAgICAgICBoYW5kbGUgJVhYIGF0IHRoZSBjaGFyYWN0ZXItY291bnQgbGV2ZWwgKG5vIHN0cmluZyBhbGxvY2F0aW9uKS5cbiAqIC0gRm9yIG5vbi1iYXNlNjQ6IGNvbXB1dGUgdGhlIGV4YWN0IHBlcmNlbnQtZGVjb2RlZCBVVEYtOCBieXRlIGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBpc0hleERpZ2l0ID0gKGNoYXJDb2RlKSA9PlxuICAoY2hhckNvZGUgPj0gNDggJiYgY2hhckNvZGUgPD0gNTcpIHx8XG4gIChjaGFyQ29kZSA+PSA2NSAmJiBjaGFyQ29kZSA8PSA3MCkgfHxcbiAgKGNoYXJDb2RlID49IDk3ICYmIGNoYXJDb2RlIDw9IDEwMik7XG5cbmNvbnN0IGlzUGVyY2VudEVuY29kZWRCeXRlID0gKHN0ciwgaSwgbGVuKSA9PlxuICBpICsgMiA8IGxlbiAmJiBpc0hleERpZ2l0KHN0ci5jaGFyQ29kZUF0KGkgKyAxKSkgJiYgaXNIZXhEaWdpdChzdHIuY2hhckNvZGVBdChpICsgMikpO1xuXG5mdW5jdGlvbiBlc3RpbWF0ZURhdGFVUkxEZWNvZGVkQnl0ZXModXJsKSB7XG4gIGlmICghdXJsIHx8IHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSByZXR1cm4gMDtcbiAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnZGF0YTonKSkgcmV0dXJuIDA7XG5cbiAgY29uc3QgY29tbWEgPSB1cmwuaW5kZXhPZignLCcpO1xuICBpZiAoY29tbWEgPCAwKSByZXR1cm4gMDtcblxuICBjb25zdCBtZXRhID0gdXJsLnNsaWNlKDUsIGNvbW1hKTtcbiAgY29uc3QgYm9keSA9IHVybC5zbGljZShjb21tYSArIDEpO1xuICBjb25zdCBpc0Jhc2U2NCA9IC87YmFzZTY0L2kudGVzdChtZXRhKTtcblxuICBpZiAoaXNCYXNlNjQpIHtcbiAgICBsZXQgZWZmZWN0aXZlTGVuID0gYm9keS5sZW5ndGg7XG4gICAgY29uc3QgbGVuID0gYm9keS5sZW5ndGg7IC8vIGNhY2hlIGxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGJvZHkuY2hhckNvZGVBdChpKSA9PT0gMzcgLyogJyUnICovICYmIGkgKyAyIDwgbGVuKSB7XG4gICAgICAgIGNvbnN0IGEgPSBib2R5LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICBjb25zdCBiID0gYm9keS5jaGFyQ29kZUF0KGkgKyAyKTtcbiAgICAgICAgY29uc3QgaXNIZXggPSBpc0hleERpZ2l0KGEpICYmIGlzSGV4RGlnaXQoYik7XG5cbiAgICAgICAgaWYgKGlzSGV4KSB7XG4gICAgICAgICAgZWZmZWN0aXZlTGVuIC09IDI7XG4gICAgICAgICAgaSArPSAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHBhZCA9IDA7XG4gICAgbGV0IGlkeCA9IGxlbiAtIDE7XG5cbiAgICBjb25zdCB0YWlsSXNQY3QzRCA9IChqKSA9PlxuICAgICAgaiA+PSAyICYmXG4gICAgICBib2R5LmNoYXJDb2RlQXQoaiAtIDIpID09PSAzNyAmJiAvLyAnJSdcbiAgICAgIGJvZHkuY2hhckNvZGVBdChqIC0gMSkgPT09IDUxICYmIC8vICczJ1xuICAgICAgKGJvZHkuY2hhckNvZGVBdChqKSA9PT0gNjggfHwgYm9keS5jaGFyQ29kZUF0KGopID09PSAxMDApOyAvLyAnRCcgb3IgJ2QnXG5cbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIGlmIChib2R5LmNoYXJDb2RlQXQoaWR4KSA9PT0gNjEgLyogJz0nICovKSB7XG4gICAgICAgIHBhZCsrO1xuICAgICAgICBpZHgtLTtcbiAgICAgIH0gZWxzZSBpZiAodGFpbElzUGN0M0QoaWR4KSkge1xuICAgICAgICBwYWQrKztcbiAgICAgICAgaWR4IC09IDM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhZCA9PT0gMSAmJiBpZHggPj0gMCkge1xuICAgICAgaWYgKGJvZHkuY2hhckNvZGVBdChpZHgpID09PSA2MSAvKiAnPScgKi8pIHtcbiAgICAgICAgcGFkKys7XG4gICAgICB9IGVsc2UgaWYgKHRhaWxJc1BjdDNEKGlkeCkpIHtcbiAgICAgICAgcGFkKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzID0gTWF0aC5mbG9vcihlZmZlY3RpdmVMZW4gLyA0KTtcbiAgICBjb25zdCBieXRlcyA9IGdyb3VwcyAqIDMgLSAocGFkIHx8IDApO1xuICAgIHJldHVybiBieXRlcyA+IDAgPyBieXRlcyA6IDA7XG4gIH1cblxuICAvLyBDb21wdXRlIFVURi04IGJ5dGUgbGVuZ3RoIGRpcmVjdGx5IGZyb20gVVRGLTE2IGNvZGUgdW5pdHMgd2l0aG91dCBhbGxvY2F0aW5nXG4gIC8vIGEgYnl0ZSBidWZmZXIgKFRleHRFbmNvZGVyLmVuY29kZSB3b3VsZCBkZWZlYXQgdGhlIERvUyBndWFyZCBvbiBsYXJnZSBib2RpZXMpLlxuICAvLyBWYWxpZCAlWFggdHJpcGxldHMgY291bnQgYXMgb25lIGRlY29kZWQgYnl0ZTsgdGhpcyBtYXRjaGVzIHRoZSBieXRlcyB0aGF0XG4gIC8vIGRlY29kZVVSSUNvbXBvbmVudChib2R5KSB3b3VsZCBwcm9kdWNlIGJlZm9yZSBCdWZmZXIgcmUtZW5jb2RlcyB0aGUgc3RyaW5nLlxuICBsZXQgYnl0ZXMgPSAwO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYm9keS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGMgPSBib2R5LmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGMgPT09IDM3IC8qICclJyAqLyAmJiBpc1BlcmNlbnRFbmNvZGVkQnl0ZShib2R5LCBpLCBsZW4pKSB7XG4gICAgICBieXRlcyArPSAxO1xuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODApIHtcbiAgICAgIGJ5dGVzICs9IDE7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIGJ5dGVzICs9IDI7XG4gICAgfSBlbHNlIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZiAmJiBpICsgMSA8IGxlbikge1xuICAgICAgY29uc3QgbmV4dCA9IGJvZHkuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dCA+PSAweGRjMDAgJiYgbmV4dCA8PSAweGRmZmYpIHtcbiAgICAgICAgYnl0ZXMgKz0gNDtcbiAgICAgICAgaSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnl0ZXMgKz0gMztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMgKz0gMztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIxLjE4LjFcIjtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCB7IGlzRnVuY3Rpb24gfSA9IHV0aWxzJDE7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIHRvIGEgTGF0aW4tMSBieXRlIHN0cmluZyBmb3IgdXNlIHdpdGggYnRvYSgpLlxuICogVGhpcyBpcyBhIG1vZGVybiByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpIHBhdHRlcm4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGVuY29kZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IGJ5dGVzIGFzIGEgTGF0aW4tMSBzdHJpbmdcbiAqL1xuY29uc3QgZW5jb2RlVVRGOCA9IChzdHIpID0+XG4gIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2dpLCAoXywgaGV4KSA9PlxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpXG4gICk7XG5cbi8vIE5vZGUncyBXSEFUV0cgVVJMIHBhcnNlciByZXR1cm5zIGB1c2VybmFtZWAgYW5kIGBwYXNzd29yZGAgcGVyY2VudC1lbmNvZGVkLlxuLy8gRGVjb2RlIGJlZm9yZSBjb21wb3NpbmcgdGhlIGBhdXRoYCBvcHRpb24gc28gY3JlZGVudGlhbHMgc3VjaCBhc1xuLy8gYG15JTQwZW1haWwuY29tOnBhc3NgIGFyZSBzZW50IGFzIGBteUBlbWFpbC5jb206cGFzc2AuIEZhbGxzIGJhY2sgdG8gdGhlXG4vLyBvcmlnaW5hbCB2YWx1ZSBmb3IgbWFsZm9ybWVkIGlucHV0IHNvIGEgYmFkIGVuY29kaW5nIG5ldmVyIHRocm93cy5cbmNvbnN0IGRlY29kZVVSSUNvbXBvbmVudFNhZmUgPSAodmFsdWUpID0+IHtcbiAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5jb25zdCB0ZXN0ID0gKGZuLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IG1heWJlV2l0aEF1dGhDcmVkZW50aWFscyA9ICh1cmwpID0+IHtcbiAgY29uc3QgcHJvdG9jb2xJbmRleCA9IHVybC5pbmRleE9mKCc6Ly8nKTtcbiAgbGV0IHVybFRvQ2hlY2sgPSB1cmw7XG4gIGlmIChwcm90b2NvbEluZGV4ICE9PSAtMSkge1xuICAgIHVybFRvQ2hlY2sgPSB1cmxUb0NoZWNrLnNsaWNlKHByb3RvY29sSW5kZXggKyAzKTtcbiAgfVxuICByZXR1cm4gdXJsVG9DaGVjay5pbmNsdWRlcygnQCcpIHx8IHVybFRvQ2hlY2suaW5jbHVkZXMoJzonKTtcbn07XG5cbmNvbnN0IGZhY3RvcnkgPSAoZW52KSA9PiB7XG4gIGNvbnN0IGdsb2JhbE9iamVjdCA9XG4gICAgdXRpbHMkMS5nbG9iYWwgIT09IHVuZGVmaW5lZCAmJiB1dGlscyQxLmdsb2JhbCAhPT0gbnVsbFxuICAgICAgPyB1dGlscyQxLmdsb2JhbFxuICAgICAgOiBnbG9iYWxUaGlzO1xuICBjb25zdCB7IFJlYWRhYmxlU3RyZWFtLCBUZXh0RW5jb2RlciB9ID0gZ2xvYmFsT2JqZWN0O1xuXG4gIGVudiA9IHV0aWxzJDEubWVyZ2UuY2FsbChcbiAgICB7XG4gICAgICBza2lwVW5kZWZpbmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgUmVxdWVzdDogZ2xvYmFsT2JqZWN0LlJlcXVlc3QsXG4gICAgICBSZXNwb25zZTogZ2xvYmFsT2JqZWN0LlJlc3BvbnNlLFxuICAgIH0sXG4gICAgZW52XG4gICk7XG5cbiAgY29uc3QgeyBmZXRjaDogZW52RmV0Y2gsIFJlcXVlc3QsIFJlc3BvbnNlIH0gPSBlbnY7XG4gIGNvbnN0IGlzRmV0Y2hTdXBwb3J0ZWQgPSBlbnZGZXRjaCA/IGlzRnVuY3Rpb24oZW52RmV0Y2gpIDogdHlwZW9mIGZldGNoID09PSAnZnVuY3Rpb24nO1xuICBjb25zdCBpc1JlcXVlc3RTdXBwb3J0ZWQgPSBpc0Z1bmN0aW9uKFJlcXVlc3QpO1xuICBjb25zdCBpc1Jlc3BvbnNlU3VwcG9ydGVkID0gaXNGdW5jdGlvbihSZXNwb25zZSk7XG5cbiAgaWYgKCFpc0ZldGNoU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgaXNGdW5jdGlvbihSZWFkYWJsZVN0cmVhbSk7XG5cbiAgY29uc3QgZW5jb2RlVGV4dCA9XG4gICAgaXNGZXRjaFN1cHBvcnRlZCAmJlxuICAgICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbidcbiAgICAgID8gKFxuICAgICAgICAgIChlbmNvZGVyKSA9PiAoc3RyKSA9PlxuICAgICAgICAgICAgZW5jb2Rlci5lbmNvZGUoc3RyKVxuICAgICAgICApKG5ldyBUZXh0RW5jb2RlcigpKVxuICAgICAgOiBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVxdWVzdChzdHIpLmFycmF5QnVmZmVyKCkpKTtcblxuICBjb25zdCBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gPVxuICAgIGlzUmVxdWVzdFN1cHBvcnRlZCAmJlxuICAgIGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiZcbiAgICB0ZXN0KCgpID0+IHtcbiAgICAgIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgICAgIGJvZHk6IG5ldyBSZWFkYWJsZVN0cmVhbSgpLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgICAgICBkdXBsZXhBY2Nlc3NlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuICdoYWxmJztcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBoYXNDb250ZW50VHlwZSA9IHJlcXVlc3QuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gICAgICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdC5ib2R5LmNhbmNlbCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZHVwbGV4QWNjZXNzZWQgJiYgIWhhc0NvbnRlbnRUeXBlO1xuICAgIH0pO1xuXG4gIGNvbnN0IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gPVxuICAgIGlzUmVzcG9uc2VTdXBwb3J0ZWQgJiZcbiAgICBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gICAgdGVzdCgoKSA9PiB1dGlscyQxLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCcnKS5ib2R5KSk7XG5cbiAgY29uc3QgcmVzb2x2ZXJzID0ge1xuICAgIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpLFxuICB9O1xuXG4gIGlzRmV0Y2hTdXBwb3J0ZWQgJiZcbiAgICAoKCkgPT4ge1xuICAgICAgWyd0ZXh0JywgJ2FycmF5QnVmZmVyJywgJ2Jsb2InLCAnZm9ybURhdGEnLCAnc3RyZWFtJ10uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAhcmVzb2x2ZXJzW3R5cGVdICYmXG4gICAgICAgICAgKHJlc29sdmVyc1t0eXBlXSA9IChyZXMsIGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgbGV0IG1ldGhvZCA9IHJlcyAmJiByZXNbdHlwZV07XG5cbiAgICAgICAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5jYWxsKHJlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICAgICBgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsXG4gICAgICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULFxuICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KSgpO1xuXG4gIGNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICAgIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkuc2l6ZTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc1NwZWNDb21wbGlhbnRGb3JtKGJvZHkpKSB7XG4gICAgICBjb25zdCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIChhd2FpdCBfcmVxdWVzdC5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpIHx8IHV0aWxzJDEuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgICAgYm9keSA9IGJvZHkgKyAnJztcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc1N0cmluZyhib2R5KSkge1xuICAgICAgcmV0dXJuIChhd2FpdCBlbmNvZGVUZXh0KGJvZHkpKS5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoID0gdXRpbHMkMS50b0Zpbml0ZU51bWJlcihoZWFkZXJzLmdldENvbnRlbnRMZW5ndGgoKSk7XG5cbiAgICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHVybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGRhdGEsXG4gICAgICBzaWduYWwsXG4gICAgICBjYW5jZWxUb2tlbixcbiAgICAgIHRpbWVvdXQsXG4gICAgICBvbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgICAgcmVzcG9uc2VUeXBlLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbicsXG4gICAgICBmZXRjaE9wdGlvbnMsXG4gICAgICBtYXhDb250ZW50TGVuZ3RoLFxuICAgICAgbWF4Qm9keUxlbmd0aCxcbiAgICB9ID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gICAgY29uc3QgaGFzTWF4Q29udGVudExlbmd0aCA9IHV0aWxzJDEuaXNOdW1iZXIobWF4Q29udGVudExlbmd0aCkgJiYgbWF4Q29udGVudExlbmd0aCA+IC0xO1xuICAgIGNvbnN0IGhhc01heEJvZHlMZW5ndGggPSB1dGlscyQxLmlzTnVtYmVyKG1heEJvZHlMZW5ndGgpICYmIG1heEJvZHlMZW5ndGggPiAtMTtcbiAgICBjb25zdCBvd24gPSAoa2V5KSA9PiAodXRpbHMkMS5oYXNPd25Qcm9wKGNvbmZpZywga2V5KSA/IGNvbmZpZ1trZXldIDogdW5kZWZpbmVkKTtcblxuICAgIGxldCBfZmV0Y2ggPSBlbnZGZXRjaCB8fCBmZXRjaDtcblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSA/IChyZXNwb25zZVR5cGUgKyAnJykudG9Mb3dlckNhc2UoKSA6ICd0ZXh0JztcblxuICAgIGxldCBjb21wb3NlZFNpZ25hbCA9IGNvbXBvc2VTaWduYWxzKFxuICAgICAgW3NpZ25hbCwgY2FuY2VsVG9rZW4gJiYgY2FuY2VsVG9rZW4udG9BYm9ydFNpZ25hbCgpXSxcbiAgICAgIHRpbWVvdXRcbiAgICApO1xuXG4gICAgbGV0IHJlcXVlc3QgPSBudWxsO1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPVxuICAgICAgY29tcG9zZWRTaWduYWwgJiZcbiAgICAgIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlICYmXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgICAvLyBBeGlvc0Vycm9yIHdlIHJhaXNlIHdoaWxlIHRoZSByZXF1ZXN0IGJvZHkgaXMgYmVpbmcgc3RyZWFtZWQuIENhcHR1cmVkXG4gICAgLy8gYnkgaWRlbnRpdHkgc28gdGhlIGNhdGNoIGJsb2NrIGNhbiBzdXJmYWNlIGl0IGRpcmVjdGx5LCByZWdhcmRsZXNzIG9mXG4gICAgLy8gaG93IHRoZSBydW50aW1lIHdyYXBzIHRoZSByZXN1bHRpbmcgZmV0Y2ggcmVqZWN0aW9uICh1bmRpY2kgZXhwb3NlcyBpdFxuICAgIC8vIGFzIGBlcnIuY2F1c2VgOyBzb21lIGJyb3dzZXJzIGRyb3AgdGhlIG9yaWdpbmFsIGVycm9yIGVudGlyZWx5KS5cbiAgICBsZXQgcGVuZGluZ0JvZHlFcnJvciA9IG51bGw7XG5cbiAgICBjb25zdCBtYXhCb2R5TGVuZ3RoRXJyb3IgPSAoKSA9PlxuICAgICAgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICdSZXF1ZXN0IGJvZHkgbGFyZ2VyIHRoYW4gbWF4Qm9keUxlbmd0aCBsaW1pdCcsXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICAgICAgbGV0IGF1dGggPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjb25maWdBdXRoID0gb3duKCdhdXRoJyk7XG5cbiAgICAgIGlmIChjb25maWdBdXRoKSB7XG4gICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdXRpbHMkMS5nZXRTYWZlUHJvcChjb25maWdBdXRoLCAndXNlcm5hbWUnKSB8fCAnJztcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB1dGlscyQxLmdldFNhZmVQcm9wKGNvbmZpZ0F1dGgsICdwYXNzd29yZCcpIHx8ICcnO1xuICAgICAgICBhdXRoID0ge1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXliZVdpdGhBdXRoQ3JlZGVudGlhbHModXJsKSkge1xuICAgICAgICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKHVybCwgcGxhdGZvcm0ub3JpZ2luKTtcblxuICAgICAgICBpZiAoIWF1dGggJiYgKHBhcnNlZFVSTC51c2VybmFtZSB8fCBwYXJzZWRVUkwucGFzc3dvcmQpKSB7XG4gICAgICAgICAgY29uc3QgdXJsVXNlcm5hbWUgPSBkZWNvZGVVUklDb21wb25lbnRTYWZlKHBhcnNlZFVSTC51c2VybmFtZSk7XG4gICAgICAgICAgY29uc3QgdXJsUGFzc3dvcmQgPSBkZWNvZGVVUklDb21wb25lbnRTYWZlKHBhcnNlZFVSTC5wYXNzd29yZCk7XG4gICAgICAgICAgYXV0aCA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1cmxVc2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB1cmxQYXNzd29yZFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VkVVJMLnVzZXJuYW1lIHx8IHBhcnNlZFVSTC5wYXNzd29yZCkge1xuICAgICAgICAgIHBhcnNlZFVSTC51c2VybmFtZSA9ICcnO1xuICAgICAgICAgIHBhcnNlZFVSTC5wYXNzd29yZCA9ICcnO1xuICAgICAgICAgIHVybCA9IHBhcnNlZFVSTC5ocmVmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhdXRoKSB7XG4gICAgICAgIGhlYWRlcnMuZGVsZXRlKCdhdXRob3JpemF0aW9uJyk7XG4gICAgICAgIGhlYWRlcnMuc2V0KFxuICAgICAgICAgICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgICAnQmFzaWMgJyArIGJ0b2EoZW5jb2RlVVRGOCgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCB8fCAnJykpKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmZvcmNlIG1heENvbnRlbnRMZW5ndGggZm9yIGRhdGE6IFVSTHMgdXAtZnJvbnQgc28gd2UgbmV2ZXIgbWF0ZXJpYWxpemVcbiAgICAgIC8vIGFuIG92ZXJzaXplZCBwYXlsb2FkLiBUaGUgSFRUUCBhZGFwdGVyIGFwcGxpZXMgdGhlIHNhbWUgY2hlY2sgKHNlZSBodHRwLmpzXG4gICAgICAvLyBcImlmIChwcm90b2NvbCA9PT0gJ2RhdGE6JylcIiBicmFuY2gpLlxuICAgICAgaWYgKGhhc01heENvbnRlbnRMZW5ndGggJiYgdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgY29uc3QgZXN0aW1hdGVkID0gZXN0aW1hdGVEYXRhVVJMRGVjb2RlZEJ5dGVzKHVybCk7XG4gICAgICAgIGlmIChlc3RpbWF0ZWQgPiBtYXhDb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAnbWF4Q29udGVudExlbmd0aCBzaXplIG9mICcgKyBtYXhDb250ZW50TGVuZ3RoICsgJyBleGNlZWRlZCcsXG4gICAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICByZXF1ZXN0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbmZvcmNlIG1heEJvZHlMZW5ndGggYWdhaW5zdCBrbm93bi1zaXplIGJvZGllcyBiZWZvcmUgZGlzcGF0Y2ggdXNpbmdcbiAgICAgIC8vIHRoZSBib2R5J3MgKmFjdHVhbCogc2l6ZSDigJQgbmV2ZXIgYSBjYWxsZXItZGVjbGFyZWQgQ29udGVudC1MZW5ndGgsXG4gICAgICAvLyB3aGljaCBjb3VsZCB1bmRlci1yZXBvcnQgdG8gc2xpcCBhbiBvdmVyc2l6ZWQgYm9keSBwYXN0IHRoZSBjaGVjay5cbiAgICAgIC8vIFVua25vd24tc2l6ZSBzdHJlYW1zIHJldHVybiB1bmRlZmluZWQgaGVyZSBhbmQgYXJlIGNvdW50ZWQgcGVyLWNodW5rXG4gICAgICAvLyBiZWxvdyBhcyBmZXRjaCBjb25zdW1lcyB0aGVtLlxuICAgICAgaWYgKGhhc01heEJvZHlMZW5ndGggJiYgbWV0aG9kICE9PSAnZ2V0JyAmJiBtZXRob2QgIT09ICdoZWFkJykge1xuICAgICAgICBjb25zdCBvdXRib3VuZExlbmd0aCA9IGF3YWl0IGdldEJvZHlMZW5ndGgoZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0Ym91bmRMZW5ndGggPT09ICdudW1iZXInICYmIGlzRmluaXRlKG91dGJvdW5kTGVuZ3RoKSkge1xuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoID0gb3V0Ym91bmRMZW5ndGg7XG4gICAgICAgICAgaWYgKG91dGJvdW5kTGVuZ3RoID4gbWF4Qm9keUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbWF4Qm9keUxlbmd0aEVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEEgc3RyZWFtZWQgYm9keSB1bmRlciBtYXhCb2R5TGVuZ3RoIG11c3QgYmUgY291bnRlZCBhcyBmZXRjaCBjb25zdW1lc1xuICAgICAgLy8gaXQ7IGl0cyBzaXplIGlzIG5ldmVyIHRydXN0ZWQgZnJvbSBhIGNhbGxlci1kZWNsYXJlZCBDb250ZW50LUxlbmd0aC5cbiAgICAgIGNvbnN0IG11c3RFbmZvcmNlU3RyZWFtQm9keSA9XG4gICAgICAgIGhhc01heEJvZHlMZW5ndGggJiYgKHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKSB8fCB1dGlscyQxLmlzU3RyZWFtKGRhdGEpKTtcblxuICAgICAgY29uc3QgdHJhY2tSZXF1ZXN0U3RyZWFtID0gKHN0cmVhbSwgb25Qcm9ncmVzcywgZmx1c2gpID0+XG4gICAgICAgIHRyYWNrU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBERUZBVUxUX0NIVU5LX1NJWkUsXG4gICAgICAgICAgKGxvYWRlZEJ5dGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoaGFzTWF4Qm9keUxlbmd0aCAmJiBsb2FkZWRCeXRlcyA+IG1heEJvZHlMZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgKHBlbmRpbmdCb2R5RXJyb3IgPSBtYXhCb2R5TGVuZ3RoRXJyb3IoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvblByb2dyZXNzICYmIG9uUHJvZ3Jlc3MobG9hZGVkQnl0ZXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZmx1c2hcbiAgICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gJiZcbiAgICAgICAgbWV0aG9kICE9PSAnZ2V0JyAmJlxuICAgICAgICBtZXRob2QgIT09ICdoZWFkJyAmJlxuICAgICAgICAob25VcGxvYWRQcm9ncmVzcyB8fCBtdXN0RW5mb3JjZVN0cmVhbUJvZHkpXG4gICAgICApIHtcbiAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGggPVxuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoID09IG51bGwgPyBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSA6IHJlcXVlc3RDb250ZW50TGVuZ3RoO1xuXG4gICAgICAgIC8vIEEgZGVjbGFyZWQgbGVuZ3RoIG9mIDAgaXMgb25seSB0cnVzdGVkIHRvIHNraXAgdGhlIHdyYXAgd2hlbiB3ZSBhcmVcbiAgICAgICAgLy8gbm90IGVuZm9yY2luZyBhIHN0cmVhbSBsaW1pdCAod2hpY2ggbXVzdCBub3QgcmVseSBvbiB0aGF0IGhlYWRlcikuXG4gICAgICAgIGlmIChyZXF1ZXN0Q29udGVudExlbmd0aCAhPT0gMCB8fCBtdXN0RW5mb3JjZVN0cmVhbUJvZHkpIHtcbiAgICAgICAgICBsZXQgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgICAgIGR1cGxleDogJ2hhbGYnLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IGNvbnRlbnRUeXBlSGVhZGVyO1xuXG4gICAgICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSGVhZGVyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9XG4gICAgICAgICAgICAgIChvblVwbG9hZFByb2dyZXNzICYmXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcykpXG4gICAgICAgICAgICAgICAgKSkgfHxcbiAgICAgICAgICAgICAgW107XG5cbiAgICAgICAgICAgIGRhdGEgPSB0cmFja1JlcXVlc3RTdHJlYW0oX3JlcXVlc3QuYm9keSwgb25Qcm9ncmVzcywgZmx1c2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbXVzdEVuZm9yY2VTdHJlYW1Cb2R5ICYmXG4gICAgICAgICFpc1JlcXVlc3RTdXBwb3J0ZWQgJiZcbiAgICAgICAgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICAgICAgICBtZXRob2QgIT09ICdnZXQnICYmXG4gICAgICAgIG1ldGhvZCAhPT0gJ2hlYWQnXG4gICAgICApIHtcbiAgICAgICAgZGF0YSA9IHRyYWNrUmVxdWVzdFN0cmVhbShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG11c3RFbmZvcmNlU3RyZWFtQm9keSAmJlxuICAgICAgICBpc1JlcXVlc3RTdXBwb3J0ZWQgJiZcbiAgICAgICAgIXN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJlxuICAgICAgICBtZXRob2QgIT09ICdnZXQnICYmXG4gICAgICAgIG1ldGhvZCAhPT0gJ2hlYWQnXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgJ1N0cmVhbSByZXF1ZXN0IGJvZGllcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBmZXRjaCBpbXBsZW1lbnRhdGlvbicsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ29taXQnO1xuICAgICAgfVxuXG4gICAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2xvdWRmbGFyZS93b3JrZXJkL2lzc3Vlcy85MDJcbiAgICAgIGNvbnN0IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPSBpc1JlcXVlc3RTdXBwb3J0ZWQgJiYgJ2NyZWRlbnRpYWxzJyBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcblxuICAgICAgLy8gSWYgZGF0YSBpcyBGb3JtRGF0YSBhbmQgQ29udGVudC1UeXBlIGlzIG11bHRpcGFydC9mb3JtLWRhdGEgd2l0aG91dCBib3VuZGFyeSxcbiAgICAgIC8vIGRlbGV0ZSBpdCBzbyBmZXRjaCBjYW4gc2V0IGl0IGNvcnJlY3RseSB3aXRoIHRoZSBib3VuZGFyeVxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbnRlbnRUeXBlICYmXG4gICAgICAgICAgL15tdWx0aXBhcnRcXC9mb3JtLWRhdGEvaS50ZXN0KGNvbnRlbnRUeXBlKSAmJlxuICAgICAgICAgICEvYm91bmRhcnk9L2kudGVzdChjb250ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaGVhZGVycy5kZWxldGUoJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBVc2VyLUFnZW50IGhlYWRlciBpZiBub3QgYWxyZWFkeSBzZXQgKGZldGNoIGRlZmF1bHRzIHRvICdub2RlJyBpbiBOb2RlLmpzKVxuICAgICAgaGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnYXhpb3MvJyArIFZFUlNJT04sIGZhbHNlKTtcblxuICAgICAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0ge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogY29tcG9zZWRTaWduYWwsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIGhlYWRlcnM6IHRvQnl0ZVN0cmluZ0hlYWRlck9iamVjdChoZWFkZXJzLm5vcm1hbGl6ZSgpKSxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiAnaGFsZicsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdCA9IGlzUmVxdWVzdFN1cHBvcnRlZCAmJiBuZXcgUmVxdWVzdCh1cmwsIHJlc29sdmVkT3B0aW9ucyk7XG5cbiAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IChpc1JlcXVlc3RTdXBwb3J0ZWRcbiAgICAgICAgPyBfZmV0Y2gocmVxdWVzdCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICA6IF9mZXRjaCh1cmwsIHJlc29sdmVkT3B0aW9ucykpO1xuXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgICAgLy8gQ2hlYXAgcHJlLWNoZWNrOiBpZiB0aGUgc2VydmVyIGhvbmVzdGx5IGRlY2xhcmVzIGEgY29udGVudC1sZW5ndGggdGhhdFxuICAgICAgLy8gYWxyZWFkeSBleGNlZWRzIHRoZSBjYXAsIHJlamVjdCBiZWZvcmUgd2Ugc3RhcnQgc3RyZWFtaW5nLlxuICAgICAgaWYgKGhhc01heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVjbGFyZWRMZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlSGVhZGVycy5nZXRDb250ZW50TGVuZ3RoKCkpO1xuICAgICAgICBpZiAoZGVjbGFyZWRMZW5ndGggIT0gbnVsbCAmJiBkZWNsYXJlZExlbmd0aCA+IG1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgICdtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgJyArIG1heENvbnRlbnRMZW5ndGggKyAnIGV4Y2VlZGVkJyxcbiAgICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPVxuICAgICAgICBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJlxuICAgICAgICByZXNwb25zZS5ib2R5ICYmXG4gICAgICAgIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgaGFzTWF4Q29udGVudExlbmd0aCB8fCAoaXNTdHJlYW1SZXNwb25zZSAmJiB1bnN1YnNjcmliZSkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIFsnc3RhdHVzJywgJ3N0YXR1c1RleHQnLCAnaGVhZGVycyddLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICBvcHRpb25zW3Byb3BdID0gcmVzcG9uc2VbcHJvcF07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2VIZWFkZXJzLmdldENvbnRlbnRMZW5ndGgoKSk7XG5cbiAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9XG4gICAgICAgICAgKG9uRG93bmxvYWRQcm9ncmVzcyAmJlxuICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvbkRvd25sb2FkUHJvZ3Jlc3MpLCB0cnVlKVxuICAgICAgICAgICAgKSkgfHxcbiAgICAgICAgICBbXTtcblxuICAgICAgICBsZXQgYnl0ZXNSZWFkID0gMDtcbiAgICAgICAgY29uc3Qgb25DaHVua1Byb2dyZXNzID0gKGxvYWRlZEJ5dGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGhhc01heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGxvYWRlZEJ5dGVzO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IG1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAgICAgJ21heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAnICsgbWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgcmVxdWVzdFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvblByb2dyZXNzICYmIG9uUHJvZ3Jlc3MobG9hZGVkQnl0ZXMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICAgIHRyYWNrU3RyZWFtKHJlc3BvbnNlLmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25DaHVua1Byb2dyZXNzLCAoKSA9PiB7XG4gICAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMkMS5maW5kS2V5KHJlc29sdmVycywgcmVzcG9uc2VUeXBlKSB8fCAndGV4dCddKFxuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgY29uZmlnXG4gICAgICApO1xuXG4gICAgICAvLyBGYWxsYmFjayBlbmZvcmNlbWVudCBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgUmVhZGFibGVTdHJlYW0gc3VwcG9ydFxuICAgICAgLy8gKGxlZ2FjeSBydW50aW1lcykuIERldGVjdCBtYXRlcmlhbGl6ZWQgc2l6ZSBmcm9tIHR5cGVkIG91dHB1dDsgc2tpcFxuICAgICAgLy8gc3RyZWFtcy9SZXNwb25zZSBwYXNzdGhyb3VnaCBzaW5jZSB0aGUgdXNlciB3aWxsIHJlYWQgdGhvc2UgdGhlbXNlbHZlcy5cbiAgICAgIGlmIChoYXNNYXhDb250ZW50TGVuZ3RoICYmICFzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmICFpc1N0cmVhbVJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBtYXRlcmlhbGl6ZWRTaXplO1xuICAgICAgICBpZiAocmVzcG9uc2VEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlRGF0YS5ieXRlTGVuZ3RoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbWF0ZXJpYWxpemVkU2l6ZSA9IHJlc3BvbnNlRGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3BvbnNlRGF0YS5zaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbWF0ZXJpYWxpemVkU2l6ZSA9IHJlc3BvbnNlRGF0YS5zaXplO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3BvbnNlRGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZFNpemUgPVxuICAgICAgICAgICAgICB0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyZXNwb25zZURhdGEpLmJ5dGVMZW5ndGhcbiAgICAgICAgICAgICAgICA6IHJlc3BvbnNlRGF0YS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF0ZXJpYWxpemVkU2l6ZSA9PT0gJ251bWJlcicgJiYgbWF0ZXJpYWxpemVkU2l6ZSA+IG1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAgICdtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgJyArIG1heENvbnRlbnRMZW5ndGggKyAnIGV4Y2VlZGVkJyxcbiAgICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHtcbiAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgaGVhZGVyczogQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICAgIC8vIFNhZmFyaSBjYW4gc3VyZmFjZSBmZXRjaCBhYm9ydHMgYXMgYSBET01FeGNlcHRpb24tbGlrZSBvYmplY3Qgd2hvc2VcbiAgICAgIC8vIGJyYW5kZWQgZ2V0dGVycyB0aHJvdy4gUHJlZmVyIG91ciBjb21wb3NlZCBzaWduYWwgcmVhc29uIGJlZm9yZSByZWFkaW5nXG4gICAgICAvLyB0aGUgY2F1Z2h0IGVycm9yLCBwcmVzZXJ2aW5nIHRpbWVvdXQgdnMgY2FuY2VsbGF0aW9uIHNlbWFudGljcy5cbiAgICAgIGlmIChjb21wb3NlZFNpZ25hbCAmJiBjb21wb3NlZFNpZ25hbC5hYm9ydGVkICYmIGNvbXBvc2VkU2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgICAgY29uc3QgY2FuY2VsZWRFcnJvciA9IGNvbXBvc2VkU2lnbmFsLnJlYXNvbjtcbiAgICAgICAgY2FuY2VsZWRFcnJvci5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHJlcXVlc3QgJiYgKGNhbmNlbGVkRXJyb3IucmVxdWVzdCA9IHJlcXVlc3QpO1xuICAgICAgICBpZiAoZXJyICE9PSBjYW5jZWxlZEVycm9yKSB7XG4gICAgICAgICAgLy8gTm9uLWVudW1lcmFibGUgdG8gbWF0Y2ggbmF0aXZlIEVycm9yIGBjYXVzZWAgc2VtYW50aWNzIHNvIGxvZ2dlcnNcbiAgICAgICAgICAvLyBkb24ndCByZWN1cnNlIGludG8gY2lyY3VsYXIgZmV0Y2ggaW50ZXJuYWxzIChzZWUgIzcyMDUpLlxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYW5jZWxlZEVycm9yLCAnY2F1c2UnLCB7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBjYW5jZWxlZEVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBTdXJmYWNlIGEgbWF4Qm9keUxlbmd0aCB2aW9sYXRpb24gd2UgcmFpc2VkIHdoaWxlIHRoZSByZXF1ZXN0IGJvZHkgd2FzXG4gICAgICAvLyBiZWluZyBzdHJlYW1lZC4gTWF0Y2hpbmcgYnkgaWRlbnRpdHkgKHJhdGhlciB0aGFuIHJlYWRpbmdcbiAgICAgIC8vIGBlcnIuY2F1c2UuaXNBeGlvc0Vycm9yYCkga2VlcHMgdGhlIGVycm9yIGRldGVybWluaXN0aWMgYWNyb3NzIHJ1bnRpbWVzXG4gICAgICAvLyBhbmQgYXZvaWRzIGJvdGggcHJvdG90eXBlLXBvbGx1dGlvbiByZWFkcyBhbmQgbWlzLWF0dHJpYnV0aW5nIGEgZm9yZWlnblxuICAgICAgLy8gQXhpb3NFcnJvciB0aGF0IG1lcmVseSBoYXBwZW5lZCB0byBsYW5kIGluIGBlcnIuY2F1c2VgLlxuICAgICAgaWYgKHBlbmRpbmdCb2R5RXJyb3IpIHtcbiAgICAgICAgcmVxdWVzdCAmJiAhcGVuZGluZ0JvZHlFcnJvci5yZXF1ZXN0ICYmIChwZW5kaW5nQm9keUVycm9yLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgICAgICAgdGhyb3cgcGVuZGluZ0JvZHlFcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtdGhyb3cgQXhpb3NFcnJvcnMgd2UgcmFpc2VkIHN5bmNocm9ub3VzbHkgKGRhdGE6IFVSTCAvIGNvbnRlbnQtbGVuZ3RoXG4gICAgICAvLyBwcmUtY2hlY2tzLCByZXNwb25zZSBzaXplIGVuZm9yY2VtZW50KSB3aXRob3V0IHJlLXdyYXBwaW5nIHRoZW0uXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvcikge1xuICAgICAgICByZXF1ZXN0ICYmICFlcnIucmVxdWVzdCAmJiAoZXJyLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvTG9hZCBmYWlsZWR8ZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBuZXR3b3JrRXJyb3IgPSBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAnTmV0d29yayBFcnJvcicsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfTkVUV09SSyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBlcnIgJiYgZXJyLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIC8vIE5vbi1lbnVtZXJhYmxlIHRvIG1hdGNoIG5hdGl2ZSBFcnJvciBgY2F1c2VgIHNlbWFudGljcyBzbyBsb2dnZXJzXG4gICAgICAgIC8vIGRvbid0IHJlY3Vyc2UgaW50byBjaXJjdWxhciBmZXRjaCBpbnRlcm5hbHMgKHNlZSAjNzIwNSkuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXR3b3JrRXJyb3IsICdjYXVzZScsIHtcbiAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgdmFsdWU6IGVyci5jYXVzZSB8fCBlcnIsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV0d29ya0Vycm9yO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZXJyLCBlcnIgJiYgZXJyLmNvZGUsIGNvbmZpZywgcmVxdWVzdCwgZXJyICYmIGVyci5yZXNwb25zZSk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3Qgc2VlZENhY2hlID0gbmV3IE1hcCgpO1xuXG5jb25zdCBnZXRGZXRjaCA9IChjb25maWcpID0+IHtcbiAgbGV0IGVudiA9IChjb25maWcgJiYgY29uZmlnLmVudikgfHwge307XG4gIGNvbnN0IHsgZmV0Y2gsIFJlcXVlc3QsIFJlc3BvbnNlIH0gPSBlbnY7XG4gIGNvbnN0IHNlZWRzID0gW1JlcXVlc3QsIFJlc3BvbnNlLCBmZXRjaF07XG5cbiAgbGV0IGxlbiA9IHNlZWRzLmxlbmd0aCxcbiAgICBpID0gbGVuLFxuICAgIHNlZWQsXG4gICAgdGFyZ2V0LFxuICAgIG1hcCA9IHNlZWRDYWNoZTtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgc2VlZCA9IHNlZWRzW2ldO1xuICAgIHRhcmdldCA9IG1hcC5nZXQoc2VlZCk7XG5cbiAgICB0YXJnZXQgPT09IHVuZGVmaW5lZCAmJiBtYXAuc2V0KHNlZWQsICh0YXJnZXQgPSBpID8gbmV3IE1hcCgpIDogZmFjdG9yeShlbnYpKSk7XG5cbiAgICBtYXAgPSB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuZ2V0RmV0Y2goKTtcblxuLyoqXG4gKiBLbm93biBhZGFwdGVycyBtYXBwaW5nLlxuICogUHJvdmlkZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgYWRhcHRlcnMgZm9yIEF4aW9zOlxuICogLSBgaHR0cGAgZm9yIE5vZGUuanNcbiAqIC0gYHhocmAgZm9yIGJyb3dzZXJzXG4gKiAtIGBmZXRjaGAgZm9yIGZldGNoIEFQSS1iYXNlZCByZXF1ZXN0c1xuICpcbiAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBGdW5jdGlvbnxPYmplY3Q+fVxuICovXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyLFxuICBmZXRjaDoge1xuICAgIGdldDogZ2V0RmV0Y2gsXG4gIH0sXG59O1xuXG4vLyBBc3NpZ24gYWRhcHRlciBuYW1lcyBmb3IgZWFzaWVyIGRlYnVnZ2luZyBhbmQgaWRlbnRpZmljYXRpb25cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICAvLyBOdWxsLXByb3RvIGRlc2NyaXB0b3JzIHNvIGEgcG9sbHV0ZWQgT2JqZWN0LnByb3RvdHlwZS5nZXQgY2Fubm90IHR1cm5cbiAgICAgIC8vIHRoZXNlIGRhdGEgZGVzY3JpcHRvcnMgaW50byBhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbiB0aGUgd2F5IGluLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgX19wcm90b19fOiBudWxsLCB2YWx1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnYWRhcHRlck5hbWUnLCB7IF9fcHJvdG9fXzogbnVsbCwgdmFsdWUgfSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIFJlbmRlciBhIHJlamVjdGlvbiByZWFzb24gc3RyaW5nIGZvciB1bmtub3duIG9yIHVuc3VwcG9ydGVkIGFkYXB0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYWRhcHRlciBpcyByZXNvbHZlZCAoZnVuY3Rpb24sIG51bGwsIG9yIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbHxmYWxzZX0gYWRhcHRlclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUmVzb2x2ZWRIYW5kbGUgPSAoYWRhcHRlcikgPT5cbiAgdXRpbHMkMS5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBzdWl0YWJsZSBhZGFwdGVyIGZyb20gdGhlIHByb3ZpZGVkIGxpc3QuXG4gKiBUcmllcyBlYWNoIGFkYXB0ZXIgaW4gb3JkZXIgdW50aWwgYSBzdXBwb3J0ZWQgb25lIGlzIGZvdW5kLlxuICogVGhyb3dzIGFuIEF4aW9zRXJyb3IgaWYgbm8gYWRhcHRlciBpcyBzdWl0YWJsZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xGdW5jdGlvbj58c3RyaW5nfEZ1bmN0aW9ufSBhZGFwdGVycyAtIEFkYXB0ZXIocykgYnkgbmFtZSBvciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBBeGlvcyByZXF1ZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3Mge0F4aW9zRXJyb3J9IElmIG5vIHN1aXRhYmxlIGFkYXB0ZXIgaXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlZCBhZGFwdGVyIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFkYXB0ZXIoYWRhcHRlcnMsIGNvbmZpZykge1xuICBhZGFwdGVycyA9IHV0aWxzJDEuaXNBcnJheShhZGFwdGVycykgPyBhZGFwdGVycyA6IFthZGFwdGVyc107XG5cbiAgY29uc3QgeyBsZW5ndGggfSA9IGFkYXB0ZXJzO1xuICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgbGV0IGFkYXB0ZXI7XG5cbiAgY29uc3QgcmVqZWN0ZWRSZWFzb25zID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICBsZXQgaWQ7XG5cbiAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgYWRhcHRlciA9IGtub3duQWRhcHRlcnNbKGlkID0gU3RyaW5nKG5hbWVPckFkYXB0ZXIpKS50b0xvd2VyQ2FzZSgpXTtcblxuICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRhcHRlciAmJiAodXRpbHMkMS5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IChhZGFwdGVyID0gYWRhcHRlci5nZXQoY29uZmlnKSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICB9XG5cbiAgaWYgKCFhZGFwdGVyKSB7XG4gICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucykubWFwKFxuICAgICAgKFtpZCwgc3RhdGVdKSA9PlxuICAgICAgICBgYWRhcHRlciAke2lkfSBgICtcbiAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICk7XG5cbiAgICBsZXQgcyA9IGxlbmd0aFxuICAgICAgPyByZWFzb25zLmxlbmd0aCA+IDFcbiAgICAgICAgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpXG4gICAgICAgIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pXG4gICAgICA6ICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgIGBUaGVyZSBpcyBubyBzdWl0YWJsZSBhZGFwdGVyIHRvIGRpc3BhdGNoIHRoZSByZXF1ZXN0IGAgKyBzLFxuICAgICAgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlRcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbi8qKlxuICogRXhwb3J0cyBBeGlvcyBhZGFwdGVycyBhbmQgdXRpbGl0eSB0byByZXNvbHZlIGFuIGFkYXB0ZXJcbiAqL1xudmFyIGFkYXB0ZXJzID0ge1xuICAvKipcbiAgICogUmVzb2x2ZSBhbiBhZGFwdGVyIGZyb20gYSBsaXN0IG9mIGFkYXB0ZXIgbmFtZXMgb3IgZnVuY3Rpb25zLlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICBnZXRBZGFwdGVyLFxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGFsbCBrbm93biBhZGFwdGVyc1xuICAgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb258T2JqZWN0Pn1cbiAgICovXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzLFxufTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5mdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKGNvbmZpZywgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3QpO1xuXG4gIGlmIChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5kZXhPZihjb25maWcubWV0aG9kKSAhPT0gLTEpIHtcbiAgICBjb25maWcuaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXIoY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlciwgY29uZmlnKTtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oXG4gICAgZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBFeHBvc2UgdGhlIGN1cnJlbnQgcmVzcG9uc2Ugb24gY29uZmlnIHNvIHRoYXQgdHJhbnNmb3JtUmVzcG9uc2UgY2FuXG4gICAgICAvLyBhdHRhY2ggaXQgdG8gYW55IEF4aW9zRXJyb3IgaXQgdGhyb3dzIChlLmcuIG9uIEpTT04gcGFyc2UgZmFpbHVyZSkuXG4gICAgICAvLyBXZSBjbGVhbiBpdCB1cCBhZnRlcndhcmRzIHRvIGF2b2lkIHBvbGx1dGluZyB0aGUgY29uZmlnIG9iamVjdC5cbiAgICAgIGNvbmZpZy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChjb25maWcsIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIGNvbmZpZy5yZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSxcbiAgICBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlID0gcmVhc29uLnJlc3BvbnNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5yZXNwb25zZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICApO1xufVxuXG5jb25zdCB2YWxpZGF0b3JzJDEgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnMkMVt0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzJDEudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAoXG4gICAgICAnW0F4aW9zIHYnICtcbiAgICAgIFZFUlNJT04gK1xuICAgICAgXCJdIFRyYW5zaXRpb25hbCBvcHRpb24gJ1wiICtcbiAgICAgIG9wdCArXG4gICAgICBcIidcIiArXG4gICAgICBkZXNjICtcbiAgICAgIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbnZhbGlkYXRvcnMkMS5zcGVsbGluZyA9IGZ1bmN0aW9uIHNwZWxsaW5nKGNvcnJlY3RTcGVsbGluZykge1xuICByZXR1cm4gKHZhbHVlLCBvcHQpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihgJHtvcHR9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7Y29ycmVjdFNwZWxsaW5nfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnIHx8IG9wdGlvbnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBjb25zdCBvcHQgPSBrZXlzW2ldO1xuICAgIC8vIFVzZSBoYXNPd25Qcm9wZXJ0eSBzbyBhIHBvbGx1dGVkIE9iamVjdC5wcm90b3R5cGUuPG9wdD4gY2Fubm90IHN1cHBseVxuICAgIC8vIGEgbm9uLWZ1bmN0aW9uIHZhbGlkYXRvciBhbmQgY2F1c2UgYSBUeXBlRXJyb3IuXG4gICAgY29uc3QgdmFsaWRhdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYSwgb3B0KSA/IHNjaGVtYVtvcHRdIDogdW5kZWZpbmVkO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0LFxuICAgICAgICAgIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTik7XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0b3IgPSB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnM6IHZhbGlkYXRvcnMkMSxcbn07XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBjb25maWdPclVybCBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gICAqIEBwYXJhbSB7P09iamVjdH0gY29uZmlnXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAgICovXG4gIGFzeW5jIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsZXQgZHVtbXkgPSB7fTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15KSA6IChkdW1teSA9IG5ldyBFcnJvcigpKTtcblxuICAgICAgICAvLyBzbGljZSBvZmYgdGhlIEVycm9yOiAuLi4gbGluZVxuICAgICAgICBjb25zdCBzdGFjayA9ICgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFkdW1teS5zdGFjaykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpcnN0TmV3bGluZUluZGV4ID0gZHVtbXkuc3RhY2suaW5kZXhPZignXFxuJyk7XG5cbiAgICAgICAgICByZXR1cm4gZmlyc3ROZXdsaW5lSW5kZXggPT09IC0xID8gJycgOiBkdW1teS5zdGFjay5zbGljZShmaXJzdE5ld2xpbmVJbmRleCArIDEpO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjaykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3ROZXdsaW5lSW5kZXggPSBzdGFjay5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZE5ld2xpbmVJbmRleCA9XG4gICAgICAgICAgICAgIGZpcnN0TmV3bGluZUluZGV4ID09PSAtMSA/IC0xIDogc3RhY2suaW5kZXhPZignXFxuJywgZmlyc3ROZXdsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrV2l0aG91dFR3b1RvcExpbmVzID1cbiAgICAgICAgICAgICAgc2Vjb25kTmV3bGluZUluZGV4ID09PSAtMSA/ICcnIDogc3RhY2suc2xpY2Uoc2Vjb25kTmV3bGluZUluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIGlmICghU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2tXaXRob3V0VHdvVG9wTGluZXMpKSB7XG4gICAgICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3QgeyB0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnMgfSA9IGNvbmZpZztcblxuICAgIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMoXG4gICAgICAgIHRyYW5zaXRpb25hbCxcbiAgICAgICAge1xuICAgICAgICAgIHNpbGVudEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgICAgbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgICBhZHZlcnRpc2Vac3RkQWNjZXB0RW5jb2Rpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgICAgdmFsaWRhdGVTdGF0dXNVbmRlZmluZWRSZXNvbHZlczogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXIsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhcbiAgICAgICAgICBwYXJhbXNTZXJpYWxpemVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICAgIHNlcmlhbGl6ZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzXG4gICAgaWYgKGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSA7IGVsc2UgaWYgKHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzID0gdGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhcbiAgICAgIGNvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgYmFzZVVybDogdmFsaWRhdG9ycy5zcGVsbGluZygnYmFzZVVSTCcpLFxuICAgICAgICB3aXRoWHNyZlRva2VuOiB2YWxpZGF0b3JzLnNwZWxsaW5nKCd3aXRoWFNSRlRva2VuJyksXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMkMS5tZXJnZShoZWFkZXJzLmNvbW1vbiwgaGVhZGVyc1tjb25maWcubWV0aG9kXSk7XG5cbiAgICBoZWFkZXJzICYmXG4gICAgICB1dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAncXVlcnknLCAnY29tbW9uJ10sIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH0pO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IGNvbmZpZy50cmFuc2l0aW9uYWwgfHwgdHJhbnNpdGlvbmFsRGVmYXVsdHM7XG4gICAgICBjb25zdCBsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nID1cbiAgICAgICAgdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5sZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nO1xuXG4gICAgICBpZiAobGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZykge1xuICAgICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdCguLi5yZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoKC4uLnJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscywgY29uZmlnKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybCxcbiAgICAgICAgZGF0YTogY29uZmlnICYmIHV0aWxzJDEuaGFzT3duUHJvcChjb25maWcsICdkYXRhJykgPyBjb25maWcuZGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcbn0pO1xuXG51dGlscyQxLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdxdWVyeSddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgICAgbWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnM6IGlzRm9ybVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgLy8gUVVFUlkgaXMgYSBzYWZlL2lkZW1wb3RlbnQgcmVhZCBtZXRob2Q7IG11bHRpcGFydCBmb3JtIGJvZGllcyBkb24ndCBmaXRcbiAgLy8gaXRzIHNlbWFudGljcywgc28gbm8gcXVlcnlGb3JtIHNob3J0aGFuZCBpcyBnZW5lcmF0ZWQuXG4gIGlmIChtZXRob2QgIT09ICdxdWVyeScpIHtcbiAgICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbiAgfVxufSk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKChjYW5jZWwpID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSAob25mdWxmaWxsZWQpID0+IHtcbiAgICAgIGxldCBfcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIGNvbnN0IGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNPYmplY3QocGF5bG9hZCkgJiYgcGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWU7XG59XG5cbmNvbnN0IEh0dHBTdGF0dXNDb2RlID0ge1xuICBDb250aW51ZTogMTAwLFxuICBTd2l0Y2hpbmdQcm90b2NvbHM6IDEwMSxcbiAgUHJvY2Vzc2luZzogMTAyLFxuICBFYXJseUhpbnRzOiAxMDMsXG4gIE9rOiAyMDAsXG4gIENyZWF0ZWQ6IDIwMSxcbiAgQWNjZXB0ZWQ6IDIwMixcbiAgTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOiAyMDMsXG4gIE5vQ29udGVudDogMjA0LFxuICBSZXNldENvbnRlbnQ6IDIwNSxcbiAgUGFydGlhbENvbnRlbnQ6IDIwNixcbiAgTXVsdGlTdGF0dXM6IDIwNyxcbiAgQWxyZWFkeVJlcG9ydGVkOiAyMDgsXG4gIEltVXNlZDogMjI2LFxuICBNdWx0aXBsZUNob2ljZXM6IDMwMCxcbiAgTW92ZWRQZXJtYW5lbnRseTogMzAxLFxuICBGb3VuZDogMzAyLFxuICBTZWVPdGhlcjogMzAzLFxuICBOb3RNb2RpZmllZDogMzA0LFxuICBVc2VQcm94eTogMzA1LFxuICBVbnVzZWQ6IDMwNixcbiAgVGVtcG9yYXJ5UmVkaXJlY3Q6IDMwNyxcbiAgUGVybWFuZW50UmVkaXJlY3Q6IDMwOCxcbiAgQmFkUmVxdWVzdDogNDAwLFxuICBVbmF1dGhvcml6ZWQ6IDQwMSxcbiAgUGF5bWVudFJlcXVpcmVkOiA0MDIsXG4gIEZvcmJpZGRlbjogNDAzLFxuICBOb3RGb3VuZDogNDA0LFxuICBNZXRob2ROb3RBbGxvd2VkOiA0MDUsXG4gIE5vdEFjY2VwdGFibGU6IDQwNixcbiAgUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA0MDcsXG4gIFJlcXVlc3RUaW1lb3V0OiA0MDgsXG4gIENvbmZsaWN0OiA0MDksXG4gIEdvbmU6IDQxMCxcbiAgTGVuZ3RoUmVxdWlyZWQ6IDQxMSxcbiAgUHJlY29uZGl0aW9uRmFpbGVkOiA0MTIsXG4gIFBheWxvYWRUb29MYXJnZTogNDEzLFxuICBVcmlUb29Mb25nOiA0MTQsXG4gIFVuc3VwcG9ydGVkTWVkaWFUeXBlOiA0MTUsXG4gIFJhbmdlTm90U2F0aXNmaWFibGU6IDQxNixcbiAgRXhwZWN0YXRpb25GYWlsZWQ6IDQxNyxcbiAgSW1BVGVhcG90OiA0MTgsXG4gIE1pc2RpcmVjdGVkUmVxdWVzdDogNDIxLFxuICBVbnByb2Nlc3NhYmxlRW50aXR5OiA0MjIsXG4gIExvY2tlZDogNDIzLFxuICBGYWlsZWREZXBlbmRlbmN5OiA0MjQsXG4gIFRvb0Vhcmx5OiA0MjUsXG4gIFVwZ3JhZGVSZXF1aXJlZDogNDI2LFxuICBQcmVjb25kaXRpb25SZXF1aXJlZDogNDI4LFxuICBUb29NYW55UmVxdWVzdHM6IDQyOSxcbiAgUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOiA0MzEsXG4gIFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOiA0NTEsXG4gIEludGVybmFsU2VydmVyRXJyb3I6IDUwMCxcbiAgTm90SW1wbGVtZW50ZWQ6IDUwMSxcbiAgQmFkR2F0ZXdheTogNTAyLFxuICBTZXJ2aWNlVW5hdmFpbGFibGU6IDUwMyxcbiAgR2F0ZXdheVRpbWVvdXQ6IDUwNCxcbiAgSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6IDUwNSxcbiAgVmFyaWFudEFsc29OZWdvdGlhdGVzOiA1MDYsXG4gIEluc3VmZmljaWVudFN0b3JhZ2U6IDUwNyxcbiAgTG9vcERldGVjdGVkOiA1MDgsXG4gIE5vdEV4dGVuZGVkOiA1MTAsXG4gIE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA1MTEsXG4gIFdlYlNlcnZlcklzRG93bjogNTIxLFxuICBDb25uZWN0aW9uVGltZWRPdXQ6IDUyMixcbiAgT3JpZ2luSXNVbnJlYWNoYWJsZTogNTIzLFxuICBUaW1lb3V0T2NjdXJyZWQ6IDUyNCxcbiAgU3NsSGFuZHNoYWtlRmFpbGVkOiA1MjUsXG4gIEludmFsaWRTc2xDZXJ0aWZpY2F0ZTogNTI2LFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzJDEuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcy5wcm90b3R5cGUsIGNvbnRleHQsIHsgYWxsT3duS2V5czogdHJ1ZSB9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMkMS5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHsgYWxsT3duS2V5czogdHJ1ZSB9KTtcblxuICAvLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG4gIGluc3RhbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhkZWZhdWx0Q29uZmlnLCBpbnN0YW5jZUNvbmZpZykpO1xuICB9O1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG5jb25zdCBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbGVkRXJyb3IgPSBDYW5jZWxlZEVycm9yO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSBDYW5jZWxUb2tlbjtcbmF4aW9zLmlzQ2FuY2VsID0gaXNDYW5jZWw7XG5heGlvcy5WRVJTSU9OID0gVkVSU0lPTjtcbmF4aW9zLnRvRm9ybURhdGEgPSB0b0Zvcm1EYXRhO1xuXG4vLyBFeHBvc2UgQXhpb3NFcnJvciBjbGFzc1xuYXhpb3MuQXhpb3NFcnJvciA9IEF4aW9zRXJyb3I7XG5cbi8vIGFsaWFzIGZvciBDYW5jZWxlZEVycm9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5heGlvcy5DYW5jZWwgPSBheGlvcy5DYW5jZWxlZEVycm9yO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuXG5heGlvcy5zcHJlYWQgPSBzcHJlYWQ7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IGlzQXhpb3NFcnJvcjtcblxuLy8gRXhwb3NlIG1lcmdlQ29uZmlnXG5heGlvcy5tZXJnZUNvbmZpZyA9IG1lcmdlQ29uZmlnO1xuXG5heGlvcy5BeGlvc0hlYWRlcnMgPSBBeGlvc0hlYWRlcnM7XG5cbmF4aW9zLmZvcm1Ub0pTT04gPSAodGhpbmcpID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzJDEuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXhpb3MuY2pzLm1hcFxuIiwiaW1wb3J0IGdldEdlbmVyYXRvckZ1bmN0aW9uIGZyb20gJy4vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBnZXRHZW5lcmF0b3JGdW5jdGlvbjtcblxuZXhwb3J0IHsgZ2V0R2VuZXJhdG9yRnVuY3Rpb24gYXMgJ21vZHVsZS5leHBvcnRzJyB9O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxuY29uc3QgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRjb25zdCBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0Y29uc3QgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlci92YWx1ZSBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0aWYoQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSkge1xuXHRcdHZhciBpID0gMDtcblx0XHR3aGlsZShpIDwgZGVmaW5pdGlvbi5sZW5ndGgpIHtcblx0XHRcdHZhciBrZXkgPSBkZWZpbml0aW9uW2krK107XG5cdFx0XHR2YXIgYmluZGluZyA9IGRlZmluaXRpb25baSsrXTtcblx0XHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0XHRpZihiaW5kaW5nID09PSAwKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogZGVmaW5pdGlvbltpKytdIH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBiaW5kaW5nIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYoYmluZGluZyA9PT0gMCkgeyBpKys7IH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG5sZXQgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTM1NSk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|