appium-chromedriver 4.27.3 → 5.0.1
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/build/lib/chromedriver.js +30 -22
- package/build/lib/install.js +5 -5
- package/build/lib/protocol-helpers.js +4 -4
- package/build/lib/storage-client.js +22 -22
- package/build/lib/utils.js +10 -9
- package/config/mapping.json +9 -0
- package/lib/chromedriver.js +13 -6
- package/lib/install.js +1 -1
- package/lib/protocol-helpers.js +1 -1
- package/lib/storage-client.js +2 -2
- package/lib/utils.js +1 -1
- package/package.json +15 -8
- package/build/install-npm.js +0 -82
|
@@ -11,11 +11,11 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _events = _interopRequireDefault(require("events"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
15
15
|
|
|
16
16
|
var _child_process = _interopRequireDefault(require("child_process"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _support = require("@appium/support");
|
|
19
19
|
|
|
20
20
|
var _asyncbox = require("asyncbox");
|
|
21
21
|
|
|
@@ -37,7 +37,7 @@ var _storageClient = _interopRequireDefault(require("./storage-client"));
|
|
|
37
37
|
|
|
38
38
|
var _protocolHelpers = require("./protocol-helpers");
|
|
39
39
|
|
|
40
|
-
const log =
|
|
40
|
+
const log = _support.logger.getLogger('Chromedriver');
|
|
41
41
|
|
|
42
42
|
const NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;
|
|
43
43
|
const DEFAULT_HOST = '127.0.0.1';
|
|
@@ -81,7 +81,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
81
81
|
this.bundleId = bundleId;
|
|
82
82
|
this.executableVerified = false;
|
|
83
83
|
this.state = Chromedriver.STATE_STOPPED;
|
|
84
|
-
this.jwproxy = new
|
|
84
|
+
this.jwproxy = new _baseDriver.JWProxy({
|
|
85
85
|
server: this.proxyHost,
|
|
86
86
|
port: this.proxyPort
|
|
87
87
|
});
|
|
@@ -93,7 +93,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
93
93
|
}) : null;
|
|
94
94
|
this.details = details;
|
|
95
95
|
this.capabilities = {};
|
|
96
|
-
this.desiredProtocol =
|
|
96
|
+
this.desiredProtocol = _baseDriver.PROTOCOLS.MJSONWP;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
async getDriversMapping() {
|
|
@@ -102,12 +102,12 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
102
102
|
if (this.mappingPath) {
|
|
103
103
|
log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);
|
|
104
104
|
|
|
105
|
-
if (!(await
|
|
105
|
+
if (!(await _support.fs.exists(this.mappingPath))) {
|
|
106
106
|
log.warn(`No file found at '${this.mappingPath}'`);
|
|
107
107
|
log.info('Defaulting to the static Chromedriver->Chrome mapping');
|
|
108
108
|
} else {
|
|
109
109
|
try {
|
|
110
|
-
mapping = JSON.parse(await
|
|
110
|
+
mapping = JSON.parse(await _support.fs.readFile(this.mappingPath, 'utf8'));
|
|
111
111
|
} catch (err) {
|
|
112
112
|
log.warn(`Error parsing mapping from '${this.mappingPath}': ${err.message}`);
|
|
113
113
|
log.info('Defaulting to the static Chromedriver->Chrome mapping');
|
|
@@ -131,8 +131,8 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
async getChromedrivers(mapping) {
|
|
134
|
-
const executables = await
|
|
135
|
-
log.debug(`Found ${
|
|
134
|
+
const executables = await _support.fs.glob(`${this.executableDir}/*`);
|
|
135
|
+
log.debug(`Found ${_support.util.pluralize('executable', executables.length, true)} ` + `in '${this.executableDir}'`);
|
|
136
136
|
const cds = (await (0, _asyncbox.asyncmap)(executables, async function mapChromedriver(executable) {
|
|
137
137
|
const logError = ({
|
|
138
138
|
message,
|
|
@@ -283,9 +283,9 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
283
283
|
async updateDriversMapping(newMapping) {
|
|
284
284
|
let shouldUpdateStaticMapping = true;
|
|
285
285
|
|
|
286
|
-
if (await
|
|
286
|
+
if (await _support.fs.exists(this.mappingPath)) {
|
|
287
287
|
try {
|
|
288
|
-
await
|
|
288
|
+
await _support.fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');
|
|
289
289
|
shouldUpdateStaticMapping = false;
|
|
290
290
|
} catch (e) {
|
|
291
291
|
log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` + `This may reduce the performance of further executions. Original error: ${e.message}`);
|
|
@@ -357,7 +357,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
if (!_lodash.default.isEmpty(missingVersions)) {
|
|
360
|
-
log.info(`Found ${
|
|
360
|
+
log.info(`Found ${_support.util.pluralize('Chromedriver', _lodash.default.size(missingVersions), true)}, ` + `which ${_lodash.default.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` + JSON.stringify(missingVersions));
|
|
361
361
|
await this.updateDriversMapping(Object.assign(mapping, missingVersions));
|
|
362
362
|
}
|
|
363
363
|
|
|
@@ -420,7 +420,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
420
420
|
}
|
|
421
421
|
|
|
422
422
|
const binPath = matchingDrivers[0].executable;
|
|
423
|
-
log.debug(`Found ${
|
|
423
|
+
log.debug(`Found ${_support.util.pluralize('executable', matchingDrivers.length, true)} ` + `capable of automating Chrome '${chromeVersion}'.\nChoosing the most recent, '${binPath}'.`);
|
|
424
424
|
log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' + 'desired capability.');
|
|
425
425
|
return binPath;
|
|
426
426
|
} while (true);
|
|
@@ -433,7 +433,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
433
433
|
this.chromedriver = this.useSystemExecutable ? await (0, _utils.getChromedriverBinaryPath)() : await this.getCompatibleChromedriver();
|
|
434
434
|
}
|
|
435
435
|
|
|
436
|
-
if (!(await
|
|
436
|
+
if (!(await _support.fs.exists(this.chromedriver))) {
|
|
437
437
|
throw new Error(`Trying to use a chromedriver binary at the path ` + `${this.chromedriver}, but it doesn't exist!`);
|
|
438
438
|
}
|
|
439
439
|
|
|
@@ -445,18 +445,18 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
445
445
|
const coercedVersion = _semver.default.coerce(cdVersion);
|
|
446
446
|
|
|
447
447
|
if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {
|
|
448
|
-
log.debug(`Chromedriver v. ${cdVersion} does not fully support ${
|
|
448
|
+
log.debug(`Chromedriver v. ${cdVersion} does not fully support ${_baseDriver.PROTOCOLS.W3C} protocol. ` + `Defaulting to ${_baseDriver.PROTOCOLS.MJSONWP}`);
|
|
449
449
|
return;
|
|
450
450
|
}
|
|
451
451
|
|
|
452
452
|
const chromeOptions = (0, _protocolHelpers.getCapValue)(this.capabilities, 'chromeOptions', {});
|
|
453
453
|
|
|
454
454
|
if (chromeOptions.w3c === false) {
|
|
455
|
-
log.info(`Chromedriver v. ${cdVersion} supports ${
|
|
455
|
+
log.info(`Chromedriver v. ${cdVersion} supports ${_baseDriver.PROTOCOLS.W3C} protocol, ` + `but ${_baseDriver.PROTOCOLS.MJSONWP} one has been explicitly requested`);
|
|
456
456
|
return;
|
|
457
457
|
}
|
|
458
458
|
|
|
459
|
-
this.desiredProtocol =
|
|
459
|
+
this.desiredProtocol = _baseDriver.PROTOCOLS.W3C;
|
|
460
460
|
this.capabilities = (0, _protocolHelpers.toW3cCapNames)(this.capabilities);
|
|
461
461
|
}
|
|
462
462
|
|
|
@@ -472,7 +472,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
472
472
|
this.changeState(Chromedriver.STATE_STARTING);
|
|
473
473
|
}
|
|
474
474
|
|
|
475
|
-
const args = [
|
|
475
|
+
const args = [`--port=${this.proxyPort}`];
|
|
476
476
|
|
|
477
477
|
if (this.adb && this.adb.adbPort) {
|
|
478
478
|
args.push(`--adb-port=${this.adb.adbPort}`);
|
|
@@ -554,12 +554,20 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
554
554
|
let message = '';
|
|
555
555
|
|
|
556
556
|
if (e.message.includes('Chrome version must be')) {
|
|
557
|
-
|
|
557
|
+
var _$exec;
|
|
558
|
+
|
|
559
|
+
message += 'Unable to automate Chrome version because it is not supported by this version of Chromedriver.\n';
|
|
558
560
|
|
|
559
561
|
if (webviewVersion) {
|
|
560
562
|
message += `Chrome version on the device: ${webviewVersion}\n`;
|
|
561
563
|
}
|
|
562
564
|
|
|
565
|
+
const versionsSupportedByDriver = ((_$exec = /Chrome version must be (.+)/.exec(e.message)) === null || _$exec === void 0 ? void 0 : _$exec[1]) || '';
|
|
566
|
+
|
|
567
|
+
if (versionsSupportedByDriver) {
|
|
568
|
+
message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\n`;
|
|
569
|
+
}
|
|
570
|
+
|
|
563
571
|
message += `Visit '${CHROMEDRIVER_TUTORIAL}' to troubleshoot the problem.\n`;
|
|
564
572
|
}
|
|
565
573
|
|
|
@@ -609,7 +617,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
609
617
|
}
|
|
610
618
|
|
|
611
619
|
async startSession() {
|
|
612
|
-
const sessionCaps = this.desiredProtocol ===
|
|
620
|
+
const sessionCaps = this.desiredProtocol === _baseDriver.PROTOCOLS.W3C ? {
|
|
613
621
|
capabilities: {
|
|
614
622
|
alwaysMatch: this.capabilities
|
|
615
623
|
}
|
|
@@ -655,7 +663,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
655
663
|
}
|
|
656
664
|
|
|
657
665
|
async killAll() {
|
|
658
|
-
let cmd =
|
|
666
|
+
let cmd = _support.system.isWindows() ? `wmic process where "commandline like '%chromedriver.exe%--port=${this.proxyPort}%'" delete` : `pkill -15 -f "${this.chromedriver}.*--port=${this.proxyPort}"`;
|
|
659
667
|
log.debug(`Killing any old chromedrivers, running: ${cmd}`);
|
|
660
668
|
|
|
661
669
|
try {
|
|
@@ -716,4 +724,4 @@ var _default = Chromedriver;
|
|
|
716
724
|
exports.default = _default;require('source-map-support').install();
|
|
717
725
|
|
|
718
726
|
|
|
719
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaHJvbWVkcml2ZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04iLCJERUZBVUxUX0hPU1QiLCJNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUIiwiREVGQVVMVF9QT1JUIiwiQ0hST01FX0JVTkRMRV9JRCIsIldFQlZJRVdfU0hFTExfQlVORExFX0lEIiwiV0VCVklFV19CVU5ETEVfSURTIiwiQ0hST01FRFJJVkVSX1RVVE9SSUFMIiwiVkVSU0lPTl9QQVRURVJOIiwiQ0RfVkVSU0lPTl9USU1FT1VUIiwiQ2hyb21lZHJpdmVyIiwiZXZlbnRzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiaG9zdCIsInBvcnQiLCJ1c2VTeXN0ZW1FeGVjdXRhYmxlIiwiZXhlY3V0YWJsZSIsImV4ZWN1dGFibGVEaXIiLCJidW5kbGVJZCIsIm1hcHBpbmdQYXRoIiwiY21kQXJncyIsImFkYiIsInZlcmJvc2UiLCJsb2dQYXRoIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJkZXRhaWxzIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJvYyIsImNocm9tZWRyaXZlciIsImV4ZWN1dGFibGVWZXJpZmllZCIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsImp3cHJveHkiLCJKV1Byb3h5Iiwic2VydmVyIiwic3RvcmFnZUNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjaHJvbWVkcml2ZXJEaXIiLCJjYXBhYmlsaXRpZXMiLCJkZXNpcmVkUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiZ2V0RHJpdmVyc01hcHBpbmciLCJtYXBwaW5nIiwiXyIsImNsb25lRGVlcCIsIkNIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyIsImRlYnVnIiwiZnMiLCJleGlzdHMiLCJ3YXJuIiwiaW5mbyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwiZXJyIiwibWVzc2FnZSIsImNkVmVyc2lvbiIsImNocm9tZVZlcnNpb24iLCJ0b1BhaXJzIiwiY29lcmNlZFZlcnNpb24iLCJzZW12ZXIiLCJjb2VyY2UiLCJ2ZXJzaW9uIiwiZ2V0Q2hyb21lZHJpdmVycyIsImV4ZWN1dGFibGVzIiwiZ2xvYiIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJtYXBDaHJvbWVkcml2ZXIiLCJsb2dFcnJvciIsInN0ZG91dCIsInN0ZGVyciIsImVyck1zZyIsInBhdGgiLCJiYXNlbmFtZSIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwiZXhlYyIsIm1pbkNocm9tZVZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiZmlsdGVyIiwiY2QiLCJzb3J0IiwiYSIsImIiLCJpc0VtcHR5IiwiZ2V0Q2hyb21lVmVyc2lvbiIsIkJyb3dzZXIiLCJ2ZXJzaW9uTWF0Y2giLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwidXBkYXRlRHJpdmVyc01hcHBpbmciLCJuZXdNYXBwaW5nIiwic2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImUiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwidzNjIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwic2Vzc2lvbklkIiwiU1RBVEVfT05MSU5FIiwicmVzdGFydCIsImNocm9tZWRyaXZlclN0b3BwZWQiLCJnZXRTdGF0dXMiLCJjb21tYW5kIiwic2Vzc2lvbkNhcHMiLCJhbHdheXNNYXRjaCIsImRlc2lyZWRDYXBhYmlsaXRpZXMiLCJlbWl0U3RhdGVzIiwiRVZFTlRfQ0hBTkdFRCIsInNlbmRDb21tYW5kIiwidXJsIiwibWV0aG9kIiwiYm9keSIsInByb3h5UmVxIiwicmVxIiwicmVzIiwicHJveHlSZXFSZXMiLCJjbWQiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJCIiwicHJvbWlzaWZ5IiwiY3AiLCJ1ZGlkSW5kZXgiLCJkZWZhdWx0QXJncyIsImZpbmRJbmRleCIsIml0ZW0iLCJ1ZGlkIiwiY29ubiIsImdldEZvcndhcmRMaXN0IiwicGFyYW1zIiwicmVtb3ZlUG9ydEZvcndhcmQiLCJyZXBsYWNlIiwiaGFzV29ya2luZ1dlYnZpZXciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7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aUJBQWlCLEdBQUk7QUFHekIsUUFBSTtBQUNGLFlBQU0sS0FBSzFLLE9BQUwsQ0FBYTRJLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsS0FBN0IsQ0FBTjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBSEQsQ0FHRSxPQUFPdkUsQ0FBUCxFQUFVO0FBQ1YsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUF4bkI0Qzs7O0FBMm5CL0MvRixZQUFZLENBQUMrSixXQUFiLEdBQTJCLG9CQUEzQjtBQUNBL0osWUFBWSxDQUFDMkssYUFBYixHQUE2QixjQUE3QjtBQUNBM0ssWUFBWSxDQUFDeUIsYUFBYixHQUE2QixTQUE3QjtBQUNBekIsWUFBWSxDQUFDc0ksY0FBYixHQUE4QixVQUE5QjtBQUNBdEksWUFBWSxDQUFDa0ssWUFBYixHQUE0QixRQUE1QjtBQUNBbEssWUFBWSxDQUFDd0osY0FBYixHQUE4QixVQUE5QjtBQUNBeEosWUFBWSxDQUFDeUosZ0JBQWIsR0FBZ0MsWUFBaEM7ZUFHZXpKLFkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBKV1Byb3h5LCBQUk9UT0NPTFMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbG9nZ2VyLCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgYXN5bmNtYXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGdldENocm9tZVZlcnNpb24sIGdldENocm9tZWRyaXZlckRpciwgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLFxuICBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoLCBDRF9DRE4sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNvbXBhcmVWZXJzaW9ucyBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlcicpO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgQ0hST01FRFJJVkVSX1RVVE9SSUFMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vd3JpdGluZy1ydW5uaW5nLWFwcGl1bS93ZWIvY2hyb21lZHJpdmVyLm1kJztcbmNvbnN0IFZFUlNJT05fUEFUVEVSTiA9IC8oW1xcZC5dKykvO1xuXG5jb25zdCBDRF9WRVJTSU9OX1RJTUVPVVQgPSA1MDAwO1xuXG5jbGFzcyBDaHJvbWVkcml2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICAgIHVzZVN5c3RlbUV4ZWN1dGFibGUgPSBmYWxzZSxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBleGVjdXRhYmxlRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICBidW5kbGVJZCxcbiAgICAgIG1hcHBpbmdQYXRoLFxuICAgICAgY21kQXJncyxcbiAgICAgIGFkYixcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dQYXRoLFxuICAgICAgZGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgICBkZXRhaWxzLFxuICAgICAgaXNBdXRvZG93bmxvYWRFbmFibGVkID0gZmFsc2UsXG4gICAgfSA9IGFyZ3M7XG5cbiAgICB0aGlzLnByb3h5SG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wcm94eVBvcnQgPSBwb3J0O1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICAgIHRoaXMuY21kQXJncyA9IGNtZEFyZ3M7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGUgPSB1c2VTeXN0ZW1FeGVjdXRhYmxlO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gZXhlY3V0YWJsZTtcbiAgICB0aGlzLmV4ZWN1dGFibGVEaXIgPSBleGVjdXRhYmxlRGlyO1xuICAgIHRoaXMubWFwcGluZ1BhdGggPSBtYXBwaW5nUGF0aDtcbiAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlID0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQ7XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkoe3NlcnZlcjogdGhpcy5wcm94eUhvc3QsIHBvcnQ6IHRoaXMucHJveHlQb3J0fSk7XG4gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTtcbiAgICB0aGlzLmxvZ1BhdGggPSBsb2dQYXRoO1xuICAgIHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2sgPSAhIWRpc2FibGVCdWlsZENoZWNrO1xuICAgIHRoaXMuc3RvcmFnZUNsaWVudCA9IGlzQXV0b2Rvd25sb2FkRW5hYmxlZFxuICAgICAgPyBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7IGNocm9tZWRyaXZlckRpcjogdGhpcy5leGVjdXRhYmxlRGlyIH0pXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHt9O1xuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLk1KU09OV1A7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gdXNlIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICAgIGxvZy53YXJuKGBObyBmaWxlIGZvdW5kIGF0ICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgICBsb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKGBFcnJvciBwYXJzaW5nIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgbG9nLmluZm8oJ0RlZmF1bHRpbmcgdG8gdGhlIHN0YXRpYyBDaHJvbWVkcml2ZXItPkNocm9tZSBtYXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmluZm8oYCcke2Nocm9tZVZlcnNpb259JyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIG51bWJlci4gU2tpcHBpbmcgaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH1cblxuICBhc3luYyBnZXRDaHJvbWVkcml2ZXJzIChtYXBwaW5nKSB7XG4gICAgLy8gZ28gdGhyb3VnaCB0aGUgdmVyc2lvbnMgYXZhaWxhYmxlXG4gICAgY29uc3QgZXhlY3V0YWJsZXMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZXhlY3V0YWJsZURpcn0vKmApO1xuICAgIGxvZy5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnZXhlY3V0YWJsZScsIGV4ZWN1dGFibGVzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgYGluICcke3RoaXMuZXhlY3V0YWJsZURpcn0nYCk7XG4gICAgY29uc3QgY2RzID0gKGF3YWl0IGFzeW5jbWFwKGV4ZWN1dGFibGVzLCBhc3luYyBmdW5jdGlvbiBtYXBDaHJvbWVkcml2ZXIgKGV4ZWN1dGFibGUpIHtcbiAgICAgIGNvbnN0IGxvZ0Vycm9yID0gKHttZXNzYWdlLCBzdGRvdXQgPSBudWxsLCBzdGRlcnIgPSBudWxsfSkgPT4ge1xuICAgICAgICBsZXQgZXJyTXNnID0gYENhbm5vdCByZXRyaWV2ZSB2ZXJzaW9uIG51bWJlciBmcm9tICcke3BhdGguYmFzZW5hbWUoZXhlY3V0YWJsZSl9JyBDaHJvbWVkcml2ZXIgYmluYXJ5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIGl0IHJldHVybnMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZyBpbiByZXNwb25zZSB0byAnLS12ZXJzaW9uJyBjb21tYW5kIGxpbmUgYXJndW1lbnQuICR7bWVzc2FnZX1gO1xuICAgICAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICAgICAgZXJyTXNnICs9IGBcXG5TdGRvdXQ6ICR7c3Rkb3V0fWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3RkZXJyOiAke3N0ZGVycn1gO1xuICAgICAgICB9XG4gICAgICAgIGxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBDaHJvbWVkcml2ZXJzIHdlcmUgZm91bmQgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICAgIHJldHVybiBjZHM7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgZXhlY3V0YWJsZXMgd2VyZSBmb3VuZDpgKTtcbiAgICBmb3IgKGNvbnN0IGNkIG9mIGNkcykge1xuICAgICAgbG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgbG9nLmRlYnVnKGBCcm93c2VyIHZlcnNpb24gaW4gdGhlIHN1cHBsaWVkIGRldGFpbHM6ICR7dGhpcy5kZXRhaWxzPy5pbmZvPy5Ccm93c2VyfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBWRVJTSU9OX1BBVFRFUk4uZXhlYyh0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXIpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uTWF0Y2hbMV0pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBjb2VyY2VkVmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY2hyb21lVmVyc2lvbjtcblxuICAgIC8vIGluIGNhc2Ugb2YgV2ViVmlldyBCcm93c2VyIFRlc3Rlciwgc2ltcGx5IHRyeSB0byBmaW5kIHRoZSB1bmRlcmx5aW5nIHdlYnZpZXdcbiAgICBpZiAodGhpcy5idW5kbGVJZCA9PT0gV0VCVklFV19TSEVMTF9CVU5ETEVfSUQpIHtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIHJldHVybiBzZW12ZXIuY29lcmNlKGNocm9tZVZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBvbiBBbmRyb2lkIDctOSB3ZWJ2aWV3cyBhcmUgYmFja2VkIGJ5IHRoZSBtYWluIENocm9tZSwgbm90IHRoZSBzeXN0ZW0gd2Vidmlld1xuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAgICAgaWYgKGFwaUxldmVsID49IDI0ICYmIGFwaUxldmVsIDw9IDI4ICYmXG4gICAgICAgICAgW1dFQlZJRVdfU0hFTExfQlVORExFX0lELCAuLi5XRUJWSUVXX0JVTkRMRV9JRFNdLmluY2x1ZGVzKHRoaXMuYnVuZGxlSWQpKSB7XG4gICAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyeSBvdXQgd2Vidmlld3Mgd2hlbiBubyBidW5kbGUgaWQgaXMgc2VudCBpblxuICAgIGlmICghdGhpcy5idW5kbGVJZCkge1xuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZ2VuZXJpYyBDaHJvbWUgYnVuZGxlXG4gICAgICB0aGlzLmJ1bmRsZUlkID0gQ0hST01FX0JVTkRMRV9JRDtcblxuICAgICAgLy8gd2UgaGF2ZSBhIHdlYnZpZXcgb2Ygc29tZSBzb3J0LCBzbyB0cnkgdG8gZmluZCB0aGUgYnVuZGxlIHZlcnNpb25cbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjaHJvbWUgdmVyc2lvbiwgaXQgbXVzdCBub3QgYmUgYSB3ZWJ2aWV3XG4gICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICBjaHJvbWVWZXJzaW9uID0gYXdhaXQgZ2V0Q2hyb21lVmVyc2lvbih0aGlzLmFkYiwgdGhpcy5idW5kbGVJZCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIGl0IGlzIHNlbXZlciwgc28gbGF0ZXIgY2hlY2tzIHdvbid0IGZhaWxcbiAgICByZXR1cm4gY2hyb21lVmVyc2lvbiA/IHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbikgOiBudWxsO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJpdmVyc01hcHBpbmcgKG5ld01hcHBpbmcpIHtcbiAgICBsZXQgc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyA9IHRydWU7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm1hcHBpbmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMubWFwcGluZ1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hcHBpbmcsIG51bGwsIDIpLCAndXRmOCcpO1xuICAgICAgICBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3RvcmUgdGhlIHVwZGF0ZWQgY2hyb21lZHJpdmVycyBtYXBwaW5nIGludG8gJyR7dGhpcy5tYXBwaW5nUGF0aH0nLiBgICtcbiAgICAgICAgICBgVGhpcyBtYXkgcmVkdWNlIHRoZSBwZXJmb3JtYW5jZSBvZiBmdXJ0aGVyIGV4ZWN1dGlvbnMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLCBuZXdNYXBwaW5nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyICgpIHtcbiAgICBpZiAoIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBhd2FpdCB0aGlzLmdldERyaXZlcnNNYXBwaW5nKCk7XG4gICAgaWYgKCFfLmlzRW1wdHkobWFwcGluZykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICBsb2cuZGVidWcoJ0dvdCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZTogJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJldHJpZXZlZE1hcHBpbmcsIG51bGwsIDIpKTtcbiAgICAgIGNvbnN0IGRyaXZlcktleXMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQuc3luY0RyaXZlcnMoe1xuICAgICAgICBtaW5Ccm93c2VyVmVyc2lvbjogY2hyb21lVmVyc2lvbi5tYWpvcixcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJLZXlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyA9IGRyaXZlcktleXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIG1pbkJyb3dzZXJWZXJzaW9ufSA9IHJldHJpZXZlZE1hcHBpbmdbeF07XG4gICAgICAgIGFjY1t2ZXJzaW9uXSA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKG1hcHBpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGNkcyA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lZHJpdmVycyhtYXBwaW5nKTtcblxuICAgICAgY29uc3QgbWlzc2luZ1ZlcnNpb25zID0ge307XG4gICAgICBmb3IgKGNvbnN0IHt2ZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9ufSBvZiBjZHMpIHtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uIHx8IG1hcHBpbmdbdmVyc2lvbl0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2VyY2VkVmVyID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjb2VyY2VkVmVyIHx8IGNvZXJjZWRWZXIubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlzc2luZ1ZlcnNpb25zW3ZlcnNpb25dID0gbWluQ2hyb21lVmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KG1pc3NpbmdWZXJzaW9ucykpIHtcbiAgICAgICAgbG9nLmluZm8oYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ0Nocm9tZWRyaXZlcicsIF8uc2l6ZShtaXNzaW5nVmVyc2lvbnMpLCB0cnVlKX0sIGAgK1xuICAgICAgICAgIGB3aGljaCAke18uc2l6ZShtaXNzaW5nVmVyc2lvbnMpID09PSAxID8gJ2lzJyA6ICdhcmUnfSBtaXNzaW5nIGluIHRoZSBsaXN0IG9mIGtub3duIHZlcnNpb25zOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEcml2ZXJzTWFwcGluZyhPYmplY3QuYXNzaWduKG1hcHBpbmcsIG1pc3NpbmdWZXJzaW9ucykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlQnVpbGRDaGVjaykge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBDaHJvbWUgYnVpbGQgY2hlY2sgZGlzYWJsZWQuIFVzaW5nIG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uICgke3ZlcnNpb259LCBhdCAnJHtleGVjdXRhYmxlfScpYCk7XG4gICAgICAgIGxvZy53YXJuKGBJZiB0aGlzIGlzIHdyb25nLCBzZXQgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IHRvICdmYWxzZSdgKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNocm9tZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldENocm9tZVZlcnNpb24oKTtcbiAgICAgIGlmICghY2hyb21lVmVyc2lvbikge1xuICAgICAgICAvLyB1bmFibGUgdG8gZ2V0IHRoZSBjaHJvbWUgdmVyc2lvblxuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gZGlzY292ZXIgQ2hyb21lIHZlcnNpb24uIFVzaW5nIENocm9tZWRyaXZlciAke3ZlcnNpb259IGF0ICcke2V4ZWN1dGFibGV9J2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgQ2hyb21lIGJ1bmRsZSAnJHt0aGlzLmJ1bmRsZUlkfScgdmVyc2lvbiAnJHtjaHJvbWVWZXJzaW9ufSdgKTtcblxuICAgICAgY29uc3QgbWF0Y2hpbmdEcml2ZXJzID0gY2RzLmZpbHRlcigoe21pbkNocm9tZVZlcnNpb259KSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbkNocm9tZVZlcnNpb25TID0gbWluQ2hyb21lVmVyc2lvbiAmJiBzZW12ZXIuY29lcmNlKG1pbkNocm9tZVZlcnNpb24pO1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb25TKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNocm9tZVZlcnNpb24ubWFqb3IgPiBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTlxuICAgICAgICAgID8gbWluQ2hyb21lVmVyc2lvblMubWFqb3IgPT09IGNocm9tZVZlcnNpb24ubWFqb3JcbiAgICAgICAgICA6IHNlbXZlci5ndGUoY2hyb21lVmVyc2lvbiwgbWluQ2hyb21lVmVyc2lvblMpO1xuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KG1hdGNoaW5nRHJpdmVycykpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmFnZUNsaWVudCAmJiAhZGlkU3RvcmFnZVN5bmMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHN5bmNDaHJvbWVkcml2ZXJzKGNocm9tZVZlcnNpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRvZG93bmxvYWRTdWdnZXN0aW9uID1cbiAgICAgICAgICAnWW91IGNvdWxkIGFsc28gdHJ5IHRvIGVuYWJsZSBhdXRvbWF0ZWQgY2hyb21lZHJpdmVycyBkb3dubG9hZCBzZXJ2ZXIgZmVhdHVyZSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuIGAgK1xuICAgICAgICAgICghdGhpcy5zdG9yYWdlQ2xpZW50ID8gYCR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn0uIGAgOiAnJykgK1xuICAgICAgICAgIGBTZWUgJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9IGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmluUGF0aCA9IG1hdGNoaW5nRHJpdmVyc1swXS5leGVjdXRhYmxlO1xuICAgICAgbG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICBsb2cuZGVidWcoJ0lmIGEgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXF1aXJlZCwgc3BlY2lmeSBpdCB3aXRoIHRoZSBgY2hyb21lZHJpdmVyRXhlY3V0YWJsZWAnICtcbiAgICAgICAgJ2Rlc2lyZWQgY2FwYWJpbGl0eS4nKTtcbiAgICAgIHJldHVybiBiaW5QYXRoO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB9IHdoaWxlICh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRDaHJvbWVkcml2ZXJQYXRoICgpIHtcbiAgICBpZiAodGhpcy5leGVjdXRhYmxlVmVyaWZpZWQpIHJldHVybjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyB0aGUgZXhlY3V0YWJsZSBtaWdodCBiZSBzZXQgKGlmIHBhc3NlZCBpbilcbiAgICAvLyBvciB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgYmFzaWMgb25lIGluc3RhbGxlZCB3aXRoIHRoaXMgZHJpdmVyXG4gICAgLy8gb3Igd2Ugd2FudCB0byBmaWd1cmUgb3V0IHRoZSBiZXN0IG9uZVxuICAgIGlmICghdGhpcy5jaHJvbWVkcml2ZXIpIHtcbiAgICAgIHRoaXMuY2hyb21lZHJpdmVyID0gdGhpcy51c2VTeXN0ZW1FeGVjdXRhYmxlXG4gICAgICAgID8gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byB1c2UgYSBjaHJvbWVkcml2ZXIgYmluYXJ5IGF0IHRoZSBwYXRoIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2hyb21lZHJpdmVyfSwgYnV0IGl0IGRvZXNuJ3QgZXhpc3QhYCk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVZlcmlmaWVkID0gdHJ1ZTtcbiAgICBsb2cuaW5mbyhgU2V0IGNocm9tZWRyaXZlciBiaW5hcnkgYXM6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9YCk7XG4gIH1cblxuICBzeW5jUHJvdG9jb2wgKGNkVmVyc2lvbiA9IG51bGwpIHtcbiAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoY2RWZXJzaW9uKTtcbiAgICBpZiAoIWNvZXJjZWRWZXJzaW9uIHx8IGNvZXJjZWRWZXJzaW9uLm1ham9yIDwgTUlOX0NEX1ZFUlNJT05fV0lUSF9XM0NfU1VQUE9SVCkge1xuICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgbG9nLmluZm8oYENocm9tZWRyaXZlciB2LiAke2NkVmVyc2lvbn0gc3VwcG9ydHMgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbCwgYCArXG4gICAgICAgIGBidXQgJHtQUk9UT0NPTFMuTUpTT05XUH0gb25lIGhhcyBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLlczQztcbiAgICAvLyBnaXZlbiBjYXBzIG1pZ2h0IG5vdCBiZSBwcm9wZXJseSBwcmVmaXhlZFxuICAgIC8vIHNvIHdlIHRyeSB0byBmaXggdGhlbSBpbiBvcmRlciB0byBwcm9wZXJseSBpbml0XG4gICAgLy8gdGhlIG5ldyBXM0Mgc2Vzc2lvblxuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gdG9XM2NDYXBOYW1lcyh0aGlzLmNhcGFiaWxpdGllcyk7XG4gIH1cblxuICBhc3luYyBzdGFydCAoY2FwcywgZW1pdFN0YXJ0aW5nU3RhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChjYXBzKTtcblxuICAgIC8vIHNldCB0aGUgbG9nZ2luZyBwcmVmZXJlbmNlcyB0byBBTEwgdGhlIGNvbnNvbGUgbG9nc1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcyA9IF8uY2xvbmVEZWVwKGdldENhcFZhbHVlKGNhcHMsICdsb2dnaW5nUHJlZnMnLCB7fSkpO1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzLmJyb3dzZXIpKSB7XG4gICAgICB0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlciA9ICdBTEwnO1xuICAgIH1cblxuICAgIGlmIChlbWl0U3RhcnRpbmdTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3MgPSBbJy0tdXJsLWJhc2U9d2QvaHViJywgYC0tcG9ydD0ke3RoaXMucHJveHlQb3J0fWBdO1xuICAgIGlmICh0aGlzLmFkYiAmJiB0aGlzLmFkYi5hZGJQb3J0KSB7XG4gICAgICBhcmdzLnB1c2goYC0tYWRiLXBvcnQ9JHt0aGlzLmFkYi5hZGJQb3J0fWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuY21kQXJncykpIHtcbiAgICAgIGFyZ3MucHVzaCguLi50aGlzLmNtZEFyZ3MpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dQYXRoKSB7XG4gICAgICBhcmdzLnB1c2goYC0tbG9nLXBhdGg9JHt0aGlzLmxvZ1BhdGh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVCdWlsZENoZWNrKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZGlzYWJsZS1idWlsZC1jaGVjaycpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tdmVyYm9zZScpO1xuICAgIC8vIHdoYXQgYXJlIHRoZSBwcm9jZXNzIHN0ZG91dC9zdGRlcnIgY29uZGl0aW9ucyB3aGVyZWluIHdlIGtub3cgdGhhdFxuICAgIC8vIHRoZSBwcm9jZXNzIGhhcyBzdGFydGVkIHRvIG91ciBzYXRpc2ZhY3Rpb24/XG4gICAgY29uc3Qgc3RhcnREZXRlY3RvciA9IChzdGRvdXQpID0+IHN0ZG91dC5zdGFydHNXaXRoKCdTdGFydGluZyAnKTtcblxuICAgIGxldCBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgIGxldCB3ZWJ2aWV3VmVyc2lvbjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0Q2hyb21lZHJpdmVyUGF0aCgpO1xuICAgICAgYXdhaXQgdGhpcy5raWxsQWxsKCk7XG5cbiAgICAgIC8vIHNldCB1cCBvdXIgc3VicHJvY2VzcyBvYmplY3RcbiAgICAgIHRoaXMucHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuY2hyb21lZHJpdmVyLCBhcmdzKTtcbiAgICAgIHByb2Nlc3NJc0FsaXZlID0gdHJ1ZTtcblxuICAgICAgLy8gaGFuZGxlIGxvZyBvdXRwdXRcbiAgICAgIHRoaXMucHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIC8vIGlmIHRoZSBjZCBvdXRwdXQgaXMgbm90IHByaW50ZWQsIGZpbmQgdGhlIGNocm9tZSB2ZXJzaW9uIGFuZCBwcmludFxuICAgICAgICAvLyB3aWxsIGdldCBhIHJlc3BvbnNlIGxpa2VcbiAgICAgICAgLy8gICBEZXZUb29scyByZXNwb25zZToge1xuICAgICAgICAvLyAgICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNhbXBsZWFwcFwiLFxuICAgICAgICAvLyAgICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS81NS4wLjI4ODMuOTFcIixcbiAgICAgICAgLy8gICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjJcIixcbiAgICAgICAgLy8gICAgICBcIlVzZXItQWdlbnRcIjogXCIuLi5cIixcbiAgICAgICAgLy8gICAgICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2XCJcbiAgICAgICAgLy8gICB9XG4gICAgICAgIGNvbnN0IG91dCA9IHN0ZG91dCArIHN0ZGVycjtcbiAgICAgICAgbGV0IG1hdGNoID0gL1wiQnJvd3NlclwiOiBcIiguKilcIi8uZXhlYyhvdXQpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB3ZWJ2aWV3VmVyc2lvbiA9IG1hdGNoWzFdO1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2VidmlldyB2ZXJzaW9uOiAnJHt3ZWJ2aWV3VmVyc2lvbn0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHByaW50IGNocm9tZWRyaXZlciB2ZXJzaW9uIHRvIGxvZ3NcbiAgICAgICAgLy8gd2lsbCBvdXRwdXQgc29tZXRoaW5nIGxpa2VcbiAgICAgICAgLy8gIFN0YXJ0aW5nIENocm9tZURyaXZlciAyLjMzLjUwNjEwNiAoOGEwNmMzOWM0NTgyZmJmYmFiNjk2NmRiYjFjMzhhOTE3M2JmYjFhMikgb24gcG9ydCA5NTE1XG4gICAgICAgIG1hdGNoID0gL1N0YXJ0aW5nIENocm9tZURyaXZlciAoWy5cXGRdKykvLmV4ZWMob3V0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICBsb2cuZGVidWcoYFtTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgbGluZSBvZiAoc3RkZXJyIHx8ICcnKS50cmltKCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmxlbmd0aCkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgIGxvZy5lcnJvcihgW1NUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBvdXQtb2YtYm91bmQgZXhpdCBieSBzaW1wbHkgZW1pdHRpbmcgYSBzdG9wcGVkIHN0YXRlXG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORykge1xuICAgICAgICAgIGxldCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgc2lnbmFsICR7c2lnbmFsfWA7XG4gICAgICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nLmluZm8oYFNwYXduaW5nIGNocm9tZWRyaXZlciB3aXRoOiAke3RoaXMuY2hyb21lZHJpdmVyfSBgICtcbiAgICAgICAgICAgICAgIGAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgLy8gc3RhcnQgc3VicHJvYyBhbmQgd2FpdCBmb3Igc3RhcnREZXRlY3RvclxuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0YXJ0KHN0YXJ0RGV0ZWN0b3IpO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT25saW5lKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0U2Vzc2lvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMuZW1pdChDaHJvbWVkcml2ZXIuRVZFTlRfRVJST1IsIGUpO1xuICAgICAgLy8ganVzdCBiZWNhdXNlIHdlIGhhZCBhbiBlcnJvciBkb2Vzbid0IG1lYW4gdGhlIGNocm9tZWRyaXZlciBwcm9jZXNzXG4gICAgICAvLyBmaW5pc2hlZDsgd2Ugc2hvdWxkIGNsZWFuIHVwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHByb2Nlc3NJc0FsaXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAvLyBvZnRlbiB0aGUgdXNlcidzIENocm9tZSB2ZXJzaW9uIGlzIHRvbyBsb3cgZm9yIHRoZSB2ZXJzaW9uIG9mIENocm9tZWRyaXZlclxuICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnQ2hyb21lIHZlcnNpb24gbXVzdCBiZScpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1VuYWJsZSB0byBhdXRvbWF0ZSBDaHJvbWUgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIHRvbyBvbGQgZm9yIHRoaXMgdmVyc2lvbiBvZiBDaHJvbWVkcml2ZXIuXFxuJztcbiAgICAgICAgaWYgKHdlYnZpZXdWZXJzaW9uKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgQ2hyb21lIHZlcnNpb24gb24gdGhlIGRldmljZTogJHt3ZWJ2aWV3VmVyc2lvbn1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gYFZpc2l0ICcke0NIUk9NRURSSVZFUl9UVVRPUklBTH0nIHRvIHRyb3VibGVzaG9vdCB0aGUgcHJvYmxlbS5cXG5gO1xuICAgICAgfVxuXG4gICAgICBtZXNzYWdlICs9IGUubWVzc2FnZTtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHNlc3Npb25JZCAoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cHJveHkuc2Vzc2lvbklkO1xuICB9XG5cbiAgYXN5bmMgcmVzdGFydCAoKSB7XG4gICAgbG9nLmluZm8oJ1Jlc3RhcnRpbmcgY2hyb21lZHJpdmVyJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlc3RhcnQgd2hlbiB3ZSdyZSBub3Qgb25saW5lXCIpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HKTtcbiAgICBhd2FpdCB0aGlzLnN0b3AoZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQodGhpcy5jYXBhYmlsaXRpZXMsIGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JPbmxpbmUgKCkge1xuICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgQ0QgaGFzbid0IGNyYXNoZWRcbiAgICBsZXQgY2hyb21lZHJpdmVyU3RvcHBlZCA9IGZhbHNlO1xuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoMjAsIDIwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIC8vIHdlIGFyZSBlaXRoZXIgc3RvcHBlZCBvciBzdG9wcGluZywgc28gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgICAgY2hyb21lZHJpdmVyU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfSk7XG4gICAgaWYgKGNocm9tZWRyaXZlclN0b3BwZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hyb21lRHJpdmVyIGNyYXNoZWQgZHVyaW5nIHN0YXJ0dXAuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKCkge1xuICAgIGNvbnN0IHNlc3Npb25DYXBzID0gdGhpcy5kZXNpcmVkUHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0NcbiAgICAgID8ge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiB0aGlzLmNhcGFiaWxpdGllc319XG4gICAgICA6IHtkZXNpcmVkQ2FwYWJpbGl0aWVzOiB0aGlzLmNhcGFiaWxpdGllc307XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nICR7dGhpcy5kZXNpcmVkUHJvdG9jb2x9IENocm9tZWRyaXZlciBzZXNzaW9uIHdpdGggY2FwYWJpbGl0aWVzOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNlc3Npb25DYXBzLCBudWxsLCAyKSk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCBzZXNzaW9uQ2Fwcyk7XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKGVtaXRTdGF0ZXMgPSB0cnVlKSB7XG4gICAgaWYgKGVtaXRTdGF0ZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJyk7XG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgnU0lHVEVSTScsIDIwMDAwKTtcbiAgICAgIGlmIChlbWl0U3RhdGVzKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgbG9nLmRlYnVnKGBDaGFuZ2VkIHN0YXRlIHRvICcke3N0YXRlfSdgKTtcbiAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIHtzdGF0ZX0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxIChyZXEsIHJlcykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICB9XG5cbiAgYXN5bmMga2lsbEFsbCAoKSB7XG4gICAgbGV0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKVxuICAgICAgPyBgd21pYyBwcm9jZXNzIHdoZXJlIFwiY29tbWFuZGxpbmUgbGlrZSAnJWNocm9tZWRyaXZlci5leGUlLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9JSdcIiBkZWxldGVgXG4gICAgICA6IGBwa2lsbCAtMTUgLWYgXCIke3RoaXMuY2hyb21lZHJpdmVyfS4qLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9XCJgO1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBhbnkgb2xkIGNocm9tZWRyaXZlcnMsIHJ1bm5pbmc6ICR7Y21kfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCAoQi5wcm9taXNpZnkoY3AuZXhlYykpKGNtZCk7XG4gICAgICBsb2cuZGVidWcoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIHVwIG9sZCBjaHJvbWVkcml2ZXJzJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybignTm8gb2xkIGNocm9tZWRyaXZlcnMgc2VlbSB0byBleGlzdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgdWRpZEluZGV4ID0gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09ICctcycpO1xuICAgICAgY29uc3QgdWRpZCA9IHVkaWRJbmRleCA+IC0xID8gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1t1ZGlkSW5kZXggKyAxXSA6IG51bGw7XG5cbiAgICAgIGlmICh1ZGlkKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdGhpcyBkZXZpY2UncyBhZGIgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb25zOiAke3VkaWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIGFueSBvbGQgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uc2ApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBjb25uIG9mIGF3YWl0IHRoaXMuYWRiLmdldEZvcndhcmRMaXN0KCkpIHtcbiAgICAgICAgICAvLyBjaHJvbWVkcml2ZXIgd2lsbCBhc2sgQURCIHRvIGZvcndhcmQgYSBwb3J0IGxpa2UgXCJkZXZpY2VJZCB0Y3A6cG9ydCBsb2NhbGFic3RyYWN0OndlYnZpZXdfZGV2dG9vbHNfcmVtb3RlX3BvcnRcIlxuICAgICAgICAgIGlmICghKGNvbm4uaW5jbHVkZXMoJ3dlYnZpZXdfZGV2dG9vbHMnKSAmJiAoIXVkaWQgfHwgY29ubi5pbmNsdWRlcyh1ZGlkKSkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyYW1zID0gY29ubi5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQocGFyYW1zWzFdLnJlcGxhY2UoL1tcXERdKi8sICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBjbGVhbiBmb3J3YXJkZWQgcG9ydHMuIEVycm9yOiAnJHtlcnIubWVzc2FnZX0nLiBDb250aW51aW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1dvcmtpbmdXZWJ2aWV3ICgpIHtcbiAgICAvLyBzb21ldGltZXMgY2hyb21lZHJpdmVyIHN0b3BzIGF1dG9tYXRpbmcgd2Vidmlld3MuIHRoaXMgbWV0aG9kIHJ1bnMgYVxuICAgIC8vIHNpbXBsZSBjb21tYW5kIHRvIGRldGVybWluZSBvdXIgc3RhdGUsIGFuZCByZXNwb25kcyBhY2NvcmRpbmdseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3VybCcsICdHRVQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SID0gJ2Nocm9tZWRyaXZlcl9lcnJvcic7XG5DaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCA9ICdzdGF0ZUNoYW5nZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgPSAnc3RvcHBlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcgPSAnc3RhcnRpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSA9ICdvbmxpbmUnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HID0gJ3N0b3BwaW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HID0gJ3Jlc3RhcnRpbmcnO1xuXG5leHBvcnQgeyBDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlcjtcbiJdLCJmaWxlIjoibGliL2Nocm9tZWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
727
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaHJvbWVkcml2ZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04iLCJERUZBVUxUX0hPU1QiLCJNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUIiwiREVGQVVMVF9QT1JUIiwiQ0hST01FX0JVTkRMRV9JRCIsIldFQlZJRVdfU0hFTExfQlVORExFX0lEIiwiV0VCVklFV19CVU5ETEVfSURTIiwiQ0hST01FRFJJVkVSX1RVVE9SSUFMIiwiVkVSU0lPTl9QQVRURVJOIiwiQ0RfVkVSU0lPTl9USU1FT1VUIiwiQ2hyb21lZHJpdmVyIiwiZXZlbnRzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiaG9zdCIsInBvcnQiLCJ1c2VTeXN0ZW1FeGVjdXRhYmxlIiwiZXhlY3V0YWJsZSIsImV4ZWN1dGFibGVEaXIiLCJidW5kbGVJZCIsIm1hcHBpbmdQYXRoIiwiY21kQXJncyIsImFkYiIsInZlcmJvc2UiLCJsb2dQYXRoIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJkZXRhaWxzIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJvYyIsImNocm9tZWRyaXZlciIsImV4ZWN1dGFibGVWZXJpZmllZCIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsImp3cHJveHkiLCJKV1Byb3h5Iiwic2VydmVyIiwic3RvcmFnZUNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjaHJvbWVkcml2ZXJEaXIiLCJjYXBhYmlsaXRpZXMiLCJkZXNpcmVkUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiZ2V0RHJpdmVyc01hcHBpbmciLCJtYXBwaW5nIiwiXyIsImNsb25lRGVlcCIsIkNIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyIsImRlYnVnIiwiZnMiLCJleGlzdHMiLCJ3YXJuIiwiaW5mbyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwiZXJyIiwibWVzc2FnZSIsImNkVmVyc2lvbiIsImNocm9tZVZlcnNpb24iLCJ0b1BhaXJzIiwiY29lcmNlZFZlcnNpb24iLCJzZW12ZXIiLCJjb2VyY2UiLCJ2ZXJzaW9uIiwiZ2V0Q2hyb21lZHJpdmVycyIsImV4ZWN1dGFibGVzIiwiZ2xvYiIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJtYXBDaHJvbWVkcml2ZXIiLCJsb2dFcnJvciIsInN0ZG91dCIsInN0ZGVyciIsImVyck1zZyIsInBhdGgiLCJiYXNlbmFtZSIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwiZXhlYyIsIm1pbkNocm9tZVZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiZmlsdGVyIiwiY2QiLCJzb3J0IiwiYSIsImIiLCJpc0VtcHR5IiwiZ2V0Q2hyb21lVmVyc2lvbiIsIkJyb3dzZXIiLCJ2ZXJzaW9uTWF0Y2giLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwidXBkYXRlRHJpdmVyc01hcHBpbmciLCJuZXdNYXBwaW5nIiwic2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImUiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwidzNjIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwiZ2V0U3RhdHVzIiwiY29tbWFuZCIsInNlc3Npb25DYXBzIiwiYWx3YXlzTWF0Y2giLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwiZW1pdFN0YXRlcyIsIkVWRU5UX0NIQU5HRUQiLCJzZW5kQ29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJwcm94eVJlcSIsInJlcSIsInJlcyIsInByb3h5UmVxUmVzIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiQiIsInByb21pc2lmeSIsImNwIiwidWRpZEluZGV4IiwiZGVmYXVsdEFyZ3MiLCJmaW5kSW5kZXgiLCJpdGVtIiwidWRpZCIsImNvbm4iLCJnZXRGb3J3YXJkTGlzdCIsInBhcmFtcyIsInJlbW92ZVBvcnRGb3J3YXJkIiwicmVwbGFjZSIsImhhc1dvcmtpbmdX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RSxPQUFWLENBQWtCLE9BQWxCLEVBQTJCLEVBQTNCLENBQTNCLENBQU47QUFDRDtBQUNGO0FBQ0YsT0FaRCxDQVlFLE9BQU9uSixHQUFQLEVBQVk7QUFDWjlELFFBQUFBLEdBQUcsQ0FBQ3lELElBQUosQ0FBVSw0Q0FBMkNLLEdBQUcsQ0FBQ0MsT0FBUSxnQkFBakU7QUFDRDtBQUNGO0FBQ0Y7O0FBRXNCLFFBQWpCbUosaUJBQWlCLEdBQUk7QUFHekIsUUFBSTtBQUNGLFlBQU0sS0FBSzNLLE9BQUwsQ0FBYTZJLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsS0FBN0IsQ0FBTjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBSEQsQ0FHRSxPQUFPeEUsQ0FBUCxFQUFVO0FBQ1YsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUEvbkI0Qzs7O0FBa29CL0MvRixZQUFZLENBQUMrSixXQUFiLEdBQTJCLG9CQUEzQjtBQUNBL0osWUFBWSxDQUFDNEssYUFBYixHQUE2QixjQUE3QjtBQUNBNUssWUFBWSxDQUFDeUIsYUFBYixHQUE2QixTQUE3QjtBQUNBekIsWUFBWSxDQUFDc0ksY0FBYixHQUE4QixVQUE5QjtBQUNBdEksWUFBWSxDQUFDbUssWUFBYixHQUE0QixRQUE1QjtBQUNBbkssWUFBWSxDQUFDd0osY0FBYixHQUE4QixVQUE5QjtBQUNBeEosWUFBWSxDQUFDeUosZ0JBQWIsR0FBZ0MsWUFBaEM7ZUFHZXpKLFkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBKV1Byb3h5LCBQUk9UT0NPTFMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBjcCBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCBhc3luY21hcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsXG4gIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIENEX0NETixcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgY29tcGFyZVZlcnNpb25zIGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuaW1wb3J0IENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQgZnJvbSAnLi9zdG9yYWdlLWNsaWVudCc7XG5pbXBvcnQgeyB0b1czY0NhcE5hbWVzLCBnZXRDYXBWYWx1ZSB9IGZyb20gJy4vcHJvdG9jb2wtaGVscGVycyc7XG5cblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ2hyb21lZHJpdmVyJyk7XG5cbmNvbnN0IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OID0gNzM7XG5jb25zdCBERUZBVUxUX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IE1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQgPSA3NTtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDk1MTU7XG5jb25zdCBDSFJPTUVfQlVORExFX0lEID0gJ2NvbS5hbmRyb2lkLmNocm9tZSc7XG5jb25zdCBXRUJWSUVXX1NIRUxMX0JVTkRMRV9JRCA9ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCc7XG5jb25zdCBXRUJWSUVXX0JVTkRMRV9JRFMgPSBbXG4gICdjb20uZ29vZ2xlLmFuZHJvaWQud2VidmlldycsXG4gICdjb20uYW5kcm9pZC53ZWJ2aWV3Jyxcbl07XG5jb25zdCBDSFJPTUVEUklWRVJfVFVUT1JJQUwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi93cml0aW5nLXJ1bm5pbmctYXBwaXVtL3dlYi9jaHJvbWVkcml2ZXIubWQnO1xuY29uc3QgVkVSU0lPTl9QQVRURVJOID0gLyhbXFxkLl0rKS87XG5cbmNvbnN0IENEX1ZFUlNJT05fVElNRU9VVCA9IDUwMDA7XG5cbmNsYXNzIENocm9tZWRyaXZlciBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgICAgdXNlU3lzdGVtRXhlY3V0YWJsZSA9IGZhbHNlLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGV4ZWN1dGFibGVEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIGJ1bmRsZUlkLFxuICAgICAgbWFwcGluZ1BhdGgsXG4gICAgICBjbWRBcmdzLFxuICAgICAgYWRiLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ1BhdGgsXG4gICAgICBkaXNhYmxlQnVpbGRDaGVjayxcbiAgICAgIGRldGFpbHMsXG4gICAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQgPSBmYWxzZSxcbiAgICB9ID0gYXJncztcblxuICAgIHRoaXMucHJveHlIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnByb3h5UG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5jbWRBcmdzID0gY21kQXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMudXNlU3lzdGVtRXhlY3V0YWJsZSA9IHVzZVN5c3RlbUV4ZWN1dGFibGU7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBleGVjdXRhYmxlO1xuICAgIHRoaXMuZXhlY3V0YWJsZURpciA9IGV4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5tYXBwaW5nUGF0aCA9IG1hcHBpbmdQYXRoO1xuICAgIHRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDtcbiAgICB0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUgPSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRDtcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgSldQcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMucHJveHlIb3N0LFxuICAgICAgcG9ydDogdGhpcy5wcm94eVBvcnRcbiAgICB9KTtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlO1xuICAgIHRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgdGhpcy5kaXNhYmxlQnVpbGRDaGVjayA9ICEhZGlzYWJsZUJ1aWxkQ2hlY2s7XG4gICAgdGhpcy5zdG9yYWdlQ2xpZW50ID0gaXNBdXRvZG93bmxvYWRFbmFibGVkXG4gICAgICA/IG5ldyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50KHsgY2hyb21lZHJpdmVyRGlyOiB0aGlzLmV4ZWN1dGFibGVEaXIgfSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0ge307XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuTUpTT05XUDtcbiAgfVxuXG4gIGFzeW5jIGdldERyaXZlcnNNYXBwaW5nICgpIHtcbiAgICBsZXQgbWFwcGluZyA9IF8uY2xvbmVEZWVwKENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyk7XG4gICAgaWYgKHRoaXMubWFwcGluZ1BhdGgpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byB1c2UgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5tYXBwaW5nUGF0aCkpIHtcbiAgICAgICAgbG9nLndhcm4oYE5vIGZpbGUgZm91bmQgYXQgJyR7dGhpcy5tYXBwaW5nUGF0aH0nYCk7XG4gICAgICAgIGxvZy5pbmZvKCdEZWZhdWx0aW5nIHRvIHRoZSBzdGF0aWMgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtYXBwaW5nID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLm1hcHBpbmdQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEVycm9yIHBhcnNpbmcgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICBsb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoJ1VzaW5nIHRoZSBzdGF0aWMgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZycpO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZm9yIG1pbmltdW0gY2hyb21lIHZlcnNpb24gYXJlIHNlbXZlciBjb21wbGlhbnRcbiAgICBmb3IgKGNvbnN0IFtjZFZlcnNpb24sIGNocm9tZVZlcnNpb25dIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKGNocm9tZVZlcnNpb24pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIG1hcHBpbmdbY2RWZXJzaW9uXSA9IGNvZXJjZWRWZXJzaW9uLnZlcnNpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuaW5mbyhgJyR7Y2hyb21lVmVyc2lvbn0nIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gbnVtYmVyLiBTa2lwcGluZyBpdGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGFzeW5jIGdldENocm9tZWRyaXZlcnMgKG1hcHBpbmcpIHtcbiAgICAvLyBnbyB0aHJvdWdoIHRoZSB2ZXJzaW9ucyBhdmFpbGFibGVcbiAgICBjb25zdCBleGVjdXRhYmxlcyA9IGF3YWl0IGZzLmdsb2IoYCR7dGhpcy5leGVjdXRhYmxlRGlyfS8qYCk7XG4gICAgbG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgZXhlY3V0YWJsZXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICBjb25zdCBjZHMgPSAoYXdhaXQgYXN5bmNtYXAoZXhlY3V0YWJsZXMsIGFzeW5jIGZ1bmN0aW9uIG1hcENocm9tZWRyaXZlciAoZXhlY3V0YWJsZSkge1xuICAgICAgY29uc3QgbG9nRXJyb3IgPSAoe21lc3NhZ2UsIHN0ZG91dCA9IG51bGwsIHN0ZGVyciA9IG51bGx9KSA9PiB7XG4gICAgICAgIGxldCBlcnJNc2cgPSBgQ2Fubm90IHJldHJpZXZlIHZlcnNpb24gbnVtYmVyIGZyb20gJyR7cGF0aC5iYXNlbmFtZShleGVjdXRhYmxlKX0nIENocm9tZWRyaXZlciBiaW5hcnkuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgaXQgcmV0dXJucyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGluIHJlc3BvbnNlIHRvICctLXZlcnNpb24nIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gJHttZXNzYWdlfWA7XG4gICAgICAgIGlmIChzdGRvdXQpIHtcbiAgICAgICAgICBlcnJNc2cgKz0gYFxcblN0ZG91dDogJHtzdGRvdXR9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgZXJyTXNnICs9IGBcXG5TdGRlcnI6ICR7c3RkZXJyfWA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLndhcm4oZXJyTXNnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuXG4gICAgICBsZXQgc3Rkb3V0O1xuICAgICAgbGV0IHN0ZGVycjtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgZXhlYyhleGVjdXRhYmxlLCBbJy0tdmVyc2lvbiddLCB7XG4gICAgICAgICAgdGltZW91dDogQ0RfVkVSU0lPTl9USU1FT1VULFxuICAgICAgICB9KSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCEoZXJyLm1lc3NhZ2UgfHwgJycpLmluY2x1ZGVzKCd0aW1lZCBvdXQnKSAmJiAhKGVyci5zdGRvdXQgfHwgJycpLmluY2x1ZGVzKCdTdGFydGluZyBDaHJvbWVEcml2ZXInKSkge1xuICAgICAgICAgIHJldHVybiBsb2dFcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhpcyBoYXMgdGltZWQgb3V0LCBpdCBoYXMgYWN0dWFsbHkgc3RhcnRlZCBDaHJvbWVkcml2ZXIsXG4gICAgICAgIC8vIGluIHdoaWNoIGNhc2UgdGhlcmUgd2lsbCBhbHNvIGJlIHRoZSB2ZXJzaW9uIHN0cmluZyBpbiB0aGUgb3V0cHV0XG4gICAgICAgIHN0ZG91dCA9IGVyci5zdGRvdXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gL0Nocm9tZURyaXZlclxccytcXCg/dj8oW1xcZC5dKylcXCk/L2kuZXhlYyhzdGRvdXQpOyAvLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL3pwajV3QS8xXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcih7bWVzc2FnZTogJ0Nhbm5vdCBwYXJzZSB0aGUgdmVyc2lvbiBzdHJpbmcnLCBzdGRvdXQsIHN0ZGVycn0pO1xuICAgICAgfVxuICAgICAgbGV0IHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgICAgIGxldCBtaW5DaHJvbWVWZXJzaW9uID0gbWFwcGluZ1t2ZXJzaW9uXTtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICAvLyBiZWZvcmUgMjAxOS0wMy0wNiB2ZXJzaW9ucyB3ZXJlIG9mIHRoZSBmb3JtIG1ham9yLm1pbm9yXG4gICAgICAgIGlmIChjb2VyY2VkVmVyc2lvbi5tYWpvciA8IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgdmVyc2lvbiA9IGAke2NvZXJjZWRWZXJzaW9uLm1ham9yfS4ke2NvZXJjZWRWZXJzaW9uLm1pbm9yfWA7XG4gICAgICAgICAgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uICYmIGNvZXJjZWRWZXJzaW9uLm1ham9yID49IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgLy8gQXNzdW1lIHRoZSBtYWpvciBDaHJvbWUgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIgbWFqb3IgdmVyc2lvblxuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGVjdXRhYmxlLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBtaW5DaHJvbWVWZXJzaW9uLFxuICAgICAgfTtcbiAgICB9KSlcbiAgICAgIC5maWx0ZXIoKGNkKSA9PiAhIWNkKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVWZXJzaW9ucyhiLnZlcnNpb24sIGEudmVyc2lvbikpO1xuICAgIGlmIChfLmlzRW1wdHkoY2RzKSkge1xuICAgICAgbG9nLmluZm8oYE5vIENocm9tZWRyaXZlcnMgd2VyZSBmb3VuZCBpbiAnJHt0aGlzLmV4ZWN1dGFibGVEaXJ9J2ApO1xuICAgICAgcmV0dXJuIGNkcztcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIENocm9tZWRyaXZlciBleGVjdXRhYmxlcyB3ZXJlIGZvdW5kOmApO1xuICAgIGZvciAoY29uc3QgY2Qgb2YgY2RzKSB7XG4gICAgICBsb2cuZGVidWcoYCAgICAnJHtjZC5leGVjdXRhYmxlfScgKHZlcnNpb24gJyR7Y2QudmVyc2lvbn0nLCBtaW5pbXVtIENocm9tZSB2ZXJzaW9uICcke2NkLm1pbkNocm9tZVZlcnNpb24gPyBjZC5taW5DaHJvbWVWZXJzaW9uIDogJ1Vua25vd24nfScpYCk7XG4gICAgfVxuICAgIHJldHVybiBjZHM7XG4gIH1cblxuICBhc3luYyBnZXRDaHJvbWVWZXJzaW9uICgpIHtcbiAgICAvLyBUcnkgdG8gcmV0cmlldmUgdGhlIHZlcnNpb24gZnJvbSBgZGV0YWlsc2AgcHJvcGVydHkgaWYgaXQgaXMgc2V0XG4gICAgLy8gVGhlIGBpbmZvYCBpdGVtIG11c3QgY29udGFpbiB0aGUgb3V0cHV0IG9mIC9qc29uL3ZlcnNpb24gQ0RQIGNvbW1hbmRcbiAgICAvLyB3aGVyZSBgQnJvd3NlcmAgZmllbGQgbG9va3MgbGlrZSBgQ2hyb21lLzcyLjAuMzYwMS4wYGBcbiAgICBpZiAodGhpcy5kZXRhaWxzPy5pbmZvKSB7XG4gICAgICBsb2cuZGVidWcoYEJyb3dzZXIgdmVyc2lvbiBpbiB0aGUgc3VwcGxpZWQgZGV0YWlsczogJHt0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IFZFUlNJT05fUEFUVEVSTi5leGVjKHRoaXMuZGV0YWlscz8uaW5mbz8uQnJvd3Nlcik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKHZlcnNpb25NYXRjaFsxXSk7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRWZXJzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjaHJvbWVWZXJzaW9uO1xuXG4gICAgLy8gaW4gY2FzZSBvZiBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyLCBzaW1wbHkgdHJ5IHRvIGZpbmQgdGhlIHVuZGVybHlpbmcgd2Vidmlld1xuICAgIGlmICh0aGlzLmJ1bmRsZUlkID09PSBXRUJWSUVXX1NIRUxMX0JVTkRMRV9JRCkge1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgcmV0dXJuIHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG9uIEFuZHJvaWQgNy05IHdlYnZpZXdzIGFyZSBiYWNrZWQgYnkgdGhlIG1haW4gQ2hyb21lLCBub3QgdGhlIHN5c3RlbSB3ZWJ2aWV3XG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMjQgJiYgYXBpTGV2ZWwgPD0gMjggJiZcbiAgICAgICAgICBbV0VCVklFV19TSEVMTF9CVU5ETEVfSUQsIC4uLldFQlZJRVdfQlVORExFX0lEU10uaW5jbHVkZXModGhpcy5idW5kbGVJZCkpIHtcbiAgICAgICAgdGhpcy5idW5kbGVJZCA9IENIUk9NRV9CVU5ETEVfSUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJ5IG91dCB3ZWJ2aWV3cyB3aGVuIG5vIGJ1bmRsZSBpZCBpcyBzZW50IGluXG4gICAgaWYgKCF0aGlzLmJ1bmRsZUlkKSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBnZW5lcmljIENocm9tZSBidW5kbGVcbiAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuXG4gICAgICAvLyB3ZSBoYXZlIGEgd2VidmlldyBvZiBzb21lIHNvcnQsIHNvIHRyeSB0byBmaW5kIHRoZSBidW5kbGUgdmVyc2lvblxuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNocm9tZSB2ZXJzaW9uLCBpdCBtdXN0IG5vdCBiZSBhIHdlYnZpZXdcbiAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCB0aGlzLmJ1bmRsZUlkKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgaXQgaXMgc2VtdmVyLCBzbyBsYXRlciBjaGVja3Mgd29uJ3QgZmFpbFxuICAgIHJldHVybiBjaHJvbWVWZXJzaW9uID8gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKSA6IG51bGw7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcml2ZXJzTWFwcGluZyAobmV3TWFwcGluZykge1xuICAgIGxldCBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gdHJ1ZTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5tYXBwaW5nUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3TWFwcGluZywgbnVsbCwgMiksICd1dGY4Jyk7XG4gICAgICAgIHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oYENhbm5vdCBzdG9yZSB0aGUgdXBkYXRlZCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgaW50byAnJHt0aGlzLm1hcHBpbmdQYXRofScuIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSByZWR1Y2UgdGhlIHBlcmZvcm1hbmNlIG9mIGZ1cnRoZXIgZXhlY3V0aW9ucy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZykge1xuICAgICAgT2JqZWN0LmFzc2lnbihDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIG5ld01hcHBpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIgKCkge1xuICAgIGlmICghdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyc01hcHBpbmcoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShtYXBwaW5nKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgbW9zdCByZWNlbnQga25vd24gQ2hyb21lIHZlcnNpb246ICR7Xy52YWx1ZXMobWFwcGluZylbMF19YCk7XG4gICAgfVxuXG4gICAgbGV0IGRpZFN0b3JhZ2VTeW5jID0gZmFsc2U7XG4gICAgY29uc3Qgc3luY0Nocm9tZWRyaXZlcnMgPSBhc3luYyAoY2hyb21lVmVyc2lvbikgPT4ge1xuICAgICAgZGlkU3RvcmFnZVN5bmMgPSB0cnVlO1xuICAgICAgY29uc3QgcmV0cmlldmVkTWFwcGluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZUNsaWVudC5yZXRyaWV2ZU1hcHBpbmcoKTtcbiAgICAgIGxvZy5kZWJ1ZygnR290IGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlOiAnICtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmV0cmlldmVkTWFwcGluZywgbnVsbCwgMikpO1xuICAgICAgY29uc3QgZHJpdmVyS2V5cyA9IGF3YWl0IHRoaXMuc3RvcmFnZUNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgICAgIG1pbkJyb3dzZXJWZXJzaW9uOiBjaHJvbWVWZXJzaW9uLm1ham9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcktleXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nID0gZHJpdmVyS2V5cy5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgICAgICBjb25zdCB7dmVyc2lvbiwgbWluQnJvd3NlclZlcnNpb259ID0gcmV0cmlldmVkTWFwcGluZ1t4XTtcbiAgICAgICAgYWNjW3ZlcnNpb25dID0gbWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gICAgICBPYmplY3QuYXNzaWduKG1hcHBpbmcsIHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcobWFwcGluZyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgY2RzID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVkcml2ZXJzKG1hcHBpbmcpO1xuXG4gICAgICBjb25zdCBtaXNzaW5nVmVyc2lvbnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qge3ZlcnNpb24sIG1pbkNocm9tZVZlcnNpb259IG9mIGNkcykge1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb24gfHwgbWFwcGluZ1t2ZXJzaW9uXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZXJjZWRWZXIgPSBzZW12ZXIuY29lcmNlKHZlcnNpb24pO1xuICAgICAgICBpZiAoIWNvZXJjZWRWZXIgfHwgY29lcmNlZFZlci5tYWpvciA8IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nVmVyc2lvbnNbdmVyc2lvbl0gPSBtaW5DaHJvbWVWZXJzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkobWlzc2luZ1ZlcnNpb25zKSkge1xuICAgICAgICBsb2cuaW5mbyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnQ2hyb21lZHJpdmVyJywgXy5zaXplKG1pc3NpbmdWZXJzaW9ucyksIHRydWUpfSwgYCArXG4gICAgICAgICAgYHdoaWNoICR7Xy5zaXplKG1pc3NpbmdWZXJzaW9ucykgPT09IDEgPyAnaXMnIDogJ2FyZSd9IG1pc3NpbmcgaW4gdGhlIGxpc3Qgb2Yga25vd24gdmVyc2lvbnM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1pc3NpbmdWZXJzaW9ucykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKE9iamVjdC5hc3NpZ24obWFwcGluZywgbWlzc2luZ1ZlcnNpb25zKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVCdWlsZENoZWNrKSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkoY2RzKSkge1xuICAgICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBDaHJvbWVkcml2ZXIgZXhlY3V0YWJsZSBhdmFpbGFibGUgZm9yIHVzZSBpZiBgICtcbiAgICAgICAgICAgIGAnY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2snIGNhcGFiaWxpdHkgaXMgc2V0IHRvICd0cnVlJ2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHt2ZXJzaW9uLCBleGVjdXRhYmxlfSA9IGNkc1swXTtcbiAgICAgICAgbG9nLndhcm4oYENocm9tZSBidWlsZCBjaGVjayBkaXNhYmxlZC4gVXNpbmcgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gKCR7dmVyc2lvbn0sIGF0ICcke2V4ZWN1dGFibGV9JylgKTtcbiAgICAgICAgbG9nLndhcm4oYElmIHRoaXMgaXMgd3JvbmcsIHNldCAnY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2snIGNhcGFiaWxpdHkgdG8gJ2ZhbHNlJ2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hyb21lVmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lVmVyc2lvbigpO1xuICAgICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgIC8vIHVuYWJsZSB0byBnZXQgdGhlIGNocm9tZSB2ZXJzaW9uXG4gICAgICAgIGlmIChfLmlzRW1wdHkoY2RzKSkge1xuICAgICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBDaHJvbWVkcml2ZXIgZXhlY3V0YWJsZSBhdmFpbGFibGUgZm9yIHVzZSBpZiBgICtcbiAgICAgICAgICAgIGB0aGUgY3VycmVudCBDaHJvbWUgdmVyc2lvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHt2ZXJzaW9uLCBleGVjdXRhYmxlfSA9IGNkc1swXTtcbiAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBkaXNjb3ZlciBDaHJvbWUgdmVyc2lvbi4gVXNpbmcgQ2hyb21lZHJpdmVyICR7dmVyc2lvbn0gYXQgJyR7ZXhlY3V0YWJsZX0nYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBGb3VuZCBDaHJvbWUgYnVuZGxlICcke3RoaXMuYnVuZGxlSWR9JyB2ZXJzaW9uICcke2Nocm9tZVZlcnNpb259J2ApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0RyaXZlcnMgPSBjZHMuZmlsdGVyKCh7bWluQ2hyb21lVmVyc2lvbn0pID0+IHtcbiAgICAgICAgY29uc3QgbWluQ2hyb21lVmVyc2lvblMgPSBtaW5DaHJvbWVWZXJzaW9uICYmIHNlbXZlci5jb2VyY2UobWluQ2hyb21lVmVyc2lvbik7XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvblMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hyb21lVmVyc2lvbi5tYWpvciA+IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OXG4gICAgICAgICAgPyBtaW5DaHJvbWVWZXJzaW9uUy5tYWpvciA9PT0gY2hyb21lVmVyc2lvbi5tYWpvclxuICAgICAgICAgIDogc2VtdmVyLmd0ZShjaHJvbWVWZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9uUyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChfLmlzRW1wdHkobWF0Y2hpbmdEcml2ZXJzKSkge1xuICAgICAgICBpZiAodGhpcy5zdG9yYWdlQ2xpZW50ICYmICFkaWRTdG9yYWdlU3luYykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgc3luY0Nocm9tZWRyaXZlcnMoY2hyb21lVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nLndhcm4oYENhbm5vdCBzeW5jaHJvbml6ZSBsb2NhbCBjaHJvbWVkcml2ZXJzIHdpdGggdGhlIHJlbW90ZSBzdG9yYWdlIGF0ICR7Q0RfQ0ROfTogYCArXG4gICAgICAgICAgICAgIGUubWVzc2FnZSk7XG4gICAgICAgICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9kb3dubG9hZFN1Z2dlc3Rpb24gPVxuICAgICAgICAgICdZb3UgY291bGQgYWxzbyB0cnkgdG8gZW5hYmxlIGF1dG9tYXRlZCBjaHJvbWVkcml2ZXJzIGRvd25sb2FkIHNlcnZlciBmZWF0dXJlJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy4gYCArXG4gICAgICAgICAgKCF0aGlzLnN0b3JhZ2VDbGllbnQgPyBgJHthdXRvZG93bmxvYWRTdWdnZXN0aW9ufS4gYCA6ICcnKSArXG4gICAgICAgICAgYFNlZSAke0NIUk9NRURSSVZFUl9UVVRPUklBTH0gZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiaW5QYXRoID0gbWF0Y2hpbmdEcml2ZXJzWzBdLmV4ZWN1dGFibGU7XG4gICAgICBsb2cuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ2V4ZWN1dGFibGUnLCBtYXRjaGluZ0RyaXZlcnMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICAgIGBjYXBhYmxlIG9mIGF1dG9tYXRpbmcgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy5cXG5DaG9vc2luZyB0aGUgbW9zdCByZWNlbnQsICcke2JpblBhdGh9Jy5gKTtcbiAgICAgIGxvZy5kZWJ1ZygnSWYgYSBzcGVjaWZpYyB2ZXJzaW9uIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBjaHJvbWVkcml2ZXJFeGVjdXRhYmxlYCcgK1xuICAgICAgICAnZGVzaXJlZCBjYXBhYmlsaXR5LicpO1xuICAgICAgcmV0dXJuIGJpblBhdGg7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdENocm9tZWRyaXZlclBhdGggKCkge1xuICAgIGlmICh0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCkgcmV0dXJuOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIHRoZSBleGVjdXRhYmxlIG1pZ2h0IGJlIHNldCAoaWYgcGFzc2VkIGluKVxuICAgIC8vIG9yIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBiYXNpYyBvbmUgaW5zdGFsbGVkIHdpdGggdGhpcyBkcml2ZXJcbiAgICAvLyBvciB3ZSB3YW50IHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3Qgb25lXG4gICAgaWYgKCF0aGlzLmNocm9tZWRyaXZlcikge1xuICAgICAgdGhpcy5jaHJvbWVkcml2ZXIgPSB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGVcbiAgICAgICAgPyBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBhIGNocm9tZWRyaXZlciBiaW5hcnkgYXQgdGhlIHBhdGggYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jaHJvbWVkcml2ZXJ9LCBidXQgaXQgZG9lc24ndCBleGlzdCFgKTtcbiAgICB9XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSB0cnVlO1xuICAgIGxvZy5pbmZvKGBTZXQgY2hyb21lZHJpdmVyIGJpbmFyeSBhczogJHt0aGlzLmNocm9tZWRyaXZlcn1gKTtcbiAgfVxuXG4gIHN5bmNQcm90b2NvbCAoY2RWZXJzaW9uID0gbnVsbCkge1xuICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjZFZlcnNpb24pO1xuICAgIGlmICghY29lcmNlZFZlcnNpb24gfHwgY29lcmNlZFZlcnNpb24ubWFqb3IgPCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUKSB7XG4gICAgICBsb2cuZGVidWcoYENocm9tZWRyaXZlciB2LiAke2NkVmVyc2lvbn0gZG9lcyBub3QgZnVsbHkgc3VwcG9ydCAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLiBgICtcbiAgICAgICAgYERlZmF1bHRpbmcgdG8gJHtQUk9UT0NPTFMuTUpTT05XUH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IGdldENhcFZhbHVlKHRoaXMuY2FwYWJpbGl0aWVzLCAnY2hyb21lT3B0aW9ucycsIHt9KTtcbiAgICBpZiAoY2hyb21lT3B0aW9ucy53M2MgPT09IGZhbHNlKSB7XG4gICAgICBsb2cuaW5mbyhgQ2hyb21lZHJpdmVyIHYuICR7Y2RWZXJzaW9ufSBzdXBwb3J0cyAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLCBgICtcbiAgICAgICAgYGJ1dCAke1BST1RPQ09MUy5NSlNPTldQfSBvbmUgaGFzIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuVzNDO1xuICAgIC8vIGdpdmVuIGNhcHMgbWlnaHQgbm90IGJlIHByb3Blcmx5IHByZWZpeGVkXG4gICAgLy8gc28gd2UgdHJ5IHRvIGZpeCB0aGVtIGluIG9yZGVyIHRvIHByb3Blcmx5IGluaXRcbiAgICAvLyB0aGUgbmV3IFczQyBzZXNzaW9uXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0b1czY0NhcE5hbWVzKHRoaXMuY2FwYWJpbGl0aWVzKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChjYXBzLCBlbWl0U3RhcnRpbmdTdGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGNhcHMpO1xuXG4gICAgLy8gc2V0IHRoZSBsb2dnaW5nIHByZWZlcmVuY2VzIHRvIEFMTCB0aGUgY29uc29sZSBsb2dzXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzID0gXy5jbG9uZURlZXAoZ2V0Q2FwVmFsdWUoY2FwcywgJ2xvZ2dpbmdQcmVmcycsIHt9KSk7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlcikpIHtcbiAgICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcy5icm93c2VyID0gJ0FMTCc7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRTdGFydGluZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVEFSVElORyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtgLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9YF07XG4gICAgaWYgKHRoaXMuYWRiICYmIHRoaXMuYWRiLmFkYlBvcnQpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1hZGItcG9ydD0ke3RoaXMuYWRiLmFkYlBvcnR9YCk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5jbWRBcmdzKSkge1xuICAgICAgYXJncy5wdXNoKC4uLnRoaXMuY21kQXJncyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ1BhdGgpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1sb2ctcGF0aD0ke3RoaXMubG9nUGF0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1kaXNhYmxlLWJ1aWxkLWNoZWNrJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS12ZXJib3NlJyk7XG4gICAgLy8gd2hhdCBhcmUgdGhlIHByb2Nlc3Mgc3Rkb3V0L3N0ZGVyciBjb25kaXRpb25zIHdoZXJlaW4gd2Uga25vdyB0aGF0XG4gICAgLy8gdGhlIHByb2Nlc3MgaGFzIHN0YXJ0ZWQgdG8gb3VyIHNhdGlzZmFjdGlvbj9cbiAgICBjb25zdCBzdGFydERldGVjdG9yID0gKHN0ZG91dCkgPT4gc3Rkb3V0LnN0YXJ0c1dpdGgoJ1N0YXJ0aW5nICcpO1xuXG4gICAgbGV0IHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgbGV0IHdlYnZpZXdWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRDaHJvbWVkcml2ZXJQYXRoKCk7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxBbGwoKTtcblxuICAgICAgLy8gc2V0IHVwIG91ciBzdWJwcm9jZXNzIG9iamVjdFxuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5jaHJvbWVkcml2ZXIsIGFyZ3MpO1xuICAgICAgcHJvY2Vzc0lzQWxpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBoYW5kbGUgbG9nIG91dHB1dFxuICAgICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgLy8gaWYgdGhlIGNkIG91dHB1dCBpcyBub3QgcHJpbnRlZCwgZmluZCB0aGUgY2hyb21lIHZlcnNpb24gYW5kIHByaW50XG4gICAgICAgIC8vIHdpbGwgZ2V0IGEgcmVzcG9uc2UgbGlrZVxuICAgICAgICAvLyAgIERldlRvb2xzIHJlc3BvbnNlOiB7XG4gICAgICAgIC8vICAgICAgXCJBbmRyb2lkLVBhY2thZ2VcIjogXCJpby5hcHBpdW0uc2FtcGxlYXBwXCIsXG4gICAgICAgIC8vICAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzU1LjAuMjg4My45MVwiLFxuICAgICAgICAvLyAgICAgIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuMlwiLFxuICAgICAgICAvLyAgICAgIFwiVXNlci1BZ2VudFwiOiBcIi4uLlwiLFxuICAgICAgICAvLyAgICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzZcIlxuICAgICAgICAvLyAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gc3Rkb3V0ICsgc3RkZXJyO1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXCJCcm93c2VyXCI6IFwiKC4qKVwiLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHdlYnZpZXdWZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgbG9nLmRlYnVnKGBXZWJ2aWV3IHZlcnNpb246ICcke3dlYnZpZXdWZXJzaW9ufSdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsc28gcHJpbnQgY2hyb21lZHJpdmVyIHZlcnNpb24gdG8gbG9nc1xuICAgICAgICAvLyB3aWxsIG91dHB1dCBzb21ldGhpbmcgbGlrZVxuICAgICAgICAvLyAgU3RhcnRpbmcgQ2hyb21lRHJpdmVyIDIuMzMuNTA2MTA2ICg4YTA2YzM5YzQ1ODJmYmZiYWI2OTY2ZGJiMWMzOGE5MTczYmZiMWEyKSBvbiBwb3J0IDk1MTVcbiAgICAgICAgbWF0Y2ggPSAvU3RhcnRpbmcgQ2hyb21lRHJpdmVyIChbLlxcZF0rKS8uZXhlYyhvdXQpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYENocm9tZWRyaXZlciB2ZXJzaW9uOiAnJHttYXRjaFsxXX0nYCk7XG4gICAgICAgICAgdGhpcy5zeW5jUHJvdG9jb2wobWF0Y2hbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZSB0aGUgb3V0cHV0IGlmIGl0IGlzIHJlcXVlc3RlZFxuICAgICAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICAgICAgZm9yIChsZXQgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS50cmltKCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmxlbmd0aCkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1NURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIChzdGRlcnIgfHwgJycpLnRyaW0oKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgIGlmICghbGluZS50cmltKCkubGVuZ3RoKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgICAgICAgbG9nLmVycm9yKGBbU1RERVJSXSAke2xpbmV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gaGFuZGxlIG91dC1vZi1ib3VuZCBleGl0IGJ5IHNpbXBseSBlbWl0dGluZyBhIHN0b3BwZWQgc3RhdGVcbiAgICAgIHRoaXMucHJvYy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgcHJvY2Vzc0lzQWxpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBJTkcgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBDaHJvbWVkcml2ZXIgZXhpdGVkIHVuZXhwZWN0ZWRseSB3aXRoIGNvZGUgJHtjb2RlfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGBzaWduYWwgJHtzaWduYWx9YDtcbiAgICAgICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2cuaW5mbyhgU3Bhd25pbmcgY2hyb21lZHJpdmVyIHdpdGg6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9IGAgK1xuICAgICAgICAgICAgICAgYCR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAvLyBzdGFydCBzdWJwcm9jIGFuZCB3YWl0IGZvciBzdGFydERldGVjdG9yXG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoc3RhcnREZXRlY3Rvcik7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JPbmxpbmUoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5lbWl0KENocm9tZWRyaXZlci5FVkVOVF9FUlJPUiwgZSk7XG4gICAgICAvLyBqdXN0IGJlY2F1c2Ugd2UgaGFkIGFuIGVycm9yIGRvZXNuJ3QgbWVhbiB0aGUgY2hyb21lZHJpdmVyIHByb2Nlc3NcbiAgICAgIC8vIGZpbmlzaGVkOyB3ZSBzaG91bGQgY2xlYW4gdXAgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAocHJvY2Vzc0lzQWxpdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgIC8vIG9mdGVuIHRoZSB1c2VyJ3MgQ2hyb21lIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdmVyc2lvbiBvZiBDaHJvbWVkcml2ZXJcbiAgICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoJ0Nocm9tZSB2ZXJzaW9uIG11c3QgYmUnKSkge1xuICAgICAgICBtZXNzYWdlICs9ICdVbmFibGUgdG8gYXV0b21hdGUgQ2hyb21lIHZlcnNpb24gYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiBDaHJvbWVkcml2ZXIuXFxuJztcbiAgICAgICAgaWYgKHdlYnZpZXdWZXJzaW9uKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgQ2hyb21lIHZlcnNpb24gb24gdGhlIGRldmljZTogJHt3ZWJ2aWV3VmVyc2lvbn1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcnNpb25zU3VwcG9ydGVkQnlEcml2ZXIgPSAvQ2hyb21lIHZlcnNpb24gbXVzdCBiZSAoLispLy5leGVjKGUubWVzc2FnZSk/LlsxXSB8fCAnJztcbiAgICAgICAgaWYgKHZlcnNpb25zU3VwcG9ydGVkQnlEcml2ZXIpIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBDaHJvbWVkcml2ZXIgc3VwcG9ydHMgQ2hyb21lIHZlcnNpb24ocyk6ICR7dmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlcn1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gYFZpc2l0ICcke0NIUk9NRURSSVZFUl9UVVRPUklBTH0nIHRvIHRyb3VibGVzaG9vdCB0aGUgcHJvYmxlbS5cXG5gO1xuICAgICAgfVxuXG4gICAgICBtZXNzYWdlICs9IGUubWVzc2FnZTtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHNlc3Npb25JZCAoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cHJveHkuc2Vzc2lvbklkO1xuICB9XG5cbiAgYXN5bmMgcmVzdGFydCAoKSB7XG4gICAgbG9nLmluZm8oJ1Jlc3RhcnRpbmcgY2hyb21lZHJpdmVyJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlc3RhcnQgd2hlbiB3ZSdyZSBub3Qgb25saW5lXCIpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HKTtcbiAgICBhd2FpdCB0aGlzLnN0b3AoZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQodGhpcy5jYXBhYmlsaXRpZXMsIGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JPbmxpbmUgKCkge1xuICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgQ0QgaGFzbid0IGNyYXNoZWRcbiAgICBsZXQgY2hyb21lZHJpdmVyU3RvcHBlZCA9IGZhbHNlO1xuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoMjAsIDIwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIC8vIHdlIGFyZSBlaXRoZXIgc3RvcHBlZCBvciBzdG9wcGluZywgc28gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgICAgY2hyb21lZHJpdmVyU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfSk7XG4gICAgaWYgKGNocm9tZWRyaXZlclN0b3BwZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hyb21lRHJpdmVyIGNyYXNoZWQgZHVyaW5nIHN0YXJ0dXAuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKCkge1xuICAgIGNvbnN0IHNlc3Npb25DYXBzID0gdGhpcy5kZXNpcmVkUHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0NcbiAgICAgID8ge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiB0aGlzLmNhcGFiaWxpdGllc319XG4gICAgICA6IHtkZXNpcmVkQ2FwYWJpbGl0aWVzOiB0aGlzLmNhcGFiaWxpdGllc307XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nICR7dGhpcy5kZXNpcmVkUHJvdG9jb2x9IENocm9tZWRyaXZlciBzZXNzaW9uIHdpdGggY2FwYWJpbGl0aWVzOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNlc3Npb25DYXBzLCBudWxsLCAyKSk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCBzZXNzaW9uQ2Fwcyk7XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKGVtaXRTdGF0ZXMgPSB0cnVlKSB7XG4gICAgaWYgKGVtaXRTdGF0ZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJyk7XG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgnU0lHVEVSTScsIDIwMDAwKTtcbiAgICAgIGlmIChlbWl0U3RhdGVzKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgbG9nLmRlYnVnKGBDaGFuZ2VkIHN0YXRlIHRvICcke3N0YXRlfSdgKTtcbiAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIHtzdGF0ZX0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxIChyZXEsIHJlcykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICB9XG5cbiAgYXN5bmMga2lsbEFsbCAoKSB7XG4gICAgbGV0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKVxuICAgICAgPyBgd21pYyBwcm9jZXNzIHdoZXJlIFwiY29tbWFuZGxpbmUgbGlrZSAnJWNocm9tZWRyaXZlci5leGUlLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9JSdcIiBkZWxldGVgXG4gICAgICA6IGBwa2lsbCAtMTUgLWYgXCIke3RoaXMuY2hyb21lZHJpdmVyfS4qLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9XCJgO1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBhbnkgb2xkIGNocm9tZWRyaXZlcnMsIHJ1bm5pbmc6ICR7Y21kfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCAoQi5wcm9taXNpZnkoY3AuZXhlYykpKGNtZCk7XG4gICAgICBsb2cuZGVidWcoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIHVwIG9sZCBjaHJvbWVkcml2ZXJzJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybignTm8gb2xkIGNocm9tZWRyaXZlcnMgc2VlbSB0byBleGlzdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgdWRpZEluZGV4ID0gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09ICctcycpO1xuICAgICAgY29uc3QgdWRpZCA9IHVkaWRJbmRleCA+IC0xID8gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1t1ZGlkSW5kZXggKyAxXSA6IG51bGw7XG5cbiAgICAgIGlmICh1ZGlkKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdGhpcyBkZXZpY2UncyBhZGIgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb25zOiAke3VkaWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIGFueSBvbGQgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uc2ApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBjb25uIG9mIGF3YWl0IHRoaXMuYWRiLmdldEZvcndhcmRMaXN0KCkpIHtcbiAgICAgICAgICAvLyBjaHJvbWVkcml2ZXIgd2lsbCBhc2sgQURCIHRvIGZvcndhcmQgYSBwb3J0IGxpa2UgXCJkZXZpY2VJZCB0Y3A6cG9ydCBsb2NhbGFic3RyYWN0OndlYnZpZXdfZGV2dG9vbHNfcmVtb3RlX3BvcnRcIlxuICAgICAgICAgIGlmICghKGNvbm4uaW5jbHVkZXMoJ3dlYnZpZXdfZGV2dG9vbHMnKSAmJiAoIXVkaWQgfHwgY29ubi5pbmNsdWRlcyh1ZGlkKSkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyYW1zID0gY29ubi5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQocGFyYW1zWzFdLnJlcGxhY2UoL1tcXERdKi8sICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBjbGVhbiBmb3J3YXJkZWQgcG9ydHMuIEVycm9yOiAnJHtlcnIubWVzc2FnZX0nLiBDb250aW51aW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1dvcmtpbmdXZWJ2aWV3ICgpIHtcbiAgICAvLyBzb21ldGltZXMgY2hyb21lZHJpdmVyIHN0b3BzIGF1dG9tYXRpbmcgd2Vidmlld3MuIHRoaXMgbWV0aG9kIHJ1bnMgYVxuICAgIC8vIHNpbXBsZSBjb21tYW5kIHRvIGRldGVybWluZSBvdXIgc3RhdGUsIGFuZCByZXNwb25kcyBhY2NvcmRpbmdseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3VybCcsICdHRVQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SID0gJ2Nocm9tZWRyaXZlcl9lcnJvcic7XG5DaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCA9ICdzdGF0ZUNoYW5nZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgPSAnc3RvcHBlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcgPSAnc3RhcnRpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSA9ICdvbmxpbmUnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HID0gJ3N0b3BwaW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HID0gJ3Jlc3RhcnRpbmcnO1xuXG5leHBvcnQgeyBDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlcjtcbiJdLCJmaWxlIjoibGliL2Nocm9tZWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
package/build/lib/install.js
CHANGED
|
@@ -5,12 +5,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.install = install;
|
|
9
8
|
exports.doInstall = doInstall;
|
|
9
|
+
exports.install = install;
|
|
10
10
|
|
|
11
11
|
require("source-map-support/register");
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _support = require("@appium/support");
|
|
14
14
|
|
|
15
15
|
var _storageClient = _interopRequireDefault(require("./storage-client"));
|
|
16
16
|
|
|
@@ -31,8 +31,8 @@ async function formatCdVersion(ver) {
|
|
|
31
31
|
async function prepareChromedriverDir(platformName) {
|
|
32
32
|
const chromedriverDir = (0, _utils.getChromedriverDir)(platformName);
|
|
33
33
|
|
|
34
|
-
if (!(await
|
|
35
|
-
await (0,
|
|
34
|
+
if (!(await _support.fs.exists(chromedriverDir))) {
|
|
35
|
+
await (0, _support.mkdirp)(chromedriverDir);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
return chromedriverDir;
|
|
@@ -54,4 +54,4 @@ async function doInstall() {
|
|
|
54
54
|
}require('source-map-support').install();
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbnN0YWxsLmpzIl0sIm5hbWVzIjpbIkRPV05MT0FEX1RJTUVPVVRfTVMiLCJMQVRFU1RfVkVSU0lPTiIsImZvcm1hdENkVmVyc2lvbiIsInZlciIsIkNEX0NETiIsImFjY2VwdCIsInRpbWVvdXQiLCJ0cmltIiwicHJlcGFyZUNocm9tZWRyaXZlckRpciIsInBsYXRmb3JtTmFtZSIsImNocm9tZWRyaXZlckRpciIsImZzIiwiZXhpc3RzIiwiaW5zdGFsbCIsIm9zSW5mbyIsImNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJuYW1lIiwic3luY0RyaXZlcnMiLCJ2ZXJzaW9ucyIsIkNEX1ZFUiIsImRvSW5zdGFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsbUJBQW1CLEdBQUcsS0FBSyxJQUFqQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxRQUF2Qjs7QUFFQSxlQUFlQyxlQUFmLENBQWdDQyxHQUFoQyxFQUFxQztBQUNuQyxTQUFPQSxHQUFHLEtBQUtGLGNBQVIsR0FDSCxDQUFDLE1BQU0seUJBQWMsR0FBRUcsYUFBTyxpQkFBdkIsRUFBeUM7QUFDaEQsa0JBQWMsUUFEa0M7QUFFaERDLElBQUFBLE1BQU0sRUFBRTtBQUZ3QyxHQUF6QyxFQUdOO0FBQUVDLElBQUFBLE9BQU8sRUFBRU47QUFBWCxHQUhNLENBQVAsRUFHb0NPLElBSHBDLEVBREcsR0FLSEosR0FMSjtBQU1EOztBQUVELGVBQWVLLHNCQUFmLENBQXVDQyxZQUF2QyxFQUFxRDtBQUNuRCxRQUFNQyxlQUFlLEdBQUcsK0JBQW1CRCxZQUFuQixDQUF4Qjs7QUFDQSxNQUFJLEVBQUMsTUFBTUUsWUFBR0MsTUFBSCxDQUFVRixlQUFWLENBQVAsQ0FBSixFQUF1QztBQUNyQyxVQUFNLHFCQUFPQSxlQUFQLENBQU47QUFDRDs7QUFDRCxTQUFPQSxlQUFQO0FBQ0Q7O0FBRUQsZUFBZUcsT0FBZixHQUEwQjtBQUN4QixRQUFNQyxNQUFNLEdBQUcsTUFBTSx1QkFBckI7QUFDQSxRQUFNQyxNQUFNLEdBQUcsSUFBSUMsc0JBQUosQ0FBOEI7QUFDM0NOLElBQUFBLGVBQWUsRUFBRSxNQUFNRixzQkFBc0IsQ0FBQ00sTUFBTSxDQUFDRyxJQUFSO0FBREYsR0FBOUIsQ0FBZjtBQUdBLFFBQU1GLE1BQU0sQ0FBQ0csV0FBUCxDQUFtQjtBQUN2QkosSUFBQUEsTUFEdUI7QUFFdkJLLElBQUFBLFFBQVEsRUFBRSxDQUFDLE1BQU1qQixlQUFlLENBQUNrQixhQUFELENBQXRCO0FBRmEsR0FBbkIsQ0FBTjtBQUlEOztBQUVELGVBQWVDLFNBQWYsR0FBNEI7QUFDMUIsUUFBTVIsT0FBTyxFQUFiO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ0RfQ0ROLCBDRF9WRVIsIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBnZXRDaHJvbWVkcml2ZXJEaXIsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5cbmNvbnN0IERPV05MT0FEX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7XG5jb25zdCBMQVRFU1RfVkVSU0lPTiA9ICdMQVRFU1QnO1xuXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDZFZlcnNpb24gKHZlcikge1xuICByZXR1cm4gdmVyID09PSBMQVRFU1RfVkVSU0lPTlxuICAgID8gKGF3YWl0IHJldHJpZXZlRGF0YShgJHtDRF9DRE59L0xBVEVTVF9SRUxFQVNFYCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiBET1dOTE9BRF9USU1FT1VUX01TIH0pKS50cmltKClcbiAgICA6IHZlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNocm9tZWRyaXZlckRpciAocGxhdGZvcm1OYW1lKSB7XG4gIGNvbnN0IGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcihwbGF0Zm9ybU5hbWUpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjaHJvbWVkcml2ZXJEaXIpKSB7XG4gICAgYXdhaXQgbWtkaXJwKGNocm9tZWRyaXZlckRpcik7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlckRpcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCAoKSB7XG4gIGNvbnN0IG9zSW5mbyA9IGF3YWl0IGdldE9zSW5mbygpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7XG4gICAgY2hyb21lZHJpdmVyRGlyOiBhd2FpdCBwcmVwYXJlQ2hyb21lZHJpdmVyRGlyKG9zSW5mby5uYW1lKSxcbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgb3NJbmZvLFxuICAgIHZlcnNpb25zOiBbYXdhaXQgZm9ybWF0Q2RWZXJzaW9uKENEX1ZFUildLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9JbnN0YWxsICgpIHtcbiAgYXdhaXQgaW5zdGFsbCgpO1xufVxuXG5leHBvcnQgeyBpbnN0YWxsLCBkb0luc3RhbGwgfTtcbiJdLCJmaWxlIjoibGliL2luc3RhbGwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -5,19 +5,19 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.toW3cCapNames = toW3cCapNames;
|
|
9
8
|
exports.getCapValue = getCapValue;
|
|
9
|
+
exports.toW3cCapNames = toW3cCapNames;
|
|
10
10
|
|
|
11
11
|
require("source-map-support/register");
|
|
12
12
|
|
|
13
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _baseDriver = require("@appium/base-driver");
|
|
16
16
|
|
|
17
17
|
const W3C_PREFIX = 'goog:';
|
|
18
18
|
|
|
19
19
|
function toW3cCapName(capName) {
|
|
20
|
-
return _lodash.default.isString(capName) && !capName.includes(':') && !(0,
|
|
20
|
+
return _lodash.default.isString(capName) && !capName.includes(':') && !(0, _baseDriver.isStandardCap)(capName) ? `${W3C_PREFIX}${capName}` : capName;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
function getCapValue(allCaps = {}, rawCapName, defaultValue) {
|
|
@@ -38,4 +38,4 @@ function toW3cCapNames(originalCaps = {}) {
|
|
|
38
38
|
}require('source-map-support').install();
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIlczQ19QUkVGSVgiLCJ0b1czY0NhcE5hbWUiLCJjYXBOYW1lIiwiXyIsImlzU3RyaW5nIiwiaW5jbHVkZXMiLCJnZXRDYXBWYWx1ZSIsImFsbENhcHMiLCJyYXdDYXBOYW1lIiwiZGVmYXVsdFZhbHVlIiwiY2FwVmFsdWUiLCJ0b1BhaXJzIiwidG9XM2NDYXBOYW1lcyIsIm9yaWdpbmFsQ2FwcyIsInJlZHVjZSIsImFjYyIsInZhbHVlIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsT0FBbkI7O0FBRUEsU0FBU0MsWUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0M7QUFDOUIsU0FBUUMsZ0JBQUVDLFFBQUYsQ0FBV0YsT0FBWCxLQUF1QixDQUFDQSxPQUFPLENBQUNHLFFBQVIsQ0FBaUIsR0FBakIsQ0FBeEIsSUFBaUQsQ0FBQywrQkFBY0gsT0FBZCxDQUFuRCxHQUNGLEdBQUVGLFVBQVcsR0FBRUUsT0FBUSxFQURyQixHQUVIQSxPQUZKO0FBR0Q7O0FBRUQsU0FBU0ksV0FBVCxDQUFzQkMsT0FBTyxHQUFHLEVBQWhDLEVBQW9DQyxVQUFwQyxFQUFnREMsWUFBaEQsRUFBOEQ7QUFDNUQsT0FBSyxNQUFNLENBQUNQLE9BQUQsRUFBVVEsUUFBVixDQUFYLElBQWtDUCxnQkFBRVEsT0FBRixDQUFVSixPQUFWLENBQWxDLEVBQXNEO0FBQ3BELFFBQUlOLFlBQVksQ0FBQ0MsT0FBRCxDQUFaLEtBQTBCRCxZQUFZLENBQUNPLFVBQUQsQ0FBMUMsRUFBd0Q7QUFDdEQsYUFBT0UsUUFBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBT0QsWUFBUDtBQUNEOztBQUVELFNBQVNHLGFBQVQsQ0FBd0JDLFlBQVksR0FBRyxFQUF2QyxFQUEyQztBQUN6QyxTQUFPVixnQkFBRVcsTUFBRixDQUFTRCxZQUFULEVBQXVCLENBQUNFLEdBQUQsRUFBTUMsS0FBTixFQUFhQyxHQUFiLEtBQXFCO0FBQ2pERixJQUFBQSxHQUFHLENBQUNkLFlBQVksQ0FBQ2dCLEdBQUQsQ0FBYixDQUFILEdBQXlCRCxLQUF6QjtBQUNBLFdBQU9ELEdBQVA7QUFDRCxHQUhNLEVBR0osRUFISSxDQUFQO0FBSUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZENhcCB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuXG5jb25zdCBXM0NfUFJFRklYID0gJ2dvb2c6JztcblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lIChjYXBOYW1lKSB7XG4gIHJldHVybiAoXy5pc1N0cmluZyhjYXBOYW1lKSAmJiAhY2FwTmFtZS5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcE5hbWUpKVxuICAgID8gYCR7VzNDX1BSRUZJWH0ke2NhcE5hbWV9YFxuICAgIDogY2FwTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FwVmFsdWUgKGFsbENhcHMgPSB7fSwgcmF3Q2FwTmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGZvciAoY29uc3QgW2NhcE5hbWUsIGNhcFZhbHVlXSBvZiBfLnRvUGFpcnMoYWxsQ2FwcykpIHtcbiAgICBpZiAodG9XM2NDYXBOYW1lKGNhcE5hbWUpID09PSB0b1czY0NhcE5hbWUocmF3Q2FwTmFtZSkpIHtcbiAgICAgIHJldHVybiBjYXBWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lcyAob3JpZ2luYWxDYXBzID0ge30pIHtcbiAgcmV0dXJuIF8ucmVkdWNlKG9yaWdpbmFsQ2FwcywgKGFjYywgdmFsdWUsIGtleSkgPT4ge1xuICAgIGFjY1t0b1czY0NhcE5hbWUoa2V5KV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCB7IHRvVzNjQ2FwTmFtZXMsIGdldENhcFZhbHVlIH07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|