appium-android-driver 4.45.0 → 4.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/webview-helpers.js +27 -9
- package/lib/webview-helpers.js +24 -11
- package/package.json +1 -2
|
@@ -19,12 +19,14 @@ var _appiumSupport = require("appium-support");
|
|
|
19
19
|
|
|
20
20
|
var _portscanner = require("portscanner");
|
|
21
21
|
|
|
22
|
-
var _asyncLock = _interopRequireDefault(require("async-lock"));
|
|
23
|
-
|
|
24
22
|
var _lruCache = _interopRequireDefault(require("lru-cache"));
|
|
25
23
|
|
|
26
24
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
27
25
|
|
|
26
|
+
var _path = _interopRequireDefault(require("path"));
|
|
27
|
+
|
|
28
|
+
var _os = _interopRequireDefault(require("os"));
|
|
29
|
+
|
|
28
30
|
const NATIVE_WIN = 'NATIVE_APP';
|
|
29
31
|
exports.NATIVE_WIN = NATIVE_WIN;
|
|
30
32
|
const WEBVIEW_WIN = 'WEBVIEW';
|
|
@@ -42,12 +44,17 @@ const CHROME_PACKAGE_NAME = 'com.android.chrome';
|
|
|
42
44
|
const KNOWN_CHROME_PACKAGE_NAMES = [CHROME_PACKAGE_NAME, 'com.chrome.beta', 'com.chrome.dev', 'com.chrome.canary'];
|
|
43
45
|
exports.KNOWN_CHROME_PACKAGE_NAMES = KNOWN_CHROME_PACKAGE_NAMES;
|
|
44
46
|
const DEVTOOLS_PORTS_RANGE = [10900, 11000];
|
|
45
|
-
const PORT_ALLOCATION_GUARD = new _asyncLock.default();
|
|
46
47
|
const WEBVIEWS_DETAILS_CACHE = new _lruCache.default({
|
|
47
48
|
max: 100,
|
|
48
49
|
updateAgeOnGet: true
|
|
49
50
|
});
|
|
50
51
|
const CDP_REQ_TIMEOUT = 2000;
|
|
52
|
+
|
|
53
|
+
const DEVTOOLS_PORT_ALLOCATION_GUARD = _appiumSupport.util.getLockFileGuard(_path.default.resolve(_os.default.tmpdir(), 'android_devtools_port_guard'), {
|
|
54
|
+
timeout: 7,
|
|
55
|
+
tryRecovery: true
|
|
56
|
+
});
|
|
57
|
+
|
|
51
58
|
const helpers = {};
|
|
52
59
|
exports.helpers = helpers;
|
|
53
60
|
|
|
@@ -132,18 +139,29 @@ async function webviewsFromProcs(adb, deviceSocket = null) {
|
|
|
132
139
|
}
|
|
133
140
|
|
|
134
141
|
async function allocateDevtoolsPort(adb, socketName, webviewDevtoolsPort = null) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
142
|
+
const remotePort = socketName.replace(/^@/, '');
|
|
143
|
+
let [startPort, endPort] = DEVTOOLS_PORTS_RANGE;
|
|
144
|
+
|
|
145
|
+
if (webviewDevtoolsPort) {
|
|
146
|
+
endPort = webviewDevtoolsPort + (endPort - startPort);
|
|
147
|
+
startPort = webviewDevtoolsPort;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
_logger.default.debug(`Forwarding remote port ${remotePort} to a local ` + `port in range ${startPort}..${endPort}`);
|
|
151
|
+
|
|
152
|
+
if (!webviewDevtoolsPort) {
|
|
153
|
+
_logger.default.debug(`You could use the 'webviewDevtoolsPort' capability to customize ` + `the starting port number`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return await DEVTOOLS_PORT_ALLOCATION_GUARD(async () => {
|
|
138
157
|
let localPort;
|
|
139
158
|
|
|
140
159
|
try {
|
|
141
160
|
localPort = await (0, _portscanner.findAPortNotInUse)(startPort, endPort);
|
|
142
161
|
} catch (e) {
|
|
143
|
-
throw new Error(`Cannot find any free port to forward the
|
|
162
|
+
throw new Error(`Cannot find any free port to forward the Devtools socket ` + `in range ${startPort}..${endPort}. You could set the starting port number ` + `manually by providing the 'webviewDevtoolsPort' capability`);
|
|
144
163
|
}
|
|
145
164
|
|
|
146
|
-
const remotePort = socketName.replace(/^@/, '');
|
|
147
165
|
await adb.adbExec(['forward', `tcp:${localPort}`, `localabstract:${remotePort}`]);
|
|
148
166
|
return localPort;
|
|
149
167
|
});
|
|
@@ -435,4 +453,4 @@ var _default = helpers;
|
|
|
435
453
|
exports.default = _default;require('source-map-support').install();
|
|
436
454
|
|
|
437
455
|
|
|
438
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiXSwibmFtZXMiOlsiTkFUSVZFX1dJTiIsIldFQlZJRVdfV0lOIiwiQ0hST01JVU1fV0lOIiwiV0VCVklFV19CQVNFIiwiV0VCVklFV19QSURfUEFUVEVSTiIsIlJlZ0V4cCIsIldFQlZJRVdfUEtHX1BBVFRFUk4iLCJERVZUT09MU19TT0NLRVRfUEFUVEVSTiIsIkNST1NTV0FMS19TT0NLRVRfUEFUVEVSTiIsIkNIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCIsIkNIUk9NRV9QQUNLQUdFX05BTUUiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsIkRFVlRPT0xTX1BPUlRTX1JBTkdFIiwiUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwiQXN5bmNMb2NrIiwiV0VCVklFV1NfREVUQUlMU19DQUNIRSIsIkxSVSIsIm1heCIsInVwZGF0ZUFnZU9uR2V0IiwiQ0RQX1JFUV9USU1FT1VUIiwiaGVscGVycyIsInRvRGV0YWlsc0NhY2hlS2V5IiwiYWRiIiwid2VidmlldyIsImN1ckRldmljZUlkIiwiZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIiwib3V0Iiwic2hlbGwiLCJuYW1lcyIsImFsbE1hdGNoZXMiLCJsaW5lIiwic3BsaXQiLCJmbGFncyIsInN0Iiwic29ja1BhdGgiLCJ0cmltIiwic3RhcnRzV2l0aCIsInB1c2giLCJ0ZXN0IiwiXyIsImlzRW1wdHkiLCJsb2dnZXIiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwidW5pcSIsIndlYnZpZXdzRnJvbVByb2NzIiwiZGV2aWNlU29ja2V0Iiwic29ja2V0TmFtZXMiLCJ3ZWJ2aWV3cyIsInNvY2tldE5hbWUiLCJwcm9jIiwic29ja2V0TmFtZU1hdGNoIiwiZXhlYyIsImNyb3Nzd2Fsa01hdGNoIiwiYWxsb2NhdGVEZXZ0b29sc1BvcnQiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiYWNxdWlyZSIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJsb2NhbFBvcnQiLCJlIiwiRXJyb3IiLCJyZW1vdGVQb3J0IiwicmVwbGFjZSIsImFkYkV4ZWMiLCJjb2xsZWN0V2Vidmlld3NEZXRhaWxzIiwid2Vidmlld3NNYXBwaW5nIiwib3B0cyIsImVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIiwiZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIiwiaW5mbyIsImRldGFpbENvbGxlY3RvcnMiLCJpdGVtIiwiY2RwSW5mbyIsInBhZ2VzIiwiY2RwTGlzdCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiQiIsImFsbCIsInVybCIsInRpbWVvdXQiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWwiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImxvZ2dpbmdQcmVmcyIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsIm5ld1ByZWYiLCJwZXJmb3JtYW5jZSIsIk9iamVjdCIsImFzc2lnbiIsIkFyZ3VtZW50cyIsImFyZ3MiLCJwcm90ZWN0ZWRDYXBOYW1lcyIsIm9wdCIsInZhbCIsInRvUGFpcnMiLCJpc1VuZGVmaW5lZCIsIm9wdE5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBRyxTQUFwQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsVUFBckI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVGLFdBQVksR0FBcEM7O0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFBSUMsTUFBSixDQUFZLElBQUdGLFlBQWEsUUFBNUIsQ0FBNUI7QUFDQSxNQUFNRyxtQkFBbUIsR0FBRyxJQUFJRCxNQUFKLENBQVksSUFBR0YsWUFBYSxvQkFBNUIsQ0FBNUI7QUFDQSxNQUFNSSx1QkFBdUIsR0FBRyxtQ0FBaEM7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyw2QkFBakM7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyx3QkFBakM7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvQkFBNUI7QUFDQSxNQUFNQywwQkFBMEIsR0FBRyxDQUNqQ0QsbUJBRGlDLEVBRWpDLGlCQUZpQyxFQUdqQyxnQkFIaUMsRUFJakMsbUJBSmlDLENBQW5DOztBQU1BLE1BQU1FLG9CQUFvQixHQUFHLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FBN0I7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJQyxrQkFBSixFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGlCQUFKLENBQVE7QUFDckNDLEVBQUFBLEdBQUcsRUFB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c2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBQT1JUX0FMTE9DQVRJT05fR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5mdW5jdGlvbiB0b0RldGFpbHNDYWNoZUtleSAoYWRiLCB3ZWJ2aWV3KSB7XG4gIHJldHVybiBgJHthZGI/LmN1ckRldmljZUlkfToke3dlYnZpZXd9YDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSBsaXN0IG9mIGFuZHJvaWQgc3lzdGVtIHByb2Nlc3NlcyBhbmQgcmV0dXJucyBvbmVzXG4gKiB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3c1xuICogU2VlIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2YgbWF0Y2hpbmcgd2VidmlldyBzb2NrZXQgbmFtZXMgKGluY2x1ZGluZyB0aGUgbGVhZGluZyAnQCcpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyAoYWRiKSB7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3QgbmFtZXMgPSBbXTtcbiAgY29uc3QgYWxsTWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIC8vIE51bSBSZWZDb3VudCBQcm90b2NvbCBGbGFncyBUeXBlIFN0IElub2RlIFBhdGhcbiAgICBjb25zdCBbLCwsIGZsYWdzLCwgc3QsLCBzb2NrUGF0aF0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmICghc29ja1BhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc29ja1BhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBhbGxNYXRjaGVzLnB1c2gobGluZS50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MgIT09ICcwMDAxMDAwMCcgfHwgc3QgIT09ICcwMScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIURFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLnRlc3Qoc29ja1BhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuYW1lcy5wdXNoKHNvY2tQYXRoKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbm8gYWN0aXZlIGRldnRvb2xzIHNvY2tldHMnKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxNYXRjaGVzKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBPdGhlciBzb2NrZXRzIGFyZTogJHtKU09OLnN0cmluZ2lmeShhbGxNYXRjaGVzLCBudWxsLCAyKX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgJHtuYW1lcy5sZW5ndGh9IGFjdGl2ZSBkZXZ0b29scyAke3V0aWwucGx1cmFsaXplKCdzb2NrZXQnLCBuYW1lcy5sZW5ndGgsIGZhbHNlKX06IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZXMpKTtcbiAgfVxuICAvLyBzb21ldGltZXMgdGhlIHdlYnZpZXcgcHJvY2VzcyBzaG93cyB1cCBtdWx0aXBsZSB0aW1lcyBwZXIgYXBwXG4gIHJldHVybiBfLnVuaXEobmFtZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9jXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyAtIFRoZSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZSAoYXMgcmV0dXJuZWQgYnlcbiAqIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgLSBUaGUgYWN0dWFsIHdlYnZpZXcgY29udGV4dCBuYW1lXG4gKi9cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYSBsaXN0IG9mIHN5c3RlbSBwcm9jZXNzZXMgdGhhdCBsb29rIGxpa2Ugd2Vidmlld3MsXG4gKiBhbmQgcmV0dXJucyB0aGVtIGFsb25nIHdpdGggdGhlIHdlYnZpZXcgY29udGV4dCBuYW1lIGFwcHJvcHJpYXRlIGZvciBpdC5cbiAqIElmIHdlIHBhc3MgaW4gYSBkZXZpY2VTb2NrZXQsIHdlIG9ubHkgYXR0ZW1wdCB0byBmaW5kIHdlYnZpZXdzIHdoaWNoIG1hdGNoXG4gKiB0aGF0IHNvY2tldCBuYW1lICh0aGlzIGlzIGZvciBhcHBzIHdoaWNoIGVtYmVkIENocm9taXVtLCB3aGljaCBpc24ndCB0aGVcbiAqIHNhbWUgYXMgY2hyb21lLWJhY2tlZCB3ZWJ2aWV3cykuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHs/c3RyaW5nfSBkZXZpY2VTb2NrZXQgLSB0aGUgZXhwbGljdGx5LW5hbWVkIGRldmljZSBzb2NrZXQgdG8gdXNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFdlYnZpZXdQcm9jPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Vidmlld3NGcm9tUHJvY3MgKGFkYiwgZGV2aWNlU29ja2V0ID0gbnVsbCkge1xuICBjb25zdCBzb2NrZXROYW1lcyA9IGF3YWl0IGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyhhZGIpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IFtdO1xuICBmb3IgKGNvbnN0IHNvY2tldE5hbWUgb2Ygc29ja2V0TmFtZXMpIHtcbiAgICBpZiAoZGV2aWNlU29ja2V0ID09PSBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gKSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2VidmlldzogQ0hST01JVU1fV0lOLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXROYW1lTWF0Y2ggPSBERVZUT09MU19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY3Jvc3N3YWxrTWF0Y2ggPSBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaFsxXSAmJiAhY3Jvc3N3YWxrTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChkZXZpY2VTb2NrZXQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gIHx8ICFkZXZpY2VTb2NrZXQpIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBzb2NrZXROYW1lTWF0Y2hbMV1cbiAgICAgICAgICA/IGAke1dFQlZJRVdfQkFTRX0ke3NvY2tldE5hbWVNYXRjaFsxXX1gXG4gICAgICAgICAgOiBgJHtXRUJWSUVXX0JBU0V9JHtjcm9zc3dhbGtNYXRjaFsxXX1gLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3cztcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZXMgYSBsb2NhbCBwb3J0IGZvciBkZXZ0b29scyBjb21tdW5pY2F0aW9uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb2NrZXROYW1lIFRoZSByZW1vdGUgVW5peCBzb2NrZXQgbmFtZVxuICogQHBhcmFtIHs/c3RyaW5nfG51bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICByZXR1cm4gYXdhaXQgUE9SVF9BTExPQ0FUSU9OX0dVQVJELmFjcXVpcmUoJ0RldnRvb2xzUG9ydEFsbG9jYXRvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGFydFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IHx8IERFVlRPT0xTX1BPUlRTX1JBTkdFWzBdO1xuICAgIGNvbnN0IGVuZFBvcnQgPSBzdGFydFBvcnQgKyBERVZUT09MU19QT1JUU19SQU5HRVsxXSAtIERFVlRPT0xTX1BPUlRTX1JBTkdFWzBdO1xuICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IHRvIGZvcndhcmQgdGhlIGRldnRvb2xzIHNvY2tldCBgICtcbiAgICAgICAgYGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIFlvdSBjYW4gc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgLy8gc29ja2V0IG5hbWVzIGNvbWUgd2l0aCAnQCcsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYSBwYXJ0IG9mIHRoZSBhYnN0cmFjdFxuICAgIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgICBjb25zdCByZW1vdGVQb3J0ID0gc29ja2V0TmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICBhd2FpdCBhZGIuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7bG9jYWxQb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7cmVtb3RlUG9ydH1gXSk7XG4gICAgcmV0dXJuIGxvY2FsUG9ydDtcbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBUaGUgbmFtZSBvZiB0aGUgRGV2dG9vbHMgVW5peCBzb2NrZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSB3ZWIgdmlldyBhbGlhcy4gTG9va3MgbGlrZSBgV0VCVklFV19gXG4gKiBwcmVmaXggcGx1cyBQSUQgb3IgcGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gV2VidmlldyBpbmZvcm1hdGlvbiBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBXZWJ2aWV3IHBhZ2VzIGxpc3QgYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi9saXN0IENEUCBlbmRwb2ludFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV0YWlsQ29sbGVjdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIHN0YXJ0aW5nIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrIChpZiBub3QgdGhlIGRlZmF1bHQgb2YgOTIyMikuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBXaGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlcyBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gV2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBDaHJvbWUgRGVidWdnZXIgUHJvdG9jb2wgZGF0YSBjb2xsZWN0aW9uLlxuICogTm8gZXJyb3IgaXMgdGhyb3duIGlmIENEUCByZXF1ZXN0IGZhaWxzIC0gaW4gc3VjaCBjYXNlIG5vIGRhdGEgd2lsbCBiZVxuICogcmVjb3JkZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBgd2Vidmlld3NNYXBwaW5nYCBpdGVtLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgVGhlIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3UHJvcHM+fSB3ZWJ2aWV3c01hcHBpbmcgVGhlIGN1cnJlbnQgd2Vidmlld3MgbWFwcGluZ1xuICogISEhIEVhY2ggaXRlbSBvZiB0aGlzIGFycmF5IGdldHMgbXV0YXRlZCAoYGluZm9gL2BwYWdlc2AgcHJvcGVydGllcyBnZXQgYWRkZWRcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgb3B0c2ApIGlmIHRoZSByZXF1ZXN0ZWQgZGV0YWlscyBoYXZlIGJlZW5cbiAqIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZm9yIGl0ICEhIVxuICogQHBhcmFtIHtEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc30gb3B0cyBJZiBib3RoIGBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlc2AgYW5kXG4gKiBgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uYCBwcm9wZXJ0aWVzIGFyZSBmYWxzeSB0aGVuIG5vIGRldGFpbHMgY29sbGVjdGlvblxuICogaXMgcGVyZm9ybWVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMgKGFkYiwgd2Vidmlld3NNYXBwaW5nLCBvcHRzID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eSh3ZWJ2aWV3c01hcHBpbmcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gbnVsbCxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSBudWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjaGVja2luZyB3aGV0aGVyIHdlYnZpZXdzIGhhdmUgYWN0aXZlIHBhZ2VzOyB1c2UgdGhlIGAgK1xuICAgICAgYCdlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcycgY2FwIHRvIHR1cm4gdGhpcyBjaGVjayBvbmApO1xuICB9XG5cbiAgaWYgKCFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNvbGxlY3Rpbmcgd2ViIHZpZXcgZGV0YWlscy4gRGV0YWlscyBjb2xsZWN0aW9uIG1pZ2h0IGhlbHAgYCArXG4gICAgICBgdG8gbWFrZSBDaHJvbWVkcml2ZXIgaW5pdGlhbGl6YXRpb24gbW9yZSBwcmVjaXNlLiBVc2UgdGhlICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nIGAgK1xuICAgICAgYGNhcCB0byB0dXJuIGl0IG9uYCk7XG4gIH1cblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmICFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDb25uZWN0IHRvIGVhY2ggZGV2dG9vbHMgc29ja2V0IGFuZCByZXRyaWV2ZSB3ZWIgdmlldyBkZXRhaWxzXG4gIGxvZ2dlci5kZWJ1ZyhgQ29sbGVjdGluZyBDRFAgZGF0YSBvZiAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3Jywgd2Vidmlld3NNYXBwaW5nLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gIGNvbnN0IGRldGFpbENvbGxlY3RvcnMgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGRldGFpbENvbGxlY3RvcnMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGxvY2FsUG9ydDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGFsbG9jYXRlRGV2dG9vbHNQb3J0KGFkYiwgaXRlbS5wcm9jLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0KTtcbiAgICAgICAgaWYgKGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIGl0ZW0uaW5mbyA9IGF3YWl0IGNkcEluZm8obG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICAgICAgICBpdGVtLnBhZ2VzID0gYXdhaXQgY2RwTGlzdChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChsb2NhbFBvcnQpIHtcbiAgICAgICAgICBhd2FpdCBhZGIucmVtb3ZlUG9ydEZvcndhcmQobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGRldGFpbENvbGxlY3RvcnMpO1xuICBsb2dnZXIuZGVidWcoYENEUCBkYXRhIGNvbGxlY3Rpb24gY29tcGxldGVkYCk7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwTGlzdCAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vbGlzdGAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBJbmZvIChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi92ZXJzaW9uYCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vKipcbiAqIFRha2UgYSB3ZWJ2aWV3IG5hbWUgbGlrZSBXRUJWSUVXXzQyOTYgYW5kIHVzZSAnYWRiIHNoZWxsIHBzJyB0byBmaWd1cmUgb3V0XG4gKiB3aGljaCBhcHAgcGFja2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCB3ZWJ2aWV3LiBPbmUgb2YgdGhlIHJlYXNvbnMgd2VcbiAqIHdhbnQgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbGlzdGluZyB3ZWJ2aWV3cyBmb3IgdGhlIGFjdHVhbCBBVVQsXG4gKiBub3Qgc29tZSBvdGhlciBydW5uaW5nIGFwcFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IC0gYSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwIHJ1bm5pbmcgdGhlIHdlYnZpZXdcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgbmFtZVxuICovXG5oZWxwZXJzLnByb2NGcm9tV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIHByb2NGcm9tV2VidmlldyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICBpZiAoIXBpZE1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBQSUQgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIH1cblxuICBjb25zdCBwaWQgPSBwaWRNYXRjaFsxXTtcbiAgbG9nZ2VyLmRlYnVnKGAke3dlYnZpZXd9IG1hcHBlZCB0byBwaWQgJHtwaWR9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBwcm9jZXNzIG5hbWUgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGFkYi5nZXROYW1lQnlQaWQocGlkKTtcbiAgbG9nZ2VyLmRlYnVnKGBHb3QgcHJvY2VzcyBuYW1lOiAnJHtwa2d9J2ApO1xuICByZXR1cm4gcGtnO1xufTtcblxuLyoqXG4gKiBQYXJzZSB3ZWJ2aWV3IG5hbWVzIGZvciBnZXRDb250ZXh0c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHMgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2Ygd2VidmlldyBuYW1lc1xuICovXG5oZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzID0gZnVuY3Rpb24gcGFyc2VXZWJ2aWV3TmFtZXMgKHdlYnZpZXdzTWFwcGluZywge1xuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIGlzQ2hyb21lU2Vzc2lvbiA9IGZhbHNlXG59ID0ge30pIHtcbiAgaWYgKGlzQ2hyb21lU2Vzc2lvbikge1xuICAgIHJldHVybiBbQ0hST01JVU1fV0lOXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHt3ZWJ2aWV3LCBwYWdlcywgcHJvYywgd2Vidmlld05hbWV9IG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiBwYWdlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU2tpcHBpbmcgdGhlIHdlYnZpZXcgJyR7d2Vidmlld30nIGF0ICcke3Byb2N9JyBgICtcbiAgICAgICAgYHNpbmNlIGl0IGhhcyByZXBvcnRlZCBoYXZpbmcgemVybyBwYWdlc2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh3ZWJ2aWV3TmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2god2Vidmlld05hbWUpO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCByZXN1bHQubGVuZ3RoLCB0cnVlKX06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0V2Vidmlld3NPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYW5kcm9pZERldmljZVNvY2tldCBbbnVsbF0gLSBkZXZpY2Ugc29ja2V0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgW3RydWVdIC0gd2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZSBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgWzkyMjJdIC0gcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0Nocm9tZVNlc3Npb24gW2ZhbHNlXSAtIHRydWUgaWYgQ2hyb21lU2Vzc2lvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld3NNYXBwaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHRcbiAqL1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzIG1hcHBpbmcgYnkgaW50cm9zcGVjdGluZyBwcm9jZXNzZXMgd2l0aCBhZGIsXG4gKiB3aGVyZSB3ZWJ2aWV3cyBhcmUgbGlzdGVkLiBJdCdzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSAnZGV2aWNlU29ja2V0JyBhcmcsIHdoaWNoXG4gKiBsaW1pdHMgdGhlIHdlYnZpZXcgcG9zc2liaWxpdGllcyB0byB0aGUgb25lIHJ1bm5pbmcgb24gdGhlIENocm9taXVtIGRldnRvb2xzXG4gKiBzb2NrZXQgd2UncmUgaW50ZXJlc3RlZCBpbiAoc2VlIG5vdGUgb24gd2Vidmlld3NGcm9tUHJvY3MpLiBXZSBjYW4gYWxzb1xuICogZGlyZWN0IHRoaXMgbWV0aG9kIHRvIHZlcmlmeSB3aGV0aGVyIGEgcGFydGljdWxhciB3ZWJ2aWV3IHByb2Nlc3MgYWN0dWFsbHlcbiAqIGhhcyBhbnkgcGFnZXMgKGlmIGEgcHJvY2VzcyBleGlzdHMgYnV0IG5vIHBhZ2VzIGFyZSBmb3VuZCwgQ2hyb21lZHJpdmVyIHdpbGxcbiAqIG5vdCBhY3R1YWxseSBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gaXQsIHNvIHRoaXMgc2VydmVzIGFzIGEgZ3VhcmQgZm9yIHRoYXRcbiAqIHN0cmFuZ2UgZmFpbHVyZSBtb2RlKS4gVGhlIHN0cmF0ZWd5IGZvciBjaGVja2luZyB3aGV0aGVyIGFueSBwYWdlcyBhcmVcbiAqIGFjdGl2ZSBpbnZvbHZlcyBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlciBvbiB0aGUgZGV2aWNlLFxuICogaGVuY2UgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBwb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUgd2hpY2hcbiAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbW11bmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuaGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRXZWJWaWV3c01hcHBpbmcgKGFkYiwge1xuICBhbmRyb2lkRGV2aWNlU29ja2V0ID0gbnVsbCxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gdHJ1ZSxcbiAgaXNDaHJvbWVTZXNzaW9uID0gZmFsc2Vcbn0gPSB7fSkge1xuICBpZiAoaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIGEgbGlzdCBvZiBhdmFpbGFibGUgd2Vidmlld3MnKTtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld3NGcm9tUHJvY3MoYWRiLCBhbmRyb2lkRGV2aWNlU29ja2V0KTtcblxuICBhd2FpdCBjb2xsZWN0V2Vidmlld3NEZXRhaWxzKGFkYiwgd2Vidmlld3NNYXBwaW5nLCB7XG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uLFxuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQsXG4gIH0pO1xuXG4gIGZvciAoY29uc3Qgd2Vidmlld01hcHBpbmcgb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgY29uc3Qge3dlYnZpZXcsIGluZm99ID0gd2Vidmlld01hcHBpbmc7XG4gICAgd2Vidmlld01hcHBpbmcud2Vidmlld05hbWUgPSBudWxsO1xuXG4gICAgbGV0IHd2TmFtZSA9IHdlYnZpZXc7XG4gICAgbGV0IHByb2Nlc3MgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFhbmRyb2lkRGV2aWNlU29ja2V0KSB7XG4gICAgICBjb25zdCBwa2dNYXRjaCA9IFdFQlZJRVdfUEtHX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHdlYiB2aWV3IG5hbWUgY291bGQgZWl0aGVyIGJlIHN1ZmZpeGVkIHdpdGggUElEIG9yIHRoZSBwYWNrYWdlIG5hbWVcbiAgICAgICAgLy8gcGFja2FnZSBuYW1lcyBjb3VsZCBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0XG4gICAgICAgIGNvbnN0IHBrZyA9IHBrZ01hdGNoID8gcGtnTWF0Y2hbMV0gOiBhd2FpdCBoZWxwZXJzLnByb2NGcm9tV2VidmlldyhhZGIsIHdlYnZpZXcpO1xuICAgICAgICB3dk5hbWUgPSBgJHtXRUJWSUVXX0JBU0V9JHtwa2d9YDtcbiAgICAgICAgY29uc3QgcGlkTWF0Y2ggPSBXRUJWSUVXX1BJRF9QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICAgIHByb2Nlc3MgPSB7XG4gICAgICAgICAgbmFtZTogcGtnLFxuICAgICAgICAgIGlkOiBwaWRNYXRjaCA/IHBpZE1hdGNoWzFdIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2Vidmlld01hcHBpbmcud2Vidmlld05hbWUgPSB3dk5hbWU7XG4gICAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3dk5hbWUpO1xuICAgIGlmIChpbmZvIHx8IHByb2Nlc3MpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuc2V0KGtleSwgeyBpbmZvLCBwcm9jZXNzIH0pO1xuICAgIH0gZWxzZSBpZiAoV0VCVklFV1NfREVUQUlMU19DQUNIRS5oYXMoa2V5KSkge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5kZWwoa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdlYnZpZXdzTWFwcGluZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHJvY2Vzc0luZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9jZXNzIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgVGhlIHByb2Nlc3MgaWQgKGlmIGNvdWxkIGJlIHJldHJpZXZlZClcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYlZpZXdEZXRhaWxzXG4gKiBAcHJvcGVydHkgez9Qcm9jZXNzSW5mb30gcHJvY2VzcyAtIFdlYiB2aWV3IHByb2Nlc3MgZGV0YWlsc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGluZm8gLSBXZWIgdmlldyBkZXRhaWxzIGFzIHJldHVybmVkIGJ5IC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50LCBmb3IgZXhhbXBsZTpcbiAqIHtcbiAqICBcIkJyb3dzZXJcIjogXCJDaHJvbWUvNzIuMC4zNjAxLjBcIixcbiAqICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xM182KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzIuMC4zNjAxLjAgU2FmYXJpLzUzNy4zNlwiLFxuICogIFwiVjgtVmVyc2lvblwiOiBcIjcuMi4yMzNcIixcbiAqICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2IChAY2ZlZGU5ZGIxZDE1NGRlMDQ2OGNiMDUzODQ3OWYzNGMwNzU1YTBmNClcIixcbiAqICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly9sb2NhbGhvc3Q6OTIyMi9kZXZ0b29scy9icm93c2VyL2IwYjhhNGZiLWJiMTctNDM1OS05NTMzLWE4ZDlmMzkwOGJkOFwiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgd2ViIHZpZXcgZGV0YWlscyBwcmV2aW91c2x5IGNhY2hlZCBieSBgZ2V0V2Vidmlld3NgIGNhbGxcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHdlYnZpZXcgVGhlIG5hbWUgb2YgdGhlIHdlYiB2aWV3XG4gKiBAcmV0dXJucyB7P1dlYlZpZXdEZXRhaWxzfSBFaXRoZXIgYHVuZGVmaW5lZGAgb3IgdGhlIHJlY2VudCB3ZWIgdmlldyBkZXRhaWxzXG4gKi9cbmhlbHBlcnMuZ2V0V2Vidmlld0RldGFpbHMgPSBmdW5jdGlvbiBnZXRXZWJ2aWV3RGV0YWlscyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd2Vidmlldyk7XG4gIHJldHVybiBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmdldChrZXkpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgQ2hyb21lIGRyaXZlciBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkXG4gKiBBcHBpdW0gY2FwYWJpbGl0aWVzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVXNlci1wcm92aWRlZCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGV2aWNlSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIEFuZHJvaWQgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIEBwYXJhbSB7P1dlYlZpZXdEZXRhaWxzfSB3ZWJWaWV3RGV0YWlsc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGNhcGFiaWxpdGllcyBvYmplY3QuXG4gKiBTZWUgaHR0cHM6Ly9jaHJvbWVkcml2ZXIuY2hyb21pdW0ub3JnL2NhcGFiaWxpdGllcyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5oZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMgPSBmdW5jdGlvbiBjcmVhdGVDaHJvbWVkcml2ZXJDYXBzIChvcHRzLCBkZXZpY2VJZCwgd2ViVmlld0RldGFpbHMpIHtcbiAgY29uc3QgY2FwcyA9IHsgY2hyb21lT3B0aW9uczoge30gfTtcblxuICBjb25zdCBhbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lT3B0aW9ucz8uYW5kcm9pZFBhY2thZ2UgfHwgb3B0cy5hcHBQYWNrYWdlO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChvcHRzLmxvZ2dpbmdQcmVmcykge1xuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gb3B0cy5sb2dnaW5nUHJlZnM7XG4gIH1cbiAgaWYgKG9wdHMuZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nKSB7XG4gICAgbG9nZ2VyLndhcm4oYFRoZSAnZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nJyBjYXAgaXMgZGVwcmVjYXRlZDsgc2ltcGx5IHVzZSBgICtcbiAgICAgIGB0aGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWQsIHdpdGggYSAncGVyZm9ybWFuY2UnIGtleSBzZXQgdG8gJ0FMTCdgKTtcbiAgICBjb25zdCBuZXdQcmVmID0ge3BlcmZvcm1hbmNlOiAnQUxMJ307XG4gICAgLy8gZG9uJ3Qgb3ZlcndyaXRlIG90aGVyIGxvZ2dpbmcgcHJlZnMgdGhhdCBoYXZlIGJlZW4gc2VudCBpbiBpZiB0aGV5IGV4aXN0XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBjYXBzLmxvZ2dpbmdQcmVmcyA/XG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBjYXBzLmxvZ2dpbmdQcmVmcywgbmV3UHJlZikgOlxuICAgICAgbmV3UHJlZjtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZU9wdGlvbnM/LkFyZ3VtZW50cykge1xuICAgIC8vIG1lcmdlIGBBcmd1bWVudHNgIGFuZCBgYXJnc2BcbiAgICBvcHRzLmNocm9tZU9wdGlvbnMuYXJncyA9IFsuLi4ob3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgfHwgW10pLCAuLi5vcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzXTtcbiAgICBkZWxldGUgb3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50cztcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUHJlY2FsY3VsYXRlZCBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzOiAnICtcbiAgICBKU09OLnN0cmluZ2lmeShjYXBzLmNocm9tZU9wdGlvbnMsIG51bGwsIDIpKTtcblxuICBjb25zdCBwcm90ZWN0ZWRDYXBOYW1lcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtvcHQsIHZhbF0gb2YgXy50b1BhaXJzKG9wdHMuY2hyb21lT3B0aW9ucykpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSkpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm90ZWN0ZWRDYXBOYW1lcy5wdXNoKG9wdCk7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KHByb3RlY3RlZENhcE5hbWVzKSkge1xuICAgIGxvZ2dlci5pbmZvKCdUaGUgZm9sbG93aW5nIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXMgY2Fubm90IGJlIG92ZXJyaWRkZW4gJyArXG4gICAgICAnYnkgdGhlIHByb3ZpZGVkIGNocm9tZU9wdGlvbnM6Jyk7XG4gICAgZm9yIChjb25zdCBvcHROYW1lIG9mIHByb3RlY3RlZENhcE5hbWVzKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgICAke29wdE5hbWV9ICgke0pTT04uc3RyaW5naWZ5KG9wdHMuY2hyb21lT3B0aW9uc1tvcHROYW1lXSl9KWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYXBzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbmV4cG9ydCB7IGhlbHBlcnMsIE5BVElWRV9XSU4sIFdFQlZJRVdfV0lOLCBXRUJWSUVXX0JBU0UsIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgfTtcbiJdLCJmaWxlIjoibGliL3dlYnZpZXctaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
456
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiXSwibmFtZXMiOlsiTkFUSVZFX1dJTiIsIldFQlZJRVdfV0lOIiwiQ0hST01JVU1fV0lOIiwiV0VCVklFV19CQVNFIiwiV0VCVklFV19QSURfUEFUVEVSTiIsIlJlZ0V4cCIsIldFQlZJRVdfUEtHX1BBVFRFUk4iLCJERVZUT09MU19TT0NLRVRfUEFUVEVSTiIsIkNST1NTV0FMS19TT0NLRVRfUEFUVEVSTiIsIkNIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCIsIkNIUk9NRV9QQUNLQUdFX05BTUUiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsIkRFVlRPT0xTX1BPUlRTX1JBTkdFIiwiV0VCVklFV1NfREVUQUlMU19DQUNIRSIsIkxSVSIsIm1heCIsInVwZGF0ZUFnZU9uR2V0IiwiQ0RQX1JFUV9USU1FT1VUIiwiREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiaGVscGVycyIsInRvRGV0YWlsc0NhY2hlS2V5IiwiYWRiIiwid2VidmlldyIsImN1ckRldmljZUlkIiwiZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIiwib3V0Iiwic2hlbGwiLCJuYW1lcyIsImFsbE1hdGNoZXMiLCJsaW5lIiwic3BsaXQiLCJmbGFncyIsInN0Iiwic29ja1BhdGgiLCJ0cmltIiwic3RhcnRzV2l0aCIsInB1c2giLCJ0ZXN0IiwiXyIsImlzRW1wdHkiLCJsb2dnZXIiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsZW5ndGgiLCJwbHVyYWxpemUiLCJ1bmlxIiwid2Vidmlld3NGcm9tUHJvY3MiLCJkZXZpY2VTb2NrZXQiLCJzb2NrZXROYW1lcyIsIndlYnZpZXdzIiwic29ja2V0TmFtZSIsInByb2MiLCJzb2NrZXROYW1lTWF0Y2giLCJleGVjIiwiY3Jvc3N3YWxrTWF0Y2giLCJhbGxvY2F0ZURldnRvb2xzUG9ydCIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJyZW1vdGVQb3J0IiwicmVwbGFjZSIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJsb2NhbFBvcnQiLCJlIiwiRXJyb3IiLCJhZGJFeGVjIiwiY29sbGVjdFdlYnZpZXdzRGV0YWlscyIsIndlYnZpZXdzTWFwcGluZyIsIm9wdHMiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsImluZm8iLCJkZXRhaWxDb2xsZWN0b3JzIiwiaXRlbSIsImNkcEluZm8iLCJwYWdlcyIsImNkcExpc3QiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsIkIiLCJhbGwiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWwiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImxvZ2dpbmdQcmVmcyIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsIm5ld1ByZWYiLCJwZXJmb3JtYW5jZSIsIk9iamVjdCIsImFzc2lnbiIsIkFyZ3VtZW50cyIsImFyZ3MiLCJwcm90ZWN0ZWRDYXBOYW1lcyIsIm9wdCIsInZhbCIsInRvUGFpcnMiLCJpc1VuZGVmaW5lZCIsIm9wdE5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBRyxTQUFwQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsVUFBckI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVGLFdBQVksR0FBcEM7O0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFBSUMsTUFBSixDQUFZLElBQUdGLFlBQWEsUUFBNUIsQ0FBNUI7QUFDQSxNQUFNRyxtQkFBbUIsR0FBRyxJQUFJRCxNQUFKLENBQVksSUFBR0YsWUFBYSxvQkFBNUIsQ0FBNUI7QUFDQSxNQUFNSSx1QkFBdUIsR0FBRyxtQ0FBaEM7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyw2QkFBakM7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyx3QkFBakM7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvQkFBNUI7QUFDQSxNQUFNQywwQkFBMEIsR0FBRyxDQUNqQ0QsbUJBRGlDLEVBRWpDLGlCQUZpQyxFQUdqQyxnQkFIaUMsRUFJakMsbUJBSmlDLENBQW5DOztBQU1BLE1BQU1FLG9CQUFvQixHQUFHLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FBN0I7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ3JD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Q0QsTUFBSSxDQUFDckcsZ0JBQUVDLE9BQUYsQ0FBVW1HLGlCQUFWLENBQUwsRUFBbUM7QUFDakNsRyxvQkFBTytCLElBQVAsQ0FBWSxrRUFDVixnQ0FERjs7QUFFQSxTQUFLLE1BQU13RSxPQUFYLElBQXNCTCxpQkFBdEIsRUFBeUM7QUFDdkNsRyxzQkFBTytCLElBQVAsQ0FBYSxLQUFJd0UsT0FBUSxLQUFJckcsSUFBSSxDQUFDQyxTQUFMLENBQWV5QixJQUFJLENBQUM0QyxhQUFMLENBQW1CK0IsT0FBbkIsQ0FBZixDQUE0QyxHQUF6RTtBQUNEO0FBQ0Y7O0FBRUQsU0FBT2hDLElBQVA7QUFDRCxDQWpGRDs7ZUFtRmU1RixPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcbmNvbnN0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAnYW5kcm9pZF9kZXZ0b29sc19wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiA3LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuZnVuY3Rpb24gdG9EZXRhaWxzQ2FjaGVLZXkgKGFkYiwgd2Vidmlldykge1xuICByZXR1cm4gYCR7YWRiPy5jdXJEZXZpY2VJZH06JHt3ZWJ2aWV3fWA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgbGlzdCBvZiBhbmRyb2lkIHN5c3RlbSBwcm9jZXNzZXMgYW5kIHJldHVybnMgb25lc1xuICogdGhhdCBsb29rIGxpa2Ugd2Vidmlld3NcbiAqIFNlZSBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIG1hdGNoaW5nIHdlYnZpZXcgc29ja2V0IG5hbWVzIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgJ0AnKVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MgKGFkYikge1xuICBjb25zdCBvdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IG5hbWVzID0gW107XG4gIGNvbnN0IGFsbE1hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBOdW0gUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgVHlwZSBTdCBJbm9kZSBQYXRoXG4gICAgY29uc3QgWywsLCBmbGFncywsIHN0LCwgc29ja1BhdGhdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoIXNvY2tQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNvY2tQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgYWxsTWF0Y2hlcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzICE9PSAnMDAwMTAwMDAnIHx8IHN0ICE9PSAnMDEnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFERVZUT09MU19TT0NLRVRfUEFUVEVSTi50ZXN0KHNvY2tQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChzb2NrUGF0aCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG5vIGFjdGl2ZSBkZXZ0b29scyBzb2NrZXRzJyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsTWF0Y2hlcykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3RoZXIgc29ja2V0cyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsTWF0Y2hlcywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkICR7bmFtZXMubGVuZ3RofSBhY3RpdmUgZGV2dG9vbHMgJHt1dGlsLnBsdXJhbGl6ZSgnc29ja2V0JywgbmFtZXMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWVzKSk7XG4gIH1cbiAgLy8gc29tZXRpbWVzIHRoZSB3ZWJ2aWV3IHByb2Nlc3Mgc2hvd3MgdXAgbXVsdGlwbGUgdGltZXMgcGVyIGFwcFxuICByZXR1cm4gXy51bmlxKG5hbWVzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvY1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgLSBUaGUgd2VidmlldyBwcm9jZXNzIG5hbWUgKGFzIHJldHVybmVkIGJ5XG4gKiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IC0gVGhlIGFjdHVhbCB3ZWJ2aWV3IGNvbnRleHQgbmFtZVxuICovXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgbGlzdCBvZiBzeXN0ZW0gcHJvY2Vzc2VzIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzLFxuICogYW5kIHJldHVybnMgdGhlbSBhbG9uZyB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRleHQgbmFtZSBhcHByb3ByaWF0ZSBmb3IgaXQuXG4gKiBJZiB3ZSBwYXNzIGluIGEgZGV2aWNlU29ja2V0LCB3ZSBvbmx5IGF0dGVtcHQgdG8gZmluZCB3ZWJ2aWV3cyB3aGljaCBtYXRjaFxuICogdGhhdCBzb2NrZXQgbmFtZSAodGhpcyBpcyBmb3IgYXBwcyB3aGljaCBlbWJlZCBDaHJvbWl1bSwgd2hpY2ggaXNuJ3QgdGhlXG4gKiBzYW1lIGFzIGNocm9tZS1iYWNrZWQgd2Vidmlld3MpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7P3N0cmluZ30gZGV2aWNlU29ja2V0IC0gdGhlIGV4cGxpY3RseS1uYW1lZCBkZXZpY2Ugc29ja2V0IHRvIHVzZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxXZWJ2aWV3UHJvYz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdlYnZpZXdzRnJvbVByb2NzIChhZGIsIGRldmljZVNvY2tldCA9IG51bGwpIHtcbiAgY29uc3Qgc29ja2V0TmFtZXMgPSBhd2FpdCBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MoYWRiKTtcbiAgY29uc3Qgd2Vidmlld3MgPSBbXTtcbiAgZm9yIChjb25zdCBzb2NrZXROYW1lIG9mIHNvY2tldE5hbWVzKSB7XG4gICAgaWYgKGRldmljZVNvY2tldCA9PT0gQ0hST01JVU1fREVWVE9PTFNfU09DS0VUICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IENIUk9NSVVNX1dJTixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0TmFtZU1hdGNoID0gREVWVE9PTFNfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNyb3Nzd2Fsa01hdGNoID0gQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2hbMV0gJiYgIWNyb3Nzd2Fsa01hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlU29ja2V0ICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCB8fCAhZGV2aWNlU29ja2V0KSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2Vidmlldzogc29ja2V0TmFtZU1hdGNoWzFdXG4gICAgICAgICAgPyBgJHtXRUJWSUVXX0JBU0V9JHtzb2NrZXROYW1lTWF0Y2hbMV19YFxuICAgICAgICAgIDogYCR7V0VCVklFV19CQVNFfSR7Y3Jvc3N3YWxrTWF0Y2hbMV19YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3M7XG59XG5cbi8qKlxuICogQWxsb2NhdGVzIGEgbG9jYWwgcG9ydCBmb3IgZGV2dG9vbHMgY29tbXVuaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ja2V0TmFtZSBUaGUgcmVtb3RlIFVuaXggc29ja2V0IG5hbWVcbiAqIEBwYXJhbSB7P251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICAvLyBzb2NrZXQgbmFtZXMgY29tZSB3aXRoICdAJywgYnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgdGhlIGFic3RyYWN0XG4gIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgY29uc3QgcmVtb3RlUG9ydCA9IHNvY2tldE5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gIGxldCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVlRPT0xTX1BPUlRTX1JBTkdFO1xuICBpZiAod2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGVuZFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0ICsgKGVuZFBvcnQgLSBzdGFydFBvcnQpO1xuICAgIHN0YXJ0UG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3J3YXJkaW5nIHJlbW90ZSBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gYSBsb2NhbCBgICtcbiAgICBgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH1gKTtcbiAgaWYgKCF3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBZb3UgY291bGQgdXNlIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgYCArXG4gICAgICBgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvY2FsUG9ydDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgdG8gZm9yd2FyZCB0aGUgRGV2dG9vbHMgc29ja2V0IGAgK1xuICAgICAgICBgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBZb3UgY291bGQgc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke2xvY2FsUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke3JlbW90ZVBvcnR9YF0pO1xuICAgIHJldHVybiBsb2NhbFBvcnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldGFpbENvbGxlY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBzdGFydGluZyBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjayAoaWYgbm90IHRoZSBkZWZhdWx0IG9mIDkyMjIpLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgV2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZXMgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgQ2hyb21lIERlYnVnZ2VyIFByb3RvY29sIGRhdGEgY29sbGVjdGlvbi5cbiAqIE5vIGVycm9yIGlzIHRocm93biBpZiBDRFAgcmVxdWVzdCBmYWlscyAtIGluIHN1Y2ggY2FzZSBubyBkYXRhIHdpbGwgYmVcbiAqIHJlY29yZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYHdlYnZpZXdzTWFwcGluZ2AgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld1Byb3BzPn0gd2Vidmlld3NNYXBwaW5nIFRoZSBjdXJyZW50IHdlYnZpZXdzIG1hcHBpbmdcbiAqICEhISBFYWNoIGl0ZW0gb2YgdGhpcyBhcnJheSBnZXRzIG11dGF0ZWQgKGBpbmZvYC9gcGFnZXNgIHByb3BlcnRpZXMgZ2V0IGFkZGVkXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG9wdHNgKSBpZiB0aGUgcmVxdWVzdGVkIGRldGFpbHMgaGF2ZSBiZWVuXG4gKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZvciBpdCAhISFcbiAqIEBwYXJhbSB7RGV0YWlsQ29sbGVjdGlvbk9wdGlvbnN9IG9wdHMgSWYgYm90aCBgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXNgIGFuZFxuICogYGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbmAgcHJvcGVydGllcyBhcmUgZmFsc3kgdGhlbiBubyBkZXRhaWxzIGNvbGxlY3Rpb25cbiAqIGlzIHBlcmZvcm1lZFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0V2Vidmlld3NEZXRhaWxzIChhZGIsIHdlYnZpZXdzTWFwcGluZywgb3B0cyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkod2Vidmlld3NNYXBwaW5nKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IG51bGwsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gbnVsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY2hlY2tpbmcgd2hldGhlciB3ZWJ2aWV3cyBoYXZlIGFjdGl2ZSBwYWdlczsgdXNlIHRoZSBgICtcbiAgICAgIGAnZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMnIGNhcCB0byB0dXJuIHRoaXMgY2hlY2sgb25gKTtcbiAgfVxuXG4gIGlmICghZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjb2xsZWN0aW5nIHdlYiB2aWV3IGRldGFpbHMuIERldGFpbHMgY29sbGVjdGlvbiBtaWdodCBoZWxwIGAgK1xuICAgICAgYHRvIG1ha2UgQ2hyb21lZHJpdmVyIGluaXRpYWxpemF0aW9uIG1vcmUgcHJlY2lzZS4gVXNlIHRoZSAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJyBgICtcbiAgICAgIGBjYXAgdG8gdHVybiBpdCBvbmApO1xuICB9XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiAhZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29ubmVjdCB0byBlYWNoIGRldnRvb2xzIHNvY2tldCBhbmQgcmV0cmlldmUgd2ViIHZpZXcgZGV0YWlsc1xuICBsb2dnZXIuZGVidWcoYENvbGxlY3RpbmcgQ0RQIGRhdGEgb2YgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHdlYnZpZXdzTWFwcGluZy5sZW5ndGgsIHRydWUpfWApO1xuICBjb25zdCBkZXRhaWxDb2xsZWN0b3JzID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBkZXRhaWxDb2xsZWN0b3JzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFBvcnQgPSBhd2FpdCBhbGxvY2F0ZURldnRvb2xzUG9ydChhZGIsIGl0ZW0ucHJvYywgd2Vidmlld0RldnRvb2xzUG9ydCk7XG4gICAgICAgIGlmIChlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpdGVtLmluZm8gPSBhd2FpdCBjZHBJbmZvKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgICAgICAgaXRlbS5wYWdlcyA9IGF3YWl0IGNkcExpc3QobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobG9jYWxQb3J0KSB7XG4gICAgICAgICAgYXdhaXQgYWRiLnJlbW92ZVBvcnRGb3J3YXJkKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChkZXRhaWxDb2xsZWN0b3JzKTtcbiAgbG9nZ2VyLmRlYnVnKGBDRFAgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZGApO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcExpc3QgKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL2xpc3RgLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwSW5mbyAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vdmVyc2lvbmAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgd2VidmlldyBuYW1lIGxpa2UgV0VCVklFV180Mjk2IGFuZCB1c2UgJ2FkYiBzaGVsbCBwcycgdG8gZmlndXJlIG91dFxuICogd2hpY2ggYXBwIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgd2Vidmlldy4gT25lIG9mIHRoZSByZWFzb25zIHdlXG4gKiB3YW50IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIGxpc3Rpbmcgd2Vidmlld3MgZm9yIHRoZSBhY3R1YWwgQVVULFxuICogbm90IHNvbWUgb3RoZXIgcnVubmluZyBhcHBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyAtIGEgd2VidmlldyBwcm9jZXNzIG5hbWVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBydW5uaW5nIHRoZSB3ZWJ2aWV3XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIG5hbWVcbiAqL1xuaGVscGVycy5wcm9jRnJvbVdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBwcm9jRnJvbVdlYnZpZXcgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgaWYgKCFwaWRNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgUElEIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICB9XG5cbiAgY29uc3QgcGlkID0gcGlkTWF0Y2hbMV07XG4gIGxvZ2dlci5kZWJ1ZyhgJHt3ZWJ2aWV3fSBtYXBwZWQgdG8gcGlkICR7cGlkfWApO1xuICBsb2dnZXIuZGVidWcoYEdldHRpbmcgcHJvY2VzcyBuYW1lIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICBjb25zdCBwa2cgPSBhd2FpdCBhZGIuZ2V0TmFtZUJ5UGlkKHBpZCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR290IHByb2Nlc3MgbmFtZTogJyR7cGtnfSdgKTtcbiAgcmV0dXJuIHBrZztcbn07XG5cbi8qKlxuICogUGFyc2Ugd2VidmlldyBuYW1lcyBmb3IgZ2V0Q29udGV4dHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIHdlYnZpZXcgbmFtZXNcbiAqL1xuaGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyA9IGZ1bmN0aW9uIHBhcnNlV2Vidmlld05hbWVzICh3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW0NIUk9NSVVNX1dJTl07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB7d2VidmlldywgcGFnZXMsIHByb2MsIHdlYnZpZXdOYW1lfSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgcGFnZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwaW5nIHRoZSB3ZWJ2aWV3ICcke3dlYnZpZXd9JyBhdCAnJHtwcm9jfScgYCArXG4gICAgICAgIGBzaW5jZSBpdCBoYXMgcmVwb3J0ZWQgaGF2aW5nIHplcm8gcGFnZXNgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAod2Vidmlld05hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHdlYnZpZXdOYW1lKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3JywgcmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFdlYnZpZXdzT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFuZHJvaWREZXZpY2VTb2NrZXQgW251bGxdIC0gZGV2aWNlIHNvY2tldCBuYW1lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFt0cnVlXSAtIHdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2UgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFs5MjIyXSAtIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gW3RydWVdIC0gd2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNDaHJvbWVTZXNzaW9uIFtmYWxzZV0gLSB0cnVlIGlmIENocm9tZVNlc3Npb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0XG4gKi9cblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cyBtYXBwaW5nIGJ5IGludHJvc3BlY3RpbmcgcHJvY2Vzc2VzIHdpdGggYWRiLFxuICogd2hlcmUgd2Vidmlld3MgYXJlIGxpc3RlZC4gSXQncyBwb3NzaWJsZSB0byBwYXNzIGluIGEgJ2RldmljZVNvY2tldCcgYXJnLCB3aGljaFxuICogbGltaXRzIHRoZSB3ZWJ2aWV3IHBvc3NpYmlsaXRpZXMgdG8gdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBDaHJvbWl1bSBkZXZ0b29sc1xuICogc29ja2V0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKHNlZSBub3RlIG9uIHdlYnZpZXdzRnJvbVByb2NzKS4gV2UgY2FuIGFsc29cbiAqIGRpcmVjdCB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgd2VidmlldyBwcm9jZXNzIGFjdHVhbGx5XG4gKiBoYXMgYW55IHBhZ2VzIChpZiBhIHByb2Nlc3MgZXhpc3RzIGJ1dCBubyBwYWdlcyBhcmUgZm91bmQsIENocm9tZWRyaXZlciB3aWxsXG4gKiBub3QgYWN0dWFsbHkgYmUgYWJsZSB0byBjb25uZWN0IHRvIGl0LCBzbyB0aGlzIHNlcnZlcyBhcyBhIGd1YXJkIGZvciB0aGF0XG4gKiBzdHJhbmdlIGZhaWx1cmUgbW9kZSkuIFRoZSBzdHJhdGVneSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbnkgcGFnZXMgYXJlXG4gKiBhY3RpdmUgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIgb24gdGhlIGRldmljZSxcbiAqIGhlbmNlIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdoaWNoXG4gKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmhlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2ViVmlld3NNYXBwaW5nIChhZGIsIHtcbiAgYW5kcm9pZERldmljZVNvY2tldCA9IG51bGwsXG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IHRydWUsXG4gIGlzQ2hyb21lU2Vzc2lvbiA9IGZhbHNlXG59ID0ge30pIHtcbiAgaWYgKGlzQ2hyb21lU2Vzc2lvbikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzJyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdzRnJvbVByb2NzKGFkYiwgYW5kcm9pZERldmljZVNvY2tldCk7XG5cbiAgYXdhaXQgY29sbGVjdFdlYnZpZXdzRGV0YWlscyhhZGIsIHdlYnZpZXdzTWFwcGluZywge1xuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbixcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICB9KTtcblxuICBmb3IgKGNvbnN0IHdlYnZpZXdNYXBwaW5nIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGNvbnN0IHt3ZWJ2aWV3LCBpbmZvfSA9IHdlYnZpZXdNYXBwaW5nO1xuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gbnVsbDtcblxuICAgIGxldCB3dk5hbWUgPSB3ZWJ2aWV3O1xuICAgIGxldCBwcm9jZXNzID0gdW5kZWZpbmVkO1xuICAgIGlmICghYW5kcm9pZERldmljZVNvY2tldCkge1xuICAgICAgY29uc3QgcGtnTWF0Y2ggPSBXRUJWSUVXX1BLR19QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3ZWIgdmlldyBuYW1lIGNvdWxkIGVpdGhlciBiZSBzdWZmaXhlZCB3aXRoIFBJRCBvciB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIC8vIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IHN0YXJ0IHdpdGggYSBkaWdpdFxuICAgICAgICBjb25zdCBwa2cgPSBwa2dNYXRjaCA/IHBrZ01hdGNoWzFdIDogYXdhaXQgaGVscGVycy5wcm9jRnJvbVdlYnZpZXcoYWRiLCB3ZWJ2aWV3KTtcbiAgICAgICAgd3ZOYW1lID0gYCR7V0VCVklFV19CQVNFfSR7cGtnfWA7XG4gICAgICAgIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgICBwcm9jZXNzID0ge1xuICAgICAgICAgIG5hbWU6IHBrZyxcbiAgICAgICAgICBpZDogcGlkTWF0Y2ggPyBwaWRNYXRjaFsxXSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gd3ZOYW1lO1xuICAgIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd3ZOYW1lKTtcbiAgICBpZiAoaW5mbyB8fCBwcm9jZXNzKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLnNldChrZXksIHsgaW5mbywgcHJvY2VzcyB9KTtcbiAgICB9IGVsc2UgaWYgKFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuaGFzKGtleSkpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZGVsKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3c01hcHBpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSBUaGUgcHJvY2VzcyBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIFRoZSBwcm9jZXNzIGlkIChpZiBjb3VsZCBiZSByZXRyaWV2ZWQpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJWaWV3RGV0YWlsc1xuICogQHByb3BlcnR5IHs/UHJvY2Vzc0luZm99IHByb2Nlc3MgLSBXZWIgdmlldyBwcm9jZXNzIGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpbmZvIC0gV2ViIHZpZXcgZGV0YWlscyBhcyByZXR1cm5lZCBieSAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludCwgZm9yIGV4YW1wbGU6XG4gKiB7XG4gKiAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzcyLjAuMzYwMS4wXCIsXG4gKiAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTNfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYwMS4wIFNhZmFyaS81MzcuMzZcIixcbiAqICBcIlY4LVZlcnNpb25cIjogXCI3LjIuMjMzXCIsXG4gKiAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQGNmZWRlOWRiMWQxNTRkZTA0NjhjYjA1Mzg0NzlmMzRjMDc1NWEwZjQpXCIsXG4gKiAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vbG9jYWxob3N0OjkyMjIvZGV2dG9vbHMvYnJvd3Nlci9iMGI4YTRmYi1iYjE3LTQzNTktOTUzMy1hOGQ5ZjM5MDhiZDhcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHdlYiB2aWV3IGRldGFpbHMgcHJldmlvdXNseSBjYWNoZWQgYnkgYGdldFdlYnZpZXdzYCBjYWxsXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSBuYW1lIG9mIHRoZSB3ZWIgdmlld1xuICogQHJldHVybnMgez9XZWJWaWV3RGV0YWlsc30gRWl0aGVyIGB1bmRlZmluZWRgIG9yIHRoZSByZWNlbnQgd2ViIHZpZXcgZGV0YWlsc1xuICovXG5oZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzID0gZnVuY3Rpb24gZ2V0V2Vidmlld0RldGFpbHMgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHdlYnZpZXcpO1xuICByZXR1cm4gV0VCVklFV1NfREVUQUlMU19DQUNIRS5nZXQoa2V5KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIENocm9tZSBkcml2ZXIgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogQXBwaXVtIGNhcGFiaWxpdGllc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFVzZXItcHJvdmlkZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGRldmljZUlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBbmRyb2lkIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAcGFyYW0gez9XZWJWaWV3RGV0YWlsc30gd2ViVmlld0RldGFpbHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjYXBhYmlsaXRpZXMgb2JqZWN0LlxuICogU2VlIGh0dHBzOi8vY2hyb21lZHJpdmVyLmNocm9taXVtLm9yZy9jYXBhYmlsaXRpZXMgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuaGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzID0gZnVuY3Rpb24gY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyAob3B0cywgZGV2aWNlSWQsIHdlYlZpZXdEZXRhaWxzKSB7XG4gIGNvbnN0IGNhcHMgPSB7IGNocm9tZU9wdGlvbnM6IHt9IH07XG5cbiAgY29uc3QgYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZU9wdGlvbnM/LmFuZHJvaWRQYWNrYWdlIHx8IG9wdHMuYXBwUGFja2FnZTtcbiAgaWYgKGFuZHJvaWRQYWNrYWdlKSB7XG4gICAgLy8gY2hyb21lZHJpdmVyIHJhaXNlcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGVycm9yIHdoZW4gYW5kcm9pZFBhY2thZ2UgaXMgJ251bGwnXG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gYW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKF8uaXNCb29sZWFuKG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcCkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFVzZVJ1bm5pbmdBcHAgPSBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHA7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHkgPSBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUHJvY2Vzcykge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3M7XG4gIH0gZWxzZSBpZiAod2ViVmlld0RldGFpbHM/LnByb2Nlc3M/Lm5hbWUgJiYgd2ViVmlld0RldGFpbHM/LnByb2Nlc3M/LmlkKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gd2ViVmlld0RldGFpbHMucHJvY2Vzcy5uYW1lO1xuICB9XG4gIGlmIChfLnRvTG93ZXIob3B0cy5icm93c2VyTmFtZSkgPT09ICdjaHJvbWl1bS13ZWJ2aWV3Jykge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHkgPSBvcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLnBhZ2VMb2FkU3RyYXRlZ3kpIHtcbiAgICBjYXBzLnBhZ2VMb2FkU3RyYXRlZ3kgPSBvcHRzLnBhZ2VMb2FkU3RyYXRlZ3k7XG4gIH1cbiAgY29uc3QgaXNDaHJvbWUgPSBfLnRvTG93ZXIoY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSA9PT0gJ2Nocm9tZSc7XG4gIGlmIChfLmluY2x1ZGVzKEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTLCBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpIHx8IGlzQ2hyb21lKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBleHRyYWN0ZWQgcGFja2FnZSBmcm9tIGNvbnRleHQgbmFtZSwgaXQgY291bGQgY29tZSBpbiBhcyBiYXJlXG4gICAgLy8gXCJjaHJvbWVcIiwgYW5kIHNvIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhlIGRldGFpbHMgYXJlIGNvcnJlY3QsIGluY2x1ZGluZ1xuICAgIC8vIG5vdCB1c2luZyBhbiBhY3Rpdml0eSBvciBwcm9jZXNzIGlkXG4gICAgaWYgKGlzQ2hyb21lKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBDSFJPTUVfUEFDS0FHRV9OQU1FO1xuICAgIH1cbiAgICBkZWxldGUgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eTtcbiAgICBkZWxldGUgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzO1xuICB9XG4gIC8vIGFkZCBkZXZpY2UgaWQgZnJvbSBhZGJcbiAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWREZXZpY2VTZXJpYWwgPSBkZXZpY2VJZDtcblxuICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IG9wdHMubG9nZ2luZ1ByZWZzO1xuICB9XG4gIGlmIChvcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZykge1xuICAgIGxvZ2dlci53YXJuKGBUaGUgJ2VuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHNpbXBseSB1c2UgYCArXG4gICAgICBgdGhlICdsb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkLCB3aXRoIGEgJ3BlcmZvcm1hbmNlJyBrZXkgc2V0IHRvICdBTEwnYCk7XG4gICAgY29uc3QgbmV3UHJlZiA9IHtwZXJmb3JtYW5jZTogJ0FMTCd9O1xuICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBvdGhlciBsb2dnaW5nIHByZWZzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaW4gaWYgdGhleSBleGlzdFxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gY2Fwcy5sb2dnaW5nUHJlZnMgP1xuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgY2Fwcy5sb2dnaW5nUHJlZnMsIG5ld1ByZWYpIDpcbiAgICAgIG5ld1ByZWY7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVPcHRpb25zPy5Bcmd1bWVudHMpIHtcbiAgICAvLyBtZXJnZSBgQXJndW1lbnRzYCBhbmQgYGFyZ3NgXG4gICAgb3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgPSBbLi4uKG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzIHx8IFtdKSwgLi4ub3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50c107XG4gICAgZGVsZXRlIG9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHM7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1ByZWNhbGN1bGF0ZWQgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllczogJyArXG4gICAgSlNPTi5zdHJpbmdpZnkoY2Fwcy5jaHJvbWVPcHRpb25zLCBudWxsLCAyKSk7XG5cbiAgY29uc3QgcHJvdGVjdGVkQ2FwTmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbb3B0LCB2YWxdIG9mIF8udG9QYWlycyhvcHRzLmNocm9tZU9wdGlvbnMpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0pKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvdGVjdGVkQ2FwTmFtZXMucHVzaChvcHQpO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwcm90ZWN0ZWRDYXBOYW1lcykpIHtcbiAgICBsb2dnZXIuaW5mbygnVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuICcgK1xuICAgICAgJ2J5IHRoZSBwcm92aWRlZCBjaHJvbWVPcHRpb25zOicpO1xuICAgIGZvciAoY29uc3Qgb3B0TmFtZSBvZiBwcm90ZWN0ZWRDYXBOYW1lcykge1xuICAgICAgbG9nZ2VyLmluZm8oYCAgJHtvcHROYW1lfSAoJHtKU09OLnN0cmluZ2lmeShvcHRzLmNocm9tZU9wdGlvbnNbb3B0TmFtZV0pfSlgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2Fwcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG5leHBvcnQgeyBoZWxwZXJzLCBOQVRJVkVfV0lOLCBXRUJWSUVXX1dJTiwgV0VCVklFV19CQVNFLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIH07XG4iXSwiZmlsZSI6ImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/lib/webview-helpers.js
CHANGED
|
@@ -3,9 +3,10 @@ import logger from './logger';
|
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
import { util } from 'appium-support';
|
|
5
5
|
import { findAPortNotInUse } from 'portscanner';
|
|
6
|
-
import AsyncLock from 'async-lock';
|
|
7
6
|
import LRU from 'lru-cache';
|
|
8
7
|
import B from 'bluebird';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import os from 'os';
|
|
9
10
|
|
|
10
11
|
const NATIVE_WIN = 'NATIVE_APP';
|
|
11
12
|
const WEBVIEW_WIN = 'WEBVIEW';
|
|
@@ -24,12 +25,15 @@ const KNOWN_CHROME_PACKAGE_NAMES = [
|
|
|
24
25
|
'com.chrome.canary',
|
|
25
26
|
];
|
|
26
27
|
const DEVTOOLS_PORTS_RANGE = [10900, 11000];
|
|
27
|
-
const PORT_ALLOCATION_GUARD = new AsyncLock();
|
|
28
28
|
const WEBVIEWS_DETAILS_CACHE = new LRU({
|
|
29
29
|
max: 100,
|
|
30
30
|
updateAgeOnGet: true,
|
|
31
31
|
});
|
|
32
32
|
const CDP_REQ_TIMEOUT = 2000; // ms
|
|
33
|
+
const DEVTOOLS_PORT_ALLOCATION_GUARD = util.getLockFileGuard(
|
|
34
|
+
path.resolve(os.tmpdir(), 'android_devtools_port_guard'),
|
|
35
|
+
{timeout: 7, tryRecovery: true}
|
|
36
|
+
);
|
|
33
37
|
|
|
34
38
|
const helpers = {};
|
|
35
39
|
|
|
@@ -138,27 +142,36 @@ async function webviewsFromProcs (adb, deviceSocket = null) {
|
|
|
138
142
|
*
|
|
139
143
|
* @param {ADB} adb ADB instance
|
|
140
144
|
* @param {string} socketName The remote Unix socket name
|
|
141
|
-
* @param {?
|
|
145
|
+
* @param {?number} webviewDevtoolsPort The local port number or null to apply
|
|
142
146
|
* autodetection
|
|
143
147
|
* @returns {number} The local port number if the remote socket has been forwarded
|
|
144
148
|
* successfully or `null` otherwise
|
|
145
149
|
* @throws {Error} If there was an error while allocating the local port
|
|
146
150
|
*/
|
|
147
151
|
async function allocateDevtoolsPort (adb, socketName, webviewDevtoolsPort = null) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
152
|
+
// socket names come with '@', but this should not be a part of the abstract
|
|
153
|
+
// remote port, so remove it
|
|
154
|
+
const remotePort = socketName.replace(/^@/, '');
|
|
155
|
+
let [startPort, endPort] = DEVTOOLS_PORTS_RANGE;
|
|
156
|
+
if (webviewDevtoolsPort) {
|
|
157
|
+
endPort = webviewDevtoolsPort + (endPort - startPort);
|
|
158
|
+
startPort = webviewDevtoolsPort;
|
|
159
|
+
}
|
|
160
|
+
logger.debug(`Forwarding remote port ${remotePort} to a local ` +
|
|
161
|
+
`port in range ${startPort}..${endPort}`);
|
|
162
|
+
if (!webviewDevtoolsPort) {
|
|
163
|
+
logger.debug(`You could use the 'webviewDevtoolsPort' capability to customize ` +
|
|
164
|
+
`the starting port number`);
|
|
165
|
+
}
|
|
166
|
+
return await DEVTOOLS_PORT_ALLOCATION_GUARD(async () => {
|
|
151
167
|
let localPort;
|
|
152
168
|
try {
|
|
153
169
|
localPort = await findAPortNotInUse(startPort, endPort);
|
|
154
170
|
} catch (e) {
|
|
155
|
-
throw new Error(`Cannot find any free port to forward the
|
|
156
|
-
`in range ${startPort}..${endPort}
|
|
171
|
+
throw new Error(`Cannot find any free port to forward the Devtools socket ` +
|
|
172
|
+
`in range ${startPort}..${endPort}. You could set the starting port number ` +
|
|
157
173
|
`manually by providing the 'webviewDevtoolsPort' capability`);
|
|
158
174
|
}
|
|
159
|
-
// socket names come with '@', but this should not be a part of the abstract
|
|
160
|
-
// remote port, so remove it
|
|
161
|
-
const remotePort = socketName.replace(/^@/, '');
|
|
162
175
|
await adb.adbExec(['forward', `tcp:${localPort}`, `localabstract:${remotePort}`]);
|
|
163
176
|
return localPort;
|
|
164
177
|
});
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"mobile",
|
|
10
10
|
"mobile testing"
|
|
11
11
|
],
|
|
12
|
-
"version": "4.
|
|
12
|
+
"version": "4.46.0",
|
|
13
13
|
"author": "appium",
|
|
14
14
|
"license": "Apache-2.0",
|
|
15
15
|
"repository": {
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
"appium-base-driver": "^7.0.0",
|
|
41
41
|
"appium-chromedriver": "^4.13.0",
|
|
42
42
|
"appium-support": "^2.47.1",
|
|
43
|
-
"async-lock": "^1.2.2",
|
|
44
43
|
"asyncbox": "^2.8.0",
|
|
45
44
|
"axios": "^0.x",
|
|
46
45
|
"bluebird": "^3.4.7",
|