appium-xcuitest-driver 4.18.3 → 4.18.4

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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [4.18.4](https://github.com/appium/appium-xcuitest-driver/compare/v4.18.3...v4.18.4) (2023-02-28)
2
+
3
+
4
+ ### Miscellaneous Chores
5
+
6
+ * Short circuit if the app under test crashes while checking for alerts ([#1510](https://github.com/appium/appium-xcuitest-driver/issues/1510)) ([5684cdf](https://github.com/appium/appium-xcuitest-driver/commit/5684cdf8c55a2d6a59d51e56c94bf0cec01f79a4))
7
+
1
8
  ## [4.18.3](https://github.com/appium/appium-xcuitest-driver/compare/v4.18.2...v4.18.3) (2023-02-27)
2
9
 
3
10
 
@@ -54,6 +54,7 @@ const {
54
54
  const ATOM_WAIT_TIMEOUT_MS = 2 * 60000;
55
55
  const ATOM_INITIAL_WAIT_MS = 1000;
56
56
  const ON_OBSTRUCTING_ALERT_EVENT = 'alert';
57
+ const ON_APP_CRASH_EVENT = 'app_crash';
57
58
  const VISIBLE = 'visible';
58
59
  const INVISIBLE = 'invisible';
59
60
  const DETECT = 'detect';
@@ -490,7 +491,7 @@ extensions.waitForAtom = async function waitForAtom(promise) {
490
491
  const originalError = err instanceof _bluebird.default.AggregateError ? err[0] : err;
491
492
  this.log.debug(`Error received while executing atom: ${originalError.message}`);
492
493
  if (originalError instanceof _bluebird.default.TimeoutError) {
493
- throw new Error(`Did not get any response for atom execution after ` + `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
494
+ throw new _driver.errors.TimeoutError(`Did not get any response for atom execution after ` + `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
494
495
  }
495
496
  throw originalError;
496
497
  }
@@ -508,6 +509,7 @@ extensions.waitForAtom = async function waitForAtom(promise) {
508
509
  }
509
510
  this._waitingAtoms.count++;
510
511
  let onAlertCallback;
512
+ let onAppCrashCallback;
511
513
  try {
512
514
  if (this._waitingAtoms.alertMonitor.isResolved()) {
513
515
  this._waitingAtoms.alertMonitor = _bluebird.default.resolve((async () => {
@@ -516,20 +518,29 @@ extensions.waitForAtom = async function waitForAtom(promise) {
516
518
  if (await this.checkForAlert()) {
517
519
  this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);
518
520
  }
519
- } catch (ign) {}
521
+ } catch (err) {
522
+ if ((0, _driver.isErrorType)(err, _driver.errors.InvalidElementStateError)) {
523
+ this._waitingAtoms.alertNotifier.emit(ON_APP_CRASH_EVENT, err);
524
+ }
525
+ }
520
526
  await _bluebird.default.delay(ATOM_INITIAL_WAIT_MS / 2);
521
527
  }
522
528
  })());
523
529
  }
524
530
  return await new _bluebird.default((resolve, reject) => {
525
531
  onAlertCallback = () => reject(new _driver.errors.UnexpectedAlertOpenError());
532
+ onAppCrashCallback = reject;
526
533
  this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);
534
+ this._waitingAtoms.alertNotifier.once(ON_APP_CRASH_EVENT, onAppCrashCallback);
527
535
  handlePromiseError(timedAtomPromise).then(resolve).catch(reject);
528
536
  });
529
537
  } finally {
530
538
  if (onAlertCallback) {
531
539
  this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);
532
540
  }
541
+ if (onAppCrashCallback) {
542
+ this._waitingAtoms.alertNotifier.removeListener(ON_APP_CRASH_EVENT, onAppCrashCallback);
543
+ }
533
544
  this._waitingAtoms.count--;
534
545
  }
535
546
  };
@@ -557,4 +568,4 @@ commands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPrefer
557
568
  Object.assign(commands, extensions, helpers);
558
569
  var _default = commands;
559
570
  exports.default = _default;
560
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXN5bmNib3giLCJyZXF1aXJlIiwiX3N1cHBvcnQiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ibHVlYmlyZCIsIl9kcml2ZXIiLCJfY29va2llcyIsIl9ldmVudHMiLCJJUEhPTkVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQiLCJJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyIsIklQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQiLCJUQUJfQkFSX09GRlNFVCIsIklQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCIsIk5PVENIRURfREVWSUNFX1NJWkVTIiwidyIsImgiLCJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJBVE9NX1dBSVRfVElNRU9VVF9NUyIsIkFUT01fSU5JVElBTF9XQUlUX01TIiwiT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQiLCJWSVNJQkxFIiwiSU5WSVNJQkxFIiwiREVURUNUIiwiVklTSUJJTElUSUVTIiwiVEFCX0JBUl9QT1NJVElPTl9UT1AiLCJUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSIsIlRBQl9CQVJfUE9TU0lUSU9OUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIiLCJpZCIsIl8iLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNFbXB0eSIsImlzTmFOIiwic2V0RnJhbWUiLCJmcmFtZSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJpc051bGwiLCJjdXJXZWJGcmFtZXMiLCJsb2ciLCJkZWJ1ZyIsImhhc0VsZW1lbnRJZCIsImF0b21zRWxlbWVudCIsImdldEF0b21zRWxlbWVudCIsInZhbHVlIiwiZXhlY3V0ZUF0b20iLCJXSU5ET1ciLCJ1bnNoaWZ0IiwiYXRvbSIsImlzVW5kZWZpbmVkIiwiTm9TdWNoRnJhbWVFcnJvciIsImdldENzc1Byb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiZWwiLCJzdWJtaXQiLCJyZWZyZXNoIiwiZ2V0VXJsIiwicmVtb3RlIiwiZXhlY3V0ZSIsInRpdGxlIiwic2V0Q29va2llIiwiY29va2llIiwiY2xvbmUiLCJwYXRoIiwianNDb29raWUiLCJjb29raWVVdGlscyIsImNyZWF0ZUpTQ29va2llIiwibmFtZSIsImV4cGlyZXMiLCJleHBpcnkiLCJEYXRlIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJodHRwT25seSIsInNlY3VyZSIsInNjcmlwdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYWNoZVdlYkVsZW1lbnQiLCJpc1BsYWluT2JqZWN0IiwiZWxJZCIsInVud3JhcEVsZW1lbnQiLCJjYWNoZUlkIiwiaW5jbHVkZXMiLCJ1dWlkVjQiLCJ3ZWJFbGVtZW50c0NhY2hlIiwic2V0Iiwid3JhcEVsZW1lbnQiLCJjYWNoZVdlYkVsZW1lbnRzIiwicmVzcG9uc2UiLCJ0b0NhY2hlZCIsInYiLCJpc0FycmF5IiwibWFwIiwicmVzdWx0IiwidG9QYWlycyIsInJlZHVjZSIsImFjYyIsImtleSIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYW55IiwiY3R4IiwiY29udGV4dEVsZW1lbnQiLCJpc05pbCIsImVsZW1lbnQiLCJkb0ZpbmQiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJlcnIiLCJtZXNzYWdlIiwiaXNGdW5jdGlvbiIsIm1hdGNoIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiY2xpY2tXZWJDb29yZHMiLCJjb29yZHMiLCJ0cmFuc2xhdGVXZWJDb29yZHMiLCJjdXJXZWJDb29yZHMiLCJjbGlja0Nvb3JkcyIsImFyZ3MiLCJhbHdheXNEZWZhdWx0RnJhbWUiLCJmcmFtZXMiLCJwcm9taXNlIiwid2FpdEZvckF0b20iLCJleGVjdXRlQXRvbUFzeW5jIiwicmVzcG9uc2VVcmwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImFzeW5jUHJvbWlzZSIsImVsT3JJZCIsImhhcyIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRUxFTUVOVCIsImdldCIsImNvbnZlcnRFbGVtZW50c0ZvckF0b21zIiwiYXJnIiwiaXNFcnJvclR5cGUiLCJnZXRFbGVtZW50SWQiLCJoYXNWYWx1ZSIsImdldFNhZmFyaUlzSXBob25lIiwiaXNCb29sZWFuIiwiX2lzU2FmYXJpSXBob25lIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJ3YXJuIiwiZ2V0U2FmYXJpRGV2aWNlU2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwibm9ybUhlaWdodCIsIm5vcm1XaWR0aCIsImdldFNhZmFyaUlzTm90Y2hlZCIsIl9pc1NhZmFyaU5vdGNoZWQiLCJkZXZpY2UiLCJnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCIsInd2UG9zIiwicmVhbERpbXMiLCJ0b3BPZmZzZXQiLCJib3R0b21PZmZzZXQiLCJpc0lwaG9uZSIsIm5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkiLCJuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkiLCJzYWZhcmlUYWJCYXJQb3NpdGlvbiIsImNvbXBhcmVWZXJzaW9ucyIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwidGFiQmFyVmlzaWJpbGl0eSIsImxvd2VyQ2FzZSIsImJhbm5lclZpc2liaWxpdHkiLCJ0YWJCYXJQb3NpdGlvbiIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNOb3RjaGVkIiwib3JpZW50YXRpb24iLCJub3RjaE9mZnNldCIsImlzU2Nyb2xsZWQiLCJjb250ZXh0c0FuZFZpZXdzIiwiZ2V0Q29udGV4dHNBbmRWaWV3cyIsInRhYnMiLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwiZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQiLCJ5Iiwib2Zmc2V0IiwiYmFubmVycyIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsInRhcFdlYkVsZW1lbnROYXRpdmVseSIsImRyaXZlciIsInRleHQiLCJlbHMiLCJyZWN0IiwicHJveHlDb21tYW5kIiwiZWwyIiwicmVjdDIiLCJ4IiwiTWF0aCIsInJvdW5kIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiUHJvbWlzZSIsImFsbCIsInNpemUiLCJjb29yZGluYXRlcyIsInBlcmZvcm1Ub3VjaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJ3ZWJ2aWV3IiwicmV0cnlJbnRlcnZhbCIsImlnbiIsIkVycm9yIiwiY21kIiwid3ZEaW1zIiwiaW1wbGljaXRXYWl0TXMiLCJzZXRJbXBsaWNpdFdhaXQiLCJ4UmF0aW8iLCJ5UmF0aW8iLCJuZXdDb29yZHMiLCJjaGVja0ZvckFsZXJ0IiwiZ2V0QWxlcnRUZXh0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidGltZWRBdG9tUHJvbWlzZSIsInRpbWVvdXQiLCJoYW5kbGVQcm9taXNlRXJyb3IiLCJwIiwib3JpZ2luYWxFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiVGltZW91dEVycm9yIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJhbnkiLCJkZWxheSIsImlzRnVsZmlsbGVkIiwiX3dhaXRpbmdBdG9tcyIsImNvdW50IiwiYWxlcnROb3RpZmllciIsIkV2ZW50RW1pdHRlciIsImFsZXJ0TW9uaXRvciIsIm9uQWxlcnRDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJlbWl0IiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwib25jZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwibW9iaWxlV2ViTmF2IiwibmF2VHlwZSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyIsImlzU2ltdWxhdG9yIiwicHJlZmVyZW5jZXMiLCJ1cGRhdGVTYWZhcmlTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvd2ViLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBpc0Vycm9yVHlwZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IGNvb2tpZVV0aWxzIGZyb20gJy4uL2Nvb2tpZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgSVBIT05FX1RPUF9CQVJfSEVJR0hUID0gNzE7XG5jb25zdCBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgPSA0MTtcbmNvbnN0IElQSE9ORV9YX1NDUk9MTEVEX09GRlNFVCA9IDU1O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPUyA9IDI0O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyA9IDIwO1xuXG5jb25zdCBJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUID0gNTE7XG5jb25zdCBJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQgPSA0OTtcbmNvbnN0IFRBQl9CQVJfT0ZGU0VUID0gMzM7XG5jb25zdCBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUID0gODQ7XG5jb25zdCBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA9IDk1O1xuXG5jb25zdCBOT1RDSEVEX0RFVklDRV9TSVpFUyA9IFtcbiAge3c6IDExMjUsIGg6IDI0MzZ9LCAvLyAxMSBQcm8sIFgsIFhzXG4gIHt3OiA4MjgsIGg6IDE3OTJ9LCAvLyAxMSwgWHJcbiAge3c6IDEyNDIsIGg6IDI2ODh9LCAvLyAxMSBQcm8gTWF4LCBYcyBNYXhcbiAge3c6IDEwODAsIGg6IDIzNDB9LCAvLyAxMyBtaW5pLCAxMiBtaW5pXG4gIHt3OiAxMTcwLCBoOiAyNTMyfSwgLy8gMTQsIDEzLCAxMyBQcm8sIDEyLCAxMiBQcm9cbiAge3c6IDEyODQsIGg6IDI3Nzh9LCAvLyAxNCBQbHVzLCAxMyBQcm8gTWF4LCAxMiBQcm8gTWF4XG4gIHt3OiAxMTc5LCBoOiAyNTU2fSwgLy8gMTQgUHJvXG4gIHt3OiAxMjkwLCBoOiAyNzk2fSwgLy8gMTQgUHJvIE1heFxuXTtcblxuY29uc3QgeyBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiB9ID0gdXRpbDtcblxuY29uc3QgQVRPTV9XQUlUX1RJTUVPVVRfTVMgPSAyICogNjAwMDA7XG5jb25zdCBBVE9NX0lOSVRJQUxfV0FJVF9NUyA9IDEwMDA7XG5cbmNvbnN0IE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UID0gJ2FsZXJ0JztcblxuY29uc3QgVklTSUJMRSA9ICd2aXNpYmxlJztcbmNvbnN0IElOVklTSUJMRSA9ICdpbnZpc2libGUnO1xuY29uc3QgREVURUNUID0gJ2RldGVjdCc7XG5jb25zdCBWSVNJQklMSVRJRVMgPSBbVklTSUJMRSwgSU5WSVNJQkxFLCBERVRFQ1RdO1xuXG4vLyBUaGUgcG9zaXRpb24gb2YgU2FmYXJpJ3MgdGFiIChzZWFyY2ggYmFyKS5cbi8vIFNpbmNlIGlPUyAxNSwgdGhlIGJhciBpcyB0aGUgYm90dG9tIGJ5IGRlZmF1bHQuXG5jb25zdCBUQUJfQkFSX1BPU0lUSU9OX1RPUCA9ICd0b3AnO1xuY29uc3QgVEFCX0JBUl9QT1NJVElPTl9CT1RUT00gPSAnYm90dG9tJztcbmNvbnN0IFRBQl9CQVJfUE9TU0lUSU9OUyA9IFtUQUJfQkFSX1BPU0lUSU9OX1RPUCwgVEFCX0JBUl9QT1NJVElPTl9CT1RUT01dO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyIChpZCkge1xuICBpZiAoIV8uaXNTdHJpbmcoaWQpICYmICFfLmlzTnVtYmVyKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXy5pc1N0cmluZyhpZCkgJiYgXy5pc0VtcHR5KGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXy5pc051bWJlcihpZCkgJiYgaXNOYU4oaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb21tYW5kcy5zZXRGcmFtZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEZyYW1lIChmcmFtZSkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGlmIChfLmlzTnVsbChmcmFtZSkpIHtcbiAgICB0aGlzLmN1cldlYkZyYW1lcyA9IFtdO1xuICAgIHRoaXMubG9nLmRlYnVnKCdMZWF2aW5nIHdlYiBmcmFtZSBhbmQgZ29pbmcgYmFjayB0byBkZWZhdWx0IGNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoZnJhbWUpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZnJhbWUpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X2ZyYW1lX3dpbmRvdycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRW50ZXJpbmcgbmV3IHdlYiBmcmFtZTogJyR7dmFsdWUuV0lORE9XfSdgKTtcbiAgICB0aGlzLmN1cldlYkZyYW1lcy51bnNoaWZ0KHZhbHVlLldJTkRPVyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXRvbSA9IF8uaXNOdW1iZXIoZnJhbWUpID8gJ2ZyYW1lX2J5X2luZGV4JyA6ICdmcmFtZV9ieV9pZF9vcl9uYW1lJztcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oYXRvbSwgW2ZyYW1lXSk7XG4gICAgaWYgKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzVW5kZWZpbmVkKHZhbHVlLldJTkRPVykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRnJhbWVFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRW50ZXJpbmcgbmV3IHdlYiBmcmFtZTogJyR7dmFsdWUuV0lORE9XfSdgKTtcbiAgICB0aGlzLmN1cldlYkZyYW1lcy51bnNoaWZ0KHZhbHVlLldJTkRPVyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldENzc1Byb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3NzUHJvcGVydHkgKHByb3BlcnR5TmFtZSwgZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdmFsdWVfb2ZfY3NzX3Byb3BlcnR5JywgW2F0b21zRWxlbWVudCwgcHJvcGVydHlOYW1lXSk7XG59O1xuXG5jb21tYW5kcy5zdWJtaXQgPSBhc3luYyBmdW5jdGlvbiBzdWJtaXQgKGVsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdzdWJtaXQnLCBbYXRvbXNFbGVtZW50XSk7XG59O1xuXG5jb21tYW5kcy5yZWZyZXNoID0gYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgncmVmcmVzaCcsIFtdKTtcbn07XG5cbmNvbW1hbmRzLmdldFVybCA9IGFzeW5jIGZ1bmN0aW9uIGdldFVybCAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3RlLmV4ZWN1dGUoJ3dpbmRvdy5sb2NhdGlvbi5ocmVmJyk7XG59O1xuXG5jb21tYW5kcy50aXRsZSA9IGFzeW5jIGZ1bmN0aW9uIHRpdGxlICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgndGl0bGUnLCBbXSwgdHJ1ZSk7XG59O1xuXG5jb21tYW5kcy5zZXRDb29raWUgPSBhc3luYyBmdW5jdGlvbiBzZXRDb29raWUgKGNvb2tpZSkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvb2tpZSA9IF8uY2xvbmUoY29va2llKTtcblxuICAvLyBpZiBgcGF0aGAgZmllbGQgaXMgbm90IHNwZWNpZmllZCwgU2FmYXJpIHdpbGwgbm90IHVwZGF0ZSBjb29raWVzIGFzIGV4cGVjdGVkOyBlZyBpc3N1ZSAjMTcwOFxuICBpZiAoIWNvb2tpZS5wYXRoKSB7XG4gICAgY29va2llLnBhdGggPSAnLyc7XG4gIH1cblxuICBjb25zdCBqc0Nvb2tpZSA9IGNvb2tpZVV0aWxzLmNyZWF0ZUpTQ29va2llKGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUsIHtcbiAgICBleHBpcmVzOiBfLmlzTnVtYmVyKGNvb2tpZS5leHBpcnkpID8gKG5ldyBEYXRlKGNvb2tpZS5leHBpcnkgKiAxMDAwKSkudG9VVENTdHJpbmcoKSA6XG4gICAgICBjb29raWUuZXhwaXJ5LFxuICAgIHBhdGg6IGNvb2tpZS5wYXRoLFxuICAgIGRvbWFpbjogY29va2llLmRvbWFpbixcbiAgICBodHRwT25seTogY29va2llLmh0dHBPbmx5LFxuICAgIHNlY3VyZTogY29va2llLnNlY3VyZVxuICB9KTtcbiAgbGV0IHNjcmlwdCA9IGBkb2N1bWVudC5jb29raWUgPSAke0pTT04uc3RyaW5naWZ5KGpzQ29va2llKX1gO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtzY3JpcHQsIFtdXSk7XG59O1xuXG5oZWxwZXJzLmNhY2hlV2ViRWxlbWVudCA9IGZ1bmN0aW9uIGNhY2hlV2ViRWxlbWVudCAoZWwpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZWwpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIGNvbnN0IGVsSWQgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIWlzVmFsaWRFbGVtZW50SWRlbnRpZmllcihlbElkKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuICAvLyBJbiBuZXdlciBkZWJ1Z2dlciByZWxlYXNlcyBlbGVtZW50IGlkZW50aWZpZXJzIGxvb2sgbGlrZSBgOndkYzoxNjI4MTUxNjQ5MzI1YFxuICAvLyBXZSBhc3N1bWUgaXQgaXMgc2FmZSB0byB1c2UgdGhlc2UgdG8gaWRlbnRpZnkgY2FjaGVkIGVsZW1lbnRzXG4gIGNvbnN0IGNhY2hlSWQgPSBfLmluY2x1ZGVzKGVsSWQsICc6JykgPyBlbElkIDogdXRpbC51dWlkVjQoKTtcbiAgdGhpcy53ZWJFbGVtZW50c0NhY2hlLnNldChjYWNoZUlkLCBlbElkKTtcbiAgcmV0dXJuIHV0aWwud3JhcEVsZW1lbnQoY2FjaGVJZCk7XG59O1xuXG5oZWxwZXJzLmNhY2hlV2ViRWxlbWVudHMgPSBmdW5jdGlvbiBjYWNoZVdlYkVsZW1lbnRzIChyZXNwb25zZSkge1xuICBjb25zdCB0b0NhY2hlZCA9ICh2KSA9PiBfLmlzQXJyYXkodikgfHwgXy5pc1BsYWluT2JqZWN0KHYpXG4gICAgPyB0aGlzLmNhY2hlV2ViRWxlbWVudHModilcbiAgICA6IHY7XG5cbiAgaWYgKF8uaXNBcnJheShyZXNwb25zZSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UubWFwKHRvQ2FjaGVkKTtcbiAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QocmVzcG9uc2UpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gey4uLnJlc3BvbnNlLCAuLi4odGhpcy5jYWNoZVdlYkVsZW1lbnQocmVzcG9uc2UpKX07XG4gICAgcmV0dXJuIF8udG9QYWlycyhyZXN1bHQpLnJlZHVjZShcbiAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IHRvQ2FjaGVkKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9XG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHRlbnNpb25zLmZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyA9IGFzeW5jIGZ1bmN0aW9uIGZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyAoc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYW55LCBjdHgpIHtcbiAgY29uc3QgY29udGV4dEVsZW1lbnQgPSBfLmlzTmlsKGN0eCkgPyBudWxsIDogdGhpcy5nZXRBdG9tc0VsZW1lbnQoY3R4KTtcbiAgbGV0IGVsZW1lbnQ7XG4gIGxldCBkb0ZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oYGZpbmRfZWxlbWVudCR7bWFueSA/ICdzJyA6ICcnfWAsIFtzdHJhdGVneSwgc2VsZWN0b3IsIGNvbnRleHRFbGVtZW50XSk7XG4gICAgcmV0dXJuICFfLmlzTnVsbChlbGVtZW50KTtcbiAgfTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmltcGxpY2l0V2FpdEZvckNvbmRpdGlvbihkb0ZpbmQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UgJiYgXy5pc0Z1bmN0aW9uKGVyci5tZXNzYWdlLm1hdGNoKSAmJiBlcnIubWVzc2FnZS5tYXRjaCgvQ29uZGl0aW9uIHVubWV0LykpIHtcbiAgICAgIC8vIGNvbmRpdGlvbiB3YXMgbm90IG1ldCBzZXR0aW5nIHJlcyB0byBlbXB0eSBhcnJheVxuICAgICAgZWxlbWVudCA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1hbnkpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKGVsZW1lbnQpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkoZWxlbWVudCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaEVsZW1lbnRFcnJvcigpO1xuICB9XG4gIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMoZWxlbWVudCk7XG59O1xuXG5leHRlbnNpb25zLmNsaWNrV2ViQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gY2xpY2tXZWJDb29yZHMgKCkge1xuICBsZXQgY29vcmRzID0gYXdhaXQgdGhpcy50cmFuc2xhdGVXZWJDb29yZHModGhpcy5jdXJXZWJDb29yZHMpO1xuICBhd2FpdCB0aGlzLmNsaWNrQ29vcmRzKGNvb3Jkcyk7XG59O1xuXG5oZWxwZXJzLmV4ZWN1dGVBdG9tID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUF0b20gKGF0b20sIGFyZ3MsIGFsd2F5c0RlZmF1bHRGcmFtZSA9IGZhbHNlKSB7XG4gIGxldCBmcmFtZXMgPSBhbHdheXNEZWZhdWx0RnJhbWUgPT09IHRydWUgPyBbXSA6IHRoaXMuY3VyV2ViRnJhbWVzO1xuICBsZXQgcHJvbWlzZSA9IHRoaXMucmVtb3RlLmV4ZWN1dGVBdG9tKGF0b20sIGFyZ3MsIGZyYW1lcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JBdG9tKHByb21pc2UpO1xufTtcblxuaGVscGVycy5leGVjdXRlQXRvbUFzeW5jID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUF0b21Bc3luYyAoYXRvbSwgYXJncywgcmVzcG9uc2VVcmwpIHtcbiAgLy8gc2F2ZSB0aGUgcmVzb2x2ZSBhbmQgcmVqZWN0IG1ldGhvZHMgb2YgdGhlIHByb21pc2UgdG8gYmUgd2FpdGVkIGZvclxuICBsZXQgcHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0aGlzLmFzeW5jUHJvbWlzZSA9IHtyZXNvbHZlLCByZWplY3R9O1xuICB9KTtcbiAgYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZUF0b21Bc3luYyhhdG9tLCBhcmdzLCB0aGlzLmN1cldlYkZyYW1lcywgcmVzcG9uc2VVcmwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy53YWl0Rm9yQXRvbShwcm9taXNlKTtcbn07XG5cbmhlbHBlcnMuZ2V0QXRvbXNFbGVtZW50ID0gZnVuY3Rpb24gZ2V0QXRvbXNFbGVtZW50IChlbE9ySWQpIHtcbiAgY29uc3QgZWxJZCA9IHV0aWwudW53cmFwRWxlbWVudChlbE9ySWQpO1xuICBpZiAoIXRoaXMud2ViRWxlbWVudHNDYWNoZS5oYXMoZWxJZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIHtFTEVNRU5UOiB0aGlzLndlYkVsZW1lbnRzQ2FjaGUuZ2V0KGVsSWQpfTtcbn07XG5cbmhlbHBlcnMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMgPSBmdW5jdGlvbiBjb252ZXJ0RWxlbWVudHNGb3JBdG9tcyAoYXJncyA9IFtdKSB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKGhlbHBlcnMuaGFzRWxlbWVudElkKGFyZykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0b21zRWxlbWVudChhcmcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gXy5pc0FycmF5KGFyZykgPyB0aGlzLmNvbnZlcnRFbGVtZW50c0ZvckF0b21zKGFyZykgOiBhcmc7XG4gIH0pO1xufTtcblxuaGVscGVycy5nZXRFbGVtZW50SWQgPSBmdW5jdGlvbiBnZXRFbGVtZW50SWQgKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQuRUxFTUVOVCB8fCBlbGVtZW50W1czQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSXTtcbn07XG5cbmhlbHBlcnMuaGFzRWxlbWVudElkID0gZnVuY3Rpb24gaGFzRWxlbWVudElkIChlbGVtZW50KSB7XG4gIHJldHVybiB1dGlsLmhhc1ZhbHVlKGVsZW1lbnQpICYmICh1dGlsLmhhc1ZhbHVlKGVsZW1lbnQuRUxFTUVOVCkgfHwgdXRpbC5oYXNWYWx1ZShlbGVtZW50W1czQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSXSkpO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlJc0lwaG9uZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNhZmFyaUlzSXBob25lICgpIHtcbiAgaWYgKF8uaXNCb29sZWFuKHRoaXMuX2lzU2FmYXJpSXBob25lKSkge1xuICAgIHJldHVybiB0aGlzLl9pc1NhZmFyaUlwaG9uZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgncmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQnKTtcbiAgICB0aGlzLl9pc1NhZmFyaUlwaG9uZSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpcGhvbmUnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGZpbmQgZGV2aWNlIHR5cGUgZnJvbSB1c2VyYWdlbnQuIEFzc3VtaW5nIGlQaG9uZWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBFcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gdGhpcy5faXNTYWZhcmlJcGhvbmUgPz8gdHJ1ZTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0U2FmYXJpRGV2aWNlU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNhZmFyaURldmljZVNpemUgKCkge1xuICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIHtoZWlnaHQ6IHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgd2lkdGg6IHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfTsnO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoc2NyaXB0KTtcbiAgY29uc3QgW25vcm1IZWlnaHQsIG5vcm1XaWR0aF0gPSBoZWlnaHQgPiB3aWR0aCA/IFtoZWlnaHQsIHdpZHRoXSA6IFt3aWR0aCwgaGVpZ2h0XTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbm9ybVdpZHRoLFxuICAgIGhlaWdodDogbm9ybUhlaWdodCxcbiAgfTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0U2FmYXJpSXNOb3RjaGVkID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpSXNOb3RjaGVkICgpIHtcbiAgaWYgKF8uaXNCb29sZWFuKHRoaXMuX2lzU2FmYXJpTm90Y2hlZCkpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTYWZhcmlOb3RjaGVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmdldFNhZmFyaURldmljZVNpemUoKTtcbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBOT1RDSEVEX0RFVklDRV9TSVpFUykge1xuICAgICAgaWYgKGRldmljZS53ID09PSB3aWR0aCAmJiBkZXZpY2UuaCA9PT0gaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2lzU2FmYXJpTm90Y2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZmluZCBkZXZpY2UgdHlwZSBmcm9tIGRpbWVuc2lvbnMuIEFzc3VtaW5nIHRoZSBkZXZpY2UgaXMgbm90IG5vdGNoZWRgKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2lzU2FmYXJpTm90Y2hlZCA/PyBmYWxzZTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0RXh0cmFUcmFuc2xhdGVXZWJDb29yZHNPZmZzZXQgPSBhc3luYyBmdW5jdGlvbiBnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCAod3ZQb3MsIHJlYWxEaW1zKSB7XG4gIGxldCB0b3BPZmZzZXQgPSAwO1xuICBsZXQgYm90dG9tT2Zmc2V0ID0gMDtcblxuICBjb25zdCBpc0lwaG9uZSA9IGF3YWl0IHRoaXMuZ2V0U2FmYXJpSXNJcGhvbmUoKTtcblxuICAvLyBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIFNtYXJ0IEFwcCBCYW5uZXIgb3IgVGFiIEJhciBpcyB2aXNpYmxlIG9yIG5vdFxuICAvLyBpZiBhbHJlYWR5IGRlZmluZWQgYnkgbmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSBvciBuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkgaW4gc2V0dGluZ3MuXG4gIGNvbnN0IHtcbiAgICBuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5LFxuICAgIG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSxcbiAgICBzYWZhcmlUYWJCYXJQb3NpdGlvbiA9IHV0aWwuY29tcGFyZVZlcnNpb25zKHRoaXMub3B0cy5wbGF0Zm9ybVZlcnNpb24sICc+PScsICcxNS4wJykgJiYgaXNJcGhvbmVcbiAgICAgID8gVEFCX0JBUl9QT1NJVElPTl9CT1RUT00gOiBUQUJfQkFSX1BPU0lUSU9OX1RPUCxcbiAgfSA9IGF3YWl0IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgbGV0IHRhYkJhclZpc2liaWxpdHkgPSBfLmxvd2VyQ2FzZShuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5KTtcbiAgbGV0IGJhbm5lclZpc2liaWxpdHkgPSBfLmxvd2VyQ2FzZShuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkpO1xuICBjb25zdCB0YWJCYXJQb3NpdGlvbiA9IF8ubG93ZXJDYXNlKHNhZmFyaVRhYkJhclBvc2l0aW9uKTtcblxuICBpZiAoIVZJU0lCSUxJVElFUy5pbmNsdWRlcyh0YWJCYXJWaXNpYmlsaXR5KSkge1xuICAgIHRhYkJhclZpc2liaWxpdHkgPSBERVRFQ1Q7XG4gIH1cbiAgaWYgKCFWSVNJQklMSVRJRVMuaW5jbHVkZXMoYmFubmVyVmlzaWJpbGl0eSkpIHtcbiAgICBiYW5uZXJWaXNpYmlsaXR5ID0gREVURUNUO1xuICB9XG5cbiAgaWYgKCFUQUJfQkFSX1BPU1NJVElPTlMuaW5jbHVkZXModGFiQmFyUG9zaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGAke3NhZmFyaVRhYkJhclBvc2l0aW9ufSBpcyBpbnZhbGlkIGFzIFNhZmFyaSB0YWIgYmFyIHBvc2l0aW9uLiBBdmFpbGFibGUgcG9zaXRpb25zIGFyZSAke1RBQl9CQVJfUE9TU0lUSU9OU30uYCk7XG4gIH1cblxuICBjb25zdCBpc05vdGNoZWQgPSBpc0lwaG9uZSAmJiBhd2FpdCB0aGlzLmdldFNhZmFyaUlzTm90Y2hlZCgpO1xuXG4gIGNvbnN0IG9yaWVudGF0aW9uID0gcmVhbERpbXMuaCA+IHJlYWxEaW1zLncgPyAnUE9SVFJBSVQnIDogJ0xBTkRTQ0FQRSc7XG5cbiAgY29uc3Qgbm90Y2hPZmZzZXQgPSBpc05vdGNoZWRcbiAgICA/IHV0aWwuY29tcGFyZVZlcnNpb25zKHRoaXMub3B0cy5wbGF0Zm9ybVZlcnNpb24sICc9JywgJzEzLjAnKVxuICAgICAgPyBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TXzEzXG4gICAgICA6IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1NcbiAgICA6IDA7XG5cbiAgY29uc3QgaXNTY3JvbGxlZCA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgncmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPiAwJyk7XG4gIGlmIChpc1Njcm9sbGVkKSB7XG4gICAgdG9wT2Zmc2V0ID0gSVBIT05FX1NDUk9MTEVEX1RPUF9CQVJfSEVJR0hUICsgbm90Y2hPZmZzZXQ7XG5cbiAgICBpZiAoaXNOb3RjaGVkKSB7XG4gICAgICB0b3BPZmZzZXQgLT0gSVBIT05FX1hfU0NST0xMRURfT0ZGU0VUO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpUGhvbmUgaXMgbGFuZHNjYXBlIHRoZW4gdGhlcmUgaXMgbm8gdG9wIGJhclxuICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0xBTkRTQ0FQRScgJiYgaXNJcGhvbmUpIHtcbiAgICAgIHRvcE9mZnNldCA9IDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRvcE9mZnNldCA9IHRhYkJhclBvc2l0aW9uID09PSBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA/IDAgOiBJUEhPTkVfVE9QX0JBUl9IRUlHSFQ7XG4gICAgdG9wT2Zmc2V0ICs9IG5vdGNoT2Zmc2V0O1xuICAgIHRoaXMubG9nLmRlYnVnKGB0YWJCYXJQb3NpdGlvbiBhbmQgdG9wT2Zmc2V0OiAke3RhYkJhclBvc2l0aW9ufSwgJHt0b3BPZmZzZXR9YCk7XG5cbiAgICBpZiAoaXNJcGhvbmUpIHtcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ1BPUlRSQUlUJykge1xuICAgICAgICAvLyBUaGUgYm90dG9tIGJhciBpcyBvbmx5IHZpc2libGUgd2hlbiBwb3J0cmFpdFxuICAgICAgICBib3R0b21PZmZzZXQgPSBJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b3BPZmZzZXQgPSBJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0xBTkRTQ0FQRScgfHwgIWlzSXBob25lKSB7XG4gICAgICBpZiAodGFiQmFyVmlzaWJpbGl0eSA9PT0gVklTSUJMRSkge1xuICAgICAgICB0b3BPZmZzZXQgKz0gVEFCX0JBUl9PRkZTRVQ7XG4gICAgICB9IGVsc2UgaWYgKHRhYkJhclZpc2liaWxpdHkgPT09IERFVEVDVCkge1xuICAgICAgICAvLyBUYWJzIG9ubHkgYXBwZWFyIGlmIHRoZSBkZXZpY2UgaXMgbGFuZHNjYXBlIG9yIGlmIGl0J3MgYW4gaVBhZCBzbyB3ZSBvbmx5IGNoZWNrIHZpc2liaWxpdHkgaW4gdGhpcyBjYXNlXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IGVhY2ggdGFiIGJhciBpcyBhIFdlYlZpZXdcbiAgICAgICAgY29uc3QgY29udGV4dHNBbmRWaWV3cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cygpO1xuICAgICAgICBjb25zdCB0YWJzID0gY29udGV4dHNBbmRWaWV3cy5maWx0ZXIoKGN0eCkgPT4gY3R4LmlkLnN0YXJ0c1dpdGgoJ1dFQlZJRVdfJykpO1xuXG4gICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm91bmQgJHt0YWJzLmxlbmd0aH0gdGFicy4gQXNzdW1pbmcgdGhlIHRhYiBiYXIgaXMgdmlzaWJsZWApO1xuICAgICAgICAgIHRvcE9mZnNldCArPSBUQUJfQkFSX09GRlNFVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvcE9mZnNldCArPSBhd2FpdCB0aGlzLmdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0KGlzSXBob25lLCBiYW5uZXJWaXNpYmlsaXR5KTtcblxuICB3dlBvcy55ICs9IHRvcE9mZnNldDtcbiAgcmVhbERpbXMuaCAtPSAodG9wT2Zmc2V0ICsgYm90dG9tT2Zmc2V0KTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQgPSBhc3luYyBmdW5jdGlvbiBnZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldCAoaXNJcGhvbmUsIGJhbm5lclZpc2liaWxpdHkpIHtcbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgaWYgKGJhbm5lclZpc2liaWxpdHkgPT09IFZJU0lCTEUpIHtcbiAgICBvZmZzZXQgKz0gaXNJcGhvbmUgP1xuICAgICAgSVBIT05FX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA6XG4gICAgICBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVDtcbiAgfSBlbHNlIGlmIChiYW5uZXJWaXNpYmlsaXR5ID09PSBERVRFQ1QpIHtcbiAgICAvLyB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIFNtYXJ0IEFwcCBCYW5uZXJcbiAgICBjb25zdCBiYW5uZXJzID0gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnQ2xvc2UgYXBwIGRvd25sb2FkIG9mZmVyJywgdHJ1ZSk7XG4gICAgaWYgKGJhbm5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgb2Zmc2V0ICs9IGlzSXBob25lID9cbiAgICAgICAgSVBIT05FX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA6XG4gICAgICAgIElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMubG9nLmRlYnVnKGBBZGRpdGlvbmFsIG5hdGl2ZSB3ZWIgdGFwIG9mZnNldCBjb21wdXRlZDogJHtvZmZzZXR9YCk7XG4gIHJldHVybiBvZmZzZXQ7XG59O1xuXG5hc3luYyBmdW5jdGlvbiB0YXBXZWJFbGVtZW50TmF0aXZlbHkgKGRyaXZlciwgYXRvbXNFbGVtZW50KSB7XG4gIC8vIHRyeSB0byBnZXQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgYWNjZXNzaWJsZSBpbiB0aGVcbiAgLy8gbmF0aXZlIGNvbnRleHRcbiAgdHJ5IHtcbiAgICBsZXQgdGV4dCA9IGF3YWl0IGRyaXZlci5leGVjdXRlQXRvbSgnZ2V0X3RleHQnLCBbYXRvbXNFbGVtZW50XSk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVBdG9tKCdnZXRfYXR0cmlidXRlX3ZhbHVlJywgW2F0b21zRWxlbWVudCwgJ3ZhbHVlJ10pO1xuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdhY2Nlc3NpYmlsaXR5IGlkJywgdGV4dCwgdHJ1ZSk7XG4gICAgICBpZiAoZWxzLmxlbmd0aCA9PT0gMSB8fCBlbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZWxzWzBdO1xuICAgICAgICAvLyB1c2UgdGFwIGJlY2F1c2Ugb24gaU9TIDExLjIgYW5kIGJlbG93IGBuYXRpdmVDbGlja2AgY3Jhc2hlcyBXREFcbiAgICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IGRyaXZlci5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsKX0vcmVjdGAsICdHRVQnKTtcbiAgICAgICAgaWYgKGVscy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBlbDIgPSBlbHNbMV07XG4gICAgICAgICAgY29uc3QgcmVjdDIgPSBhd2FpdCBkcml2ZXIucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke3V0aWwudW53cmFwRWxlbWVudChlbDIpfS9yZWN0YCwgJ0dFVCcpO1xuXG4gICAgICAgICAgaWYgKChyZWN0LnggIT09IHJlY3QyLnggfHwgcmVjdC55ICE9PSByZWN0Mi55KSB8fFxuICAgICAgICAgIChyZWN0LndpZHRoICE9PSByZWN0Mi53aWR0aCB8fCByZWN0LmhlaWdodCAhPT0gcmVjdDIuaGVpZ2h0KSkge1xuICAgICAgICAgICAgLy8gVGhlc2UgMiBuYXRpdmUgZWxlbWVudHMgYXJlIG5vdCByZWZlcnJpbmcgdG8gdGhlIHNhbWUgd2ViIGVsZW1lbnRcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29vcmRzID0ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQocmVjdC54ICsgcmVjdC53aWR0aCAvIDIpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQocmVjdC55ICsgcmVjdC5oZWlnaHQgLyAyKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrQ29vcmRzKGNvb3Jkcyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gYW55IGZhaWx1cmUgc2hvdWxkIGZhbGwgdGhyb3VnaCBhbmQgdHJpZ2dlciB0aGUgbW9yZSBlbGFib3JhdGVcbiAgICAvLyBtZXRob2Qgb2YgY2xpY2tpbmdcbiAgICBkcml2ZXIubG9nLndhcm4oYEVycm9yIGF0dGVtcHRpbmcgdG8gY2xpY2s6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHRlbnNpb25zLm5hdGl2ZVdlYlRhcCA9IGFzeW5jIGZ1bmN0aW9uIG5hdGl2ZVdlYlRhcCAoZWwpIHtcbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuXG4gIC8vIGlmIHN0cmljdCBuYXRpdmUgdGFwLCBkbyBub3QgdHJ5IHRvIGRvIGl0IHdpdGggV0RBIGRpcmVjdGx5XG4gIGlmICghKGF3YWl0IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKSkubmF0aXZlV2ViVGFwU3RyaWN0ICYmIGF3YWl0IHRhcFdlYkVsZW1lbnROYXRpdmVseSh0aGlzLCBhdG9tc0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubG9nLndhcm4oJ1VuYWJsZSB0byBkbyBzaW1wbGUgbmF0aXZlIHdlYiB0YXAuIEF0dGVtcHRpbmcgdG8gY29udmVydCBjb29yZGluYXRlcycpO1xuXG4gIC8vIGBnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXNgIHJldHVybnMgdGhlIHdyb25nIHZhbHVlIHNvbWV0aW1lcyxcbiAgLy8gdW5sZXNzIHdlIHByZS1jYWxsIGJvdGggb2YgdGhlc2UgZnVuY3Rpb25zIGJlZm9yZSB0aGUgYWN0dWFsIGNhbGxzXG4gIGF3YWl0IEIuUHJvbWlzZS5hbGwoW1xuICAgIHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pLFxuICAgIHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKSxcbiAgXSk7XG5cbiAgY29uc3QgW3NpemUsIGNvb3JkaW5hdGVzXSA9IGF3YWl0IEIuUHJvbWlzZS5hbGwoW1xuICAgIHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pLFxuICAgIHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKSxcbiAgXSk7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHNpemU7XG4gIGxldCB7eCwgeX0gPSBjb29yZGluYXRlcztcbiAgeCArPSB3aWR0aCAvIDI7XG4gIHkgKz0gaGVpZ2h0IC8gMjtcblxuICB0aGlzLmN1cldlYkNvb3JkcyA9IHt4LCB5fTtcbiAgYXdhaXQgdGhpcy5jbGlja1dlYkNvb3JkcygpO1xufTtcblxuZXh0ZW5zaW9ucy5jbGlja0Nvb3JkcyA9IGFzeW5jIGZ1bmN0aW9uIGNsaWNrQ29vcmRzIChjb29yZHMpIHtcbiAgYXdhaXQgdGhpcy5wZXJmb3JtVG91Y2goW1xuICAgIHtcbiAgICAgIGFjdGlvbjogJ3RhcCcsXG4gICAgICBvcHRpb25zOiBjb29yZHMsXG4gICAgfSxcbiAgXSk7XG59O1xuXG5leHRlbnNpb25zLnRyYW5zbGF0ZVdlYkNvb3JkcyA9IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZVdlYkNvb3JkcyAoY29vcmRzKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBUcmFuc2xhdGluZyBjb29yZGluYXRlcyAoJHtKU09OLnN0cmluZ2lmeShjb29yZHMpfSkgdG8gd2ViIGNvb3JkaW5hdGVzYCk7XG5cbiAgLy8gYWJzb2x1dGl6ZSB3ZWIgY29vcmRzXG4gIGxldCB3ZWJ2aWV3O1xuICB0cnkge1xuICAgIHdlYnZpZXcgPSBhd2FpdCByZXRyeUludGVydmFsKDUsIDEwMCwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlV2ViVmlldycsIGZhbHNlKSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBpZiAoIXdlYnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIFdlYlZpZXcgZm91bmQuIFVuYWJsZSB0byB0cmFuc2xhdGUgd2ViIGNvb3JkaW5hdGVzIGZvciBuYXRpdmUgd2ViIHRhcC5gKTtcbiAgfVxuXG4gIHdlYnZpZXcgPSB1dGlsLnVud3JhcEVsZW1lbnQod2Vidmlldyk7XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke3dlYnZpZXd9L3JlY3RgLCAnR0VUJyk7XG4gIGNvbnN0IHd2UG9zID0ge3g6IHJlY3QueCwgeTogcmVjdC55fTtcbiAgY29uc3QgcmVhbERpbXMgPSB7dzogcmVjdC53aWR0aCwgaDogcmVjdC5oZWlnaHR9O1xuXG4gIGNvbnN0IGNtZCA9ICcoZnVuY3Rpb24gKCkgeyByZXR1cm4ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9OyB9KSgpJztcbiAgY29uc3Qgd3ZEaW1zID0gYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZShjbWQpO1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgaW1wbGljaXQgd2FpdCwgYW5kIHNldCBsb2NhbGx5IHRvIDBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0OTg4XG4gIGNvbnN0IGltcGxpY2l0V2FpdE1zID0gdGhpcy5pbXBsaWNpdFdhaXRNcztcbiAgYXdhaXQgdGhpcy5zZXRJbXBsaWNpdFdhaXQoMCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5nZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCh3dlBvcywgcmVhbERpbXMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHRoaXMuc2V0SW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zKTtcbiAgfVxuXG4gIGlmICh3dkRpbXMgJiYgcmVhbERpbXMgJiYgd3ZQb3MpIHtcbiAgICBsZXQgeFJhdGlvID0gcmVhbERpbXMudyAvIHd2RGltcy53O1xuICAgIGxldCB5UmF0aW8gPSByZWFsRGltcy5oIC8gd3ZEaW1zLmg7XG4gICAgbGV0IG5ld0Nvb3JkcyA9IHtcbiAgICAgIHg6IHd2UG9zLnggKyBNYXRoLnJvdW5kKHhSYXRpbyAqIGNvb3Jkcy54KSxcbiAgICAgIHk6IHd2UG9zLnkgKyBNYXRoLnJvdW5kKHlSYXRpbyAqIGNvb3Jkcy55KSxcbiAgICB9O1xuXG4gICAgLy8gYWRkaXRpb25hbCBsb2dnaW5nIGZvciBjb29yZGluYXRlcywgc2luY2UgaXQgaXMgc29tZXRpbWVzIGJyb2tlblxuICAgIC8vICAgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy85MTU5XG4gICAgdGhpcy5sb2cuZGVidWcoYENvbnZlcnRlZCBjb29yZGluYXRlczogJHtKU09OLnN0cmluZ2lmeShuZXdDb29yZHMpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgcmVjdDogJHtKU09OLnN0cmluZ2lmeShyZWN0KX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHd2UG9zOiAke0pTT04uc3RyaW5naWZ5KHd2UG9zKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHJlYWxEaW1zOiAke0pTT04uc3RyaW5naWZ5KHJlYWxEaW1zKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHd2RGltczogJHtKU09OLnN0cmluZ2lmeSh3dkRpbXMpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgeFJhdGlvOiAke0pTT04uc3RyaW5naWZ5KHhSYXRpbyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICB5UmF0aW86ICR7SlNPTi5zdHJpbmdpZnkoeVJhdGlvKX1gKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKGBDb252ZXJ0ZWQgd2ViIGNvb3JkcyAke0pTT04uc3RyaW5naWZ5KGNvb3Jkcyl9IGAgK1xuICAgICAgYGludG8gcmVhbCBjb29yZHMgJHtKU09OLnN0cmluZ2lmeShuZXdDb29yZHMpfWApO1xuICAgIHJldHVybiBuZXdDb29yZHM7XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuY2hlY2tGb3JBbGVydCA9IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRm9yQWxlcnQgKCkge1xuICByZXR1cm4gXy5pc1N0cmluZyhhd2FpdCB0aGlzLmdldEFsZXJ0VGV4dCgpKTtcbn07XG5cbmV4dGVuc2lvbnMud2FpdEZvckF0b20gPSBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXRvbSAocHJvbWlzZSkge1xuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuXG4gIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGFsZXJ0IHdoaWxlIHRoZSBhdG9tIGlzIGJlaW5nIGV4ZWN1dGVkLlxuICAvLyBzbyBub3RpZnkgb3Vyc2VsdmVzIHdoZW4gaXQgaGFwcGVuc1xuICBjb25zdCB0aW1lZEF0b21Qcm9taXNlID0gQi5yZXNvbHZlKHByb21pc2UpLnRpbWVvdXQoQVRPTV9XQUlUX1RJTUVPVVRfTVMpO1xuICBjb25zdCBoYW5kbGVQcm9taXNlRXJyb3IgPSBhc3luYyAocCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSAoZXJyIGluc3RhbmNlb2YgQi5BZ2dyZWdhdGVFcnJvcikgPyBlcnJbMF0gOiBlcnI7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRXJyb3IgcmVjZWl2ZWQgd2hpbGUgZXhlY3V0aW5nIGF0b206ICR7b3JpZ2luYWxFcnJvci5tZXNzYWdlfWApO1xuICAgICAgaWYgKG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBCLlRpbWVvdXRFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpZCBub3QgZ2V0IGFueSByZXNwb25zZSBmb3IgYXRvbSBleGVjdXRpb24gYWZ0ZXIgYCArXG4gICAgICAgICAgYCR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbiAgLy8gaWYgdGhlIGF0b20gcHJvbWlzZSBpcyBmdWxmaWxsZWQgd2l0aGluIEFUT01fSU5JVElBTF9XQUlUX01TXG4gIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgYW4gYWxlcnQgcHJlc2VuY2VcbiAgYXdhaXQgaGFuZGxlUHJvbWlzZUVycm9yKEIuYW55KFtCLmRlbGF5KEFUT01fSU5JVElBTF9XQUlUX01TKSwgdGltZWRBdG9tUHJvbWlzZV0pKTtcbiAgaWYgKHRpbWVkQXRvbVByb21pc2UuaXNGdWxmaWxsZWQoKSkge1xuICAgIHJldHVybiBhd2FpdCB0aW1lZEF0b21Qcm9taXNlO1xuICB9XG5cbiAgLy8gLi4ub3RoZXJ3aXNlIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyB1bmV4cGVjdGVkIGFsZXJ0IGNvdmVyaW5nIHRoZSBlbGVtZW50XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KHRoaXMuX3dhaXRpbmdBdG9tcykpIHtcbiAgICB0aGlzLl93YWl0aW5nQXRvbXMgPSB7XG4gICAgICBjb3VudDogMCxcbiAgICAgIGFsZXJ0Tm90aWZpZXI6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgIGFsZXJ0TW9uaXRvcjogQi5yZXNvbHZlKCksXG4gICAgfTtcbiAgfVxuICB0aGlzLl93YWl0aW5nQXRvbXMuY291bnQrKztcblxuICBsZXQgb25BbGVydENhbGxiYWNrO1xuICB0cnkge1xuICAgIC8vIG9ubHkgcmVzdGFydCB0aGUgbW9uaXRvciBpZiBpdCBpcyBub3QgcnVubmluZyBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE1vbml0b3IuaXNSZXNvbHZlZCgpKSB7XG4gICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnRNb25pdG9yID0gQi5yZXNvbHZlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlICh0aGlzLl93YWl0aW5nQXRvbXMuY291bnQgPiAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrRm9yQWxlcnQoKSkge1xuICAgICAgICAgICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5lbWl0KE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgICAgYXdhaXQgQi5kZWxheShBVE9NX0lOSVRJQUxfV0FJVF9NUyAvIDIpO1xuICAgICAgICB9XG4gICAgICB9KSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgb25BbGVydENhbGxiYWNrID0gKCkgPT4gcmVqZWN0KG5ldyBlcnJvcnMuVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yKCkpO1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIub25jZShPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCwgb25BbGVydENhbGxiYWNrKTtcbiAgICAgIGhhbmRsZVByb21pc2VFcnJvcih0aW1lZEF0b21Qcm9taXNlKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgICAgICAudGhlbihyZXNvbHZlKVxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob25BbGVydENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5yZW1vdmVMaXN0ZW5lcihPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCwgb25BbGVydENhbGxiYWNrKTtcbiAgICB9XG4gICAgdGhpcy5fd2FpdGluZ0F0b21zLmNvdW50LS07XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMubW9iaWxlV2ViTmF2ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlV2ViTmF2IChuYXZUeXBlKSB7XG4gIHRoaXMucmVtb3RlLmFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW2BoaXN0b3J5LiR7bmF2VHlwZX0oKTtgLCBudWxsXSk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5yZW1vdGUuYWxsb3dOYXZpZ2F0aW9uV2l0aG91dFJlbG9hZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNhZmFyaU9wdHNcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcmVmZXJlbmNlcyBBbiBvYmplY3QgY29udGFpbmluZyBTYWZhcmkgc2V0dGluZ3MgdG8gYmUgdXBkYXRlZC5cbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzZXR0aW5nIG5hbWVzIGFuZCB0aGVpciB2YWx1ZXMgY291bGQgYmUgcmV0cmlldmVkIGJ5XG4gKiBjaGFuZ2luZyB0aGUgY29ycmVzcG9uZGluZyBTYWZhcmkgc2V0dGluZ3MgaW4gdGhlIFVJIGFuZCB0aGVuIGluc3BlY3RpbmdcbiAqICdMaWJyYXJ5L1ByZWZlcmVuY2VzL2NvbS5hcHBsZS5tb2JpbGVzYWZhcmkucGxpc3QnIGZpbGUgaW5zaWRlIG9mXG4gKiBjb20uYXBwbGUubW9iaWxlc2FmYXJpIGFwcCBjb250YWluZXIuXG4gKiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBNb2JpbGUgU2FmYXJpJ3MgY29udGFpbmVyIGNvdWxkIGJlIHJldHJpZXZlZCBmcm9tXG4gKiBgeGNydW4gc2ltY3RsIGdldF9hcHBfY29udGFpbmVyIDxzaW1fdWRpZD4gY29tLmFwcGxlLm1vYmlsZXNhZmFyaSBkYXRhYFxuICogY29tbWFuZCBvdXRwdXQuXG4gKiBVc2UgdGhlIGB4Y3J1biBzaW1jdGwgc3Bhd24gPHNpbV91ZGlkPiBkZWZhdWx0cyByZWFkIDxwYXRoX3RvX3BsaXN0PmAgY29tbWFuZFxuICogdG8gcHJpbnQgdGhlIHBsaXN0IGNvbnRlbnQgdG8gdGhlIFRlcm1pbmFsLlxuICovXG5cbi8qKlxuICogVXBkYXRlcyBwcmVmZXJlbmNlcyBvZiBNb2JpbGUgU2FmYXJpIG9uIFNpbXVsYXRvclxuICpcbiAqIEBwYXJhbSB7U2FmYXJpT3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVwZGF0ZVNhZmFyaVByZWZlcmVuY2VzIChvcHRzID0ge30pIHtcbiAgaWYgKCF0aGlzLmlzU2ltdWxhdG9yKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZXh0ZW5zaW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBTaW11bGF0b3InKTtcbiAgfVxuICBjb25zdCB7IHByZWZlcmVuY2VzIH0gPSBvcHRzO1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChwcmVmZXJlbmNlcykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdcInByZWZlcmVuY2VzXCIgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICB9XG5cbiAgdGhpcy5sb2cuZGVidWcoYEFib3V0IHRvIHVwZGF0ZSBTYWZhcmkgcHJlZmVyZW5jZXM6ICR7SlNPTi5zdHJpbmdpZnkocHJlZmVyZW5jZXMpfWApO1xuICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLnVwZGF0ZVNhZmFyaVNldHRpbmdzKHByZWZlcmVuY2VzKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oY29tbWFuZHMsIGV4dGVuc2lvbnMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxTQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFILHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFQLE9BQUE7QUFFQSxNQUFNUSxxQkFBcUIsR0FBRyxFQUFFO0FBQ2hDLE1BQU1DLDhCQUE4QixHQUFHLEVBQUU7QUFDekMsTUFBTUMsd0JBQXdCLEdBQUcsRUFBRTtBQUNuQyxNQUFNQyx5QkFBeUIsR0FBRyxFQUFFO0FBQ3BDLE1BQU1DLDRCQUE0QixHQUFHLEVBQUU7QUFFdkMsTUFBTUMsK0JBQStCLEdBQUcsRUFBRTtBQUMxQyxNQUFN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
571
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXN5bmNib3giLCJyZXF1aXJlIiwiX3N1cHBvcnQiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ibHVlYmlyZCIsIl9kcml2ZXIiLCJfY29va2llcyIsIl9ldmVudHMiLCJJUEhPTkVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQiLCJJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyIsIklQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQiLCJUQUJfQkFSX09GRlNFVCIsIklQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCIsIk5PVENIRURfREVWSUNFX1NJWkVTIiwidyIsImgiLCJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJBVE9NX1dBSVRfVElNRU9VVF9NUyIsIkFUT01fSU5JVElBTF9XQUlUX01TIiwiT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQiLCJPTl9BUFBfQ1JBU0hfRVZFTlQiLCJWSVNJQkxFIiwiSU5WSVNJQkxFIiwiREVURUNUIiwiVklTSUJJTElUSUVTIiwiVEFCX0JBUl9QT1NJVElPTl9UT1AiLCJUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSIsIlRBQl9CQVJfUE9TU0lUSU9OUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIiLCJpZCIsIl8iLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNFbXB0eSIsImlzTmFOIiwic2V0RnJhbWUiLCJmcmFtZSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJpc051bGwiLCJjdXJXZWJGcmFtZXMiLCJsb2ciLCJkZWJ1ZyIsImhhc0VsZW1lbnRJZCIsImF0b21zRWxlbWVudCIsImdldEF0b21zRWxlbWVudCIsInZhbHVlIiwiZXhlY3V0ZUF0b20iLCJXSU5ET1ciLCJ1bnNoaWZ0IiwiYXRvbSIsImlzVW5kZWZpbmVkIiwiTm9TdWNoRnJhbWVFcnJvciIsImdldENzc1Byb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiZWwiLCJzdWJtaXQiLCJyZWZyZXNoIiwiZ2V0VXJsIiwicmVtb3RlIiwiZXhlY3V0ZSIsInRpdGxlIiwic2V0Q29va2llIiwiY29va2llIiwiY2xvbmUiLCJwYXRoIiwianNDb29raWUiLCJjb29raWVVdGlscyIsImNyZWF0ZUpTQ29va2llIiwibmFtZSIsImV4cGlyZXMiLCJleHBpcnkiLCJEYXRlIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJodHRwT25seSIsInNlY3VyZSIsInNjcmlwdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYWNoZVdlYkVsZW1lbnQiLCJpc1BsYWluT2JqZWN0IiwiZWxJZCIsInVud3JhcEVsZW1lbnQiLCJjYWNoZUlkIiwiaW5jbHVkZXMiLCJ1dWlkVjQiLCJ3ZWJFbGVtZW50c0NhY2hlIiwic2V0Iiwid3JhcEVsZW1lbnQiLCJjYWNoZVdlYkVsZW1lbnRzIiwicmVzcG9uc2UiLCJ0b0NhY2hlZCIsInYiLCJpc0FycmF5IiwibWFwIiwicmVzdWx0IiwidG9QYWlycyIsInJlZHVjZSIsImFjYyIsImtleSIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYW55IiwiY3R4IiwiY29udGV4dEVsZW1lbnQiLCJpc05pbCIsImVsZW1lbnQiLCJkb0ZpbmQiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJlcnIiLCJtZXNzYWdlIiwiaXNGdW5jdGlvbiIsIm1hdGNoIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiY2xpY2tXZWJDb29yZHMiLCJjb29yZHMiLCJ0cmFuc2xhdGVXZWJDb29yZHMiLCJjdXJXZWJDb29yZHMiLCJjbGlja0Nvb3JkcyIsImFyZ3MiLCJhbHdheXNEZWZhdWx0RnJhbWUiLCJmcmFtZXMiLCJwcm9taXNlIiwid2FpdEZvckF0b20iLCJleGVjdXRlQXRvbUFzeW5jIiwicmVzcG9uc2VVcmwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImFzeW5jUHJvbWlzZSIsImVsT3JJZCIsImhhcyIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRUxFTUVOVCIsImdldCIsImNvbnZlcnRFbGVtZW50c0ZvckF0b21zIiwiYXJnIiwiaXNFcnJvclR5cGUiLCJnZXRFbGVtZW50SWQiLCJoYXNWYWx1ZSIsImdldFNhZmFyaUlzSXBob25lIiwiaXNCb29sZWFuIiwiX2lzU2FmYXJpSXBob25lIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJ3YXJuIiwiZ2V0U2FmYXJpRGV2aWNlU2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwibm9ybUhlaWdodCIsIm5vcm1XaWR0aCIsImdldFNhZmFyaUlzTm90Y2hlZCIsIl9pc1NhZmFyaU5vdGNoZWQiLCJkZXZpY2UiLCJnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCIsInd2UG9zIiwicmVhbERpbXMiLCJ0b3BPZmZzZXQiLCJib3R0b21PZmZzZXQiLCJpc0lwaG9uZSIsIm5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkiLCJuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkiLCJzYWZhcmlUYWJCYXJQb3NpdGlvbiIsImNvbXBhcmVWZXJzaW9ucyIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwidGFiQmFyVmlzaWJpbGl0eSIsImxvd2VyQ2FzZSIsImJhbm5lclZpc2liaWxpdHkiLCJ0YWJCYXJQb3NpdGlvbiIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNOb3RjaGVkIiwib3JpZW50YXRpb24iLCJub3RjaE9mZnNldCIsImlzU2Nyb2xsZWQiLCJjb250ZXh0c0FuZFZpZXdzIiwiZ2V0Q29udGV4dHNBbmRWaWV3cyIsInRhYnMiLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwiZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQiLCJ5Iiwib2Zmc2V0IiwiYmFubmVycyIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsInRhcFdlYkVsZW1lbnROYXRpdmVseSIsImRyaXZlciIsInRleHQiLCJlbHMiLCJyZWN0IiwicHJveHlDb21tYW5kIiwiZWwyIiwicmVjdDIiLCJ4IiwiTWF0aCIsInJvdW5kIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiUHJvbWlzZSIsImFsbCIsInNpemUiLCJjb29yZGluYXRlcyIsInBlcmZvcm1Ub3VjaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJ3ZWJ2aWV3IiwicmV0cnlJbnRlcnZhbCIsImlnbiIsIkVycm9yIiwiY21kIiwid3ZEaW1zIiwiaW1wbGljaXRXYWl0TXMiLCJzZXRJbXBsaWNpdFdhaXQiLCJ4UmF0aW8iLCJ5UmF0aW8iLCJuZXdDb29yZHMiLCJjaGVja0ZvckFsZXJ0IiwiZ2V0QWxlcnRUZXh0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidGltZWRBdG9tUHJvbWlzZSIsInRpbWVvdXQiLCJoYW5kbGVQcm9taXNlRXJyb3IiLCJwIiwib3JpZ2luYWxFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiVGltZW91dEVycm9yIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJhbnkiLCJkZWxheSIsImlzRnVsZmlsbGVkIiwiX3dhaXRpbmdBdG9tcyIsImNvdW50IiwiYWxlcnROb3RpZmllciIsIkV2ZW50RW1pdHRlciIsImFsZXJ0TW9uaXRvciIsIm9uQWxlcnRDYWxsYmFjayIsIm9uQXBwQ3Jhc2hDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJlbWl0IiwiSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yIiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwib25jZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwibW9iaWxlV2ViTmF2IiwibmF2VHlwZSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyIsImlzU2ltdWxhdG9yIiwicHJlZmVyZW5jZXMiLCJ1cGRhdGVTYWZhcmlTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvd2ViLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBpc0Vycm9yVHlwZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IGNvb2tpZVV0aWxzIGZyb20gJy4uL2Nvb2tpZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgSVBIT05FX1RPUF9CQVJfSEVJR0hUID0gNzE7XG5jb25zdCBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgPSA0MTtcbmNvbnN0IElQSE9ORV9YX1NDUk9MTEVEX09GRlNFVCA9IDU1O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPUyA9IDI0O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyA9IDIwO1xuXG5jb25zdCBJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUID0gNTE7XG5jb25zdCBJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQgPSA0OTtcbmNvbnN0IFRBQl9CQVJfT0ZGU0VUID0gMzM7XG5jb25zdCBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUID0gODQ7XG5jb25zdCBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA9IDk1O1xuXG5jb25zdCBOT1RDSEVEX0RFVklDRV9TSVpFUyA9IFtcbiAge3c6IDExMjUsIGg6IDI0MzZ9LCAvLyAxMSBQcm8sIFgsIFhzXG4gIHt3OiA4MjgsIGg6IDE3OTJ9LCAvLyAxMSwgWHJcbiAge3c6IDEyNDIsIGg6IDI2ODh9LCAvLyAxMSBQcm8gTWF4LCBYcyBNYXhcbiAge3c6IDEwODAsIGg6IDIzNDB9LCAvLyAxMyBtaW5pLCAxMiBtaW5pXG4gIHt3OiAxMTcwLCBoOiAyNTMyfSwgLy8gMTQsIDEzLCAxMyBQcm8sIDEyLCAxMiBQcm9cbiAge3c6IDEyODQsIGg6IDI3Nzh9LCAvLyAxNCBQbHVzLCAxMyBQcm8gTWF4LCAxMiBQcm8gTWF4XG4gIHt3OiAxMTc5LCBoOiAyNTU2fSwgLy8gMTQgUHJvXG4gIHt3OiAxMjkwLCBoOiAyNzk2fSwgLy8gMTQgUHJvIE1heFxuXTtcblxuY29uc3QgeyBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiB9ID0gdXRpbDtcblxuY29uc3QgQVRPTV9XQUlUX1RJTUVPVVRfTVMgPSAyICogNjAwMDA7XG5jb25zdCBBVE9NX0lOSVRJQUxfV0FJVF9NUyA9IDEwMDA7XG5cbmNvbnN0IE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UID0gJ2FsZXJ0JztcbmNvbnN0IE9OX0FQUF9DUkFTSF9FVkVOVCA9ICdhcHBfY3Jhc2gnO1xuXG5jb25zdCBWSVNJQkxFID0gJ3Zpc2libGUnO1xuY29uc3QgSU5WSVNJQkxFID0gJ2ludmlzaWJsZSc7XG5jb25zdCBERVRFQ1QgPSAnZGV0ZWN0JztcbmNvbnN0IFZJU0lCSUxJVElFUyA9IFtWSVNJQkxFLCBJTlZJU0lCTEUsIERFVEVDVF07XG5cbi8vIFRoZSBwb3NpdGlvbiBvZiBTYWZhcmkncyB0YWIgKHNlYXJjaCBiYXIpLlxuLy8gU2luY2UgaU9TIDE1LCB0aGUgYmFyIGlzIHRoZSBib3R0b20gYnkgZGVmYXVsdC5cbmNvbnN0IFRBQl9CQVJfUE9TSVRJT05fVE9QID0gJ3RvcCc7XG5jb25zdCBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA9ICdib3R0b20nO1xuY29uc3QgVEFCX0JBUl9QT1NTSVRJT05TID0gW1RBQl9CQVJfUE9TSVRJT05fVE9QLCBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTV07XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIgKGlkKSB7XG4gIGlmICghXy5pc1N0cmluZyhpZCkgJiYgIV8uaXNOdW1iZXIoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGlkKSAmJiBfLmlzRW1wdHkoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzTnVtYmVyKGlkKSAmJiBpc05hTihpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbW1hbmRzLnNldEZyYW1lID0gYXN5bmMgZnVuY3Rpb24gc2V0RnJhbWUgKGZyYW1lKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgaWYgKF8uaXNOdWxsKGZyYW1lKSkge1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzID0gW107XG4gICAgdGhpcy5sb2cuZGVidWcoJ0xlYXZpbmcgd2ViIGZyYW1lIGFuZCBnb2luZyBiYWNrIHRvIGRlZmF1bHQgY29udGVudCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoZWxwZXJzLmhhc0VsZW1lbnRJZChmcmFtZSkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChmcmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfZnJhbWVfd2luZG93JywgW2F0b21zRWxlbWVudF0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBFbnRlcmluZyBuZXcgd2ViIGZyYW1lOiAnJHt2YWx1ZS5XSU5ET1d9J2ApO1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzLnVuc2hpZnQodmFsdWUuV0lORE9XKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdG9tID0gXy5pc051bWJlcihmcmFtZSkgPyAnZnJhbWVfYnlfaW5kZXgnIDogJ2ZyYW1lX2J5X2lkX29yX25hbWUnO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbShhdG9tLCBbZnJhbWVdKTtcbiAgICBpZiAoXy5pc051bGwodmFsdWUpIHx8IF8uaXNVbmRlZmluZWQodmFsdWUuV0lORE9XKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hGcmFtZUVycm9yKCk7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBFbnRlcmluZyBuZXcgd2ViIGZyYW1lOiAnJHt2YWx1ZS5XSU5ET1d9J2ApO1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzLnVuc2hpZnQodmFsdWUuV0lORE9XKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0Q3NzUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDc3NQcm9wZXJ0eSAocHJvcGVydHlOYW1lLCBlbCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF92YWx1ZV9vZl9jc3NfcHJvcGVydHknLCBbYXRvbXNFbGVtZW50LCBwcm9wZXJ0eU5hbWVdKTtcbn07XG5cbmNvbW1hbmRzLnN1Ym1pdCA9IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdCAoZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ3N1Ym1pdCcsIFthdG9tc0VsZW1lbnRdKTtcbn07XG5cbmNvbW1hbmRzLnJlZnJlc2ggPSBhc3luYyBmdW5jdGlvbiByZWZyZXNoICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdyZWZyZXNoJywgW10pO1xufTtcblxuY29tbWFuZHMuZ2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gZ2V0VXJsICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZSgnd2luZG93LmxvY2F0aW9uLmhyZWYnKTtcbn07XG5cbmNvbW1hbmRzLnRpdGxlID0gYXN5bmMgZnVuY3Rpb24gdGl0bGUgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0aXRsZScsIFtdLCB0cnVlKTtcbn07XG5cbmNvbW1hbmRzLnNldENvb2tpZSA9IGFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZSAoY29va2llKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgY29va2llID0gXy5jbG9uZShjb29raWUpO1xuXG4gIC8vIGlmIGBwYXRoYCBmaWVsZCBpcyBub3Qgc3BlY2lmaWVkLCBTYWZhcmkgd2lsbCBub3QgdXBkYXRlIGNvb2tpZXMgYXMgZXhwZWN0ZWQ7IGVnIGlzc3VlICMxNzA4XG4gIGlmICghY29va2llLnBhdGgpIHtcbiAgICBjb29raWUucGF0aCA9ICcvJztcbiAgfVxuXG4gIGNvbnN0IGpzQ29va2llID0gY29va2llVXRpbHMuY3JlYXRlSlNDb29raWUoY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSwge1xuICAgIGV4cGlyZXM6IF8uaXNOdW1iZXIoY29va2llLmV4cGlyeSkgPyAobmV3IERhdGUoY29va2llLmV4cGlyeSAqIDEwMDApKS50b1VUQ1N0cmluZygpIDpcbiAgICAgIGNvb2tpZS5leHBpcnksXG4gICAgcGF0aDogY29va2llLnBhdGgsXG4gICAgZG9tYWluOiBjb29raWUuZG9tYWluLFxuICAgIGh0dHBPbmx5OiBjb29raWUuaHR0cE9ubHksXG4gICAgc2VjdXJlOiBjb29raWUuc2VjdXJlXG4gIH0pO1xuICBsZXQgc2NyaXB0ID0gYGRvY3VtZW50LmNvb2tpZSA9ICR7SlNPTi5zdHJpbmdpZnkoanNDb29raWUpfWA7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW11dKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50ID0gZnVuY3Rpb24gY2FjaGVXZWJFbGVtZW50IChlbCkge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChlbCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgY29uc3QgZWxJZCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyKGVsSWQpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIC8vIEluIG5ld2VyIGRlYnVnZ2VyIHJlbGVhc2VzIGVsZW1lbnQgaWRlbnRpZmllcnMgbG9vayBsaWtlIGA6d2RjOjE2MjgxNTE2NDkzMjVgXG4gIC8vIFdlIGFzc3VtZSBpdCBpcyBzYWZlIHRvIHVzZSB0aGVzZSB0byBpZGVudGlmeSBjYWNoZWQgZWxlbWVudHNcbiAgY29uc3QgY2FjaGVJZCA9IF8uaW5jbHVkZXMoZWxJZCwgJzonKSA/IGVsSWQgOiB1dGlsLnV1aWRWNCgpO1xuICB0aGlzLndlYkVsZW1lbnRzQ2FjaGUuc2V0KGNhY2hlSWQsIGVsSWQpO1xuICByZXR1cm4gdXRpbC53cmFwRWxlbWVudChjYWNoZUlkKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50cyA9IGZ1bmN0aW9uIGNhY2hlV2ViRWxlbWVudHMgKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHRvQ2FjaGVkID0gKHYpID0+IF8uaXNBcnJheSh2KSB8fCBfLmlzUGxhaW5PYmplY3QodilcbiAgICA/IHRoaXMuY2FjaGVXZWJFbGVtZW50cyh2KVxuICAgIDogdjtcblxuICBpZiAoXy5pc0FycmF5KHJlc3BvbnNlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5tYXAodG9DYWNoZWQpO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChyZXNwb25zZSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7Li4ucmVzcG9uc2UsIC4uLih0aGlzLmNhY2hlV2ViRWxlbWVudChyZXNwb25zZSkpfTtcbiAgICByZXR1cm4gXy50b1BhaXJzKHJlc3VsdCkucmVkdWNlKFxuICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdG9DYWNoZWQodmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbmV4dGVuc2lvbnMuZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzID0gYXN5bmMgZnVuY3Rpb24gZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzIChzdHJhdGVneSwgc2VsZWN0b3IsIG1hbnksIGN0eCkge1xuICBjb25zdCBjb250ZXh0RWxlbWVudCA9IF8uaXNOaWwoY3R4KSA/IG51bGwgOiB0aGlzLmdldEF0b21zRWxlbWVudChjdHgpO1xuICBsZXQgZWxlbWVudDtcbiAgbGV0IGRvRmluZCA9IGFzeW5jICgpID0+IHtcbiAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbShgZmluZF9lbGVtZW50JHttYW55ID8gJ3MnIDogJyd9YCwgW3N0cmF0ZWd5LCBzZWxlY3RvciwgY29udGV4dEVsZW1lbnRdKTtcbiAgICByZXR1cm4gIV8uaXNOdWxsKGVsZW1lbnQpO1xuICB9O1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uKGRvRmluZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZSAmJiBfLmlzRnVuY3Rpb24oZXJyLm1lc3NhZ2UubWF0Y2gpICYmIGVyci5tZXNzYWdlLm1hdGNoKC9Db25kaXRpb24gdW5tZXQvKSkge1xuICAgICAgLy8gY29uZGl0aW9uIHdhcyBub3QgbWV0IHNldHRpbmcgcmVzIHRvIGVtcHR5IGFycmF5XG4gICAgICBlbGVtZW50ID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBpZiAobWFueSkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMoZWxlbWVudCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShlbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhlbGVtZW50KTtcbn07XG5cbmV4dGVuc2lvbnMuY2xpY2tXZWJDb29yZHMgPSBhc3luYyBmdW5jdGlvbiBjbGlja1dlYkNvb3JkcyAoKSB7XG4gIGxldCBjb29yZHMgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVdlYkNvb3Jkcyh0aGlzLmN1cldlYkNvb3Jkcyk7XG4gIGF3YWl0IHRoaXMuY2xpY2tDb29yZHMoY29vcmRzKTtcbn07XG5cbmhlbHBlcnMuZXhlY3V0ZUF0b20gPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbSAoYXRvbSwgYXJncywgYWx3YXlzRGVmYXVsdEZyYW1lID0gZmFsc2UpIHtcbiAgbGV0IGZyYW1lcyA9IGFsd2F5c0RlZmF1bHRGcmFtZSA9PT0gdHJ1ZSA/IFtdIDogdGhpcy5jdXJXZWJGcmFtZXM7XG4gIGxldCBwcm9taXNlID0gdGhpcy5yZW1vdGUuZXhlY3V0ZUF0b20oYXRvbSwgYXJncywgZnJhbWVzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSk7XG59O1xuXG5oZWxwZXJzLmV4ZWN1dGVBdG9tQXN5bmMgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbUFzeW5jIChhdG9tLCBhcmdzLCByZXNwb25zZVVybCkge1xuICAvLyBzYXZlIHRoZSByZXNvbHZlIGFuZCByZWplY3QgbWV0aG9kcyBvZiB0aGUgcHJvbWlzZSB0byBiZSB3YWl0ZWQgZm9yXG4gIGxldCBwcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuYXN5bmNQcm9taXNlID0ge3Jlc29sdmUsIHJlamVjdH07XG4gIH0pO1xuICBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbUFzeW5jKGF0b20sIGFyZ3MsIHRoaXMuY3VyV2ViRnJhbWVzLCByZXNwb25zZVVybCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JBdG9tKHByb21pc2UpO1xufTtcblxuaGVscGVycy5nZXRBdG9tc0VsZW1lbnQgPSBmdW5jdGlvbiBnZXRBdG9tc0VsZW1lbnQgKGVsT3JJZCkge1xuICBjb25zdCBlbElkID0gdXRpbC51bndyYXBFbGVtZW50KGVsT3JJZCk7XG4gIGlmICghdGhpcy53ZWJFbGVtZW50c0NhY2hlLmhhcyhlbElkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IoKTtcbiAgfVxuICByZXR1cm4ge0VMRU1FTlQ6IHRoaXMud2ViRWxlbWVudHNDYWNoZS5nZXQoZWxJZCl9O1xufTtcblxuaGVscGVycy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50c0ZvckF0b21zIChhcmdzID0gW10pIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoYXJnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXRvbXNFbGVtZW50KGFyZyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIHJldHVybiBfLmlzQXJyYXkoYXJnKSA/IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJnKSA6IGFyZztcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEVsZW1lbnRJZCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRJZCAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5FTEVNRU5UIHx8IGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdO1xufTtcblxuaGVscGVycy5oYXNFbGVtZW50SWQgPSBmdW5jdGlvbiBoYXNFbGVtZW50SWQgKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHV0aWwuaGFzVmFsdWUoZWxlbWVudCkgJiYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudC5FTEVNRU5UKSB8fCB1dGlsLmhhc1ZhbHVlKGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdKSk7XG59O1xuXG5leHRlbnNpb25zLmdldFNhZmFyaUlzSXBob25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpSXNJcGhvbmUgKCkge1xuICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5faXNTYWZhcmlJcGhvbmUpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2FmYXJpSXBob25lO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlckFnZW50ID0gYXdhaXQgdGhpcy5leGVjdXRlKCdyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudCcpO1xuICAgIHRoaXMuX2lzU2FmYXJpSXBob25lID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2lwaG9uZScpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZmluZCBkZXZpY2UgdHlwZSBmcm9tIHVzZXJhZ2VudC4gQXNzdW1pbmcgaVBob25lYCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiB0aGlzLl9pc1NhZmFyaUlwaG9uZSA/PyB0cnVlO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlEZXZpY2VTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpRGV2aWNlU2l6ZSAoKSB7XG4gIGNvbnN0IHNjcmlwdCA9ICdyZXR1cm4ge2hlaWdodDogd2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCB3aWR0aDogd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW99Oyc7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShzY3JpcHQpO1xuICBjb25zdCBbbm9ybUhlaWdodCwgbm9ybVdpZHRoXSA9IGhlaWdodCA+IHdpZHRoID8gW2hlaWdodCwgd2lkdGhdIDogW3dpZHRoLCBoZWlnaHRdO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBub3JtV2lkdGgsXG4gICAgaGVpZ2h0OiBub3JtSGVpZ2h0LFxuICB9O1xufTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlJc05vdGNoZWQgPSBhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlJc05vdGNoZWQgKCkge1xuICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5faXNTYWZhcmlOb3RjaGVkKSkge1xuICAgIHJldHVybiB0aGlzLl9pc1NhZmFyaU5vdGNoZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2FmYXJpRGV2aWNlU2l6ZSgpO1xuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIE5PVENIRURfREVWSUNFX1NJWkVTKSB7XG4gICAgICBpZiAoZGV2aWNlLncgPT09IHdpZHRoICYmIGRldmljZS5oID09PSBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5faXNTYWZhcmlOb3RjaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIGRldmljZSB0eXBlIGZyb20gZGltZW5zaW9ucy4gQXNzdW1pbmcgdGhlIGRldmljZSBpcyBub3Qgbm90Y2hlZGApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBFcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gdGhpcy5faXNTYWZhcmlOb3RjaGVkID8/IGZhbHNlO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCA9IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0ICh3dlBvcywgcmVhbERpbXMpIHtcbiAgbGV0IHRvcE9mZnNldCA9IDA7XG4gIGxldCBib3R0b21PZmZzZXQgPSAwO1xuXG4gIGNvbnN0IGlzSXBob25lID0gYXdhaXQgdGhpcy5nZXRTYWZhcmlJc0lwaG9uZSgpO1xuXG4gIC8vIE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgU21hcnQgQXBwIEJhbm5lciBvciBUYWIgQmFyIGlzIHZpc2libGUgb3Igbm90XG4gIC8vIGlmIGFscmVhZHkgZGVmaW5lZCBieSBuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5IG9yIG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSBpbiBzZXR0aW5ncy5cbiAgY29uc3Qge1xuICAgIG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHksXG4gICAgbmF0aXZlV2ViVGFwU21hcnRBcHBCYW5uZXJWaXNpYmlsaXR5LFxuICAgIHNhZmFyaVRhYkJhclBvc2l0aW9uID0gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz49JywgJzE1LjAnKSAmJiBpc0lwaG9uZVxuICAgICAgPyBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA6IFRBQl9CQVJfUE9TSVRJT05fVE9QLFxuICB9ID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpO1xuICBsZXQgdGFiQmFyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkpO1xuICBsZXQgYmFubmVyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSk7XG4gIGNvbnN0IHRhYkJhclBvc2l0aW9uID0gXy5sb3dlckNhc2Uoc2FmYXJpVGFiQmFyUG9zaXRpb24pO1xuXG4gIGlmICghVklTSUJJTElUSUVTLmluY2x1ZGVzKHRhYkJhclZpc2liaWxpdHkpKSB7XG4gICAgdGFiQmFyVmlzaWJpbGl0eSA9IERFVEVDVDtcbiAgfVxuICBpZiAoIVZJU0lCSUxJVElFUy5pbmNsdWRlcyhiYW5uZXJWaXNpYmlsaXR5KSkge1xuICAgIGJhbm5lclZpc2liaWxpdHkgPSBERVRFQ1Q7XG4gIH1cblxuICBpZiAoIVRBQl9CQVJfUE9TU0lUSU9OUy5pbmNsdWRlcyh0YWJCYXJQb3NpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYCR7c2FmYXJpVGFiQmFyUG9zaXRpb259IGlzIGludmFsaWQgYXMgU2FmYXJpIHRhYiBiYXIgcG9zaXRpb24uIEF2YWlsYWJsZSBwb3NpdGlvbnMgYXJlICR7VEFCX0JBUl9QT1NTSVRJT05TfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGlzTm90Y2hlZCA9IGlzSXBob25lICYmIGF3YWl0IHRoaXMuZ2V0U2FmYXJpSXNOb3RjaGVkKCk7XG5cbiAgY29uc3Qgb3JpZW50YXRpb24gPSByZWFsRGltcy5oID4gcmVhbERpbXMudyA/ICdQT1JUUkFJVCcgOiAnTEFORFNDQVBFJztcblxuICBjb25zdCBub3RjaE9mZnNldCA9IGlzTm90Y2hlZFxuICAgID8gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz0nLCAnMTMuMCcpXG4gICAgICA/IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTNcbiAgICAgIDogSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU1xuICAgIDogMDtcblxuICBjb25zdCBpc1Njcm9sbGVkID0gYXdhaXQgdGhpcy5leGVjdXRlKCdyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDAnKTtcbiAgaWYgKGlzU2Nyb2xsZWQpIHtcbiAgICB0b3BPZmZzZXQgPSBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgKyBub3RjaE9mZnNldDtcblxuICAgIGlmIChpc05vdGNoZWQpIHtcbiAgICAgIHRvcE9mZnNldCAtPSBJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlQaG9uZSBpcyBsYW5kc2NhcGUgdGhlbiB0aGVyZSBpcyBubyB0b3AgYmFyXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyAmJiBpc0lwaG9uZSkge1xuICAgICAgdG9wT2Zmc2V0ID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9wT2Zmc2V0ID0gdGFiQmFyUG9zaXRpb24gPT09IFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NID8gMCA6IElQSE9ORV9UT1BfQkFSX0hFSUdIVDtcbiAgICB0b3BPZmZzZXQgKz0gbm90Y2hPZmZzZXQ7XG4gICAgdGhpcy5sb2cuZGVidWcoYHRhYkJhclBvc2l0aW9uIGFuZCB0b3BPZmZzZXQ6ICR7dGFiQmFyUG9zaXRpb259LCAke3RvcE9mZnNldH1gKTtcblxuICAgIGlmIChpc0lwaG9uZSkge1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnUE9SVFJBSVQnKSB7XG4gICAgICAgIC8vIFRoZSBib3R0b20gYmFyIGlzIG9ubHkgdmlzaWJsZSB3aGVuIHBvcnRyYWl0XG4gICAgICAgIGJvdHRvbU9mZnNldCA9IElQSE9ORV9CT1RUT01fQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcE9mZnNldCA9IElQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyB8fCAhaXNJcGhvbmUpIHtcbiAgICAgIGlmICh0YWJCYXJWaXNpYmlsaXR5ID09PSBWSVNJQkxFKSB7XG4gICAgICAgIHRvcE9mZnNldCArPSBUQUJfQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSBpZiAodGFiQmFyVmlzaWJpbGl0eSA9PT0gREVURUNUKSB7XG4gICAgICAgIC8vIFRhYnMgb25seSBhcHBlYXIgaWYgdGhlIGRldmljZSBpcyBsYW5kc2NhcGUgb3IgaWYgaXQncyBhbiBpUGFkIHNvIHdlIG9ubHkgY2hlY2sgdmlzaWJpbGl0eSBpbiB0aGlzIGNhc2VcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWFjaCB0YWIgYmFyIGlzIGEgV2ViVmlld1xuICAgICAgICBjb25zdCBjb250ZXh0c0FuZFZpZXdzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBjb250ZXh0c0FuZFZpZXdzLmZpbHRlcigoY3R4KSA9PiBjdHguaWQuc3RhcnRzV2l0aCgnV0VCVklFV18nKSk7XG5cbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3RhYnMubGVuZ3RofSB0YWJzLiBBc3N1bWluZyB0aGUgdGFiIGJhciBpcyB2aXNpYmxlYCk7XG4gICAgICAgICAgdG9wT2Zmc2V0ICs9IFRBQl9CQVJfT0ZGU0VUO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9wT2Zmc2V0ICs9IGF3YWl0IHRoaXMuZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQoaXNJcGhvbmUsIGJhbm5lclZpc2liaWxpdHkpO1xuXG4gIHd2UG9zLnkgKz0gdG9wT2Zmc2V0O1xuICByZWFsRGltcy5oIC09ICh0b3BPZmZzZXQgKyBib3R0b21PZmZzZXQpO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldCA9IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0IChpc0lwaG9uZSwgYmFubmVyVmlzaWJpbGl0eSkge1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBpZiAoYmFubmVyVmlzaWJpbGl0eSA9PT0gVklTSUJMRSkge1xuICAgIG9mZnNldCArPSBpc0lwaG9uZSA/XG4gICAgICBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIDpcbiAgICAgIElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUO1xuICB9IGVsc2UgaWYgKGJhbm5lclZpc2liaWxpdHkgPT09IERFVEVDVCkge1xuICAgIC8vIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gU21hcnQgQXBwIEJhbm5lclxuICAgIGNvbnN0IGJhbm5lcnMgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnYWNjZXNzaWJpbGl0eSBpZCcsICdDbG9zZSBhcHAgZG93bmxvYWQgb2ZmZXInLCB0cnVlKTtcbiAgICBpZiAoYmFubmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBvZmZzZXQgKz0gaXNJcGhvbmUgP1xuICAgICAgICBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIDpcbiAgICAgICAgSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQ7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5sb2cuZGVidWcoYEFkZGl0aW9uYWwgbmF0aXZlIHdlYiB0YXAgb2Zmc2V0IGNvbXB1dGVkOiAke29mZnNldH1gKTtcbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRhcFdlYkVsZW1lbnROYXRpdmVseSAoZHJpdmVyLCBhdG9tc0VsZW1lbnQpIHtcbiAgLy8gdHJ5IHRvIGdldCB0aGUgdGV4dCBvZiB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBhY2Nlc3NpYmxlIGluIHRoZVxuICAvLyBuYXRpdmUgY29udGV4dFxuICB0cnkge1xuICAgIGxldCB0ZXh0ID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVBdG9tKCdnZXRfdGV4dCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRleHQgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUF0b20oJ2dldF9hdHRyaWJ1dGVfdmFsdWUnLCBbYXRvbXNFbGVtZW50LCAndmFsdWUnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGVscyA9IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCB0ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChlbHMubGVuZ3RoID09PSAxIHx8IGVscy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgZWwgPSBlbHNbMF07XG4gICAgICAgIC8vIHVzZSB0YXAgYmVjYXVzZSBvbiBpT1MgMTEuMiBhbmQgYmVsb3cgYG5hdGl2ZUNsaWNrYCBjcmFzaGVzIFdEQVxuICAgICAgICBjb25zdCByZWN0ID0gYXdhaXQgZHJpdmVyLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWwpfS9yZWN0YCwgJ0dFVCcpO1xuICAgICAgICBpZiAoZWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGVsMiA9IGVsc1sxXTtcbiAgICAgICAgICBjb25zdCByZWN0MiA9IGF3YWl0IGRyaXZlci5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsMil9L3JlY3RgLCAnR0VUJyk7XG5cbiAgICAgICAgICBpZiAoKHJlY3QueCAhPT0gcmVjdDIueCB8fCByZWN0LnkgIT09IHJlY3QyLnkpIHx8XG4gICAgICAgICAgKHJlY3Qud2lkdGggIT09IHJlY3QyLndpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9PSByZWN0Mi5oZWlnaHQpKSB7XG4gICAgICAgICAgICAvLyBUaGVzZSAyIG5hdGl2ZSBlbGVtZW50cyBhcmUgbm90IHJlZmVycmluZyB0byB0aGUgc2FtZSB3ZWIgZWxlbWVudFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZChyZWN0LnggKyByZWN0LndpZHRoIC8gMiksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChyZWN0LnkgKyByZWN0LmhlaWdodCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBkcml2ZXIuY2xpY2tDb29yZHMoY29vcmRzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBhbnkgZmFpbHVyZSBzaG91bGQgZmFsbCB0aHJvdWdoIGFuZCB0cmlnZ2VyIHRoZSBtb3JlIGVsYWJvcmF0ZVxuICAgIC8vIG1ldGhvZCBvZiBjbGlja2luZ1xuICAgIGRyaXZlci5sb2cud2FybihgRXJyb3IgYXR0ZW1wdGluZyB0byBjbGljazogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4dGVuc2lvbnMubmF0aXZlV2ViVGFwID0gYXN5bmMgZnVuY3Rpb24gbmF0aXZlV2ViVGFwIChlbCkge1xuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG5cbiAgLy8gaWYgc3RyaWN0IG5hdGl2ZSB0YXAsIGRvIG5vdCB0cnkgdG8gZG8gaXQgd2l0aCBXREEgZGlyZWN0bHlcbiAgaWYgKCEoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXBTdHJpY3QgJiYgYXdhaXQgdGFwV2ViRWxlbWVudE5hdGl2ZWx5KHRoaXMsIGF0b21zRWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sb2cud2FybignVW5hYmxlIHRvIGRvIHNpbXBsZSBuYXRpdmUgd2ViIHRhcC4gQXR0ZW1wdGluZyB0byBjb252ZXJ0IGNvb3JkaW5hdGVzJyk7XG5cbiAgLy8gYGdldF90b3BfbGVmdF9jb29yZGluYXRlc2AgcmV0dXJucyB0aGUgd3JvbmcgdmFsdWUgc29tZXRpbWVzLFxuICAvLyB1bmxlc3Mgd2UgcHJlLWNhbGwgYm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbHNcbiAgYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcblxuICBjb25zdCBbc2l6ZSwgY29vcmRpbmF0ZXNdID0gYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gc2l6ZTtcbiAgbGV0IHt4LCB5fSA9IGNvb3JkaW5hdGVzO1xuICB4ICs9IHdpZHRoIC8gMjtcbiAgeSArPSBoZWlnaHQgLyAyO1xuXG4gIHRoaXMuY3VyV2ViQ29vcmRzID0ge3gsIHl9O1xuICBhd2FpdCB0aGlzLmNsaWNrV2ViQ29vcmRzKCk7XG59O1xuXG5leHRlbnNpb25zLmNsaWNrQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gY2xpY2tDb29yZHMgKGNvb3Jkcykge1xuICBhd2FpdCB0aGlzLnBlcmZvcm1Ub3VjaChbXG4gICAge1xuICAgICAgYWN0aW9uOiAndGFwJyxcbiAgICAgIG9wdGlvbnM6IGNvb3JkcyxcbiAgICB9LFxuICBdKTtcbn07XG5cbmV4dGVuc2lvbnMudHJhbnNsYXRlV2ViQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlV2ViQ29vcmRzIChjb29yZHMpIHtcbiAgdGhpcy5sb2cuZGVidWcoYFRyYW5zbGF0aW5nIGNvb3JkaW5hdGVzICgke0pTT04uc3RyaW5naWZ5KGNvb3Jkcyl9KSB0byB3ZWIgY29vcmRpbmF0ZXNgKTtcblxuICAvLyBhYnNvbHV0aXplIHdlYiBjb29yZHNcbiAgbGV0IHdlYnZpZXc7XG4gIHRyeSB7XG4gICAgd2VidmlldyA9IGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVXZWJWaWV3JywgZmFsc2UpKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuXG4gIGlmICghd2Vidmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gV2ViVmlldyBmb3VuZC4gVW5hYmxlIHRvIHRyYW5zbGF0ZSB3ZWIgY29vcmRpbmF0ZXMgZm9yIG5hdGl2ZSB3ZWIgdGFwLmApO1xuICB9XG5cbiAgd2VidmlldyA9IHV0aWwudW53cmFwRWxlbWVudCh3ZWJ2aWV3KTtcblxuICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7d2Vidmlld30vcmVjdGAsICdHRVQnKTtcbiAgY29uc3Qgd3ZQb3MgPSB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xuICBjb25zdCByZWFsRGltcyA9IHt3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodH07XG5cbiAgY29uc3QgY21kID0gJyhmdW5jdGlvbiAoKSB7IHJldHVybiB7dzogd2luZG93LmlubmVyV2lkdGgsIGg6IHdpbmRvdy5pbm5lckhlaWdodH07IH0pKCknO1xuICBjb25zdCB3dkRpbXMgPSBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlKGNtZCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiBpbXBsaWNpdCB3YWl0LCBhbmQgc2V0IGxvY2FsbHkgdG8gMFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTQ5ODhcbiAgY29uc3QgaW1wbGljaXRXYWl0TXMgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICBhd2FpdCB0aGlzLnNldEltcGxpY2l0V2FpdCgwKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0KHd2UG9zLCByZWFsRGltcyk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdGhpcy5zZXRJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMpO1xuICB9XG5cbiAgaWYgKHd2RGltcyAmJiByZWFsRGltcyAmJiB3dlBvcykge1xuICAgIGxldCB4UmF0aW8gPSByZWFsRGltcy53IC8gd3ZEaW1zLnc7XG4gICAgbGV0IHlSYXRpbyA9IHJlYWxEaW1zLmggLyB3dkRpbXMuaDtcbiAgICBsZXQgbmV3Q29vcmRzID0ge1xuICAgICAgeDogd3ZQb3MueCArIE1hdGgucm91bmQoeFJhdGlvICogY29vcmRzLngpLFxuICAgICAgeTogd3ZQb3MueSArIE1hdGgucm91bmQoeVJhdGlvICogY29vcmRzLnkpLFxuICAgIH07XG5cbiAgICAvLyBhZGRpdGlvbmFsIGxvZ2dpbmcgZm9yIGNvb3JkaW5hdGVzLCBzaW5jZSBpdCBpcyBzb21ldGltZXMgYnJva2VuXG4gICAgLy8gICBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzkxNTlcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29udmVydGVkIGNvb3JkaW5hdGVzOiAke0pTT04uc3RyaW5naWZ5KG5ld0Nvb3Jkcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICByZWN0OiAke0pTT04uc3RyaW5naWZ5KHJlY3QpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgd3ZQb3M6ICR7SlNPTi5zdHJpbmdpZnkod3ZQb3MpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgcmVhbERpbXM6ICR7SlNPTi5zdHJpbmdpZnkocmVhbERpbXMpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgd3ZEaW1zOiAke0pTT04uc3RyaW5naWZ5KHd2RGltcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICB4UmF0aW86ICR7SlNPTi5zdHJpbmdpZnkoeFJhdGlvKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHlSYXRpbzogJHtKU09OLnN0cmluZ2lmeSh5UmF0aW8pfWApO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoYENvbnZlcnRlZCB3ZWIgY29vcmRzICR7SlNPTi5zdHJpbmdpZnkoY29vcmRzKX0gYCArXG4gICAgICBgaW50byByZWFsIGNvb3JkcyAke0pTT04uc3RyaW5naWZ5KG5ld0Nvb3Jkcyl9YCk7XG4gICAgcmV0dXJuIG5ld0Nvb3JkcztcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5jaGVja0ZvckFsZXJ0ID0gYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JBbGVydCAoKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKGF3YWl0IHRoaXMuZ2V0QWxlcnRUZXh0KCkpO1xufTtcblxuZXh0ZW5zaW9ucy53YWl0Rm9yQXRvbSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBdG9tIChwcm9taXNlKSB7XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG5cbiAgLy8gbmVlZCB0byBjaGVjayBmb3IgYWxlcnQgd2hpbGUgdGhlIGF0b20gaXMgYmVpbmcgZXhlY3V0ZWQuXG4gIC8vIHNvIG5vdGlmeSBvdXJzZWx2ZXMgd2hlbiBpdCBoYXBwZW5zXG4gIGNvbnN0IHRpbWVkQXRvbVByb21pc2UgPSBCLnJlc29sdmUocHJvbWlzZSkudGltZW91dChBVE9NX1dBSVRfVElNRU9VVF9NUyk7XG4gIGNvbnN0IGhhbmRsZVByb21pc2VFcnJvciA9IGFzeW5jIChwKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvciA9IChlcnIgaW5zdGFuY2VvZiBCLkFnZ3JlZ2F0ZUVycm9yKSA/IGVyclswXSA6IGVycjtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBFcnJvciByZWNlaXZlZCB3aGlsZSBleGVjdXRpbmcgYXRvbTogJHtvcmlnaW5hbEVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEIuVGltZW91dEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuVGltZW91dEVycm9yKGBEaWQgbm90IGdldCBhbnkgcmVzcG9uc2UgZm9yIGF0b20gZXhlY3V0aW9uIGFmdGVyIGAgK1xuICAgICAgICAgIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgfVxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG4gIC8vIGlmIHRoZSBhdG9tIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGhpbiBBVE9NX0lOSVRJQUxfV0FJVF9NU1xuICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGFuIGFsZXJ0IHByZXNlbmNlXG4gIGF3YWl0IGhhbmRsZVByb21pc2VFcnJvcihCLmFueShbQi5kZWxheShBVE9NX0lOSVRJQUxfV0FJVF9NUyksIHRpbWVkQXRvbVByb21pc2VdKSk7XG4gIGlmICh0aW1lZEF0b21Qcm9taXNlLmlzRnVsZmlsbGVkKCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGltZWRBdG9tUHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLm90aGVyd2lzZSBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gdW5leHBlY3RlZCBhbGVydCBjb3ZlcmluZyB0aGUgZWxlbWVudFxuICBpZiAoIV8uaXNQbGFpbk9iamVjdCh0aGlzLl93YWl0aW5nQXRvbXMpKSB7XG4gICAgdGhpcy5fd2FpdGluZ0F0b21zID0ge1xuICAgICAgY291bnQ6IDAsXG4gICAgICBhbGVydE5vdGlmaWVyOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICBhbGVydE1vbml0b3I6IEIucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbiAgdGhpcy5fd2FpdGluZ0F0b21zLmNvdW50Kys7XG5cbiAgbGV0IG9uQWxlcnRDYWxsYmFjaztcbiAgbGV0IG9uQXBwQ3Jhc2hDYWxsYmFjaztcbiAgdHJ5IHtcbiAgICAvLyBvbmx5IHJlc3RhcnQgdGhlIG1vbml0b3IgaWYgaXQgaXMgbm90IHJ1bm5pbmcgYWxyZWFkeVxuICAgIGlmICh0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnRNb25pdG9yLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0TW9uaXRvciA9IEIucmVzb2x2ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAodGhpcy5fd2FpdGluZ0F0b21zLmNvdW50ID4gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0ZvckFsZXJ0KCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIuZW1pdChPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yKSkge1xuICAgICAgICAgICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5lbWl0KE9OX0FQUF9DUkFTSF9FVkVOVCwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgQi5kZWxheShBVE9NX0lOSVRJQUxfV0FJVF9NUyAvIDIpO1xuICAgICAgICB9XG4gICAgICB9KSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgb25BbGVydENhbGxiYWNrID0gKCkgPT4gcmVqZWN0KG5ldyBlcnJvcnMuVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yKCkpO1xuICAgICAgb25BcHBDcmFzaENhbGxiYWNrID0gcmVqZWN0O1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIub25jZShPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCwgb25BbGVydENhbGxiYWNrKTtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLm9uY2UoT05fQVBQX0NSQVNIX0VWRU5ULCBvbkFwcENyYXNoQ2FsbGJhY2spO1xuICAgICAgaGFuZGxlUHJvbWlzZUVycm9yKHRpbWVkQXRvbVByb21pc2UpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvbkFsZXJ0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5ULCBvbkFsZXJ0Q2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAob25BcHBDcmFzaENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5yZW1vdmVMaXN0ZW5lcihPTl9BUFBfQ1JBU0hfRVZFTlQsIG9uQXBwQ3Jhc2hDYWxsYmFjayk7XG4gICAgfVxuICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudC0tO1xuICB9XG59O1xuXG5leHRlbnNpb25zLm1vYmlsZVdlYk5hdiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVdlYk5hdiAobmF2VHlwZSkge1xuICB0aGlzLnJlbW90ZS5hbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtgaGlzdG9yeS4ke25hdlR5cGV9KCk7YCwgbnVsbF0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucmVtb3RlLmFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQgPSBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTYWZhcmlPcHRzXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJlZmVyZW5jZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgU2FmYXJpIHNldHRpbmdzIHRvIGJlIHVwZGF0ZWQuXG4gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgc2V0dGluZyBuYW1lcyBhbmQgdGhlaXIgdmFsdWVzIGNvdWxkIGJlIHJldHJpZXZlZCBieVxuICogY2hhbmdpbmcgdGhlIGNvcnJlc3BvbmRpbmcgU2FmYXJpIHNldHRpbmdzIGluIHRoZSBVSSBhbmQgdGhlbiBpbnNwZWN0aW5nXG4gKiAnTGlicmFyeS9QcmVmZXJlbmNlcy9jb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JyBmaWxlIGluc2lkZSBvZlxuICogY29tLmFwcGxlLm1vYmlsZXNhZmFyaSBhcHAgY29udGFpbmVyLlxuICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgTW9iaWxlIFNhZmFyaSdzIGNvbnRhaW5lciBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbVxuICogYHhjcnVuIHNpbWN0bCBnZXRfYXBwX2NvbnRhaW5lciA8c2ltX3VkaWQ+IGNvbS5hcHBsZS5tb2JpbGVzYWZhcmkgZGF0YWBcbiAqIGNvbW1hbmQgb3V0cHV0LlxuICogVXNlIHRoZSBgeGNydW4gc2ltY3RsIHNwYXduIDxzaW1fdWRpZD4gZGVmYXVsdHMgcmVhZCA8cGF0aF90b19wbGlzdD5gIGNvbW1hbmRcbiAqIHRvIHByaW50IHRoZSBwbGlzdCBjb250ZW50IHRvIHRoZSBUZXJtaW5hbC5cbiAqL1xuXG4vKipcbiAqIFVwZGF0ZXMgcHJlZmVyZW5jZXMgb2YgTW9iaWxlIFNhZmFyaSBvbiBTaW11bGF0b3JcbiAqXG4gKiBAcGFyYW0ge1NhZmFyaU9wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlVXBkYXRlU2FmYXJpUHJlZmVyZW5jZXMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyAob3B0cyA9IHt9KSB7XG4gIGlmICghdGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGV4dGVuc2lvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgU2ltdWxhdG9yJyk7XG4gIH1cbiAgY29uc3QgeyBwcmVmZXJlbmNlcyB9ID0gb3B0cztcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QocHJlZmVyZW5jZXMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignXCJwcmVmZXJlbmNlc1wiIGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgfVxuXG4gIHRoaXMubG9nLmRlYnVnKGBBYm91dCB0byB1cGRhdGUgU2FmYXJpIHByZWZlcmVuY2VzOiAke0pTT04uc3RyaW5naWZ5KHByZWZlcmVuY2VzKX1gKTtcbiAgYXdhaXQgdGhpcy5vcHRzLmRldmljZS51cGRhdGVTYWZhcmlTZXR0aW5ncyhwcmVmZXJlbmNlcyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGNvbW1hbmRzLCBleHRlbnNpb25zLCBoZWxwZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sUUFBQSxHQUFBSCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBRUEsTUFBTVEscUJBQXFCLEdBQUcsRUFBRTtBQUNoQyxNQUFNQyw4QkFBOEIsR0FBRyxFQUFFO0FBQ3pDLE1BQU1DLHdCQUF3QixHQUFHLEVBQUU7QUFDbkMsTUFBTUMseUJBQXlCLEdBQUcsRUFBRTtBQUNwQyxNQUFNQyw0QkFBNEIsR0FBRyxFQUFFO0FBRXZDLE1BQU1DLCtCQUErQixHQUFHLEVBQUU7QUFDMUMsTUFBTUMsd0JBQXdCLEdBQUcsRUFBRTtBQUNuQyxNQUFNQyxjQUFjLEdBQUcsRUFBRTtBQUN6QixNQUFNQyx3Q0FBd0MsR0FBRyxFQUFFO0FBQ25ELE1BQU1DLHNDQUFzQyxHQUFHLEVBQUU7QUFFakQsTUFBTUMsb0JBQW9CLEdBQUcsQ0FDM0I7RUFBQ0MsQ0FBQyxFQUFFLElBQUk7RUFBRUMsQ0FBQyxFQUFFO0FBQUksQ0FBQyxFQUNsQjtFQUFDRCxDQUFDLEVBQUUsR0FBRztFQUFFQyxDQUFDLEVBQUU7QUFBSSxDQUFDLEVBQ2pCO0VBQUNELENBQUMsRUFBRSxJQUFJO0VBQUVDLENBQUMsRUFBRTtBQUFJLENBQUMsRUFDbEI7RUFBQ0QsQ0FBQyxFQUFFLElBQUk7RUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","names":["_asyncbox","require","_support","_lodash","_interopRequireDefault","_bluebird","_driver","_cookies","_events","IPHONE_TOP_BAR_HEIGHT","IPHONE_SCROLLED_TOP_BAR_HEIGHT","IPHONE_X_SCROLLED_OFFSET","IPHONE_X_NOTCH_OFFSET_IOS","IPHONE_X_NOTCH_OFFSET_IOS_13","IPHONE_LANDSCAPE_TOP_BAR_HEIGHT","IPHONE_BOTTOM_BAR_OFFSET","TAB_BAR_OFFSET","IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET","IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET","NOTCHED_DEVICE_SIZES","w","h","W3C_WEB_ELEMENT_IDENTIFIER","util","ATOM_WAIT_TIMEOUT_MS","ATOM_INITIAL_WAIT_MS","ON_OBSTRUCTING_ALERT_EVENT","VISIBLE","INVISIBLE","DETECT","VISIBILITIES","TAB_BAR_POSITION_TOP","TAB_BAR_POSITION_BOTTOM","TAB_BAR_POSSITIONS","commands","helpers","extensions","isValidElementIdentifier","id","_","isString","isNumber","isEmpty","isNaN","setFrame","frame","isWebContext","errors","NotImplementedError","isNull","curWebFrames","log","debug","hasElementId","atomsElement","getAtomsElement","value","executeAtom","WINDOW","unshift","atom","isUndefined","NoSuchFrameError","getCssProperty","propertyName","el","submit","refresh","getUrl","remote","execute","title","setCookie","cookie","clone","path","jsCookie","cookieUtils","createJSCookie","name","expires","expiry","Date","toUTCString","domain","httpOnly","secure","script","JSON","stringify","cacheWebElement","isPlainObject","elId","unwrapElement","cacheId","includes","uuidV4","webElementsCache","set","wrapElement","cacheWebElements","response","toCached","v","isArray","map","result","toPairs","reduce","acc","key","findWebElementOrElements","strategy","selector","many","ctx","contextElement","isNil","element","doFind","implicitWaitForCondition","err","message","isFunction","match","NoSuchElementError","clickWebCoords","coords","translateWebCoords","curWebCoords","clickCoords","args","alwaysDefaultFrame","frames","promise","waitForAtom","executeAtomAsync","responseUrl","B","resolve","reject","asyncPromise","elOrId","has","StaleElementReferenceError","ELEMENT","get","convertElementsForAtoms","arg","isErrorType","getElementId","hasValue","getSafariIsIphone","isBoolean","_isSafariIphone","userAgent","toLowerCase","warn","getSafariDeviceSize","width","height","normHeight","normWidth","getSafariIsNotched","_isSafariNotched","device","getExtraTranslateWebCoordsOffset","wvPos","realDims","topOffset","bottomOffset","isIphone","nativeWebTapTabBarVisibility","nativeWebTapSmartAppBannerVisibility","safariTabBarPosition","compareVersions","opts","platformVersion","settings","getSettings","tabBarVisibility","lowerCase","bannerVisibility","tabBarPosition","InvalidArgumentError","isNotched","orientation","notchOffset","isScrolled","contextsAndViews","getContextsAndViews","tabs","filter","startsWith","length","getExtraNativeWebTapOffset","y","offset","banners","findNativeElementOrElements","tapWebElementNatively","driver","text","els","rect","proxyCommand","el2","rect2","x","Math","round","nativeWebTap","nativeWebTapStrict","Promise","all","size","coordinates","performTouch","action","options","webview","retryInterval","ign","Error","cmd","wvDims","implicitWaitMs","setImplicitWait","xRatio","yRatio","newCoords","checkForAlert","getAlertText","timer","timing","Timer","start","timedAtomPromise","timeout","handlePromiseError","p","originalError","AggregateError","TimeoutError","getDuration","asMilliSeconds","toFixed","any","delay","isFulfilled","_waitingAtoms","count","alertNotifier","EventEmitter","alertMonitor","onAlertCallback","isResolved","emit","UnexpectedAlertOpenError","once","then","catch","removeListener","mobileWebNav","navType","allowNavigationWithoutReload","mobileUpdateSafariPreferences","isSimulator","preferences","updateSafariSettings","Object","assign","_default","exports","default"],"sources":["../../../lib/commands/web.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { util, timing } from 'appium/support';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport cookieUtils from '../cookies';\nimport { EventEmitter } from 'events';\n\nconst IPHONE_TOP_BAR_HEIGHT = 71;\nconst IPHONE_SCROLLED_TOP_BAR_HEIGHT = 41;\nconst IPHONE_X_SCROLLED_OFFSET = 55;\nconst IPHONE_X_NOTCH_OFFSET_IOS = 24;\nconst IPHONE_X_NOTCH_OFFSET_IOS_13 = 20;\n\nconst IPHONE_LANDSCAPE_TOP_BAR_HEIGHT = 51;\nconst IPHONE_BOTTOM_BAR_OFFSET = 49;\nconst TAB_BAR_OFFSET = 33;\nconst IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET = 84;\nconst IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET = 95;\n\nconst NOTCHED_DEVICE_SIZES = [\n {w: 1125, h: 2436}, // 11 Pro, X, Xs\n {w: 828, h: 1792}, // 11, Xr\n {w: 1242, h: 2688}, // 11 Pro Max, Xs Max\n {w: 1080, h: 2340}, // 13 mini, 12 mini\n {w: 1170, h: 2532}, // 14, 13, 13 Pro, 12, 12 Pro\n {w: 1284, h: 2778}, // 14 Plus, 13 Pro Max, 12 Pro Max\n {w: 1179, h: 2556}, // 14 Pro\n {w: 1290, h: 2796}, // 14 Pro Max\n];\n\nconst { W3C_WEB_ELEMENT_IDENTIFIER } = util;\n\nconst ATOM_WAIT_TIMEOUT_MS = 2 * 60000;\nconst ATOM_INITIAL_WAIT_MS = 1000;\n\nconst ON_OBSTRUCTING_ALERT_EVENT = 'alert';\n\nconst VISIBLE = 'visible';\nconst INVISIBLE = 'invisible';\nconst DETECT = 'detect';\nconst VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];\n\n// The position of Safari's tab (search bar).\n// Since iOS 15, the bar is the bottom by default.\nconst TAB_BAR_POSITION_TOP = 'top';\nconst TAB_BAR_POSITION_BOTTOM = 'bottom';\nconst TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];\n\nconst commands = {}, helpers = {}, extensions = {};\n\nfunction isValidElementIdentifier (id) {\n if (!_.isString(id) && !_.isNumber(id)) {\n return false;\n }\n if (_.isString(id) && _.isEmpty(id)) {\n return false;\n }\n if (_.isNumber(id) && isNaN(id)) {\n return false;\n }\n return true;\n}\n\ncommands.setFrame = async function setFrame (frame) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n if (_.isNull(frame)) {\n this.curWebFrames = [];\n this.log.debug('Leaving web frame and going back to default content');\n return;\n }\n\n if (helpers.hasElementId(frame)) {\n const atomsElement = this.getAtomsElement(frame);\n const value = await this.executeAtom('get_frame_window', [atomsElement]);\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n } else {\n const atom = _.isNumber(frame) ? 'frame_by_index' : 'frame_by_id_or_name';\n const value = await this.executeAtom(atom, [frame]);\n if (_.isNull(value) || _.isUndefined(value.WINDOW)) {\n throw new errors.NoSuchFrameError();\n }\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n }\n};\n\ncommands.getCssProperty = async function getCssProperty (propertyName, el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n return await this.executeAtom('get_value_of_css_property', [atomsElement, propertyName]);\n};\n\ncommands.submit = async function submit (el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n await this.executeAtom('submit', [atomsElement]);\n};\n\ncommands.refresh = async function refresh () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n await this.executeAtom('refresh', []);\n};\n\ncommands.getUrl = async function getUrl () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.remote.execute('window.location.href');\n};\n\ncommands.title = async function title () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.executeAtom('title', [], true);\n};\n\ncommands.setCookie = async function setCookie (cookie) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n cookie = _.clone(cookie);\n\n // if `path` field is not specified, Safari will not update cookies as expected; eg issue #1708\n if (!cookie.path) {\n cookie.path = '/';\n }\n\n const jsCookie = cookieUtils.createJSCookie(cookie.name, cookie.value, {\n expires: _.isNumber(cookie.expiry) ? (new Date(cookie.expiry * 1000)).toUTCString() :\n cookie.expiry,\n path: cookie.path,\n domain: cookie.domain,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure\n });\n let script = `document.cookie = ${JSON.stringify(jsCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\nhelpers.cacheWebElement = function cacheWebElement (el) {\n if (!_.isPlainObject(el)) {\n return el;\n }\n const elId = util.unwrapElement(el);\n if (!isValidElementIdentifier(elId)) {\n return el;\n }\n // In newer debugger releases element identifiers look like `:wdc:1628151649325`\n // We assume it is safe to use these to identify cached elements\n const cacheId = _.includes(elId, ':') ? elId : util.uuidV4();\n this.webElementsCache.set(cacheId, elId);\n return util.wrapElement(cacheId);\n};\n\nhelpers.cacheWebElements = function cacheWebElements (response) {\n const toCached = (v) => _.isArray(v) || _.isPlainObject(v)\n ? this.cacheWebElements(v)\n : v;\n\n if (_.isArray(response)) {\n return response.map(toCached);\n } else if (_.isPlainObject(response)) {\n const result = {...response, ...(this.cacheWebElement(response))};\n return _.toPairs(result).reduce(\n (acc, [key, value]) => {\n acc[key] = toCached(value);\n return acc;\n }, {}\n );\n }\n return response;\n};\n\nextensions.findWebElementOrElements = async function findWebElementOrElements (strategy, selector, many, ctx) {\n const contextElement = _.isNil(ctx) ? null : this.getAtomsElement(ctx);\n let element;\n let doFind = async () => {\n element = await this.executeAtom(`find_element${many ? 's' : ''}`, [strategy, selector, contextElement]);\n return !_.isNull(element);\n };\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && _.isFunction(err.message.match) && err.message.match(/Condition unmet/)) {\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (many) {\n return this.cacheWebElements(element);\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return this.cacheWebElements(element);\n};\n\nextensions.clickWebCoords = async function clickWebCoords () {\n let coords = await this.translateWebCoords(this.curWebCoords);\n await this.clickCoords(coords);\n};\n\nhelpers.executeAtom = async function executeAtom (atom, args, alwaysDefaultFrame = false) {\n let frames = alwaysDefaultFrame === true ? [] : this.curWebFrames;\n let promise = this.remote.executeAtom(atom, args, frames);\n return await this.waitForAtom(promise);\n};\n\nhelpers.executeAtomAsync = async function executeAtomAsync (atom, args, responseUrl) {\n // save the resolve and reject methods of the promise to be waited for\n let promise = new B((resolve, reject) => {\n this.asyncPromise = {resolve, reject};\n });\n await this.remote.executeAtomAsync(atom, args, this.curWebFrames, responseUrl);\n return await this.waitForAtom(promise);\n};\n\nhelpers.getAtomsElement = function getAtomsElement (elOrId) {\n const elId = util.unwrapElement(elOrId);\n if (!this.webElementsCache.has(elId)) {\n throw new errors.StaleElementReferenceError();\n }\n return {ELEMENT: this.webElementsCache.get(elId)};\n};\n\nhelpers.convertElementsForAtoms = function convertElementsForAtoms (args = []) {\n return args.map((arg) => {\n if (helpers.hasElementId(arg)) {\n try {\n return this.getAtomsElement(arg);\n } catch (err) {\n if (!isErrorType(err, errors.StaleElementReferenceError)) {\n throw err;\n }\n }\n return arg;\n }\n return _.isArray(arg) ? this.convertElementsForAtoms(arg) : arg;\n });\n};\n\nhelpers.getElementId = function getElementId (element) {\n return element.ELEMENT || element[W3C_WEB_ELEMENT_IDENTIFIER];\n};\n\nhelpers.hasElementId = function hasElementId (element) {\n return util.hasValue(element) && (util.hasValue(element.ELEMENT) || util.hasValue(element[W3C_WEB_ELEMENT_IDENTIFIER]));\n};\n\nextensions.getSafariIsIphone = async function getSafariIsIphone () {\n if (_.isBoolean(this._isSafariIphone)) {\n return this._isSafariIphone;\n }\n try {\n const userAgent = await this.execute('return navigator.userAgent');\n this._isSafariIphone = userAgent.toLowerCase().includes('iphone');\n } catch (err) {\n this.log.warn(`Unable to find device type from useragent. Assuming iPhone`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariIphone ?? true;\n};\n\nextensions.getSafariDeviceSize = async function getSafariDeviceSize () {\n const script = 'return {height: window.screen.availHeight * window.devicePixelRatio, width: window.screen.availWidth * window.devicePixelRatio};';\n const {width, height} = await this.execute(script);\n const [normHeight, normWidth] = height > width ? [height, width] : [width, height];\n return {\n width: normWidth,\n height: normHeight,\n };\n};\n\nextensions.getSafariIsNotched = async function getSafariIsNotched () {\n if (_.isBoolean(this._isSafariNotched)) {\n return this._isSafariNotched;\n }\n\n try {\n const {width, height} = await this.getSafariDeviceSize();\n for (const device of NOTCHED_DEVICE_SIZES) {\n if (device.w === width && device.h === height) {\n this._isSafariNotched = true;\n }\n }\n } catch (err) {\n this.log.warn(`Unable to find device type from dimensions. Assuming the device is not notched`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariNotched ?? false;\n};\n\nextensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWebCoordsOffset (wvPos, realDims) {\n let topOffset = 0;\n let bottomOffset = 0;\n\n const isIphone = await this.getSafariIsIphone();\n\n // No need to check whether the Smart App Banner or Tab Bar is visible or not\n // if already defined by nativeWebTapTabBarVisibility or nativeWebTapSmartAppBannerVisibility in settings.\n const {\n nativeWebTapTabBarVisibility,\n nativeWebTapSmartAppBannerVisibility,\n safariTabBarPosition = util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone\n ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP,\n } = await this.settings.getSettings();\n let tabBarVisibility = _.lowerCase(nativeWebTapTabBarVisibility);\n let bannerVisibility = _.lowerCase(nativeWebTapSmartAppBannerVisibility);\n const tabBarPosition = _.lowerCase(safariTabBarPosition);\n\n if (!VISIBILITIES.includes(tabBarVisibility)) {\n tabBarVisibility = DETECT;\n }\n if (!VISIBILITIES.includes(bannerVisibility)) {\n bannerVisibility = DETECT;\n }\n\n if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {\n throw new errors.InvalidArgumentError(\n `${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);\n }\n\n const isNotched = isIphone && await this.getSafariIsNotched();\n\n const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';\n\n const notchOffset = isNotched\n ? util.compareVersions(this.opts.platformVersion, '=', '13.0')\n ? IPHONE_X_NOTCH_OFFSET_IOS_13\n : IPHONE_X_NOTCH_OFFSET_IOS\n : 0;\n\n const isScrolled = await this.execute('return document.documentElement.scrollTop > 0');\n if (isScrolled) {\n topOffset = IPHONE_SCROLLED_TOP_BAR_HEIGHT + notchOffset;\n\n if (isNotched) {\n topOffset -= IPHONE_X_SCROLLED_OFFSET;\n }\n\n // If the iPhone is landscape then there is no top bar\n if (orientation === 'LANDSCAPE' && isIphone) {\n topOffset = 0;\n }\n } else {\n topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;\n topOffset += notchOffset;\n this.log.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);\n\n if (isIphone) {\n if (orientation === 'PORTRAIT') {\n // The bottom bar is only visible when portrait\n bottomOffset = IPHONE_BOTTOM_BAR_OFFSET;\n } else {\n topOffset = IPHONE_LANDSCAPE_TOP_BAR_HEIGHT;\n }\n }\n\n if (orientation === 'LANDSCAPE' || !isIphone) {\n if (tabBarVisibility === VISIBLE) {\n topOffset += TAB_BAR_OFFSET;\n } else if (tabBarVisibility === DETECT) {\n // Tabs only appear if the device is landscape or if it's an iPad so we only check visibility in this case\n // Assume that each tab bar is a WebView\n const contextsAndViews = await this.getContextsAndViews();\n const tabs = contextsAndViews.filter((ctx) => ctx.id.startsWith('WEBVIEW_'));\n\n if (tabs.length > 1) {\n this.log.debug(`Found ${tabs.length} tabs. Assuming the tab bar is visible`);\n topOffset += TAB_BAR_OFFSET;\n }\n }\n }\n }\n\n topOffset += await this.getExtraNativeWebTapOffset(isIphone, bannerVisibility);\n\n wvPos.y += topOffset;\n realDims.h -= (topOffset + bottomOffset);\n};\n\nextensions.getExtraNativeWebTapOffset = async function getExtraNativeWebTapOffset (isIphone, bannerVisibility) {\n let offset = 0;\n\n if (bannerVisibility === VISIBLE) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n } else if (bannerVisibility === DETECT) {\n // try to see if there is an Smart App Banner\n const banners = await this.findNativeElementOrElements('accessibility id', 'Close app download offer', true);\n if (banners.length > 0) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n }\n }\n\n this.log.debug(`Additional native web tap offset computed: ${offset}`);\n return offset;\n};\n\nasync function tapWebElementNatively (driver, atomsElement) {\n // try to get the text of the element, which will be accessible in the\n // native context\n try {\n let text = await driver.executeAtom('get_text', [atomsElement]);\n if (!text) {\n text = await driver.executeAtom('get_attribute_value', [atomsElement, 'value']);\n }\n\n if (text) {\n const els = await driver.findNativeElementOrElements('accessibility id', text, true);\n if (els.length === 1 || els.length === 2) {\n const el = els[0];\n // use tap because on iOS 11.2 and below `nativeClick` crashes WDA\n const rect = await driver.proxyCommand(`/element/${util.unwrapElement(el)}/rect`, 'GET');\n if (els.length === 2) {\n const el2 = els[1];\n const rect2 = await driver.proxyCommand(`/element/${util.unwrapElement(el2)}/rect`, 'GET');\n\n if ((rect.x !== rect2.x || rect.y !== rect2.y) ||\n (rect.width !== rect2.width || rect.height !== rect2.height)) {\n // These 2 native elements are not referring to the same web element\n return false;\n }\n }\n const coords = {\n x: Math.round(rect.x + rect.width / 2),\n y: Math.round(rect.y + rect.height / 2),\n };\n await driver.clickCoords(coords);\n return true;\n }\n }\n } catch (err) {\n // any failure should fall through and trigger the more elaborate\n // method of clicking\n driver.log.warn(`Error attempting to click: ${err.message}`);\n }\n return false;\n}\n\nextensions.nativeWebTap = async function nativeWebTap (el) {\n const atomsElement = this.getAtomsElement(el);\n\n // if strict native tap, do not try to do it with WDA directly\n if (!(await this.settings.getSettings()).nativeWebTapStrict && await tapWebElementNatively(this, atomsElement)) {\n return;\n }\n this.log.warn('Unable to do simple native web tap. Attempting to convert coordinates');\n\n // `get_top_left_coordinates` returns the wrong value sometimes,\n // unless we pre-call both of these functions before the actual calls\n await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n\n const [size, coordinates] = await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n const {width, height} = size;\n let {x, y} = coordinates;\n x += width / 2;\n y += height / 2;\n\n this.curWebCoords = {x, y};\n await this.clickWebCoords();\n};\n\nextensions.clickCoords = async function clickCoords (coords) {\n await this.performTouch([\n {\n action: 'tap',\n options: coords,\n },\n ]);\n};\n\nextensions.translateWebCoords = async function translateWebCoords (coords) {\n this.log.debug(`Translating coordinates (${JSON.stringify(coords)}) to web coordinates`);\n\n // absolutize web coords\n let webview;\n try {\n webview = await retryInterval(5, 100, async () => await this.findNativeElementOrElements('class name', 'XCUIElementTypeWebView', false));\n } catch (ign) {}\n\n if (!webview) {\n throw new Error(`No WebView found. Unable to translate web coordinates for native web tap.`);\n }\n\n webview = util.unwrapElement(webview);\n\n const rect = await this.proxyCommand(`/element/${webview}/rect`, 'GET');\n const wvPos = {x: rect.x, y: rect.y};\n const realDims = {w: rect.width, h: rect.height};\n\n const cmd = '(function () { return {w: window.innerWidth, h: window.innerHeight}; })()';\n const wvDims = await this.remote.execute(cmd);\n\n // keep track of implicit wait, and set locally to 0\n // https://github.com/appium/appium/issues/14988\n const implicitWaitMs = this.implicitWaitMs;\n await this.setImplicitWait(0);\n try {\n await this.getExtraTranslateWebCoordsOffset(wvPos, realDims);\n } finally {\n await this.setImplicitWait(implicitWaitMs);\n }\n\n if (wvDims && realDims && wvPos) {\n let xRatio = realDims.w / wvDims.w;\n let yRatio = realDims.h / wvDims.h;\n let newCoords = {\n x: wvPos.x + Math.round(xRatio * coords.x),\n y: wvPos.y + Math.round(yRatio * coords.y),\n };\n\n // additional logging for coordinates, since it is sometimes broken\n // see https://github.com/appium/appium/issues/9159\n this.log.debug(`Converted coordinates: ${JSON.stringify(newCoords)}`);\n this.log.debug(` rect: ${JSON.stringify(rect)}`);\n this.log.debug(` wvPos: ${JSON.stringify(wvPos)}`);\n this.log.debug(` realDims: ${JSON.stringify(realDims)}`);\n this.log.debug(` wvDims: ${JSON.stringify(wvDims)}`);\n this.log.debug(` xRatio: ${JSON.stringify(xRatio)}`);\n this.log.debug(` yRatio: ${JSON.stringify(yRatio)}`);\n\n this.log.debug(`Converted web coords ${JSON.stringify(coords)} ` +\n `into real coords ${JSON.stringify(newCoords)}`);\n return newCoords;\n }\n};\n\nextensions.checkForAlert = async function checkForAlert () {\n return _.isString(await this.getAlertText());\n};\n\nextensions.waitForAtom = async function waitForAtom (promise) {\n const timer = new timing.Timer().start();\n\n // need to check for alert while the atom is being executed.\n // so notify ourselves when it happens\n const timedAtomPromise = B.resolve(promise).timeout(ATOM_WAIT_TIMEOUT_MS);\n const handlePromiseError = async (p) => {\n try {\n return await p;\n } catch (err) {\n const originalError = (err instanceof B.AggregateError) ? err[0] : err;\n this.log.debug(`Error received while executing atom: ${originalError.message}`);\n if (originalError instanceof B.TimeoutError) {\n throw new Error(`Did not get any response for atom execution after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n throw originalError;\n }\n };\n // if the atom promise is fulfilled within ATOM_INITIAL_WAIT_MS\n // then we don't need to check for an alert presence\n await handlePromiseError(B.any([B.delay(ATOM_INITIAL_WAIT_MS), timedAtomPromise]));\n if (timedAtomPromise.isFulfilled()) {\n return await timedAtomPromise;\n }\n\n // ...otherwise make sure there is no unexpected alert covering the element\n if (!_.isPlainObject(this._waitingAtoms)) {\n this._waitingAtoms = {\n count: 0,\n alertNotifier: new EventEmitter(),\n alertMonitor: B.resolve(),\n };\n }\n this._waitingAtoms.count++;\n\n let onAlertCallback;\n try {\n // only restart the monitor if it is not running already\n if (this._waitingAtoms.alertMonitor.isResolved()) {\n this._waitingAtoms.alertMonitor = B.resolve((async () => {\n while (this._waitingAtoms.count > 0) {\n try {\n if (await this.checkForAlert()) {\n this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);\n }\n } catch (ign) {}\n await B.delay(ATOM_INITIAL_WAIT_MS / 2);\n }\n })());\n }\n\n return await new B((resolve, reject) => {\n onAlertCallback = () => reject(new errors.UnexpectedAlertOpenError());\n this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n handlePromiseError(timedAtomPromise)\n // eslint-disable-next-line promise/prefer-await-to-then\n .then(resolve)\n .catch(reject);\n });\n } finally {\n if (onAlertCallback) {\n this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n }\n this._waitingAtoms.count--;\n }\n};\n\nextensions.mobileWebNav = async function mobileWebNav (navType) {\n this.remote.allowNavigationWithoutReload = true;\n try {\n await this.executeAtom('execute_script', [`history.${navType}();`, null]);\n } finally {\n this.remote.allowNavigationWithoutReload = false;\n }\n};\n\n/**\n * @typedef {Object} SafariOpts\n * @property {object} preferences An object containing Safari settings to be updated.\n * The list of available setting names and their values could be retrieved by\n * changing the corresponding Safari settings in the UI and then inspecting\n * 'Library/Preferences/com.apple.mobilesafari.plist' file inside of\n * com.apple.mobilesafari app container.\n * The full path to the Mobile Safari's container could be retrieved from\n * `xcrun simctl get_app_container <sim_udid> com.apple.mobilesafari data`\n * command output.\n * Use the `xcrun simctl spawn <sim_udid> defaults read <path_to_plist>` command\n * to print the plist content to the Terminal.\n */\n\n/**\n * Updates preferences of Mobile Safari on Simulator\n *\n * @param {SafariOpts} opts\n */\ncommands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPreferences (opts = {}) {\n if (!this.isSimulator()) {\n throw new Error('This extension is only available for Simulator');\n }\n const { preferences } = opts;\n if (!_.isPlainObject(preferences)) {\n throw new errors.InvalidArgumentError('\"preferences\" argument must be a valid object');\n }\n\n this.log.debug(`About to update Safari preferences: ${JSON.stringify(preferences)}`);\n await this.opts.device.updateSafariSettings(preferences);\n};\n\nObject.assign(commands, extensions, helpers);\n\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","names":["_asyncbox","require","_support","_lodash","_interopRequireDefault","_bluebird","_driver","_cookies","_events","IPHONE_TOP_BAR_HEIGHT","IPHONE_SCROLLED_TOP_BAR_HEIGHT","IPHONE_X_SCROLLED_OFFSET","IPHONE_X_NOTCH_OFFSET_IOS","IPHONE_X_NOTCH_OFFSET_IOS_13","IPHONE_LANDSCAPE_TOP_BAR_HEIGHT","IPHONE_BOTTOM_BAR_OFFSET","TAB_BAR_OFFSET","IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET","IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET","NOTCHED_DEVICE_SIZES","w","h","W3C_WEB_ELEMENT_IDENTIFIER","util","ATOM_WAIT_TIMEOUT_MS","ATOM_INITIAL_WAIT_MS","ON_OBSTRUCTING_ALERT_EVENT","ON_APP_CRASH_EVENT","VISIBLE","INVISIBLE","DETECT","VISIBILITIES","TAB_BAR_POSITION_TOP","TAB_BAR_POSITION_BOTTOM","TAB_BAR_POSSITIONS","commands","helpers","extensions","isValidElementIdentifier","id","_","isString","isNumber","isEmpty","isNaN","setFrame","frame","isWebContext","errors","NotImplementedError","isNull","curWebFrames","log","debug","hasElementId","atomsElement","getAtomsElement","value","executeAtom","WINDOW","unshift","atom","isUndefined","NoSuchFrameError","getCssProperty","propertyName","el","submit","refresh","getUrl","remote","execute","title","setCookie","cookie","clone","path","jsCookie","cookieUtils","createJSCookie","name","expires","expiry","Date","toUTCString","domain","httpOnly","secure","script","JSON","stringify","cacheWebElement","isPlainObject","elId","unwrapElement","cacheId","includes","uuidV4","webElementsCache","set","wrapElement","cacheWebElements","response","toCached","v","isArray","map","result","toPairs","reduce","acc","key","findWebElementOrElements","strategy","selector","many","ctx","contextElement","isNil","element","doFind","implicitWaitForCondition","err","message","isFunction","match","NoSuchElementError","clickWebCoords","coords","translateWebCoords","curWebCoords","clickCoords","args","alwaysDefaultFrame","frames","promise","waitForAtom","executeAtomAsync","responseUrl","B","resolve","reject","asyncPromise","elOrId","has","StaleElementReferenceError","ELEMENT","get","convertElementsForAtoms","arg","isErrorType","getElementId","hasValue","getSafariIsIphone","isBoolean","_isSafariIphone","userAgent","toLowerCase","warn","getSafariDeviceSize","width","height","normHeight","normWidth","getSafariIsNotched","_isSafariNotched","device","getExtraTranslateWebCoordsOffset","wvPos","realDims","topOffset","bottomOffset","isIphone","nativeWebTapTabBarVisibility","nativeWebTapSmartAppBannerVisibility","safariTabBarPosition","compareVersions","opts","platformVersion","settings","getSettings","tabBarVisibility","lowerCase","bannerVisibility","tabBarPosition","InvalidArgumentError","isNotched","orientation","notchOffset","isScrolled","contextsAndViews","getContextsAndViews","tabs","filter","startsWith","length","getExtraNativeWebTapOffset","y","offset","banners","findNativeElementOrElements","tapWebElementNatively","driver","text","els","rect","proxyCommand","el2","rect2","x","Math","round","nativeWebTap","nativeWebTapStrict","Promise","all","size","coordinates","performTouch","action","options","webview","retryInterval","ign","Error","cmd","wvDims","implicitWaitMs","setImplicitWait","xRatio","yRatio","newCoords","checkForAlert","getAlertText","timer","timing","Timer","start","timedAtomPromise","timeout","handlePromiseError","p","originalError","AggregateError","TimeoutError","getDuration","asMilliSeconds","toFixed","any","delay","isFulfilled","_waitingAtoms","count","alertNotifier","EventEmitter","alertMonitor","onAlertCallback","onAppCrashCallback","isResolved","emit","InvalidElementStateError","UnexpectedAlertOpenError","once","then","catch","removeListener","mobileWebNav","navType","allowNavigationWithoutReload","mobileUpdateSafariPreferences","isSimulator","preferences","updateSafariSettings","Object","assign","_default","exports","default"],"sources":["../../../lib/commands/web.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { util, timing } from 'appium/support';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport cookieUtils from '../cookies';\nimport { EventEmitter } from 'events';\n\nconst IPHONE_TOP_BAR_HEIGHT = 71;\nconst IPHONE_SCROLLED_TOP_BAR_HEIGHT = 41;\nconst IPHONE_X_SCROLLED_OFFSET = 55;\nconst IPHONE_X_NOTCH_OFFSET_IOS = 24;\nconst IPHONE_X_NOTCH_OFFSET_IOS_13 = 20;\n\nconst IPHONE_LANDSCAPE_TOP_BAR_HEIGHT = 51;\nconst IPHONE_BOTTOM_BAR_OFFSET = 49;\nconst TAB_BAR_OFFSET = 33;\nconst IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET = 84;\nconst IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET = 95;\n\nconst NOTCHED_DEVICE_SIZES = [\n {w: 1125, h: 2436}, // 11 Pro, X, Xs\n {w: 828, h: 1792}, // 11, Xr\n {w: 1242, h: 2688}, // 11 Pro Max, Xs Max\n {w: 1080, h: 2340}, // 13 mini, 12 mini\n {w: 1170, h: 2532}, // 14, 13, 13 Pro, 12, 12 Pro\n {w: 1284, h: 2778}, // 14 Plus, 13 Pro Max, 12 Pro Max\n {w: 1179, h: 2556}, // 14 Pro\n {w: 1290, h: 2796}, // 14 Pro Max\n];\n\nconst { W3C_WEB_ELEMENT_IDENTIFIER } = util;\n\nconst ATOM_WAIT_TIMEOUT_MS = 2 * 60000;\nconst ATOM_INITIAL_WAIT_MS = 1000;\n\nconst ON_OBSTRUCTING_ALERT_EVENT = 'alert';\nconst ON_APP_CRASH_EVENT = 'app_crash';\n\nconst VISIBLE = 'visible';\nconst INVISIBLE = 'invisible';\nconst DETECT = 'detect';\nconst VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];\n\n// The position of Safari's tab (search bar).\n// Since iOS 15, the bar is the bottom by default.\nconst TAB_BAR_POSITION_TOP = 'top';\nconst TAB_BAR_POSITION_BOTTOM = 'bottom';\nconst TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];\n\nconst commands = {}, helpers = {}, extensions = {};\n\nfunction isValidElementIdentifier (id) {\n if (!_.isString(id) && !_.isNumber(id)) {\n return false;\n }\n if (_.isString(id) && _.isEmpty(id)) {\n return false;\n }\n if (_.isNumber(id) && isNaN(id)) {\n return false;\n }\n return true;\n}\n\ncommands.setFrame = async function setFrame (frame) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n if (_.isNull(frame)) {\n this.curWebFrames = [];\n this.log.debug('Leaving web frame and going back to default content');\n return;\n }\n\n if (helpers.hasElementId(frame)) {\n const atomsElement = this.getAtomsElement(frame);\n const value = await this.executeAtom('get_frame_window', [atomsElement]);\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n } else {\n const atom = _.isNumber(frame) ? 'frame_by_index' : 'frame_by_id_or_name';\n const value = await this.executeAtom(atom, [frame]);\n if (_.isNull(value) || _.isUndefined(value.WINDOW)) {\n throw new errors.NoSuchFrameError();\n }\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n }\n};\n\ncommands.getCssProperty = async function getCssProperty (propertyName, el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n return await this.executeAtom('get_value_of_css_property', [atomsElement, propertyName]);\n};\n\ncommands.submit = async function submit (el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n await this.executeAtom('submit', [atomsElement]);\n};\n\ncommands.refresh = async function refresh () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n await this.executeAtom('refresh', []);\n};\n\ncommands.getUrl = async function getUrl () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.remote.execute('window.location.href');\n};\n\ncommands.title = async function title () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.executeAtom('title', [], true);\n};\n\ncommands.setCookie = async function setCookie (cookie) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n cookie = _.clone(cookie);\n\n // if `path` field is not specified, Safari will not update cookies as expected; eg issue #1708\n if (!cookie.path) {\n cookie.path = '/';\n }\n\n const jsCookie = cookieUtils.createJSCookie(cookie.name, cookie.value, {\n expires: _.isNumber(cookie.expiry) ? (new Date(cookie.expiry * 1000)).toUTCString() :\n cookie.expiry,\n path: cookie.path,\n domain: cookie.domain,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure\n });\n let script = `document.cookie = ${JSON.stringify(jsCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\nhelpers.cacheWebElement = function cacheWebElement (el) {\n if (!_.isPlainObject(el)) {\n return el;\n }\n const elId = util.unwrapElement(el);\n if (!isValidElementIdentifier(elId)) {\n return el;\n }\n // In newer debugger releases element identifiers look like `:wdc:1628151649325`\n // We assume it is safe to use these to identify cached elements\n const cacheId = _.includes(elId, ':') ? elId : util.uuidV4();\n this.webElementsCache.set(cacheId, elId);\n return util.wrapElement(cacheId);\n};\n\nhelpers.cacheWebElements = function cacheWebElements (response) {\n const toCached = (v) => _.isArray(v) || _.isPlainObject(v)\n ? this.cacheWebElements(v)\n : v;\n\n if (_.isArray(response)) {\n return response.map(toCached);\n } else if (_.isPlainObject(response)) {\n const result = {...response, ...(this.cacheWebElement(response))};\n return _.toPairs(result).reduce(\n (acc, [key, value]) => {\n acc[key] = toCached(value);\n return acc;\n }, {}\n );\n }\n return response;\n};\n\nextensions.findWebElementOrElements = async function findWebElementOrElements (strategy, selector, many, ctx) {\n const contextElement = _.isNil(ctx) ? null : this.getAtomsElement(ctx);\n let element;\n let doFind = async () => {\n element = await this.executeAtom(`find_element${many ? 's' : ''}`, [strategy, selector, contextElement]);\n return !_.isNull(element);\n };\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && _.isFunction(err.message.match) && err.message.match(/Condition unmet/)) {\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (many) {\n return this.cacheWebElements(element);\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return this.cacheWebElements(element);\n};\n\nextensions.clickWebCoords = async function clickWebCoords () {\n let coords = await this.translateWebCoords(this.curWebCoords);\n await this.clickCoords(coords);\n};\n\nhelpers.executeAtom = async function executeAtom (atom, args, alwaysDefaultFrame = false) {\n let frames = alwaysDefaultFrame === true ? [] : this.curWebFrames;\n let promise = this.remote.executeAtom(atom, args, frames);\n return await this.waitForAtom(promise);\n};\n\nhelpers.executeAtomAsync = async function executeAtomAsync (atom, args, responseUrl) {\n // save the resolve and reject methods of the promise to be waited for\n let promise = new B((resolve, reject) => {\n this.asyncPromise = {resolve, reject};\n });\n await this.remote.executeAtomAsync(atom, args, this.curWebFrames, responseUrl);\n return await this.waitForAtom(promise);\n};\n\nhelpers.getAtomsElement = function getAtomsElement (elOrId) {\n const elId = util.unwrapElement(elOrId);\n if (!this.webElementsCache.has(elId)) {\n throw new errors.StaleElementReferenceError();\n }\n return {ELEMENT: this.webElementsCache.get(elId)};\n};\n\nhelpers.convertElementsForAtoms = function convertElementsForAtoms (args = []) {\n return args.map((arg) => {\n if (helpers.hasElementId(arg)) {\n try {\n return this.getAtomsElement(arg);\n } catch (err) {\n if (!isErrorType(err, errors.StaleElementReferenceError)) {\n throw err;\n }\n }\n return arg;\n }\n return _.isArray(arg) ? this.convertElementsForAtoms(arg) : arg;\n });\n};\n\nhelpers.getElementId = function getElementId (element) {\n return element.ELEMENT || element[W3C_WEB_ELEMENT_IDENTIFIER];\n};\n\nhelpers.hasElementId = function hasElementId (element) {\n return util.hasValue(element) && (util.hasValue(element.ELEMENT) || util.hasValue(element[W3C_WEB_ELEMENT_IDENTIFIER]));\n};\n\nextensions.getSafariIsIphone = async function getSafariIsIphone () {\n if (_.isBoolean(this._isSafariIphone)) {\n return this._isSafariIphone;\n }\n try {\n const userAgent = await this.execute('return navigator.userAgent');\n this._isSafariIphone = userAgent.toLowerCase().includes('iphone');\n } catch (err) {\n this.log.warn(`Unable to find device type from useragent. Assuming iPhone`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariIphone ?? true;\n};\n\nextensions.getSafariDeviceSize = async function getSafariDeviceSize () {\n const script = 'return {height: window.screen.availHeight * window.devicePixelRatio, width: window.screen.availWidth * window.devicePixelRatio};';\n const {width, height} = await this.execute(script);\n const [normHeight, normWidth] = height > width ? [height, width] : [width, height];\n return {\n width: normWidth,\n height: normHeight,\n };\n};\n\nextensions.getSafariIsNotched = async function getSafariIsNotched () {\n if (_.isBoolean(this._isSafariNotched)) {\n return this._isSafariNotched;\n }\n\n try {\n const {width, height} = await this.getSafariDeviceSize();\n for (const device of NOTCHED_DEVICE_SIZES) {\n if (device.w === width && device.h === height) {\n this._isSafariNotched = true;\n }\n }\n } catch (err) {\n this.log.warn(`Unable to find device type from dimensions. Assuming the device is not notched`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariNotched ?? false;\n};\n\nextensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWebCoordsOffset (wvPos, realDims) {\n let topOffset = 0;\n let bottomOffset = 0;\n\n const isIphone = await this.getSafariIsIphone();\n\n // No need to check whether the Smart App Banner or Tab Bar is visible or not\n // if already defined by nativeWebTapTabBarVisibility or nativeWebTapSmartAppBannerVisibility in settings.\n const {\n nativeWebTapTabBarVisibility,\n nativeWebTapSmartAppBannerVisibility,\n safariTabBarPosition = util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone\n ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP,\n } = await this.settings.getSettings();\n let tabBarVisibility = _.lowerCase(nativeWebTapTabBarVisibility);\n let bannerVisibility = _.lowerCase(nativeWebTapSmartAppBannerVisibility);\n const tabBarPosition = _.lowerCase(safariTabBarPosition);\n\n if (!VISIBILITIES.includes(tabBarVisibility)) {\n tabBarVisibility = DETECT;\n }\n if (!VISIBILITIES.includes(bannerVisibility)) {\n bannerVisibility = DETECT;\n }\n\n if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {\n throw new errors.InvalidArgumentError(\n `${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);\n }\n\n const isNotched = isIphone && await this.getSafariIsNotched();\n\n const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';\n\n const notchOffset = isNotched\n ? util.compareVersions(this.opts.platformVersion, '=', '13.0')\n ? IPHONE_X_NOTCH_OFFSET_IOS_13\n : IPHONE_X_NOTCH_OFFSET_IOS\n : 0;\n\n const isScrolled = await this.execute('return document.documentElement.scrollTop > 0');\n if (isScrolled) {\n topOffset = IPHONE_SCROLLED_TOP_BAR_HEIGHT + notchOffset;\n\n if (isNotched) {\n topOffset -= IPHONE_X_SCROLLED_OFFSET;\n }\n\n // If the iPhone is landscape then there is no top bar\n if (orientation === 'LANDSCAPE' && isIphone) {\n topOffset = 0;\n }\n } else {\n topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;\n topOffset += notchOffset;\n this.log.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);\n\n if (isIphone) {\n if (orientation === 'PORTRAIT') {\n // The bottom bar is only visible when portrait\n bottomOffset = IPHONE_BOTTOM_BAR_OFFSET;\n } else {\n topOffset = IPHONE_LANDSCAPE_TOP_BAR_HEIGHT;\n }\n }\n\n if (orientation === 'LANDSCAPE' || !isIphone) {\n if (tabBarVisibility === VISIBLE) {\n topOffset += TAB_BAR_OFFSET;\n } else if (tabBarVisibility === DETECT) {\n // Tabs only appear if the device is landscape or if it's an iPad so we only check visibility in this case\n // Assume that each tab bar is a WebView\n const contextsAndViews = await this.getContextsAndViews();\n const tabs = contextsAndViews.filter((ctx) => ctx.id.startsWith('WEBVIEW_'));\n\n if (tabs.length > 1) {\n this.log.debug(`Found ${tabs.length} tabs. Assuming the tab bar is visible`);\n topOffset += TAB_BAR_OFFSET;\n }\n }\n }\n }\n\n topOffset += await this.getExtraNativeWebTapOffset(isIphone, bannerVisibility);\n\n wvPos.y += topOffset;\n realDims.h -= (topOffset + bottomOffset);\n};\n\nextensions.getExtraNativeWebTapOffset = async function getExtraNativeWebTapOffset (isIphone, bannerVisibility) {\n let offset = 0;\n\n if (bannerVisibility === VISIBLE) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n } else if (bannerVisibility === DETECT) {\n // try to see if there is an Smart App Banner\n const banners = await this.findNativeElementOrElements('accessibility id', 'Close app download offer', true);\n if (banners.length > 0) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n }\n }\n\n this.log.debug(`Additional native web tap offset computed: ${offset}`);\n return offset;\n};\n\nasync function tapWebElementNatively (driver, atomsElement) {\n // try to get the text of the element, which will be accessible in the\n // native context\n try {\n let text = await driver.executeAtom('get_text', [atomsElement]);\n if (!text) {\n text = await driver.executeAtom('get_attribute_value', [atomsElement, 'value']);\n }\n\n if (text) {\n const els = await driver.findNativeElementOrElements('accessibility id', text, true);\n if (els.length === 1 || els.length === 2) {\n const el = els[0];\n // use tap because on iOS 11.2 and below `nativeClick` crashes WDA\n const rect = await driver.proxyCommand(`/element/${util.unwrapElement(el)}/rect`, 'GET');\n if (els.length === 2) {\n const el2 = els[1];\n const rect2 = await driver.proxyCommand(`/element/${util.unwrapElement(el2)}/rect`, 'GET');\n\n if ((rect.x !== rect2.x || rect.y !== rect2.y) ||\n (rect.width !== rect2.width || rect.height !== rect2.height)) {\n // These 2 native elements are not referring to the same web element\n return false;\n }\n }\n const coords = {\n x: Math.round(rect.x + rect.width / 2),\n y: Math.round(rect.y + rect.height / 2),\n };\n await driver.clickCoords(coords);\n return true;\n }\n }\n } catch (err) {\n // any failure should fall through and trigger the more elaborate\n // method of clicking\n driver.log.warn(`Error attempting to click: ${err.message}`);\n }\n return false;\n}\n\nextensions.nativeWebTap = async function nativeWebTap (el) {\n const atomsElement = this.getAtomsElement(el);\n\n // if strict native tap, do not try to do it with WDA directly\n if (!(await this.settings.getSettings()).nativeWebTapStrict && await tapWebElementNatively(this, atomsElement)) {\n return;\n }\n this.log.warn('Unable to do simple native web tap. Attempting to convert coordinates');\n\n // `get_top_left_coordinates` returns the wrong value sometimes,\n // unless we pre-call both of these functions before the actual calls\n await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n\n const [size, coordinates] = await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n const {width, height} = size;\n let {x, y} = coordinates;\n x += width / 2;\n y += height / 2;\n\n this.curWebCoords = {x, y};\n await this.clickWebCoords();\n};\n\nextensions.clickCoords = async function clickCoords (coords) {\n await this.performTouch([\n {\n action: 'tap',\n options: coords,\n },\n ]);\n};\n\nextensions.translateWebCoords = async function translateWebCoords (coords) {\n this.log.debug(`Translating coordinates (${JSON.stringify(coords)}) to web coordinates`);\n\n // absolutize web coords\n let webview;\n try {\n webview = await retryInterval(5, 100, async () => await this.findNativeElementOrElements('class name', 'XCUIElementTypeWebView', false));\n } catch (ign) {}\n\n if (!webview) {\n throw new Error(`No WebView found. Unable to translate web coordinates for native web tap.`);\n }\n\n webview = util.unwrapElement(webview);\n\n const rect = await this.proxyCommand(`/element/${webview}/rect`, 'GET');\n const wvPos = {x: rect.x, y: rect.y};\n const realDims = {w: rect.width, h: rect.height};\n\n const cmd = '(function () { return {w: window.innerWidth, h: window.innerHeight}; })()';\n const wvDims = await this.remote.execute(cmd);\n\n // keep track of implicit wait, and set locally to 0\n // https://github.com/appium/appium/issues/14988\n const implicitWaitMs = this.implicitWaitMs;\n await this.setImplicitWait(0);\n try {\n await this.getExtraTranslateWebCoordsOffset(wvPos, realDims);\n } finally {\n await this.setImplicitWait(implicitWaitMs);\n }\n\n if (wvDims && realDims && wvPos) {\n let xRatio = realDims.w / wvDims.w;\n let yRatio = realDims.h / wvDims.h;\n let newCoords = {\n x: wvPos.x + Math.round(xRatio * coords.x),\n y: wvPos.y + Math.round(yRatio * coords.y),\n };\n\n // additional logging for coordinates, since it is sometimes broken\n // see https://github.com/appium/appium/issues/9159\n this.log.debug(`Converted coordinates: ${JSON.stringify(newCoords)}`);\n this.log.debug(` rect: ${JSON.stringify(rect)}`);\n this.log.debug(` wvPos: ${JSON.stringify(wvPos)}`);\n this.log.debug(` realDims: ${JSON.stringify(realDims)}`);\n this.log.debug(` wvDims: ${JSON.stringify(wvDims)}`);\n this.log.debug(` xRatio: ${JSON.stringify(xRatio)}`);\n this.log.debug(` yRatio: ${JSON.stringify(yRatio)}`);\n\n this.log.debug(`Converted web coords ${JSON.stringify(coords)} ` +\n `into real coords ${JSON.stringify(newCoords)}`);\n return newCoords;\n }\n};\n\nextensions.checkForAlert = async function checkForAlert () {\n return _.isString(await this.getAlertText());\n};\n\nextensions.waitForAtom = async function waitForAtom (promise) {\n const timer = new timing.Timer().start();\n\n // need to check for alert while the atom is being executed.\n // so notify ourselves when it happens\n const timedAtomPromise = B.resolve(promise).timeout(ATOM_WAIT_TIMEOUT_MS);\n const handlePromiseError = async (p) => {\n try {\n return await p;\n } catch (err) {\n const originalError = (err instanceof B.AggregateError) ? err[0] : err;\n this.log.debug(`Error received while executing atom: ${originalError.message}`);\n if (originalError instanceof B.TimeoutError) {\n throw new errors.TimeoutError(`Did not get any response for atom execution after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n throw originalError;\n }\n };\n // if the atom promise is fulfilled within ATOM_INITIAL_WAIT_MS\n // then we don't need to check for an alert presence\n await handlePromiseError(B.any([B.delay(ATOM_INITIAL_WAIT_MS), timedAtomPromise]));\n if (timedAtomPromise.isFulfilled()) {\n return await timedAtomPromise;\n }\n\n // ...otherwise make sure there is no unexpected alert covering the element\n if (!_.isPlainObject(this._waitingAtoms)) {\n this._waitingAtoms = {\n count: 0,\n alertNotifier: new EventEmitter(),\n alertMonitor: B.resolve(),\n };\n }\n this._waitingAtoms.count++;\n\n let onAlertCallback;\n let onAppCrashCallback;\n try {\n // only restart the monitor if it is not running already\n if (this._waitingAtoms.alertMonitor.isResolved()) {\n this._waitingAtoms.alertMonitor = B.resolve((async () => {\n while (this._waitingAtoms.count > 0) {\n try {\n if (await this.checkForAlert()) {\n this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);\n }\n } catch (err) {\n if (isErrorType(err, errors.InvalidElementStateError)) {\n this._waitingAtoms.alertNotifier.emit(ON_APP_CRASH_EVENT, err);\n }\n }\n await B.delay(ATOM_INITIAL_WAIT_MS / 2);\n }\n })());\n }\n\n return await new B((resolve, reject) => {\n onAlertCallback = () => reject(new errors.UnexpectedAlertOpenError());\n onAppCrashCallback = reject;\n this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n this._waitingAtoms.alertNotifier.once(ON_APP_CRASH_EVENT, onAppCrashCallback);\n handlePromiseError(timedAtomPromise)\n // eslint-disable-next-line promise/prefer-await-to-then\n .then(resolve)\n .catch(reject);\n });\n } finally {\n if (onAlertCallback) {\n this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n }\n if (onAppCrashCallback) {\n this._waitingAtoms.alertNotifier.removeListener(ON_APP_CRASH_EVENT, onAppCrashCallback);\n }\n this._waitingAtoms.count--;\n }\n};\n\nextensions.mobileWebNav = async function mobileWebNav (navType) {\n this.remote.allowNavigationWithoutReload = true;\n try {\n await this.executeAtom('execute_script', [`history.${navType}();`, null]);\n } finally {\n this.remote.allowNavigationWithoutReload = false;\n }\n};\n\n/**\n * @typedef {Object} SafariOpts\n * @property {object} preferences An object containing Safari settings to be updated.\n * The list of available setting names and their values could be retrieved by\n * changing the corresponding Safari settings in the UI and then inspecting\n * 'Library/Preferences/com.apple.mobilesafari.plist' file inside of\n * com.apple.mobilesafari app container.\n * The full path to the Mobile Safari's container could be retrieved from\n * `xcrun simctl get_app_container <sim_udid> com.apple.mobilesafari data`\n * command output.\n * Use the `xcrun simctl spawn <sim_udid> defaults read <path_to_plist>` command\n * to print the plist content to the Terminal.\n */\n\n/**\n * Updates preferences of Mobile Safari on Simulator\n *\n * @param {SafariOpts} opts\n */\ncommands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPreferences (opts = {}) {\n if (!this.isSimulator()) {\n throw new Error('This extension is only available for Simulator');\n }\n const { preferences } = opts;\n if (!_.isPlainObject(preferences)) {\n throw new errors.InvalidArgumentError('\"preferences\" argument must be a valid object');\n }\n\n this.log.debug(`About to update Safari preferences: ${JSON.stringify(preferences)}`);\n await this.opts.device.updateSafariSettings(preferences);\n};\n\nObject.assign(commands, extensions, helpers);\n\nexport default commands;\n"],"mappings":"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"}
@@ -35,6 +35,7 @@ const ATOM_WAIT_TIMEOUT_MS = 2 * 60000;
35
35
  const ATOM_INITIAL_WAIT_MS = 1000;
36
36
 
37
37
  const ON_OBSTRUCTING_ALERT_EVENT = 'alert';
38
+ const ON_APP_CRASH_EVENT = 'app_crash';
38
39
 
39
40
  const VISIBLE = 'visible';
40
41
  const INVISIBLE = 'invisible';
@@ -573,7 +574,7 @@ extensions.waitForAtom = async function waitForAtom (promise) {
573
574
  const originalError = (err instanceof B.AggregateError) ? err[0] : err;
574
575
  this.log.debug(`Error received while executing atom: ${originalError.message}`);
575
576
  if (originalError instanceof B.TimeoutError) {
576
- throw new Error(`Did not get any response for atom execution after ` +
577
+ throw new errors.TimeoutError(`Did not get any response for atom execution after ` +
577
578
  `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
578
579
  }
579
580
  throw originalError;
@@ -597,6 +598,7 @@ extensions.waitForAtom = async function waitForAtom (promise) {
597
598
  this._waitingAtoms.count++;
598
599
 
599
600
  let onAlertCallback;
601
+ let onAppCrashCallback;
600
602
  try {
601
603
  // only restart the monitor if it is not running already
602
604
  if (this._waitingAtoms.alertMonitor.isResolved()) {
@@ -606,7 +608,11 @@ extensions.waitForAtom = async function waitForAtom (promise) {
606
608
  if (await this.checkForAlert()) {
607
609
  this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);
608
610
  }
609
- } catch (ign) {}
611
+ } catch (err) {
612
+ if (isErrorType(err, errors.InvalidElementStateError)) {
613
+ this._waitingAtoms.alertNotifier.emit(ON_APP_CRASH_EVENT, err);
614
+ }
615
+ }
610
616
  await B.delay(ATOM_INITIAL_WAIT_MS / 2);
611
617
  }
612
618
  })());
@@ -614,7 +620,9 @@ extensions.waitForAtom = async function waitForAtom (promise) {
614
620
 
615
621
  return await new B((resolve, reject) => {
616
622
  onAlertCallback = () => reject(new errors.UnexpectedAlertOpenError());
623
+ onAppCrashCallback = reject;
617
624
  this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);
625
+ this._waitingAtoms.alertNotifier.once(ON_APP_CRASH_EVENT, onAppCrashCallback);
618
626
  handlePromiseError(timedAtomPromise)
619
627
  // eslint-disable-next-line promise/prefer-await-to-then
620
628
  .then(resolve)
@@ -624,6 +632,9 @@ extensions.waitForAtom = async function waitForAtom (promise) {
624
632
  if (onAlertCallback) {
625
633
  this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);
626
634
  }
635
+ if (onAppCrashCallback) {
636
+ this._waitingAtoms.alertNotifier.removeListener(ON_APP_CRASH_EVENT, onAppCrashCallback);
637
+ }
627
638
  this._waitingAtoms.count--;
628
639
  }
629
640
  };
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-xcuitest-driver",
3
- "version": "4.18.3",
3
+ "version": "4.18.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-xcuitest-driver",
9
- "version": "4.18.3",
9
+ "version": "4.18.4",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.0.0",
@@ -35,7 +35,7 @@
35
35
  "ws": "^8.0.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@appium/docutils": "^0.2.2",
38
+ "@appium/docutils": "^0.x",
39
39
  "@appium/eslint-config-appium": "^6.0.0",
40
40
  "@appium/test-support": "^3.0.0",
41
41
  "@babel/cli": "^7.18.10",
@@ -46,7 +46,7 @@
46
46
  "@babel/register": "^7.18.9",
47
47
  "@semantic-release/changelog": "^6.0.1",
48
48
  "@semantic-release/git": "^10.0.1",
49
- "axios": "^1.x",
49
+ "axios": "^1.3.4",
50
50
  "babel-plugin-source-map-support": "^2.2.0",
51
51
  "chai": "^4.1.2",
52
52
  "chai-as-promised": "^7.1.1",
@@ -1148,7 +1148,7 @@
1148
1148
  }
1149
1149
  },
1150
1150
  "node_modules/appium-ios-device": {
1151
- "version": "2.4.9",
1151
+ "version": "2.4.10",
1152
1152
  "license": "Apache-2.0",
1153
1153
  "dependencies": {
1154
1154
  "@appium/support": "^3.0.0",
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "4.18.3",
11
+ "version": "4.18.4",
12
12
  "author": "Appium Contributors",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {
@@ -130,7 +130,7 @@
130
130
  "appium": "^2.0.0-beta.40"
131
131
  },
132
132
  "devDependencies": {
133
- "@appium/docutils": "^0.2.2",
133
+ "@appium/docutils": "^0.x",
134
134
  "@appium/eslint-config-appium": "^6.0.0",
135
135
  "@appium/test-support": "^3.0.0",
136
136
  "@babel/cli": "^7.18.10",
@@ -141,7 +141,7 @@
141
141
  "@babel/register": "^7.18.9",
142
142
  "@semantic-release/changelog": "^6.0.1",
143
143
  "@semantic-release/git": "^10.0.1",
144
- "axios": "^1.x",
144
+ "axios": "^1.3.4",
145
145
  "babel-plugin-source-map-support": "^2.2.0",
146
146
  "chai": "^4.1.2",
147
147
  "chai-as-promised": "^7.1.1",