appium-adb 8.18.0 → 9.2.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/README.md +0 -2
- package/build/index.js +1 -1
- package/build/lib/adb.js +1 -1
- package/build/lib/helpers.js +54 -49
- package/build/lib/logcat.js +4 -4
- package/build/lib/logger.js +3 -3
- package/build/lib/tools/aab-utils.js +157 -0
- package/build/lib/tools/adb-commands.js +11 -11
- package/build/lib/tools/adb-emu-commands.js +7 -7
- package/build/lib/tools/android-manifest.js +13 -13
- package/build/lib/tools/apk-signing.js +27 -22
- package/build/lib/tools/apk-utils.js +13 -13
- package/build/lib/tools/apks-utils.js +13 -14
- package/build/lib/tools/index.js +5 -3
- package/build/lib/tools/lockmgmt.js +3 -3
- package/build/lib/tools/settings-client-commands.js +7 -7
- package/build/lib/tools/system-calls.js +27 -27
- package/lib/helpers.js +1 -1
- package/lib/logcat.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/tools/aab-utils.js +158 -0
- package/lib/tools/adb-commands.js +1 -1
- package/lib/tools/adb-emu-commands.js +1 -1
- package/lib/tools/android-manifest.js +1 -1
- package/lib/tools/apk-signing.js +4 -4
- package/lib/tools/apk-utils.js +6 -7
- package/lib/tools/apks-utils.js +6 -6
- package/lib/tools/index.js +2 -0
- package/lib/tools/lockmgmt.js +1 -1
- package/lib/tools/settings-client-commands.js +1 -1
- package/lib/tools/system-calls.js +1 -1
- package/package.json +12 -8
- package/lib/.DS_Store +0 -0
|
@@ -21,7 +21,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
21
21
|
|
|
22
22
|
var _asyncbox = require("asyncbox");
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _support = require("@appium/support");
|
|
25
25
|
|
|
26
26
|
var _semver = _interopRequireDefault(require("semver"));
|
|
27
27
|
|
|
@@ -31,7 +31,7 @@ var _lruCache = _interopRequireDefault(require("lru-cache"));
|
|
|
31
31
|
|
|
32
32
|
var _adbkitApkreader = _interopRequireDefault(require("adbkit-apkreader"));
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
const apkUtilsMethods = {};
|
|
35
35
|
const ACTIVITIES_TROUBLESHOOTING_LINK = 'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md';
|
|
36
36
|
apkUtilsMethods.APP_INSTALL_STATE = {
|
|
37
37
|
UNKNOWN: 'unknown',
|
|
@@ -319,7 +319,7 @@ apkUtilsMethods.installFromDevicePath = async function installFromDevicePath(apk
|
|
|
319
319
|
};
|
|
320
320
|
|
|
321
321
|
apkUtilsMethods.cacheApk = async function cacheApk(apkPath, options = {}) {
|
|
322
|
-
const appHash = await
|
|
322
|
+
const appHash = await _support.fs.hash(apkPath);
|
|
323
323
|
|
|
324
324
|
const remotePath = _path.default.posix.join(REMOTE_CACHE_ROOT, `${appHash}.apk`);
|
|
325
325
|
|
|
@@ -366,15 +366,15 @@ apkUtilsMethods.cacheApk = async function cacheApk(apkPath, options = {}) {
|
|
|
366
366
|
} else {
|
|
367
367
|
_logger.default.info(`Caching the application at '${apkPath}' to '${remotePath}'`);
|
|
368
368
|
|
|
369
|
-
const timer = new
|
|
369
|
+
const timer = new _support.timing.Timer().start();
|
|
370
370
|
await this.push(apkPath, remotePath, {
|
|
371
371
|
timeout: options.timeout
|
|
372
372
|
});
|
|
373
373
|
const {
|
|
374
374
|
size
|
|
375
|
-
} = await
|
|
375
|
+
} = await _support.fs.stat(apkPath);
|
|
376
376
|
|
|
377
|
-
_logger.default.info(`The upload of '${_path.default.basename(apkPath)}' (${
|
|
377
|
+
_logger.default.info(`The upload of '${_path.default.basename(apkPath)}' (${_support.util.toReadableSizeString(size)}) ` + `took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
if (!this.remoteAppsCache) {
|
|
@@ -383,10 +383,10 @@ apkUtilsMethods.cacheApk = async function cacheApk(apkPath, options = {}) {
|
|
|
383
383
|
});
|
|
384
384
|
}
|
|
385
385
|
|
|
386
|
-
_lodash.default.difference(this.remoteAppsCache.keys(), remoteCachedFiles.map(toHash)).forEach(hash => this.remoteAppsCache.del(hash));
|
|
386
|
+
_lodash.default.difference([...this.remoteAppsCache.keys()], remoteCachedFiles.map(toHash)).forEach(hash => this.remoteAppsCache.del(hash));
|
|
387
387
|
|
|
388
388
|
this.remoteAppsCache.set(appHash, remotePath);
|
|
389
|
-
const entriesToCleanup = remoteCachedFiles.map(x => _path.default.posix.join(REMOTE_CACHE_ROOT, x)).filter(x => !this.remoteAppsCache.has(toHash(x))).slice(this.remoteAppsCacheLimit - this.remoteAppsCache.keys().length);
|
|
389
|
+
const entriesToCleanup = remoteCachedFiles.map(x => _path.default.posix.join(REMOTE_CACHE_ROOT, x)).filter(x => !this.remoteAppsCache.has(toHash(x))).slice(this.remoteAppsCacheLimit - [...this.remoteAppsCache.keys()].length);
|
|
390
390
|
|
|
391
391
|
if (!_lodash.default.isEmpty(entriesToCleanup)) {
|
|
392
392
|
try {
|
|
@@ -482,7 +482,7 @@ apkUtilsMethods.install = async function install(appPath, options = {}) {
|
|
|
482
482
|
}
|
|
483
483
|
|
|
484
484
|
try {
|
|
485
|
-
const timer = new
|
|
485
|
+
const timer = new _support.timing.Timer().start();
|
|
486
486
|
const output = await performAppInstall();
|
|
487
487
|
|
|
488
488
|
_logger.default.info(`The installation of '${_path.default.basename(appPath)}' took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
@@ -732,8 +732,8 @@ apkUtilsMethods.extractStringsFromApk = async function extractStringsFromApk(app
|
|
|
732
732
|
|
|
733
733
|
const localPath = _path.default.resolve(out, 'strings.json');
|
|
734
734
|
|
|
735
|
-
await (0,
|
|
736
|
-
await
|
|
735
|
+
await (0, _support.mkdirp)(out);
|
|
736
|
+
await _support.fs.writeFile(localPath, JSON.stringify(apkStrings, null, 2), 'utf-8');
|
|
737
737
|
return {
|
|
738
738
|
apkStrings,
|
|
739
739
|
localPath
|
|
@@ -890,7 +890,7 @@ apkUtilsMethods.setDeviceLanguageCountry = async function setDeviceLanguageCount
|
|
|
890
890
|
};
|
|
891
891
|
|
|
892
892
|
apkUtilsMethods.getApkInfo = async function getApkInfo(appPath) {
|
|
893
|
-
if (!(await
|
|
893
|
+
if (!(await _support.fs.exists(appPath))) {
|
|
894
894
|
throw new Error(`The file at path ${appPath} does not exist or is not accessible`);
|
|
895
895
|
}
|
|
896
896
|
|
|
@@ -963,4 +963,4 @@ var _default = apkUtilsMethods;
|
|
|
963
963
|
exports.default = _default;require('source-map-support').install();
|
|
964
964
|
|
|
965
965
|
|
|
966
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstdXRpbHMuanMiXSwibmFtZXMiOlsiYXBrVXRpbHNNZXRob2RzIiwiQUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOSyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiVU5LTk9XTiIsIk5PVF9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlJFTU9URV9DQUNIRV9ST09UIiwiaXNBcHBJbnN0YWxsZWQiLCJwa2ciLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxlZFBhdHRlcm4iLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwic3Rkb3V0Iiwic2hlbGwiLCJpc0luc3RhbGxlZCIsInRlc3QiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhcnRVcmkiLCJ1cmkiLCJvcHRzIiwid2FpdEZvckxhdW5jaCIsImFyZ3MiLCJwdXNoIiwicmVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInN0YXJ0QXBwIiwic3RhcnRBcHBPcHRpb25zIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjbG9uZSIsInJlcGxhY2UiLCJkZWZhdWx0cyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXRyeSIsInN0b3BBcHAiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiY21kIiwiaW50ZW50TmFtZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic2hlbGxPcHRzIiwiaXNJbnRlZ2VyIiwid2FpdER1cmF0aW9uIiwidGltZW91dCIsInN0YXJ0c1dpdGgiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJhcHBEZXNjcmlwdG9yIiwiZHVtcFdpbmRvd3MiLCJkdW1wc3lzQXJnIiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIm51bGxGb2N1c2VkQXBwUmUiLCJmb2N1c2VkQXBwUmUiLCJudWxsQ3VycmVudEZvY3VzUmUiLCJjdXJyZW50Rm9jdXNBcHBSZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJhcHBQYWNrYWdlIiwidHJpbSIsImFwcEFjdGl2aXR5Iiwid2FpdEZvckFjdGl2aXR5T3JOb3QiLCJ3YWl0Rm9yU3RvcCIsIndhaXRNcyIsInNwbGl0TmFtZXMiLCJuYW1lcyIsInNwbGl0IiwibWFwIiwibmFtZSIsImFsbFBhY2thZ2VzIiwiYWxsQWN0aXZpdGllcyIsInBvc3NpYmxlQWN0aXZpdHlOYW1lcyIsIm9uZUFjdGl2aXR5IiwiY3VycmVudFBrZyIsImpvaW4iLCJwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMiLCJhY3ROYW1lIiwiY29uZGl0aW9uRnVuYyIsImZ1bGx5UXVhbGlmaWVkQWN0aXZpdHkiLCJpc0FjdGl2aXR5Rm91bmQiLCJzb21lIiwicCIsInBhcnNlSW50IiwiaW50ZXJ2YWxNcyIsImFjdCIsIndhaXRGb3JOb3RBY3Rpdml0eSIsInVuaW5zdGFsbEFwayIsIm9wdGlvbnMiLCJpbmZvIiwia2VlcERhdGEiLCJmb3JjZVN0b3AiLCJhZGJFeGVjIiwiaW5zdGFsbEZyb21EZXZpY2VQYXRoIiwiYXBrUGF0aE9uRGV2aWNlIiwiaW5kZXhPZiIsImNhY2hlQXBrIiwiYXBrUGF0aCIsImFwcEhhc2giLCJmcyIsImhhc2giLCJyZW1vdGVQYXRoIiwicGF0aCIsInBvc2l4IiwicmVtb3RlQ2FjaGVkRmlsZXMiLCJlcnJvck1hcmtlciIsImxzT3V0cHV0IiwiX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkIiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJzdWJzdHJpbmciLCJ4IiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsInRvSGFzaCIsInBhcnNlIiwiY2F0Y2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJzaXplIiwic3RhdCIsImJhc2VuYW1lIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJyZW1vdGVBcHBzQ2FjaGUiLCJMUlUiLCJtYXgiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImRpZmZlcmVuY2UiLCJrZXlzIiwiZm9yRWFjaCIsImRlbCIsInNldCIsImVudHJpZXNUb0NsZWFudXAiLCJoYXMiLCJzbGljZSIsImlzRW1wdHkiLCJ3YXJuIiwiaW5zdGFsbCIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwiaW5zdGFsbEFwa3MiLCJjbG9uZURlZXAiLCJhZGJFeGVjVGltZW91dCIsIkRFRkFVTFRfQURCX0VYRUNfVElNRU9VVCIsIkFQS19JTlNUQUxMX1RJTUVPVVQiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcmdzIiwibm9JbmNyZW1lbnRhbCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiaW5zdGFsbE9wdHMiLCJpbnN0YWxsQ21kIiwicGVyZm9ybUFwcEluc3RhbGwiLCJzaG91bGRDYWNoZUFwcCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwiY2xlYXJDYWNoZSIsImNhY2hlQXBwIiwiY2FjaGVkQXBwUGF0aCIsInBtSW5zdGFsbENtZEJ5UmVtb3RlUGF0aCIsIm91dHB1dCIsIm5ld0NhY2hlZEFwcFBhdGgiLCJ0cnVuY2F0ZWRPdXRwdXQiLCJzdWJzdHIiLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwibXNnIiwiZXJyIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJhcGtJbmZvIiwiZ2V0QXBrSW5mbyIsInZlcnNpb25Db2RlIiwicGtnVmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsInBrZ1ZlcnNpb25OYW1lU3RyIiwiZ2V0UGFja2FnZUluZm8iLCJwa2dWZXJzaW9uTmFtZSIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiYXBrVmVyc2lvbkNvZGUiLCJhcGtWZXJzaW9uTmFtZVN0ciIsImFwa1ZlcnNpb25OYW1lIiwic2F0aXNmaWVzIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwidW5pbnN0YWxsUGFja2FnZSIsIk9iamVjdCIsImFzc2lnbiIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsImxhbmd1YWdlIiwib3V0Iiwib3JpZ2luYWxBcHBQYXRoIiwiZXh0cmFjdExhbmd1YWdlQXBrIiwiYXBrU3RyaW5ncyIsImNvbmZpZ01hcmtlciIsImluaXRBYXB0IiwiYmluYXJpZXMiLCJhYXB0IiwidW5pcSIsIm9zIiwiRU9MIiwic3RkZXJyIiwiaW5pdEFhcHQyIiwiYWFwdDIiLCJsb2NhbFBhdGgiLCJyZXNvbHZlIiwid3JpdGVGaWxlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERldmljZUxhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VMb2NhbGUiLCJnZXREZXZpY2VDb3VudHJ5IiwiY291bnRyeSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImxvY2FsZSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJzZXREZXZpY2VMb2NhbGUiLCJ2YWxpZGF0ZUxvY2FsZSIsInNwbGl0X2xvY2FsZSIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJzY3JpcHQiLCJoYXNMYW5ndWFnZSIsImhhc0NvdW50cnkiLCJjdXJMYW5ndWFnZSIsImN1ckNvdW50cnkiLCJjdXJMb2NhbGUiLCJsb2NhbGVDb2RlIiwiZXJyb3IiLCJyZWNvbm5lY3QiLCJpZ24iLCJyZXN0YXJ0QWRiIiwidG9VcHBlckNhc2UiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwiZXhpc3RzIiwiZXh0cmFjdEJhc2VBcGsiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwibWFuaWZlc3QiLCJyZWFkTWFuaWZlc3QiLCJyZXN1bHQiLCJ2ZXJzaW9uTmFtZU1hdGNoIiwidmVyc2lvbkNv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LG1CQUFYLEVBQWdDbUQsSUFBaEMsQ0FBcUNoRCxNQUFyQyxDQUF6Qjs7QUFDQSxRQUFJcVAsZ0JBQUosRUFBc0I7QUFDcEJGLE1BQUFBLE1BQU0sQ0FBQzdFLFdBQVAsR0FBcUI3RixRQUFRLENBQUM0SyxnQkFBZ0IsQ0FBQyxDQUFELENBQWpCLEVBQXNCLEVBQXRCLENBQTdCO0FBQ0Q7O0FBQ0QsV0FBT0YsTUFBUDtBQUNELEdBWEQsQ0FXRSxPQUFPakYsR0FBUCxFQUFZO0FBQ1p4SyxvQkFBSTJJLElBQUosQ0FBVSxVQUFTNkIsR0FBRyxDQUFDNUosT0FBUSw4QkFBL0I7QUFDRDs7QUFDRCxTQUFPNk8sTUFBUDtBQUNELENBbEJEOztBQW9CQXBRLGVBQWUsQ0FBQ3VRLE9BQWhCLEdBQTBCLGVBQWVBLE9BQWYsQ0FBd0I3UCxHQUF4QixFQUE2QjhQLE1BQTdCLEVBQXFDO0FBQzdELFFBQU1DLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBS3RLLE9BQUwsQ0FBYSxDQUFDLE9BQUQsRUFBVSxJQUFWLEVBQWdCLE1BQWhCLEVBQXdCekYsR0FBeEIsQ0FBYixDQUFQLEVBQW1ENEIsT0FBbkQsQ0FBMkQsVUFBM0QsRUFBdUUsRUFBdkUsQ0FBaEI7O0FBQ0EsUUFBTW9PLE1BQU0sR0FBRzdKLGNBQUsrRyxPQUFMLENBQWE0QyxNQUFiLEVBQXNCLEdBQUU5UCxHQUFJLE1BQTVCLENBQWY7O0FBQ0EsUUFBTSxLQUFLaVEsSUFBTCxDQUFVRixPQUFWLEVBQW1CQyxNQUFuQixDQUFOOztBQUNBL1Asa0JBQUlDLEtBQUosQ0FBVywyQkFBMEJGLEdBQUksU0FBUWdRLE1BQU8sR0FBeEQ7O0FBQ0EsU0FBT0EsTUFBUDtBQUNELENBTkQ7O2VBU2UxUSxlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYnVpbGRTdGFydENtZCwgQVBLU19FWFRFTlNJT04sIGJ1aWxkSW5zdGFsbEFyZ3MsXG4gIEFQS19JTlNUQUxMX1RJTUVPVVQsIERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCxcbiAgcGFyc2VNYW5pZmVzdCwgcGFyc2VBYXB0U3RyaW5ncywgcGFyc2VBYXB0MlN0cmluZ3MsIGZvcm1hdENvbmZpZ01hcmtlcixcbiAgZXNjYXBlU2hlbGxBcmcsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG1rZGlycCwgdGltaW5nIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBBcGtSZWFkZXIgZnJvbSAnYWRia2l0LWFwa3JlYWRlcic7XG5cblxubGV0IGFwa1V0aWxzTWV0aG9kcyA9IHt9O1xuXG5jb25zdCBBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LID1cbiAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vd3JpdGluZy1ydW5uaW5nLWFwcGl1bS9hbmRyb2lkL2FjdGl2aXR5LXN0YXJ0dXAubWQnO1xuYXBrVXRpbHNNZXRob2RzLkFQUF9JTlNUQUxMX1NUQVRFID0ge1xuICBVTktOT1dOOiAndW5rbm93bicsXG4gIE5PVF9JTlNUQUxMRUQ6ICdub3RJbnN0YWxsZWQnLFxuICBORVdFUl9WRVJTSU9OX0lOU1RBTExFRDogJ25ld2VyVmVyc2lvbkluc3RhbGxlZCcsXG4gIFNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ6ICdzYW1lVmVyc2lvbkluc3RhbGxlZCcsXG4gIE9MREVSX1ZFUlNJT05fSU5TVEFMTEVEOiAnb2xkZXJWZXJzaW9uSW5zdGFsbGVkJyxcbn07XG5jb25zdCBSRU1PVEVfQ0FDSEVfUk9PVCA9ICcvZGF0YS9sb2NhbC90bXAvYXBwaXVtX2NhY2hlJztcblxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHBhcnRpY3VsYXIgcGFja2FnZSBpcyBwcmVzZW50IG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZGV0ZWN0aW5nIGFwcGxpY2F0aW9uIHN0YXRlXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChwa2cpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIGluc3RhbGwgc3RhdHVzIGZvciAke3BrZ31gKTtcbiAgY29uc3QgaW5zdGFsbGVkUGF0dGVybiA9IG5ldyBSZWdFeHAoYF5cXFxccypQYWNrYWdlXFxcXHMrXFxcXFske18uZXNjYXBlUmVnRXhwKHBrZyl9XFxcXF1bXjpdKzokYCwgJ20nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgaXNJbnN0YWxsZWQgPSBpbnN0YWxsZWRQYXR0ZXJuLnRlc3Qoc3Rkb3V0KTtcbiAgICBsb2cuZGVidWcoYCcke3BrZ30nIGlzJHshaXNJbnN0YWxsZWQgPyAnIG5vdCcgOiAnJ30gaW5zdGFsbGVkYCk7XG4gICAgcmV0dXJuIGlzSW5zdGFsbGVkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaW5kaW5nIGlmICcke3BrZ30nIGlzIGluc3RhbGxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0VXJpT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gd2FpdEZvckxhdW5jaCBbdHJ1ZV0gLSBpZiBgZmFsc2VgIHRoZW4gYWRiIHdvbid0IHdhaXRcbiAqIGZvciB0aGUgc3RhcnRlZCBhY3Rpdml0eSB0byByZXR1cm4gdGhlIGNvbnRyb2xcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBwYXJ0aWN1bGFyIFVSSSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVyaSAtIFRoZSBuYW1lIG9mIFVSSSB0byBzdGFydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBzdGFydCB0aGUgVVJJIHdpdGguXG4gKiBAcGFyYW0ge1N0YXJ0VXJpT3B0aW9uc30gb3B0c1xuICovXG5hcGtVdGlsc01ldGhvZHMuc3RhcnRVcmkgPSBhc3luYyBmdW5jdGlvbiBzdGFydFVyaSAodXJpLCBwa2csIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2FpdEZvckxhdW5jaCA9IHRydWUsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghdXJpIHx8ICFwa2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VSSSBhbmQgcGFja2FnZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCBhcmdzID0gWydhbScsICdzdGFydCddO1xuICBpZiAod2FpdEZvckxhdW5jaCkge1xuICAgIGFyZ3MucHVzaCgnLVcnKTtcbiAgfVxuICBhcmdzLnB1c2goJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXJyxcbiAgICAnLWQnLCBlc2NhcGVTaGVsbEFyZyh1cmkpLFxuICAgIHBrZyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xuICAgIGlmIChyZXMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndW5hYmxlIHRvIHJlc29sdmUgaW50ZW50JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgYXR0ZW1wdGluZyB0byBzdGFydCBVUkkuIE9yaWdpbmFsIGVycm9yOiAke2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYXBwbGljYXRpb24gYWN0aXZpdHkuXG4gKiBUaGlzIG9yIGFjdGlvbiBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBhcHAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGFjdGlvbiAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgYWN0aW9uIHRoYXQgd2lsbCBsYXVuY2ggdGhlIHJlcXVpcmVkIGFwcC5cbiAqIFRoaXMgb3IgYWN0aXZpdHkgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBsYXVuY2ggYW4gYXBwLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gcmV0cnkgW3RydWVdIC0gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgXG4gKiBhbmQgdGhlIGFjdGl2aXR5IG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAnLicgdGhlbiB0aGUgbWV0aG9kXG4gKiB3aWxsIHRyeSB0byBhZGQgdGhlIG1pc3NpbmcgZG90IGFuZCBzdGFydCB0aGUgYWN0aXZpdHkgb25jZSBtb3JlXG4gKiBpZiB0aGUgZmlyc3Qgc3RhcnR1cCB0cnkgZmFpbHMuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBzdG9wQXBwIFt0cnVlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZm9yY2VmdWxseVxuICogc3RvcCB0aGUgYWN0aXZpdHkgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB3YWl0UGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCB0byBvblxuICogc3RhcnR1cCAodGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoaXMgbmFtZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lLCB3aGljaCBpcyBzZXQgYXMgYHBrZ2ApXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdhaXRBY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBhY3Rpdml0eSB0byB3YWl0IHRvIG9uXG4gKiBzdGFydHVwICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhpcyBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUsIHdoaWNoIGlzIHNldCBhcyBgYWN0aXZpdHlgKVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3YWl0RHVyYXRpb24gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogYHdhaXRBY3Rpdml0eWAgaXMgZm9jdXNlZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdXNlciAtIFRoZSBudW1iZXIgb2YgdGhlIHVzZXIgcHJvZmlsZSB0byBzdGFydFxuICogdGhlIGdpdmVuIGFjdGl2aXR5IHdpdGguIFRoZSBkZWZhdWx0IE9TIHVzZXIgcHJvZmlsZSAodXN1YWxseSB6ZXJvKSBpcyB1c2VkXG4gKiB3aGVuIHRoaXMgcHJvcGVydHkgaXMgdW5zZXRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgcGFydGljdWxhciBwYWNrYWdlL2FjdGl2aXR5IG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0QXBwT3B0aW9uc30gc3RhcnRBcHBPcHRpb25zIFt7fV0gLSBTdGFydHVwIG9wdGlvbnMgbWFwcGluZy5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGFjdGl2aXR5XG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5zdGFydEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QXBwIChzdGFydEFwcE9wdGlvbnMgPSB7fSkge1xuICBpZiAoIXN0YXJ0QXBwT3B0aW9ucy5wa2cgfHwgIShzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkgfHwgc3RhcnRBcHBPcHRpb25zLmFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BrZywgYW5kIGFjdGl2aXR5IG9yIGludGVudCBhY3Rpb24sIGFyZSByZXF1aXJlZCB0byBzdGFydCBhbiBhcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgc3RhcnRBcHBPcHRpb25zID0gXy5jbG9uZShzdGFydEFwcE9wdGlvbnMpO1xuICBpZiAoc3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5KSB7XG4gICAgc3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5ID0gc3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5LnJlcGxhY2UoJyQnLCAnXFxcXCQnKTtcbiAgfVxuICAvLyBpbml0aWFsaXppbmcgZGVmYXVsdHNcbiAgXy5kZWZhdWx0cyhzdGFydEFwcE9wdGlvbnMsIHtcbiAgICB3YWl0UGtnOiBzdGFydEFwcE9wdGlvbnMucGtnLFxuICAgIHdhaXRGb3JMYXVuY2g6IHRydWUsXG4gICAgd2FpdEFjdGl2aXR5OiBmYWxzZSxcbiAgICByZXRyeTogdHJ1ZSxcbiAgICBzdG9wQXBwOiB0cnVlXG4gIH0pO1xuICAvLyBwcmV2ZW50aW5nIG51bGwgd2FpdHBrZ1xuICBzdGFydEFwcE9wdGlvbnMud2FpdFBrZyA9IHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnIHx8IHN0YXJ0QXBwT3B0aW9ucy5wa2c7XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGNtZCA9IGJ1aWxkU3RhcnRDbWQoc3RhcnRBcHBPcHRpb25zLCBhcGlMZXZlbCk7XG4gIGNvbnN0IGludGVudE5hbWUgPSBgJHtzdGFydEFwcE9wdGlvbnMuYWN0aW9ufSR7c3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzID8gJyAnICsgc3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIDogJyd9YDtcbiAgdHJ5IHtcbiAgICBjb25zdCBzaGVsbE9wdHMgPSB7fTtcbiAgICBpZiAoXy5pc0ludGVnZXIoc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbikgJiYgc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbiA+PSAwKSB7XG4gICAgICBzaGVsbE9wdHMudGltZW91dCA9IHN0YXJ0QXBwT3B0aW9ucy53YWl0RHVyYXRpb247XG4gICAgfVxuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoY21kLCBzaGVsbE9wdHMpO1xuICAgIGlmIChzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBBY3Rpdml0eSBjbGFzcycpICYmIHN0ZG91dC5pbmNsdWRlcygnZG9lcyBub3QgZXhpc3QnKSkge1xuICAgICAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5yZXRyeSAmJiAhc3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICBsb2cuZGVidWcoYFdlIHRyaWVkIHRvIHN0YXJ0IGFuIGFjdGl2aXR5IHRoYXQgZG9lc24ndCBleGlzdCwgYCArXG4gICAgICAgICAgICAgICAgICBgcmV0cnlpbmcgd2l0aCAnLiR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fScgYWN0aXZpdHkgbmFtZWApO1xuICAgICAgICBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkgPSBgLiR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fWA7XG4gICAgICAgIHN0YXJ0QXBwT3B0aW9ucy5yZXRyeSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydEFwcChzdGFydEFwcE9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpdml0eSBuYW1lICcke3N0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eX0nIHVzZWQgdG8gc3RhcnQgdGhlIGFwcCBkb2Vzbid0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBleGlzdCBvciBjYW5ub3QgYmUgbGF1bmNoZWQhIE1ha2Ugc3VyZSBpdCBleGlzdHMgYW5kIGlzIGEgbGF1bmNoYWJsZSBhY3Rpdml0eWApO1xuICAgIH0gZWxzZSBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdFcnJvcjogSW50ZW50IGRvZXMgbm90IG1hdGNoIGFueSBhY3Rpdml0aWVzJykgfHwgc3Rkb3V0LmluY2x1ZGVzKCdFcnJvcjogQWN0aXZpdHkgbm90IHN0YXJ0ZWQsIHVuYWJsZSB0byByZXNvbHZlIEludGVudCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5IGZvciBpbnRlbnQgJyR7aW50ZW50TmFtZX0nIHVzZWQgdG8gc3RhcnQgdGhlIGFwcCBkb2Vzbid0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBleGlzdCBvciBjYW5ub3QgYmUgbGF1bmNoZWQhIE1ha2Ugc3VyZSBpdCBleGlzdHMgYW5kIGlzIGEgbGF1bmNoYWJsZSBhY3Rpdml0eWApO1xuICAgIH0gZWxzZSBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24nKSkge1xuICAgICAgLy8gaWYgdGhlIGFwcCBpcyBkaXNhYmxlZCBvbiBhIHJlYWwgZGV2aWNlIGl0IHdpbGwgdGhyb3cgYSBzZWN1cml0eSBleGNlcHRpb25cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBlcm1pc3Npb24gdG8gc3RhcnQgJyR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fScgYWN0aXZpdHkgaGFzIGJlZW4gZGVuaWVkLmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIGFjdGl2aXR5L3BhY2thZ2UgbmFtZXMgYXJlIGNvcnJlY3QuYCk7XG4gICAgfVxuICAgIGlmIChzdGFydEFwcE9wdGlvbnMud2FpdEFjdGl2aXR5KSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JBY3Rpdml0eShzdGFydEFwcE9wdGlvbnMud2FpdFBrZywgc3RhcnRBcHBPcHRpb25zLndhaXRBY3Rpdml0eSwgc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBhcHBEZXNjcmlwdG9yID0gc3RhcnRBcHBPcHRpb25zLnBrZyB8fCBpbnRlbnROYW1lO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0IHRoZSAnJHthcHBEZXNjcmlwdG9yfScgYXBwbGljYXRpb24uIGAgK1xuICAgICAgYFZpc2l0ICR7QUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOS30gZm9yIHRyb3VibGVzaG9vdGluZy4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgdG8gY2FsbCBgYWRiIGR1bXBzeXMgd2luZG93IHdpbmRvd3MvZGlzcGxheXNgXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5kdW1wV2luZG93cyA9IGFzeW5jIGZ1bmN0aW9uIGR1bXBXaW5kb3dzICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgLy8gV2l0aCB2ZXJzaW9uIDI5LCBBbmRyb2lkIGNoYW5nZWQgdGhlIGR1bXBzeXMgc3ludGF4XG4gIGNvbnN0IGR1bXBzeXNBcmcgPSBhcGlMZXZlbCA+PSAyOSA/ICdkaXNwbGF5cycgOiAnd2luZG93cyc7XG4gIGNvbnN0IGNtZCA9IFsnZHVtcHN5cycsICd3aW5kb3cnLCBkdW1wc3lzQXJnXTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWNrYWdlQWN0aXZpdHlJbmZvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGFwcFBhY2thZ2UgLSBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgJ2NvbS5hY21lLmFwcCcuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGFwcEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgbWFpbiBhcHBsaWNhdGlvbiBhY3Rpdml0eS5cbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiBjdXJyZW50bHkgZm9jdXNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eS5cbiAqXG4gKiBAcmV0dXJuIHtQYWNrYWdlQWN0aXZpdHlJbmZvfSBUaGUgbWFwcGluZywgd2hlcmUgcHJvcGVydHkgbmFtZXMgYXJlICdhcHBQYWNrYWdlJyBhbmQgJ2FwcEFjdGl2aXR5Jy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBkYXRhLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgZm9jdXNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eScpO1xuICBjb25zdCBudWxsRm9jdXNlZEFwcFJlID0gbmV3IFJlZ0V4cCgvXlxccyptRm9jdXNlZEFwcD1udWxsLywgJ20nKTtcbiAgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci94Wjh2RjcvMVxuICBjb25zdCBmb2N1c2VkQXBwUmUgPSBuZXcgUmVnRXhwKCdeXFxcXHMqbUZvY3VzZWRBcHAuK1JlY29yZFxcXFx7LipcXFxccyhbXlxcXFxzXFxcXC9cXFxcfV0rKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXFxcLyhbXlxcXFxzXFxcXC9cXFxcfVxcXFwsXSspXFxcXCw/KFxcXFxzW15cXFxcc1xcXFwvXFxcXH1dKykqXFxcXH0nLCAnbScpO1xuICBjb25zdCBudWxsQ3VycmVudEZvY3VzUmUgPSBuZXcgUmVnRXhwKC9eXFxzKm1DdXJyZW50Rm9jdXM9bnVsbC8sICdtJyk7XG4gIGNvbnN0IGN1cnJlbnRGb2N1c0FwcFJlID0gbmV3IFJlZ0V4cCgnXlxcXFxzKm1DdXJyZW50Rm9jdXMuK1xcXFx7LitcXFxccyhbXlxcXFxzXFxcXC9dKylcXFxcLyhbXlxcXFxzXSspXFxcXGInLCAnbScpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5kdW1wV2luZG93cygpO1xuICAgIC8vIFRoZSBvcmRlciBtYXR0ZXJzIGhlcmVcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgW2ZvY3VzZWRBcHBSZSwgY3VycmVudEZvY3VzQXBwUmVdKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHBhdHRlcm4uZXhlYyhzdGRvdXQpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwUGFja2FnZTogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICAgIGFwcEFjdGl2aXR5OiBtYXRjaFsyXS50cmltKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgW251bGxGb2N1c2VkQXBwUmUsIG51bGxDdXJyZW50Rm9jdXNSZV0pIHtcbiAgICAgIGlmIChwYXR0ZXJuLmV4ZWMoc3Rkb3V0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFwcFBhY2thZ2U6IG51bGwsXG4gICAgICAgICAgYXBwQWN0aXZpdHk6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBhY3Rpdml0eSBmcm9tIGR1bXBzeXMnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCBmb2N1c1BhY2thZ2VBbmRBY3Rpdml0eS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSB0byBiZSBmb2N1c2VkL25vbi1mb2N1c2VkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBhY3Rpdml0eSwgYmVsb25naW5nIHRvIHRoYXQgcGFja2FnZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtib29sZWFufSB3YWl0Rm9yU3RvcCAtIFdoZXRoZXIgdG8gd2FpdCB1bnRpbCB0aGUgYWN0aXZpdHkgaXMgZm9jdXNlZCAodHJ1ZSlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpcyBub3QgZm9jdXNlZCAoZmFsc2UpLlxuICogQHBhcmFtIHtudW1iZXJ9IHdhaXRNcyBbMjAwMDBdIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSB0aW1lb3V0IG9jY3Vycy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aW1lb3V0IGhhcHBlbnMuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy53YWl0Rm9yQWN0aXZpdHlPck5vdCA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBY3Rpdml0eU9yTm90IChwa2csIGFjdGl2aXR5LCB3YWl0Rm9yU3RvcCwgd2FpdE1zID0gMjAwMDApIHtcbiAgaWYgKCFwa2cgfHwgIWFjdGl2aXR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGFuZCBhY3Rpdml0eSByZXF1aXJlZC4nKTtcbiAgfVxuICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt3YWl0TXN9bXMgZm9yIGFjdGl2aXR5IG1hdGNoaW5nIHBrZzogJyR7cGtnfScgYW5kIGAgK1xuICAgICAgICAgICAgYGFjdGl2aXR5OiAnJHthY3Rpdml0eX0nIHRvJHt3YWl0Rm9yU3RvcCA/ICcgbm90JyA6ICcnfSBiZSBmb2N1c2VkYCk7XG5cbiAgY29uc3Qgc3BsaXROYW1lcyA9IChuYW1lcykgPT4gbmFtZXMuc3BsaXQoJywnKS5tYXAoKG5hbWUpID0+IG5hbWUudHJpbSgpKTtcbiAgY29uc3QgYWxsUGFja2FnZXMgPSBzcGxpdE5hbWVzKHBrZyk7XG4gIGNvbnN0IGFsbEFjdGl2aXRpZXMgPSBzcGxpdE5hbWVzKGFjdGl2aXR5KTtcblxuICBjb25zdCBwb3NzaWJsZUFjdGl2aXR5TmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBvbmVBY3Rpdml0eSBvZiBhbGxBY3Rpdml0aWVzKSB7XG4gICAgaWYgKG9uZUFjdGl2aXR5LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgaWYgYWN0aXZpdHkgaXMgbm90IGZ1bGwgcXVhbGlmaWVkXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRQa2cgb2YgYWxsUGFja2FnZXMpIHtcbiAgICAgICAgcG9zc2libGVBY3Rpdml0eU5hbWVzLnB1c2goYCR7Y3VycmVudFBrZ30ke29uZUFjdGl2aXR5fWAucmVwbGFjZSgvXFwuKy9nLCAnLicpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWNjZXB0IGZ1bGx5IHF1YWxpZmllZCBhY3Rpdml0eSBuYW1lLlxuICAgICAgcG9zc2libGVBY3Rpdml0eU5hbWVzLnB1c2gob25lQWN0aXZpdHkpO1xuICAgICAgcG9zc2libGVBY3Rpdml0eU5hbWVzLnB1c2goYCR7cGtnfS4ke29uZUFjdGl2aXR5fWApO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoYFBvc3NpYmxlIGFjdGl2aXRpZXMsIHRvIGJlIGNoZWNrZWQ6ICR7cG9zc2libGVBY3Rpdml0eU5hbWVzLm1hcCgobmFtZSkgPT4gYCcke25hbWV9J2ApLmpvaW4oJywgJyl9YCk7XG5cbiAgY29uc3QgcG9zc2libGVBY3Rpdml0eVBhdHRlcm5zID0gcG9zc2libGVBY3Rpdml0eU5hbWVzLm1hcChcbiAgICAoYWN0TmFtZSkgPT4gbmV3IFJlZ0V4cChgXiR7YWN0TmFtZS5yZXBsYWNlKC9cXC4vZywgJ1xcXFwuJykucmVwbGFjZSgvXFwqL2csICcuKj8nKS5yZXBsYWNlKC9cXCQvZywgJ1xcXFwkJyl9JGApXG4gICk7XG5cbiAgY29uc3QgY29uZGl0aW9uRnVuYyA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYXBwUGFja2FnZTtcbiAgICBsZXQgYXBwQWN0aXZpdHk7XG4gICAgdHJ5IHtcbiAgICAgICh7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXBwQWN0aXZpdHkgJiYgYXBwUGFja2FnZSkge1xuICAgICAgY29uc3QgZnVsbHlRdWFsaWZpZWRBY3Rpdml0eSA9IGFwcEFjdGl2aXR5LnN0YXJ0c1dpdGgoJy4nKSA/IGAke2FwcFBhY2thZ2V9JHthcHBBY3Rpdml0eX1gIDogYXBwQWN0aXZpdHk7XG4gICAgICBsb2cuZGVidWcoYEZvdW5kIHBhY2thZ2U6ICcke2FwcFBhY2thZ2V9JyBhbmQgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUgOiAnJHtmdWxseVF1YWxpZmllZEFjdGl2aXR5fSdgKTtcbiAgICAgIGNvbnN0IGlzQWN0aXZpdHlGb3VuZCA9IF8uaW5jbHVkZXMoYWxsUGFja2FnZXMsIGFwcFBhY2thZ2UpXG4gICAgICAgICYmIHBvc3NpYmxlQWN0aXZpdHlQYXR0ZXJucy5zb21lKChwKSA9PiBwLnRlc3QoZnVsbHlRdWFsaWZpZWRBY3Rpdml0eSkpO1xuICAgICAgaWYgKCghd2FpdEZvclN0b3AgJiYgaXNBY3Rpdml0eUZvdW5kKSB8fCAod2FpdEZvclN0b3AgJiYgIWlzQWN0aXZpdHlGb3VuZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5kZWJ1ZygnSW5jb3JyZWN0IHBhY2thZ2UgYW5kIGFjdGl2aXR5LiBSZXRyeWluZy4nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGNvbmRpdGlvbkZ1bmMsIHtcbiAgICAgIHdhaXRNczogcGFyc2VJbnQod2FpdE1zLCAxMCksXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cG9zc2libGVBY3Rpdml0eU5hbWVzLm1hcCgobmFtZSkgPT4gYCcke25hbWV9J2ApLmpvaW4oJyBvciAnKX0gbmV2ZXIgJHt3YWl0Rm9yU3RvcCA/ICdzdG9wcGVkJyA6ICdzdGFydGVkJ30uIGAgK1xuICAgICAgYFZpc2l0ICR7QUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOS30gZm9yIHRyb3VibGVzaG9vdGluZ2ApO1xuICB9XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSB0byBiZSBmb2N1c2VkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LCBiZWxvbmdpbmcgdG8gdGhhdCBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdE1zIFsyMDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRpbWVvdXQgaGFwcGVucy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLndhaXRGb3JBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBY3Rpdml0eSAocGtnLCBhY3QsIHdhaXRNcyA9IDIwMDAwKSB7XG4gIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5T3JOb3QocGtnLCBhY3QsIGZhbHNlLCB3YWl0TXMpO1xufTtcblxuLyoqXG4gKiBXYWl0IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkgdG8gYmUgbm9uLWZvY3VzZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LCBiZWxvbmdpbmcgdG8gdGhhdCBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdE1zIFsyMDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRpbWVvdXQgaGFwcGVucy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLndhaXRGb3JOb3RBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JOb3RBY3Rpdml0eSAocGtnLCBhY3QsIHdhaXRNcyA9IDIwMDAwKSB7XG4gIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5T3JOb3QocGtnLCBhY3QsIHRydWUsIHdhaXRNcyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVuaW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFthZGJFeGVjVGltZW91dF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHVuaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBrZWVwRGF0YSBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8ga2VlcCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRhdGEgYW5kIGNhY2hlIGZvbGRlcnMgYWZ0ZXIgdW5pbnN0YWxsLlxuICovXG5cbi8qKlxuICogVW5pbnN0YWxsIHRoZSBnaXZlbiBwYWNrYWdlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSB1bmluc3RhbGxlZC5cbiAqIEBwYXJhbSB7P1VuaW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIHVuaW5zdGFsbCBvcHRpb25zLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFja2FnZSB3YXMgZm91bmQgb24gdGhlIGRldmljZSBhbmRcbiAqICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZC5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLnVuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIHVuaW5zdGFsbEFwayAocGtnLCBvcHRpb25zID0ge30pIHtcbiAgbG9nLmRlYnVnKGBVbmluc3RhbGxpbmcgJHtwa2d9YCk7XG4gIGlmICghYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChwa2cpKSB7XG4gICAgbG9nLmluZm8oYCR7cGtnfSB3YXMgbm90IHVuaW5zdGFsbGVkLCBiZWNhdXNlIGl0IHdhcyBub3QgcHJlc2VudCBvbiB0aGUgZGV2aWNlYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY21kID0gWyd1bmluc3RhbGwnXTtcbiAgaWYgKG9wdGlvbnMua2VlcERhdGEpIHtcbiAgICBjbWQucHVzaCgnLWsnKTtcbiAgfVxuICBjbWQucHVzaChwa2cpO1xuXG4gIGxldCBzdGRvdXQ7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5mb3JjZVN0b3AocGtnKTtcbiAgICBzdGRvdXQgPSAoYXdhaXQgdGhpcy5hZGJFeGVjKGNtZCwge3RpbWVvdXQ6IG9wdGlvbnMudGltZW91dH0pKS50cmltKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byB1bmluc3RhbGwgQVBLLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGAnYWRiICR7Y21kLmpvaW4oJyAnKX0nIGNvbW1hbmQgb3V0cHV0OiAke3N0ZG91dH1gKTtcbiAgaWYgKHN0ZG91dC5pbmNsdWRlcygnU3VjY2VzcycpKSB7XG4gICAgbG9nLmluZm8oYCR7cGtnfSB3YXMgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbG9nLmluZm8oYCR7cGtnfSB3YXMgbm90IHVuaW5zdGFsbGVkYCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgcGFja2FnZSBhZnRlciBpdCB3YXMgcHVzaGVkIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrUGF0aE9uRGV2aWNlIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgcGFja2FnZSBvbiB0aGUgZGV2aWNlIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgW3t9XSAtIEFkZGl0aW9uYWwgZXhlYyBvcHRpb25zLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3N9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHBhcmFtZXRlci5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIGR1cmluZyBhcHBsaWNhdGlvbiBpbnN0YWxsLlxuICovXG5hcGtVdGlsc01ldGhvZHMuaW5zdGFsbEZyb21EZXZpY2VQYXRoID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEZyb21EZXZpY2VQYXRoIChhcGtQYXRoT25EZXZpY2UsIG9wdHMgPSB7fSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2luc3RhbGwnLCAnLXInLCBhcGtQYXRoT25EZXZpY2VdLCBvcHRzKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdGYWlsdXJlJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdGUgaW5zdGFsbCBmYWlsZWQ6ICR7c3Rkb3V0fWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhY2hpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRpbWVvdXQgW2FkYkV4ZWNUaW1lb3V0XSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHVwbG9hZGVkIHRvIHRoZSByZW1vdGUgbG9jYXRpb24uXG4gKi9cblxuLyoqXG4gKiBDYWNoZXMgdGhlIGdpdmVuIEFQSyBhdCBhIHJlbW90ZSBsb2NhdGlvbiB0byBzcGVlZCB1cCBmdXJ0aGVyIEFQSyBkZXBsb3ltZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrUGF0aCAtIEZ1bGwgcGF0aCB0byB0aGUgYXBrIG9uIHRoZSBsb2NhbCBGU1xuICogQHBhcmFtIHs/Q2FjaGluZ09wdGlvbnN9IG9wdGlvbnMgLSBDYWNoaW5nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRnVsbCBwYXRoIHRvIHRoZSBjYWNoZWQgYXBrIG9uIHRoZSByZW1vdGUgZmlsZSBzeXN0ZW1cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGNhY2hpbmcgdGhlIGFwcFxuICovXG5hcGtVdGlsc01ldGhvZHMuY2FjaGVBcGsgPSBhc3luYyBmdW5jdGlvbiBjYWNoZUFwayAoYXBrUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGFwcEhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwa1BhdGgpO1xuICBjb25zdCByZW1vdGVQYXRoID0gcGF0aC5wb3NpeC5qb2luKFJFTU9URV9DQUNIRV9ST09ULCBgJHthcHBIYXNofS5hcGtgKTtcbiAgY29uc3QgcmVtb3RlQ2FjaGVkRmlsZXMgPSBbXTtcbiAgLy8gR2V0IGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHJlbW90ZSBjYWNoZSBvciBjcmVhdGUgaXQgZm9yIHRoZSBmaXJzdCB0aW1lXG4gIHRyeSB7XG4gICAgY29uc3QgZXJyb3JNYXJrZXIgPSAnX0VSUk9SXyc7XG4gICAgbGV0IGxzT3V0cHV0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPT09IHRydWUgfHwgIV8uaXNCb29sZWFuKHRoaXMuX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkKSkge1xuICAgICAgbHNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtgbHMgLXQgLTEgJHtSRU1PVEVfQ0FDSEVfUk9PVH0gMj4mMSB8fCBlY2hvICR7ZXJyb3JNYXJrZXJ9YF0pO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcobHNPdXRwdXQpIHx8IChsc091dHB1dC5pbmNsdWRlcyhlcnJvck1hcmtlcikgJiYgIWxzT3V0cHV0LmluY2x1ZGVzKFJFTU9URV9DQUNIRV9ST09UKSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQpKSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnVGhlIGN1cnJlbnQgQW5kcm9pZCBBUEkgZG9lcyBub3Qgc3VwcG9ydCBleHRlbmRlZCBscyBvcHRpb25zLiAnICtcbiAgICAgICAgICAnRGVmYXVsdGluZyB0byBuby1vcHRpb25zIGNhbGwnKTtcbiAgICAgIH1cbiAgICAgIGxzT3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbYGxzICR7UkVNT1RFX0NBQ0hFX1JPT1R9IDI+JjEgfHwgZWNobyAke2Vycm9yTWFya2VyfWBdKTtcbiAgICAgIHRoaXMuX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGxzT3V0cHV0LmluY2x1ZGVzKGVycm9yTWFya2VyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGxzT3V0cHV0LnN1YnN0cmluZygwLCBsc091dHB1dC5pbmRleE9mKGVycm9yTWFya2VyKSkpO1xuICAgIH1cbiAgICByZW1vdGVDYWNoZWRGaWxlcy5wdXNoKC4uLihcbiAgICAgIGxzT3V0cHV0LnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGBHb3QgYW4gZXJyb3IgJyR7ZS5tZXNzYWdlLnRyaW0oKX0nIHdoaWxlIGdldHRpbmcgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGNhY2hlLiBgICtcbiAgICAgIGBBc3N1bWluZyB0aGUgY2FjaGUgZG9lcyBub3QgZXhpc3QgeWV0YCk7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgUkVNT1RFX0NBQ0hFX1JPT1RdKTtcbiAgfVxuICBsb2cuZGVidWcoYFRoZSBjb3VudCBvZiBhcHBsaWNhdGlvbnMgaW4gdGhlIGNhY2hlOiAke3JlbW90ZUNhY2hlZEZpbGVzLmxlbmd0aH1gKTtcbiAgY29uc3QgdG9IYXNoID0gKHJlbW90ZVBhdGgpID0+IHBhdGgucG9zaXgucGFyc2UocmVtb3RlUGF0aCkubmFtZTtcbiAgLy8gUHVzaCB0aGUgYXBrIHRvIHRoZSByZW1vdGUgY2FjaGUgaWYgbmVlZGVkXG4gIGlmIChyZW1vdGVDYWNoZWRGaWxlcy5zb21lKCh4KSA9PiB0b0hhc2goeCkgPT09IGFwcEhhc2gpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHthcGtQYXRofScgaXMgYWxyZWFkeSBjYWNoZWQgdG8gJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgLy8gVXBkYXRlIHRoZSBhcHBsaWNhdGlvbiB0aW1lc3RhbXAgYXN5bmNocm9ub3VzbHkgaW4gb3JkZXIgdG8gYnVtcCBpdHMgcG9zaXRpb25cbiAgICAvLyBpbiB0aGUgc29ydGVkIGxzIG91dHB1dFxuICAgIHRoaXMuc2hlbGwoWyd0b3VjaCcsICctYW0nLCByZW1vdGVQYXRoXSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nLmluZm8oYENhY2hpbmcgdGhlIGFwcGxpY2F0aW9uIGF0ICcke2Fwa1BhdGh9JyB0byAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGF3YWl0IHRoaXMucHVzaChhcGtQYXRoLCByZW1vdGVQYXRoLCB7dGltZW91dDogb3B0aW9ucy50aW1lb3V0fSk7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChhcGtQYXRoKTtcbiAgICBsb2cuaW5mbyhgVGhlIHVwbG9hZCBvZiAnJHtwYXRoLmJhc2VuYW1lKGFwa1BhdGgpfScgKCR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX0pIGAgK1xuICAgICAgYHRvb2sgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgfVxuICBpZiAoIXRoaXMucmVtb3RlQXBwc0NhY2hlKSB7XG4gICAgdGhpcy5yZW1vdGVBcHBzQ2FjaGUgPSBuZXcgTFJVKHtcbiAgICAgIG1heDogdGhpcy5yZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICB9KTtcbiAgfVxuICAvLyBDbGVhbnVwIHRoZSBpbnZhbGlkIGVudHJpZXMgZnJvbSB0aGUgY2FjaGVcbiAgXy5kaWZmZXJlbmNlKHRoaXMucmVtb3RlQXBwc0NhY2hlLmtleXMoKSwgcmVtb3RlQ2FjaGVkRmlsZXMubWFwKHRvSGFzaCkpXG4gICAgLmZvckVhY2goKGhhc2gpID0+IHRoaXMucmVtb3RlQXBwc0NhY2hlLmRlbChoYXNoKSk7XG4gIC8vIEJ1bXAgdGhlIGNhY2hlIHJlY29yZCBmb3IgdGhlIHJlY2VudGx5IGNhY2hlZCBpdGVtXG4gIHRoaXMucmVtb3RlQXBwc0NhY2hlLnNldChhcHBIYXNoLCByZW1vdGVQYXRoKTtcbiAgLy8gSWYgdGhlIHJlbW90ZSBjYWNoZSBleGNlZWRzIHRoaXMucmVtb3RlQXBwc0NhY2hlTGltaXQsIHJlbW92ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyaWVzXG4gIGNvbnN0IGVudHJpZXNUb0NsZWFudXAgPSByZW1vdGVDYWNoZWRGaWxlc1xuICAgIC5tYXAoKHgpID0+IHBhdGgucG9zaXguam9pbihSRU1PVEVfQ0FDSEVfUk9PVCwgeCkpXG4gICAgLmZpbHRlcigoeCkgPT4gIXRoaXMucmVtb3RlQXBwc0NhY2hlLmhhcyh0b0hhc2goeCkpKVxuICAgIC5zbGljZSh0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0IC0gdGhpcy5yZW1vdGVBcHBzQ2FjaGUua2V5cygpLmxlbmd0aCk7XG4gIGlmICghXy5pc0VtcHR5KGVudHJpZXNUb0NsZWFudXApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctZicsIC4uLmVudHJpZXNUb0NsZWFudXBdKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRlZCAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXNgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IGRlbGV0ZSAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXMuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3RlUGF0aDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9JbmNyZW1lbnRhbCBbZmFsc2VdIC0gRm9yY2VmdWxseSBkaXNhYmxlcyBpbmNyZW1lbnRhbCBpbnN0YWxscyBpZiBzZXQgdG8gYHRydWVgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgdGhlIHBhY2thZ2UgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zLlxuICogQHRocm93cyB7RXJyb3J9IElmIGFuIHVuZXhwZWN0ZWQgZXJyb3IgaGFwcGVucyBkdXJpbmcgaW5zdGFsbC5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmluc3RhbGwgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKGFwcFBhdGguZW5kc1dpdGgoQVBLU19FWFRFTlNJT04pKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbEFwa3MoYXBwUGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gXy5jbG9uZURlZXAob3B0aW9ucyk7XG4gIF8uZGVmYXVsdHMob3B0aW9ucywge1xuICAgIHJlcGxhY2U6IHRydWUsXG4gICAgdGltZW91dDogdGhpcy5hZGJFeGVjVGltZW91dCA9PT0gREVGQVVMVF9BREJfRVhFQ19USU1FT1VUID8gQVBLX0lOU1RBTExfVElNRU9VVCA6IHRoaXMuYWRiRXhlY1RpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6ICdhbmRyb2lkSW5zdGFsbFRpbWVvdXQnLFxuICB9KTtcblxuICBjb25zdCBpbnN0YWxsQXJncyA9IGJ1aWxkSW5zdGFsbEFyZ3MoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpLCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMubm9JbmNyZW1lbnRhbCAmJiBhd2FpdCB0aGlzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkKCkpIHtcbiAgICAvLyBBZGIgdGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGtub3cgYWJvdXQgYW4gYXJnLFxuICAgIC8vIHdoaWNoIGlzIHRoZSBjYXNlIGhlcmUgZm9yIG9sZGVyIGFkYiB2ZXJzaW9ucy5cbiAgICBpbnN0YWxsQXJncy5wdXNoKCctLW5vLWluY3JlbWVudGFsJyk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbE9wdHMgPSB7XG4gICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0LFxuICAgIHRpbWVvdXRDYXBOYW1lOiBvcHRpb25zLnRpbWVvdXRDYXBOYW1lLFxuICB9O1xuICBjb25zdCBpbnN0YWxsQ21kID0gW1xuICAgICdpbnN0YWxsJyxcbiAgICAuLi5pbnN0YWxsQXJncyxcbiAgICBhcHBQYXRoLFxuICBdO1xuICBsZXQgcGVyZm9ybUFwcEluc3RhbGwgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoaW5zdGFsbENtZCwgaW5zdGFsbE9wdHMpO1xuICAvLyB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0IDw9IDAgbWVhbnMgbm8gY2FjaGluZyBzaG91bGQgYmUgYXBwbGllZFxuICBsZXQgc2hvdWxkQ2FjaGVBcHAgPSB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0ID4gMDtcbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgc2hvdWxkQ2FjaGVBcHAgPSAhKGF3YWl0IHRoaXMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQoKSk7XG4gICAgaWYgKCFzaG91bGRDYWNoZUFwcCkge1xuICAgICAgbG9nLmluZm8oYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHthcHBQYXRofScgd2lsbCBub3QgYmUgY2FjaGVkLCBiZWNhdXNlIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXMgYCArXG4gICAgICAgIGBjb25maXJtZWQgdGhlIHN1cHBvcnQgb2Ygc3RyZWFtZWQgaW5zdGFsbHNgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgY29uc3QgY2xlYXJDYWNoZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxvZy5pbmZvKGBDbGVhcmluZyB0aGUgY2FjaGUgYXQgJyR7UkVNT1RFX0NBQ0hFX1JPT1R9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIGAke1JFTU9URV9DQUNIRV9ST09UfS8qYF0pO1xuICAgIH07XG4gICAgY29uc3QgY2FjaGVBcHAgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmNhY2hlQXBrKGFwcFBhdGgsIHtcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICBwZXJmb3JtQXBwSW5zdGFsbCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoID0gKHJlbW90ZVBhdGgpID0+IFtcbiAgICAgICAgICAncG0nLCAnaW5zdGFsbCcsXG4gICAgICAgICAgLi4uaW5zdGFsbEFyZ3MsXG4gICAgICAgICAgcmVtb3RlUGF0aCxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChwbUluc3RhbGxDbWRCeVJlbW90ZVBhdGgoY2FjaGVkQXBwUGF0aCksIGluc3RhbGxPcHRzKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzOTcwXG4gICAgICAgIGlmICgvXFxiSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0VcXGIvLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICAgIGxvZy53YXJuKGBUaGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGluc3RhbGxpbmcgJyR7YXBwUGF0aH0nIGAgK1xuICAgICAgICAgICAgYGJlY2F1c2Ugb2YgdGhlIGluc3VmZmljaWVudCBkZXZpY2Ugc3RvcmFnZSBzcGFjZWApO1xuICAgICAgICAgIGF3YWl0IGNsZWFyQ2FjaGUoKTtcbiAgICAgICAgICBsb2cuaW5mbyhgQ29uc2lkZXIgZGVjcmVhc2luZyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2FjaGVkIGFwcHMgYCArXG4gICAgICAgICAgICBgKGN1cnJlbnRseSAke3RoaXMucmVtb3RlQXBwc0NhY2hlTGltaXR9KSB0byBhdm9pZCBzdWNoIGlzc3VlcyBpbiB0aGUgZnV0dXJlYCk7XG4gICAgICAgICAgY29uc3QgbmV3Q2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwocG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoKG5ld0NhY2hlZEFwcFBhdGgpLCBpbnN0YWxsT3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUpO1xuICAgICAgbG9nLndhcm4oYFRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyAnJHthcHBQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgbG9nLndhcm4oJ0ZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gcHJvY2VkdXJlJyk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlKCk7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwZXJmb3JtQXBwSW5zdGFsbCgpO1xuICAgIGxvZy5pbmZvKGBUaGUgaW5zdGFsbGF0aW9uIG9mICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9JyB0b29rICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgY29uc3QgdHJ1bmNhdGVkT3V0cHV0ID0gKCFfLmlzU3RyaW5nKG91dHB1dCkgfHwgb3V0cHV0Lmxlbmd0aCA8PSAzMDApID9cbiAgICAgIG91dHB1dCA6IGAke291dHB1dC5zdWJzdHIoMCwgMTUwKX0uLi4ke291dHB1dC5zdWJzdHIob3V0cHV0Lmxlbmd0aCAtIDE1MCl9YDtcbiAgICBsb2cuZGVidWcoYEluc3RhbGwgY29tbWFuZCBzdGRvdXQ6ICR7dHJ1bmNhdGVkT3V0cHV0fWApO1xuICAgIGlmICgvXFxbSU5TVEFMTFtBLVpfXStGQUlMRURbQS1aX10rXFxdLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgIGlmICh0aGlzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3Iob3V0cHV0KSkge1xuICAgICAgICBjb25zdCBtc2cgPSBgU2V0ICdhbGxvd1Rlc3RQYWNrYWdlcycgY2FwYWJpbGl0eSB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3QgcGFja2FnZXMgaW5zdGFsbGF0aW9uLmA7XG4gICAgICAgIGxvZy53YXJuKG1zZyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvdXRwdXR9XFxuJHttc2d9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3Iob3V0cHV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIG9uIHNvbWUgc3lzdGVtcyB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFwcCBhbHJlYWR5XG4gICAgLy8gZXhpc3RzXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnSU5TVEFMTF9GQUlMRURfQUxSRUFEWV9FWElTVFMnKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEFwcGxpY2F0aW9uICcke2FwcFBhdGh9JyBhbHJlYWR5IGluc3RhbGxlZC4gQ29udGludWluZy5gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHN0YXRlIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBGdWxsIHBhdGggdG8gdGhlIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gez9zdHJpbmd9IHBrZyAtIFBhY2thZ2UgaWRlbnRpZmllci4gSWYgb21pdHRlZCB0aGVuIHRoZSBzY3JpcHQgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXh0cmFjdCBpdCBvbiBpdHMgb3duXG4gKiBAcmV0dXJucyB7c3RyaW5nfV1PbmUgb2YgYEFQUF9JTlNUQUxMX1NUQVRFYCBjb25zdGFudHNcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUgKGFwcFBhdGgsIHBrZyA9IG51bGwpIHtcbiAgbGV0IGFwa0luZm8gPSBudWxsO1xuICBpZiAoIXBrZykge1xuICAgIGFwa0luZm8gPSBhd2FpdCB0aGlzLmdldEFwa0luZm8oYXBwUGF0aCk7XG4gICAgcGtnID0gYXBrSW5mby5uYW1lO1xuICB9XG4gIGlmICghcGtnKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBwYWNrYWdlIG5hbWUgb2YgJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgfVxuXG4gIGlmICghYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChwa2cpKSB7XG4gICAgbG9nLmRlYnVnKGBBcHAgJyR7YXBwUGF0aH0nIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG5cbiAgY29uc3Qge3ZlcnNpb25Db2RlOiBwa2dWZXJzaW9uQ29kZSwgdmVyc2lvbk5hbWU6IHBrZ1ZlcnNpb25OYW1lU3RyfSA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZUluZm8ocGtnKTtcbiAgY29uc3QgcGtnVmVyc2lvbk5hbWUgPSBzZW12ZXIudmFsaWQoc2VtdmVyLmNvZXJjZShwa2dWZXJzaW9uTmFtZVN0cikpO1xuICBpZiAoIWFwa0luZm8pIHtcbiAgICBhcGtJbmZvID0gYXdhaXQgdGhpcy5nZXRBcGtJbmZvKGFwcFBhdGgpO1xuICB9XG4gIGNvbnN0IHt2ZXJzaW9uQ29kZTogYXBrVmVyc2lvbkNvZGUsIHZlcnNpb25OYW1lOiBhcGtWZXJzaW9uTmFtZVN0cn0gPSBhcGtJbmZvO1xuICBjb25zdCBhcGtWZXJzaW9uTmFtZSA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGFwa1ZlcnNpb25OYW1lU3RyKSk7XG5cbiAgaWYgKCFfLmlzSW50ZWdlcihhcGtWZXJzaW9uQ29kZSkgfHwgIV8uaXNJbnRlZ2VyKHBrZ1ZlcnNpb25Db2RlKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgcmVhZCB2ZXJzaW9uIGNvZGVzIG9mICcke2FwcFBhdGh9JyBhbmQvb3IgJyR7cGtnfSdgKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpIHx8ICFfLmlzU3RyaW5nKHBrZ1ZlcnNpb25OYW1lKSkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHZlcnNpb24gbmFtZXMgb2YgJyR7YXBwUGF0aH0nIGFuZC9vciAnJHtwa2d9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNJbnRlZ2VyKGFwa1ZlcnNpb25Db2RlKSAmJiBfLmlzSW50ZWdlcihwa2dWZXJzaW9uQ29kZSkpIHtcbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPiBhcGtWZXJzaW9uQ29kZSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBjb2RlIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZ3JlYXRlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIGNvZGUgKCR7cGtnVmVyc2lvbkNvZGV9ID4gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRDtcbiAgICB9XG4gICAgLy8gVmVyc2lvbiBjb2RlcyBtaWdodCBub3QgYmUgbWFpbnRhaW5lZC4gQ2hlY2sgdmVyc2lvbiBuYW1lcy5cbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPT09IGFwa1ZlcnNpb25Db2RlKSB7XG4gICAgICBpZiAoXy5pc1N0cmluZyhhcGtWZXJzaW9uTmFtZSkgJiYgXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkgJiYgc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD49JHthcGtWZXJzaW9uTmFtZX1gKSkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICAgICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+JHthcGtWZXJzaW9uTmFtZX1gKVxuICAgICAgICAgID8gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgICAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKGFwa1ZlcnNpb25OYW1lKSB8fCAhXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZXF1YWwgdG8gYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lICgke3BrZ1ZlcnNpb25Db2RlfSA9PT0gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICAgIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpICYmIF8uaXNTdHJpbmcocGtnVmVyc2lvbk5hbWUpICYmIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+PSR7YXBrVmVyc2lvbk5hbWV9YCkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD4ke2Fwa1ZlcnNpb25OYW1lfWApXG4gICAgICA/IHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRURcbiAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBUaGUgaW5zdGFsbGVkICcke3BrZ30nIHBhY2thZ2UgaXMgb2xkZXIgdGhhbiAnJHthcHBQYXRofScgKCR7cGtnVmVyc2lvbkNvZGV9IDwgJHthcGtWZXJzaW9uQ29kZX0gb3IgJyR7cGtnVmVyc2lvbk5hbWV9JyA8ICcke2Fwa1ZlcnNpb25OYW1lfScpJ2ApO1xuICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9yVXBncmFkZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gU0RDYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmZvcmNlQ3VycmVudEJ1aWxkIFtmYWxzZV0gLSBTZXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGFsd2F5cyBwcmVmZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYnVpbGQgb3ZlciBhbnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBpZGVudGlmaWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3JVcGdyYWRlUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdhc1VuaW5zdGFsbGVkIC0gRXF1YWxzIHRvIGB0cnVlYCBpZiB0aGUgdGFyZ2V0IGFwcCBoYXMgYmVlbiB1bmluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBiZWluZyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7QVBQX0lOU1RBTExfU1RBVEV9IGFwcFN0YXRlIC0gT25lIG9mIGBhZGIuQVBQX0lOU1RBTExfU1RBVEVgIHN0YXRlcywgd2hpY2ggcmVmbGVjdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBiZWZvcmUgYmVpbmcgaW5zdGFsbGVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbCB0aGUgcGFja2FnZSBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvciB1cGdyYWRlIGl0IGlmIGFuIG9sZGVyXG4gKiB2ZXJzaW9uIG9mIHRoZSBzYW1lIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuIFRoZSBtZXRob2Qgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGZhc3RlciBpZiBpdCBpcyBzZXQuXG4gKiBAcGFyYW0gez9JbnN0YWxsT3JVcGdyYWRlT3B0aW9uc30gb3B0aW9ucyAtIFNldCBvZiBpbnN0YWxsIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gdW5leHBlY3RlZCBlcnJvciBoYXBwZW5zIGR1cmluZyBpbnN0YWxsLlxuICogQHJldHVybnMge0luc3RhbGxPclVwZ3JhZGVSZXN1bHR9XG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsT3JVcGdyYWRlID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE9yVXBncmFkZSAoYXBwUGF0aCwgcGtnID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICghcGtnKSB7XG4gICAgY29uc3QgYXBrSW5mbyA9IGF3YWl0IHRoaXMuZ2V0QXBrSW5mbyhhcHBQYXRoKTtcbiAgICBwa2cgPSBhcGtJbmZvLm5hbWU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBwa2cpO1xuICBsZXQgd2FzVW5pbnN0YWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgdW5pbnN0YWxsUGFja2FnZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMudW5pbnN0YWxsQXBrKHBrZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cGtnfScgcGFja2FnZSBjYW5ub3QgYmUgdW5pbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgd2FzVW5pbnN0YWxsZWQgPSB0cnVlO1xuICB9O1xuICBzd2l0Y2ggKGFwcFN0YXRlKSB7XG4gICAgY2FzZSB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEluc3RhbGxpbmcgJyR7YXBwUGF0aH0nYCk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IGZhbHNlfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBpZiAoZW5mb3JjZUN1cnJlbnRCdWlsZCkge1xuICAgICAgICBsb2cuaW5mbyhgRG93bmdyYWRpbmcgJyR7cGtnfScgYXMgcmVxdWVzdGVkYCk7XG4gICAgICAgIGF3YWl0IHVuaW5zdGFsbFBhY2thZ2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gZG93bmdyYWRlICcke3BrZ30nYCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgd2FzVW5pbnN0YWxsZWQsXG4gICAgICB9O1xuICAgIGNhc2UgdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEOlxuICAgICAgaWYgKGVuZm9yY2VDdXJyZW50QnVpbGQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gaW5zdGFsbC91cGdyYWRlICcke2FwcFBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyB1cGdyYWRlIG9mICcke2FwcFBhdGh9J2ApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGN1cnJlbnQgaW5zdGFsbCBzdGF0ZSBvZiAnJHthcHBQYXRofScgaXMgdW5rbm93bi4gSW5zdGFsbGluZyBhbnl3YXlgKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IHRydWV9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgaW5zdGFsbC91cGdyYWRlICcke3BrZ30nIGJlY2F1c2Ugb2YgJyR7ZXJyLm1lc3NhZ2V9Jy4gVHJ5aW5nIGZ1bGwgcmVpbnN0YWxsYCk7XG4gICAgYXdhaXQgdW5pbnN0YWxsUGFja2FnZSgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbChhcHBQYXRoLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7cmVwbGFjZTogZmFsc2V9KSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZCxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCBzdHJpbmcgcmVzb3VyY2VzIGZyb20gdGhlIGdpdmVuIHBhY2thZ2Ugb24gbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrKHMpIHBhY2thZ2UuXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlIHRvIGV4dHJhY3QgdGhlIHJlc291cmNlcyBmb3IuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgdXNlZCBpZiB0aGlzIGVxdWFscyB0byBgbnVsbGAvYHVuZGVmaW5lZGBcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXQgLSBUaGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZm9sZGVyIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB0b1xuICogICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBleHRyYWN0ZWQgZmlsZSB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gQSBtYXBwaW5nIG9iamVjdCwgd2hlcmUgcHJvcGVydGllcyBhcmU6ICdhcGtTdHJpbmdzJywgY29udGFpbmluZ1xuICogICAgICAgICAgICAgICAgICBwYXJzZWQgcmVzb3VyY2UgZmlsZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdCwgYW5kICdsb2NhbFBhdGgnLFxuICogICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBleHRyYWN0ZWQgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5leHRyYWN0U3RyaW5nc0Zyb21BcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0U3RyaW5nc0Zyb21BcGsgKGFwcFBhdGgsIGxhbmd1YWdlLCBvdXQpIHtcbiAgbG9nLmRlYnVnKGBFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBmb3IgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2UgfHwgJ2RlZmF1bHQnfWApO1xuICBjb25zdCBvcmlnaW5hbEFwcFBhdGggPSBhcHBQYXRoO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0TGFuZ3VhZ2VBcGsoYXBwUGF0aCwgbGFuZ3VhZ2UpO1xuICB9XG5cbiAgbGV0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGNvbmZpZ01hcmtlcjtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0KCk7XG5cbiAgICBjb25maWdNYXJrZXIgPSBhd2FpdCBmb3JtYXRDb25maWdNYXJrZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdCwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnKGRlZmF1bHQpJyk7XG5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBbXG4gICAgICAnZCcsICctLXZhbHVlcycsICdyZXNvdXJjZXMnLCBhcHBQYXRoLFxuICAgIF0pO1xuICAgIGFwa1N0cmluZ3MgPSBwYXJzZUFhcHRTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGV4dHJhY3QgcmVzb3VyY2VzIHVzaW5nIGFhcHQuIFRyeWluZyBhYXB0Mi4gJyArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0QWFwdDIoKTtcblxuICAgIGNvbmZpZ01hcmtlciA9IGF3YWl0IGZvcm1hdENvbmZpZ01hcmtlcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0MiwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdDIsIFtcbiAgICAgICAgJ2QnLCAncmVzb3VyY2VzJywgYXBwUGF0aCxcbiAgICAgIF0pO1xuICAgICAgYXBrU3RyaW5ncyA9IHBhcnNlQWFwdDJTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBleHRyYWN0IHJlc291cmNlcyBmcm9tICcke29yaWdpbmFsQXBwUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KGFwa1N0cmluZ3MpKSB7XG4gICAgbG9nLndhcm4oYE5vIHN0cmluZ3MgaGF2ZSBiZWVuIGZvdW5kIGluICcke29yaWdpbmFsQXBwUGF0aH0nIHJlc291cmNlcyBgICtcbiAgICAgIGBmb3IgJyR7Y29uZmlnTWFya2VyIHx8ICdkZWZhdWx0J30nIGNvbmZpZ3VyYXRpb25gKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCAke18ua2V5cyhhcGtTdHJpbmdzKS5sZW5ndGh9IHN0cmluZ3MgZnJvbSBgICtcbiAgICAgIGAnJHtvcmlnaW5hbEFwcFBhdGh9JyByZXNvdXJjZXMgZm9yICcke2NvbmZpZ01hcmtlciB8fCAnZGVmYXVsdCd9JyBjb25maWd1cmF0aW9uYCk7XG4gIH1cblxuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUob3V0LCAnc3RyaW5ncy5qc29uJyk7XG4gIGF3YWl0IG1rZGlycChvdXQpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxQYXRoLCBKU09OLnN0cmluZ2lmeShhcGtTdHJpbmdzLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIHJldHVybiB7YXBrU3RyaW5ncywgbG9jYWxQYXRofTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsYW5ndWFnZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBsYW5ndWFnZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldERldmljZUxhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTGFuZ3VhZ2UgKCkge1xuICBsZXQgbGFuZ3VhZ2U7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMYW5ndWFnZSgpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGFuZ3VhZ2UgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkuc3BsaXQoJy0nKVswXTtcbiAgfVxuICByZXR1cm4gbGFuZ3VhZ2U7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY291bnRyeSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBjb3VudHJ5LlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUNvdW50cnkgKCkge1xuICAvLyB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgaW4gQVBJIDwgMjNcbiAgbGV0IGNvdW50cnkgPSBhd2FpdCB0aGlzLmdldERldmljZVN5c0NvdW50cnkoKTtcbiAgaWYgKCFjb3VudHJ5KSB7XG4gICAgY291bnRyeSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkoKTtcbiAgfVxuICByZXR1cm4gY291bnRyeTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiBkZXZpY2UgbG9jYWxlLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTG9jYWxlICgpIHtcbiAgLy8gdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGluIEFQSSA+PSAyM1xuICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMb2NhbGUoKTtcbiAgaWYgKCFsb2NhbGUpIHtcbiAgICBsb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZVByb2R1Y3RMb2NhbGUoKTtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUgbG9jYWxlIGlzIGVuLVVTLCBmb3IgZXhhbXBsZS5cbiAqIFRoaXMgbWV0aG9kIGNhbGwgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5LCBzbywgcGxlYXNlIHVzZSBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgYXMgcG9zc2libGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIE5hbWVzIG9mIHRoZSBkZXZpY2UgbGFuZ3VhZ2UgYW5kIHRoZSBjb3VudHJ5IGNvbm5lY3RlZCB3aXRoIGAtYC4gZS5nLiBlbi1VUy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxvY2FsZSAobG9jYWxlKSB7XG4gIGNvbnN0IHZhbGlkYXRlTG9jYWxlID0gbmV3IFJlZ0V4cCgvW2EtekEtWl0rLVthLXpBLVowLTldKy8pO1xuICBpZiAoIXZhbGlkYXRlTG9jYWxlLnRlc3QobG9jYWxlKSkge1xuICAgIGxvZy53YXJuKGBzZXREZXZpY2VMb2NhbGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IGVuLVVTIG9yIGphLUpQYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNwbGl0X2xvY2FsZSA9IGxvY2FsZS5zcGxpdCgnLScpO1xuICBhd2FpdCB0aGlzLnNldERldmljZUxhbmd1YWdlQ291bnRyeShzcGxpdF9sb2NhbGVbMF0sIHNwbGl0X2xvY2FsZVsxXSk7XG59O1xuXG4vKipcbiAqIE1ha2Ugc3VyZSBjdXJyZW50IGRldmljZSBsb2NhbGUgaXMgZXhwZWN0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgY3VycmVudCBsb2NhbGUgaXMgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXMgYXJndW1lbnRzLCByZXR1cm4gdHJ1ZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmVuc3VyZUN1cnJlbnRMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVDdXJyZW50TG9jYWxlIChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBjb25zdCBoYXNMYW5ndWFnZSA9IF8uaXNTdHJpbmcobGFuZ3VhZ2UpO1xuICBjb25zdCBoYXNDb3VudHJ5ID0gXy5pc1N0cmluZyhjb3VudHJ5KTtcblxuICBpZiAoIWhhc0xhbmd1YWdlICYmICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oJ2Vuc3VyZUN1cnJlbnRMb2NhbGUgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGdldCBsb3dlciBjYXNlIHZlcnNpb25zIG9mIHRoZSBzdHJpbmdzXG4gIGxhbmd1YWdlID0gKGxhbmd1YWdlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb3VudHJ5ID0gKGNvdW50cnkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgICAgICBsZXQgY3VyTGFuZ3VhZ2UsIGN1ckNvdW50cnk7XG4gICAgICAgIGlmIChoYXNMYW5ndWFnZSkge1xuICAgICAgICAgIGN1ckxhbmd1YWdlID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlTGFuZ3VhZ2UoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAoIWhhc0NvdW50cnkgJiYgbGFuZ3VhZ2UgPT09IGN1ckxhbmd1YWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0NvdW50cnkpIHtcbiAgICAgICAgICBjdXJDb3VudHJ5ID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlQ291bnRyeSgpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmICghaGFzTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gY3VyTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJMb2NhbGUgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gemgtaGFucy1jbiA6IHpoLWNuXG4gICAgICAgIGNvbnN0IGxvY2FsZUNvZGUgPSBzY3JpcHQgPyBgJHtsYW5ndWFnZX0tJHtzY3JpcHQudG9Mb3dlckNhc2UoKX0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG5cbiAgICAgICAgaWYgKGxvY2FsZUNvZGUgPT09IGN1ckxvY2FsZSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgUmVxdWVzdGVkIGxvY2FsZSBpcyBlcXVhbCB0byBjdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSdgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IsIHJlc3RhcnQgYWRiIGFuZCByZXRyeVxuICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gY2hlY2sgZGV2aWNlIGxvY2FsaXphdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxhbmd1YWdlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxhbmd1YWdlQ291bnRyeSAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgbGV0IGhhc0xhbmd1YWdlID0gbGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSk7XG4gIGxldCBoYXNDb3VudHJ5ID0gY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpO1xuICBpZiAoIWhhc0xhbmd1YWdlIHx8ICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBhbmQgY291bnRyeSBhdCBsZWFzdGApO1xuICAgIGxvZy53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgbGFuZ3VhZ2UgPSAobGFuZ3VhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvdW50cnkgPSAoY291bnRyeSB8fCAnJykudG9VcHBlckNhc2UoKTtcblxuICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgIGxldCBjdXJMYW5ndWFnZSA9IChhd2FpdCB0aGlzLmdldERldmljZUxhbmd1YWdlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGN1ckNvdW50cnkgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VDb3VudHJ5KCkpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAobGFuZ3VhZ2UgIT09IGN1ckxhbmd1YWdlIHx8IGNvdW50cnkgIT09IGN1ckNvdW50cnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcChsYW5ndWFnZSwgY291bnRyeSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBjdXJMb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZUxvY2FsZSgpO1xuXG4gICAgLy8gemgtSGFucy1DTiA6IHpoLUNOXG4gICAgY29uc3QgbG9jYWxlQ29kZSA9IHNjcmlwdCA/IGAke2xhbmd1YWdlfS0ke3NjcmlwdH0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG4gICAgbG9nLmRlYnVnKGBDdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSc7IHJlcXVlc3RlZCBsb2NhbGU6ICcke2xvY2FsZUNvZGV9J2ApO1xuICAgIGlmIChsb2NhbGVDb2RlLnRvTG93ZXJDYXNlKCkgIT09IGN1ckxvY2FsZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwcEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFja2FnZSBuYW1lLCBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIFZlcnNpb24gbmFtZSwgZm9yIGV4YW1wbGUgJzEuMCcuXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIHBhY2thZ2UgaW5mbyBmcm9tIGxvY2FsIGFwayBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGZ1bGwgcGF0aCB0byBleGlzdGluZyAuYXBrKHMpIHBhY2thZ2Ugb24gdGhlIGxvY2FsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3lzdGVtLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRBcGtJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBrSW5mbyAoYXBwUGF0aCkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHBQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgcGF0aCAke2FwcFBhdGh9IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gIH1cblxuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYXBrUmVhZGVyID0gYXdhaXQgQXBrUmVhZGVyLm9wZW4oYXBwUGF0aCk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBhcGtSZWFkZXIucmVhZE1hbmlmZXN0KCk7XG4gICAgY29uc3Qge3BrZywgdmVyc2lvbk5hbWUsIHZlcnNpb25Db2RlfSA9IHBhcnNlTWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwa2csXG4gICAgICB2ZXJzaW9uQ29kZSxcbiAgICAgIHZlcnNpb25OYW1lLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZS5tZXNzYWdlfScgd2hpbGUgZ2V0dGluZyBiYWRnaW5nIGluZm9gKTtcbiAgfVxuICByZXR1cm4ge307XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFja2FnZSBpbmZvIGZyb20gdGhlIGluc3RhbGxlZCBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRQYWNrYWdlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VJbmZvIChwa2cpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIHBhY2thZ2UgaW5mbyBmb3IgJyR7cGtnfSdgKTtcbiAgbGV0IHJlc3VsdCA9IHtuYW1lOiBwa2d9O1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCB2ZXJzaW9uTmFtZU1hdGNoID0gbmV3IFJlZ0V4cCgvdmVyc2lvbk5hbWU9KFtcXGQrLl0rKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbk5hbWVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25OYW1lID0gdmVyc2lvbk5hbWVNYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbkNvZGVNYXRjaCA9IG5ldyBSZWdFeHAoL3ZlcnNpb25Db2RlPShcXGQrKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbkNvZGVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25Db2RlID0gcGFyc2VJbnQodmVyc2lvbkNvZGVNYXRjaFsxXSwgMTApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZXJyLm1lc3NhZ2V9JyB3aGlsZSBkdW1waW5nIHBhY2thZ2UgaW5mb2ApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5hcGtVdGlsc01ldGhvZHMucHVsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxBcGsgKHBrZywgdG1wRGlyKSB7XG4gIGNvbnN0IHBrZ1BhdGggPSAoYXdhaXQgdGhpcy5hZGJFeGVjKFsnc2hlbGwnLCAncG0nLCAncGF0aCcsIHBrZ10pKS5yZXBsYWNlKCdwYWNrYWdlOicsICcnKTtcbiAgY29uc3QgdG1wQXBwID0gcGF0aC5yZXNvbHZlKHRtcERpciwgYCR7cGtnfS5hcGtgKTtcbiAgYXdhaXQgdGhpcy5wdWxsKHBrZ1BhdGgsIHRtcEFwcCk7XG4gIGxvZy5kZWJ1ZyhgUHVsbGVkIGFwcCBmb3IgcGFja2FnZSAnJHtwa2d9JyB0byAnJHt0bXBBcHB9J2ApO1xuICByZXR1cm4gdG1wQXBwO1xufTtcblxuZXhwb3J0IHsgUkVNT1RFX0NBQ0hFX1JPT1QgfTtcbmV4cG9ydCBkZWZhdWx0IGFwa1V0aWxzTWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2Fway11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
966
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGstdXRpbHMuanMiXSwibmFtZXMiOlsiYXBrVXRpbHNNZXRob2RzIiwiQUNUSVZJVElFU19UUk9VQkxFU0hPT1RJTkdfTElOSyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiVU5LTk9XTiIsIk5PVF9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIlJFTU9URV9DQUNIRV9ST09UIiwiaXNBcHBJbnN0YWxsZWQiLCJwa2ciLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxlZFBhdHRlcm4iLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwic3Rkb3V0Iiwic2hlbGwiLCJpc0luc3RhbGxlZCIsInRlc3QiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhcnRVcmkiLCJ1cmkiLCJvcHRzIiwid2FpdEZvckxhdW5jaCIsImFyZ3MiLCJwdXNoIiwicmVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInN0YXJ0QXBwIiwic3RhcnRBcHBPcHRpb25zIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjbG9uZSIsInJlcGxhY2UiLCJkZWZhdWx0cyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXRyeSIsInN0b3BBcHAiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiY21kIiwiaW50ZW50TmFtZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic2hlbGxPcHRzIiwiaXNJbnRlZ2VyIiwid2FpdER1cmF0aW9uIiwidGltZW91dCIsInN0YXJ0c1dpdGgiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJhcHBEZXNjcmlwdG9yIiwiZHVtcFdpbmRvd3MiLCJkdW1wc3lzQXJnIiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIm51bGxGb2N1c2VkQXBwUmUiLCJmb2N1c2VkQXBwUmUiLCJudWxsQ3VycmVudEZvY3VzUmUiLCJjdXJyZW50Rm9jdXNBcHBSZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJhcHBQYWNrYWdlIiwidHJpbSIsImFwcEFjdGl2aXR5Iiwid2FpdEZvckFjdGl2aXR5T3JOb3QiLCJ3YWl0Rm9yU3RvcCIsIndhaXRNcyIsInNwbGl0TmFtZXMiLCJuYW1lcyIsInNwbGl0IiwibWFwIiwibmFtZSIsImFsbFBhY2thZ2VzIiwiYWxsQWN0aXZpdGllcyIsInBvc3NpYmxlQWN0aXZpdHlOYW1lcyIsIm9uZUFjdGl2aXR5IiwiY3VycmVudFBrZyIsImpvaW4iLCJwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMiLCJhY3ROYW1lIiwiY29uZGl0aW9uRnVuYyIsImZ1bGx5UXVhbGlmaWVkQWN0aXZpdHkiLCJpc0FjdGl2aXR5Rm91bmQiLCJzb21lIiwicCIsInBhcnNlSW50IiwiaW50ZXJ2YWxNcyIsImFjdCIsIndhaXRGb3JOb3RBY3Rpdml0eSIsInVuaW5zdGFsbEFwayIsIm9wdGlvbnMiLCJpbmZvIiwia2VlcERhdGEiLCJmb3JjZVN0b3AiLCJhZGJFeGVjIiwiaW5zdGFsbEZyb21EZXZpY2VQYXRoIiwiYXBrUGF0aE9uRGV2aWNlIiwiaW5kZXhPZiIsImNhY2hlQXBrIiwiYXBrUGF0aCIsImFwcEhhc2giLCJmcyIsImhhc2giLCJyZW1vdGVQYXRoIiwicGF0aCIsInBvc2l4IiwicmVtb3RlQ2FjaGVkRmlsZXMiLCJlcnJvck1hcmtlciIsImxzT3V0cHV0IiwiX2FyZUV4dGVuZGVkTHNPcHRpb25zU3VwcG9ydGVkIiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJzdWJzdHJpbmciLCJ4IiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsInRvSGFzaCIsInBhcnNlIiwiY2F0Y2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJzaXplIiwic3RhdCIsImJhc2VuYW1lIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJyZW1vdGVBcHBzQ2FjaGUiLCJMUlUiLCJtYXgiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImRpZmZlcmVuY2UiLCJrZXlzIiwiZm9yRWFjaCIsImRlbCIsInNldCIsImVudHJpZXNUb0NsZWFudXAiLCJoYXMiLCJzbGljZSIsImlzRW1wdHkiLCJ3YXJuIiwiaW5zdGFsbCIsImFwcFBhdGgiLCJlbmRzV2l0aCIsIkFQS1NfRVhURU5TSU9OIiwiaW5zdGFsbEFwa3MiLCJjbG9uZURlZXAiLCJhZGJFeGVjVGltZW91dCIsIkRFRkFVTFRfQURCX0VYRUNfVElNRU9VVCIsIkFQS19JTlNUQUxMX1RJTUVPVVQiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcmdzIiwibm9JbmNyZW1lbnRhbCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiaW5zdGFsbE9wdHMiLCJpbnN0YWxsQ21kIiwicGVyZm9ybUFwcEluc3RhbGwiLCJzaG91bGRDYWNoZUFwcCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwiY2xlYXJDYWNoZSIsImNhY2hlQXBwIiwiY2FjaGVkQXBwUGF0aCIsInBtSW5zdGFsbENtZEJ5UmVtb3RlUGF0aCIsIm91dHB1dCIsIm5ld0NhY2hlZEFwcFBhdGgiLCJ0cnVuY2F0ZWRPdXRwdXQiLCJzdWJzdHIiLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwibXNnIiwiZXJyIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJhcGtJbmZvIiwiZ2V0QXBrSW5mbyIsInZlcnNpb25Db2RlIiwicGtnVmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsInBrZ1ZlcnNpb25OYW1lU3RyIiwiZ2V0UGFja2FnZUluZm8iLCJwa2dWZXJzaW9uTmFtZSIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiYXBrVmVyc2lvbkNvZGUiLCJhcGtWZXJzaW9uTmFtZVN0ciIsImFwa1ZlcnNpb25OYW1lIiwic2F0aXNmaWVzIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwidW5pbnN0YWxsUGFja2FnZSIsIk9iamVjdCIsImFzc2lnbiIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsImxhbmd1YWdlIiwib3V0Iiwib3JpZ2luYWxBcHBQYXRoIiwiZXh0cmFjdExhbmd1YWdlQXBrIiwiYXBrU3RyaW5ncyIsImNvbmZpZ01hcmtlciIsImluaXRBYXB0IiwiYmluYXJpZXMiLCJhYXB0IiwidW5pcSIsIm9zIiwiRU9MIiwic3RkZXJyIiwiaW5pdEFhcHQyIiwiYWFwdDIiLCJsb2NhbFBhdGgiLCJyZXNvbHZlIiwid3JpdGVGaWxlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERldmljZUxhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VMb2NhbGUiLCJnZXREZXZpY2VDb3VudHJ5IiwiY291bnRyeSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImxvY2FsZSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJzZXREZXZpY2VMb2NhbGUiLCJ2YWxpZGF0ZUxvY2FsZSIsInNwbGl0X2xvY2FsZSIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJzY3JpcHQiLCJoYXNMYW5ndWFnZSIsImhhc0NvdW50cnkiLCJjdXJMYW5ndWFnZSIsImN1ckNvdW50cnkiLCJjdXJMb2NhbGUiLCJsb2NhbGVDb2RlIiwiZXJyb3IiLCJyZWNvbm5lY3QiLCJpZ24iLCJyZXN0YXJ0QWRiIiwidG9VcHBlckNhc2UiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwiZXhpc3RzIiwiZXh0cmFjdEJhc2VBcGsiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwibWFuaWZlc3QiLCJyZWFkTWFuaWZlc3QiLCJyZXN1bHQiLCJ2ZXJzaW9uTmFtZU1hdGNoIiwidmVyc2lvbkNv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Z0JBQWdCLEdBQUcsSUFBSXhQLE1BQUosQ0FBVyxtQkFBWCxFQUFnQ21ELElBQWhDLENBQXFDaEQsTUFBckMsQ0FBekI7O0FBQ0EsUUFBSXFQLGdCQUFKLEVBQXNCO0FBQ3BCRixNQUFBQSxNQUFNLENBQUM3RSxXQUFQLEdBQXFCN0YsUUFBUSxDQUFDNEssZ0JBQWdCLENBQUMsQ0FBRCxDQUFqQixFQUFzQixFQUF0QixDQUE3QjtBQUNEOztBQUNELFdBQU9GLE1BQVA7QUFDRCxHQVhELENBV0UsT0FBT2pGLEdBQVAsRUFBWTtBQUNaeEssb0JBQUkySSxJQUFKLENBQVUsVUFBUzZCLEdBQUcsQ0FBQzVKLE9BQVEsOEJBQS9CO0FBQ0Q7O0FBQ0QsU0FBTzZPLE1BQVA7QUFDRCxDQWxCRDs7QUFvQkFwUSxlQUFlLENBQUN1USxPQUFoQixHQUEwQixlQUFlQSxPQUFmLENBQXdCN1AsR0FBeEIsRUFBNkI4UCxNQUE3QixFQUFxQztBQUM3RCxRQUFNQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUt0SyxPQUFMLENBQWEsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixNQUFoQixFQUF3QnpGLEdBQXhCLENBQWIsQ0FBUCxFQUFtRDRCLE9BQW5ELENBQTJELFVBQTNELEVBQXVFLEVBQXZFLENBQWhCOztBQUNBLFFBQU1vTyxNQUFNLEdBQUc3SixjQUFLK0csT0FBTCxDQUFhNEMsTUFBYixFQUFzQixHQUFFOVAsR0FBSSxNQUE1QixDQUFmOztBQUNBLFFBQU0sS0FBS2lRLElBQUwsQ0FBVUYsT0FBVixFQUFtQkMsTUFBbkIsQ0FBTjs7QUFDQS9QLGtCQUFJQyxLQUFKLENBQVcsMkJBQTBCRixHQUFJLFNBQVFnUSxNQUFPLEdBQXhEOztBQUNBLFNBQU9BLE1BQVA7QUFDRCxDQU5EOztlQVNlMVEsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkU3RhcnRDbWQsIEFQS1NfRVhURU5TSU9OLCBidWlsZEluc3RhbGxBcmdzLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsXG4gIHBhcnNlTWFuaWZlc3QsIHBhcnNlQWFwdFN0cmluZ3MsIHBhcnNlQWFwdDJTdHJpbmdzLCBmb3JtYXRDb25maWdNYXJrZXIsXG4gIGVzY2FwZVNoZWxsQXJnLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZzLCB1dGlsLCBta2RpcnAsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFwa1JlYWRlciBmcm9tICdhZGJraXQtYXBrcmVhZGVyJztcblxuY29uc3QgYXBrVXRpbHNNZXRob2RzID0ge307XG5cbmNvbnN0IEFDVElWSVRJRVNfVFJPVUJMRVNIT09USU5HX0xJTksgPVxuICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi93cml0aW5nLXJ1bm5pbmctYXBwaXVtL2FuZHJvaWQvYWN0aXZpdHktc3RhcnR1cC5tZCc7XG5hcGtVdGlsc01ldGhvZHMuQVBQX0lOU1RBTExfU1RBVEUgPSB7XG4gIFVOS05PV046ICd1bmtub3duJyxcbiAgTk9UX0lOU1RBTExFRDogJ25vdEluc3RhbGxlZCcsXG4gIE5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEOiAnbmV3ZXJWZXJzaW9uSW5zdGFsbGVkJyxcbiAgU0FNRV9WRVJTSU9OX0lOU1RBTExFRDogJ3NhbWVWZXJzaW9uSW5zdGFsbGVkJyxcbiAgT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6ICdvbGRlclZlcnNpb25JbnN0YWxsZWQnLFxufTtcbmNvbnN0IFJFTU9URV9DQUNIRV9ST09UID0gJy9kYXRhL2xvY2FsL3RtcC9hcHBpdW1fY2FjaGUnO1xuXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBkZXRlY3RpbmcgYXBwbGljYXRpb24gc3RhdGVcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gaXNBcHBJbnN0YWxsZWQgKHBrZykge1xuICBsb2cuZGVidWcoYEdldHRpbmcgaW5zdGFsbCBzdGF0dXMgZm9yICR7cGtnfWApO1xuICBjb25zdCBpbnN0YWxsZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXlxcXFxzKlBhY2thZ2VcXFxccytcXFxcWyR7Xy5lc2NhcGVSZWdFeHAocGtnKX1cXFxcXVteOl0rOiRgLCAnbScpO1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCBpc0luc3RhbGxlZCA9IGluc3RhbGxlZFBhdHRlcm4udGVzdChzdGRvdXQpO1xuICAgIGxvZy5kZWJ1ZyhgJyR7cGtnfScgaXMkeyFpc0luc3RhbGxlZCA/ICcgbm90JyA6ICcnfSBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gaXNJbnN0YWxsZWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpbmRpbmcgaWYgJyR7cGtnfScgaXMgaW5zdGFsbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRVcmlPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIHBhcnRpY3VsYXIgVVJJIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJpIC0gVGhlIG5hbWUgb2YgVVJJIHRvIHN0YXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwYXJhbSB7U3RhcnRVcmlPcHRpb25zfSBvcHRzXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5zdGFydFVyaSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0VXJpICh1cmksIHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3YWl0Rm9yTGF1bmNoID0gdHJ1ZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCF1cmkgfHwgIXBrZykge1xuICAgIHRocm93IG5ldyBFcnJvcignVVJJIGFuZCBwYWNrYWdlIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFyZ3MgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgYXJncy5wdXNoKCctVycpO1xuICB9XG4gIGFyZ3MucHVzaCgnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVcnLFxuICAgICctZCcsIGVzY2FwZVNoZWxsQXJnKHVyaSksXG4gICAgcGtnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gICAgaWYgKHJlcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd1bmFibGUgdG8gcmVzb2x2ZSBpbnRlbnQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBhdHRlbXB0aW5nIHRvIHN0YXJ0IFVSSS4gT3JpZ2luYWwgZXJyb3I6ICR7ZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2VcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhY3Rpdml0eS5cbiAqIFRoaXMgb3IgYWN0aW9uIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gbGF1bmNoIGFuIGFwcC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCBhY3Rpb24gdGhhdCB3aWxsIGxhdW5jaCB0aGUgcmVxdWlyZWQgYXBwLlxuICogVGhpcyBvciBhY3Rpdml0eSBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBhcHAuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSByZXRyeSBbdHJ1ZV0gLSBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWBcbiAqIGFuZCB0aGUgYWN0aXZpdHkgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICcuJyB0aGVuIHRoZSBtZXRob2RcbiAqIHdpbGwgdHJ5IHRvIGFkZCB0aGUgbWlzc2luZyBkb3QgYW5kIHN0YXJ0IHRoZSBhY3Rpdml0eSBvbmNlIG1vcmVcbiAqIGlmIHRoZSBmaXJzdCBzdGFydHVwIHRyeSBmYWlscy5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHN0b3BBcHAgW3RydWVdIC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBmb3JjZWZ1bGx5XG4gKiBzdG9wIHRoZSBhY3Rpdml0eSBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byB3YWl0IHRvIG9uXG4gKiBzdGFydHVwICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhpcyBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUsIHdoaWNoIGlzIHNldCBhcyBgcGtnYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IHRvIHdhaXQgdG8gb25cbiAqIHN0YXJ0dXAgKHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGlzIG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSwgd2hpY2ggaXMgc2V0IGFzIGBhY3Rpdml0eWApXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdhaXREdXJhdGlvbiAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiBgd2FpdEFjdGl2aXR5YCBpcyBmb2N1c2VkXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIC0gVGhlIG51bWJlciBvZiB0aGUgdXNlciBwcm9maWxlIHRvIHN0YXJ0XG4gKiB0aGUgZ2l2ZW4gYWN0aXZpdHkgd2l0aC4gVGhlIGRlZmF1bHQgT1MgdXNlciBwcm9maWxlICh1c3VhbGx5IHplcm8pIGlzIHVzZWRcbiAqIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB1bnNldFxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gd2FpdEZvckxhdW5jaCBbdHJ1ZV0gLSBpZiBgZmFsc2VgIHRoZW4gYWRiIHdvbid0IHdhaXRcbiAqIGZvciB0aGUgc3RhcnRlZCBhY3Rpdml0eSB0byByZXR1cm4gdGhlIGNvbnRyb2xcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UvYWN0aXZpdHkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgW3t9XSAtIFN0YXJ0dXAgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgYWN0aXZpdHlcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnN0YXJ0QXBwID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBcHAgKHN0YXJ0QXBwT3B0aW9ucyA9IHt9KSB7XG4gIGlmICghc3RhcnRBcHBPcHRpb25zLnBrZyB8fCAhKHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSB8fCBzdGFydEFwcE9wdGlvbnMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGtnLCBhbmQgYWN0aXZpdHkgb3IgaW50ZW50IGFjdGlvbiwgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IGFuIGFwcGxpY2F0aW9uJyk7XG4gIH1cblxuICBzdGFydEFwcE9wdGlvbnMgPSBfLmNsb25lKHN0YXJ0QXBwT3B0aW9ucyk7XG4gIGlmIChzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkpIHtcbiAgICBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkgPSBzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkucmVwbGFjZSgnJCcsICdcXFxcJCcpO1xuICB9XG4gIC8vIGluaXRpYWxpemluZyBkZWZhdWx0c1xuICBfLmRlZmF1bHRzKHN0YXJ0QXBwT3B0aW9ucywge1xuICAgIHdhaXRQa2c6IHN0YXJ0QXBwT3B0aW9ucy5wa2csXG4gICAgd2FpdEZvckxhdW5jaDogdHJ1ZSxcbiAgICB3YWl0QWN0aXZpdHk6IGZhbHNlLFxuICAgIHJldHJ5OiB0cnVlLFxuICAgIHN0b3BBcHA6IHRydWVcbiAgfSk7XG4gIC8vIHByZXZlbnRpbmcgbnVsbCB3YWl0cGtnXG4gIHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnID0gc3RhcnRBcHBPcHRpb25zLndhaXRQa2cgfHwgc3RhcnRBcHBPcHRpb25zLnBrZztcblxuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgY29uc3QgY21kID0gYnVpbGRTdGFydENtZChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKTtcbiAgY29uc3QgaW50ZW50TmFtZSA9IGAke3N0YXJ0QXBwT3B0aW9ucy5hY3Rpb259JHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPyAnICcgKyBzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgOiAnJ31gO1xuICB0cnkge1xuICAgIGNvbnN0IHNoZWxsT3B0cyA9IHt9O1xuICAgIGlmIChfLmlzSW50ZWdlcihzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKSAmJiBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uID49IDApIHtcbiAgICAgIHNoZWxsT3B0cy50aW1lb3V0ID0gc3RhcnRBcHBPcHRpb25zLndhaXREdXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChjbWQsIHNoZWxsT3B0cyk7XG4gICAgaWYgKHN0ZG91dC5pbmNsdWRlcygnRXJyb3I6IEFjdGl2aXR5IGNsYXNzJykgJiYgc3Rkb3V0LmluY2x1ZGVzKCdkb2VzIG5vdCBleGlzdCcpKSB7XG4gICAgICBpZiAoc3RhcnRBcHBPcHRpb25zLnJldHJ5ICYmICFzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV2UgdHJpZWQgdG8gc3RhcnQgYW4gYWN0aXZpdHkgdGhhdCBkb2Vzbid0IGV4aXN0LCBgICtcbiAgICAgICAgICAgICAgICAgIGByZXRyeWluZyB3aXRoICcuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBuYW1lYCk7XG4gICAgICAgIHN0YXJ0QXBwT3B0aW9ucy5hY3Rpdml0eSA9IGAuJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9YDtcbiAgICAgICAgc3RhcnRBcHBPcHRpb25zLnJldHJ5ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YXJ0QXBwKHN0YXJ0QXBwT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5IG5hbWUgJyR7c3RhcnRBcHBPcHRpb25zLmFjdGl2aXR5fScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBJbnRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IGFjdGl2aXRpZXMnKSB8fCBzdGRvdXQuaW5jbHVkZXMoJ0Vycm9yOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCwgdW5hYmxlIHRvIHJlc29sdmUgSW50ZW50JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWN0aXZpdHkgZm9yIGludGVudCAnJHtpbnRlbnROYW1lfScgdXNlZCB0byBzdGFydCB0aGUgYXBwIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGV4aXN0IG9yIGNhbm5vdCBiZSBsYXVuY2hlZCEgTWFrZSBzdXJlIGl0IGV4aXN0cyBhbmQgaXMgYSBsYXVuY2hhYmxlIGFjdGl2aXR5YCk7XG4gICAgfSBlbHNlIGlmIChzdGRvdXQuaW5jbHVkZXMoJ2phdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbicpKSB7XG4gICAgICAvLyBpZiB0aGUgYXBwIGlzIGRpc2FibGVkIG9uIGEgcmVhbCBkZXZpY2UgaXQgd2lsbCB0aHJvdyBhIHNlY3VyaXR5IGV4Y2VwdGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGVybWlzc2lvbiB0byBzdGFydCAnJHtzdGFydEFwcE9wdGlvbnMuYWN0aXZpdHl9JyBhY3Rpdml0eSBoYXMgYmVlbiBkZW5pZWQuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkvcGFja2FnZSBuYW1lcyBhcmUgY29ycmVjdC5gKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0QXBwT3B0aW9ucy53YWl0QWN0aXZpdHkpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHN0YXJ0QXBwT3B0aW9ucy53YWl0UGtnLCBzdGFydEFwcE9wdGlvbnMud2FpdEFjdGl2aXR5LCBzdGFydEFwcE9wdGlvbnMud2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZG91dDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGFwcERlc2NyaXB0b3IgPSBzdGFydEFwcE9wdGlvbnMucGtnIHx8IGludGVudE5hbWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RhcnQgdGhlICcke2FwcERlc2NyaXB0b3J9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjYWxsIGBhZGIgZHVtcHN5cyB3aW5kb3cgd2luZG93cy9kaXNwbGF5c2BcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmR1bXBXaW5kb3dzID0gYXN5bmMgZnVuY3Rpb24gZHVtcFdpbmRvd3MgKCkge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcblxuICAvLyBXaXRoIHZlcnNpb24gMjksIEFuZHJvaWQgY2hhbmdlZCB0aGUgZHVtcHN5cyBzeW50YXhcbiAgY29uc3QgZHVtcHN5c0FyZyA9IGFwaUxldmVsID49IDI5ID8gJ2Rpc3BsYXlzJyA6ICd3aW5kb3dzJztcbiAgY29uc3QgY21kID0gWydkdW1wc3lzJywgJ3dpbmRvdycsIGR1bXBzeXNBcmddO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhY2thZ2VBY3Rpdml0eUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwUGFja2FnZSAtIFRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uIHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYXBwQWN0aXZpdHkgLSBUaGUgbmFtZSBvZiBtYWluIGFwcGxpY2F0aW9uIGFjdGl2aXR5LlxuICovXG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIGN1cnJlbnRseSBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5LlxuICpcbiAqIEByZXR1cm4ge1BhY2thZ2VBY3Rpdml0eUluZm99IFRoZSBtYXBwaW5nLCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyBhcmUgJ2FwcFBhY2thZ2UnIGFuZCAnYXBwQWN0aXZpdHknLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGRhdGEuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBmb2N1c2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5Jyk7XG4gIGNvbnN0IG51bGxGb2N1c2VkQXBwUmUgPSBuZXcgUmVnRXhwKC9eXFxzKm1Gb2N1c2VkQXBwPW51bGwvLCAnbScpO1xuICAvLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL3haOHZGNy8xXG4gIGNvbnN0IGZvY3VzZWRBcHBSZSA9IG5ldyBSZWdFeHAoJ15cXFxccyptRm9jdXNlZEFwcC4rUmVjb3JkXFxcXHsuKlxcXFxzKFteXFxcXHNcXFxcL1xcXFx9XSspJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwvKFteXFxcXHNcXFxcL1xcXFx9XFxcXCxdKylcXFxcLD8oXFxcXHNbXlxcXFxzXFxcXC9cXFxcfV0rKSpcXFxcfScsICdtJyk7XG4gIGNvbnN0IG51bGxDdXJyZW50Rm9jdXNSZSA9IG5ldyBSZWdFeHAoL15cXHMqbUN1cnJlbnRGb2N1cz1udWxsLywgJ20nKTtcbiAgY29uc3QgY3VycmVudEZvY3VzQXBwUmUgPSBuZXcgUmVnRXhwKCdeXFxcXHMqbUN1cnJlbnRGb2N1cy4rXFxcXHsuK1xcXFxzKFteXFxcXHNcXFxcL10rKVxcXFwvKFteXFxcXHNdKylcXFxcYicsICdtJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmR1bXBXaW5kb3dzKCk7XG4gICAgLy8gVGhlIG9yZGVyIG1hdHRlcnMgaGVyZVxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbZm9jdXNlZEFwcFJlLCBjdXJyZW50Rm9jdXNBcHBSZV0pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcHBQYWNrYWdlOiBtYXRjaFsxXS50cmltKCksXG4gICAgICAgICAgYXBwQWN0aXZpdHk6IG1hdGNoWzJdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBbbnVsbEZvY3VzZWRBcHBSZSwgbnVsbEN1cnJlbnRGb2N1c1JlXSkge1xuICAgICAgaWYgKHBhdHRlcm4uZXhlYyhzdGRvdXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwUGFja2FnZTogbnVsbCxcbiAgICAgICAgICBhcHBBY3Rpdml0eTogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHBhcnNlIGFjdGl2aXR5IGZyb20gZHVtcHN5cycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IGZvY3VzUGFja2FnZUFuZEFjdGl2aXR5LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWQvbm9uLWZvY3VzZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LCBiZWxvbmdpbmcgdG8gdGhhdCBwYWNrYWdlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdhaXRGb3JTdG9wIC0gV2hldGhlciB0byB3YWl0IHVudGlsIHRoZSBhY3Rpdml0eSBpcyBmb2N1c2VkICh0cnVlKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlzIG5vdCBmb2N1c2VkIChmYWxzZSkuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdE1zIFsyMDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRpbWVvdXQgb2NjdXJzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRpbWVvdXQgaGFwcGVucy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLndhaXRGb3JBY3Rpdml0eU9yTm90ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5T3JOb3QgKHBrZywgYWN0aXZpdHksIHdhaXRGb3JTdG9wLCB3YWl0TXMgPSAyMDAwMCkge1xuICBpZiAoIXBrZyB8fCAhYWN0aXZpdHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgYW5kIGFjdGl2aXR5IHJlcXVpcmVkLicpO1xuICB9XG4gIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3dhaXRNc31tcyBmb3IgYWN0aXZpdHkgbWF0Y2hpbmcgcGtnOiAnJHtwa2d9JyBhbmQgYCArXG4gICAgICAgICAgICBgYWN0aXZpdHk6ICcke2FjdGl2aXR5fScgdG8ke3dhaXRGb3JTdG9wID8gJyBub3QnIDogJyd9IGJlIGZvY3VzZWRgKTtcblxuICBjb25zdCBzcGxpdE5hbWVzID0gKG5hbWVzKSA9PiBuYW1lcy5zcGxpdCgnLCcpLm1hcCgobmFtZSkgPT4gbmFtZS50cmltKCkpO1xuICBjb25zdCBhbGxQYWNrYWdlcyA9IHNwbGl0TmFtZXMocGtnKTtcbiAgY29uc3QgYWxsQWN0aXZpdGllcyA9IHNwbGl0TmFtZXMoYWN0aXZpdHkpO1xuXG4gIGNvbnN0IHBvc3NpYmxlQWN0aXZpdHlOYW1lcyA9IFtdO1xuICBmb3IgKGNvbnN0IG9uZUFjdGl2aXR5IG9mIGFsbEFjdGl2aXRpZXMpIHtcbiAgICBpZiAob25lQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAvLyBhZGQgdGhlIHBhY2thZ2UgbmFtZSBpZiBhY3Rpdml0eSBpcyBub3QgZnVsbCBxdWFsaWZpZWRcbiAgICAgIGZvciAoY29uc3QgY3VycmVudFBrZyBvZiBhbGxQYWNrYWdlcykge1xuICAgICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtjdXJyZW50UGtnfSR7b25lQWN0aXZpdHl9YC5yZXBsYWNlKC9cXC4rL2csICcuJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhY2NlcHQgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUuXG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChvbmVBY3Rpdml0eSk7XG4gICAgICBwb3NzaWJsZUFjdGl2aXR5TmFtZXMucHVzaChgJHtwa2d9LiR7b25lQWN0aXZpdHl9YCk7XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhgUG9zc2libGUgYWN0aXZpdGllcywgdG8gYmUgY2hlY2tlZDogJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignLCAnKX1gKTtcblxuICBjb25zdCBwb3NzaWJsZUFjdGl2aXR5UGF0dGVybnMgPSBwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKFxuICAgIChhY3ROYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHthY3ROYW1lLnJlcGxhY2UoL1xcLi9nLCAnXFxcXC4nKS5yZXBsYWNlKC9cXCovZywgJy4qPycpLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKX0kYClcbiAgKTtcblxuICBjb25zdCBjb25kaXRpb25GdW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBhcHBQYWNrYWdlO1xuICAgIGxldCBhcHBBY3Rpdml0eTtcbiAgICB0cnkge1xuICAgICAgKHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHBBY3Rpdml0eSAmJiBhcHBQYWNrYWdlKSB7XG4gICAgICBjb25zdCBmdWxseVF1YWxpZmllZEFjdGl2aXR5ID0gYXBwQWN0aXZpdHkuc3RhcnRzV2l0aCgnLicpID8gYCR7YXBwUGFja2FnZX0ke2FwcEFjdGl2aXR5fWAgOiBhcHBBY3Rpdml0eTtcbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgcGFja2FnZTogJyR7YXBwUGFja2FnZX0nIGFuZCBmdWxseSBxdWFsaWZpZWQgYWN0aXZpdHkgbmFtZSA6ICcke2Z1bGx5UXVhbGlmaWVkQWN0aXZpdHl9J2ApO1xuICAgICAgY29uc3QgaXNBY3Rpdml0eUZvdW5kID0gXy5pbmNsdWRlcyhhbGxQYWNrYWdlcywgYXBwUGFja2FnZSlcbiAgICAgICAgJiYgcG9zc2libGVBY3Rpdml0eVBhdHRlcm5zLnNvbWUoKHApID0+IHAudGVzdChmdWxseVF1YWxpZmllZEFjdGl2aXR5KSk7XG4gICAgICBpZiAoKCF3YWl0Rm9yU3RvcCAmJiBpc0FjdGl2aXR5Rm91bmQpIHx8ICh3YWl0Rm9yU3RvcCAmJiAhaXNBY3Rpdml0eUZvdW5kKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdJbmNvcnJlY3QgcGFja2FnZSBhbmQgYWN0aXZpdHkuIFJldHJ5aW5nLicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oY29uZGl0aW9uRnVuYywge1xuICAgICAgd2FpdE1zOiBwYXJzZUludCh3YWl0TXMsIDEwKSxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtwb3NzaWJsZUFjdGl2aXR5TmFtZXMubWFwKChuYW1lKSA9PiBgJyR7bmFtZX0nYCkuam9pbignIG9yICcpfSBuZXZlciAke3dhaXRGb3JTdG9wID8gJ3N0b3BwZWQnIDogJ3N0YXJ0ZWQnfS4gYCArXG4gICAgICBgVmlzaXQgJHtBQ1RJVklUSUVTX1RST1VCTEVTSE9PVElOR19MSU5LfSBmb3IgdHJvdWJsZXNob290aW5nYCk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5IHRvIGJlIGZvY3VzZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvckFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgZmFsc2UsIHdhaXRNcyk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSB0byBiZSBub24tZm9jdXNlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHksIGJlbG9uZ2luZyB0byB0aGF0IHBhY2thZ2UsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0TXMgWzIwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGltZW91dCBvY2N1cnMuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGltZW91dCBoYXBwZW5zLlxuICovXG5hcGtVdGlsc01ldGhvZHMud2FpdEZvck5vdEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvck5vdEFjdGl2aXR5IChwa2csIGFjdCwgd2FpdE1zID0gMjAwMDApIHtcbiAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHlPck5vdChwa2csIGFjdCwgdHJ1ZSwgd2FpdE1zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgW2FkYkV4ZWNUaW1lb3V0XSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdW5pbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtlZXBEYXRhIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBrZWVwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGF0YSBhbmQgY2FjaGUgZm9sZGVycyBhZnRlciB1bmluc3RhbGwuXG4gKi9cblxuLyoqXG4gKiBVbmluc3RhbGwgdGhlIGdpdmVuIHBhY2thZ2UgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIHVuaW5zdGFsbGVkLlxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgdW5pbnN0YWxsIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBvbiB0aGUgZGV2aWNlIGFuZFxuICogICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5hcGtVdGlsc01ldGhvZHMudW5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsQXBrIChwa2csIG9wdGlvbnMgPSB7fSkge1xuICBsb2cuZGVidWcoYFVuaW5zdGFsbGluZyAke3BrZ31gKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKHBrZykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWQsIGJlY2F1c2UgaXQgd2FzIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2VgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjbWQgPSBbJ3VuaW5zdGFsbCddO1xuICBpZiAob3B0aW9ucy5rZWVwRGF0YSkge1xuICAgIGNtZC5wdXNoKCctaycpO1xuICB9XG4gIGNtZC5wdXNoKHBrZyk7XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIHN0ZG91dCA9IChhd2FpdCB0aGlzLmFkYkV4ZWMoY21kLCB7dGltZW91dDogb3B0aW9ucy50aW1lb3V0fSkpLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHVuaW5zdGFsbCBBUEsuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBsb2cuZGVidWcoYCdhZGIgJHtjbWQuam9pbignICcpfScgY29tbWFuZCBvdXRwdXQ6ICR7c3Rkb3V0fWApO1xuICBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdTdWNjZXNzJykpIHtcbiAgICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsb2cuaW5mbyhgJHtwa2d9IHdhcyBub3QgdW5pbnN0YWxsZWRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBwYWNrYWdlIGFmdGVyIGl0IHdhcyBwdXNoZWQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoT25EZXZpY2UgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBwYWNrYWdlIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyBbe31dIC0gQWRkaXRpb25hbCBleGVjIG9wdGlvbnMuIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2Vzc31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcGFyYW1ldGVyLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgZHVyaW5nIGFwcGxpY2F0aW9uIGluc3RhbGwuXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsRnJvbURldmljZVBhdGggPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJvbURldmljZVBhdGggKGFwa1BhdGhPbkRldmljZSwgb3B0cyA9IHt9KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnaW5zdGFsbCcsICctcicsIGFwa1BhdGhPbkRldmljZV0sIG9wdHMpO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0ZhaWx1cmUnKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbW90ZSBpbnN0YWxsIGZhaWxlZDogJHtzdGRvdXR9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FjaGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dCBbYWRiRXhlY1RpbWVvdXRdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdXBsb2FkZWQgdG8gdGhlIHJlbW90ZSBsb2NhdGlvbi5cbiAqL1xuXG4vKipcbiAqIENhY2hlcyB0aGUgZ2l2ZW4gQVBLIGF0IGEgcmVtb3RlIGxvY2F0aW9uIHRvIHNwZWVkIHVwIGZ1cnRoZXIgQVBLIGRlcGxveW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoIC0gRnVsbCBwYXRoIHRvIHRoZSBhcGsgb24gdGhlIGxvY2FsIEZTXG4gKiBAcGFyYW0gez9DYWNoaW5nT3B0aW9uc30gb3B0aW9ucyAtIENhY2hpbmcgb3B0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gLSBGdWxsIHBhdGggdG8gdGhlIGNhY2hlZCBhcGsgb24gdGhlIHJlbW90ZSBmaWxlIHN5c3RlbVxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyB0aGUgYXBwXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5jYWNoZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGNhY2hlQXBrIChhcGtQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgYXBwSGFzaCA9IGF3YWl0IGZzLmhhc2goYXBrUGF0aCk7XG4gIGNvbnN0IHJlbW90ZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oUkVNT1RFX0NBQ0hFX1JPT1QsIGAke2FwcEhhc2h9LmFwa2ApO1xuICBjb25zdCByZW1vdGVDYWNoZWRGaWxlcyA9IFtdO1xuICAvLyBHZXQgY3VycmVudCBjb250ZW50cyBvZiB0aGUgcmVtb3RlIGNhY2hlIG9yIGNyZWF0ZSBpdCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgdHJ5IHtcbiAgICBjb25zdCBlcnJvck1hcmtlciA9ICdfRVJST1JfJztcbiAgICBsZXQgbHNPdXRwdXQgPSBudWxsO1xuICAgIGlmICh0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCA9PT0gdHJ1ZSB8fCAhXy5pc0Jvb2xlYW4odGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQpKSB7XG4gICAgICBsc091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoW2BscyAtdCAtMSAke1JFTU9URV9DQUNIRV9ST09UfSAyPiYxIHx8IGVjaG8gJHtlcnJvck1hcmtlcn1gXSk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhsc091dHB1dCkgfHwgKGxzT3V0cHV0LmluY2x1ZGVzKGVycm9yTWFya2VyKSAmJiAhbHNPdXRwdXQuaW5jbHVkZXMoUkVNT1RFX0NBQ0hFX1JPT1QpKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9hcmVFeHRlbmRlZExzT3B0aW9uc1N1cHBvcnRlZCkpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdUaGUgY3VycmVudCBBbmRyb2lkIEFQSSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGxzIG9wdGlvbnMuICcgK1xuICAgICAgICAgICdEZWZhdWx0aW5nIHRvIG5vLW9wdGlvbnMgY2FsbCcpO1xuICAgICAgfVxuICAgICAgbHNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtgbHMgJHtSRU1PVEVfQ0FDSEVfUk9PVH0gMj4mMSB8fCBlY2hvICR7ZXJyb3JNYXJrZXJ9YF0pO1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXJlRXh0ZW5kZWRMc09wdGlvbnNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobHNPdXRwdXQuaW5jbHVkZXMoZXJyb3JNYXJrZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobHNPdXRwdXQuc3Vic3RyaW5nKDAsIGxzT3V0cHV0LmluZGV4T2YoZXJyb3JNYXJrZXIpKSk7XG4gICAgfVxuICAgIHJlbW90ZUNhY2hlZEZpbGVzLnB1c2goLi4uKFxuICAgICAgbHNPdXRwdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYEdvdCBhbiBlcnJvciAnJHtlLm1lc3NhZ2UudHJpbSgpfScgd2hpbGUgZ2V0dGluZyB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY2FjaGUuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBjYWNoZSBkb2VzIG5vdCBleGlzdCB5ZXRgKTtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCBSRU1PVEVfQ0FDSEVfUk9PVF0pO1xuICB9XG4gIGxvZy5kZWJ1ZyhgVGhlIGNvdW50IG9mIGFwcGxpY2F0aW9ucyBpbiB0aGUgY2FjaGU6ICR7cmVtb3RlQ2FjaGVkRmlsZXMubGVuZ3RofWApO1xuICBjb25zdCB0b0hhc2ggPSAocmVtb3RlUGF0aCkgPT4gcGF0aC5wb3NpeC5wYXJzZShyZW1vdGVQYXRoKS5uYW1lO1xuICAvLyBQdXNoIHRoZSBhcGsgdG8gdGhlIHJlbW90ZSBjYWNoZSBpZiBuZWVkZWRcbiAgaWYgKHJlbW90ZUNhY2hlZEZpbGVzLnNvbWUoKHgpID0+IHRvSGFzaCh4KSA9PT0gYXBwSGFzaCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Fwa1BhdGh9JyBpcyBhbHJlYWR5IGNhY2hlZCB0byAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICAvLyBVcGRhdGUgdGhlIGFwcGxpY2F0aW9uIHRpbWVzdGFtcCBhc3luY2hyb25vdXNseSBpbiBvcmRlciB0byBidW1wIGl0cyBwb3NpdGlvblxuICAgIC8vIGluIHRoZSBzb3J0ZWQgbHMgb3V0cHV0XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICB0aGlzLnNoZWxsKFsndG91Y2gnLCAnLWFtJywgcmVtb3RlUGF0aF0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgQ2FjaGluZyB0aGUgYXBwbGljYXRpb24gYXQgJyR7YXBrUGF0aH0nIHRvICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5wdXNoKGFwa1BhdGgsIHJlbW90ZVBhdGgsIHt0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXR9KTtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KGFwa1BhdGgpO1xuICAgIGxvZy5pbmZvKGBUaGUgdXBsb2FkIG9mICcke3BhdGguYmFzZW5hbWUoYXBrUGF0aCl9JyAoJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfSkgYCArXG4gICAgICBgdG9vayAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICB9XG4gIGlmICghdGhpcy5yZW1vdGVBcHBzQ2FjaGUpIHtcbiAgICB0aGlzLnJlbW90ZUFwcHNDYWNoZSA9IG5ldyBMUlUoe1xuICAgICAgbWF4OiB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIH0pO1xuICB9XG4gIC8vIENsZWFudXAgdGhlIGludmFsaWQgZW50cmllcyBmcm9tIHRoZSBjYWNoZVxuICBfLmRpZmZlcmVuY2UoWy4uLnRoaXMucmVtb3RlQXBwc0NhY2hlLmtleXMoKV0sIHJlbW90ZUNhY2hlZEZpbGVzLm1hcCh0b0hhc2gpKVxuICAgIC5mb3JFYWNoKChoYXNoKSA9PiB0aGlzLnJlbW90ZUFwcHNDYWNoZS5kZWwoaGFzaCkpO1xuICAvLyBCdW1wIHRoZSBjYWNoZSByZWNvcmQgZm9yIHRoZSByZWNlbnRseSBjYWNoZWQgaXRlbVxuICB0aGlzLnJlbW90ZUFwcHNDYWNoZS5zZXQoYXBwSGFzaCwgcmVtb3RlUGF0aCk7XG4gIC8vIElmIHRoZSByZW1vdGUgY2FjaGUgZXhjZWVkcyB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0LCByZW1vdmUgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cmllc1xuICBjb25zdCBlbnRyaWVzVG9DbGVhbnVwID0gcmVtb3RlQ2FjaGVkRmlsZXNcbiAgICAubWFwKCh4KSA9PiBwYXRoLnBvc2l4LmpvaW4oUkVNT1RFX0NBQ0hFX1JPT1QsIHgpKVxuICAgIC5maWx0ZXIoKHgpID0+ICF0aGlzLnJlbW90ZUFwcHNDYWNoZS5oYXModG9IYXNoKHgpKSlcbiAgICAuc2xpY2UodGhpcy5yZW1vdGVBcHBzQ2FjaGVMaW1pdCAtIFsuLi50aGlzLnJlbW90ZUFwcHNDYWNoZS5rZXlzKCldLmxlbmd0aCk7XG4gIGlmICghXy5pc0VtcHR5KGVudHJpZXNUb0NsZWFudXApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctZicsIC4uLmVudHJpZXNUb0NsZWFudXBdKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRlZCAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXNgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IGRlbGV0ZSAke2VudHJpZXNUb0NsZWFudXAubGVuZ3RofSBleHBpcmVkIGFwcGxpY2F0aW9uIGNhY2hlIGVudHJpZXMuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3RlUGF0aDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9JbmNyZW1lbnRhbCBbZmFsc2VdIC0gRm9yY2VmdWxseSBkaXNhYmxlcyBpbmNyZW1lbnRhbCBpbnN0YWxscyBpZiBzZXQgdG8gYHRydWVgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgdGhlIHBhY2thZ2UgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zLlxuICogQHRocm93cyB7RXJyb3J9IElmIGFuIHVuZXhwZWN0ZWQgZXJyb3IgaGFwcGVucyBkdXJpbmcgaW5zdGFsbC5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmluc3RhbGwgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKGFwcFBhdGguZW5kc1dpdGgoQVBLU19FWFRFTlNJT04pKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbEFwa3MoYXBwUGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gXy5jbG9uZURlZXAob3B0aW9ucyk7XG4gIF8uZGVmYXVsdHMob3B0aW9ucywge1xuICAgIHJlcGxhY2U6IHRydWUsXG4gICAgdGltZW91dDogdGhpcy5hZGJFeGVjVGltZW91dCA9PT0gREVGQVVMVF9BREJfRVhFQ19USU1FT1VUID8gQVBLX0lOU1RBTExfVElNRU9VVCA6IHRoaXMuYWRiRXhlY1RpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6ICdhbmRyb2lkSW5zdGFsbFRpbWVvdXQnLFxuICB9KTtcblxuICBjb25zdCBpbnN0YWxsQXJncyA9IGJ1aWxkSW5zdGFsbEFyZ3MoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpLCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMubm9JbmNyZW1lbnRhbCAmJiBhd2FpdCB0aGlzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkKCkpIHtcbiAgICAvLyBBZGIgdGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGtub3cgYWJvdXQgYW4gYXJnLFxuICAgIC8vIHdoaWNoIGlzIHRoZSBjYXNlIGhlcmUgZm9yIG9sZGVyIGFkYiB2ZXJzaW9ucy5cbiAgICBpbnN0YWxsQXJncy5wdXNoKCctLW5vLWluY3JlbWVudGFsJyk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbE9wdHMgPSB7XG4gICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0LFxuICAgIHRpbWVvdXRDYXBOYW1lOiBvcHRpb25zLnRpbWVvdXRDYXBOYW1lLFxuICB9O1xuICBjb25zdCBpbnN0YWxsQ21kID0gW1xuICAgICdpbnN0YWxsJyxcbiAgICAuLi5pbnN0YWxsQXJncyxcbiAgICBhcHBQYXRoLFxuICBdO1xuICBsZXQgcGVyZm9ybUFwcEluc3RhbGwgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoaW5zdGFsbENtZCwgaW5zdGFsbE9wdHMpO1xuICAvLyB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0IDw9IDAgbWVhbnMgbm8gY2FjaGluZyBzaG91bGQgYmUgYXBwbGllZFxuICBsZXQgc2hvdWxkQ2FjaGVBcHAgPSB0aGlzLnJlbW90ZUFwcHNDYWNoZUxpbWl0ID4gMDtcbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgc2hvdWxkQ2FjaGVBcHAgPSAhKGF3YWl0IHRoaXMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQoKSk7XG4gICAgaWYgKCFzaG91bGRDYWNoZUFwcCkge1xuICAgICAgbG9nLmluZm8oYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHthcHBQYXRofScgd2lsbCBub3QgYmUgY2FjaGVkLCBiZWNhdXNlIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXMgYCArXG4gICAgICAgIGBjb25maXJtZWQgdGhlIHN1cHBvcnQgb2Ygc3RyZWFtZWQgaW5zdGFsbHNgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNob3VsZENhY2hlQXBwKSB7XG4gICAgY29uc3QgY2xlYXJDYWNoZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxvZy5pbmZvKGBDbGVhcmluZyB0aGUgY2FjaGUgYXQgJyR7UkVNT1RFX0NBQ0hFX1JPT1R9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIGAke1JFTU9URV9DQUNIRV9ST09UfS8qYF0pO1xuICAgIH07XG4gICAgY29uc3QgY2FjaGVBcHAgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmNhY2hlQXBrKGFwcFBhdGgsIHtcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICBwZXJmb3JtQXBwSW5zdGFsbCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoID0gKHJlbW90ZVBhdGgpID0+IFtcbiAgICAgICAgICAncG0nLCAnaW5zdGFsbCcsXG4gICAgICAgICAgLi4uaW5zdGFsbEFyZ3MsXG4gICAgICAgICAgcmVtb3RlUGF0aCxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChwbUluc3RhbGxDbWRCeVJlbW90ZVBhdGgoY2FjaGVkQXBwUGF0aCksIGluc3RhbGxPcHRzKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzOTcwXG4gICAgICAgIGlmICgvXFxiSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0VcXGIvLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICAgIGxvZy53YXJuKGBUaGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGluc3RhbGxpbmcgJyR7YXBwUGF0aH0nIGAgK1xuICAgICAgICAgICAgYGJlY2F1c2Ugb2YgdGhlIGluc3VmZmljaWVudCBkZXZpY2Ugc3RvcmFnZSBzcGFjZWApO1xuICAgICAgICAgIGF3YWl0IGNsZWFyQ2FjaGUoKTtcbiAgICAgICAgICBsb2cuaW5mbyhgQ29uc2lkZXIgZGVjcmVhc2luZyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2FjaGVkIGFwcHMgYCArXG4gICAgICAgICAgICBgKGN1cnJlbnRseSAke3RoaXMucmVtb3RlQXBwc0NhY2hlTGltaXR9KSB0byBhdm9pZCBzdWNoIGlzc3VlcyBpbiB0aGUgZnV0dXJlYCk7XG4gICAgICAgICAgY29uc3QgbmV3Q2FjaGVkQXBwUGF0aCA9IGF3YWl0IGNhY2hlQXBwKCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwocG1JbnN0YWxsQ21kQnlSZW1vdGVQYXRoKG5ld0NhY2hlZEFwcFBhdGgpLCBpbnN0YWxsT3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUpO1xuICAgICAgbG9nLndhcm4oYFRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2FjaGluZyAnJHthcHBQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgbG9nLndhcm4oJ0ZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gcHJvY2VkdXJlJyk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlKCk7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwZXJmb3JtQXBwSW5zdGFsbCgpO1xuICAgIGxvZy5pbmZvKGBUaGUgaW5zdGFsbGF0aW9uIG9mICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9JyB0b29rICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgY29uc3QgdHJ1bmNhdGVkT3V0cHV0ID0gKCFfLmlzU3RyaW5nKG91dHB1dCkgfHwgb3V0cHV0Lmxlbmd0aCA8PSAzMDApID9cbiAgICAgIG91dHB1dCA6IGAke291dHB1dC5zdWJzdHIoMCwgMTUwKX0uLi4ke291dHB1dC5zdWJzdHIob3V0cHV0Lmxlbmd0aCAtIDE1MCl9YDtcbiAgICBsb2cuZGVidWcoYEluc3RhbGwgY29tbWFuZCBzdGRvdXQ6ICR7dHJ1bmNhdGVkT3V0cHV0fWApO1xuICAgIGlmICgvXFxbSU5TVEFMTFtBLVpfXStGQUlMRURbQS1aX10rXFxdLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgIGlmICh0aGlzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3Iob3V0cHV0KSkge1xuICAgICAgICBjb25zdCBtc2cgPSBgU2V0ICdhbGxvd1Rlc3RQYWNrYWdlcycgY2FwYWJpbGl0eSB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3QgcGFja2FnZXMgaW5zdGFsbGF0aW9uLmA7XG4gICAgICAgIGxvZy53YXJuKG1zZyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvdXRwdXR9XFxuJHttc2d9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3Iob3V0cHV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIG9uIHNvbWUgc3lzdGVtcyB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFwcCBhbHJlYWR5XG4gICAgLy8gZXhpc3RzXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnSU5TVEFMTF9GQUlMRURfQUxSRUFEWV9FWElTVFMnKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEFwcGxpY2F0aW9uICcke2FwcFBhdGh9JyBhbHJlYWR5IGluc3RhbGxlZC4gQ29udGludWluZy5gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHN0YXRlIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBGdWxsIHBhdGggdG8gdGhlIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gez9zdHJpbmd9IHBrZyAtIFBhY2thZ2UgaWRlbnRpZmllci4gSWYgb21pdHRlZCB0aGVuIHRoZSBzY3JpcHQgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXh0cmFjdCBpdCBvbiBpdHMgb3duXG4gKiBAcmV0dXJucyB7c3RyaW5nfV1PbmUgb2YgYEFQUF9JTlNUQUxMX1NUQVRFYCBjb25zdGFudHNcbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUgKGFwcFBhdGgsIHBrZyA9IG51bGwpIHtcbiAgbGV0IGFwa0luZm8gPSBudWxsO1xuICBpZiAoIXBrZykge1xuICAgIGFwa0luZm8gPSBhd2FpdCB0aGlzLmdldEFwa0luZm8oYXBwUGF0aCk7XG4gICAgcGtnID0gYXBrSW5mby5uYW1lO1xuICB9XG4gIGlmICghcGtnKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBwYWNrYWdlIG5hbWUgb2YgJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgfVxuXG4gIGlmICghYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChwa2cpKSB7XG4gICAgbG9nLmRlYnVnKGBBcHAgJyR7YXBwUGF0aH0nIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG5cbiAgY29uc3Qge3ZlcnNpb25Db2RlOiBwa2dWZXJzaW9uQ29kZSwgdmVyc2lvbk5hbWU6IHBrZ1ZlcnNpb25OYW1lU3RyfSA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZUluZm8ocGtnKTtcbiAgY29uc3QgcGtnVmVyc2lvbk5hbWUgPSBzZW12ZXIudmFsaWQoc2VtdmVyLmNvZXJjZShwa2dWZXJzaW9uTmFtZVN0cikpO1xuICBpZiAoIWFwa0luZm8pIHtcbiAgICBhcGtJbmZvID0gYXdhaXQgdGhpcy5nZXRBcGtJbmZvKGFwcFBhdGgpO1xuICB9XG4gIGNvbnN0IHt2ZXJzaW9uQ29kZTogYXBrVmVyc2lvbkNvZGUsIHZlcnNpb25OYW1lOiBhcGtWZXJzaW9uTmFtZVN0cn0gPSBhcGtJbmZvO1xuICBjb25zdCBhcGtWZXJzaW9uTmFtZSA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGFwa1ZlcnNpb25OYW1lU3RyKSk7XG5cbiAgaWYgKCFfLmlzSW50ZWdlcihhcGtWZXJzaW9uQ29kZSkgfHwgIV8uaXNJbnRlZ2VyKHBrZ1ZlcnNpb25Db2RlKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgcmVhZCB2ZXJzaW9uIGNvZGVzIG9mICcke2FwcFBhdGh9JyBhbmQvb3IgJyR7cGtnfSdgKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpIHx8ICFfLmlzU3RyaW5nKHBrZ1ZlcnNpb25OYW1lKSkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHZlcnNpb24gbmFtZXMgb2YgJyR7YXBwUGF0aH0nIGFuZC9vciAnJHtwa2d9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuVU5LTk9XTjtcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNJbnRlZ2VyKGFwa1ZlcnNpb25Db2RlKSAmJiBfLmlzSW50ZWdlcihwa2dWZXJzaW9uQ29kZSkpIHtcbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPiBhcGtWZXJzaW9uQ29kZSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBjb2RlIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZ3JlYXRlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIGNvZGUgKCR7cGtnVmVyc2lvbkNvZGV9ID4gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRDtcbiAgICB9XG4gICAgLy8gVmVyc2lvbiBjb2RlcyBtaWdodCBub3QgYmUgbWFpbnRhaW5lZC4gQ2hlY2sgdmVyc2lvbiBuYW1lcy5cbiAgICBpZiAocGtnVmVyc2lvbkNvZGUgPT09IGFwa1ZlcnNpb25Db2RlKSB7XG4gICAgICBpZiAoXy5pc1N0cmluZyhhcGtWZXJzaW9uTmFtZSkgJiYgXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkgJiYgc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD49JHthcGtWZXJzaW9uTmFtZX1gKSkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICAgICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+JHthcGtWZXJzaW9uTmFtZX1gKVxuICAgICAgICAgID8gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgICAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKGFwa1ZlcnNpb25OYW1lKSB8fCAhXy5pc1N0cmluZyhwa2dWZXJzaW9uTmFtZSkpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgdmVyc2lvbiBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgJyR7cGtnfScgaXMgZXF1YWwgdG8gYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lICgke3BrZ1ZlcnNpb25Db2RlfSA9PT0gJHthcGtWZXJzaW9uQ29kZX0pYCk7XG4gICAgICAgIHJldHVybiB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoYXBrVmVyc2lvbk5hbWUpICYmIF8uaXNTdHJpbmcocGtnVmVyc2lvbk5hbWUpICYmIHNlbXZlci5zYXRpc2ZpZXMocGtnVmVyc2lvbk5hbWUsIGA+PSR7YXBrVmVyc2lvbk5hbWV9YCkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIGluc3RhbGxlZCAnJHtwa2d9JyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUgKCcke3BrZ1ZlcnNpb25OYW1lfScgPj0gJyR7YXBrVmVyc2lvbk5hbWV9JylgKTtcbiAgICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyhwa2dWZXJzaW9uTmFtZSwgYD4ke2Fwa1ZlcnNpb25OYW1lfWApXG4gICAgICA/IHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRURcbiAgICAgIDogdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBUaGUgaW5zdGFsbGVkICcke3BrZ30nIHBhY2thZ2UgaXMgb2xkZXIgdGhhbiAnJHthcHBQYXRofScgKCR7cGtnVmVyc2lvbkNvZGV9IDwgJHthcGtWZXJzaW9uQ29kZX0gb3IgJyR7cGtnVmVyc2lvbk5hbWV9JyA8ICcke2Fwa1ZlcnNpb25OYW1lfScpJ2ApO1xuICByZXR1cm4gdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9yVXBncmFkZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gU0RDYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmZvcmNlQ3VycmVudEJ1aWxkIFtmYWxzZV0gLSBTZXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGFsd2F5cyBwcmVmZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYnVpbGQgb3ZlciBhbnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBpZGVudGlmaWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3JVcGdyYWRlUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdhc1VuaW5zdGFsbGVkIC0gRXF1YWxzIHRvIGB0cnVlYCBpZiB0aGUgdGFyZ2V0IGFwcCBoYXMgYmVlbiB1bmluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBiZWluZyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7QVBQX0lOU1RBTExfU1RBVEV9IGFwcFN0YXRlIC0gT25lIG9mIGBhZGIuQVBQX0lOU1RBTExfU1RBVEVgIHN0YXRlcywgd2hpY2ggcmVmbGVjdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBiZWZvcmUgYmVpbmcgaW5zdGFsbGVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbCB0aGUgcGFja2FnZSBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvciB1cGdyYWRlIGl0IGlmIGFuIG9sZGVyXG4gKiB2ZXJzaW9uIG9mIHRoZSBzYW1lIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBwYWNrYWdlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuIFRoZSBtZXRob2Qgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGZhc3RlciBpZiBpdCBpcyBzZXQuXG4gKiBAcGFyYW0gez9JbnN0YWxsT3JVcGdyYWRlT3B0aW9uc30gb3B0aW9ucyAtIFNldCBvZiBpbnN0YWxsIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gdW5leHBlY3RlZCBlcnJvciBoYXBwZW5zIGR1cmluZyBpbnN0YWxsLlxuICogQHJldHVybnMge0luc3RhbGxPclVwZ3JhZGVSZXN1bHR9XG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5pbnN0YWxsT3JVcGdyYWRlID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE9yVXBncmFkZSAoYXBwUGF0aCwgcGtnID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICghcGtnKSB7XG4gICAgY29uc3QgYXBrSW5mbyA9IGF3YWl0IHRoaXMuZ2V0QXBrSW5mbyhhcHBQYXRoKTtcbiAgICBwa2cgPSBhcGtJbmZvLm5hbWU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBwa2cpO1xuICBsZXQgd2FzVW5pbnN0YWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgdW5pbnN0YWxsUGFja2FnZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMudW5pbnN0YWxsQXBrKHBrZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cGtnfScgcGFja2FnZSBjYW5ub3QgYmUgdW5pbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgd2FzVW5pbnN0YWxsZWQgPSB0cnVlO1xuICB9O1xuICBzd2l0Y2ggKGFwcFN0YXRlKSB7XG4gICAgY2FzZSB0aGlzLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEluc3RhbGxpbmcgJyR7YXBwUGF0aH0nYCk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IGZhbHNlfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBpZiAoZW5mb3JjZUN1cnJlbnRCdWlsZCkge1xuICAgICAgICBsb2cuaW5mbyhgRG93bmdyYWRpbmcgJyR7cGtnfScgYXMgcmVxdWVzdGVkYCk7XG4gICAgICAgIGF3YWl0IHVuaW5zdGFsbFBhY2thZ2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gZG93bmdyYWRlICcke3BrZ30nYCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgd2FzVW5pbnN0YWxsZWQsXG4gICAgICB9O1xuICAgIGNhc2UgdGhpcy5BUFBfSU5TVEFMTF9TVEFURS5TQU1FX1ZFUlNJT05fSU5TVEFMTEVEOlxuICAgICAgaWYgKGVuZm9yY2VDdXJyZW50QnVpbGQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIG5lZWQgdG8gaW5zdGFsbC91cGdyYWRlICcke2FwcFBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIHdhc1VuaW5zdGFsbGVkLFxuICAgICAgfTtcbiAgICBjYXNlIHRoaXMuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQ6XG4gICAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyB1cGdyYWRlIG9mICcke2FwcFBhdGh9J2ApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGN1cnJlbnQgaW5zdGFsbCBzdGF0ZSBvZiAnJHthcHBQYXRofScgaXMgdW5rbm93bi4gSW5zdGFsbGluZyBhbnl3YXlgKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluc3RhbGwoYXBwUGF0aCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge3JlcGxhY2U6IHRydWV9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgaW5zdGFsbC91cGdyYWRlICcke3BrZ30nIGJlY2F1c2Ugb2YgJyR7ZXJyLm1lc3NhZ2V9Jy4gVHJ5aW5nIGZ1bGwgcmVpbnN0YWxsYCk7XG4gICAgYXdhaXQgdW5pbnN0YWxsUGFja2FnZSgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbChhcHBQYXRoLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7cmVwbGFjZTogZmFsc2V9KSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZCxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCBzdHJpbmcgcmVzb3VyY2VzIGZyb20gdGhlIGdpdmVuIHBhY2thZ2Ugb24gbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrKHMpIHBhY2thZ2UuXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlIHRvIGV4dHJhY3QgdGhlIHJlc291cmNlcyBmb3IuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgdXNlZCBpZiB0aGlzIGVxdWFscyB0byBgbnVsbGAvYHVuZGVmaW5lZGBcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXQgLSBUaGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZm9sZGVyIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB0b1xuICogICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBleHRyYWN0ZWQgZmlsZSB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gQSBtYXBwaW5nIG9iamVjdCwgd2hlcmUgcHJvcGVydGllcyBhcmU6ICdhcGtTdHJpbmdzJywgY29udGFpbmluZ1xuICogICAgICAgICAgICAgICAgICBwYXJzZWQgcmVzb3VyY2UgZmlsZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdCwgYW5kICdsb2NhbFBhdGgnLFxuICogICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBleHRyYWN0ZWQgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5leHRyYWN0U3RyaW5nc0Zyb21BcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0U3RyaW5nc0Zyb21BcGsgKGFwcFBhdGgsIGxhbmd1YWdlLCBvdXQpIHtcbiAgbG9nLmRlYnVnKGBFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBmb3IgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2UgfHwgJ2RlZmF1bHQnfWApO1xuICBjb25zdCBvcmlnaW5hbEFwcFBhdGggPSBhcHBQYXRoO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0TGFuZ3VhZ2VBcGsoYXBwUGF0aCwgbGFuZ3VhZ2UpO1xuICB9XG5cbiAgbGV0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGNvbmZpZ01hcmtlcjtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0KCk7XG5cbiAgICBjb25maWdNYXJrZXIgPSBhd2FpdCBmb3JtYXRDb25maWdNYXJrZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdCwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnKGRlZmF1bHQpJyk7XG5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBbXG4gICAgICAnZCcsICctLXZhbHVlcycsICdyZXNvdXJjZXMnLCBhcHBQYXRoLFxuICAgIF0pO1xuICAgIGFwa1N0cmluZ3MgPSBwYXJzZUFhcHRTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGV4dHJhY3QgcmVzb3VyY2VzIHVzaW5nIGFhcHQuIFRyeWluZyBhYXB0Mi4gJyArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0QWFwdDIoKTtcblxuICAgIGNvbmZpZ01hcmtlciA9IGF3YWl0IGZvcm1hdENvbmZpZ01hcmtlcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0MiwgW1xuICAgICAgICAnZCcsICdjb25maWd1cmF0aW9ucycsIGFwcFBhdGgsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiBfLnVuaXEoc3Rkb3V0LnNwbGl0KG9zLkVPTCkpO1xuICAgIH0sIGxhbmd1YWdlLCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdDIsIFtcbiAgICAgICAgJ2QnLCAncmVzb3VyY2VzJywgYXBwUGF0aCxcbiAgICAgIF0pO1xuICAgICAgYXBrU3RyaW5ncyA9IHBhcnNlQWFwdDJTdHJpbmdzKHN0ZG91dCwgY29uZmlnTWFya2VyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBleHRyYWN0IHJlc291cmNlcyBmcm9tICcke29yaWdpbmFsQXBwUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KGFwa1N0cmluZ3MpKSB7XG4gICAgbG9nLndhcm4oYE5vIHN0cmluZ3MgaGF2ZSBiZWVuIGZvdW5kIGluICcke29yaWdpbmFsQXBwUGF0aH0nIHJlc291cmNlcyBgICtcbiAgICAgIGBmb3IgJyR7Y29uZmlnTWFya2VyIHx8ICdkZWZhdWx0J30nIGNvbmZpZ3VyYXRpb25gKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCAke18ua2V5cyhhcGtTdHJpbmdzKS5sZW5ndGh9IHN0cmluZ3MgZnJvbSBgICtcbiAgICAgIGAnJHtvcmlnaW5hbEFwcFBhdGh9JyByZXNvdXJjZXMgZm9yICcke2NvbmZpZ01hcmtlciB8fCAnZGVmYXVsdCd9JyBjb25maWd1cmF0aW9uYCk7XG4gIH1cblxuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUob3V0LCAnc3RyaW5ncy5qc29uJyk7XG4gIGF3YWl0IG1rZGlycChvdXQpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxQYXRoLCBKU09OLnN0cmluZ2lmeShhcGtTdHJpbmdzLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIHJldHVybiB7YXBrU3RyaW5ncywgbG9jYWxQYXRofTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsYW5ndWFnZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBsYW5ndWFnZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmdldERldmljZUxhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTGFuZ3VhZ2UgKCkge1xuICBsZXQgbGFuZ3VhZ2U7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMYW5ndWFnZSgpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGFuZ3VhZ2UgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkuc3BsaXQoJy0nKVswXTtcbiAgfVxuICByZXR1cm4gbGFuZ3VhZ2U7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY291bnRyeSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGRldmljZSBjb3VudHJ5LlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUNvdW50cnkgKCkge1xuICAvLyB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgaW4gQVBJIDwgMjNcbiAgbGV0IGNvdW50cnkgPSBhd2FpdCB0aGlzLmdldERldmljZVN5c0NvdW50cnkoKTtcbiAgaWYgKCFjb3VudHJ5KSB7XG4gICAgY291bnRyeSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkoKTtcbiAgfVxuICByZXR1cm4gY291bnRyeTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiBkZXZpY2UgbG9jYWxlLlxuICovXG5hcGtVdGlsc01ldGhvZHMuZ2V0RGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlTG9jYWxlICgpIHtcbiAgLy8gdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGluIEFQSSA+PSAyM1xuICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5nZXREZXZpY2VTeXNMb2NhbGUoKTtcbiAgaWYgKCFsb2NhbGUpIHtcbiAgICBsb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZVByb2R1Y3RMb2NhbGUoKTtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUgbG9jYWxlIGlzIGVuLVVTLCBmb3IgZXhhbXBsZS5cbiAqIFRoaXMgbWV0aG9kIGNhbGwgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5LCBzbywgcGxlYXNlIHVzZSBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgYXMgcG9zc2libGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIE5hbWVzIG9mIHRoZSBkZXZpY2UgbGFuZ3VhZ2UgYW5kIHRoZSBjb3VudHJ5IGNvbm5lY3RlZCB3aXRoIGAtYC4gZS5nLiBlbi1VUy5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxvY2FsZSAobG9jYWxlKSB7XG4gIGNvbnN0IHZhbGlkYXRlTG9jYWxlID0gbmV3IFJlZ0V4cCgvW2EtekEtWl0rLVthLXpBLVowLTldKy8pO1xuICBpZiAoIXZhbGlkYXRlTG9jYWxlLnRlc3QobG9jYWxlKSkge1xuICAgIGxvZy53YXJuKGBzZXREZXZpY2VMb2NhbGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IGVuLVVTIG9yIGphLUpQYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNwbGl0X2xvY2FsZSA9IGxvY2FsZS5zcGxpdCgnLScpO1xuICBhd2FpdCB0aGlzLnNldERldmljZUxhbmd1YWdlQ291bnRyeShzcGxpdF9sb2NhbGVbMF0sIHNwbGl0X2xvY2FsZVsxXSk7XG59O1xuXG4vKipcbiAqIE1ha2Ugc3VyZSBjdXJyZW50IGRldmljZSBsb2NhbGUgaXMgZXhwZWN0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgY3VycmVudCBsb2NhbGUgaXMgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXMgYXJndW1lbnRzLCByZXR1cm4gdHJ1ZS5cbiAqL1xuYXBrVXRpbHNNZXRob2RzLmVuc3VyZUN1cnJlbnRMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVDdXJyZW50TG9jYWxlIChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBjb25zdCBoYXNMYW5ndWFnZSA9IF8uaXNTdHJpbmcobGFuZ3VhZ2UpO1xuICBjb25zdCBoYXNDb3VudHJ5ID0gXy5pc1N0cmluZyhjb3VudHJ5KTtcblxuICBpZiAoIWhhc0xhbmd1YWdlICYmICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oJ2Vuc3VyZUN1cnJlbnRMb2NhbGUgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGdldCBsb3dlciBjYXNlIHZlcnNpb25zIG9mIHRoZSBzdHJpbmdzXG4gIGxhbmd1YWdlID0gKGxhbmd1YWdlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICBjb3VudHJ5ID0gKGNvdW50cnkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgICAgICBsZXQgY3VyTGFuZ3VhZ2UsIGN1ckNvdW50cnk7XG4gICAgICAgIGlmIChoYXNMYW5ndWFnZSkge1xuICAgICAgICAgIGN1ckxhbmd1YWdlID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlTGFuZ3VhZ2UoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAoIWhhc0NvdW50cnkgJiYgbGFuZ3VhZ2UgPT09IGN1ckxhbmd1YWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0NvdW50cnkpIHtcbiAgICAgICAgICBjdXJDb3VudHJ5ID0gKGF3YWl0IHRoaXMuZ2V0RGV2aWNlQ291bnRyeSgpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmICghaGFzTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gY3VyTGFuZ3VhZ2UgJiYgY291bnRyeSA9PT0gY3VyQ291bnRyeSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJMb2NhbGUgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VMb2NhbGUoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gemgtaGFucy1jbiA6IHpoLWNuXG4gICAgICAgIGNvbnN0IGxvY2FsZUNvZGUgPSBzY3JpcHQgPyBgJHtsYW5ndWFnZX0tJHtzY3JpcHQudG9Mb3dlckNhc2UoKX0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG5cbiAgICAgICAgaWYgKGxvY2FsZUNvZGUgPT09IGN1ckxvY2FsZSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgUmVxdWVzdGVkIGxvY2FsZSBpcyBlcXVhbCB0byBjdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSdgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IsIHJlc3RhcnQgYWRiIGFuZCByZXRyeVxuICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gY2hlY2sgZGV2aWNlIGxvY2FsaXphdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqL1xuYXBrVXRpbHNNZXRob2RzLnNldERldmljZUxhbmd1YWdlQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZUxhbmd1YWdlQ291bnRyeSAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgbGV0IGhhc0xhbmd1YWdlID0gbGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSk7XG4gIGxldCBoYXNDb3VudHJ5ID0gY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpO1xuICBpZiAoIWhhc0xhbmd1YWdlIHx8ICFoYXNDb3VudHJ5KSB7XG4gICAgbG9nLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBhbmQgY291bnRyeSBhdCBsZWFzdGApO1xuICAgIGxvZy53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG5cbiAgbGFuZ3VhZ2UgPSAobGFuZ3VhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvdW50cnkgPSAoY291bnRyeSB8fCAnJykudG9VcHBlckNhc2UoKTtcblxuICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgIGxldCBjdXJMYW5ndWFnZSA9IChhd2FpdCB0aGlzLmdldERldmljZUxhbmd1YWdlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGN1ckNvdW50cnkgPSAoYXdhaXQgdGhpcy5nZXREZXZpY2VDb3VudHJ5KCkpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAobGFuZ3VhZ2UgIT09IGN1ckxhbmd1YWdlIHx8IGNvdW50cnkgIT09IGN1ckNvdW50cnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcChsYW5ndWFnZSwgY291bnRyeSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBjdXJMb2NhbGUgPSBhd2FpdCB0aGlzLmdldERldmljZUxvY2FsZSgpO1xuXG4gICAgLy8gemgtSGFucy1DTiA6IHpoLUNOXG4gICAgY29uc3QgbG9jYWxlQ29kZSA9IHNjcmlwdCA/IGAke2xhbmd1YWdlfS0ke3NjcmlwdH0tJHtjb3VudHJ5fWAgOiBgJHtsYW5ndWFnZX0tJHtjb3VudHJ5fWA7XG4gICAgbG9nLmRlYnVnKGBDdXJyZW50IGxvY2FsZTogJyR7Y3VyTG9jYWxlfSc7IHJlcXVlc3RlZCBsb2NhbGU6ICcke2xvY2FsZUNvZGV9J2ApO1xuICAgIGlmIChsb2NhbGVDb2RlLnRvTG93ZXJDYXNlKCkgIT09IGN1ckxvY2FsZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwcEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFja2FnZSBuYW1lLCBmb3IgZXhhbXBsZSAnY29tLmFjbWUuYXBwJy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIFZlcnNpb24gbmFtZSwgZm9yIGV4YW1wbGUgJzEuMCcuXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIHBhY2thZ2UgaW5mbyBmcm9tIGxvY2FsIGFwayBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGZ1bGwgcGF0aCB0byBleGlzdGluZyAuYXBrKHMpIHBhY2thZ2Ugb24gdGhlIGxvY2FsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3lzdGVtLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRBcGtJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBrSW5mbyAoYXBwUGF0aCkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHBQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgcGF0aCAke2FwcFBhdGh9IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gIH1cblxuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYXBrUmVhZGVyID0gYXdhaXQgQXBrUmVhZGVyLm9wZW4oYXBwUGF0aCk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBhcGtSZWFkZXIucmVhZE1hbmlmZXN0KCk7XG4gICAgY29uc3Qge3BrZywgdmVyc2lvbk5hbWUsIHZlcnNpb25Db2RlfSA9IHBhcnNlTWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwa2csXG4gICAgICB2ZXJzaW9uQ29kZSxcbiAgICAgIHZlcnNpb25OYW1lLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZS5tZXNzYWdlfScgd2hpbGUgZ2V0dGluZyBiYWRnaW5nIGluZm9gKTtcbiAgfVxuICByZXR1cm4ge307XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFja2FnZSBpbmZvIGZyb20gdGhlIGluc3RhbGxlZCBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlLlxuICogQHJldHVybiB7P0FwcEluZm99IFRoZSBwYXJzZWQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uXG4gKi9cbmFwa1V0aWxzTWV0aG9kcy5nZXRQYWNrYWdlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VJbmZvIChwa2cpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIHBhY2thZ2UgaW5mbyBmb3IgJyR7cGtnfSdgKTtcbiAgbGV0IHJlc3VsdCA9IHtuYW1lOiBwa2d9O1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCB2ZXJzaW9uTmFtZU1hdGNoID0gbmV3IFJlZ0V4cCgvdmVyc2lvbk5hbWU9KFtcXGQrLl0rKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbk5hbWVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25OYW1lID0gdmVyc2lvbk5hbWVNYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbkNvZGVNYXRjaCA9IG5ldyBSZWdFeHAoL3ZlcnNpb25Db2RlPShcXGQrKS8pLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAodmVyc2lvbkNvZGVNYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb25Db2RlID0gcGFyc2VJbnQodmVyc2lvbkNvZGVNYXRjaFsxXSwgMTApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJyR7ZXJyLm1lc3NhZ2V9JyB3aGlsZSBkdW1waW5nIHBhY2thZ2UgaW5mb2ApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5hcGtVdGlsc01ldGhvZHMucHVsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxBcGsgKHBrZywgdG1wRGlyKSB7XG4gIGNvbnN0IHBrZ1BhdGggPSAoYXdhaXQgdGhpcy5hZGJFeGVjKFsnc2hlbGwnLCAncG0nLCAncGF0aCcsIHBrZ10pKS5yZXBsYWNlKCdwYWNrYWdlOicsICcnKTtcbiAgY29uc3QgdG1wQXBwID0gcGF0aC5yZXNvbHZlKHRtcERpciwgYCR7cGtnfS5hcGtgKTtcbiAgYXdhaXQgdGhpcy5wdWxsKHBrZ1BhdGgsIHRtcEFwcCk7XG4gIGxvZy5kZWJ1ZyhgUHVsbGVkIGFwcCBmb3IgcGFja2FnZSAnJHtwa2d9JyB0byAnJHt0bXBBcHB9J2ApO1xuICByZXR1cm4gdG1wQXBwO1xufTtcblxuZXhwb3J0IHsgUkVNT1RFX0NBQ0hFX1JPT1QgfTtcbmV4cG9ydCBkZWZhdWx0IGFwa1V0aWxzTWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2Fway11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|