appium-android-driver 5.4.3 → 5.5.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/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +32 -91
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/lib/commands/general.js +34 -15
- package/package.json +1 -1
package/build/lib/driver.js
CHANGED
|
@@ -1,38 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = exports.AndroidDriver = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _driver = require("appium/driver");
|
|
13
|
-
|
|
14
10
|
var _desiredCaps = _interopRequireDefault(require("./desired-caps"));
|
|
15
|
-
|
|
16
11
|
var _index = _interopRequireDefault(require("./commands/index"));
|
|
17
|
-
|
|
18
12
|
var _androidHelpers = require("./android-helpers");
|
|
19
|
-
|
|
20
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
21
|
-
|
|
22
14
|
var _appiumAdb = require("appium-adb");
|
|
23
|
-
|
|
24
15
|
var _support = require("appium/support");
|
|
25
|
-
|
|
26
16
|
var _asyncbox = require("asyncbox");
|
|
27
|
-
|
|
28
17
|
var _sharedPreferencesBuilder = require("shared-preferences-builder");
|
|
29
|
-
|
|
30
18
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
31
|
-
|
|
32
19
|
const APP_EXTENSION = '.apk';
|
|
33
20
|
const DEVICE_PORT = 4724;
|
|
34
|
-
const NO_PROXY = [['POST', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/network_connection')]];
|
|
35
21
|
|
|
22
|
+
const NO_PROXY = [['POST', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/network_connection')]];
|
|
36
23
|
class AndroidDriver extends _driver.BaseDriver {
|
|
37
24
|
constructor(opts = {}, shouldValidateCaps = true) {
|
|
38
25
|
super(opts, shouldValidateCaps);
|
|
@@ -47,14 +34,12 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
47
34
|
this.chromedriver = null;
|
|
48
35
|
this.apkStrings = {};
|
|
49
36
|
this.unlocker = _androidHelpers.helpers.unlocker;
|
|
50
|
-
|
|
51
37
|
for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
|
|
52
38
|
AndroidDriver.prototype[cmd] = fn;
|
|
53
39
|
}
|
|
54
40
|
|
|
55
41
|
this.curContext = this.defaultContextName();
|
|
56
42
|
}
|
|
57
|
-
|
|
58
43
|
async createSession(...args) {
|
|
59
44
|
try {
|
|
60
45
|
let [sessionId, caps] = await super.createSession(...args);
|
|
@@ -70,6 +55,7 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
70
55
|
desired: this.caps
|
|
71
56
|
};
|
|
72
57
|
this.caps = Object.assign(serverDetails, this.caps);
|
|
58
|
+
|
|
73
59
|
let defaultOpts = {
|
|
74
60
|
action: 'android.intent.action.MAIN',
|
|
75
61
|
category: 'android.intent.category.LAUNCHER',
|
|
@@ -82,30 +68,23 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
82
68
|
bootstrapPort: DEVICE_PORT,
|
|
83
69
|
androidInstallTimeout: 90000
|
|
84
70
|
};
|
|
85
|
-
|
|
86
71
|
_lodash.default.defaults(this.opts, defaultOpts);
|
|
87
|
-
|
|
88
72
|
this.useUnlockHelperApp = _lodash.default.isUndefined(this.caps.unlockType);
|
|
89
73
|
|
|
90
74
|
if (this.opts.noReset === true) {
|
|
91
75
|
this.opts.fullReset = false;
|
|
92
76
|
}
|
|
93
|
-
|
|
94
77
|
if (this.opts.fullReset === true) {
|
|
95
78
|
this.opts.noReset = false;
|
|
96
79
|
}
|
|
97
|
-
|
|
98
80
|
this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;
|
|
99
81
|
this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;
|
|
100
|
-
|
|
101
82
|
if (this.isChromeSession) {
|
|
102
83
|
_androidHelpers.helpers.adjustBrowserSessionCaps(this.opts);
|
|
103
84
|
}
|
|
104
|
-
|
|
105
85
|
if (this.opts.nativeWebScreenshot) {
|
|
106
86
|
this.jwpProxyAvoid.push(['GET', new RegExp('^/session/[^/]+/screenshot')]);
|
|
107
87
|
}
|
|
108
|
-
|
|
109
88
|
if (this.opts.reboot) {
|
|
110
89
|
this.setAvdFromCapabilities(caps);
|
|
111
90
|
}
|
|
@@ -116,6 +95,7 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
116
95
|
} = await _androidHelpers.helpers.getDeviceInfoFromCaps(this.opts);
|
|
117
96
|
this.opts.udid = udid;
|
|
118
97
|
this.opts.emPort = emPort;
|
|
98
|
+
|
|
119
99
|
this.adb = await _androidHelpers.helpers.createADB({
|
|
120
100
|
udid: this.opts.udid,
|
|
121
101
|
emPort: this.opts.emPort,
|
|
@@ -126,16 +106,13 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
126
106
|
adbExecTimeout: this.opts.adbExecTimeout,
|
|
127
107
|
allowOfflineDevices: this.opts.allowOfflineDevices
|
|
128
108
|
});
|
|
129
|
-
|
|
130
109
|
if ((await this.adb.getApiLevel()) >= 23) {
|
|
131
110
|
this.log.warn("Consider setting 'automationName' capability to " + "'uiautomator2' on Android >= 6, since UIAutomator framework " + 'is not maintained anymore by the OS vendor.');
|
|
132
111
|
}
|
|
133
|
-
|
|
134
112
|
if (this.helpers.isPackageOrBundle(this.opts.app)) {
|
|
135
113
|
this.opts.appPackage = this.opts.app;
|
|
136
114
|
this.opts.app = null;
|
|
137
115
|
}
|
|
138
|
-
|
|
139
116
|
if (this.opts.app) {
|
|
140
117
|
this.opts.app = await this.helpers.configureApp(this.opts.app, APP_EXTENSION);
|
|
141
118
|
await this.checkAppPresent();
|
|
@@ -152,7 +129,6 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
152
129
|
await this.adb.networkSpeed(networkSpeed);
|
|
153
130
|
}
|
|
154
131
|
}
|
|
155
|
-
|
|
156
132
|
if (_support.util.hasValue(this.opts.gpsEnabled)) {
|
|
157
133
|
if (this.isEmulator()) {
|
|
158
134
|
this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);
|
|
@@ -161,22 +137,18 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
161
137
|
this.log.warn('Sorry! gpsEnabled capability is only available for emulators');
|
|
162
138
|
}
|
|
163
139
|
}
|
|
164
|
-
|
|
165
140
|
await this.startAndroidSession(this.opts);
|
|
166
141
|
return [sessionId, this.caps];
|
|
167
142
|
} catch (e) {
|
|
168
143
|
try {
|
|
169
144
|
await this.deleteSession();
|
|
170
145
|
} catch (ign) {}
|
|
171
|
-
|
|
172
146
|
throw e;
|
|
173
147
|
}
|
|
174
148
|
}
|
|
175
|
-
|
|
176
149
|
isEmulator() {
|
|
177
150
|
return _androidHelpers.helpers.isEmulator(this.adb, this.opts);
|
|
178
151
|
}
|
|
179
|
-
|
|
180
152
|
setAvdFromCapabilities(caps) {
|
|
181
153
|
if (this.opts.avd) {
|
|
182
154
|
this.log.info('avd name defined, ignoring device name and platform version');
|
|
@@ -184,47 +156,40 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
184
156
|
if (!caps.deviceName) {
|
|
185
157
|
this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
|
|
186
158
|
}
|
|
187
|
-
|
|
188
159
|
if (!caps.platformVersion) {
|
|
189
160
|
this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
|
|
190
161
|
}
|
|
191
|
-
|
|
192
162
|
let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
|
|
193
163
|
this.opts.avd = `${avdDevice}__${caps.platformVersion}`;
|
|
194
164
|
}
|
|
195
165
|
}
|
|
196
|
-
|
|
197
166
|
get appOnDevice() {
|
|
198
167
|
return this.helpers.isPackageOrBundle(this.opts.app) || !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);
|
|
199
168
|
}
|
|
200
|
-
|
|
201
169
|
get isChromeSession() {
|
|
202
170
|
return _androidHelpers.helpers.isChromeBrowser(this.opts.browserName);
|
|
203
171
|
}
|
|
204
|
-
|
|
205
172
|
async onSettingsUpdate(key, value) {
|
|
206
173
|
if (key === 'ignoreUnimportantViews') {
|
|
207
174
|
await this.setCompressedLayoutHierarchy(value);
|
|
208
175
|
}
|
|
209
176
|
}
|
|
210
|
-
|
|
211
177
|
async startAndroidSession() {
|
|
212
178
|
this.log.info(`Starting Android session`);
|
|
213
179
|
this.defaultIME = await _androidHelpers.helpers.initDevice(this.adb, this.opts);
|
|
180
|
+
|
|
214
181
|
this.caps.deviceName = this.adb.curDeviceId;
|
|
215
182
|
this.caps.deviceUDID = this.opts.udid;
|
|
216
183
|
this.caps.platformVersion = await this.adb.getPlatformVersion();
|
|
217
184
|
this.caps.deviceScreenSize = await this.adb.getScreenSize();
|
|
218
185
|
this.caps.deviceModel = await this.adb.getModel();
|
|
219
186
|
this.caps.deviceManufacturer = await this.adb.getManufacturer();
|
|
220
|
-
|
|
221
187
|
if (this.opts.disableWindowAnimation) {
|
|
222
188
|
if (await this.adb.isAnimationOn()) {
|
|
223
189
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
224
190
|
this.log.warn('Relaxing hidden api policy to manage animation scale');
|
|
225
191
|
await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
|
|
226
192
|
}
|
|
227
|
-
|
|
228
193
|
this.log.info('Disabling window animation as it is requested by "disableWindowAnimation" capability');
|
|
229
194
|
await this.adb.setAnimationState(false);
|
|
230
195
|
this._wasWindowAnimationDisabled = true;
|
|
@@ -234,9 +199,9 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
234
199
|
}
|
|
235
200
|
|
|
236
201
|
await this.initAUT();
|
|
202
|
+
|
|
237
203
|
this.bootstrap = new _androidHelpers.helpers.bootstrap(this.adb, this.opts.bootstrapPort, this.opts.websocket);
|
|
238
204
|
await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);
|
|
239
|
-
|
|
240
205
|
(async () => {
|
|
241
206
|
try {
|
|
242
207
|
await this.bootstrap.onUnexpectedShutdown;
|
|
@@ -246,7 +211,6 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
246
211
|
}
|
|
247
212
|
}
|
|
248
213
|
})();
|
|
249
|
-
|
|
250
214
|
if (!this.opts.skipUnlock) {
|
|
251
215
|
await _androidHelpers.helpers.unlock(this, this.adb, this.caps);
|
|
252
216
|
}
|
|
@@ -256,7 +220,6 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
256
220
|
ignoreUnimportantViews: this.opts.ignoreUnimportantViews
|
|
257
221
|
});
|
|
258
222
|
}
|
|
259
|
-
|
|
260
223
|
if (this.isChromeSession) {
|
|
261
224
|
await this.startChromeSession();
|
|
262
225
|
} else {
|
|
@@ -264,26 +227,23 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
264
227
|
await this.startAUT();
|
|
265
228
|
}
|
|
266
229
|
}
|
|
267
|
-
|
|
268
230
|
if (_support.util.hasValue(this.opts.orientation)) {
|
|
269
231
|
this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);
|
|
270
232
|
await this.setOrientation(this.opts.orientation);
|
|
271
233
|
}
|
|
272
|
-
|
|
273
234
|
await this.initAutoWebview();
|
|
274
235
|
}
|
|
275
|
-
|
|
276
236
|
async initAutoWebview() {
|
|
277
237
|
if (this.opts.autoWebview) {
|
|
278
238
|
let viewName = this.defaultWebviewName();
|
|
279
239
|
let timeout = this.opts.autoWebviewTimeout || 2000;
|
|
280
240
|
this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
241
|
+
|
|
281
242
|
await (0, _asyncbox.retryInterval)(timeout / 500, 500, async () => {
|
|
282
243
|
await this.setContext(viewName);
|
|
283
244
|
});
|
|
284
245
|
}
|
|
285
246
|
}
|
|
286
|
-
|
|
287
247
|
async initAUT() {
|
|
288
248
|
let launchInfo = await _androidHelpers.helpers.getLaunchInfo(this.adb, this.opts);
|
|
289
249
|
Object.assign(this.opts, launchInfo);
|
|
@@ -291,19 +251,16 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
291
251
|
|
|
292
252
|
if (this.opts.uninstallOtherPackages) {
|
|
293
253
|
_androidHelpers.helpers.validateDesiredCaps(this.opts);
|
|
294
|
-
|
|
295
254
|
await _androidHelpers.helpers.uninstallOtherPackages(this.adb, _androidHelpers.helpers.parseArray(this.opts.uninstallOtherPackages), [_androidHelpers.SETTINGS_HELPER_PKG_ID]);
|
|
296
255
|
}
|
|
297
256
|
|
|
298
257
|
if (this.opts.otherApps) {
|
|
299
258
|
let otherApps;
|
|
300
|
-
|
|
301
259
|
try {
|
|
302
260
|
otherApps = _androidHelpers.helpers.parseArray(this.opts.otherApps);
|
|
303
261
|
} catch (e) {
|
|
304
262
|
this.log.errorAndThrow(`Could not parse "otherApps" capability: ${e.message}`);
|
|
305
263
|
}
|
|
306
|
-
|
|
307
264
|
otherApps = await _bluebird.default.all(otherApps.map(app => this.helpers.configureApp(app, APP_EXTENSION)));
|
|
308
265
|
await _androidHelpers.helpers.installOtherApks(otherApps, this.adb, this.opts);
|
|
309
266
|
}
|
|
@@ -312,23 +269,17 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
312
269
|
if (this.opts.fullReset) {
|
|
313
270
|
this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
|
314
271
|
}
|
|
315
|
-
|
|
316
272
|
this.log.debug('No app capability. Assuming it is already on the device');
|
|
317
|
-
|
|
318
273
|
if (this.opts.fastReset) {
|
|
319
274
|
await _androidHelpers.helpers.resetApp(this.adb, this.opts);
|
|
320
275
|
}
|
|
321
|
-
|
|
322
276
|
return;
|
|
323
277
|
}
|
|
324
|
-
|
|
325
278
|
if (!this.opts.skipUninstall) {
|
|
326
279
|
await this.adb.uninstallApk(this.opts.appPackage);
|
|
327
280
|
}
|
|
328
|
-
|
|
329
281
|
await _androidHelpers.helpers.installApk(this.adb, this.opts);
|
|
330
282
|
const apkStringsForLanguage = await _androidHelpers.helpers.pushStrings(this.opts.language, this.adb, this.opts);
|
|
331
|
-
|
|
332
283
|
if (this.opts.language) {
|
|
333
284
|
this.apkStrings[this.opts.language] = apkStringsForLanguage;
|
|
334
285
|
}
|
|
@@ -337,18 +288,14 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
337
288
|
await this.setSharedPreferences(this.opts);
|
|
338
289
|
}
|
|
339
290
|
}
|
|
340
|
-
|
|
341
291
|
async checkAppPresent() {
|
|
342
292
|
this.log.debug('Checking whether app is actually present');
|
|
343
|
-
|
|
344
293
|
if (!(await _support.fs.exists(this.opts.app))) {
|
|
345
294
|
this.log.errorAndThrow(`Could not find app apk at ${this.opts.app}`);
|
|
346
295
|
}
|
|
347
296
|
}
|
|
348
|
-
|
|
349
297
|
async checkPackagePresent() {
|
|
350
298
|
this.log.debug('Checking whether package is present on the device');
|
|
351
|
-
|
|
352
299
|
if (!(await this.adb.shell(['pm', 'list', 'packages', this.opts.appPackage]))) {
|
|
353
300
|
this.log.errorAndThrow(`Could not find package ${this.opts.appPackage} on the device`);
|
|
354
301
|
}
|
|
@@ -359,95 +306,70 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
359
306
|
compressLayout: compress
|
|
360
307
|
});
|
|
361
308
|
}
|
|
362
|
-
|
|
363
309
|
async deleteSession() {
|
|
364
310
|
var _this$adb5;
|
|
365
|
-
|
|
366
311
|
this.log.debug('Shutting down Android driver');
|
|
367
|
-
|
|
368
312
|
try {
|
|
369
313
|
if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
|
|
370
314
|
await this.stopRecordingScreen();
|
|
371
315
|
}
|
|
372
316
|
} catch (ign) {}
|
|
373
|
-
|
|
374
317
|
await _androidHelpers.helpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);
|
|
375
318
|
await this.mobileStopScreenStreaming();
|
|
376
319
|
await super.deleteSession();
|
|
377
|
-
|
|
378
320
|
if (this.bootstrap) {
|
|
379
321
|
var _this$adb3;
|
|
380
|
-
|
|
381
322
|
await this.stopChromedriverProxies();
|
|
382
|
-
|
|
383
323
|
if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
|
|
384
324
|
var _this$adb;
|
|
385
|
-
|
|
386
325
|
this.log.debug(`Resetting IME to ${this.defaultIME}`);
|
|
387
326
|
await ((_this$adb = this.adb) === null || _this$adb === void 0 ? void 0 : _this$adb.setIME(this.defaultIME));
|
|
388
327
|
}
|
|
389
|
-
|
|
390
328
|
if (!this.isChromeSession && !this.opts.dontStopAppOnReset) {
|
|
391
329
|
var _this$adb2;
|
|
392
|
-
|
|
393
330
|
await ((_this$adb2 = this.adb) === null || _this$adb2 === void 0 ? void 0 : _this$adb2.forceStop(this.opts.appPackage));
|
|
394
331
|
}
|
|
395
|
-
|
|
396
332
|
await ((_this$adb3 = this.adb) === null || _this$adb3 === void 0 ? void 0 : _this$adb3.goToHome());
|
|
397
|
-
|
|
398
333
|
if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {
|
|
399
334
|
var _this$adb4;
|
|
400
|
-
|
|
401
335
|
await ((_this$adb4 = this.adb) === null || _this$adb4 === void 0 ? void 0 : _this$adb4.uninstallApk(this.opts.appPackage));
|
|
402
336
|
}
|
|
403
|
-
|
|
404
337
|
await this.bootstrap.shutdown();
|
|
405
338
|
this.bootstrap = null;
|
|
406
339
|
} else {
|
|
407
340
|
this.log.debug("Called deleteSession but bootstrap wasn't active");
|
|
408
341
|
}
|
|
409
|
-
|
|
410
342
|
await ((_this$adb5 = this.adb) === null || _this$adb5 === void 0 ? void 0 : _this$adb5.stopLogcat());
|
|
411
|
-
|
|
412
343
|
if (this.useUnlockHelperApp) {
|
|
413
344
|
var _this$adb6;
|
|
414
|
-
|
|
415
345
|
await ((_this$adb6 = this.adb) === null || _this$adb6 === void 0 ? void 0 : _this$adb6.forceStop('io.appium.unlock'));
|
|
416
346
|
}
|
|
417
|
-
|
|
418
347
|
if (this._wasWindowAnimationDisabled) {
|
|
419
348
|
var _this$adb7, _this$adb8;
|
|
420
|
-
|
|
421
349
|
this.log.info('Restoring window animation state');
|
|
422
350
|
await ((_this$adb7 = this.adb) === null || _this$adb7 === void 0 ? void 0 : _this$adb7.setAnimationState(true));
|
|
423
351
|
|
|
424
352
|
if ((await ((_this$adb8 = this.adb) === null || _this$adb8 === void 0 ? void 0 : _this$adb8.getApiLevel())) >= 28) {
|
|
425
353
|
var _this$adb9;
|
|
426
|
-
|
|
427
354
|
this.log.info('Restoring hidden api policy to the device default configuration');
|
|
428
355
|
await ((_this$adb9 = this.adb) === null || _this$adb9 === void 0 ? void 0 : _this$adb9.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError));
|
|
429
356
|
}
|
|
430
357
|
}
|
|
431
|
-
|
|
432
358
|
if (this.opts.reboot) {
|
|
433
359
|
var _this$adb10;
|
|
434
|
-
|
|
435
360
|
let avdName = this.opts.avd.replace('@', '');
|
|
436
361
|
this.log.debug(`closing emulator '${avdName}'`);
|
|
437
362
|
await ((_this$adb10 = this.adb) === null || _this$adb10 === void 0 ? void 0 : _this$adb10.killEmulator(avdName));
|
|
438
363
|
}
|
|
439
364
|
}
|
|
440
|
-
|
|
441
365
|
async setSharedPreferences() {
|
|
442
366
|
let sharedPrefs = this.opts.sharedPreferences;
|
|
443
367
|
this.log.info('Trying to set shared preferences');
|
|
444
368
|
let name = sharedPrefs.name;
|
|
445
|
-
|
|
446
369
|
if (_lodash.default.isUndefined(name)) {
|
|
447
370
|
this.log.warn(`Skipping setting Shared preferences, name is undefined: ${JSON.stringify(sharedPrefs)}`);
|
|
448
371
|
return false;
|
|
449
372
|
}
|
|
450
|
-
|
|
451
373
|
let remotePath = `/data/data/${this.opts.appPackage}/shared_prefs`;
|
|
452
374
|
let remoteFile = `${remotePath}/${name}.xml`;
|
|
453
375
|
let localPath = `/tmp/${name}.xml`;
|
|
@@ -459,54 +381,43 @@ class AndroidDriver extends _driver.BaseDriver {
|
|
|
459
381
|
await this.adb.shell(['mkdir', '-p', remotePath]);
|
|
460
382
|
this.log.info(`Pushing shared_prefs to ${remoteFile}`);
|
|
461
383
|
await this.adb.push(localPath, remoteFile);
|
|
462
|
-
|
|
463
384
|
try {
|
|
464
385
|
this.log.info(`Trying to remove shared preferences temporary file`);
|
|
465
|
-
|
|
466
386
|
if (await _support.fs.exists(localPath)) {
|
|
467
387
|
await _support.fs.unlink(localPath);
|
|
468
388
|
}
|
|
469
389
|
} catch (e) {
|
|
470
390
|
this.log.warn(`Error trying to remove temporary file ${localPath}`);
|
|
471
391
|
}
|
|
472
|
-
|
|
473
392
|
return true;
|
|
474
393
|
}
|
|
475
|
-
|
|
476
394
|
getPrefsBuilder() {
|
|
477
395
|
return new _sharedPreferencesBuilder.SharedPrefsBuilder();
|
|
478
396
|
}
|
|
479
|
-
|
|
480
397
|
validateDesiredCaps(caps) {
|
|
481
398
|
if (!super.validateDesiredCaps(caps)) {
|
|
482
399
|
return false;
|
|
483
400
|
}
|
|
484
|
-
|
|
485
401
|
if ((!caps.browserName || !_androidHelpers.helpers.isChromeBrowser(caps.browserName)) && !caps.app && !caps.appPackage) {
|
|
486
402
|
this.log.errorAndThrow('The desired capabilities must include either an app, appPackage or browserName');
|
|
487
403
|
}
|
|
488
|
-
|
|
489
404
|
return _androidHelpers.helpers.validateDesiredCaps(caps);
|
|
490
405
|
}
|
|
491
|
-
|
|
492
406
|
proxyActive(sessionId) {
|
|
493
407
|
super.proxyActive(sessionId);
|
|
494
408
|
return this.jwpProxyActive;
|
|
495
409
|
}
|
|
496
|
-
|
|
497
410
|
getProxyAvoidList(sessionId) {
|
|
498
411
|
super.getProxyAvoidList(sessionId);
|
|
499
412
|
return this.jwpProxyAvoid;
|
|
500
413
|
}
|
|
501
|
-
|
|
502
414
|
canProxy(sessionId) {
|
|
503
415
|
super.canProxy(sessionId);
|
|
416
|
+
|
|
504
417
|
return _lodash.default.isFunction(this.proxyReqRes);
|
|
505
418
|
}
|
|
506
|
-
|
|
507
419
|
}
|
|
508
|
-
|
|
509
420
|
exports.AndroidDriver = AndroidDriver;
|
|
510
421
|
var _default = AndroidDriver;
|
|
511
422
|
exports.default = _default;
|
|
512
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2hhcmVkUHJlZnNCdWlsZGVyIH0gZnJvbSAnc2hhcmVkLXByZWZlcmVuY2VzLWJ1aWxkZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgREVWSUNFX1BPUlQgPSA0NzI0O1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0b1xuLy8gQ2hyb21lZHJpdmVyXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuXTtcblxuY2xhc3MgQW5kcm9pZERyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENvbnN0cmFpbnRzO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5jbG9uZShOT19QUk9YWSk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTtcbiAgICB0aGlzLnVubG9ja2VyID0gaGVscGVycy51bmxvY2tlcjtcblxuICAgIGZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuXG4gICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGxpbmUgd2hpY2ggYXNzaWducyBjb21tYW5kcyB0byBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZSwgc28gdGhhdCBgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWVgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICAvLyB0aGUgd2hvbGUgY3JlYXRlU2Vzc2lvbiBmbG93IGlzIHN1cnJvdW5kZWQgaW4gYSB0cnktY2F0Y2ggc3RhdGVtZW50XG4gICAgLy8gaWYgY3JlYXRpbmcgYSBzZXNzaW9uIGZhaWxzIGF0IGFueSBwb2ludCwgd2UgdGVhcmRvd24gZXZlcnl0aGluZyB3ZVxuICAgIC8vIHNldCB1cCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGRlZmF1bHRzXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiAnMHgxMDIwMDAwMCcsXG4gICAgICAgIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnM6IGZhbHNlLFxuICAgICAgICB0bXBEaXI6IGF3YWl0IHRlbXBEaXIuc3RhdGljRGlyKCksXG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGJvb3RzdHJhcFBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwLFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG4gICAgICB0aGlzLnVzZVVubG9ja0hlbHBlckFwcCA9IF8uaXNVbmRlZmluZWQodGhpcy5jYXBzLnVubG9ja1R5cGUpO1xuXG4gICAgICAvLyBub3QgdXNlciB2aXNpYmxlIHZpYSBjYXBzXG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBoZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5qd3BQcm94eUF2b2lkLnB1c2goWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgICAvLyBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgQURCXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQURCKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIGVtUG9ydDogdGhpcy5vcHRzLmVtUG9ydCxcbiAgICAgICAgYWRiUG9ydDogdGhpcy5vcHRzLmFkYlBvcnQsXG4gICAgICAgIHN1cHByZXNzS2lsbFNlcnZlcjogdGhpcy5vcHRzLnN1cHByZXNzS2lsbFNlcnZlcixcbiAgICAgICAgcmVtb3RlQWRiSG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QsXG4gICAgICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHRoaXMub3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgICAgICBhZGJFeGVjVGltZW91dDogdGhpcy5vcHRzLmFkYkV4ZWNUaW1lb3V0LFxuICAgICAgICBhbGxvd09mZmxpbmVEZXZpY2VzOiB0aGlzLm9wdHMuYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uc2lkZXIgc2V0dGluZyAnYXV0b21hdGlvbk5hbWUnIGNhcGFiaWxpdHkgdG8gXCIgK1xuICAgICAgICAgIFwiJ3VpYXV0b21hdG9yMicgb24gQW5kcm9pZCA+PSA2LCBzaW5jZSBVSUF1dG9tYXRvciBmcmFtZXdvcmsgXCIgK1xuICAgICAgICAgICdpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlIGJ5IHRoZSBPUyB2ZW5kb3IuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBwYWNrYWdlIGluc3RlYWQgb2YgYXBwIGZvciAnYXBwJyBjYXBhYmlsaXR5LCBtYXNzYWdlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwO1xuICAgICAgICB0aGlzLm9wdHMuYXBwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBBUFBfRVhURU5TSU9OKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnksIG5ldHdvcmtTcGVlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrU3BlZWQgPSBlbnN1cmVOZXR3b3JrU3BlZWQodGhpcy5hZGIsIHRoaXMub3B0cy5uZXR3b3JrU3BlZWQpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgQW5kcm9pZCBzZXNzaW9uYCk7XG4gICAgLy8gc2V0IHVwIHRoZSBkZXZpY2UgdG8gcnVuIG9uIChyZWFsIG9yIGVtdWxhdG9yLCBldGMpXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlscy5cbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IGF3YWl0IHRoaXMuYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IGF3YWl0IHRoaXMuYWRiLmdldE1vZGVsKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IGF3YWl0IHRoaXMuYWRiLmdldE1hbnVmYWN0dXJlcigpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFQSSBsZXZlbCAyOCBpcyBBbmRyb2lkIFBcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gcmVzZXQgdGhlIHJlbGF4aW5nIGluIGRlbGV0ZSBzZXNzaW9uXG4gICAgICAgICAgdGhpcy5sb2cud2FybignUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFuaW1hdGlvbiBzY2FsZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBzdGFydCBVaUF1dG9tYXRvclxuICAgIHRoaXMuYm9vdHN0cmFwID0gbmV3IGhlbHBlcnMuYm9vdHN0cmFwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYm9vdHN0cmFwUG9ydCwgdGhpcy5vcHRzLndlYnNvY2tldCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICAgIC8vIGhhbmRsaW5nIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAub25VbmV4cGVjdGVkU2h1dGRvd247XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyBMZXQncyB0cnkgdG8gdW5sb2NrIHRoZSBkZXZpY2VcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBdXRvV2VidmlldygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdEF1dG9XZWJ2aWV3ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBsZXQgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgbGV0IHRpbWVvdXQgPSAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCkgfHwgMjAwMDtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgQVBQX0VYVEVOU0lPTikpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbGwgYXBwXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICR7dGhpcy5vcHRzLmFwcH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja1BhY2thZ2VQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IG9uIHRoZSBkZXZpY2VgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlXG4gIGFzeW5jIHNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgKGNvbXByZXNzKSB7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignY29tcHJlc3NlZExheW91dEhpZXJhcmNoeScsIHtjb21wcmVzc0xheW91dDogY29tcHJlc3N9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdTaHV0dGluZyBkb3duIEFuZHJvaWQgZHJpdmVyJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuXG4gICAgYXdhaXQgaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuXG4gICAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgICAvLyBjZXJ0YWluIGNsZWFudXAgd2Ugb25seSBjYXJlIHRvIGRvIGlmIHRoZSBib290c3RyYXAgd2FzIGV2ZXIgcnVuXG4gICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8udW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYj8uc3RvcExvZ2NhdCgpO1xuICAgIGlmICh0aGlzLnVzZVVubG9ja0hlbHBlckFwcCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCgnaW8uYXBwaXVtLnVubG9jaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyB3aW5kb3cgYW5pbWF0aW9uIHN0YXRlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYj8uZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxNQUF0QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxJQUFwQjtBQUlBLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBRCxFQUFTLElBQUlDLE1BQUosQ0FBVyx5QkFBWCxDQUFULENBRGUsRUFFZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQUZlLEVBR2YsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHdCQUFYLENBQVQsQ0FIZSxFQUlmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyx3QkFBWCxDQUFSLENBSmUsRUFLZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQUxlLEVBTWYsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHFDQUFYLENBQVQsQ0FOZSxFQU9mLENBQUMsTUFBRCxFQUFTLElBQUlBLE1BQUosQ0FBVyw2QkFBWCxDQUFULENBUGUsRUFRZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENB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
|
|
423
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2hhcmVkUHJlZnNCdWlsZGVyIH0gZnJvbSAnc2hhcmVkLXByZWZlcmVuY2VzLWJ1aWxkZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgREVWSUNFX1BPUlQgPSA0NzI0O1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0b1xuLy8gQ2hyb21lZHJpdmVyXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuXTtcblxuY2xhc3MgQW5kcm9pZERyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENvbnN0cmFpbnRzO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5jbG9uZShOT19QUk9YWSk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTtcbiAgICB0aGlzLnVubG9ja2VyID0gaGVscGVycy51bmxvY2tlcjtcblxuICAgIGZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuXG4gICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGxpbmUgd2hpY2ggYXNzaWducyBjb21tYW5kcyB0byBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZSwgc28gdGhhdCBgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWVgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICAvLyB0aGUgd2hvbGUgY3JlYXRlU2Vzc2lvbiBmbG93IGlzIHN1cnJvdW5kZWQgaW4gYSB0cnktY2F0Y2ggc3RhdGVtZW50XG4gICAgLy8gaWYgY3JlYXRpbmcgYSBzZXNzaW9uIGZhaWxzIGF0IGFueSBwb2ludCwgd2UgdGVhcmRvd24gZXZlcnl0aGluZyB3ZVxuICAgIC8vIHNldCB1cCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGRlZmF1bHRzXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiAnMHgxMDIwMDAwMCcsXG4gICAgICAgIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnM6IGZhbHNlLFxuICAgICAgICB0bXBEaXI6IGF3YWl0IHRlbXBEaXIuc3RhdGljRGlyKCksXG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGJvb3RzdHJhcFBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwLFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG4gICAgICB0aGlzLnVzZVVubG9ja0hlbHBlckFwcCA9IF8uaXNVbmRlZmluZWQodGhpcy5jYXBzLnVubG9ja1R5cGUpO1xuXG4gICAgICAvLyBub3QgdXNlciB2aXNpYmxlIHZpYSBjYXBzXG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBoZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5qd3BQcm94eUF2b2lkLnB1c2goWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgICAvLyBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgQURCXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQURCKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIGVtUG9ydDogdGhpcy5vcHRzLmVtUG9ydCxcbiAgICAgICAgYWRiUG9ydDogdGhpcy5vcHRzLmFkYlBvcnQsXG4gICAgICAgIHN1cHByZXNzS2lsbFNlcnZlcjogdGhpcy5vcHRzLnN1cHByZXNzS2lsbFNlcnZlcixcbiAgICAgICAgcmVtb3RlQWRiSG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QsXG4gICAgICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHRoaXMub3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgICAgICBhZGJFeGVjVGltZW91dDogdGhpcy5vcHRzLmFkYkV4ZWNUaW1lb3V0LFxuICAgICAgICBhbGxvd09mZmxpbmVEZXZpY2VzOiB0aGlzLm9wdHMuYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uc2lkZXIgc2V0dGluZyAnYXV0b21hdGlvbk5hbWUnIGNhcGFiaWxpdHkgdG8gXCIgK1xuICAgICAgICAgIFwiJ3VpYXV0b21hdG9yMicgb24gQW5kcm9pZCA+PSA2LCBzaW5jZSBVSUF1dG9tYXRvciBmcmFtZXdvcmsgXCIgK1xuICAgICAgICAgICdpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlIGJ5IHRoZSBPUyB2ZW5kb3IuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBwYWNrYWdlIGluc3RlYWQgb2YgYXBwIGZvciAnYXBwJyBjYXBhYmlsaXR5LCBtYXNzYWdlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwO1xuICAgICAgICB0aGlzLm9wdHMuYXBwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBBUFBfRVhURU5TSU9OKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnksIG5ldHdvcmtTcGVlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrU3BlZWQgPSBlbnN1cmVOZXR3b3JrU3BlZWQodGhpcy5hZGIsIHRoaXMub3B0cy5uZXR3b3JrU3BlZWQpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgQW5kcm9pZCBzZXNzaW9uYCk7XG4gICAgLy8gc2V0IHVwIHRoZSBkZXZpY2UgdG8gcnVuIG9uIChyZWFsIG9yIGVtdWxhdG9yLCBldGMpXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlscy5cbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IGF3YWl0IHRoaXMuYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IGF3YWl0IHRoaXMuYWRiLmdldE1vZGVsKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IGF3YWl0IHRoaXMuYWRiLmdldE1hbnVmYWN0dXJlcigpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFQSSBsZXZlbCAyOCBpcyBBbmRyb2lkIFBcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gcmVzZXQgdGhlIHJlbGF4aW5nIGluIGRlbGV0ZSBzZXNzaW9uXG4gICAgICAgICAgdGhpcy5sb2cud2FybignUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFuaW1hdGlvbiBzY2FsZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBzdGFydCBVaUF1dG9tYXRvclxuICAgIHRoaXMuYm9vdHN0cmFwID0gbmV3IGhlbHBlcnMuYm9vdHN0cmFwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYm9vdHN0cmFwUG9ydCwgdGhpcy5vcHRzLndlYnNvY2tldCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICAgIC8vIGhhbmRsaW5nIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAub25VbmV4cGVjdGVkU2h1dGRvd247XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyBMZXQncyB0cnkgdG8gdW5sb2NrIHRoZSBkZXZpY2VcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBdXRvV2VidmlldygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdEF1dG9XZWJ2aWV3ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBsZXQgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgbGV0IHRpbWVvdXQgPSAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCkgfHwgMjAwMDtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgQVBQX0VYVEVOU0lPTikpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbGwgYXBwXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICR7dGhpcy5vcHRzLmFwcH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja1BhY2thZ2VQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IG9uIHRoZSBkZXZpY2VgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlXG4gIGFzeW5jIHNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgKGNvbXByZXNzKSB7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignY29tcHJlc3NlZExheW91dEhpZXJhcmNoeScsIHtjb21wcmVzc0xheW91dDogY29tcHJlc3N9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdTaHV0dGluZyBkb3duIEFuZHJvaWQgZHJpdmVyJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuXG4gICAgYXdhaXQgaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuXG4gICAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgICAvLyBjZXJ0YWluIGNsZWFudXAgd2Ugb25seSBjYXJlIHRvIGRvIGlmIHRoZSBib290c3RyYXAgd2FzIGV2ZXIgcnVuXG4gICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8udW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYj8uc3RvcExvZ2NhdCgpO1xuICAgIGlmICh0aGlzLnVzZVVubG9ja0hlbHBlckFwcCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCgnaW8uYXBwaXVtLnVubG9jaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyB3aW5kb3cgYW5pbWF0aW9uIHN0YXRlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYj8uZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsV0FBVyxHQUFHLElBQUk7O0FBSXhCLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBTSxFQUFFLElBQUlDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzdDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzNELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0s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
|