appium-webdriveragent 4.9.1 → 4.9.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.
@@ -1,34 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.XcodeBuild = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _asyncbox = require("asyncbox");
13
-
14
10
  var _teen_process = require("teen_process");
15
-
16
11
  var _support = require("appium/support");
17
-
18
12
  var _logger = _interopRequireDefault(require("./logger"));
19
-
20
13
  var _bluebird = _interopRequireDefault(require("bluebird"));
21
-
22
14
  var _utils = require("./utils");
23
-
24
15
  var _lodash = _interopRequireDefault(require("lodash"));
25
-
26
16
  var _path = _interopRequireDefault(require("path"));
27
-
28
17
  var _os = require("os");
29
-
30
18
  var _constants = require("./constants");
31
-
32
19
  const DEFAULT_SIGNING_ID = 'iPhone Developer';
33
20
  const PREBUILD_DELAY = 0;
34
21
  const RUNNER_SCHEME_IOS = 'WebDriverAgentRunner';
@@ -38,9 +25,7 @@ const ERROR_COPYING_ATTACHMENT = 'Error copying testing attachment';
38
25
  const IGNORED_ERRORS = [ERROR_WRITING_ATTACHMENT, ERROR_COPYING_ATTACHMENT, 'Failed to remove screenshot at path'];
39
26
  const RUNNER_SCHEME_TV = 'WebDriverAgentRunner_tvOS';
40
27
  const LIB_SCHEME_TV = 'WebDriverAgentLib_tvOS';
41
-
42
28
  const xcodeLog = _support.logger.getLogger('Xcode');
43
-
44
29
  class XcodeBuild {
45
30
  constructor(xcodeVersion, device, args = {}, log = null) {
46
31
  this.xcodeVersion = xcodeVersion;
@@ -72,10 +57,8 @@ class XcodeBuild {
72
57
  this.resultBundlePath = args.resultBundlePath;
73
58
  this.resultBundleVersion = args.resultBundleVersion;
74
59
  }
75
-
76
60
  async init(noSessionProxy) {
77
61
  this.noSessionProxy = noSessionProxy;
78
-
79
62
  if (this.useXctestrunFile) {
80
63
  const deviveInfo = {
81
64
  isRealDevice: this.realDevice,
@@ -89,13 +72,11 @@ class XcodeBuild {
89
72
 
90
73
  if (this.realDevice) {
91
74
  await (0, _utils.resetProjectFile)(this.agentPath);
92
-
93
75
  if (this.updatedWDABundleId) {
94
76
  await (0, _utils.updateProjectFile)(this.agentPath, this.updatedWDABundleId);
95
77
  }
96
78
  }
97
79
  }
98
-
99
80
  async retrieveDerivedDataPath() {
100
81
  if (this.derivedDataPath) {
101
82
  return this.derivedDataPath;
@@ -104,10 +85,8 @@ class XcodeBuild {
104
85
  if (this._derivedDataPathPromise) {
105
86
  return await this._derivedDataPathPromise;
106
87
  }
107
-
108
88
  this._derivedDataPathPromise = (async () => {
109
89
  let stdout;
110
-
111
90
  try {
112
91
  ({
113
92
  stdout
@@ -116,56 +95,48 @@ class XcodeBuild {
116
95
  this.log.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);
117
96
  return;
118
97
  }
119
-
120
98
  const pattern = /^\s*BUILD_DIR\s+=\s+(\/.*)/m;
121
99
  const match = pattern.exec(stdout);
122
-
123
100
  if (!match) {
124
101
  this.log.warn(`Cannot parse WDA build dir from ${_lodash.default.truncate(stdout, {
125
102
  length: 300
126
103
  })}`);
127
104
  return;
128
105
  }
129
-
130
106
  this.log.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);
131
107
  this.derivedDataPath = _path.default.dirname(_path.default.dirname(_path.default.normalize(match[1])));
132
108
  this.log.debug(`Got derived data root: '${this.derivedDataPath}'`);
133
109
  return this.derivedDataPath;
134
110
  })();
135
-
136
111
  return await this._derivedDataPathPromise;
137
112
  }
138
-
139
113
  async reset() {
140
114
  if (this.realDevice && this.updatedWDABundleId) {
141
115
  await (0, _utils.resetProjectFile)(this.agentPath);
142
116
  }
143
117
  }
144
-
145
118
  async prebuild() {
146
119
  this.log.debug('Pre-building WDA before launching test');
147
120
  this.usePrebuiltWDA = true;
148
121
  await this.start(true);
149
122
  this.xcodebuild = null;
123
+
150
124
  await _bluebird.default.delay(this.prebuildDelay);
151
125
  }
152
-
153
126
  async cleanProject() {
154
127
  const tmpIsTvOS = (0, _utils.isTvOS)(this.platformName);
155
128
  const libScheme = tmpIsTvOS ? LIB_SCHEME_TV : LIB_SCHEME_IOS;
156
129
  const runnerScheme = tmpIsTvOS ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;
157
-
158
130
  for (const scheme of [libScheme, runnerScheme]) {
159
131
  this.log.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);
160
132
  await (0, _teen_process.exec)('xcodebuild', ['clean', '-project', this.agentPath, '-scheme', scheme]);
161
133
  }
162
134
  }
163
-
164
135
  getCommand(buildOnly = false) {
165
136
  let cmd = 'xcodebuild';
166
137
  let args;
167
- const [buildCmd, testCmd] = this.useSimpleBuildTest ? ['build', 'test'] : ['build-for-testing', 'test-without-building'];
168
138
 
139
+ const [buildCmd, testCmd] = this.useSimpleBuildTest ? ['build', 'test'] : ['build-for-testing', 'test-without-building'];
169
140
  if (buildOnly) {
170
141
  args = [buildCmd];
171
142
  } else if (this.usePrebuiltWDA || this.useXctestrunFile) {
@@ -173,44 +144,35 @@ class XcodeBuild {
173
144
  } else {
174
145
  args = [buildCmd, testCmd];
175
146
  }
176
-
177
147
  if (this.allowProvisioningDeviceRegistration) {
178
148
  args.push('-allowProvisioningUpdates', '-allowProvisioningDeviceRegistration');
179
149
  }
180
-
181
150
  if (this.resultBundlePath) {
182
151
  args.push('-resultBundlePath', this.resultBundlePath);
183
152
  }
184
-
185
153
  if (this.resultBundleVersion) {
186
154
  args.push('-resultBundleVersion', this.resultBundleVersion);
187
155
  }
188
-
189
156
  if (this.useXctestrunFile) {
190
157
  args.push('-xctestrun', this.xctestrunFilePath);
191
158
  } else {
192
159
  const runnerScheme = (0, _utils.isTvOS)(this.platformName) ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;
193
160
  args.push('-project', this.agentPath, '-scheme', runnerScheme);
194
-
195
161
  if (this.derivedDataPath) {
196
162
  args.push('-derivedDataPath', this.derivedDataPath);
197
163
  }
198
164
  }
199
-
200
165
  args.push('-destination', `id=${this.device.udid}`);
201
166
  const versionMatch = new RegExp(/^(\d+)\.(\d+)/).exec(this.platformVersion);
202
-
203
167
  if (versionMatch) {
204
168
  args.push(`IPHONEOS_DEPLOYMENT_TARGET=${versionMatch[1]}.${versionMatch[2]}`);
205
169
  } else {
206
170
  this.log.warn(`Cannot parse major and minor version numbers from platformVersion "${this.platformVersion}". ` + 'Will build for the default platform instead');
207
171
  }
208
-
209
172
  if (this.realDevice && this.xcodeConfigFile) {
210
173
  this.log.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);
211
174
  args.push('-xcconfig', this.xcodeConfigFile);
212
175
  }
213
-
214
176
  if (!process.env.APPIUM_XCUITEST_TREAT_WARNINGS_AS_ERRORS) {
215
177
  args.push('GCC_TREAT_WARNINGS_AS_ERRORS=0');
216
178
  }
@@ -221,18 +183,15 @@ class XcodeBuild {
221
183
  args
222
184
  };
223
185
  }
224
-
225
186
  async createSubProcess(buildOnly = false) {
226
187
  if (!this.useXctestrunFile && this.realDevice) {
227
188
  if (this.keychainPath && this.keychainPassword) {
228
189
  await (0, _utils.setRealDeviceSecurity)(this.keychainPath, this.keychainPassword);
229
190
  }
230
-
231
191
  if (this.xcodeOrgId && this.xcodeSigningId && !this.xcodeConfigFile) {
232
192
  this.xcodeConfigFile = await (0, _utils.generateXcodeConfigFile)(this.xcodeOrgId, this.xcodeSigningId);
233
193
  }
234
194
  }
235
-
236
195
  const {
237
196
  cmd,
238
197
  args
@@ -242,17 +201,13 @@ class XcodeBuild {
242
201
  USE_PORT: this.wdaRemotePort,
243
202
  WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId || _constants.WDA_RUNNER_BUNDLE_ID
244
203
  });
245
-
246
204
  if (this.mjpegServerPort) {
247
205
  env.MJPEG_SERVER_PORT = this.mjpegServerPort;
248
206
  }
249
-
250
207
  const upgradeTimestamp = await (0, _utils.getWDAUpgradeTimestamp)(this.bootstrapPath);
251
-
252
208
  if (upgradeTimestamp) {
253
209
  env.UPGRADE_TIMESTAMP = upgradeTimestamp;
254
210
  }
255
-
256
211
  const xcodebuild = new _teen_process.SubProcess(cmd, args, {
257
212
  cwd: this.bootstrapPath,
258
213
  env,
@@ -264,23 +219,21 @@ class XcodeBuild {
264
219
  this.log.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);
265
220
  xcodebuild.on('output', (stdout, stderr) => {
266
221
  let out = stdout || stderr;
267
-
268
222
  if (out.includes('Writing diagnostic log for test session to')) {
269
223
  xcodebuild.logLocation = _lodash.default.first(_lodash.default.remove(out.trim().split('\n'), v => v.startsWith(_path.default.sep)));
270
224
  xcodeLog.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);
271
225
  }
272
226
 
273
227
  const ignoreError = IGNORED_ERRORS.some(x => out.includes(x));
274
-
275
228
  if (this.showXcodeLog !== false && out.includes('Error Domain=') && !ignoreError) {
276
229
  logXcodeOutput = true;
230
+
277
231
  xcodebuild._wda_error_occurred = true;
278
232
  }
279
233
 
280
234
  if (logXcodeOutput && !ignoreError) {
281
235
  for (const line of out.split(_os.EOL)) {
282
236
  xcodeLog.error(line);
283
-
284
237
  if (line) {
285
238
  xcodebuild._wda_error_message += `${_os.EOL}${line}`;
286
239
  }
@@ -289,20 +242,17 @@ class XcodeBuild {
289
242
  });
290
243
  return xcodebuild;
291
244
  }
292
-
293
245
  async start(buildOnly = false) {
294
246
  this.xcodebuild = await this.createSubProcess(buildOnly);
295
247
  this.xcodebuild._wda_error_message = '';
248
+
296
249
  return await new _bluebird.default((resolve, reject) => {
297
250
  this.xcodebuild.on('exit', async (code, signal) => {
298
251
  xcodeLog.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);
299
-
300
252
  if (this.showXcodeLog && this.xcodebuild.logLocation) {
301
253
  xcodeLog.error(`Contents of xcodebuild log file '${this.xcodebuild.logLocation}':`);
302
-
303
254
  try {
304
255
  let data = await _support.fs.readFile(this.xcodebuild.logLocation, 'utf8');
305
-
306
256
  for (let line of data.split('\n')) {
307
257
  xcodeLog.error(line);
308
258
  }
@@ -310,13 +260,10 @@ class XcodeBuild {
310
260
  xcodeLog.error(`Unable to access xcodebuild log file: '${err.message}'`);
311
261
  }
312
262
  }
313
-
314
263
  this.xcodebuild.processExited = true;
315
-
316
264
  if (this.xcodebuild._wda_error_occurred || !signal && code !== 0) {
317
265
  return reject(new Error(`xcodebuild failed with code ${code}${_os.EOL}` + `xcodebuild error message:${_os.EOL}${this.xcodebuild._wda_error_message}`));
318
266
  }
319
-
320
267
  if (buildOnly) {
321
268
  return resolve();
322
269
  }
@@ -325,7 +272,6 @@ class XcodeBuild {
325
272
  try {
326
273
  const timer = new _support.timing.Timer().start();
327
274
  await this.xcodebuild.start(true);
328
-
329
275
  if (!buildOnly) {
330
276
  let status = await this.waitForStart(timer);
331
277
  resolve(status);
@@ -338,28 +284,22 @@ class XcodeBuild {
338
284
  })();
339
285
  });
340
286
  }
341
-
342
287
  async waitForStart(timer) {
343
288
  this.log.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);
344
289
  let currentStatus = null;
345
-
346
290
  try {
347
291
  let retries = parseInt(this.launchTimeout / 500, 10);
348
292
  await (0, _asyncbox.retryInterval)(retries, 1000, async () => {
349
293
  if (this.xcodebuild.processExited) {
350
294
  return;
351
295
  }
352
-
353
296
  const proxyTimeout = this.noSessionProxy.timeout;
354
297
  this.noSessionProxy.timeout = 1000;
355
-
356
298
  try {
357
299
  currentStatus = await this.noSessionProxy.command('/status', 'GET');
358
-
359
300
  if (currentStatus && currentStatus.ios && currentStatus.ios.ip) {
360
301
  this.agentUrl = currentStatus.ios.ip;
361
302
  }
362
-
363
303
  this.log.debug(`WebDriverAgent information:`);
364
304
  this.log.debug(JSON.stringify(currentStatus, null, 2));
365
305
  } catch (err) {
@@ -368,27 +308,21 @@ class XcodeBuild {
368
308
  this.noSessionProxy.timeout = proxyTimeout;
369
309
  }
370
310
  });
371
-
372
311
  if (this.xcodebuild.processExited) {
373
312
  return currentStatus;
374
313
  }
375
-
376
314
  this.log.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
377
315
  } catch (err) {
378
316
  this.log.debug(err.message);
379
317
  this.log.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);
380
318
  }
381
-
382
319
  return currentStatus;
383
320
  }
384
-
385
321
  async quit() {
386
322
  await (0, _utils.killProcess)('xcodebuild', this.xcodebuild);
387
323
  }
388
-
389
324
  }
390
-
391
325
  exports.XcodeBuild = XcodeBuild;
392
326
  var _default = XcodeBuild;
393
327
  exports.default = _default;
394
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NJR05JTkdfSUQiLCJQUkVCVUlMRF9ERUxBWSIsIlJVTk5FUl9TQ0hFTUVfSU9TIiwiTElCX1NDSEVNRV9JT1MiLCJFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQiLCJFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQiLCJJR05PUkVEX0VSUk9SUyIsIlJVTk5FUl9TQ0hFTUVfVFYiLCJMSUJfU0NIRU1FX1RWIiwieGNvZGVMb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJYY29kZUJ1aWxkIiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJkZXZpY2UiLCJhcmdzIiwibG9nIiwiZGVmYXVsdExvZ2dlciIsInJlYWxEZXZpY2UiLCJhZ2VudFBhdGgiLCJib290c3RyYXBQYXRoIiwicGxhdGZvcm1WZXJzaW9uIiwicGxhdGZvcm1OYW1lIiwiaW9zU2RrVmVyc2lvbiIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJwcmVidWlsZFdEQSIsInVzZVByZWJ1aWx0V0RBIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwidXNlWGN0ZXN0cnVuRmlsZSIsImxhdW5jaFRpbWVvdXQiLCJ3ZGFSZW1vdGVQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwicHJlYnVpbGREZWxheSIsIl8iLCJpc051bWJlciIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJpbml0Iiwibm9TZXNzaW9uUHJveHkiLCJkZXZpdmVJbmZvIiwiaXNSZWFsRGV2aWNlIiwidWRpZCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwic2V0WGN0ZXN0cnVuRmlsZSIsInJlc2V0UHJvamVjdEZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwiX2Rlcml2ZWREYXRhUGF0aFByb21pc2UiLCJzdGRvdXQiLCJleGVjIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJwYXR0ZXJuIiwibWF0Y2giLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImRlYnVnIiwicGF0aCIsImRpcm5hbWUiLCJub3JtYWxpemUiLCJyZXNldCIsInByZWJ1aWxkIiwic3RhcnQiLCJ4Y29kZWJ1aWxkIiwiQiIsImRlbGF5IiwiY2xlYW5Qcm9qZWN0IiwidG1wSXNUdk9TIiwiaXNUdk9TIiwibGliU2NoZW1lIiwicnVubmVyU2NoZW1lIiwic2NoZW1lIiwiZ2V0Q29tbWFuZCIsImJ1aWxkT25seSIsImNtZCIsImJ1aWxkQ21kIiwidGVzdENtZCIsInB1c2giLCJ2ZXJzaW9uTWF0Y2giLCJSZWdFeHAiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSIsImpvaW4iLCJPYmplY3QiLCJhc3NpZ24iLCJVU0VfUE9SVCIsIldEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJNSlBFR19TRVJWRVJfUE9SVCIsInVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiVVBHUkFERV9USU1FU1RBTVAiLCJTdWJQcm9jZXNzIiwiY3dkIiwiZGV0YWNoZWQiLCJzdGRpbyIsImxvZ1hjb2RlT3V0cHV0IiwibG9nTXNnIiwiaXNCb29sZWFuIiwib24iLCJzdGRlcnIiLCJvdXQiLCJpbmNsdWRlcyIsImxvZ0xvY2F0aW9uIiwiZmlyc3QiLCJyZW1vdmUiLCJ0cmltIiwic3BsaXQiLCJ2Iiwic3RhcnRzV2l0aCIsInNlcCIsImlnbm9yZUVycm9yIiwic29tZSIsIngiLCJfd2RhX2Vycm9yX29jY3VycmVkIiwibGluZSIsIkVPTCIsImVycm9yIiwiX3dkYV9lcnJvcl9tZXNzYWdlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvZGUiLCJzaWduYWwiLCJkYXRhIiwiZnMiLCJyZWFkRmlsZSIsInByb2Nlc3NFeGl0ZWQiLCJFcnJvciIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGF0dXMiLCJ3YWl0Rm9yU3RhcnQiLCJtc2ciLCJjdXJyZW50U3RhdHVzIiwicmV0cmllcyIsInBhcnNlSW50IiwicmV0cnlJbnRlcnZhbCIsInByb3h5VGltZW91dCIsInRpbWVvdXQiLCJjb21tYW5kIiwiaW9zIiwiaXAiLCJhZ2VudFVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInF1aXQiLCJraWxsUHJvY2VzcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi94Y29kZWJ1aWxkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgdG1wSXNUdk9TID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKTtcbiAgICBjb25zdCBsaWJTY2hlbWUgPSB0bXBJc1R2T1MgPyBMSUJfU0NIRU1FX1RWIDogTElCX1NDSEVNRV9JT1M7XG4gICAgY29uc3QgcnVubmVyU2NoZW1lID0gdG1wSXNUdk9TID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgZnJvbSBwbGF0Zm9ybVZlcnNpb24gXCIke3RoaXMucGxhdGZvcm1WZXJzaW9ufVwiLiBgICtcbiAgICAgICAgJ1dpbGwgYnVpbGQgZm9yIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGluc3RlYWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVXNpbmcgWGNvZGUgY29uZmlndXJhdGlvbiBmaWxlOiAnJHt0aGlzLnhjb2RlQ29uZmlnRmlsZX0nYCk7XG4gICAgICBhcmdzLnB1c2goJy14Y2NvbmZpZycsIHRoaXMueGNvZGVDb25maWdGaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMpIHtcbiAgICAgIC8vIFRoaXMgc29tZXRpbWVzIGhlbHBzIHRvIHN1cnZpdmUgWGNvZGUgdXBkYXRlc1xuICAgICAgYXJncy5wdXNoKCdHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTPTAnKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvdyBvcHRpb24gc2xpZ2h0bHkgcmVkdWNlcyBidWlsZCB0aW1lIGluIGRlYnVnIGJ1aWxkXG4gICAgLy8gd2l0aCBwcmV2ZW50aW5nIHRvIGdlbmVyYXRlIGAvSW5kZXgvRGF0YVN0b3JlYCB3aGljaCBpcyB1c2VkIGJ5IGRldmVsb3BtZW50XG4gICAgYXJncy5wdXNoKCdDT01QSUxFUl9JTkRFWF9TVE9SRV9FTkFCTEU9Tk8nKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVN1YlByb2Nlc3MgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgdGhpcy5yZWFsRGV2aWNlKSB7XG4gICAgICBpZiAodGhpcy5rZXljaGFpblBhdGggJiYgdGhpcy5rZXljaGFpblBhc3N3b3JkKSB7XG4gICAgICAgIGF3YWl0IHNldFJlYWxEZXZpY2VTZWN1cml0eSh0aGlzLmtleWNoYWluUGF0aCwgdGhpcy5rZXljaGFpblBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnhjb2RlT3JnSWQgJiYgdGhpcy54Y29kZVNpZ25pbmdJZCAmJiAhdGhpcy54Y29kZUNvbmZpZ0ZpbGUpIHtcbiAgICAgICAgdGhpcy54Y29kZUNvbmZpZ0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSh0aGlzLnhjb2RlT3JnSWQsIHRoaXMueGNvZGVTaWduaW5nSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtjbWQsIGFyZ3N9ID0gdGhpcy5nZXRDb21tYW5kKGJ1aWxkT25seSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCB8fCBXREFfUlVOTkVSX0JVTkRMRV9JRCxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vV2ViRHJpdmVyQWdlbnQvcHVsbC8xMDVcbiAgICAgIGVudi5NSlBFR19TRVJWRVJfUE9SVCA9IHRoaXMubWpwZWdTZXJ2ZXJQb3J0O1xuICAgIH1cbiAgICBjb25zdCB1cGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgIGlmICh1cGdyYWRlVGltZXN0YW1wKSB7XG4gICAgICBlbnYuVVBHUkFERV9USU1FU1RBTVAgPSB1cGdyYWRlVGltZXN0YW1wO1xuICAgIH1cbiAgICBjb25zdCB4Y29kZWJ1aWxkID0gbmV3IFN1YlByb2Nlc3MoY21kLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgIGVudixcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuXG4gICAgbGV0IGxvZ1hjb2RlT3V0cHV0ID0gISF0aGlzLnNob3dYY29kZUxvZztcbiAgICBjb25zdCBsb2dNc2cgPSBfLmlzQm9vbGVhbih0aGlzLnNob3dYY29kZUxvZylcbiAgICAgID8gYE91dHB1dCBmcm9tIHhjb2RlYnVpbGQgJHt0aGlzLnNob3dYY29kZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGBcbiAgICAgIDogJ091dHB1dCBmcm9tIHhjb2RlYnVpbGQgd2lsbCBvbmx5IGJlIGxvZ2dlZCBpZiBhbnkgZXJyb3JzIGFyZSBwcmVzZW50IHRoZXJlJztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIHhjb2RlTG9nLmRlYnVnKGBMb2cgZmlsZSBmb3IgeGNvZGVidWlsZCB0ZXN0OiAke3hjb2RlYnVpbGQubG9nTG9jYXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2Ugd2FudCB0byBvdXRwdXQgdGhlIGxvZ3NcbiAgICAgIC8vIG90aGVyd2lzZSB0aGUgZmFpbHVyZSBpcyBpbnNjcnV0aWJsZVxuICAgICAgLy8gYnV0IGRvIG5vdCBsb2cgcGVybWlzc2lvbiBlcnJvcnMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgdG8gYXR0YWNobWVudHMgZm9sZGVyXG4gICAgICBjb25zdCBpZ25vcmVFcnJvciA9IElHTk9SRURfRVJST1JTLnNvbWUoKHgpID0+IG91dC5pbmNsdWRlcyh4KSk7XG4gICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgIT09IGZhbHNlICYmIG91dC5pbmNsdWRlcygnRXJyb3IgRG9tYWluPScpICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBsb2dYY29kZU91dHB1dCA9IHRydWU7XG5cbiAgICAgICAgLy8gdGVycmlibGUgaGFjayB0byBoYW5kbGUgY2FzZSB3aGVyZSB4Y29kZSByZXR1cm4gMCBidXQgaXMgZmFpbGluZ1xuICAgICAgICB4Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgaWYgKGxvZ1hjb2RlT3V0cHV0ICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KEVPTCkpIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2UgKz0gYCR7RU9MfSR7bGluZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhjb2RlYnVpbGQ7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBhd2FpdCB0aGlzLmNyZWF0ZVN1YlByb2Nlc3MoYnVpbGRPbmx5KTtcbiAgICAvLyBTdG9yZSB4Y29kZWJ1aWxkIG1lc3NhZ2VcbiAgICB0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlID0gJyc7XG5cbiAgICAvLyB3cmFwIHRoZSBzdGFydCBwcm9jZWR1cmUgaW4gYSBwcm9taXNlIHNvIHRoYXQgd2UgY2FuIGNhdGNoLCBhbmQgcmVwb3J0LFxuICAgIC8vIGFueSBzdGFydHVwIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYXMgZXZlbnRzXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMueGNvZGVidWlsZC5vbignZXhpdCcsIGFzeW5jIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgeGNvZGVMb2cuZXJyb3IoYHhjb2RlYnVpbGQgZXhpdGVkIHdpdGggY29kZSAnJHtjb2RlfScgYW5kIHNpZ25hbCAnJHtzaWduYWx9J2ApO1xuICAgICAgICAvLyBwcmludCBvdXQgdGhlIHhjb2RlYnVpbGQgZmlsZSBpZiB1c2VycyBoYXZlIGFza2VkIGZvciBpdFxuICAgICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgJiYgdGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IoYENvbnRlbnRzIG9mIHhjb2RlYnVpbGQgbG9nIGZpbGUgJyR7dGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufSc6YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uLCAndXRmOCcpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiBkYXRhLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvclN0YXJ0ICh0aW1lcikge1xuICAgIC8vIHRyeSB0byBjb25uZWN0IG9uY2UgZXZlcnkgMC41IHNlY29uZHMsIHVudGlsIGBsYXVuY2hUaW1lb3V0YCBpcyB1cFxuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGhpcy5sYXVuY2hUaW1lb3V0fW1zIGZvciBXZWJEcml2ZXJBZ2VudCB0byBzdGFydGApO1xuICAgIGxldCBjdXJyZW50U3RhdHVzID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldHJpZXMgPSBwYXJzZUludCh0aGlzLmxhdW5jaFRpbWVvdXQgLyA1MDAsIDEwKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVRpbWVvdXQgPSB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQ7XG4gICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IDEwMDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3VycmVudFN0YXR1cyA9IGF3YWl0IHRoaXMubm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAmJiBjdXJyZW50U3RhdHVzLmlvcyAmJiBjdXJyZW50U3RhdHVzLmlvcy5pcCkge1xuICAgICAgICAgICAgdGhpcy5hZ2VudFVybCA9IGN1cnJlbnRTdGF0dXMuaW9zLmlwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkoY3VycmVudFN0YXR1cywgbnVsbCwgMikpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb25uZWN0IHRvIHJ1bm5pbmcgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gcHJveHlUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgbm90IGhhZCBhbnkgZXJyb3JzIGZyb20geGNvZGUgaXRzZWxmIChyZXBvcnRlZFxuICAgICAgLy8gZWxzZXdoZXJlKSwgd2UgY2FuIGxldCB0aGlzIGdvIHRocm91Z2ggYW5kIHRyeSB0byBjcmVhdGUgdGhlIHNlc3Npb25cbiAgICAgIHRoaXMubG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYEdldHRpbmcgc3RhdHVzIG9mIFdlYkRyaXZlckFnZW50IG9uIGRldmljZSB0aW1lZCBvdXQuIENvbnRpbnVpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0dXM7XG4gIH1cblxuICBhc3luYyBxdWl0ICgpIHtcbiAgICBhd2FpdCBraWxsUHJvY2VzcygneGNvZGVidWlsZCcsIHRoaXMueGNvZGVidWlsZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgWGNvZGVCdWlsZCB9O1xuZXhwb3J0IGRlZmF1bHQgWGNvZGVCdWlsZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxrQkFBa0IsR0FBRyxrQkFBM0I7QUFDQSxNQUFN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
328
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NJR05JTkdfSUQiLCJQUkVCVUlMRF9ERUxBWSIsIlJVTk5FUl9TQ0hFTUVfSU9TIiwiTElCX1NDSEVNRV9JT1MiLCJFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQiLCJFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQiLCJJR05PUkVEX0VSUk9SUyIsIlJVTk5FUl9TQ0hFTUVfVFYiLCJMSUJfU0NIRU1FX1RWIiwieGNvZGVMb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJYY29kZUJ1aWxkIiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJkZXZpY2UiLCJhcmdzIiwibG9nIiwiZGVmYXVsdExvZ2dlciIsInJlYWxEZXZpY2UiLCJhZ2VudFBhdGgiLCJib290c3RyYXBQYXRoIiwicGxhdGZvcm1WZXJzaW9uIiwicGxhdGZvcm1OYW1lIiwiaW9zU2RrVmVyc2lvbiIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJwcmVidWlsZFdEQSIsInVzZVByZWJ1aWx0V0RBIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwidXNlWGN0ZXN0cnVuRmlsZSIsImxhdW5jaFRpbWVvdXQiLCJ3ZGFSZW1vdGVQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwicHJlYnVpbGREZWxheSIsIl8iLCJpc051bWJlciIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJpbml0Iiwibm9TZXNzaW9uUHJveHkiLCJkZXZpdmVJbmZvIiwiaXNSZWFsRGV2aWNlIiwidWRpZCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwic2V0WGN0ZXN0cnVuRmlsZSIsInJlc2V0UHJvamVjdEZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwiX2Rlcml2ZWREYXRhUGF0aFByb21pc2UiLCJzdGRvdXQiLCJleGVjIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJwYXR0ZXJuIiwibWF0Y2giLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImRlYnVnIiwicGF0aCIsImRpcm5hbWUiLCJub3JtYWxpemUiLCJyZXNldCIsInByZWJ1aWxkIiwic3RhcnQiLCJ4Y29kZWJ1aWxkIiwiQiIsImRlbGF5IiwiY2xlYW5Qcm9qZWN0IiwidG1wSXNUdk9TIiwiaXNUdk9TIiwibGliU2NoZW1lIiwicnVubmVyU2NoZW1lIiwic2NoZW1lIiwiZ2V0Q29tbWFuZCIsImJ1aWxkT25seSIsImNtZCIsImJ1aWxkQ21kIiwidGVzdENtZCIsInB1c2giLCJ2ZXJzaW9uTWF0Y2giLCJSZWdFeHAiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSIsImpvaW4iLCJPYmplY3QiLCJhc3NpZ24iLCJVU0VfUE9SVCIsIldEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJNSlBFR19TRVJWRVJfUE9SVCIsInVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiVVBHUkFERV9USU1FU1RBTVAiLCJTdWJQcm9jZXNzIiwiY3dkIiwiZGV0YWNoZWQiLCJzdGRpbyIsImxvZ1hjb2RlT3V0cHV0IiwibG9nTXNnIiwiaXNCb29sZWFuIiwib24iLCJzdGRlcnIiLCJvdXQiLCJpbmNsdWRlcyIsImxvZ0xvY2F0aW9uIiwiZmlyc3QiLCJyZW1vdmUiLCJ0cmltIiwic3BsaXQiLCJ2Iiwic3RhcnRzV2l0aCIsInNlcCIsImlnbm9yZUVycm9yIiwic29tZSIsIngiLCJfd2RhX2Vycm9yX29jY3VycmVkIiwibGluZSIsIkVPTCIsImVycm9yIiwiX3dkYV9lcnJvcl9tZXNzYWdlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvZGUiLCJzaWduYWwiLCJkYXRhIiwiZnMiLCJyZWFkRmlsZSIsInByb2Nlc3NFeGl0ZWQiLCJFcnJvciIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGF0dXMiLCJ3YWl0Rm9yU3RhcnQiLCJtc2ciLCJjdXJyZW50U3RhdHVzIiwicmV0cmllcyIsInBhcnNlSW50IiwicmV0cnlJbnRlcnZhbCIsInByb3h5VGltZW91dCIsInRpbWVvdXQiLCJjb21tYW5kIiwiaW9zIiwiaXAiLCJhZ2VudFVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInF1aXQiLCJraWxsUHJvY2VzcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi94Y29kZWJ1aWxkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgdG1wSXNUdk9TID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKTtcbiAgICBjb25zdCBsaWJTY2hlbWUgPSB0bXBJc1R2T1MgPyBMSUJfU0NIRU1FX1RWIDogTElCX1NDSEVNRV9JT1M7XG4gICAgY29uc3QgcnVubmVyU2NoZW1lID0gdG1wSXNUdk9TID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgZnJvbSBwbGF0Zm9ybVZlcnNpb24gXCIke3RoaXMucGxhdGZvcm1WZXJzaW9ufVwiLiBgICtcbiAgICAgICAgJ1dpbGwgYnVpbGQgZm9yIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGluc3RlYWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVXNpbmcgWGNvZGUgY29uZmlndXJhdGlvbiBmaWxlOiAnJHt0aGlzLnhjb2RlQ29uZmlnRmlsZX0nYCk7XG4gICAgICBhcmdzLnB1c2goJy14Y2NvbmZpZycsIHRoaXMueGNvZGVDb25maWdGaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMpIHtcbiAgICAgIC8vIFRoaXMgc29tZXRpbWVzIGhlbHBzIHRvIHN1cnZpdmUgWGNvZGUgdXBkYXRlc1xuICAgICAgYXJncy5wdXNoKCdHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTPTAnKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvdyBvcHRpb24gc2xpZ2h0bHkgcmVkdWNlcyBidWlsZCB0aW1lIGluIGRlYnVnIGJ1aWxkXG4gICAgLy8gd2l0aCBwcmV2ZW50aW5nIHRvIGdlbmVyYXRlIGAvSW5kZXgvRGF0YVN0b3JlYCB3aGljaCBpcyB1c2VkIGJ5IGRldmVsb3BtZW50XG4gICAgYXJncy5wdXNoKCdDT01QSUxFUl9JTkRFWF9TVE9SRV9FTkFCTEU9Tk8nKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVN1YlByb2Nlc3MgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgdGhpcy5yZWFsRGV2aWNlKSB7XG4gICAgICBpZiAodGhpcy5rZXljaGFpblBhdGggJiYgdGhpcy5rZXljaGFpblBhc3N3b3JkKSB7XG4gICAgICAgIGF3YWl0IHNldFJlYWxEZXZpY2VTZWN1cml0eSh0aGlzLmtleWNoYWluUGF0aCwgdGhpcy5rZXljaGFpblBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnhjb2RlT3JnSWQgJiYgdGhpcy54Y29kZVNpZ25pbmdJZCAmJiAhdGhpcy54Y29kZUNvbmZpZ0ZpbGUpIHtcbiAgICAgICAgdGhpcy54Y29kZUNvbmZpZ0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSh0aGlzLnhjb2RlT3JnSWQsIHRoaXMueGNvZGVTaWduaW5nSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtjbWQsIGFyZ3N9ID0gdGhpcy5nZXRDb21tYW5kKGJ1aWxkT25seSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCB8fCBXREFfUlVOTkVSX0JVTkRMRV9JRCxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vV2ViRHJpdmVyQWdlbnQvcHVsbC8xMDVcbiAgICAgIGVudi5NSlBFR19TRVJWRVJfUE9SVCA9IHRoaXMubWpwZWdTZXJ2ZXJQb3J0O1xuICAgIH1cbiAgICBjb25zdCB1cGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgIGlmICh1cGdyYWRlVGltZXN0YW1wKSB7XG4gICAgICBlbnYuVVBHUkFERV9USU1FU1RBTVAgPSB1cGdyYWRlVGltZXN0YW1wO1xuICAgIH1cbiAgICBjb25zdCB4Y29kZWJ1aWxkID0gbmV3IFN1YlByb2Nlc3MoY21kLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgIGVudixcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuXG4gICAgbGV0IGxvZ1hjb2RlT3V0cHV0ID0gISF0aGlzLnNob3dYY29kZUxvZztcbiAgICBjb25zdCBsb2dNc2cgPSBfLmlzQm9vbGVhbih0aGlzLnNob3dYY29kZUxvZylcbiAgICAgID8gYE91dHB1dCBmcm9tIHhjb2RlYnVpbGQgJHt0aGlzLnNob3dYY29kZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGBcbiAgICAgIDogJ091dHB1dCBmcm9tIHhjb2RlYnVpbGQgd2lsbCBvbmx5IGJlIGxvZ2dlZCBpZiBhbnkgZXJyb3JzIGFyZSBwcmVzZW50IHRoZXJlJztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIHhjb2RlTG9nLmRlYnVnKGBMb2cgZmlsZSBmb3IgeGNvZGVidWlsZCB0ZXN0OiAke3hjb2RlYnVpbGQubG9nTG9jYXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2Ugd2FudCB0byBvdXRwdXQgdGhlIGxvZ3NcbiAgICAgIC8vIG90aGVyd2lzZSB0aGUgZmFpbHVyZSBpcyBpbnNjcnV0aWJsZVxuICAgICAgLy8gYnV0IGRvIG5vdCBsb2cgcGVybWlzc2lvbiBlcnJvcnMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgdG8gYXR0YWNobWVudHMgZm9sZGVyXG4gICAgICBjb25zdCBpZ25vcmVFcnJvciA9IElHTk9SRURfRVJST1JTLnNvbWUoKHgpID0+IG91dC5pbmNsdWRlcyh4KSk7XG4gICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgIT09IGZhbHNlICYmIG91dC5pbmNsdWRlcygnRXJyb3IgRG9tYWluPScpICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBsb2dYY29kZU91dHB1dCA9IHRydWU7XG5cbiAgICAgICAgLy8gdGVycmlibGUgaGFjayB0byBoYW5kbGUgY2FzZSB3aGVyZSB4Y29kZSByZXR1cm4gMCBidXQgaXMgZmFpbGluZ1xuICAgICAgICB4Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgaWYgKGxvZ1hjb2RlT3V0cHV0ICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KEVPTCkpIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2UgKz0gYCR7RU9MfSR7bGluZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhjb2RlYnVpbGQ7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBhd2FpdCB0aGlzLmNyZWF0ZVN1YlByb2Nlc3MoYnVpbGRPbmx5KTtcbiAgICAvLyBTdG9yZSB4Y29kZWJ1aWxkIG1lc3NhZ2VcbiAgICB0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlID0gJyc7XG5cbiAgICAvLyB3cmFwIHRoZSBzdGFydCBwcm9jZWR1cmUgaW4gYSBwcm9taXNlIHNvIHRoYXQgd2UgY2FuIGNhdGNoLCBhbmQgcmVwb3J0LFxuICAgIC8vIGFueSBzdGFydHVwIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYXMgZXZlbnRzXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMueGNvZGVidWlsZC5vbignZXhpdCcsIGFzeW5jIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgeGNvZGVMb2cuZXJyb3IoYHhjb2RlYnVpbGQgZXhpdGVkIHdpdGggY29kZSAnJHtjb2RlfScgYW5kIHNpZ25hbCAnJHtzaWduYWx9J2ApO1xuICAgICAgICAvLyBwcmludCBvdXQgdGhlIHhjb2RlYnVpbGQgZmlsZSBpZiB1c2VycyBoYXZlIGFza2VkIGZvciBpdFxuICAgICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgJiYgdGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IoYENvbnRlbnRzIG9mIHhjb2RlYnVpbGQgbG9nIGZpbGUgJyR7dGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufSc6YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uLCAndXRmOCcpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiBkYXRhLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvclN0YXJ0ICh0aW1lcikge1xuICAgIC8vIHRyeSB0byBjb25uZWN0IG9uY2UgZXZlcnkgMC41IHNlY29uZHMsIHVudGlsIGBsYXVuY2hUaW1lb3V0YCBpcyB1cFxuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGhpcy5sYXVuY2hUaW1lb3V0fW1zIGZvciBXZWJEcml2ZXJBZ2VudCB0byBzdGFydGApO1xuICAgIGxldCBjdXJyZW50U3RhdHVzID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldHJpZXMgPSBwYXJzZUludCh0aGlzLmxhdW5jaFRpbWVvdXQgLyA1MDAsIDEwKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVRpbWVvdXQgPSB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQ7XG4gICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IDEwMDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3VycmVudFN0YXR1cyA9IGF3YWl0IHRoaXMubm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAmJiBjdXJyZW50U3RhdHVzLmlvcyAmJiBjdXJyZW50U3RhdHVzLmlvcy5pcCkge1xuICAgICAgICAgICAgdGhpcy5hZ2VudFVybCA9IGN1cnJlbnRTdGF0dXMuaW9zLmlwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkoY3VycmVudFN0YXR1cywgbnVsbCwgMikpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb25uZWN0IHRvIHJ1bm5pbmcgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gcHJveHlUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgbm90IGhhZCBhbnkgZXJyb3JzIGZyb20geGNvZGUgaXRzZWxmIChyZXBvcnRlZFxuICAgICAgLy8gZWxzZXdoZXJlKSwgd2UgY2FuIGxldCB0aGlzIGdvIHRocm91Z2ggYW5kIHRyeSB0byBjcmVhdGUgdGhlIHNlc3Npb25cbiAgICAgIHRoaXMubG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYEdldHRpbmcgc3RhdHVzIG9mIFdlYkRyaXZlckFnZW50IG9uIGRldmljZSB0aW1lZCBvdXQuIENvbnRpbnVpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0dXM7XG4gIH1cblxuICBhc3luYyBxdWl0ICgpIHtcbiAgICBhd2FpdCBraWxsUHJvY2VzcygneGNvZGVidWlsZCcsIHRoaXMueGNvZGVidWlsZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgWGNvZGVCdWlsZCB9O1xuZXhwb3J0IGRlZmF1bHQgWGNvZGVCdWlsZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLGtCQUFrQixHQUFHLGtCQUFrQjtBQUM3QyxNQUFNQyxjQUFjLEdBQUcs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