appium-android-driver 5.0.6 → 5.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/build/lib/commands/actions.js +16 -20
- package/build/lib/commands/app-management.js +15 -17
- package/build/lib/commands/context.js +46 -66
- package/build/lib/commands/coverage.js +2 -6
- package/build/lib/commands/element.js +3 -9
- package/build/lib/commands/emu-console.js +3 -5
- package/build/lib/commands/execute.js +3 -6
- package/build/lib/commands/file-actions.js +22 -29
- package/build/lib/commands/general.js +18 -30
- package/build/lib/commands/ime.js +8 -21
- package/build/lib/commands/network.js +14 -27
- package/build/lib/commands/performance.js +3 -6
- package/build/lib/commands/recordscreen.js +27 -38
- package/build/lib/commands/shell.js +6 -7
- package/build/lib/commands/streamscreen.js +29 -43
- package/build/lib/commands/system-bars.js +10 -16
- package/build/lib/commands/touch.js +4 -10
- package/build/lib/driver.js +61 -67
- package/build/lib/webview-helpers.js +2 -7
- package/lib/commands/actions.js +18 -19
- package/lib/commands/app-management.js +13 -12
- package/lib/commands/context.js +36 -40
- package/lib/commands/coverage.js +1 -4
- package/lib/commands/element.js +2 -3
- package/lib/commands/emu-console.js +2 -2
- package/lib/commands/execute.js +2 -3
- package/lib/commands/file-actions.js +31 -25
- package/lib/commands/general.js +16 -18
- package/lib/commands/ime.js +7 -8
- package/lib/commands/network.js +15 -16
- package/lib/commands/performance.js +2 -3
- package/lib/commands/recordscreen.js +23 -22
- package/lib/commands/shell.js +6 -6
- package/lib/commands/streamscreen.js +22 -23
- package/lib/commands/system-bars.js +11 -10
- package/lib/commands/touch.js +3 -4
- package/lib/driver.js +45 -46
- package/lib/webview-helpers.js +1 -7
- package/package.json +2 -2
|
@@ -11,8 +11,6 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var _logger = _interopRequireDefault(require("../logger"));
|
|
15
|
-
|
|
16
14
|
var _appiumChromedriver = _interopRequireDefault(require("appium-chromedriver"));
|
|
17
15
|
|
|
18
16
|
var _portfinder = _interopRequireDefault(require("portfinder"));
|
|
@@ -43,10 +41,7 @@ commands.getCurrentContext = async function getCurrentContext() {
|
|
|
43
41
|
};
|
|
44
42
|
|
|
45
43
|
commands.getContexts = async function getContexts() {
|
|
46
|
-
const
|
|
47
|
-
isChromeSession: this.isChromeSession
|
|
48
|
-
}, this.opts);
|
|
49
|
-
const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, opts);
|
|
44
|
+
const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, this.opts);
|
|
50
45
|
return this.assignContexts(webviewsMapping);
|
|
51
46
|
};
|
|
52
47
|
|
|
@@ -61,10 +56,7 @@ commands.setContext = async function setContext(name) {
|
|
|
61
56
|
return;
|
|
62
57
|
}
|
|
63
58
|
|
|
64
|
-
const
|
|
65
|
-
isChromeSession: this.isChromeSession
|
|
66
|
-
}, this.opts);
|
|
67
|
-
const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, opts);
|
|
59
|
+
const webviewsMapping = await _webviewHelpers.default.getWebViewsMapping(this.adb, this.opts);
|
|
68
60
|
const contexts = this.assignContexts(webviewsMapping);
|
|
69
61
|
|
|
70
62
|
if (!_lodash.default.includes(contexts, name)) {
|
|
@@ -80,8 +72,7 @@ commands.mobileGetContexts = async function mobileGetContexts() {
|
|
|
80
72
|
androidDeviceSocket: this.opts.androidDeviceSocket,
|
|
81
73
|
ensureWebviewsHavePages: true,
|
|
82
74
|
webviewDevtoolsPort: this.opts.webviewDevtoolsPort,
|
|
83
|
-
enableWebviewDetailsCollection: true
|
|
84
|
-
isChromeSession: this.isChromeSession
|
|
75
|
+
enableWebviewDetailsCollection: true
|
|
85
76
|
};
|
|
86
77
|
return await _webviewHelpers.default.getWebViewsMapping(this.adb, opts);
|
|
87
78
|
};
|
|
@@ -94,9 +85,7 @@ helpers.assignContexts = function assignContexts(webviewsMapping) {
|
|
|
94
85
|
const webviews = _webviewHelpers.default.parseWebviewNames(webviewsMapping, opts);
|
|
95
86
|
|
|
96
87
|
this.contexts = [_webviewHelpers.NATIVE_WIN, ...webviews];
|
|
97
|
-
|
|
98
|
-
_logger.default.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);
|
|
99
|
-
|
|
88
|
+
this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);
|
|
100
89
|
return this.contexts;
|
|
101
90
|
};
|
|
102
91
|
|
|
@@ -105,8 +94,7 @@ helpers.switchContext = async function switchContext(name, webviewsMapping) {
|
|
|
105
94
|
await this.startChromedriverProxy(name, webviewsMapping);
|
|
106
95
|
} else if (this.isChromedriverContext(this.curContext)) {
|
|
107
96
|
if (this.opts.recreateChromeDriverSessions) {
|
|
108
|
-
|
|
109
|
-
|
|
97
|
+
this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');
|
|
110
98
|
await this.stopChromedriverProxies();
|
|
111
99
|
} else {
|
|
112
100
|
await this.suspendChromedriverProxy();
|
|
@@ -129,15 +117,13 @@ helpers.isWebContext = function isWebContext() {
|
|
|
129
117
|
};
|
|
130
118
|
|
|
131
119
|
helpers.startChromedriverProxy = async function startChromedriverProxy(context, webviewsMapping) {
|
|
132
|
-
|
|
133
|
-
|
|
120
|
+
this.log.debug(`Connecting to chrome-backed webview context '${context}'`);
|
|
134
121
|
let cd;
|
|
135
122
|
|
|
136
123
|
if (this.sessionChromedrivers[context]) {
|
|
137
|
-
|
|
138
|
-
|
|
124
|
+
this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);
|
|
139
125
|
cd = this.sessionChromedrivers[context];
|
|
140
|
-
await setupExistingChromedriver(cd);
|
|
126
|
+
await setupExistingChromedriver(this.log, cd);
|
|
141
127
|
} else {
|
|
142
128
|
let opts = _lodash.default.cloneDeep(this.opts);
|
|
143
129
|
|
|
@@ -163,9 +149,7 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
|
|
|
163
149
|
|
|
164
150
|
if (_lodash.default.includes([_androidHelpers.APP_STATE.RUNNING_IN_BACKGROUND, _androidHelpers.APP_STATE.RUNNING_IN_FOREGROUND], appState)) {
|
|
165
151
|
opts.chromeAndroidPackage = knownPackage;
|
|
166
|
-
|
|
167
|
-
_logger.default.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` + `for context '${context}' by querying states of Chrome app packages`);
|
|
168
|
-
|
|
152
|
+
this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` + `for context '${context}' by querying states of Chrome app packages`);
|
|
169
153
|
break;
|
|
170
154
|
}
|
|
171
155
|
}
|
|
@@ -173,9 +157,7 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
|
|
|
173
157
|
for (const wm of webviewsMapping) {
|
|
174
158
|
if (wm.webviewName === context && _lodash.default.has(wm === null || wm === void 0 ? void 0 : wm.info, 'Android-Package')) {
|
|
175
159
|
opts.chromeAndroidPackage = wm.info['Android-Package'];
|
|
176
|
-
|
|
177
|
-
_logger.default.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` + `for context '${context}' by CDP`);
|
|
178
|
-
|
|
160
|
+
this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` + `for context '${context}' by CDP`);
|
|
179
161
|
break;
|
|
180
162
|
}
|
|
181
163
|
}
|
|
@@ -206,14 +188,13 @@ helpers.suspendChromedriverProxy = function suspendChromedriverProxy() {
|
|
|
206
188
|
};
|
|
207
189
|
|
|
208
190
|
helpers.onChromedriverStop = async function onChromedriverStop(context) {
|
|
209
|
-
|
|
191
|
+
this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);
|
|
210
192
|
|
|
211
193
|
if (context === this.curContext) {
|
|
212
194
|
let err = new Error('Chromedriver quit unexpectedly during session');
|
|
213
195
|
await this.startUnexpectedShutdown(err);
|
|
214
196
|
} else {
|
|
215
|
-
|
|
216
|
-
|
|
197
|
+
this.log.warn("Chromedriver quit unexpectedly, but it wasn't the active " + 'context, ignoring');
|
|
217
198
|
delete this.sessionChromedrivers[context];
|
|
218
199
|
}
|
|
219
200
|
};
|
|
@@ -223,15 +204,13 @@ helpers.stopChromedriverProxies = async function stopChromedriverProxies() {
|
|
|
223
204
|
|
|
224
205
|
for (let context of _lodash.default.keys(this.sessionChromedrivers)) {
|
|
225
206
|
let cd = this.sessionChromedrivers[context];
|
|
226
|
-
|
|
227
|
-
_logger.default.debug(`Stopping chromedriver for context ${context}`);
|
|
228
|
-
|
|
207
|
+
this.log.debug(`Stopping chromedriver for context ${context}`);
|
|
229
208
|
cd.removeAllListeners(_appiumChromedriver.default.EVENT_CHANGED);
|
|
230
209
|
|
|
231
210
|
try {
|
|
232
211
|
await cd.stop();
|
|
233
212
|
} catch (err) {
|
|
234
|
-
|
|
213
|
+
this.log.warn(`Error stopping Chromedriver: ${err.message}`);
|
|
235
214
|
}
|
|
236
215
|
|
|
237
216
|
delete this.sessionChromedrivers[context];
|
|
@@ -247,13 +226,11 @@ helpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome() {
|
|
|
247
226
|
};
|
|
248
227
|
|
|
249
228
|
helpers.dismissChromeWelcome = async function dismissChromeWelcome() {
|
|
250
|
-
|
|
251
|
-
|
|
229
|
+
this.log.info('Trying to dismiss Chrome welcome');
|
|
252
230
|
let activity = await this.getCurrentActivity();
|
|
253
231
|
|
|
254
232
|
if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {
|
|
255
|
-
|
|
256
|
-
|
|
233
|
+
this.log.info('Chrome welcome dialog never showed up! Continuing');
|
|
257
234
|
return;
|
|
258
235
|
}
|
|
259
236
|
|
|
@@ -264,12 +241,12 @@ helpers.dismissChromeWelcome = async function dismissChromeWelcome() {
|
|
|
264
241
|
let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);
|
|
265
242
|
await this.click(el.ELEMENT);
|
|
266
243
|
} catch (e) {
|
|
267
|
-
|
|
244
|
+
this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);
|
|
268
245
|
}
|
|
269
246
|
};
|
|
270
247
|
|
|
271
248
|
helpers.startChromeSession = async function startChromeSession() {
|
|
272
|
-
|
|
249
|
+
this.log.info('Starting a chrome-based browser session');
|
|
273
250
|
|
|
274
251
|
let opts = _lodash.default.cloneDeep(this.opts);
|
|
275
252
|
|
|
@@ -298,31 +275,27 @@ helpers.startChromeSession = async function startChromeSession() {
|
|
|
298
275
|
}
|
|
299
276
|
};
|
|
300
277
|
|
|
301
|
-
async function setupExistingChromedriver(chromedriver) {
|
|
278
|
+
async function setupExistingChromedriver(log, chromedriver) {
|
|
302
279
|
if (!(await chromedriver.hasWorkingWebview())) {
|
|
303
|
-
|
|
304
|
-
|
|
280
|
+
log.debug('ChromeDriver is not associated with a window. ' + 'Re-initializing the session.');
|
|
305
281
|
await chromedriver.restart();
|
|
306
282
|
}
|
|
307
283
|
|
|
308
284
|
return chromedriver;
|
|
309
285
|
}
|
|
310
286
|
|
|
311
|
-
async function getChromedriverPort(portSpec) {
|
|
287
|
+
async function getChromedriverPort(portSpec, log = null) {
|
|
312
288
|
const getPort = _bluebird.default.promisify(_portfinder.default.getPort, {
|
|
313
289
|
context: _portfinder.default
|
|
314
290
|
});
|
|
315
291
|
|
|
316
292
|
if (!portSpec) {
|
|
317
293
|
const port = await getPort();
|
|
318
|
-
|
|
319
|
-
_logger.default.debug(`A port was not given, using random free port: ${port}`);
|
|
320
|
-
|
|
294
|
+
log === null || log === void 0 ? void 0 : log.debug(`A port was not given, using random free port: ${port}`);
|
|
321
295
|
return port;
|
|
322
296
|
}
|
|
323
297
|
|
|
324
|
-
|
|
325
|
-
|
|
298
|
+
log === null || log === void 0 ? void 0 : log.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);
|
|
326
299
|
let foundPort = null;
|
|
327
300
|
|
|
328
301
|
for (const potentialPort of portSpec) {
|
|
@@ -336,15 +309,14 @@ async function getChromedriverPort(portSpec) {
|
|
|
336
309
|
}
|
|
337
310
|
|
|
338
311
|
try {
|
|
339
|
-
|
|
340
|
-
|
|
312
|
+
log === null || log === void 0 ? void 0 : log.debug(`Checking port range ${port}:${stopPort}`);
|
|
341
313
|
foundPort = await getPort({
|
|
342
314
|
port,
|
|
343
315
|
stopPort
|
|
344
316
|
});
|
|
345
317
|
break;
|
|
346
318
|
} catch (e) {
|
|
347
|
-
|
|
319
|
+
log === null || log === void 0 ? void 0 : log.debug(`Nothing in port range ${port}:${stopPort} was available`);
|
|
348
320
|
}
|
|
349
321
|
}
|
|
350
322
|
|
|
@@ -352,38 +324,45 @@ async function getChromedriverPort(portSpec) {
|
|
|
352
324
|
throw new Error(`Could not find a free port for chromedriver using ` + `chromedriverPorts spec ${JSON.stringify(portSpec)}`);
|
|
353
325
|
}
|
|
354
326
|
|
|
355
|
-
|
|
356
|
-
|
|
327
|
+
log === null || log === void 0 ? void 0 : log.debug(`Using free port ${foundPort} for chromedriver`);
|
|
357
328
|
return foundPort;
|
|
358
329
|
}
|
|
359
330
|
|
|
360
331
|
helpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled() {
|
|
332
|
+
var _this$log;
|
|
333
|
+
|
|
361
334
|
if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {
|
|
362
335
|
return true;
|
|
363
336
|
}
|
|
364
337
|
|
|
365
|
-
|
|
366
|
-
|
|
338
|
+
this === null || this === void 0 ? void 0 : (_this$log = this.log) === null || _this$log === void 0 ? void 0 : _this$log.debug(`Automated Chromedriver download is disabled. ` + `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);
|
|
367
339
|
return false;
|
|
368
340
|
};
|
|
369
341
|
|
|
370
342
|
helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDeviceId, adb, context = null) {
|
|
343
|
+
var _this$isChromedriverA, _this$log6;
|
|
344
|
+
|
|
371
345
|
if (opts.chromeDriverPort) {
|
|
372
|
-
|
|
346
|
+
var _this$log2;
|
|
373
347
|
|
|
348
|
+
this === null || this === void 0 ? void 0 : (_this$log2 = this.log) === null || _this$log2 === void 0 ? void 0 : _this$log2.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);
|
|
374
349
|
opts.chromedriverPort = opts.chromeDriverPort;
|
|
375
350
|
}
|
|
376
351
|
|
|
377
352
|
if (opts.chromedriverPort) {
|
|
378
|
-
|
|
353
|
+
var _this$log3;
|
|
354
|
+
|
|
355
|
+
this === null || this === void 0 ? void 0 : (_this$log3 = this.log) === null || _this$log3 === void 0 ? void 0 : _this$log3.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);
|
|
379
356
|
} else {
|
|
380
|
-
opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts);
|
|
357
|
+
opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this === null || this === void 0 ? void 0 : this.log);
|
|
381
358
|
}
|
|
382
359
|
|
|
383
360
|
const details = context ? _webviewHelpers.default.getWebviewDetails(adb, context) : undefined;
|
|
384
361
|
|
|
385
362
|
if (!_lodash.default.isEmpty(details)) {
|
|
386
|
-
|
|
363
|
+
var _this$log4;
|
|
364
|
+
|
|
365
|
+
this === null || this === void 0 ? void 0 : (_this$log4 = this.log) === null || _this$log4 === void 0 ? void 0 : _this$log4.debug('Passing web view details to the Chromedriver constructor: ' + JSON.stringify(details, null, 2));
|
|
387
366
|
}
|
|
388
367
|
|
|
389
368
|
const chromedriver = new _appiumChromedriver.default({
|
|
@@ -398,13 +377,15 @@ helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDevi
|
|
|
398
377
|
useSystemExecutable: opts.chromedriverUseSystemExecutable,
|
|
399
378
|
disableBuildCheck: opts.chromedriverDisableBuildCheck,
|
|
400
379
|
details,
|
|
401
|
-
isAutodownloadEnabled:
|
|
380
|
+
isAutodownloadEnabled: this === null || this === void 0 ? void 0 : (_this$isChromedriverA = this.isChromedriverAutodownloadEnabled) === null || _this$isChromedriverA === void 0 ? void 0 : _this$isChromedriverA.call(this)
|
|
402
381
|
});
|
|
403
382
|
opts.chromeOptions = opts.chromeOptions || {};
|
|
404
383
|
|
|
405
384
|
for (const opt of _lodash.default.keys(opts)) {
|
|
406
385
|
if (opt.endsWith(':chromeOptions')) {
|
|
407
|
-
|
|
386
|
+
var _this$log5;
|
|
387
|
+
|
|
388
|
+
this === null || this === void 0 ? void 0 : (_this$log5 = this.log) === null || _this$log5 === void 0 ? void 0 : _this$log5.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);
|
|
408
389
|
|
|
409
390
|
_lodash.default.merge(opts.chromeOptions, opts[opt]);
|
|
410
391
|
}
|
|
@@ -412,8 +393,7 @@ helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDevi
|
|
|
412
393
|
|
|
413
394
|
const caps = _webviewHelpers.default.createChromedriverCaps(opts, curDeviceId, details);
|
|
414
395
|
|
|
415
|
-
|
|
416
|
-
|
|
396
|
+
this === null || this === void 0 ? void 0 : (_this$log6 = this.log) === null || _this$log6 === void 0 ? void 0 : _this$log6.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);
|
|
417
397
|
await chromedriver.start(caps);
|
|
418
398
|
return chromedriver;
|
|
419
399
|
};
|
|
@@ -425,4 +405,4 @@ var _default = extensions;
|
|
|
425
405
|
exports.default = _default;require('source-map-support').install();
|
|
426
406
|
|
|
427
407
|
|
|
428
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jb250ZXh0LmpzIl0sIm5hbWVzIjpbIkNIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJnZXRDdXJyZW50Q29udGV4dCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJnZXRDb250ZXh0cyIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsImFzc2lnbkNvbnRleHRzIiwic2V0Q29udGV4dCIsIm5hbWUiLCJ1dGlsIiwiaGFzVmFsdWUiLCJXRUJWSUVXX1dJTiIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImNvbnRleHRzIiwiXyIsImluY2x1ZGVzIiwiZXJyb3JzIiwiTm9TdWNoQ29udGV4dEVycm9yIiwic3dpdGNoQ29udGV4dCIsIm1vYmlsZUdldENvbnRleHRzIiwiYW5kcm9pZERldmljZVNvY2tldCIsImVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIiwid2Vidmlld0RldnRvb2xzUG9ydCIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsIndlYnZpZXdzIiwicGFyc2VXZWJ2aWV3TmFtZXMiLCJOQVRJVkVfV0lOIiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwiaXNDaHJvbWVkcml2ZXJDb250ZXh0Iiwic3RhcnRDaHJvbWVkcml2ZXJQcm94eSIsInJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsIkVycm9yIiwiV0VCVklFV19CQVNFIiwiYXBwUGFja2FnZSIsImlzV2ViQ29udGV4dCIsImNvbnRleHQiLCJjZCIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwic2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlciIsImNsb25lRGVlcCIsImNocm9tZVVzZVJ1bm5pbmdBcHAiLCJleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUiLCJhbmRyb2lkUGFja2FnZSIsIm1hdGNoIiwibGVuZ3RoIiwiY2hyb21lQW5kcm9pZFBhY2thZ2UiLCJoYXMiLCJtYXAiLCJ3bSIsIndlYnZpZXdOYW1lIiwia25vd25QYWNrYWdlIiwiS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMiLCJhcHBTdGF0ZSIsInF1ZXJ5QXBwU3RhdGUiLCJBUFBfU1RBVEUiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJpbmZvIiwic2V0dXBOZXdDaHJvbWVkcml2ZXIiLCJjdXJEZXZpY2VJZCIsIm9uIiwiQ2hyb21lZHJpdmVyIiwiRVZFTlRfQ0hBTkdFRCIsIm1zZyIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsIm9uQ2hyb21lZHJpdmVyU3RvcCIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwicHJveHlSZXEiLCJiaW5kIiwicHJveHlDb21tYW5kIiwiandwcm94eSIsImNvbW1hbmQiLCJqd3BQcm94eUFjdGl2ZSIsIndhcm4iLCJlcnIiLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImtleXMiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzdG9wIiwibWVzc2FnZSIsInZpZXdOYW1lIiwiQ0hST01JVU1fV0lOIiwic2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJjaHJvbWVPcHRpb25zIiwiaXNBcnJheSIsImFyZ3MiLCJkaXNtaXNzQ2hyb21lV2VsY29tZSIsImFjdGl2aXR5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZWwiLCJmaW5kRWxPckVscyIsImNsaWNrIiwiRUxFTUVOVCIsImUiLCJzdGFydENocm9tZVNlc3Npb24iLCJrbm93blBhY2thZ2VzIiwiY2hyb21lQnVuZGxlSWQiLCJjaHJvbWVBbmRyb2lkQWN0aXZpdHkiLCJhcHBBY3Rpdml0eSIsImhhc1dvcmtpbmdXZWJ2aWV3IiwicmVzdGFydCIsImdldENocm9tZWRyaXZlclBvcnQiLCJwb3J0U3BlYyIsImdldFBvcnQiLCJCIiwicHJvbWlzaWZ5IiwiUG9ydEZpbmRlciIsInBvcnQiLCJmb3VuZFBvcnQiLCJwb3RlbnRpYWxQb3J0Iiwic3RvcFBvcnQiLCJwYXJzZUludCIsImlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCIsImlzRmVhdHVyZUVuYWJsZWQiLCJjaHJvbWVEcml2ZXJQb3J0IiwiY2hyb21lZHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnRzIiwiZGV0YWlscyIsImdldFdlYnZpZXdEZXRhaWxzIiwidW5kZWZpbmVkIiwiaXNFbXB0eSIsImV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY21kQXJncyIsImNocm9tZWRyaXZlckFyZ3MiLCJ2ZXJib3NlIiwic2hvd0Nocm9tZWRyaXZlckxvZyIsImV4ZWN1dGFibGVEaXIiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyIiwibWFwcGluZ1BhdGgiLCJjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSIsImJ1bmRsZUlkIiwidXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUiLCJkaXNhYmxlQnVpbGRDaGVjayIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwib3B0IiwiZW5kc1dpdGgiLCJtZXJnZSIsImNhcHMiLCJjcmVhdGVDaHJvbWVkcml2ZXJDYXBzIiwic3RhcnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7OztBQUVBLE1BQU1BLGlDQUFpQyxHQUFHLDJCQUExQztBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlD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QVQsRUFBYXhCLGlDQUFiLEdBQ25CLEtBQUtBLGlDQUFMLEVBRG1CLEdBQ3dCTztBQWJYLEdBQWpCLENBQXJCO0FBaUJBaEksRUFBQUEsSUFBSSxDQUFDNEYsYUFBTCxHQUFxQjVGLElBQUksQ0FBQzRGLGFBQUwsSUFBc0IsRUFBM0M7O0FBR0EsT0FBSyxNQUFNc0QsR0FBWCxJQUFrQmxJLGdCQUFFcUUsSUFBRixDQUFPckYsSUFBUCxDQUFsQixFQUFnQztBQUM5QixRQUFJa0osR0FBRyxDQUFDQyxRQUFKLENBQWEsZ0JBQWIsQ0FBSixFQUFvQztBQUNsQ3RILHNCQUFJcUQsSUFBSixDQUFVLFlBQVdnRSxHQUFJLDREQUF6Qjs7QUFDQWxJLHNCQUFFb0ksS0FBRixDQUFRcEosSUFBSSxDQUFDNEYsYUFBYixFQUE0QjVGLElBQUksQ0FBQ2tKLEdBQUQsQ0FBaEM7QUFDRDtBQUNGOztBQUVELFFBQU1HLElBQUksR0FBR2hKLHdCQUFlaUosc0JBQWYsQ0FBc0N0SixJQUF0QyxFQUE0Q2tFLFdBQTVDLEVBQXlENEQsT0FBekQsQ0FBYjs7QUFDQWpHLGtCQUFJQyxLQUFKLENBQVcsb0RBQW1EdUgsSUFBSSxDQUFDekQsYUFBTCxDQUFtQjNDLGNBQWUsR0FBaEc7O0FBQ0EsUUFBTXlCLFlBQVksQ0FBQzZFLEtBQWIsQ0FBbUJGLElBQW5CLENBQU47QUFDQSxTQUFPM0UsWUFBUDtBQUNELENBbEREOztBQW1EQSxNQUFNVCxvQkFBb0IsR0FBR3ZFLE9BQU8sQ0FBQ3VFLG9CQUFyQzs7QUFHQWhFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjUCxVQUFkLEVBQTBCRixRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUMsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgQ2hyb21lZHJpdmVyIGZyb20gJ2FwcGl1bS1jaHJvbWVkcml2ZXInO1xuaW1wb3J0IFBvcnRGaW5kZXIgZnJvbSAncG9ydGZpbmRlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHtcbiAgZGVmYXVsdCBhcyB3ZWJ2aWV3SGVscGVycyxcbiAgTkFUSVZFX1dJTiwgV0VCVklFV19CQVNFLCBXRUJWSUVXX1dJTiwgQ0hST01JVU1fV0lOLCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FU1xufSBmcm9tICcuLi93ZWJ2aWV3LWhlbHBlcnMnO1xuaW1wb3J0IHsgQVBQX1NUQVRFIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcblxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ2Nocm9tZWRyaXZlcl9hdXRvZG93bmxvYWQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWN0dWFsIE1KU09OV1AgY29tbWFuZCBoYW5kbGVyc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29tbWFuZHMuZ2V0Q3VycmVudENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50Q29udGV4dCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIGBudWxsYCwgaW5kaWNhdGluZyBubyBjb250ZXh0XG4gIC8vIGV4cGxpY2l0bHkgc2V0LCBpdCBpcyB0aGUgZGVmYXVsdCBjb250ZXh0XG4gIHJldHVybiB0aGlzLmN1ckNvbnRleHQgfHwgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbn07XG5cbmNvbW1hbmRzLmdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGV4dHMgKCkge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7aXNDaHJvbWVTZXNzaW9uOiB0aGlzLmlzQ2hyb21lU2Vzc2lvbn0sIHRoaXMub3B0cyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgb3B0cyk7XG4gIHJldHVybiB0aGlzLmFzc2lnbkNvbnRleHRzKHdlYnZpZXdzTWFwcGluZyk7XG59O1xuXG5jb21tYW5kcy5zZXRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gc2V0Q29udGV4dCAobmFtZSkge1xuICBpZiAoIXV0aWwuaGFzVmFsdWUobmFtZSkpIHtcbiAgICBuYW1lID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfSBlbHNlIGlmIChuYW1lID09PSBXRUJWSUVXX1dJTikge1xuICAgIC8vIGhhbmRsZSBzZXRDb250ZXh0IFwiV0VCVklFV1wiXG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gIH1cbiAgLy8gaWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgY29udGV4dCB3ZSB3YW50LCBkbyBub3RoaW5nXG4gIGlmIChuYW1lID09PSB0aGlzLmN1ckNvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7aXNDaHJvbWVTZXNzaW9uOiB0aGlzLmlzQ2hyb21lU2Vzc2lvbn0sIHRoaXMub3B0cyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgb3B0cyk7XG4gIGNvbnN0IGNvbnRleHRzID0gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xuICAvLyBpZiB0aGUgY29udGV4dCB3ZSB3YW50IGRvZXNuJ3QgZXhpc3QsIGZhaWxcbiAgaWYgKCFfLmluY2x1ZGVzKGNvbnRleHRzLCBuYW1lKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoQ29udGV4dEVycm9yKCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLnN3aXRjaENvbnRleHQobmFtZSwgd2Vidmlld3NNYXBwaW5nKTtcbiAgdGhpcy5jdXJDb250ZXh0ID0gbmFtZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld3NNYXBwaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBUaGUgbmFtZSBvZiB0aGUgRGV2dG9vbHMgVW5peCBzb2NrZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSB3ZWIgdmlldyBhbGlhcy4gTG9va3MgbGlrZSBgV0VCVklFV19gXG4gKiBwcmVmaXggcGx1cyBQSUQgb3IgcGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gV2VidmlldyBpbmZvcm1hdGlvbiBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBXZWJ2aWV3IHBhZ2VzIGxpc3QgYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi9saXN0IENEUCBlbmRwb2ludFxuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0LlxuICogVGhpcyB2YWx1ZSBiZWNvbWVzIG51bGwgd2hlbiBmYWlsaW5nIHRvIGZpbmQgYSBQSUQgZm9yIGEgd2Vidmlldy5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGpzb24gZGVtb25zdHJhdGVzIHRoZSBleGFtcGxlIG9mIFdlYnZpZXdzTWFwcGluZyBvYmplY3QuXG4gKiBOb3RlIHRoYXQgYGRlc2NyaXB0aW9uYCBpbiBgcGFnZWAgY2FuIGJlIGFuIGVtcHR5IHN0cmluZyBtb3N0IGxpa2VseSB3aGVuIGl0IGNvbWVzIHRvIE1vYmlsZSBDaHJvbWUpXG4gKiB7XG4gKiAgIFwicHJvY1wiOiBcIkB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV8yMjEzOFwiLFxuICogICBcIndlYnZpZXdcIjogXCJXRUJWSUVXXzIyMTM4XCIsXG4gKiAgIFwiaW5mb1wiOiB7XG4gKiAgICAgXCJBbmRyb2lkLVBhY2thZ2VcIjogXCJpby5hcHBpdW0uc2V0dGluZ3NcIixcbiAqICAgICBcIkJyb3dzZXJcIjogXCJDaHJvbWUvNzQuMC4zNzI5LjE4NVwiLFxuICogICAgIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogICAgIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMDsgQW5kcm9pZCBTREsgYnVpbHQgZm9yIHg4NiBCdWlsZC9RU1IxLjE5MDkyMC4wMDE7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzQuMC4zNzI5LjE4NSBNb2JpbGUgU2FmYXJpLzUzNy4zNlwiLFxuICogICAgIFwiVjgtVmVyc2lvblwiOiBcIjcuNC4yODguMjhcIixcbiAqICAgICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2IChAMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZClcIixcbiAqICAgICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly8xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvYnJvd3NlclwiXG4gKiAgIH0sXG4gKiAgIFwicGFnZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ7XFxcImF0dGFjaGVkXFxcIjp0cnVlLFxcXCJlbXB0eVxcXCI6ZmFsc2UsXFxcImhlaWdodFxcXCI6MTQ1OCxcXFwic2NyZWVuWFxcXCI6MCxcXFwic2NyZWVuWVxcXCI6MzM2LFxcXCJ2aXNpYmxlXFxcIjp0cnVlLFxcXCJ3aWR0aFxcXCI6MTA4MH1cIixcbiAqICAgICAgIFwiZGV2dG9vbHNGcm9udGVuZFVybFwiOiBcImh0dHA6Ly9jaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQuYXBwc3BvdC5jb20vc2VydmVfcmV2L0AyMjk1NTY4MmY5NGNlMDkzMzYxOTdiZmI4ZGZmZWE5OTFmYTMyZjBkL2luc3BlY3Rvci5odG1sP3dzPTEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcImlkXCI6IFwiMjczMjVDQzUwQjYwMEQzMUIyMzNGNDVFMDk0ODdCMUZcIixcbiAqICAgICAgIFwidGl0bGVcIjogXCJSZWxlYXNlcyDCtyBhcHBpdW0vYXBwaXVtIMK3IEdpdEh1YlwiLFxuICogICAgICAgXCJ0eXBlXCI6IFwicGFnZVwiLFxuICogICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9yZWxlYXNlc1wiLFxuICogICAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL3BhZ2UvMjczMjVDQzUwQjYwMEQzMUIyMzNGNDVFMDk0ODdCMUZcIlxuICogICAgIH1cbiAqICAgXSxcbiAqICAgXCJ3ZWJ2aWV3TmFtZVwiOiBcIldFQlZJRVdfY29tLmlvLmFwcGl1bS5zZXR0aW5nXCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSB3ZWJ2aWV3c01hcHBpbmcgYmFzZWQgb24gQ0RQIGVuZHBvaW50c1xuICpcbiAqIEByZXR1cm4ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZ1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBhbmRyb2lkRGV2aWNlU29ja2V0OiB0aGlzLm9wdHMuYW5kcm9pZERldmljZVNvY2tldCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlczogdHJ1ZSxcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0OiB0aGlzLm9wdHMud2Vidmlld0RldnRvb2xzUG9ydCxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb246IHRydWUsXG4gICAgaXNDaHJvbWVTZXNzaW9uOiB0aGlzLmlzQ2hyb21lU2Vzc2lvblxuICB9O1xuICByZXR1cm4gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCBvcHRzKTtcbn07XG5cbmhlbHBlcnMuYXNzaWduQ29udGV4dHMgPSBmdW5jdGlvbiBhc3NpZ25Db250ZXh0cyAod2Vidmlld3NNYXBwaW5nKSB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtpc0Nocm9tZVNlc3Npb246IHRoaXMuaXNDaHJvbWVTZXNzaW9ufSwgdGhpcy5vcHRzKTtcbiAgY29uc3Qgd2Vidmlld3MgPSB3ZWJ2aWV3SGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyh3ZWJ2aWV3c01hcHBpbmcsIG9wdHMpO1xuICB0aGlzLmNvbnRleHRzID0gW05BVElWRV9XSU4sIC4uLndlYnZpZXdzXTtcbiAgbG9nLmRlYnVnKGBBdmFpbGFibGUgY29udGV4dHM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb250ZXh0cyl9YCk7XG4gIHJldHVybiB0aGlzLmNvbnRleHRzO1xufTtcblxuaGVscGVycy5zd2l0Y2hDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gc3dpdGNoQ29udGV4dCAobmFtZSwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIC8vIFdlIGhhdmUgc29tZSBvcHRpb25zIHdoZW4gaXQgY29tZXMgdG8gd2Vidmlld3MuIElmIHdlIHdhbnQgYVxuICAvLyBDaHJvbWVkcml2ZXIgd2Vidmlldywgd2UgY2FuIG9ubHkgY29udHJvbCBvbmUgYXQgYSB0aW1lLlxuICBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQobmFtZSkpIHtcbiAgICAvLyBzdGFydCBwcm94eWluZyBjb21tYW5kcyBkaXJlY3RseSB0byBjaHJvbWVkcml2ZXJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lZHJpdmVyUHJveHkobmFtZSwgd2Vidmlld3NNYXBwaW5nKTtcbiAgfSBlbHNlIGlmICh0aGlzLmlzQ2hyb21lZHJpdmVyQ29udGV4dCh0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgLy8gaWYgd2UncmUgbW92aW5nIHRvIGEgbm9uLWNocm9tZWRyaXZlciB3ZWJ2aWV3LCBhbmQgb3VyIGN1cnJlbnQgY29udGV4dFxuICAgIC8vIF9pc18gYSBjaHJvbWVkcml2ZXIgd2VidmlldywgaWYgY2FwcyByZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIGlzIHNldFxuICAgIC8vIHRvIHRydWUgdGhlbiBraWxsIGNocm9tZWRyaXZlciBzZXNzaW9uIHVzaW5nIHN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIG9yXG4gICAgLy8gZWxzZSBzaW1wbHkgc3VzcGVuZCBwcm94eWluZyB0byB0aGUgbGF0dGVyXG4gICAgaWYgKHRoaXMub3B0cy5yZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zKSB7XG4gICAgICBsb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArIHRoaXMub3B0cy5hcHBQYWNrYWdlO1xufTtcblxuaGVscGVycy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0ICE9PSBudWxsICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTjtcbn07XG5cbi8vIFR1cm4gb24gcHJveHlpbmcgdG8gYW4gZXhpc3RpbmcgQ2hyb21lZHJpdmVyIHNlc3Npb24gb3IgYSBuZXcgb25lXG5oZWxwZXJzLnN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZWRyaXZlclByb3h5IChjb250ZXh0LCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIGxvZy5kZWJ1ZyhgRm91bmQgZXhpc3RpbmcgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICcke2NvbnRleHR9Jy4gVXNpbmcgaXQuYCk7XG4gICAgY2QgPSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICAgIGF3YWl0IHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIoY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICBsb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgcXVlcnlpbmcgc3RhdGVzIG9mIENocm9tZSBhcHAgcGFja2FnZXNgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoY29uc3Qgd20gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAod20ud2Vidmlld05hbWUgPT09IGNvbnRleHQgJiYgXy5oYXMod20/LmluZm8sICdBbmRyb2lkLVBhY2thZ2UnKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gd20uaW5mb1snQW5kcm9pZC1QYWNrYWdlJ107XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBDRFBgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2QgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYiwgY29udGV4dCk7XG4gICAgLy8gYmluZCBvdXIgc3RvcC9leGl0IGhhbmRsZXIsIHBhc3NpbmcgaW4gY29udGV4dCBzbyB3ZSBrbm93IHdoaWNoXG4gICAgLy8gb25lIHN0b3BwZWQgdW5leHBlY3RlZGx5XG4gICAgY2Qub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHNhdmUgdGhlIGNocm9tZWRyaXZlciBvYmplY3QgdW5kZXIgdGhlIGNvbnRleHRcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdID0gY2Q7XG4gIH1cbiAgLy8gaG9vayB1cCB0aGUgbG9jYWwgdmFyaWFibGVzIHNvIHdlIGNhbiBwcm94eSB0aGlzIGJpelxuICB0aGlzLmNocm9tZWRyaXZlciA9IGNkO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gIHRoaXMucHJveHlDb21tYW5kID0gbnVsbDtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xufTtcblxuLy8gSGFuZGxlIGFuIG91dC1vZi1iYW5kIENocm9tZWRyaXZlciBzdG9wIGV2ZW50XG5oZWxwZXJzLm9uQ2hyb21lZHJpdmVyU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIG9uQ2hyb21lZHJpdmVyU3RvcCAoY29udGV4dCkge1xuICBsb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICBsb2cud2FybihcIkNocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSwgYnV0IGl0IHdhc24ndCB0aGUgYWN0aXZlIFwiICtcbiAgICAgICAgICAgICAgICAnY29udGV4dCwgaWdub3JpbmcnKTtcbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuLy8gSW50ZW50aW9uYWxseSBzdG9wIGFsbCB0aGUgY2hyb21lZHJpdmVycyBjdXJyZW50bHkgYWN0aXZlLCBhbmQgaWdub3JlXG4vLyB0aGVpciBleGl0IGV2ZW50c1xuaGVscGVycy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcyA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BDaHJvbWVkcml2ZXJQcm94aWVzICgpIHtcbiAgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTsgLy8gbWFrZSBzdXJlIHdlIHR1cm4gb2ZmIHRoZSBwcm94eSBmbGFnXG4gIGZvciAobGV0IGNvbnRleHQgb2YgXy5rZXlzKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMpKSB7XG4gICAgbGV0IGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICBsb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYEVycm9yIHN0b3BwaW5nIENocm9tZWRyaXZlcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJDb250ZXh0ID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJDb250ZXh0ICh2aWV3TmFtZSkge1xuICByZXR1cm4gXy5pbmNsdWRlcyh2aWV3TmFtZSwgV0VCVklFV19XSU4pIHx8IHZpZXdOYW1lID09PSBDSFJPTUlVTV9XSU47XG59O1xuXG5oZWxwZXJzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lID0gZnVuY3Rpb24gc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICByZXR1cm4gISF0aGlzLm9wdHMuY2hyb21lT3B0aW9ucyAmJlxuICAgICAgICAgXy5pc0FycmF5KHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MpICYmXG4gICAgICAgICB0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzLmluY2x1ZGVzKCctLW5vLWZpcnN0LXJ1bicpO1xufTtcblxuaGVscGVycy5kaXNtaXNzQ2hyb21lV2VsY29tZSA9IGFzeW5jIGZ1bmN0aW9uIGRpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgbG9nLmluZm8oJ1RyeWluZyB0byBkaXNtaXNzIENocm9tZSB3ZWxjb21lJyk7XG4gIGxldCBhY3Rpdml0eSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudEFjdGl2aXR5KCk7XG4gIGlmIChhY3Rpdml0eSAhPT0gJ29yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5maXJzdHJ1bi5GaXJzdFJ1bkFjdGl2aXR5Jykge1xuICAgIGxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgbG9nLndhcm4oYFRoaXMgZGV2aWNlIGRpZCBub3Qgc2hvdyBDaHJvbWUgU2lnbkluIGRpYWxvZywgJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuc3RhcnRDaHJvbWVTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVTZXNzaW9uICgpIHtcbiAgbG9nLmluZm8oJ1N0YXJ0aW5nIGEgY2hyb21lLWJhc2VkIGJyb3dzZXIgc2Vzc2lvbicpO1xuICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG5cbiAgY29uc3Qga25vd25QYWNrYWdlcyA9IFtcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gIF07XG5cbiAgaWYgKF8uaW5jbHVkZXMoa25vd25QYWNrYWdlcywgdGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgb3B0cy5jaHJvbWVCdW5kbGVJZCA9IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICB9IGVsc2Uge1xuICAgIG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIpO1xuICB0aGlzLmNocm9tZWRyaXZlci5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChDSFJPTUlVTV9XSU4pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIENocm9tZSBzZXNzaW9uLCB3ZSBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpc1xuICAvLyBhcHByb3ByaWF0ZWx5IHNldCBhbmQgdGhhdCB0aGlzIGNocm9tZWRyaXZlciBpcyBhZGRlZCB0byB0aGUgbGlzdFxuICAvLyBvZiBzZXNzaW9uIGNocm9tZWRyaXZlcnMgc28gd2UgY2FuIHN3aXRjaCBiYWNrIGFuZCBmb3J0aFxuICB0aGlzLmN1ckNvbnRleHQgPSBDSFJPTUlVTV9XSU47XG4gIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbQ0hST01JVU1fV0lOXSA9IHRoaXMuY2hyb21lZHJpdmVyO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuXG4gIGlmICh0aGlzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lKCkpIHtcbiAgICAvLyBkaXNtaXNzIENocm9tZSB3ZWxjb21lIGRpYWxvZ1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc0Nocm9tZVdlbGNvbWUoKTtcbiAgfVxufTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIgKGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IFtwb3J0U3BlY10gLSBBcnJheSB3aGljaCBpcyBhIGxpc3Qgb2YgcG9ydHMuIEEgbGlzdCBpdGVtIG1heVxuICogYWxzbyBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDIgc3BlY2lmeWluZyBhIHN0YXJ0IGFuZCBlbmQgcG9ydCBvZlxuICogYSByYW5nZS4gU29tZSB2YWxpZCBwb3J0IHNwZWNzOlxuICogICAgLSBbODAwMCwgODAwMSwgODAwMl1cbiAqICAgIC0gW1s4MDAwLCA4MDA1XV1cbiAqICAgIC0gWzgwMDAsIFs5MDAwLCA5MTAwXV1cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nLmRlYnVnKGBBIHBvcnQgd2FzIG5vdCBnaXZlbiwgdXNpbmcgcmFuZG9tIGZyZWUgcG9ydDogJHtwb3J0fWApO1xuICAgIHJldHVybiBwb3J0O1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIGZyZWUgcG9ydCBiYXNlZCBvbiBhIGxpc3Qgb3IgcmFuZ2UgcHJvdmlkZWQgYnkgdGhlIHVzZXJcbiAgbG9nLmRlYnVnKGBGaW5kaW5nIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgbGV0IGZvdW5kUG9ydCA9IG51bGw7XG4gIGZvciAoY29uc3QgcG90ZW50aWFsUG9ydCBvZiBwb3J0U3BlYykge1xuICAgIGxldCBwb3J0LCBzdG9wUG9ydDtcbiAgICBpZiAoXy5pc0FycmF5KHBvdGVudGlhbFBvcnQpKSB7XG4gICAgICAoW3BvcnQsIHN0b3BQb3J0XSA9IHBvdGVudGlhbFBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3J0ID0gcGFyc2VJbnQocG90ZW50aWFsUG9ydCwgMTApOyAvLyBlbnN1cmUgd2UgaGF2ZSBhIG51bWJlciBhbmQgbm90IGEgc3RyaW5nXG4gICAgICBzdG9wUG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm90aGluZyBpbiBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH0gd2FzIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmb3VuZFBvcnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGBjaHJvbWVkcml2ZXJQb3J0cyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBVc2luZyBmcmVlIHBvcnQgJHtmb3VuZFBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgcmV0dXJuIGZvdW5kUG9ydDtcbn1cblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgKCkge1xuICBpZiAodGhpcy5pc0ZlYXR1cmVFbmFibGVkKENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsb2cuZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIGxvZy53YXJuKGBUaGUgJ2Nocm9tZURyaXZlclBvcnQnIGNhcGFiaWxpdHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnY2hyb21lZHJpdmVyUG9ydCcgaW5zdGVhZGApO1xuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IG9wdHMuY2hyb21lRHJpdmVyUG9ydDtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZWRyaXZlclBvcnQpIHtcbiAgICBsb2cuZGVidWcoYFVzaW5nIHVzZXItc3BlY2lmaWVkIHBvcnQgJHtvcHRzLmNocm9tZWRyaXZlclBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIHNpbmdsZSBwb3J0IHdhc24ndCBnaXZlbiwgd2UnbGwgbG9vayBmb3IgYSBmcmVlIG9uZVxuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IGF3YWl0IGdldENocm9tZWRyaXZlclBvcnQob3B0cy5jaHJvbWVkcml2ZXJQb3J0cyk7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gY29udGV4dCA/IHdlYnZpZXdIZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzKGFkYiwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGlmICghXy5pc0VtcHR5KGRldGFpbHMpKSB7XG4gICAgbG9nLmRlYnVnKCdQYXNzaW5nIHdlYiB2aWV3IGRldGFpbHMgdG8gdGhlIENocm9tZWRyaXZlciBjb25zdHJ1Y3RvcjogJyArXG4gICAgICBKU09OLnN0cmluZ2lmeShkZXRhaWxzLCBudWxsLCAyKSk7XG4gIH1cblxuICBjb25zdCBjaHJvbWVkcml2ZXIgPSBuZXcgQ2hyb21lZHJpdmVyKHtcbiAgICBwb3J0OiBvcHRzLmNocm9tZWRyaXZlclBvcnQsXG4gICAgZXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlLFxuICAgIGFkYixcbiAgICBjbWRBcmdzOiBvcHRzLmNocm9tZWRyaXZlckFyZ3MsXG4gICAgdmVyYm9zZTogISFvcHRzLnNob3dDaHJvbWVkcml2ZXJMb2csXG4gICAgZXhlY3V0YWJsZURpcjogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyLFxuICAgIG1hcHBpbmdQYXRoOiBvcHRzLmNocm9tZWRyaXZlckNocm9tZU1hcHBpbmdGaWxlLFxuICAgIGJ1bmRsZUlkOiBvcHRzLmNocm9tZUJ1bmRsZUlkLFxuICAgIHVzZVN5c3RlbUV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyVXNlU3lzdGVtRXhlY3V0YWJsZSxcbiAgICBkaXNhYmxlQnVpbGRDaGVjazogb3B0cy5jaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayxcbiAgICBkZXRhaWxzLFxuICAgIGlzQXV0b2Rvd25sb2FkRW5hYmxlZDogKHRoaXMgfHwge30pLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZFxuICAgICAgPyB0aGlzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCgpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIGNocm9tZU9wdGlvbnNcbiAgb3B0cy5jaHJvbWVPcHRpb25zID0gb3B0cy5jaHJvbWVPcHRpb25zIHx8IHt9O1xuICAvLyB0cnkgb3V0IGFueSBwcmVmaXhlZCBjaHJvbWVPcHRpb25zLFxuICAvLyBhbmQgc3RyaXAgdGhlIHByZWZpeFxuICBmb3IgKGNvbnN0IG9wdCBvZiBfLmtleXMob3B0cykpIHtcbiAgICBpZiAob3B0LmVuZHNXaXRoKCc6Y2hyb21lT3B0aW9ucycpKSB7XG4gICAgICBsb2cud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICBsb2cuZGVidWcoYEJlZm9yZSBzdGFydGluZyBjaHJvbWVkcml2ZXIsIGFuZHJvaWRQYWNrYWdlIGlzICcke2NhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZX0nYCk7XG4gIGF3YWl0IGNocm9tZWRyaXZlci5zdGFydChjYXBzKTtcbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn07XG5jb25zdCBzZXR1cE5ld0Nocm9tZWRyaXZlciA9IGhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXI7XG5cblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycywgc2V0dXBOZXdDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9jb250ZXh0LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
408
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jb250ZXh0LmpzIl0sIm5hbWVzIjpbIkNIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJnZXRDdXJyZW50Q29udGV4dCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJnZXRDb250ZXh0cyIsIndlYnZpZXdzTWFwcGluZyIsIndlYnZpZXdIZWxwZXJzIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYWRiIiwib3B0cyIsImFzc2lnbkNvbnRleHRzIiwic2V0Q29udGV4dCIsIm5hbWUiLCJ1dGlsIiwiaGFzVmFsdWUiLCJXRUJWSUVXX1dJTiIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImNvbnRleHRzIiwiXyIsImluY2x1ZGVzIiwiZXJyb3JzIiwiTm9TdWNoQ29udGV4dEVycm9yIiwic3dpdGNoQ29udGV4dCIsIm1vYmlsZUdldENvbnRleHRzIiwiYW5kcm9pZERldmljZVNvY2tldCIsImVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIiwid2Vidmlld0RldnRvb2xzUG9ydCIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsIk9iamVjdCIsImFzc2lnbiIsImlzQ2hyb21lU2Vzc2lvbiIsIndlYnZpZXdzIiwicGFyc2VXZWJ2aWV3TmFtZXMiLCJOQVRJVkVfV0lOIiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwiaXNDaHJvbWVkcml2ZXJDb250ZXh0Iiwic3RhcnRDaHJvbWVkcml2ZXJQcm94eSIsInJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsIkVycm9yIiwiV0VCVklFV19CQVNFIiwiYXBwUGFja2FnZSIsImlzV2ViQ29udGV4dCIsImNvbnRleHQiLCJjZCIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwic2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlciIsImNsb25lRGVlcCIsImNocm9tZVVzZVJ1bm5pbmdBcHAiLCJleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUiLCJhbmRyb2lkUGFja2FnZSIsIm1hdGNoIiwibGVuZ3RoIiwiY2hyb21lQW5kcm9pZFBhY2thZ2UiLCJoYXMiLCJtYXAiLCJ3bSIsIndlYnZpZXdOYW1lIiwia25vd25QYWNrYWdlIiwiS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMiLCJhcHBTdGF0ZSIsInF1ZXJ5QXBwU3RhdGUiLCJBUFBfU1RBVEUiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJpbmZvIiwic2V0dXBOZXdDaHJvbWVkcml2ZXIiLCJjdXJEZXZpY2VJZCIsIm9uIiwiQ2hyb21lZHJpdmVyIiwiRVZFTlRfQ0hBTkdFRCIsIm1zZyIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsIm9uQ2hyb21lZHJpdmVyU3RvcCIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwicHJveHlSZXEiLCJiaW5kIiwicHJveHlDb21tYW5kIiwiandwcm94eSIsImNvbW1hbmQiLCJqd3BQcm94eUFjdGl2ZSIsIndhcm4iLCJlcnIiLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImtleXMiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzdG9wIiwibWVzc2FnZSIsInZpZXdOYW1lIiwiQ0hST01JVU1fV0lOIiwic2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJjaHJvbWVPcHRpb25zIiwiaXNBcnJheSIsImFyZ3MiLCJkaXNtaXNzQ2hyb21lV2VsY29tZSIsImFjdGl2aXR5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZWwiLCJmaW5kRWxPckVscyIsImNsaWNrIiwiRUxFTUVOVCIsImUiLCJzdGFydENocm9tZVNlc3Npb24iLCJrbm93blBhY2thZ2VzIiwiY2hyb21lQnVuZGxlSWQiLCJjaHJvbWVBbmRyb2lkQWN0aXZpdHkiLCJhcHBBY3Rpdml0eSIsImhhc1dvcmtpbmdXZWJ2aWV3IiwicmVzdGFydCIsImdldENocm9tZWRyaXZlclBvcnQiLCJwb3J0U3BlYyIsImdldFBvcnQiLCJCIiwicHJvbWlzaWZ5IiwiUG9ydEZpbmRlciIsInBvcnQiLCJmb3VuZFBvcnQiLCJwb3RlbnRpYWxQb3J0Iiwic3RvcFBvcnQiLCJwYXJzZUludCIsImlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCIsImlzRmVhdHVyZUVuYWJsZWQiLCJjaHJvbWVEcml2ZXJQb3J0IiwiY2hyb21lZHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnRzIiwiZGV0YWlscyIsImdldFdlYnZpZXdEZXRhaWxzIiwidW5kZWZpbmVkIiwiaXNFbXB0eSIsImV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY21kQXJncyIsImNocm9tZWRyaXZlckFyZ3MiLCJ2ZXJib3NlIiwic2hvd0Nocm9tZWRyaXZlckxvZyIsImV4ZWN1dGFibGVEaXIiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyIiwibWFwcGluZ1BhdGgiLCJjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSIsImJ1bmRsZUlkIiwidXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUiLCJkaXNhYmxlQnVpbGRDaGVjayIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwib3B0IiwiZW5kc1dpdGgiLCJtZXJnZSIsImNhcHMiLCJjcmVhdGVDaHJvbWVkcml2ZXJDYXBzIiwic3RhcnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7OztBQUVBLE1BQU1BLGlDQUFpQyxHQUFHLDJCQUExQztBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlDQyxVQUFV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TVQsb0JBQW9CLEdBQUd2RSxPQUFPLENBQUN1RSxvQkFBckM7O0FBR0ExQyxNQUFNLENBQUNDLE1BQVAsQ0FBYzdCLFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHdlYnZpZXdIZWxwZXJzLFxuICBOQVRJVkVfV0lOLCBXRUJWSUVXX0JBU0UsIFdFQlZJRVdfV0lOLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTXG59IGZyb20gJy4uL3dlYnZpZXctaGVscGVycyc7XG5pbXBvcnQgeyBBUFBfU1RBVEUgfSBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAnY2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBY3R1YWwgTUpTT05XUCBjb21tYW5kIGhhbmRsZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb21tYW5kcy5nZXRDdXJyZW50Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDb250ZXh0ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYG51bGxgLCBpbmRpY2F0aW5nIG5vIGNvbnRleHRcbiAgLy8gZXhwbGljaXRseSBzZXQsIGl0IGlzIHRoZSBkZWZhdWx0IGNvbnRleHRcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCB8fCB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgcmV0dXJuIHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbn07XG5cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lKSB7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShuYW1lKSkge1xuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuICB9IGVsc2UgaWYgKG5hbWUgPT09IFdFQlZJRVdfV0lOKSB7XG4gICAgLy8gaGFuZGxlIHNldENvbnRleHQgXCJXRUJWSUVXXCJcbiAgICBuYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgfVxuICAvLyBpZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBjb250ZXh0IHdlIHdhbnQsIGRvIG5vdGhpbmdcbiAgaWYgKG5hbWUgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgY29uc3QgY29udGV4dHMgPSB0aGlzLmFzc2lnbkNvbnRleHRzKHdlYnZpZXdzTWFwcGluZyk7XG4gIC8vIGlmIHRoZSBjb250ZXh0IHdlIHdhbnQgZG9lc24ndCBleGlzdCwgZmFpbFxuICBpZiAoIV8uaW5jbHVkZXMoY29udGV4dHMsIG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IoKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuc3dpdGNoQ29udGV4dChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB0aGlzLmN1ckNvbnRleHQgPSBuYW1lO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHQuXG4gKiBUaGlzIHZhbHVlIGJlY29tZXMgbnVsbCB3aGVuIGZhaWxpbmcgdG8gZmluZCBhIFBJRCBmb3IgYSB3ZWJ2aWV3LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcganNvbiBkZW1vbnN0cmF0ZXMgdGhlIGV4YW1wbGUgb2YgV2Vidmlld3NNYXBwaW5nIG9iamVjdC5cbiAqIE5vdGUgdGhhdCBgZGVzY3JpcHRpb25gIGluIGBwYWdlYCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nIG1vc3QgbGlrZWx5IHdoZW4gaXQgY29tZXMgdG8gTW9iaWxlIENocm9tZSlcbiAqIHtcbiAqICAgXCJwcm9jXCI6IFwiQHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXzIyMTM4XCIsXG4gKiAgIFwid2Vidmlld1wiOiBcIldFQlZJRVdfMjIxMzhcIixcbiAqICAgXCJpbmZvXCI6IHtcbiAqICAgICBcIkFuZHJvaWQtUGFja2FnZVwiOiBcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS83NC4wLjM3MjkuMTg1XCIsXG4gKiAgICAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgICAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBBbmRyb2lkIFNESyBidWlsdCBmb3IgeDg2IEJ1aWxkL1FTUjEuMTkwOTIwLjAwMTsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NC4wLjM3MjkuMTg1IE1vYmlsZSBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgICAgXCJWOC1WZXJzaW9uXCI6IFwiNy40LjI4OC4yOFwiLFxuICogICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEAyMjk1NTY4MmY5NGNlMDkzMzYxOTdiZmI4ZGZmZWE5OTFmYTMyZjBkKVwiLFxuICogICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9icm93c2VyXCJcbiAqICAgfSxcbiAqICAgXCJwYWdlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIntcXFwiYXR0YWNoZWRcXFwiOnRydWUsXFxcImVtcHR5XFxcIjpmYWxzZSxcXFwiaGVpZ2h0XFxcIjoxNDU4LFxcXCJzY3JlZW5YXFxcIjowLFxcXCJzY3JlZW5ZXFxcIjozMzYsXFxcInZpc2libGVcXFwiOnRydWUsXFxcIndpZHRoXFxcIjoxMDgwfVwiLFxuICogICAgICAgXCJkZXZ0b29sc0Zyb250ZW5kVXJsXCI6IFwiaHR0cDovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbS9zZXJ2ZV9yZXYvQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQvaW5zcGVjdG9yLmh0bWw/d3M9MTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL3BhZ2UvMjczMjVDQzUwQjYwMEQzMUIyMzNGNDVFMDk0ODdCMUZcIixcbiAqICAgICAgIFwiaWRcIjogXCIyNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJ0aXRsZVwiOiBcIlJlbGVhc2VzIMK3IGFwcGl1bS9hcHBpdW0gwrcgR2l0SHViXCIsXG4gKiAgICAgICBcInR5cGVcIjogXCJwYWdlXCIsXG4gKiAgICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3JlbGVhc2VzXCIsXG4gKiAgICAgICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly8xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiXG4gKiAgICAgfVxuICogICBdLFxuICogICBcIndlYnZpZXdOYW1lXCI6IFwiV0VCVklFV19jb20uaW8uYXBwaXVtLnNldHRpbmdcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0dXJucyBhIHdlYnZpZXdzTWFwcGluZyBiYXNlZCBvbiBDRFAgZW5kcG9pbnRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29udGV4dHMgKCkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIGFuZHJvaWREZXZpY2VTb2NrZXQ6IHRoaXMub3B0cy5hbmRyb2lkRGV2aWNlU29ja2V0LFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzOiB0cnVlLFxuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQ6IHRoaXMub3B0cy53ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbjogdHJ1ZVxuICB9O1xuICByZXR1cm4gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCBvcHRzKTtcbn07XG5cbmhlbHBlcnMuYXNzaWduQ29udGV4dHMgPSBmdW5jdGlvbiBhc3NpZ25Db250ZXh0cyAod2Vidmlld3NNYXBwaW5nKSB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtpc0Nocm9tZVNlc3Npb246IHRoaXMuaXNDaHJvbWVTZXNzaW9ufSwgdGhpcy5vcHRzKTtcbiAgY29uc3Qgd2Vidmlld3MgPSB3ZWJ2aWV3SGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyh3ZWJ2aWV3c01hcHBpbmcsIG9wdHMpO1xuICB0aGlzLmNvbnRleHRzID0gW05BVElWRV9XSU4sIC4uLndlYnZpZXdzXTtcbiAgdGhpcy5sb2cuZGVidWcoYEF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbnRleHRzKX1gKTtcbiAgcmV0dXJuIHRoaXMuY29udGV4dHM7XG59O1xuXG5oZWxwZXJzLnN3aXRjaENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzd2l0Y2hDb250ZXh0IChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgLy8gV2UgaGF2ZSBzb21lIG9wdGlvbnMgd2hlbiBpdCBjb21lcyB0byB3ZWJ2aWV3cy4gSWYgd2Ugd2FudCBhXG4gIC8vIENocm9tZWRyaXZlciB3ZWJ2aWV3LCB3ZSBjYW4gb25seSBjb250cm9sIG9uZSBhdCBhIHRpbWUuXG4gIGlmICh0aGlzLmlzQ2hyb21lZHJpdmVyQ29udGV4dChuYW1lKSkge1xuICAgIC8vIHN0YXJ0IHByb3h5aW5nIGNvbW1hbmRzIGRpcmVjdGx5IHRvIGNocm9tZWRyaXZlclxuICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVkcml2ZXJQcm94eShuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB9IGVsc2UgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICAvLyBpZiB3ZSdyZSBtb3ZpbmcgdG8gYSBub24tY2hyb21lZHJpdmVyIHdlYnZpZXcsIGFuZCBvdXIgY3VycmVudCBjb250ZXh0XG4gICAgLy8gX2lzXyBhIGNocm9tZWRyaXZlciB3ZWJ2aWV3LCBpZiBjYXBzIHJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgaXMgc2V0XG4gICAgLy8gdG8gdHJ1ZSB0aGVuIGtpbGwgY2hyb21lZHJpdmVyIHNlc3Npb24gdXNpbmcgc3RvcENocm9tZWRyaXZlclByb3hpZXMgb3JcbiAgICAvLyBlbHNlIHNpbXBseSBzdXNwZW5kIHByb3h5aW5nIHRvIHRoZSBsYXR0ZXJcbiAgICBpZiAodGhpcy5vcHRzLnJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIHNldCB0byB0cnVlOyBraWxsaW5nIGV4aXN0aW5nIGNocm9tZWRyaXZlcnMnKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWRuJ3Qga25vdyBob3cgdG8gaGFuZGxlIHN3aXRjaGluZyB0byBjb250ZXh0ICcke25hbWV9J2ApO1xuICB9XG59O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogT24tb2JqZWN0IGNvbnRleHQtcmVsYXRlZCBoZWxwZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLy8gVGhlIHJlYXNvbiB0aGlzIGlzIGEgZnVuY3Rpb24gYW5kIG5vdCBqdXN0IGEgY29uc3RhbnQgaXMgdGhhdCBib3RoIGFuZHJvaWQtXG4vLyBkcml2ZXIgYW5kIHNlbGVuZHJvaWQtZHJpdmVyIHVzZSB0aGlzIGxvZ2ljLCBhbmQgZWFjaCBvbmUgcmV0dXJuc1xuLy8gYSBkaWZmZXJlbnQgZGVmYXVsdCBjb250ZXh0IG5hbWVcbmhlbHBlcnMuZGVmYXVsdENvbnRleHROYW1lID0gZnVuY3Rpb24gZGVmYXVsdENvbnRleHROYW1lICgpIHtcbiAgcmV0dXJuIE5BVElWRV9XSU47XG59O1xuXG5oZWxwZXJzLmRlZmF1bHRXZWJ2aWV3TmFtZSA9IGZ1bmN0aW9uIGRlZmF1bHRXZWJ2aWV3TmFtZSAoKSB7XG4gIHJldHVybiBXRUJWSUVXX0JBU0UgKyB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -9,8 +7,6 @@ exports.default = exports.commands = void 0;
|
|
|
9
7
|
|
|
10
8
|
require("source-map-support/register");
|
|
11
9
|
|
|
12
|
-
var _logger = _interopRequireDefault(require("../logger"));
|
|
13
|
-
|
|
14
10
|
const commands = {};
|
|
15
11
|
exports.commands = commands;
|
|
16
12
|
|
|
@@ -20,7 +16,7 @@ commands.endCoverage = async function endCoverage(intentToBroadcast, ecOnDeviceP
|
|
|
20
16
|
await this.adb.broadcastProcessEnd(intentToBroadcast, this.appProcess);
|
|
21
17
|
return await this.pullFile(ecOnDevicePath);
|
|
22
18
|
} catch (err) {
|
|
23
|
-
|
|
19
|
+
this.log.warn(`Error ending test coverage: ${err.message}`);
|
|
24
20
|
}
|
|
25
21
|
|
|
26
22
|
return '';
|
|
@@ -30,4 +26,4 @@ var _default = commands;
|
|
|
30
26
|
exports.default = _default;require('source-map-support').install();
|
|
31
27
|
|
|
32
28
|
|
|
33
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jb3ZlcmFnZS5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsImVuZENvdmVyYWdlIiwiaW50ZW50VG9Ccm9hZGNhc3QiLCJlY09uRGV2aWNlUGF0aCIsImFkYiIsInJpbXJhZiIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJhcHBQcm9jZXNzIiwicHVsbEZpbGUiLCJlcnIiLCJsb2ciLCJ3YXJuIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOzs7QUFHQUEsUUFBUSxDQUFDQyxXQUFULEdBQXVCLGVBQWVBLFdBQWYsQ0FBNEJDLGlCQUE1QixFQUErQ0MsY0FBL0MsRUFBK0Q7QUFDcEYsTUFBSTtBQUVGLFVBQU0sS0FBS0MsR0FBTCxDQUFTQyxNQUFULENBQWdCRixjQUFoQixDQUFOO0FBQ0EsVUFBTSxLQUFLQyxHQUFMLENBQVNFLG1CQUFULENBQTZCSixpQkFBN0IsRUFBZ0QsS0FBS0ssVUFBckQsQ0FBTjtBQUNBLFdBQU8sTUFBTSxLQUFLQyxRQUFMLENBQWNMLGNBQWQsQ0FBYjtBQUNELEdBTEQsQ0FLRSxPQUFPTSxHQUFQLEVBQVk7QUFDWixTQUFLQyxHQUFMLENBQVNDLElBQVQsQ0FBZSwrQkFBOEJGLEdBQUcsQ0FBQ0csT0FBUSxFQUF6RDtBQUNEOztBQUNELFNBQU8sRUFBUDtBQUNELENBVkQ7O2VBY2VaLFEiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmNvbW1hbmRzLmVuZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQ292ZXJhZ2UgKGludGVudFRvQnJvYWRjYXN0LCBlY09uRGV2aWNlUGF0aCkge1xuICB0cnkge1xuICAgIC8vIGVuc3VyZSB0aGUgZWMgd2UncmUgcHVsbGluZyBpcyBuZXdseSBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBpbnRlbnQuXG4gICAgYXdhaXQgdGhpcy5hZGIucmltcmFmKGVjT25EZXZpY2VQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RQcm9jZXNzRW5kKGludGVudFRvQnJvYWRjYXN0LCB0aGlzLmFwcFByb2Nlc3MpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGaWxlKGVjT25EZXZpY2VQYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cud2FybihgRXJyb3IgZW5kaW5nIHRlc3QgY292ZXJhZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9jb3ZlcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|