appium-espresso-driver 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/lib/driver.js
CHANGED
|
@@ -11,6 +11,8 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
+
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
|
|
14
16
|
var _baseDriver = require("@appium/base-driver");
|
|
15
17
|
|
|
16
18
|
var _espressoRunner = require("./espresso-runner");
|
|
@@ -40,6 +42,9 @@ const SYSTEM_PORT_RANGE = [8300, 8399];
|
|
|
40
42
|
const DEVICE_PORT = 6791;
|
|
41
43
|
const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')], ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')], ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')], ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')], ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')], ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')], ['GET', new RegExp('^/session/[^/]+/appium/settings')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/contexts')], ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['GET', new RegExp('^/session/[^/]+/timeouts')], ['GET', new RegExp('^/session/[^/]+/url')], ['POST', new RegExp('^/session/[^/]+/appium/app/background')], ['POST', new RegExp('^/session/[^/]+/appium/app/close')], ['POST', new RegExp('^/session/[^/]+/appium/app/launch')], ['POST', new RegExp('^/session/[^/]+/appium/app/reset')], ['POST', new RegExp('^/session/[^/]+/appium/app/strings')], ['POST', new RegExp('^/session/[^/]+/appium/compare_images')], ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')], ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')], ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')], ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')], ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')], ['POST', new RegExp('^/session/[^/]+/appium/device/lock')], ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')], ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')], ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')], ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')], ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')], ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')], ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')], ['POST', new RegExp('^/session/[^/]+/appium/settings')], ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')], ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/async')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['POST', new RegExp('^/session/[^/]+/execute_async')], ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')], ['POST', new RegExp('^/session/[^/]+/location')], ['POST', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/timeouts')], ['POST', new RegExp('^/session/[^/]+/url')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['POST', new RegExp('^/session/[^/]+/log')], ['GET', new RegExp('^/session/[^/]+/se/log/types')], ['POST', new RegExp('^/session/[^/]+/se/log')]];
|
|
42
44
|
const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/execute$')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['POST', new RegExp('^/session/[^/]+/log')], ['GET', new RegExp('^/session/[^/]+/se/log/types')], ['POST', new RegExp('^/session/[^/]+/se/log')]];
|
|
45
|
+
const APK_EXT = '.apk';
|
|
46
|
+
const AAB_EXT = '.aab';
|
|
47
|
+
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
43
48
|
|
|
44
49
|
class EspressoDriver extends _baseDriver.BaseDriver {
|
|
45
50
|
constructor(opts = {}, shouldValidateCaps = true) {
|
|
@@ -110,7 +115,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
110
115
|
if (this.opts.app) {
|
|
111
116
|
this.opts.app = await this.helpers.configureApp(this.opts.app, {
|
|
112
117
|
onPostProcess: this.onPostConfigureApp.bind(this),
|
|
113
|
-
supportedExtensions:
|
|
118
|
+
supportedExtensions: SUPPORTED_EXTENSIONS
|
|
114
119
|
});
|
|
115
120
|
} else if (this.appOnDevice) {
|
|
116
121
|
_logger.default.info(`App file was not listed, instead we're going to run ` + `${this.opts.appPackage} directly on the device`);
|
|
@@ -136,6 +141,30 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
136
141
|
}
|
|
137
142
|
}
|
|
138
143
|
|
|
144
|
+
async unzipApp(appPath) {
|
|
145
|
+
const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
|
|
146
|
+
const useSystemUnzip = _lodash.default.isEmpty(useSystemUnzipEnv) || !['0', 'false'].includes(_lodash.default.toLower(useSystemUnzipEnv));
|
|
147
|
+
const tmpRoot = await _support.tempDir.openDir();
|
|
148
|
+
await _support.zip.extractAllTo(appPath, tmpRoot, {
|
|
149
|
+
useSystemUnzip
|
|
150
|
+
});
|
|
151
|
+
const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map(ext => ext.replace(/^\./, '')).join('|')})`;
|
|
152
|
+
const sortedBundleItems = (await _support.fs.glob(globPattern, {
|
|
153
|
+
cwd: tmpRoot,
|
|
154
|
+
strict: false
|
|
155
|
+
})).sort((a, b) => a.split(_path.default.sep).length - b.split(_path.default.sep).length);
|
|
156
|
+
|
|
157
|
+
if (sortedBundleItems.length === 0) {
|
|
158
|
+
_logger.default.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` + `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const unzippedAppPath = _path.default.join(tmpRoot, _lodash.default.first(sortedBundleItems));
|
|
162
|
+
|
|
163
|
+
_logger.default.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
|
|
164
|
+
|
|
165
|
+
return unzippedAppPath;
|
|
166
|
+
}
|
|
167
|
+
|
|
139
168
|
async onPostConfigureApp({
|
|
140
169
|
cachedAppInfo,
|
|
141
170
|
isUrl,
|
|
@@ -149,9 +178,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
149
178
|
}
|
|
150
179
|
};
|
|
151
180
|
|
|
152
|
-
const
|
|
181
|
+
const hasApkExt = appPath => _lodash.default.endsWith(_lodash.default.toLower(appPath), APK_EXT);
|
|
182
|
+
|
|
183
|
+
const hasAabExt = appPath => _lodash.default.endsWith(_lodash.default.toLower(appPath), AAB_EXT);
|
|
184
|
+
|
|
185
|
+
const extractUniversalApk = async (shouldExtract, appPath) => shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);
|
|
153
186
|
|
|
154
|
-
const shouldResultAppPathBeCached = !isApk || isApk && isUrl;
|
|
155
187
|
let pathInCache = null;
|
|
156
188
|
let isResultAppPathAlreadyCached = false;
|
|
157
189
|
|
|
@@ -159,19 +191,36 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
159
191
|
const packageHash = await _support.fs.hash(appPath);
|
|
160
192
|
|
|
161
193
|
if (packageHash === cachedAppInfo.packageHash && (await _support.fs.exists(cachedAppInfo.fullPath))) {
|
|
194
|
+
_logger.default.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
|
|
195
|
+
|
|
162
196
|
isResultAppPathAlreadyCached = true;
|
|
163
197
|
pathInCache = cachedAppInfo.fullPath;
|
|
164
198
|
}
|
|
165
199
|
}
|
|
166
200
|
|
|
201
|
+
const isApk = hasApkExt(appPath);
|
|
202
|
+
const shouldResultAppPathBeCached = !isApk || isApk && isUrl;
|
|
203
|
+
|
|
167
204
|
if (!isResultAppPathAlreadyCached) {
|
|
168
205
|
if (shouldResultAppPathBeCached) {
|
|
169
|
-
|
|
206
|
+
let unzippedAppPath;
|
|
207
|
+
let isUnzippedApk = false;
|
|
208
|
+
|
|
209
|
+
if (!(hasApkExt(appPath) || hasAabExt(appPath))) {
|
|
210
|
+
unzippedAppPath = await this.unzipApp(appPath);
|
|
211
|
+
isUnzippedApk = hasApkExt(unzippedAppPath);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
pathInCache = unzippedAppPath ? await extractUniversalApk(isUnzippedApk, unzippedAppPath) : await extractUniversalApk(isApk, appPath);
|
|
170
215
|
|
|
171
216
|
if (!isApk && isUrl) {
|
|
172
217
|
await _support.fs.rimraf(appPath);
|
|
173
218
|
}
|
|
174
219
|
|
|
220
|
+
if (hasAabExt(unzippedAppPath)) {
|
|
221
|
+
await _support.fs.rimraf(unzippedAppPath);
|
|
222
|
+
}
|
|
223
|
+
|
|
175
224
|
await presignApp(pathInCache);
|
|
176
225
|
} else if (isApk) {
|
|
177
226
|
await presignApp(appPath);
|
|
@@ -512,4 +561,4 @@ var _default = EspressoDriver;
|
|
|
512
561
|
exports.default = _default;require('source-map-support').install();
|
|
513
562
|
|
|
514
563
|
|
|
515
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiXyIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwiYXBwIiwibG9nZ2VyIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYWRkV2lwZURhdGFUb0F2ZEFyZ3MiLCJzeXN0ZW1Qb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsImNvbmZpZ3VyZUFwcCIsIm9uUG9zdFByb2Nlc3MiLCJvblBvc3RDb25maWd1cmVBcHAiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiYXBwUGFja2FnZSIsImlzQXBwSW5zdGFsbGVkIiwic3RhcnRFc3ByZXNzb1Nlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsIm1lc3NhZ2UiLCJlbmRzV2l0aCIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJlcnIiLCJzdGFjayIsImNhY2hlZEFwcEluZm8iLCJpc1VybCIsImFwcFBhdGgiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaXNBcGsiLCJ0b0xvd2VyIiwic2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkIiwicGF0aEluQ2FjaGUiLCJpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkIiwiaXNQbGFpbk9iamVjdCIsInBhY2thZ2VIYXNoIiwiZnMiLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJleHRyYWN0VW5pdmVyc2FsQXBrIiwicmltcmFmIiwiZHJpdmVyRGF0YSIsImlzRW11bGF0b3IiLCJhdmQiLCJkZXZpY2VOYW1lIiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImF2ZEFyZ3MiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwidmVyc2lvbiIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJhcHBJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsImluaXREZXZpY2UiLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJ3YXNBbmltYXRpb25FbmFibGVkIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdEVzcHJlc3NvU2VydmVyIiwiZGVidWciLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwiaWduIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJ1bmRlZmluZWQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImVycm9yIiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwiaXNOaWwiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJpc1BhY2thZ2VPckJ1bmRsZSIsImNtZCIsImZuIiwidG9QYWlycyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLE9BQU8sR0FBR0MsbUNBQWhCO0FBSUEsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUExQjtBQUlBLE1BQU1DLFdBQVcsR0FBRyxJQUFwQjtBQU1BLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBRCxFQUFRLElBQUlDLE1BQUosQ0FBVyxtQkFBWCxDQUFSLENBRGUsRUFFZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsZ0RBQVgsQ0FBUixDQUZlLEVBR2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FIZSxFQUlmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywrQ0FBWCxDQUFSLENBSmUsRUFLZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsaURBQVgsQ0FBUixDQUxlLEVBTWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FOZSxFQU9mLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywyQ0FBWCxDQUFSLENBUGUsRUFRZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBUixDQVJlLEVBU2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLHlCQUFYLENBQVIsQ0FUZSxFQVVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywwQkFBWCxDQUFSLENBVmUsRUFXZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBUixDQVhlLEVBWWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLG9DQUFYLENBQVIsQ0FaZSxFQWFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywwQkFBWCxDQUFSLENBYmUsRUFjZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcscUJBQVgsQ0FBUixDQWRlLEVBZWYsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHVDQUFYLENBQVQsQ0FmZSxFQWdCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsa0NBQVgsQ0FBVCxDQWhCZSxFQWlCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsbUNBQVgsQ0FBVCxDQWpCZSxFQWtCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsa0NBQVgsQ0FBVCxDQWxCZSxFQW1CZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQW5CZSxFQW9CZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXBCZSxFQXFCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQXJCZSxFQXNCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQXRCZSxFQXVCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQXZCZSxFQXdCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQXhCZSxFQXlCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQXpCZSxFQTBCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQTFCZSxFQTJCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQTNCZSxFQTRCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQTVCZSxFQTZCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQTdCZSxFQThCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQTlCZSxFQStCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQS9CZSxFQWdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMENBQVgsQ0FBVCxDQWhDZSxFQWlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQWpDZSxFQWtDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQWxDZSxFQW1DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0NBQVgsQ0FBVCxDQW5DZSxFQW9DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQXBDZSxFQXFDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXJDZSxFQXNDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBVCxDQXRDZSxFQXVDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXZDZSxFQXdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBVCxDQXhDZSxFQXlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXpDZSxFQTBDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTFDZSxFQTJDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTNDZSxFQTRDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQTVDZSxFQTZDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOEJBQVgsQ0FBVCxDQTdDZSxFQThDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQTlDZSxFQStDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBVCxDQS9DZSxFQWdEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQWhEZSxFQWlEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQWpEZSxFQWtEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQWxEZSxFQW1EZixDQUFDLE1B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Q3pDeE4sRUFBQUEsY0FBYyxDQUFDdU4sU0FBZixDQUF5QkgsR0FBekIsSUFBZ0NDLEVBQWhDO0FBQ0Q7O2VBR2NyTixjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIGVycm9ycywgaXNFcnJvclR5cGUsIERldmljZVNldHRpbmdzfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IEVzcHJlc3NvUnVubmVyLCBURVNUX0FQS19QS0cgfSBmcm9tICcuL2VzcHJlc3NvLXJ1bm5lcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8vIFRPRE8gbWVyZ2Ugb3VyIG93biBoZWxwZXJzIG9udG8gdGhpcyBsYXRlclxuY29uc3QgaGVscGVycyA9IGFuZHJvaWRIZWxwZXJzO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gRXNwcmVzc28gSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgU1lTVEVNX1BPUlRfUkFOR0UgPSBbODMwMCwgODM5OV07XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgZXNwcmVzc28gc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbFxuLy8gZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTE7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19rZXlib2FyZF9zaG93bicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFycycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fdGltZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2JhY2tncm91bmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2Nsb3NlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9sYXVuY2gnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3Jlc2V0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9zdHJpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hY3RpdmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9zdGF0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pbnN0YWxsX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3JlbW92ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS91bmxvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuXG5jbGFzcyBFc3ByZXNzb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYCdicm93c2VyTmFtZScgY2FwYWJpbGl0eSB3aWxsIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgICBsb2dnZXIud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFsnLmFwaycsICcuYWFiJ11cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIGxvZ2dlci5pbmZvKGBBcHAgZmlsZSB3YXMgbm90IGxpc3RlZCwgaW5zdGVhZCB3ZSdyZSBnb2luZyB0byBydW4gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCB0aGUgcGFja2FnZSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgYGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zdGFydEVzcHJlc3NvU2Vzc2lvbigpO1xuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIGNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgZS5tZXNzYWdlICs9IGAke18uZW5kc1dpdGgoZS5tZXNzYWdlLCAnLicpID8gJycgOiAnLid9IENoZWNrIGAgK1xuICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyI3Ryb3VibGVzaG9vdGluZyAnICtcbiAgICAgICAgJ3JlZ2FyZGluZyBhZHZhbmNlZCBzZXNzaW9uIHN0YXJ0dXAgdHJvdWJsZXNob290aW5nLic7XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZSwgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnIgPSBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIGVyci5zdGFjayA9IGUuc3RhY2s7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25Qb3N0Q29uZmlndXJlQXBwICh7Y2FjaGVkQXBwSW5mbywgaXNVcmwsIGFwcFBhdGh9KSB7XG4gICAgY29uc3QgcHJlc2lnbkFwcCA9IGFzeW5jIChhcHBMb2NhdGlvbikgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1NpZ24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NraXBwaW5nIGFwcGxpY2F0aW9uIHNpZ25pbmcgYmVjYXVzZSBub1NpZ24gY2FwYWJpbGl0eSBpcyBzZXQgdG8gdHJ1ZS4gJyArXG4gICAgICAgICAgJ0hhdmluZyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB3aXRoIGltcHJvcGVyIHNpZ25hdHVyZS9ub24tc2lnbmVkIHdpbGwgY2F1c2UgJyArXG4gICAgICAgICAgJ0VzcHJlc3NvIGF1dG9tYXRpb24gc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfSBlbHNlIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbihhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBpc0FwayA9IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCAnLmFwaycpO1xuICAgIC8vIERvIG5vdCBjYWNoZSAuYXBrIGlmIHdhcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAgY29uc3Qgc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkID0gIWlzQXBrIHx8IChpc0FwayAmJiBpc1VybCk7XG4gICAgbGV0IHBhdGhJbkNhY2hlID0gbnVsbDtcbiAgICBsZXQgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IGZhbHNlO1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mby5wYWNrYWdlSGFzaCAmJiBhd2FpdCBmcy5leGlzdHMoY2FjaGVkQXBwSW5mby5mdWxsUGF0aCkpIHtcbiAgICAgICAgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IHRydWU7XG4gICAgICAgIHBhdGhJbkNhY2hlID0gY2FjaGVkQXBwSW5mby5mdWxsUGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkKSB7XG4gICAgICBpZiAoc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkKSB7XG4gICAgICAgIHBhdGhJbkNhY2hlID0gaXNBcGsgPyBhcHBQYXRoIDogYXdhaXQgdGhpcy5hZGIuZXh0cmFjdFVuaXZlcnNhbEFwayhhcHBQYXRoKTtcbiAgICAgICAgaWYgKCFpc0FwayAmJiBpc1VybCkge1xuICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSB0ZW1wb3JhcmlseSBkb3dubG9hZGVkIC5hYWIgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGxvZ2dlci5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG5cbiAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWFuZHJvaWQtZHJpdmVyL3B1bGwvNDYxIHdoYXQgaGFwcGVucyBpZiB0aGVyIGlzIG5vIHNldEhpZGRlbkFwaVBvbGljeSBmb3IgQW5kcm9pZCBQK1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHR1cm4gb2ZmIGFuaW1hdGlvbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZFxuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgZXNwcmVzc28gc2VydmVyIGV0Y1xuICAgIHRoaXMuaW5pdEVzcHJlc3NvU2VydmVyKCk7XG4gICAgLy8gRnVydGhlciBwcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgZXNwcmVzc28gcG9ydFxuICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBFc3ByZXNzbyBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byAke3RoaXMub3B0cy5zeXN0ZW1Qb3J0fWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0LCBERVZJQ0VfUE9SVCk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYE5vdCB3YWl0aW5nIGZvciB0aGUgYXBwbGljYXRpb24gYWN0aXZpdHkgdG8gc3RhcnQgYmVjYXVzZSAnYXV0b0xhdW5jaCcgaXMgZGlzYWJsZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvckFjdGl2aXR5KHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSwgdGhpcy5jYXBzLmFwcFdhaXRBY3Rpdml0eSwgdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbik7XG4gICAgfVxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgYXdhaXQgdGhpcy5pbml0V2VidmlldygpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIGVzcHJlc3NvXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRXZWJ2aWV3ICgpIHtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGFuZHJvaWRDb21tYW5kcy5kZWZhdWx0V2Vidmlld05hbWUuY2FsbCh0aGlzKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBpbml0RXNwcmVzc29TZXJ2ZXIgKCkge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyBlc3ByZXNzbyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhXG4gICAgdGhpcy5lc3ByZXNzbyA9IG5ldyBFc3ByZXNzb1J1bm5lcih7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCAnMTI3LjAuMC4xJyxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZm9yY2VFc3ByZXNzb1JlYnVpbGQ6ICEhdGhpcy5vcHRzLmZvcmNlRXNwcmVzc29SZWJ1aWxkLFxuICAgICAgZXNwcmVzc29CdWlsZENvbmZpZzogdGhpcy5vcHRzLmVzcHJlc3NvQnVpbGRDb25maWcsXG4gICAgICBzaG93R3JhZGxlTG9nOiAhIXRoaXMub3B0cy5zaG93R3JhZGxlTG9nLFxuICAgICAgc2VydmVyTGF1bmNoVGltZW91dDogdGhpcy5vcHRzLmVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogdGhpcy5vcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uLFxuICAgICAgdXNlS2V5c3RvcmU6IHRoaXMub3B0cy51c2VLZXlzdG9yZSxcbiAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5vcHRzLmtleXN0b3JlUGF0aCxcbiAgICAgIGtleXN0b3JlUGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgICAga2V5QWxpYXM6IHRoaXMub3B0cy5rZXlBbGlhcyxcbiAgICAgIGtleVBhc3N3b3JkOiB0aGlzLm9wdHMua2V5UGFzc3dvcmQsXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmVzcHJlc3NvLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMuZXNwcmVzc28pO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBzZXQgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSBmcm9tIHRoZSBhcGtcbiAgICAvLyBUT0RPOiBpbmNvcnBvcmF0ZSBjaGFuZ2VzIGZyb20gYXBwaXVtIzUzMDggd2hpY2ggZml4IGEgcmFjZSBjb25kLVxuICAgIC8vIGl0aW9uIGJ1ZyBpbiBvbGQgYXBwaXVtIGFuZCBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgaGVyZVxuICAgIC8vIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MoXG4gICAgLy8gICAgIHRoaXMub3B0cy5sYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFRFU1RfQVBLX1BLR11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24gY2FwYWJpbGl0eSBpcyBzZXQuIE5vdCBpbnN0YWxsaWcgZXNwcmVzc28tc2VydmVyICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmluc3RhbGxUZXN0QXBrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsICYmICF0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSghIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
564
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiQVBLX0VYVCIsIkFBQl9FWFQiLCJTVVBQT1JURURfRVhURU5TSU9OUyIsIkVzcHJlc3NvRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJlc3ByZXNzbyIsImp3cFByb3h5QWN0aXZlIiwiZGVmYXVsdElNRSIsImp3cFByb3h5QXZvaWQiLCJhcGtTdHJpbmdzIiwic2V0dGluZ3MiLCJEZXZpY2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsImNhcHMiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsIk9iamVjdCIsImFzc2lnbiIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsIl8iLCJkZWZhdWx0cyIsImlzQ2hyb21lU2Vzc2lvbiIsImFwcCIsImxvZ2dlciIsIndhcm4iLCJlcnJvckFuZFRocm93IiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsImFkZFdpcGVEYXRhVG9BdmRBcmdzIiwic3lzdGVtUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJzaW9uIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiaW5pdERldmljZSIsImlzQW5pbWF0aW9uT24iLCJzZXRBbmltYXRpb25TdGF0ZSIsIndhc0FuaW1hdGlvbkVuYWJsZWQiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RXNwcmVzc29TZXJ2ZXIiLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJpZ24iLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInVuZGVmaW5lZCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZXJyb3IiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJpc05pbCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImlzUGFja2FnZU9yQnVuZGxlIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUEsTUFBTUEsT0FBTyxHQUFHQyxtQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCO0FBSUEsTUFBTUMsV0FBVyxHQUFHLElBQXBCO0FBTUEsTUFBTUMsUUFBUSxHQUFHLENBQ2YsQ0FBQyxLQUFELEVBQVEsSUFBSUMsTUFBSixDQUFXLG1CQUFYLENBQVIsQ0FEZSxFQUVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxnREFBWCxDQUFSLENBRmUsRUFHZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBUixDQUhlLEVBSWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FKZSxFQUtmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpREFBWCxDQUFSLENBTGUsRUFNZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBUixDQU5lLEVBT2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FQZSxFQVFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpQ0FBWCxDQUFSLENBUmUsRUFTZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQVRlLEVBVWYsQ0FBQyxLQUFELEVBQVEs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QWZrQyxlQUFlLEdBQUk7QUFDckIsV0FBT3ZELE9BQU8sQ0FBQzJQLGVBQVIsQ0FBd0IsS0FBSzlPLElBQUwsQ0FBVStPLFdBQWxDLENBQVA7QUFDRDs7QUFFYyxNQUFYbkwsV0FBVyxHQUFJO0FBQ2pCLFdBQU8sQ0FBQyxLQUFLNUQsSUFBTCxDQUFVMkMsR0FBWCxJQUFrQixLQUFLeEQsT0FBTCxDQUFhNlAsaUJBQWIsQ0FBK0IsS0FBS2hQLElBQUwsQ0FBVThELFVBQXpDLENBQXpCO0FBQ0Q7O0FBeGhCcUM7Ozs7QUE0aEJ4QyxLQUFLLElBQUksQ0FBQ21MLEdBQUQsRUFBTUMsRUFBTixDQUFULElBQXNCMU0sZ0JBQUUyTSxPQUFGLENBQVU5RSxvQ0FBVixDQUF0QixFQUFrRDtBQUVoRCxNQUFJLENBQUM3SCxnQkFBRXlDLFFBQUYsQ0FBVyxDQUFDLG9CQUFELENBQVgsRUFBbUNnSyxHQUFuQyxDQUFMLEVBQThDO0FBQzVDcFAsSUFBQUEsY0FBYyxDQUFDdVAsU0FBZixDQUF5QkgsR0FBekIsSUFBZ0NDLEVBQWhDO0FBQ0Q7QUFDRjs7QUFHRCxLQUFLLElBQUksQ0FBQ0QsR0FBRCxFQUFNQyxFQUFOLENBQVQsSUFBc0IxTSxnQkFBRTJNLE9BQUYsQ0FBVUUsaUJBQVYsQ0FBdEIsRUFBMkM7QUFDekN4UCxFQUFBQSxjQUFjLENBQUN1UCxTQUFmLENBQXlCSCxHQUF6QixJQUFnQ0MsRUFBaEM7QUFDRDs7ZUFHY3JQLGMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBFc3ByZXNzb1J1bm5lciwgVEVTVF9BUEtfUEtHIH0gZnJvbSAnLi9lc3ByZXNzby1ydW5uZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHppcCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8vIFRPRE8gbWVyZ2Ugb3VyIG93biBoZWxwZXJzIG9udG8gdGhpcyBsYXRlclxuY29uc3QgaGVscGVycyA9IGFuZHJvaWRIZWxwZXJzO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gRXNwcmVzc28gSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgU1lTVEVNX1BPUlRfUkFOR0UgPSBbODMwMCwgODM5OV07XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgZXNwcmVzc28gc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbFxuLy8gZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTE7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19rZXlib2FyZF9zaG93bicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFycycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fdGltZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2JhY2tncm91bmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2Nsb3NlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9sYXVuY2gnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3Jlc2V0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9zdHJpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hY3RpdmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9zdGF0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pbnN0YWxsX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3JlbW92ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS91bmxvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuXG5jb25zdCBBUEtfRVhUID0gJy5hcGsnO1xuY29uc3QgQUFCX0VYVCA9ICcuYWFiJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRFTlNJT05TID0gW0FQS19FWFQsIEFBQl9FWFRdO1xuXG5jbGFzcyBFc3ByZXNzb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYCdicm93c2VyTmFtZScgY2FwYWJpbGl0eSB3aWxsIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgICBsb2dnZXIud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICBsb2dnZXIuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgdGhlIHBhY2thZ2UgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgIGBpbnN0YWxsZWQgb24gdGhlIGRldmljZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRFc3ByZXNzb1Nlc3Npb24oKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGUubWVzc2FnZSArPSBgJHtfLmVuZHNXaXRoKGUubWVzc2FnZSwgJy4nKSA/ICcnIDogJy4nfSBDaGVjayBgICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWVzcHJlc3NvLWRyaXZlciN0cm91Ymxlc2hvb3RpbmcgJyArXG4gICAgICAgICdyZWdhcmRpbmcgYWR2YW5jZWQgc2Vzc2lvbiBzdGFydHVwIHRyb3VibGVzaG9vdGluZy4nO1xuICAgICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyID0gbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICBlcnIuc3RhY2sgPSBlLnN0YWNrO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnppcCB0aGUgZ2l2ZW4gYXBwIHBhdGggYW5kIHJldHVybiB0aGUgZmlyc3QgcGFja2FnZSB0aGF0IGhhcyBTVVBQT1JURURfRVhURU5TSU9OU1xuICAgKiBpbiB0aGUgYXJjaGl2ZWQgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggVGhlIHBhdGggdG8gYXBwIGZpbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVucyB0aGUgcGF0aCB0byBhbiB1bnppcHBlZCBhcHAgZmlsZSBwYXRoLlxuICAgKiBAdGhyb3dzIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgemlwIGRpZCBub3QgaGF2ZSBhbnkgU1VQUE9SVEVEX0VYVEVOU0lPTlMgcGFja2FnZXMuXG4gICAqL1xuICBhc3luYyB1bnppcEFwcCAoYXBwUGF0aCkge1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXAgPSBfLmlzRW1wdHkodXNlU3lzdGVtVW56aXBFbnYpXG4gICAgICB8fCAhWycwJywgJ2ZhbHNlJ10uaW5jbHVkZXMoXy50b0xvd2VyKHVzZVN5c3RlbVVuemlwRW52KSk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBwUGF0aCwgdG1wUm9vdCwge3VzZVN5c3RlbVVuemlwfSk7XG5cbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtTVVBQT1JURURfRVhURU5TSU9OUy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChhd2FpdCBmcy5nbG9iKGdsb2JQYXR0ZXJuLCB7XG4gICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIH0pKS5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICAgIGlmIChzb3J0ZWRCdW5kbGVJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIG5vIGV4cGVjdGVkIHBhY2thZ2VzIGluIHRoZSB6aXBcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGAke3RoaXMub3B0cy5hcHB9IGRpZCBub3QgaGF2ZSBhbnkgb2YgJyR7U1VQUE9SVEVEX0VYVEVOU0lPTlMuam9pbignLCAnKX0nIGAgK1xuICAgICAgICBgZXh0ZW5zaW9uIHBhY2thZ2VzLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCAuemlwIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IHVuemlwcGVkQXBwUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKSk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHt1bnppcHBlZEFwcFBhdGh9JyBpcyB0aGUgdW56aXBwZWQgZmlsZSBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgIHJldHVybiB1bnppcHBlZEFwcFBhdGg7XG4gIH1cblxuICBhc3luYyBvblBvc3RDb25maWd1cmVBcHAgKHtjYWNoZWRBcHBJbmZvLCBpc1VybCwgYXBwUGF0aH0pIHtcbiAgICBjb25zdCBwcmVzaWduQXBwID0gYXN5bmMgKGFwcExvY2F0aW9uKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vU2lnbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2tpcHBpbmcgYXBwbGljYXRpb24gc2lnbmluZyBiZWNhdXNlIG5vU2lnbiBjYXBhYmlsaXR5IGlzIHNldCB0byB0cnVlLiAnICtcbiAgICAgICAgICAnSGF2aW5nIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHdpdGggaW1wcm9wZXIgc2lnbmF0dXJlL25vbi1zaWduZWQgd2lsbCBjYXVzZSAnICtcbiAgICAgICAgICAnRXNwcmVzc28gYXV0b21hdGlvbiBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9IGVsc2UgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwTG9jYXRpb24sIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0Fwa0V4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBLX0VYVCk7XG4gICAgY29uc3QgaGFzQWFiRXh0ID0gKGFwcFBhdGgpID0+IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCBBQUJfRVhUKTtcbiAgICBjb25zdCBleHRyYWN0VW5pdmVyc2FsQXBrID0gYXN5bmMgKHNob3VsZEV4dHJhY3QsIGFwcFBhdGgpID0+XG4gICAgICBzaG91bGRFeHRyYWN0ID8gYXBwUGF0aCA6IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RVbml2ZXJzYWxBcGsoYXBwUGF0aCk7XG5cbiAgICBsZXQgcGF0aEluQ2FjaGUgPSBudWxsO1xuICAgIGxldCBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gZmFsc2U7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChjYWNoZWRBcHBJbmZvKSkge1xuICAgICAgY29uc3QgcGFja2FnZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwcFBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VIYXNoID09PSBjYWNoZWRBcHBJbmZvLnBhY2thZ2VIYXNoICYmIGF3YWl0IGZzLmV4aXN0cyhjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVXNpbmcgJyR7Y2FjaGVkQXBwSW5mby5mdWxsUGF0aH0nIHdoaWNoIGlzIGNhY2hlZCBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgICAgICBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgcGF0aEluQ2FjaGUgPSBjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcFBhdGggY2FuIGJlIC56aXAsIC5hcGsgb3IgLmFhYlxuICAgIGNvbnN0IGlzQXBrID0gaGFzQXBrRXh0KGFwcFBhdGgpO1xuICAgIC8vIE9ubHkgbG9jYWwgLmFwayBmaWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4tcGxhY2Ugc2hvdWxkIG5vdCBiZSBjYWNoZWRcbiAgICBjb25zdCBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPSAhaXNBcGsgfHwgKGlzQXBrICYmIGlzVXJsKTtcblxuICAgIGlmICghaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCkge1xuICAgICAgaWYgKHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCkge1xuICAgICAgICAvLyAuemlwLCAuYWFiIG9yIGRvd25sb2FkZWQgLmFwa1xuXG4gICAgICAgIGxldCB1bnppcHBlZEFwcFBhdGg7XG4gICAgICAgIGxldCBpc1VuemlwcGVkQXBrID0gZmFsc2U7XG4gICAgICAgIGlmICghKGhhc0Fwa0V4dChhcHBQYXRoKSB8fCBoYXNBYWJFeHQoYXBwUGF0aCkpKSB7XG4gICAgICAgICAgdW56aXBwZWRBcHBQYXRoID0gYXdhaXQgdGhpcy51bnppcEFwcChhcHBQYXRoKTtcbiAgICAgICAgICBpc1VuemlwcGVkQXBrID0gaGFzQXBrRXh0KHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnppcHBlZEFwcFBhdGggb3IgYXBwUGF0aCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlMuXG4gICAgICAgIHBhdGhJbkNhY2hlID0gdW56aXBwZWRBcHBQYXRoXG4gICAgICAgICAgPyBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzVW56aXBwZWRBcGssIHVuemlwcGVkQXBwUGF0aClcbiAgICAgICAgICA6IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNBcGssIGFwcFBhdGgpO1xuXG4gICAgICAgIGlmICghaXNBcGsgJiYgaXNVcmwpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcG9yYXJpbHkgZG93bmxvYWRlZCAuYWFiIG9yIC56aXAgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQWFiRXh0KHVuemlwcGVkQXBwUGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBsb2NhbCB1bnppcHBlZCAuYWFiIGZpbGVcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGxvZ2dlci5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG5cbiAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWFuZHJvaWQtZHJpdmVyL3B1bGwvNDYxIHdoYXQgaGFwcGVucyBpZiB0aGVyIGlzIG5vIHNldEhpZGRlbkFwaVBvbGljeSBmb3IgQW5kcm9pZCBQK1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHR1cm4gb2ZmIGFuaW1hdGlvbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZFxuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgZXNwcmVzc28gc2VydmVyIGV0Y1xuICAgIHRoaXMuaW5pdEVzcHJlc3NvU2VydmVyKCk7XG4gICAgLy8gRnVydGhlciBwcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgZXNwcmVzc28gcG9ydFxuICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBFc3ByZXNzbyBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byAke3RoaXMub3B0cy5zeXN0ZW1Qb3J0fWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0LCBERVZJQ0VfUE9SVCk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYE5vdCB3YWl0aW5nIGZvciB0aGUgYXBwbGljYXRpb24gYWN0aXZpdHkgdG8gc3RhcnQgYmVjYXVzZSAnYXV0b0xhdW5jaCcgaXMgZGlzYWJsZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvckFjdGl2aXR5KHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSwgdGhpcy5jYXBzLmFwcFdhaXRBY3Rpdml0eSwgdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbik7XG4gICAgfVxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgYXdhaXQgdGhpcy5pbml0V2VidmlldygpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIGVzcHJlc3NvXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRXZWJ2aWV3ICgpIHtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGFuZHJvaWRDb21tYW5kcy5kZWZhdWx0V2Vidmlld05hbWUuY2FsbCh0aGlzKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBpbml0RXNwcmVzc29TZXJ2ZXIgKCkge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyBlc3ByZXNzbyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhXG4gICAgdGhpcy5lc3ByZXNzbyA9IG5ldyBFc3ByZXNzb1J1bm5lcih7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCAnMTI3LjAuMC4xJyxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZm9yY2VFc3ByZXNzb1JlYnVpbGQ6ICEhdGhpcy5vcHRzLmZvcmNlRXNwcmVzc29SZWJ1aWxkLFxuICAgICAgZXNwcmVzc29CdWlsZENvbmZpZzogdGhpcy5vcHRzLmVzcHJlc3NvQnVpbGRDb25maWcsXG4gICAgICBzaG93R3JhZGxlTG9nOiAhIXRoaXMub3B0cy5zaG93R3JhZGxlTG9nLFxuICAgICAgc2VydmVyTGF1bmNoVGltZW91dDogdGhpcy5vcHRzLmVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogdGhpcy5vcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uLFxuICAgICAgdXNlS2V5c3RvcmU6IHRoaXMub3B0cy51c2VLZXlzdG9yZSxcbiAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5vcHRzLmtleXN0b3JlUGF0aCxcbiAgICAgIGtleXN0b3JlUGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgICAga2V5QWxpYXM6IHRoaXMub3B0cy5rZXlBbGlhcyxcbiAgICAgIGtleVBhc3N3b3JkOiB0aGlzLm9wdHMua2V5UGFzc3dvcmQsXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmVzcHJlc3NvLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMuZXNwcmVzc28pO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBzZXQgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSBmcm9tIHRoZSBhcGtcbiAgICAvLyBUT0RPOiBpbmNvcnBvcmF0ZSBjaGFuZ2VzIGZyb20gYXBwaXVtIzUzMDggd2hpY2ggZml4IGEgcmFjZSBjb25kLVxuICAgIC8vIGl0aW9uIGJ1ZyBpbiBvbGQgYXBwaXVtIGFuZCBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgaGVyZVxuICAgIC8vIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MoXG4gICAgLy8gICAgIHRoaXMub3B0cy5sYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFRFU1RfQVBLX1BLR11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24gY2FwYWJpbGl0eSBpcyBzZXQuIE5vdCBpbnN0YWxsaWcgZXNwcmVzc28tc2VydmVyICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmluc3RhbGxUZXN0QXBrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsICYmICF0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSghIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
Binary file
|
package/lib/driver.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
+
import path from 'path';
|
|
2
3
|
import { BaseDriver, errors, isErrorType, DeviceSettings} from '@appium/base-driver';
|
|
3
4
|
import { EspressoRunner, TEST_APK_PKG } from './espresso-runner';
|
|
4
|
-
import { fs } from '@appium/support';
|
|
5
|
+
import { fs, tempDir, zip } from '@appium/support';
|
|
5
6
|
import logger from './logger';
|
|
6
7
|
import commands from './commands';
|
|
7
8
|
import { DEFAULT_ADB_PORT } from 'appium-adb';
|
|
@@ -120,6 +121,10 @@ const CHROME_NO_PROXY = [
|
|
|
120
121
|
];
|
|
121
122
|
|
|
122
123
|
|
|
124
|
+
const APK_EXT = '.apk';
|
|
125
|
+
const AAB_EXT = '.aab';
|
|
126
|
+
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
127
|
+
|
|
123
128
|
class EspressoDriver extends BaseDriver {
|
|
124
129
|
constructor (opts = {}, shouldValidateCaps = true) {
|
|
125
130
|
// `shell` overwrites adb.shell, so remove
|
|
@@ -204,7 +209,7 @@ class EspressoDriver extends BaseDriver {
|
|
|
204
209
|
// find and copy, or download and unzip an app url or path
|
|
205
210
|
this.opts.app = await this.helpers.configureApp(this.opts.app, {
|
|
206
211
|
onPostProcess: this.onPostConfigureApp.bind(this),
|
|
207
|
-
supportedExtensions:
|
|
212
|
+
supportedExtensions: SUPPORTED_EXTENSIONS
|
|
208
213
|
});
|
|
209
214
|
} else if (this.appOnDevice) {
|
|
210
215
|
// the app isn't an actual app file but rather something we want to
|
|
@@ -233,6 +238,36 @@ class EspressoDriver extends BaseDriver {
|
|
|
233
238
|
}
|
|
234
239
|
}
|
|
235
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS
|
|
243
|
+
* in the archived file.
|
|
244
|
+
*
|
|
245
|
+
* @param {string} appPath The path to app file.
|
|
246
|
+
* @returns {string} Retuns the path to an unzipped app file path.
|
|
247
|
+
* @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.
|
|
248
|
+
*/
|
|
249
|
+
async unzipApp (appPath) {
|
|
250
|
+
const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
|
|
251
|
+
const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)
|
|
252
|
+
|| !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));
|
|
253
|
+
const tmpRoot = await tempDir.openDir();
|
|
254
|
+
await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});
|
|
255
|
+
|
|
256
|
+
const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\./, '')).join('|')})`;
|
|
257
|
+
const sortedBundleItems = (await fs.glob(globPattern, {
|
|
258
|
+
cwd: tmpRoot,
|
|
259
|
+
strict: false,
|
|
260
|
+
})).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
261
|
+
if (sortedBundleItems.length === 0) {
|
|
262
|
+
// no expected packages in the zip
|
|
263
|
+
logger.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +
|
|
264
|
+
`extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);
|
|
265
|
+
}
|
|
266
|
+
const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));
|
|
267
|
+
logger.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
|
|
268
|
+
return unzippedAppPath;
|
|
269
|
+
}
|
|
270
|
+
|
|
236
271
|
async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {
|
|
237
272
|
const presignApp = async (appLocation) => {
|
|
238
273
|
if (this.opts.noSign) {
|
|
@@ -244,25 +279,51 @@ class EspressoDriver extends BaseDriver {
|
|
|
244
279
|
}
|
|
245
280
|
};
|
|
246
281
|
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
const
|
|
282
|
+
const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);
|
|
283
|
+
const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);
|
|
284
|
+
const extractUniversalApk = async (shouldExtract, appPath) =>
|
|
285
|
+
shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);
|
|
286
|
+
|
|
250
287
|
let pathInCache = null;
|
|
251
288
|
let isResultAppPathAlreadyCached = false;
|
|
252
289
|
if (_.isPlainObject(cachedAppInfo)) {
|
|
253
290
|
const packageHash = await fs.hash(appPath);
|
|
254
291
|
if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {
|
|
292
|
+
logger.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
|
|
255
293
|
isResultAppPathAlreadyCached = true;
|
|
256
294
|
pathInCache = cachedAppInfo.fullPath;
|
|
257
295
|
}
|
|
258
296
|
}
|
|
297
|
+
|
|
298
|
+
// appPath can be .zip, .apk or .aab
|
|
299
|
+
const isApk = hasApkExt(appPath);
|
|
300
|
+
// Only local .apk files that are available in-place should not be cached
|
|
301
|
+
const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);
|
|
302
|
+
|
|
259
303
|
if (!isResultAppPathAlreadyCached) {
|
|
260
304
|
if (shouldResultAppPathBeCached) {
|
|
261
|
-
|
|
305
|
+
// .zip, .aab or downloaded .apk
|
|
306
|
+
|
|
307
|
+
let unzippedAppPath;
|
|
308
|
+
let isUnzippedApk = false;
|
|
309
|
+
if (!(hasApkExt(appPath) || hasAabExt(appPath))) {
|
|
310
|
+
unzippedAppPath = await this.unzipApp(appPath);
|
|
311
|
+
isUnzippedApk = hasApkExt(unzippedAppPath);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.
|
|
315
|
+
pathInCache = unzippedAppPath
|
|
316
|
+
? await extractUniversalApk(isUnzippedApk, unzippedAppPath)
|
|
317
|
+
: await extractUniversalApk(isApk, appPath);
|
|
318
|
+
|
|
262
319
|
if (!isApk && isUrl) {
|
|
263
|
-
// Clean up the temporarily downloaded .aab package
|
|
320
|
+
// Clean up the temporarily downloaded .aab or .zip package
|
|
264
321
|
await fs.rimraf(appPath);
|
|
265
322
|
}
|
|
323
|
+
if (hasAabExt(unzippedAppPath)) {
|
|
324
|
+
// Cleanup the local unzipped .aab file
|
|
325
|
+
await fs.rimraf(unzippedAppPath);
|
|
326
|
+
}
|
|
266
327
|
await presignApp(pathInCache);
|
|
267
328
|
} else if (isApk) {
|
|
268
329
|
// It is probably not the best idea to modify the provided app in-place,
|