appium-xcuitest-driver 3.58.1 → 3.59.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,12 +28,11 @@ On top of standard Appium requirements XCUITest driver also expects the followin
28
28
  - Web views must be debuggable in order to test them. If it is not possible to connect to your web view(s) using [Safari remote debugger](https://appletoolbox.com/use-web-inspector-debug-mobile-safari/) then XCUITest won't be able to connect to them as well.
29
29
  - Since version 3.33.0 (included into Appium 1.20.0+) of XCUITest driver the [Carthage](https://github.com/Carthage/Carthage) dependency *is not needed anymore*. Prior to that version it was required and could be installed using [brew](https://brew.sh/): `brew install carthage`.
30
30
 
31
-
32
31
  ## Optional dependencies
33
32
 
34
33
  - [xcpretty](https://github.com/supermarin/xcpretty) tool could be used to make Xcode output easier to read. It could be installed using `gem install xcpretty` command.
35
34
  - For test video recording we use [ffmpeg](https://ffmpeg.org/). It could be installed using [brew](https://brew.sh/): `brew install ffmpeg`
36
- - Facebook's [IDB](https://github.com/facebook/idb) tool could be used to improve some real device/Simulator interactions
35
+ - [IDB](https://github.com/facebook/idb), [go-ios](https://github.com/danielpaulus/go-ios) and [tidevice](https://github.com/alibaba/taobao-iphone-device) could be used to improve some real device/Simulator interactions
37
36
  - [WIX AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils) could be used to improve some Simulator interactions
38
37
 
39
38
 
@@ -53,7 +52,9 @@ See [real device configuration documentation](docs/real-device-config.md).
53
52
 
54
53
  ### Known problems
55
54
 
56
- After many failures on real devices it could transition to a state where connections are no longer being accepted. To possibly remedy this issue reboot the device. Read https://github.com/facebook/WebDriverAgent/issues/507 for more details.
55
+ - After many failures on real devices it could transition to a state where connections are no longer being accepted. To possibly remedy this issue reboot the device. Read https://github.com/facebook/WebDriverAgent/issues/507 for more details.
56
+ - iPhone/iPad real devices show overlay, which has `Automation Running Hold both volume buttons to stop` text, since iOS/iPadOS 15. This is a known limitation of XCTest framework. This limitation does not affect screenshooting APIs though (e.g. the overlay is not visible on taken screenshots).
57
+ - iPhone/iPad real devices [require passcode or touch id](https://github.com/appium/appium/issues/15898#issuecomment-927340411) when they start a XCTest session since iOS/iPadOS 15. Disabling passcode/touch id in the device preference allows to workaround the behaviour above.
57
58
 
58
59
  #### Weird state
59
60
 
@@ -108,7 +109,7 @@ Capability | Description
108
109
  `appium:automationName` | Must always be set to `xcuitest`. Values of `automationName` are compared case-insensitively.
109
110
  `appium:deviceName` | The name of the device under test. Consider setting `udid` for real devices and use this one for Simulator selection instead
110
111
  `appium:platformVersion` | The platform version of an emulator or a real device. This capability is used for device autodetection if `udid` is not provided
111
- `appium:udid` | UDID of the device to be tested. Could ve retrieved from Xcode->Window->Devices and Simulators window. Always set this capability if you run parallel tests or use a real device to run your tests.
112
+ `appium:udid` | UDID of the device to be tested. Could be retrieved from Xcode->Window->Devices and Simulators window. Always set this capability if you run parallel tests or use a real device to run your tests.
112
113
  `appium:noReset` | Prevents the device to be reset before the session startup if set to `true`. This means that the application under test is not going to be terminated neither its data cleaned. `false` by default
113
114
  `appium:fullReset` | Being set to `true` always enforces the application under test to be fully uninstalled before starting a new session. `false` by default
114
115
  `appium:printPageSourceOnFindFailure` | Enforces the server to dump the actual XML page source into the log if any error happens. `false` by default.
@@ -302,6 +303,7 @@ nativeWebTap | boolean | See the description of the corresponding capability.
302
303
  nativeWebTapStrict | boolean | See the description of the corresponding capability.
303
304
  nativeWebTapTabBarVisibility | enum | Bypass finding whether the existence of the _**tab bar**_ before tapping on the element. It could make native web tap faster. If it's `visible`, tab bar offset will be added without checking the existence of the tab bar. It's `invisible`, the tab bar offset will be `zero`. If you want to leave Appium to check and measure the tab bar offset, unset or set `detect`. Only applicable if `nativeWebTap` and `nativeWebTapStrict` are enabled. Unset by default.
304
305
  nativeWebTapSmartAppBannerVisibility | enum | The same as `nativeWebTapTabBarVisibility`, this keyword will bypass finding whether the existence of the _**smart app banner**_.
306
+ safariTabBarPosition | string | Handle offset of Safari tab bar in `nativeWebTap` enabled interactions. If `platformVersion` was greater than or equal to 15 and iPhone device, the value is `bottom` by default. Otherwise `top`. When the value is `top`, Appium considers offset as the bar length. iOS 15+ environment can customize the bar position in the settings app, so please adjust the offset with this. Acceptable values: `bottom`, `top`
305
307
  useJSONSource | boolean | See the description of the corresponding capability.
306
308
 
307
309
  ## Element Location
@@ -83,7 +83,7 @@ class ScreenRecorder {
83
83
  _logger.default.warn(`Cannot forward the local port ${remotePort} to ${remotePort} ` + `on the device ${this.udid}. Set the custom value to 'mjpegServerPort' ` + `capability if this is an undesired behavior.`);
84
84
  }
85
85
 
86
- const args = ['-f', 'mjpeg'];
86
+ const args = ['-f', 'mjpeg', '-reconnect', '1', '-reconnect_at_eof', '1', '-reconnect_streamed', '1', '-reconnect_delay_max', `${timeoutMs / 1000 + 1}`];
87
87
 
88
88
  if (videoFps && videoType === 'libx264') {
89
89
  args.push('-r', videoFps);
@@ -308,4 +308,4 @@ var _default = commands;
308
308
  exports.default = _default;require('source-map-support').install();
309
309
 
310
310
 
311
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9yZWNvcmRzY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJNQVhfUkVDT1JESU5HX1RJTUVfU0VDIiwiREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMiLCJERUZBVUxUX01KUEVHX1NFUlZFUl9QT1JUIiwiREVGQVVMVF9GUFMiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX1ZDT0RFQyIsIk1QNF9FWFQiLCJGRk1QRUdfQklOQVJZIiwiZmZtcGVnTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiUVVBTElUWV9NQVBQSU5HIiwibG93IiwibWVkaXVtIiwiaGlnaCIsInBob3RvIiwiU2NyZWVuUmVjb3JkZXIiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ2aWRlb1BhdGgiLCJvcHRzIiwibWFpblByb2Nlc3MiLCJ0aW1lb3V0SGFuZGxlciIsInN0YXJ0IiwidGltZW91dE1zIiwiZnMiLCJ3aGljaCIsImVyciIsIkVycm9yIiwicmVtb3RlUG9ydCIsInJlbW90ZVVybCIsInVzZVBvcnRGb3J3YXJkaW5nIiwidmlkZW9GcHMiLCJ2aWRlb1R5cGUiLCJ2aWRlb1NjYWxlIiwidmlkZW9GaWx0ZXJzIiwicGl4ZWxGb3JtYXQiLCJERVZJQ0VfQ09OTkVDVElPTlNfRkFDVE9SWSIsInJlcXVlc3RDb25uZWN0aW9uIiwiZGV2aWNlUG9ydCIsImxvZyIsIndhcm4iLCJhcmdzIiwicHVzaCIsInByb3RvY29sIiwiaG9zdG5hbWUiLCJ1cmwiLCJwYXJzZSIsIlN1YlByb2Nlc3MiLCJpc0NhcHR1cmVTdGFydGVkIiwib24iLCJzdGRvdXQiLCJzdGRlcnIiLCJ0cmltIiwic3RhcnRzV2l0aCIsImluZm8iLCJzdGFydHVwVGltZW91dCIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwiaXNSdW5uaW5nIiwiam9pbiIsInNldFRpbWVvdXQiLCJpbnRlcnJ1cHQiLCJmb3JjZSIsInJlc3VsdCIsImNsZWFyVGltZW91dCIsImludGVycnVwdFByb21pc2UiLCJzdG9wIiwibWVzc2FnZSIsInJlbGVhc2VDb25uZWN0aW9uIiwiZmluaXNoIiwiY2xlYW51cCIsImV4aXN0cyIsInJpbXJhZiIsInN0YXJ0UmVjb3JkaW5nU2NyZWVuIiwib3B0aW9ucyIsInRpbWVMaW1pdCIsInZpZGVvUXVhbGl0eSIsImZvcmNlUmVzdGFydCIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJ0ZW1wRGlyIiwicGF0aCIsInByZWZpeCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsInN1ZmZpeCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJzY3JlZW5SZWNvcmRlciIsImRldmljZSIsIm1qcGVnU2VydmVyUG9ydCIsImlzUmVhbERldmljZSIsImVycm9yQW5kVGhyb3ciLCJfcmVjZW50U2NyZWVuUmVjb3JkZXIiLCJ0aW1lb3V0U2Vjb25kcyIsInBhcnNlRmxvYXQiLCJpc05hTiIsIm1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHkiLCJtanBlZ1NlcnZlckZyYW1lcmF0ZSIsInByb3h5Q29tbWFuZCIsInF1YWxpdHkiLCJfIiwiaXNJbnRlZ2VyIiwidG9Mb3dlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJrZXlzIiwidW5kZWZpbmVkIiwiZnBzIiwicGFyc2VJbnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzZXR0aW5ncyIsInJlbW90ZVBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7O0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsS0FBSyxFQUFwQztBQUNBLE1BQU1DLDBCQUEwQixHQUFHLEtBQUssQ0FBeEM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxJQUFsQztBQUNBLE1BQU1DLFdBQVcsR0FBRyxFQUFwQjtBQUNBLE1BQU1DLGVBQWUsR0FBRyxRQUF4QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxPQUF2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R0FGRCxDQUVFLE9BQU90QyxDQUFQLEVBQVU7QUFDVixVQUFNZ0MsY0FBYyxDQUFDNUIsU0FBZixDQUF5QixJQUF6QixDQUFOO0FBQ0EsVUFBTTRCLGNBQWMsQ0FBQ25CLE9BQWYsRUFBTjtBQUNBLFVBQU1iLENBQU47QUFDRDs7QUFDRCxPQUFLcUMscUJBQUwsR0FBNkJMLGNBQTdCO0FBRUEsU0FBTzFCLE1BQVA7QUFDRCxDQTVGRDs7QUE2SEFsRSxRQUFRLENBQUNpRixtQkFBVCxHQUErQixlQUFlQSxtQkFBZixDQUFvQ0osT0FBTyxHQUFHLEVBQTlDLEVBQWtEO0FBQy9FLE1BQUksQ0FBQyxLQUFLb0IscUJBQVYsRUFBaUM7QUFDL0J4RCxvQkFBSWUsSUFBSixDQUFTLDREQUFUOztBQUNBLFdBQU8sRUFBUDtBQUNEOztBQUVELE1BQUk7QUFDRixVQUFNcEMsU0FBUyxHQUFHLE1BQU0sS0FBSzZFLHFCQUFMLENBQTJCekIsTUFBM0IsRUFBeEI7O0FBQ0EsUUFBSSxFQUFDLE1BQU05QyxrQkFBR2dELE1BQUgsQ0FBVXRELFNBQVYsQ0FBUCxDQUFKLEVBQWlDO0FBQy9CcUIsc0JBQUl1RCxhQUFKLENBQW1CLHlDQUFELEdBQ2YsNENBQTJDNUUsU0FBVSxHQUR4RDtBQUVEOztBQUNELFdBQU8sTUFBTSxpQ0FBcUJBLFNBQXJCLEVBQWdDeUQsT0FBTyxDQUFDd0MsVUFBeEMsRUFBb0R4QyxPQUFwRCxDQUFiO0FBQ0QsR0FQRCxTQU9VO0FBQ1IsVUFBTSxLQUFLb0IscUJBQUwsQ0FBMkJqQyxTQUEzQixDQUFxQyxJQUFyQyxDQUFOO0FBQ0EsVUFBTSxLQUFLaUMscUJBQUwsQ0FBMkJ4QixPQUEzQixFQUFOO0FBQ0EsU0FBS3dCLHFCQUFMLEdBQTZCLElBQTdCO0FBQ0Q7QUFDRixDQWxCRDs7ZUFzQmVqRyxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGVuY29kZUJhc2U2NE9yVXBsb2FkLCBpc0xvY2FsSG9zdCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBERVZJQ0VfQ09OTkVDVElPTlNfRkFDVE9SWSBmcm9tICcuLi9kZXZpY2UtY29ubmVjdGlvbnMtZmFjdG9yeSc7XG5pbXBvcnQgeyBXREFfQkFTRV9VUkwgfSBmcm9tICdhcHBpdW0td2ViZHJpdmVyYWdlbnQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxubGV0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IE1BWF9SRUNPUkRJTkdfVElNRV9TRUMgPSA2MCAqIDMwO1xuY29uc3QgREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMgPSA2MCAqIDM7XG5jb25zdCBERUZBVUxUX01KUEVHX1NFUlZFUl9QT1JUID0gOTEwMDtcbmNvbnN0IERFRkFVTFRfRlBTID0gMTA7XG5jb25zdCBERUZBVUxUX1FVQUxJVFkgPSAnbWVkaXVtJztcbmNvbnN0IERFRkFVTFRfVkNPREVDID0gJ21qcGVnJztcbmNvbnN0IE1QNF9FWFQgPSAnLm1wNCc7XG5jb25zdCBGRk1QRUdfQklOQVJZID0gJ2ZmbXBlZyc7XG5jb25zdCBmZm1wZWdMb2dnZXIgPSBsb2dnZXIuZ2V0TG9nZ2VyKEZGTVBFR19CSU5BUlkpO1xuY29uc3QgUVVBTElUWV9NQVBQSU5HID0ge1xuICBsb3c6IDEwLFxuICBtZWRpdW06IDI1LFxuICBoaWdoOiA3NSxcbiAgcGhvdG86IDEwMCxcbn07XG5cblxuY2xhc3MgU2NyZWVuUmVjb3JkZXIge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgdmlkZW9QYXRoLCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnZpZGVvUGF0aCA9IHZpZGVvUGF0aDtcbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgIHRoaXMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5tYWluUHJvY2VzcyA9IG51bGw7XG4gICAgdGhpcy50aW1lb3V0SGFuZGxlciA9IG51bGw7XG4gIH1cblxuICBhc3luYyBzdGFydCAodGltZW91dE1zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndoaWNoKEZGTVBFR19CSU5BUlkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtGRk1QRUdfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBmb3VuZCBpbiBQQVRILiBJbnN0YWxsIGl0IHVzaW5nICdicmV3IGluc3RhbGwgZmZtcGVnJy4gYCArXG4gICAgICAgIGBDaGVjayBodHRwczovL3d3dy5mZm1wZWcub3JnL2Rvd25sb2FkLmh0bWwgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICByZW1vdGVQb3J0LFxuICAgICAgcmVtb3RlVXJsLFxuICAgICAgdXNlUG9ydEZvcndhcmRpbmcsXG4gICAgICB2aWRlb0ZwcyxcbiAgICAgIHZpZGVvVHlwZSxcbiAgICAgIHZpZGVvU2NhbGUsXG4gICAgICB2aWRlb0ZpbHRlcnMsXG4gICAgICBwaXhlbEZvcm1hdCxcbiAgICB9ID0gdGhpcy5vcHRzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IERFVklDRV9DT05ORUNUSU9OU19GQUNUT1JZLnJlcXVlc3RDb25uZWN0aW9uKHRoaXMudWRpZCwgcmVtb3RlUG9ydCwge1xuICAgICAgICBkZXZpY2VQb3J0OiByZW1vdGVQb3J0LFxuICAgICAgICB1c2VQb3J0Rm9yd2FyZGluZyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBmb3J3YXJkIHRoZSBsb2NhbCBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gJHtyZW1vdGVQb3J0fSBgICtcbiAgICAgICAgYG9uIHRoZSBkZXZpY2UgJHt0aGlzLnVkaWR9LiBTZXQgdGhlIGN1c3RvbSB2YWx1ZSB0byAnbWpwZWdTZXJ2ZXJQb3J0JyBgICtcbiAgICAgICAgYGNhcGFiaWxpdHkgaWYgdGhpcyBpcyBhbiB1bmRlc2lyZWQgYmVoYXZpb3IuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICctZicsICdtanBlZycsXG4gICAgXTtcbiAgICAvL1BhcmFtZXRlciBgLXJgIGlzIG9wdGlvbmFsLiBTZWUgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEyMDY3XG4gICAgaWYgKHZpZGVvRnBzICYmIHZpZGVvVHlwZSA9PT0gJ2xpYngyNjQnKSB7XG4gICAgICBhcmdzLnB1c2goJy1yJywgdmlkZW9GcHMpO1xuICAgIH1cbiAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZShyZW1vdGVVcmwpO1xuICAgIGFyZ3MucHVzaCgnLWknLCBgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cmVtb3RlUG9ydH1gKTtcbiAgICBpZiAodmlkZW9GaWx0ZXJzIHx8IHZpZGVvU2NhbGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXZmJywgdmlkZW9GaWx0ZXJzIHx8IGBzY2FsZT0ke3ZpZGVvU2NhbGV9YCk7XG4gICAgfVxuICAgIC8vIFF1aWNrdGltZSBjb21wYXRpYmlsaXR5IHZpYSBwaXhlbEZvcm1hdDogJ3l1djQyMHAnXG4gICAgaWYgKHBpeGVsRm9ybWF0KSB7XG4gICAgICBhcmdzLnB1c2goJy1waXhfZm10JywgcGl4ZWxGb3JtYXQpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goXG4gICAgICAnLXZjb2RlYycsIHZpZGVvVHlwZSxcbiAgICAgICcteScsIHRoaXMudmlkZW9QYXRoXG4gICAgKTtcblxuICAgIHRoaXMubWFpblByb2Nlc3MgPSBuZXcgU3ViUHJvY2VzcyhGRk1QRUdfQklOQVJZLCBhcmdzKTtcbiAgICBsZXQgaXNDYXB0dXJlU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpblByb2Nlc3Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICBpZiAoc3RkZXJyLnRyaW0oKS5zdGFydHNXaXRoKCdmcmFtZT0nKSkge1xuICAgICAgICAgIGlmICghaXNDYXB0dXJlU3RhcnRlZCkge1xuICAgICAgICAgICAgaXNDYXB0dXJlU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZmbXBlZ0xvZ2dlci5pbmZvKGAke3N0ZGVycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFpblByb2Nlc3Muc3RhcnQoMCk7XG4gICAgY29uc3Qgc3RhcnR1cFRpbWVvdXQgPSA1MDAwO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IGlzQ2FwdHVyZVN0YXJ0ZWQsIHtcbiAgICAgICAgd2FpdE1zOiBzdGFydHVwVGltZW91dCxcbiAgICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oYFNjcmVlbiBjYXB0dXJlIHByb2Nlc3MgZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtzdGFydHVwVGltZW91dH1tcy4gQ29udGludWluZyBhbnl3YXlgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1haW5Qcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2NyZWVuIGNhcHR1cmUgcHJvY2VzcyAnJHtGRk1QRUdfQklOQVJZfScgZGllZCB1bmV4cGVjdGVkbHkuIGAgK1xuICAgICAgICBgQ2hlY2sgc2VydmVyIGxvZ3MgZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgc2NyZWVuIGNhcHR1cmUgb24gdGhlIGRldmljZSAnJHt0aGlzLnVkaWR9JyB3aXRoIGNvbW1hbmQ6ICcke0ZGTVBFR19CSU5BUll9ICR7YXJncy5qb2luKCcgJyl9Jy4gYCArXG4gICAgICBgV2lsbCB0aW1lb3V0IGluICR7dGltZW91dE1zfW1zYCk7XG5cbiAgICB0aGlzLnRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWF3YWl0IHRoaXMuaW50ZXJydXB0KCkpIHtcbiAgICAgICAgbG9nLndhcm4oYENhbm5vdCBmaW5pc2ggdGhlIGFjdGl2ZSBzY3JlZW4gcmVjb3JkaW5nIG9uIHRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dGApO1xuICAgICAgfVxuICAgIH0sIHRpbWVvdXRNcyk7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHQgKGZvcmNlID0gZmFsc2UpIHtcbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnRpbWVvdXRIYW5kbGVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SGFuZGxlcik7XG4gICAgICB0aGlzLnRpbWVvdXRIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYWluUHJvY2VzcyAmJiB0aGlzLm1haW5Qcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgY29uc3QgaW50ZXJydXB0UHJvbWlzZSA9IHRoaXMubWFpblByb2Nlc3Muc3RvcChmb3JjZSA/ICdTSUdURVJNJyA6ICdTSUdJTlQnKTtcbiAgICAgIHRoaXMubWFpblByb2Nlc3MgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW50ZXJydXB0UHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLndhcm4oYENhbm5vdCAke2ZvcmNlID8gJ3Rlcm1pbmF0ZScgOiAnaW50ZXJydXB0J30gJHtGRk1QRUdfQklOQVJZfS4gYCArXG4gICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgREVWSUNFX0NPTk5FQ1RJT05TX0ZBQ1RPUlkucmVsZWFzZUNvbm5lY3Rpb24odGhpcy51ZGlkLCB0aGlzLm9wdHMucmVtb3RlUG9ydCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgZmluaXNoICgpIHtcbiAgICBhd2FpdCB0aGlzLmludGVycnVwdCgpO1xuICAgIHJldHVybiB0aGlzLnZpZGVvUGF0aDtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXAgKCkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHModGhpcy52aWRlb1BhdGgpKSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy52aWRlb1BhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBsb2NhdGlvbiwgd2hlcmUgdGhlIHJlc3VsdGluZyB2aWRlbyBzaG91bGQgYmUgdXBsb2FkZWQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb3RvY29scyBhcmUgc3VwcG9ydGVkOiBodHRwL2h0dHBzLCBmdHAuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSAodGhlIGRlZmF1bHQgc2V0dGluZykgbWVhbnMgdGhlIGNvbnRlbnQgb2YgcmVzdWx0aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNob3VsZCBiZSBlbmNvZGVkIGFzIEJhc2U2NCBhbmQgcGFzc2VkIGFzIHRoZSBlbmRwb2ludCByZXNwb25zZSB2YWx1ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZ2VuZXJhdGVkIG1lZGlhIGZpbGUgaXMgdG9vIGJpZyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml0IGludG8gdGhlIGF2YWlsYWJsZSBwcm9jZXNzIG1lbW9yeS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGVyZSBpcyBzY3JlZW4gcmVjb3JkaW5nIHByb2Nlc3MgaW4gcHJvZ3Jlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBgZm9yY2VSZXN0YXJ0YCBwYXJhbWV0ZXIgaXMgbm90IHNldCB0byBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVzZXIgLSBUaGUgbmFtZSBvZiB0aGUgdXNlciBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi4gT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhc3MgLSBUaGUgcGFzc3dvcmQgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtZXRob2QgLSBUaGUgaHR0cCBtdWx0aXBhcnQgdXBsb2FkIG1ldGhvZCBuYW1lLiBUaGUgJ1BVVCcgb25lIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvVHlwZSAtIFRoZSB2aWRlbyBjb2RlYyB0eXBlIHVzZWQgZm9yIGVuY29kaW5nIG9mIHRoZSBiZSByZWNvcmRlZCBzY3JlZW4gY2FwdHVyZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZSBgZmZtcGVnIC1jb2RlY3NgIGluIHRoZSB0ZXJtaW5hbCB0byBzZWUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZpZGVvIGNvZGVjcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21qcGVnJyBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdmlkZW9RdWFsaXR5IC0gVGhlIHZpZGVvIGVuY29kaW5nIHF1YWxpdHkgKGxvdywgbWVkaXVtLCBoaWdoLCBwaG90byAtIGRlZmF1bHRzIHRvIG1lZGl1bSkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB2aWRlb0ZwcyAtIFRoZSBGcmFtZXMgUGVyIFNlY29uZCByYXRlIG9mIHRoZSByZWNvcmRlZCB2aWRlby4gQ2hhbmdlIHRoaXMgdmFsdWUgaWYgdGhlIHJlc3VsdGluZyB2aWRlb1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvbyBzbG93IG9yIHRvbyBmYXN0LiBEZWZhdWx0cyB0byAxMC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9GaWx0ZXJzIC0gVGhlIEZGTVBFRyB2aWRlbyBmaWx0ZXJzIHRvIGFwcGx5LiBUaGVzZSBmaWx0ZXJzIGFsbG93IHRvIHNjYWxlLCBmbGlwLCByb3RhdGUgYW5kIGRvIG1hbnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdXNlZnVsIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgc291cmNlIHZpZGVvIHN0cmVhbS4gVGhlIGZvcm1hdCBvZiB0aGUgcHJvcGVydHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBjb21wbHkgd2l0aCBodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLWZpbHRlcnMuaHRtbFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1NjYWxlIC0gVGhlIHNjYWxpbmcgdmFsdWUgdG8gYXBwbHkuIFJlYWQgaHR0cHM6Ly90cmFjLmZmbXBlZy5vcmcvd2lraS9TY2FsaW5nIGZvciBwb3NzaWJsZSB2YWx1ZXMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBzY2FsZSBpcyBhcHBsaWVkIGJ5IGRlZmF1bHQuIElmIGJvdGggYHZpZGVvRmlsdGVyc2AgYW5kIGB2aWRlb1NjYWxlYCBhcmUgc2V0IHRoZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYHZpZGVvRmlsdGVyc2AgdmFsdWUgd2lsbCBiZSByZXNwZWN0ZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBpeGVsRm9ybWF0IC0gT3V0cHV0IHBpeGVsIGZvcm1hdC4gUnVuIGBmZm1wZWcgLXBpeF9mbXRzYCB0byBsaXN0IHBvc3NpYmxlIHZhbHVlcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgUXVpY2t0aW1lIGNvbXBhdGliaWxpdHksIHNldCB0byBcInl1djQyMHBcIiBhbG9uZyB3aXRoIHZpZGVvVHlwZTogXCJsaWJ4MjY0XCIuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBmb3JjZVJlc3RhcnQgLSBXaGV0aGVyIHRvIHRyeSB0byBjYXRjaCBhbmQgdXBsb2FkL3JldHVybiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2NyZWVuIHJlY29yZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBmYWxzZWAsIHRoZSBkZWZhdWx0IHNldHRpbmcpIG9yIGlnbm9yZSB0aGUgcmVzdWx0IG9mIGl0IGFuZCBzdGFydCBhIG5ldyByZWNvcmRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxODAsIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDYwMCAoMTAgbWludXRlcykuXG4gKi9cblxuLyoqXG4gKiBSZWNvcmQgdGhlIGRpc3BsYXkgb2YgZGV2aWNlcyBydW5uaW5nIGlPUyBTaW11bGF0b3Igc2luY2UgWGNvZGUgOSBvciByZWFsIGRldmljZXMgc2luY2UgaU9TIDExXG4gKiAoZmZtcGVnIHV0aWxpdHkgaXMgcmVxdWlyZWQ6ICdicmV3IGluc3RhbGwgZmZtcGVnJykuXG4gKiBJdCByZWNvcmRzIHNjcmVlbiBhY3Rpdml0eSB0byBhIE1QRUctNCBmaWxlLiBBdWRpbyBpcyBub3QgcmVjb3JkZWQgd2l0aCB0aGUgdmlkZW8gZmlsZS5cbiAqIElmIHNjcmVlbiByZWNvcmRpbmcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkIHRoZW4gdGhlIGNvbW1hbmQgd2lsbCBzdG9wIGl0IGZvcmNlZnVsbHkgYW5kIHN0YXJ0IGEgbmV3IG9uZS5cbiAqIFRoZSBwcmV2aW91c2x5IHJlY29yZGVkIHZpZGVvIGZpbGUgd2lsbCBiZSBkZWxldGVkLlxuICpcbiAqIEBwYXJhbSB7P1N0YXJ0UmVjb3JkaW5nT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHJlY29yZGVkIG1lZGlhIGZpbGUgaWZcbiAqICAgICAgICAgICAgICAgICAgIGFueSBzY3JlZW4gcmVjb3JkaW5nIGlzIGN1cnJlbnRseSBydW5uaW5nIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzY3JlZW4gcmVjb3JkaW5nIGhhcyBmYWlsZWQgdG8gc3RhcnQuXG4gKi9cbmNvbW1hbmRzLnN0YXJ0UmVjb3JkaW5nU2NyZWVuID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdmlkZW9UeXBlID0gREVGQVVMVF9WQ09ERUMsXG4gICAgdGltZUxpbWl0ID0gREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMsXG4gICAgdmlkZW9RdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZLFxuICAgIHZpZGVvRnBzID0gREVGQVVMVF9GUFMsXG4gICAgdmlkZW9GaWx0ZXJzLFxuICAgIHZpZGVvU2NhbGUsXG4gICAgZm9yY2VSZXN0YXJ0LFxuICAgIHBpeGVsRm9ybWF0XG4gIH0gPSBvcHRpb25zO1xuXG4gIGxldCByZXN1bHQgPSAnJztcbiAgaWYgKCFmb3JjZVJlc3RhcnQpIHtcbiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgaWYgdGhlcmUgaXMvd2FzIGEgcHJldmlvdXMgc2NyZWVuIHJlY29yZGluZy4gYCArXG4gICAgICBgU2V0ICdmb3JjZVJlc3RhcnQnIG9wdGlvbiB0byAndHJ1ZScgaWYgeW91J2QgbGlrZSB0byBza2lwIHRoaXMgc3RlcC5gKTtcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4ob3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCB2aWRlb1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe1xuICAgIHByZWZpeDogYGFwcGl1bV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygyLCA4KX1gLFxuICAgIHN1ZmZpeDogTVA0X0VYVCxcbiAgfSk7XG5cbiAgY29uc3Qgd2RhQmFzZVVybCA9IHRoaXMub3B0cy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTDtcbiAgY29uc3Qgc2NyZWVuUmVjb3JkZXIgPSBuZXcgU2NyZWVuUmVjb3JkZXIodGhpcy5vcHRzLmRldmljZS51ZGlkLCB2aWRlb1BhdGgsIHtcbiAgICByZW1vdGVQb3J0OiB0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0IHx8IERFRkFVTFRfTUpQRUdfU0VSVkVSX1BPUlQsXG4gICAgcmVtb3RlVXJsOiB3ZGFCYXNlVXJsLFxuICAgIHVzZVBvcnRGb3J3YXJkaW5nOiB0aGlzLmlzUmVhbERldmljZSgpICYmIGlzTG9jYWxIb3N0KHdkYUJhc2VVcmwpLFxuICAgIHZpZGVvVHlwZSxcbiAgICB2aWRlb0ZpbHRlcnMsXG4gICAgdmlkZW9TY2FsZSxcbiAgICB2aWRlb0ZwcyxcbiAgICBwaXhlbEZvcm1hdFxuICB9KTtcbiAgaWYgKCFhd2FpdCBzY3JlZW5SZWNvcmRlci5pbnRlcnJ1cHQodHJ1ZSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnVW5hYmxlIHRvIHN0b3Agc2NyZWVuIHJlY29yZGluZyBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVjZW50U2NyZWVuUmVjb3JkZXIuY2xlYW51cCgpO1xuICAgIHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyID0gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gcGFyc2VGbG9hdCh0aW1lTGltaXQpO1xuICBpZiAoaXNOYU4odGltZW91dFNlY29uZHMpIHx8IHRpbWVvdXRTZWNvbmRzID4gTUFYX1JFQ09SRElOR19USU1FX1NFQyB8fCB0aW1lb3V0U2Vjb25kcyA8PSAwKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSB0aW1lTGltaXQgdmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbMSwgJHtNQVhfUkVDT1JESU5HX1RJTUVfU0VDfV0gc2Vjb25kcy4gYCArXG4gICAgICBgVGhlIHZhbHVlIG9mICcke3RpbWVMaW1pdH0nIGhhcyBiZWVuIHBhc3NlZCBpbnN0ZWFkLmApO1xuICB9XG5cbiAgbGV0IHtcbiAgICBtanBlZ1NlcnZlclNjcmVlbnNob3RRdWFsaXR5LFxuICAgIG1qcGVnU2VydmVyRnJhbWVyYXRlLFxuICB9ID0gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIGlmICh2aWRlb1F1YWxpdHkpIHtcbiAgICBjb25zdCBxdWFsaXR5ID0gXy5pc0ludGVnZXIodmlkZW9RdWFsaXR5KSA/IHZpZGVvUXVhbGl0eSA6IFFVQUxJVFlfTUFQUElOR1tfLnRvTG93ZXIodmlkZW9RdWFsaXR5KV07XG4gICAgaWYgKCFxdWFsaXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZpZGVvUXVhbGl0eSB2YWx1ZSBzaG91bGQgYmUgb25lIG9mICR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKFFVQUxJVFlfTUFQUElORykpfSBvciBhIG51bWJlciBpbiByYW5nZSAxLi4xMDAuIGAgK1xuICAgICAgICBgJyR7dmlkZW9RdWFsaXR5fScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICAgIH1cbiAgICBtanBlZ1NlcnZlclNjcmVlbnNob3RRdWFsaXR5ID0gbWpwZWdTZXJ2ZXJTY3JlZW5zaG90UXVhbGl0eSAhPT0gcXVhbGl0eSA/IHF1YWxpdHkgOiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgbWpwZWdTZXJ2ZXJTY3JlZW5zaG90UXVhbGl0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodmlkZW9GcHMpIHtcbiAgICBjb25zdCBmcHMgPSBwYXJzZUludCh2aWRlb0ZwcywgMTApO1xuICAgIGlmIChpc05hTihmcHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZpZGVvRnBzIHZhbHVlIHNob3VsZCBiZSBhIHZhbGlkIG51bWJlciBpbiByYW5nZSAxLi42MC4gYCArXG4gICAgICAgIGAnJHt2aWRlb0Zwc30nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgbWpwZWdTZXJ2ZXJGcmFtZXJhdGUgPSBtanBlZ1NlcnZlckZyYW1lcmF0ZSAhPT0gZnBzID8gZnBzIDogdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIG1qcGVnU2VydmVyRnJhbWVyYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKG1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHkpIHx8IHV0aWwuaGFzVmFsdWUobWpwZWdTZXJ2ZXJGcmFtZXJhdGUpKSB7XG4gICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsIHtcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIG1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHksXG4gICAgICAgIG1qcGVnU2VydmVyRnJhbWVyYXRlLFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzY3JlZW5SZWNvcmRlci5zdGFydCh0aW1lb3V0U2Vjb25kcyAqIDEwMDApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYXdhaXQgc2NyZWVuUmVjb3JkZXIuaW50ZXJydXB0KHRydWUpO1xuICAgIGF3YWl0IHNjcmVlblJlY29yZGVyLmNsZWFudXAoKTtcbiAgICB0aHJvdyBlO1xuICB9XG4gIHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyID0gc2NyZWVuUmVjb3JkZXI7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RvcFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvaW50IHJlc3BvbnNlIHZhbHVlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2VyIC0gVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXNzIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWV0aG9kIC0gVGhlIGh0dHAgbXVsdGlwYXJ0IHVwbG9hZCBtZXRob2QgbmFtZS4gVGhlICdQVVQnIG9uZSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKi9cblxuLyoqXG4gKiBTdG9wIHJlY29yZGluZyB0aGUgc2NyZWVuLiBJZiBubyBzY3JlZW4gcmVjb3JkaW5nIHByb2Nlc3MgaXMgcnVubmluZyB0aGVuXG4gKiB0aGUgZW5kcG9pbnQgd2lsbCB0cnkgdG8gZ2V0IHRoZSByZWNlbnRseSByZWNvcmRlZCBmaWxlLlxuICogSWYgbm8gcHJldmlvdXNseSByZWNvcmRlZCBmaWxlIGlzIGZvdW5kIGFuZCBubyBhY3RpdmUgc2NyZWVuIHJlY29yZGluZ1xuICogcHJvY2Vzc2VzIGFyZSBydW5uaW5nIHRoZW4gdGhlIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gez9TdG9wUmVjb3JkaW5nT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHJlY29yZGVkIG1lZGlhIGZpbGUgaWYgJ3JlbW90ZVBhdGgnXG4gKiAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgZW1wdHkgb3IgbnVsbCBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIG5hbWUgb2YgYSBtZWRpYSBmaWxlXG4gKiAgICAgICAgICAgICAgICAgb3IgdGhlIGZpbGUgY29udGVudCBjYW5ub3QgYmUgdXBsb2FkZWQgdG8gdGhlIHJlbW90ZSBsb2NhdGlvbi5cbiAqL1xuY29tbWFuZHMuc3RvcFJlY29yZGluZ1NjcmVlbiA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBpZiAoIXRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyKSB7XG4gICAgbG9nLmluZm8oJ1NjcmVlbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHZpZGVvUGF0aCA9IGF3YWl0IHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyLmZpbmlzaCgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHZpZGVvUGF0aCkpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgc2NyZWVuIHJlY29yZGVyIHV0aWxpdHkgaGFzIGZhaWxlZCBgICtcbiAgICAgICAgYHRvIHN0b3JlIHRoZSBhY3R1YWwgc2NyZWVuIHJlY29yZGluZyBhdCAnJHt2aWRlb1BhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZW5jb2RlQmFzZTY0T3JVcGxvYWQodmlkZW9QYXRoLCBvcHRpb25zLnJlbW90ZVBhdGgsIG9wdGlvbnMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyLmludGVycnVwdCh0cnVlKTtcbiAgICBhd2FpdCB0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlci5jbGVhbnVwKCk7XG4gICAgdGhpcy5fcmVjZW50U2NyZWVuUmVjb3JkZXIgPSBudWxsO1xuICB9XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3JlY29yZHNjcmVlbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
311
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9yZWNvcmRzY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJNQVhfUkVDT1JESU5HX1RJTUVfU0VDIiwiREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMiLCJERUZBVUxUX01KUEVHX1NFUlZFUl9QT1JUIiwiREVGQVVMVF9GUFMiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX1ZDT0RFQyIsIk1QNF9FWFQiLCJGRk1QRUdfQklOQVJZIiwiZmZtcGVnTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiUVVBTElUWV9NQVBQSU5HIiwibG93IiwibWVkaXVtIiwiaGlnaCIsInBob3RvIiwiU2NyZWVuUmVjb3JkZXIiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ2aWRlb1BhdGgiLCJvcHRzIiwibWFpblByb2Nlc3MiLCJ0aW1lb3V0SGFuZGxlciIsInN0YXJ0IiwidGltZW91dE1zIiwiZnMiLCJ3aGljaCIsImVyciIsIkVycm9yIiwicmVtb3RlUG9ydCIsInJlbW90ZVVybCIsInVzZVBvcnRGb3J3YXJkaW5nIiwidmlkZW9GcHMiLCJ2aWRlb1R5cGUiLCJ2aWRlb1NjYWxlIiwidmlkZW9GaWx0ZXJzIiwicGl4ZWxGb3JtYXQiLCJERVZJQ0VfQ09OTkVDVElPTlNfRkFDVE9SWSIsInJlcXVlc3RDb25uZWN0aW9uIiwiZGV2aWNlUG9ydCIsImxvZyIsIndhcm4iLCJhcmdzIiwicHVzaCIsInByb3RvY29sIiwiaG9zdG5hbWUiLCJ1cmwiLCJwYXJzZSIsIlN1YlByb2Nlc3MiLCJpc0NhcHR1cmVTdGFydGVkIiwib24iLCJzdGRvdXQiLCJzdGRlcnIiLCJ0cmltIiwic3RhcnRzV2l0aCIsImluZm8iLCJzdGFydHVwVGltZW91dCIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwiaXNSdW5uaW5nIiwiam9pbiIsInNldFRpbWVvdXQiLCJpbnRlcnJ1cHQiLCJmb3JjZSIsInJlc3VsdCIsImNsZWFyVGltZW91dCIsImludGVycnVwdFByb21pc2UiLCJzdG9wIiwibWVzc2FnZSIsInJlbGVhc2VDb25uZWN0aW9uIiwiZmluaXNoIiwiY2xlYW51cCIsImV4aXN0cyIsInJpbXJhZiIsInN0YXJ0UmVjb3JkaW5nU2NyZWVuIiwib3B0aW9ucyIsInRpbWVMaW1pdCIsInZpZGVvUXVhbGl0eSIsImZvcmNlUmVzdGFydCIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJ0ZW1wRGlyIiwicGF0aCIsInByZWZpeCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsInN1ZmZpeCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJzY3JlZW5SZWNvcmRlciIsImRldmljZSIsIm1qcGVnU2VydmVyUG9ydCIsImlzUmVhbERldmljZSIsImVycm9yQW5kVGhyb3ciLCJfcmVjZW50U2NyZWVuUmVjb3JkZXIiLCJ0aW1lb3V0U2Vjb25kcyIsInBhcnNlRmxvYXQiLCJpc05hTiIsIm1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHkiLCJtanBlZ1NlcnZlckZyYW1lcmF0ZSIsInByb3h5Q29tbWFuZCIsInF1YWxpdHkiLCJfIiwiaXNJbnRlZ2VyIiwidG9Mb3dlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJrZXlzIiwidW5kZWZpbmVkIiwiZnBzIiwicGFyc2VJbnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzZXR0aW5ncyIsInJlbW90ZVBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7O0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsS0FBSyxFQUFwQztBQUNBLE1BQU1DLDBCQUEwQixHQUFHLEtBQUssQ0FBeEM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxJQUFsQztBQUNBLE1BQU1DLFdBQVcsR0FBRyxFQUFwQjtBQUNBLE1BQU1DLGVBQWUsR0FBRyxRQUF4QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxPQUF2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QmVqRyxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGVuY29kZUJhc2U2NE9yVXBsb2FkLCBpc0xvY2FsSG9zdCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBERVZJQ0VfQ09OTkVDVElPTlNfRkFDVE9SWSBmcm9tICcuLi9kZXZpY2UtY29ubmVjdGlvbnMtZmFjdG9yeSc7XG5pbXBvcnQgeyBXREFfQkFTRV9VUkwgfSBmcm9tICdhcHBpdW0td2ViZHJpdmVyYWdlbnQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxubGV0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IE1BWF9SRUNPUkRJTkdfVElNRV9TRUMgPSA2MCAqIDMwO1xuY29uc3QgREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMgPSA2MCAqIDM7XG5jb25zdCBERUZBVUxUX01KUEVHX1NFUlZFUl9QT1JUID0gOTEwMDtcbmNvbnN0IERFRkFVTFRfRlBTID0gMTA7XG5jb25zdCBERUZBVUxUX1FVQUxJVFkgPSAnbWVkaXVtJztcbmNvbnN0IERFRkFVTFRfVkNPREVDID0gJ21qcGVnJztcbmNvbnN0IE1QNF9FWFQgPSAnLm1wNCc7XG5jb25zdCBGRk1QRUdfQklOQVJZID0gJ2ZmbXBlZyc7XG5jb25zdCBmZm1wZWdMb2dnZXIgPSBsb2dnZXIuZ2V0TG9nZ2VyKEZGTVBFR19CSU5BUlkpO1xuY29uc3QgUVVBTElUWV9NQVBQSU5HID0ge1xuICBsb3c6IDEwLFxuICBtZWRpdW06IDI1LFxuICBoaWdoOiA3NSxcbiAgcGhvdG86IDEwMCxcbn07XG5cblxuY2xhc3MgU2NyZWVuUmVjb3JkZXIge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgdmlkZW9QYXRoLCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnZpZGVvUGF0aCA9IHZpZGVvUGF0aDtcbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgIHRoaXMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5tYWluUHJvY2VzcyA9IG51bGw7XG4gICAgdGhpcy50aW1lb3V0SGFuZGxlciA9IG51bGw7XG4gIH1cblxuICBhc3luYyBzdGFydCAodGltZW91dE1zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndoaWNoKEZGTVBFR19CSU5BUlkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtGRk1QRUdfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBmb3VuZCBpbiBQQVRILiBJbnN0YWxsIGl0IHVzaW5nICdicmV3IGluc3RhbGwgZmZtcGVnJy4gYCArXG4gICAgICAgIGBDaGVjayBodHRwczovL3d3dy5mZm1wZWcub3JnL2Rvd25sb2FkLmh0bWwgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICByZW1vdGVQb3J0LFxuICAgICAgcmVtb3RlVXJsLFxuICAgICAgdXNlUG9ydEZvcndhcmRpbmcsXG4gICAgICB2aWRlb0ZwcyxcbiAgICAgIHZpZGVvVHlwZSxcbiAgICAgIHZpZGVvU2NhbGUsXG4gICAgICB2aWRlb0ZpbHRlcnMsXG4gICAgICBwaXhlbEZvcm1hdCxcbiAgICB9ID0gdGhpcy5vcHRzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IERFVklDRV9DT05ORUNUSU9OU19GQUNUT1JZLnJlcXVlc3RDb25uZWN0aW9uKHRoaXMudWRpZCwgcmVtb3RlUG9ydCwge1xuICAgICAgICBkZXZpY2VQb3J0OiByZW1vdGVQb3J0LFxuICAgICAgICB1c2VQb3J0Rm9yd2FyZGluZyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBmb3J3YXJkIHRoZSBsb2NhbCBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gJHtyZW1vdGVQb3J0fSBgICtcbiAgICAgICAgYG9uIHRoZSBkZXZpY2UgJHt0aGlzLnVkaWR9LiBTZXQgdGhlIGN1c3RvbSB2YWx1ZSB0byAnbWpwZWdTZXJ2ZXJQb3J0JyBgICtcbiAgICAgICAgYGNhcGFiaWxpdHkgaWYgdGhpcyBpcyBhbiB1bmRlc2lyZWQgYmVoYXZpb3IuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICctZicsICdtanBlZycsXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTYyOTRcbiAgICAgICctcmVjb25uZWN0JywgJzEnLFxuICAgICAgJy1yZWNvbm5lY3RfYXRfZW9mJywgJzEnLFxuICAgICAgJy1yZWNvbm5lY3Rfc3RyZWFtZWQnLCAnMScsXG4gICAgICAnLXJlY29ubmVjdF9kZWxheV9tYXgnLCBgJHt0aW1lb3V0TXMgLyAxMDAwICsgMX1gLFxuICAgIF07XG4gICAgLy9QYXJhbWV0ZXIgYC1yYCBpcyBvcHRpb25hbC4gU2VlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMjA2N1xuICAgIGlmICh2aWRlb0ZwcyAmJiB2aWRlb1R5cGUgPT09ICdsaWJ4MjY0Jykge1xuICAgICAgYXJncy5wdXNoKCctcicsIHZpZGVvRnBzKTtcbiAgICB9XG4gICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UocmVtb3RlVXJsKTtcbiAgICBhcmdzLnB1c2goJy1pJywgYCR7cHJvdG9jb2x9Ly8ke2hvc3RuYW1lfToke3JlbW90ZVBvcnR9YCk7XG4gICAgaWYgKHZpZGVvRmlsdGVycyB8fCB2aWRlb1NjYWxlKSB7XG4gICAgICBhcmdzLnB1c2goJy12ZicsIHZpZGVvRmlsdGVycyB8fCBgc2NhbGU9JHt2aWRlb1NjYWxlfWApO1xuICAgIH1cbiAgICAvLyBRdWlja3RpbWUgY29tcGF0aWJpbGl0eSB2aWEgcGl4ZWxGb3JtYXQ6ICd5dXY0MjBwJ1xuICAgIGlmIChwaXhlbEZvcm1hdCkge1xuICAgICAgYXJncy5wdXNoKCctcGl4X2ZtdCcsIHBpeGVsRm9ybWF0KTtcbiAgICB9XG4gICAgYXJncy5wdXNoKFxuICAgICAgJy12Y29kZWMnLCB2aWRlb1R5cGUsXG4gICAgICAnLXknLCB0aGlzLnZpZGVvUGF0aFxuICAgICk7XG5cbiAgICB0aGlzLm1haW5Qcm9jZXNzID0gbmV3IFN1YlByb2Nlc3MoRkZNUEVHX0JJTkFSWSwgYXJncyk7XG4gICAgbGV0IGlzQ2FwdHVyZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1haW5Qcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgaWYgKHN0ZGVyci50cmltKCkuc3RhcnRzV2l0aCgnZnJhbWU9JykpIHtcbiAgICAgICAgICBpZiAoIWlzQ2FwdHVyZVN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGlzQ2FwdHVyZVN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZm1wZWdMb2dnZXIuaW5mbyhgJHtzdGRlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLm1haW5Qcm9jZXNzLnN0YXJ0KDApO1xuICAgIGNvbnN0IHN0YXJ0dXBUaW1lb3V0ID0gNTAwMDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc0NhcHR1cmVTdGFydGVkLCB7XG4gICAgICAgIHdhaXRNczogc3RhcnR1cFRpbWVvdXQsXG4gICAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBTY3JlZW4gY2FwdHVyZSBwcm9jZXNzIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7c3RhcnR1cFRpbWVvdXR9bXMuIENvbnRpbnVpbmcgYW55d2F5YCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYWluUHJvY2Vzcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNjcmVlbiBjYXB0dXJlIHByb2Nlc3MgJyR7RkZNUEVHX0JJTkFSWX0nIGRpZWQgdW5leHBlY3RlZGx5LiBgICtcbiAgICAgICAgYENoZWNrIHNlcnZlciBsb2dzIGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICB9XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIHNjcmVlbiBjYXB0dXJlIG9uIHRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScgd2l0aCBjb21tYW5kOiAnJHtGRk1QRUdfQklOQVJZfSAke2FyZ3Muam9pbignICcpfScuIGAgK1xuICAgICAgYFdpbGwgdGltZW91dCBpbiAke3RpbWVvdXRNc31tc2ApO1xuXG4gICAgdGhpcy50aW1lb3V0SGFuZGxlciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmludGVycnVwdCgpKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgZmluaXNoIHRoZSBhY3RpdmUgc2NyZWVuIHJlY29yZGluZyBvbiB0aGUgZGV2aWNlICcke3RoaXMudWRpZH0nIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0TXMpO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0IChmb3JjZSA9IGZhbHNlKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy50aW1lb3V0SGFuZGxlcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dEhhbmRsZXIpO1xuICAgICAgdGhpcy50aW1lb3V0SGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFpblByb2Nlc3MgJiYgdGhpcy5tYWluUHJvY2Vzcy5pc1J1bm5pbmcpIHtcbiAgICAgIGNvbnN0IGludGVycnVwdFByb21pc2UgPSB0aGlzLm1haW5Qcm9jZXNzLnN0b3AoZm9yY2UgPyAnU0lHVEVSTScgOiAnU0lHSU5UJyk7XG4gICAgICB0aGlzLm1haW5Qcm9jZXNzID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGludGVycnVwdFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgJHtmb3JjZSA/ICd0ZXJtaW5hdGUnIDogJ2ludGVycnVwdCd9ICR7RkZNUEVHX0JJTkFSWX0uIGAgK1xuICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIERFVklDRV9DT05ORUNUSU9OU19GQUNUT1JZLnJlbGVhc2VDb25uZWN0aW9uKHRoaXMudWRpZCwgdGhpcy5vcHRzLnJlbW90ZVBvcnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaCAoKSB7XG4gICAgYXdhaXQgdGhpcy5pbnRlcnJ1cHQoKTtcbiAgICByZXR1cm4gdGhpcy52aWRlb1BhdGg7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwICgpIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMudmlkZW9QYXRoKSkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRoaXMudmlkZW9QYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0UmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSByZW1vdGUgbG9jYXRpb24sIHdoZXJlIHRoZSByZXN1bHRpbmcgdmlkZW8gc2hvdWxkIGJlIHVwbG9hZGVkLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZDogaHR0cC9odHRwcywgZnRwLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVsbCBvciBlbXB0eSBzdHJpbmcgdmFsdWUgKHRoZSBkZWZhdWx0IHNldHRpbmcpIG1lYW5zIHRoZSBjb250ZW50IG9mIHJlc3VsdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzaG91bGQgYmUgZW5jb2RlZCBhcyBCYXNlNjQgYW5kIHBhc3NlZCBhcyB0aGUgZW5kcG9pbnQgcmVzcG9uc2UgdmFsdWUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGdlbmVyYXRlZCBtZWRpYSBmaWxlIGlzIHRvbyBiaWcgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgcHJvY2VzcyBtZW1vcnkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlcmUgaXMgc2NyZWVuIHJlY29yZGluZyBwcm9jZXNzIGluIHByb2dyZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYGZvcmNlUmVzdGFydGAgcGFyYW1ldGVyIGlzIG5vdCBzZXQgdG8gYHRydWVgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2VyIC0gVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXNzIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWV0aG9kIC0gVGhlIGh0dHAgbXVsdGlwYXJ0IHVwbG9hZCBtZXRob2QgbmFtZS4gVGhlICdQVVQnIG9uZSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1R5cGUgLSBUaGUgdmlkZW8gY29kZWMgdHlwZSB1c2VkIGZvciBlbmNvZGluZyBvZiB0aGUgYmUgcmVjb3JkZWQgc2NyZWVuIGNhcHR1cmUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGUgYGZmbXBlZyAtY29kZWNzYCBpbiB0aGUgdGVybWluYWwgdG8gc2VlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB2aWRlbyBjb2RlY3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtanBlZycgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHZpZGVvUXVhbGl0eSAtIFRoZSB2aWRlbyBlbmNvZGluZyBxdWFsaXR5IChsb3csIG1lZGl1bSwgaGlnaCwgcGhvdG8gLSBkZWZhdWx0cyB0byBtZWRpdW0pLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdmlkZW9GcHMgLSBUaGUgRnJhbWVzIFBlciBTZWNvbmQgcmF0ZSBvZiB0aGUgcmVjb3JkZWQgdmlkZW8uIENoYW5nZSB0aGlzIHZhbHVlIGlmIHRoZSByZXN1bHRpbmcgdmlkZW9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0b28gc2xvdyBvciB0b28gZmFzdC4gRGVmYXVsdHMgdG8gMTAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvRmlsdGVycyAtIFRoZSBGRk1QRUcgdmlkZW8gZmlsdGVycyB0byBhcHBseS4gVGhlc2UgZmlsdGVycyBhbGxvdyB0byBzY2FsZSwgZmxpcCwgcm90YXRlIGFuZCBkbyBtYW55XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIHNvdXJjZSB2aWRlbyBzdHJlYW0uIFRoZSBmb3JtYXQgb2YgdGhlIHByb3BlcnR5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgY29tcGx5IHdpdGggaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1maWx0ZXJzLmh0bWxcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TY2FsZSAtIFRoZSBzY2FsaW5nIHZhbHVlIHRvIGFwcGx5LiBSZWFkIGh0dHBzOi8vdHJhYy5mZm1wZWcub3JnL3dpa2kvU2NhbGluZyBmb3IgcG9zc2libGUgdmFsdWVzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gc2NhbGUgaXMgYXBwbGllZCBieSBkZWZhdWx0LiBJZiBib3RoIGB2aWRlb0ZpbHRlcnNgIGFuZCBgdmlkZW9TY2FsZWAgYXJlIHNldCB0aGVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGB2aWRlb0ZpbHRlcnNgIHZhbHVlIHdpbGwgYmUgcmVzcGVjdGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwaXhlbEZvcm1hdCAtIE91dHB1dCBwaXhlbCBmb3JtYXQuIFJ1biBgZmZtcGVnIC1waXhfZm10c2AgdG8gbGlzdCBwb3NzaWJsZSB2YWx1ZXMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIFF1aWNrdGltZSBjb21wYXRpYmlsaXR5LCBzZXQgdG8gXCJ5dXY0MjBwXCIgYWxvbmcgd2l0aCB2aWRlb1R5cGU6IFwibGlieDI2NFwiLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZm9yY2VSZXN0YXJ0IC0gV2hldGhlciB0byB0cnkgdG8gY2F0Y2ggYW5kIHVwbG9hZC9yZXR1cm4gdGhlIGN1cnJlbnRseSBydW5uaW5nIHNjcmVlbiByZWNvcmRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgZmFsc2VgLCB0aGUgZGVmYXVsdCBzZXR0aW5nKSBvciBpZ25vcmUgdGhlIHJlc3VsdCBvZiBpdCBhbmQgc3RhcnQgYSBuZXcgcmVjb3JkaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGVseS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHRpbWVMaW1pdCAtIFRoZSBtYXhpbXVtIHJlY29yZGluZyB0aW1lLCBpbiBzZWNvbmRzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTgwLCB0aGUgbWF4aW11bSB2YWx1ZSBpcyA2MDAgKDEwIG1pbnV0ZXMpLlxuICovXG5cbi8qKlxuICogUmVjb3JkIHRoZSBkaXNwbGF5IG9mIGRldmljZXMgcnVubmluZyBpT1MgU2ltdWxhdG9yIHNpbmNlIFhjb2RlIDkgb3IgcmVhbCBkZXZpY2VzIHNpbmNlIGlPUyAxMVxuICogKGZmbXBlZyB1dGlsaXR5IGlzIHJlcXVpcmVkOiAnYnJldyBpbnN0YWxsIGZmbXBlZycpLlxuICogSXQgcmVjb3JkcyBzY3JlZW4gYWN0aXZpdHkgdG8gYSBNUEVHLTQgZmlsZS4gQXVkaW8gaXMgbm90IHJlY29yZGVkIHdpdGggdGhlIHZpZGVvIGZpbGUuXG4gKiBJZiBzY3JlZW4gcmVjb3JkaW5nIGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCB0aGVuIHRoZSBjb21tYW5kIHdpbGwgc3RvcCBpdCBmb3JjZWZ1bGx5IGFuZCBzdGFydCBhIG5ldyBvbmUuXG4gKiBUaGUgcHJldmlvdXNseSByZWNvcmRlZCB2aWRlbyBmaWxlIHdpbGwgYmUgZGVsZXRlZC5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmXG4gKiAgICAgICAgICAgICAgICAgICBhbnkgc2NyZWVuIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZyBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0LlxuICovXG5jb21tYW5kcy5zdGFydFJlY29yZGluZ1NjcmVlbiA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0UmVjb3JkaW5nU2NyZWVuIChvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHZpZGVvVHlwZSA9IERFRkFVTFRfVkNPREVDLFxuICAgIHRpbWVMaW1pdCA9IERFRkFVTFRfUkVDT1JESU5HX1RJTUVfU0VDLFxuICAgIHZpZGVvUXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICB2aWRlb0ZwcyA9IERFRkFVTFRfRlBTLFxuICAgIHZpZGVvRmlsdGVycyxcbiAgICB2aWRlb1NjYWxlLFxuICAgIGZvcmNlUmVzdGFydCxcbiAgICBwaXhlbEZvcm1hdFxuICB9ID0gb3B0aW9ucztcblxuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGlmICghZm9yY2VSZXN0YXJ0KSB7XG4gICAgbG9nLmluZm8oYENoZWNraW5nIGlmIHRoZXJlIGlzL3dhcyBhIHByZXZpb3VzIHNjcmVlbiByZWNvcmRpbmcuIGAgK1xuICAgICAgYFNldCAnZm9yY2VSZXN0YXJ0JyBvcHRpb24gdG8gJ3RydWUnIGlmIHlvdSdkIGxpa2UgdG8gc2tpcCB0aGlzIHN0ZXAuYCk7XG4gICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgdmlkZW9QYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKHtcbiAgICBwcmVmaXg6IGBhcHBpdW1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMiwgOCl9YCxcbiAgICBzdWZmaXg6IE1QNF9FWFQsXG4gIH0pO1xuXG4gIGNvbnN0IHdkYUJhc2VVcmwgPSB0aGlzLm9wdHMud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG4gIGNvbnN0IHNjcmVlblJlY29yZGVyID0gbmV3IFNjcmVlblJlY29yZGVyKHRoaXMub3B0cy5kZXZpY2UudWRpZCwgdmlkZW9QYXRoLCB7XG4gICAgcmVtb3RlUG9ydDogdGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCB8fCBERUZBVUxUX01KUEVHX1NFUlZFUl9QT1JULFxuICAgIHJlbW90ZVVybDogd2RhQmFzZVVybCxcbiAgICB1c2VQb3J0Rm9yd2FyZGluZzogdGhpcy5pc1JlYWxEZXZpY2UoKSAmJiBpc0xvY2FsSG9zdCh3ZGFCYXNlVXJsKSxcbiAgICB2aWRlb1R5cGUsXG4gICAgdmlkZW9GaWx0ZXJzLFxuICAgIHZpZGVvU2NhbGUsXG4gICAgdmlkZW9GcHMsXG4gICAgcGl4ZWxGb3JtYXRcbiAgfSk7XG4gIGlmICghYXdhaXQgc2NyZWVuUmVjb3JkZXIuaW50ZXJydXB0KHRydWUpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ1VuYWJsZSB0byBzdG9wIHNjcmVlbiByZWNvcmRpbmcgcHJvY2VzcycpO1xuICB9XG4gIGlmICh0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlcikge1xuICAgIGF3YWl0IHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyLmNsZWFudXAoKTtcbiAgICB0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlciA9IG51bGw7XG4gIH1cblxuICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHBhcnNlRmxvYXQodGltZUxpbWl0KTtcbiAgaWYgKGlzTmFOKHRpbWVvdXRTZWNvbmRzKSB8fCB0aW1lb3V0U2Vjb25kcyA+IE1BWF9SRUNPUkRJTkdfVElNRV9TRUMgfHwgdGltZW91dFNlY29uZHMgPD0gMCkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgdGltZUxpbWl0IHZhbHVlIG11c3QgYmUgaW4gcmFuZ2UgWzEsICR7TUFYX1JFQ09SRElOR19USU1FX1NFQ31dIHNlY29uZHMuIGAgK1xuICAgICAgYFRoZSB2YWx1ZSBvZiAnJHt0aW1lTGltaXR9JyBoYXMgYmVlbiBwYXNzZWQgaW5zdGVhZC5gKTtcbiAgfVxuXG4gIGxldCB7XG4gICAgbWpwZWdTZXJ2ZXJTY3JlZW5zaG90UXVhbGl0eSxcbiAgICBtanBlZ1NlcnZlckZyYW1lcmF0ZSxcbiAgfSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ0dFVCcpO1xuICBpZiAodmlkZW9RdWFsaXR5KSB7XG4gICAgY29uc3QgcXVhbGl0eSA9IF8uaXNJbnRlZ2VyKHZpZGVvUXVhbGl0eSkgPyB2aWRlb1F1YWxpdHkgOiBRVUFMSVRZX01BUFBJTkdbXy50b0xvd2VyKHZpZGVvUXVhbGl0eSldO1xuICAgIGlmICghcXVhbGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2aWRlb1F1YWxpdHkgdmFsdWUgc2hvdWxkIGJlIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhRVUFMSVRZX01BUFBJTkcpKX0gb3IgYSBudW1iZXIgaW4gcmFuZ2UgMS4uMTAwLiBgICtcbiAgICAgICAgYCcke3ZpZGVvUXVhbGl0eX0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgbWpwZWdTZXJ2ZXJTY3JlZW5zaG90UXVhbGl0eSA9IG1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHkgIT09IHF1YWxpdHkgPyBxdWFsaXR5IDogdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIG1qcGVnU2VydmVyU2NyZWVuc2hvdFF1YWxpdHkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHZpZGVvRnBzKSB7XG4gICAgY29uc3QgZnBzID0gcGFyc2VJbnQodmlkZW9GcHMsIDEwKTtcbiAgICBpZiAoaXNOYU4oZnBzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2aWRlb0ZwcyB2YWx1ZSBzaG91bGQgYmUgYSB2YWxpZCBudW1iZXIgaW4gcmFuZ2UgMS4uNjAuIGAgK1xuICAgICAgICBgJyR7dmlkZW9GcHN9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gICAgfVxuICAgIG1qcGVnU2VydmVyRnJhbWVyYXRlID0gbWpwZWdTZXJ2ZXJGcmFtZXJhdGUgIT09IGZwcyA/IGZwcyA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBtanBlZ1NlcnZlckZyYW1lcmF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShtanBlZ1NlcnZlclNjcmVlbnNob3RRdWFsaXR5KSB8fCB1dGlsLmhhc1ZhbHVlKG1qcGVnU2VydmVyRnJhbWVyYXRlKSkge1xuICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ1BPU1QnLCB7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBtanBlZ1NlcnZlclNjcmVlbnNob3RRdWFsaXR5LFxuICAgICAgICBtanBlZ1NlcnZlckZyYW1lcmF0ZSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgc2NyZWVuUmVjb3JkZXIuc3RhcnQodGltZW91dFNlY29uZHMgKiAxMDAwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IHNjcmVlblJlY29yZGVyLmludGVycnVwdCh0cnVlKTtcbiAgICBhd2FpdCBzY3JlZW5SZWNvcmRlci5jbGVhbnVwKCk7XG4gICAgdGhyb3cgZTtcbiAgfVxuICB0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlciA9IHNjcmVlblJlY29yZGVyO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBsb2NhdGlvbiwgd2hlcmUgdGhlIHJlc3VsdGluZyB2aWRlbyBzaG91bGQgYmUgdXBsb2FkZWQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb3RvY29scyBhcmUgc3VwcG9ydGVkOiBodHRwL2h0dHBzLCBmdHAuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSAodGhlIGRlZmF1bHQgc2V0dGluZykgbWVhbnMgdGhlIGNvbnRlbnQgb2YgcmVzdWx0aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNob3VsZCBiZSBlbmNvZGVkIGFzIEJhc2U2NCBhbmQgcGFzc2VkIGFzIHRoZSBlbmRwb2ludCByZXNwb25zZSB2YWx1ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZ2VuZXJhdGVkIG1lZGlhIGZpbGUgaXMgdG9vIGJpZyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml0IGludG8gdGhlIGF2YWlsYWJsZSBwcm9jZXNzIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNlciAtIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi4gT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCAtIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaGVhZGVycyAtIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gZmllbGQsIHdoZXJlIHRoZSBmaWxlIGNvbnRlbnQgQkxPQiBzaG91bGQgYmUgc3RvcmVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fEFycmF5PFBhaXI+fSBmb3JtRmllbGRzIC0gQWRkaXRpb25hbCBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0IGh0dHAocykgdXBsb2Fkc1xuICovXG5cbi8qKlxuICogU3RvcCByZWNvcmRpbmcgdGhlIHNjcmVlbi4gSWYgbm8gc2NyZWVuIHJlY29yZGluZyBwcm9jZXNzIGlzIHJ1bm5pbmcgdGhlblxuICogdGhlIGVuZHBvaW50IHdpbGwgdHJ5IHRvIGdldCB0aGUgcmVjZW50bHkgcmVjb3JkZWQgZmlsZS5cbiAqIElmIG5vIHByZXZpb3VzbHkgcmVjb3JkZWQgZmlsZSBpcyBmb3VuZCBhbmQgbm8gYWN0aXZlIHNjcmVlbiByZWNvcmRpbmdcbiAqIHByb2Nlc3NlcyBhcmUgcnVubmluZyB0aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGVtcHR5IG9yIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBuYW1lIG9mIGEgbWVkaWEgZmlsZVxuICogICAgICAgICAgICAgICAgIG9yIHRoZSBmaWxlIGNvbnRlbnQgY2Fubm90IGJlIHVwbG9hZGVkIHRvIHRoZSByZW1vdGUgbG9jYXRpb24uXG4gKi9cbmNvbW1hbmRzLnN0b3BSZWNvcmRpbmdTY3JlZW4gPSBhc3luYyBmdW5jdGlvbiBzdG9wUmVjb3JkaW5nU2NyZWVuIChvcHRpb25zID0ge30pIHtcbiAgaWYgKCF0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlcikge1xuICAgIGxvZy5pbmZvKCdTY3JlZW4gcmVjb3JkaW5nIGlzIG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0b3AuJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB2aWRlb1BhdGggPSBhd2FpdCB0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlci5maW5pc2goKTtcbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh2aWRlb1BhdGgpKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIHNjcmVlbiByZWNvcmRlciB1dGlsaXR5IGhhcyBmYWlsZWQgYCArXG4gICAgICAgIGB0byBzdG9yZSB0aGUgYWN0dWFsIHNjcmVlbiByZWNvcmRpbmcgYXQgJyR7dmlkZW9QYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGVuY29kZUJhc2U2NE9yVXBsb2FkKHZpZGVvUGF0aCwgb3B0aW9ucy5yZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCB0aGlzLl9yZWNlbnRTY3JlZW5SZWNvcmRlci5pbnRlcnJ1cHQodHJ1ZSk7XG4gICAgYXdhaXQgdGhpcy5fcmVjZW50U2NyZWVuUmVjb3JkZXIuY2xlYW51cCgpO1xuICAgIHRoaXMuX3JlY2VudFNjcmVlblJlY29yZGVyID0gbnVsbDtcbiAgfVxufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9yZWNvcmRzY3JlZW4uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -55,6 +55,9 @@ const VISIBLE = 'visible';
55
55
  const INVISIBLE = 'invisible';
56
56
  const DETECT = 'detect';
57
57
  const VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];
58
+ const TAB_BAR_POSITION_TOP = 'top';
59
+ const TAB_BAR_POSITION_BOTTOM = 'bottom';
60
+ const TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];
58
61
  const commands = {},
59
62
  helpers = {},
60
63
  extensions = {};
@@ -416,15 +419,19 @@ extensions.getSafariIsNotched = _lodash.default.memoize(async function getSafari
416
419
  extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWebCoordsOffset(wvPos, realDims) {
417
420
  let topOffset = 0;
418
421
  let bottomOffset = 0;
422
+ const isIphone = await this.getSafariIsIphone();
419
423
  const {
420
424
  nativeWebTapTabBarVisibility,
421
- nativeWebTapSmartAppBannerVisibility
425
+ nativeWebTapSmartAppBannerVisibility,
426
+ safariTabBarPosition = _appiumSupport.util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP
422
427
  } = await this.settings.getSettings();
423
428
 
424
429
  let tabBarVisibility = _lodash.default.lowerCase(nativeWebTapTabBarVisibility);
425
430
 
426
431
  let bannerVisibility = _lodash.default.lowerCase(nativeWebTapSmartAppBannerVisibility);
427
432
 
433
+ const tabBarPosition = _lodash.default.lowerCase(safariTabBarPosition);
434
+
428
435
  if (!VISIBILITIES.includes(tabBarVisibility)) {
429
436
  tabBarVisibility = DETECT;
430
437
  }
@@ -433,7 +440,10 @@ extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWe
433
440
  bannerVisibility = DETECT;
434
441
  }
435
442
 
436
- const isIphone = await this.getSafariIsIphone();
443
+ if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {
444
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);
445
+ }
446
+
437
447
  const isNotched = isIphone && (await this.getSafariIsNotched());
438
448
  const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';
439
449
  const notchOffset = isNotched ? _appiumSupport.util.compareVersions(this.opts.platformVersion, '=', '13.0') ? IPHONE_X_NOTCH_OFFSET_IOS_13 : IPHONE_X_NOTCH_OFFSET_IOS : 0;
@@ -450,7 +460,10 @@ extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWe
450
460
  topOffset = 0;
451
461
  }
452
462
  } else {
453
- topOffset = IPHONE_TOP_BAR_HEIGHT + notchOffset;
463
+ topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;
464
+ topOffset += notchOffset;
465
+
466
+ _logger.default.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);
454
467
 
455
468
  if (isIphone) {
456
469
  if (orientation === 'PORTRAIT') {
@@ -723,4 +736,4 @@ var _default = commands;
723
736
  exports.default = _default;require('source-map-support').install();
724
737
 
725
738
 
726
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy93ZWIuanMiXSwibmFtZXMiOlsiSVBIT05FX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX1NDUk9MTEVEX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX1hfU0NST0xMRURfT0ZGU0VUIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPUyIsIklQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTMiLCJJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX0JPVFRPTV9CQVJfT0ZGU0VUIiwiVEFCX0JBUl9PRkZTRVQiLCJJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIiwiSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJOT1RDSEVEX0RFVklDRV9TSVpFUyIsInciLCJoIiwiVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIiLCJ1dGlsIiwiQVRPTV9XQUlUX1RJTUVPVVRfTVMiLCJBVE9NX0lOSVRJQUxfV0FJVF9NUyIsIk9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UIiwiVklTSUJMRSIsIklOVklTSUJMRSIsIkRFVEVDVCIsIlZJU0lCSUxJVElFUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIiLCJpZCIsIl8iLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNFbXB0eSIsImlzTmFOIiwic2V0RnJhbWUiLCJmcmFtZSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJpc051bGwiLCJjdXJXZWJGcmFtZXMiLCJsb2ciLCJkZWJ1ZyIsImhhc0VsZW1lbnRJZCIsImF0b21zRWxlbWVudCIsImdldEF0b21zRWxlbWVudCIsInZhbHVlIiwiZXhlY3V0ZUF0b20iLCJXSU5ET1ciLCJ1bnNoaWZ0IiwiYXRvbSIsImlzVW5kZWZpbmVkIiwiTm9TdWNoRnJhbWVFcnJvciIsImdldENzc1Byb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiZWwiLCJzdWJtaXQiLCJyZWZyZXNoIiwiZ2V0VXJsIiwicmVtb3RlIiwiZXhlY3V0ZSIsInRpdGxlIiwiZ2V0Q29va2llcyIsInNjcmlwdCIsImpzQ29va2llcyIsImNvb2tpZXMiLCJuYW1lIiwidG9QYWlycyIsImNvb2tpZVV0aWxzIiwiY3JlYXRlSldQQ29va2llIiwidW5kZWZpbmVkIiwicHVzaCIsImVyciIsImVycm9yIiwiVW5rbm93bkVycm9yIiwic2V0Q29va2llIiwiY29va2llIiwiY2xvbmUiLCJwYXRoIiwianNDb29raWUiLCJjcmVhdGVKU0Nvb2tpZSIsImV4cGlyZXMiLCJleHBpcnkiLCJEYXRlIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJodHRwT25seSIsInNlY3VyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZWxldGVDb29raWUiLCJjb29raWVOYW1lIiwiaW5kZXhPZiIsIm1hcCIsIl9kZWxldGVDb29raWUiLCJkZWxldGVDb29raWVzIiwibGVuZ3RoIiwid2ViQ29va2llIiwiZXhwaXJlQ29va2llIiwiY2FjaGVXZWJFbGVtZW50IiwiaXNQbGFpbk9iamVjdCIsImVsSWQiLCJ1bndyYXBFbGVtZW50IiwiY2FjaGVJZCIsImluY2x1ZGVzIiwidXVpZFY0Iiwid2ViRWxlbWVudHNDYWNoZSIsInNldCIsIndyYXBFbGVtZW50IiwiY2FjaGVXZWJFbGVtZW50cyIsInJlc3BvbnNlIiwidG9DYWNoZWQiLCJ2IiwiaXNBcnJheSIsInJlc3VsdCIsInJlZHVjZSIsImFjYyIsImtleSIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYW55IiwiY3R4IiwiY29udGV4dEVsZW1lbnQiLCJpc05pbCIsImVsZW1lbnQiLCJkb0ZpbmQiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJtZXNzYWdlIiwiaXNGdW5jdGlvbiIsIm1hdGNoIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiY2xpY2tXZWJDb29yZHMiLCJjb29yZHMiLCJ0cmFuc2xhdGVXZWJDb29yZHMiLCJjdXJXZWJDb29yZHMiLCJjbGlja0Nvb3JkcyIsImFyZ3MiLCJhbHdheXNEZWZhdWx0RnJhbWUiLCJmcmFtZXMiLCJwcm9taXNlIiwid2FpdEZvckF0b20iLCJleGVjdXRlQXRvbUFzeW5jIiwicmVzcG9uc2VVcmwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImFzeW5jUHJvbWlzZSIsImVsT3JJZCIsImhhcyIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRUxFTUVOVCIsImdldCIsImNvbnZlcnRFbGVtZW50c0ZvckF0b21zIiwiYXJnIiwiZ2V0RWxlbWVudElkIiwiaGFzVmFsdWUiLCJnZXRTYWZhcmlJc0lwaG9uZSIsIm1lbW9pemUiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsIndhcm4iLCJnZXRTYWZhcmlEZXZpY2VTaXplIiwid2lkdGgiLCJoZWlnaHQiLCJub3JtSGVpZ2h0Iiwibm9ybVdpZHRoIiwiZ2V0U2FmYXJpSXNOb3RjaGVkIiwiZGV2aWNlIiwiZ2V0RXh0cmFUcmFuc2xhdGVXZWJDb29yZHNPZmZzZXQiLCJ3dlBvcyIsInJlYWxEaW1zIiwidG9wT2Zmc2V0IiwiYm90dG9tT2Zmc2V0IiwibmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSIsIm5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSIsInNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJ0YWJCYXJWaXNpYmlsaXR5IiwibG93ZXJDYXNlIiwiYmFubmVyVmlzaWJpbGl0eSIsImlzSXBob25lIiwiaXNOb3RjaGVkIiwib3JpZW50YXRpb24iLCJub3RjaE9mZnNldCIsImNvbXBhcmVWZXJzaW9ucyIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJpc1Njcm9sbGVkIiwiY29udGV4dHNBbmRWaWV3cyIsImdldENvbnRleHRzQW5kVmlld3MiLCJ0YWJzIiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsImdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0IiwieSIsIm9mZnNldCIsImJhbm5lcnMiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJ0YXBXZWJFbGVtZW50TmF0aXZlbHkiLCJkcml2ZXIiLCJ0ZXh0IiwiZWxzIiwicmVjdCIsInByb3h5Q29tbWFuZCIsImVsMiIsInJlY3QyIiwieCIsIk1hdGgiLCJyb3VuZCIsIm5hdGl2ZVdlYlRhcCIsIm5hdGl2ZVdlYlRhcFN0cmljdCIsIlByb21pc2UiLCJhbGwiLCJzaXplIiwiY29vcmRpbmF0ZXMiLCJwZXJmb3JtVG91Y2giLCJhY3Rpb24iLCJvcHRpb25zIiwid2VidmlldyIsImlnbiIsIkVycm9yIiwiY21kIiwid3ZEaW1zIiwiaW1wbGljaXRXYWl0TXMiLCJzZXRJbXBsaWNpdFdhaXQiLCJ4UmF0aW8iLCJ5UmF0aW8iLCJuZXdDb29yZHMiLCJjaGVja0ZvckFsZXJ0IiwiZ2V0QWxlcnRUZXh0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidGltZWRBdG9tUHJvbWlzZSIsInRpbWVvdXQiLCJoYW5kbGVQcm9taXNlRXJyb3IiLCJwIiwib3JpZ2luYWxFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiVGltZW91dEVycm9yIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJhbnkiLCJkZWxheSIsImlzRnVsZmlsbGVkIiwiX3dhaXRpbmdBdG9tcyIsImNvdW50IiwiYWxlcnROb3RpZmllciIsIkV2ZW50RW1pdHRlciIsImFsZXJ0TW9uaXRvciIsIm9uQWxlcnRDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJlbWl0IiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwib25jZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwibW9iaWxlV2ViTmF2IiwibmF2VHlwZSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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LFNBQUtMLGFBQUwsQ0FBbUJDLEtBQW5CO0FBQ0Q7QUFDRixDQWxFRDs7QUFvRUEvTixVQUFVLENBQUMyTyxZQUFYLEdBQTBCLGVBQWVBLFlBQWYsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzlELE9BQUszTSxNQUFMLENBQVk0TSw0QkFBWixHQUEyQyxJQUEzQzs7QUFDQSxNQUFJO0FBQ0YsVUFBTSxLQUFLeE4sV0FBTCxDQUFpQixnQkFBakIsRUFBbUMsQ0FBRSxXQUFVdU4sT0FBUSxLQUFwQixFQUEwQixJQUExQixDQUFuQyxDQUFOO0FBQ0QsR0FGRCxTQUVVO0FBQ1IsU0FBSzNNLE1BQUwsQ0FBWTRNLDRCQUFaLEdBQTJDLEtBQTNDO0FBQ0Q7QUFDRixDQVBEOztBQVNBQyxNQUFNLENBQUNDLE1BQVAsQ0FBY2pQLFFBQWQsRUFBd0JFLFVBQXhCLEVBQW9DRCxPQUFwQztlQUVlRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCBjb29raWVVdGlscyBmcm9tICcuLi9jb29raWVzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmNvbnN0IElQSE9ORV9UT1BfQkFSX0hFSUdIVCA9IDcxO1xuY29uc3QgSVBIT05FX1NDUk9MTEVEX1RPUF9CQVJfSEVJR0hUID0gNDE7XG5jb25zdCBJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQgPSA1NTtcbmNvbnN0IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1MgPSAyNDtcbmNvbnN0IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTMgPSAyMDtcblxuY29uc3QgSVBIT05FX0xBTkRTQ0FQRV9UT1BfQkFSX0hFSUdIVCA9IDUxO1xuY29uc3QgSVBIT05FX0JPVFRPTV9CQVJfT0ZGU0VUID0gNDk7XG5jb25zdCBUQUJfQkFSX09GRlNFVCA9IDMzO1xuY29uc3QgSVBIT05FX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA9IDg0O1xuY29uc3QgSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgPSA5NTtcblxuY29uc3QgTk9UQ0hFRF9ERVZJQ0VfU0laRVMgPSBbXG4gIHt3OiAxMTI1LCBoOiAyNDM2fSwgLy8gMTEgUHJvLCBYLCBYc1xuICB7dzogODI4LCBoOiAxNzkyfSwgLy8gMTEsIFhyXG4gIHt3OiAxMjQyLCBoOiAyNjg4fSwgLy8gMTEgUHJvIE1heCwgWHMgTWF4XG5dO1xuXG5jb25zdCB7IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIH0gPSB1dGlsO1xuXG5jb25zdCBBVE9NX1dBSVRfVElNRU9VVF9NUyA9IDIgKiA2MDAwMDtcbmNvbnN0IEFUT01fSU5JVElBTF9XQUlUX01TID0gMTAwMDtcblxuY29uc3QgT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQgPSAnYWxlcnQnO1xuXG5jb25zdCBWSVNJQkxFID0gJ3Zpc2libGUnO1xuY29uc3QgSU5WSVNJQkxFID0gJ2ludmlzaWJsZSc7XG5jb25zdCBERVRFQ1QgPSAnZGV0ZWN0JztcbmNvbnN0IFZJU0lCSUxJVElFUyA9IFtWSVNJQkxFLCBJTlZJU0lCTEUsIERFVEVDVF07XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIgKGlkKSB7XG4gIGlmICghXy5pc1N0cmluZyhpZCkgJiYgIV8uaXNOdW1iZXIoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGlkKSAmJiBfLmlzRW1wdHkoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzTnVtYmVyKGlkKSAmJiBpc05hTihpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbW1hbmRzLnNldEZyYW1lID0gYXN5bmMgZnVuY3Rpb24gc2V0RnJhbWUgKGZyYW1lKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgaWYgKF8uaXNOdWxsKGZyYW1lKSkge1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzID0gW107XG4gICAgbG9nLmRlYnVnKCdMZWF2aW5nIHdlYiBmcmFtZSBhbmQgZ29pbmcgYmFjayB0byBkZWZhdWx0IGNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoZnJhbWUpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZnJhbWUpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X2ZyYW1lX3dpbmRvdycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBsb2cuZGVidWcoYEVudGVyaW5nIG5ldyB3ZWIgZnJhbWU6ICcke3ZhbHVlLldJTkRPV30nYCk7XG4gICAgdGhpcy5jdXJXZWJGcmFtZXMudW5zaGlmdCh2YWx1ZS5XSU5ET1cpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGF0b20gPSBfLmlzTnVtYmVyKGZyYW1lKSA/ICdmcmFtZV9ieV9pbmRleCcgOiAnZnJhbWVfYnlfaWRfb3JfbmFtZSc7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKGF0b20sIFtmcmFtZV0pO1xuICAgIGlmIChfLmlzTnVsbCh2YWx1ZSkgfHwgXy5pc1VuZGVmaW5lZCh2YWx1ZS5XSU5ET1cpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaEZyYW1lRXJyb3IoKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBFbnRlcmluZyBuZXcgd2ViIGZyYW1lOiAnJHt2YWx1ZS5XSU5ET1d9J2ApO1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzLnVuc2hpZnQodmFsdWUuV0lORE9XKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0Q3NzUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDc3NQcm9wZXJ0eSAocHJvcGVydHlOYW1lLCBlbCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF92YWx1ZV9vZl9jc3NfcHJvcGVydHknLCBbYXRvbXNFbGVtZW50LCBwcm9wZXJ0eU5hbWVdKTtcbn07XG5cbmNvbW1hbmRzLnN1Ym1pdCA9IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdCAoZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ3N1Ym1pdCcsIFthdG9tc0VsZW1lbnRdKTtcbn07XG5cbmNvbW1hbmRzLnJlZnJlc2ggPSBhc3luYyBmdW5jdGlvbiByZWZyZXNoICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdyZWZyZXNoJywgW10pO1xufTtcblxuY29tbWFuZHMuZ2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gZ2V0VXJsICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZSgnd2luZG93LmxvY2F0aW9uLmhyZWYnKTtcbn07XG5cbmNvbW1hbmRzLnRpdGxlID0gYXN5bmMgZnVuY3Rpb24gdGl0bGUgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0aXRsZScsIFtdLCB0cnVlKTtcbn07XG5cbmNvbW1hbmRzLmdldENvb2tpZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29raWVzICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgYWxsIGNvb2tpZXMnKTtcblxuICBsZXQgc2NyaXB0ID0gJ3JldHVybiBkb2N1bWVudC5jb29raWUnO1xuICBsZXQganNDb29raWVzID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xuXG4gIGxldCBjb29raWVzID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY29va2llVXRpbHMuY3JlYXRlSldQQ29va2llKHVuZGVmaW5lZCwganNDb29raWVzKSkpIHtcbiAgICAgIGNvb2tpZXMucHVzaCh7bmFtZSwgdmFsdWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvb2tpZXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvcihlcnIpO1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBFcnJvciBwYXJzaW5nIGNvb2tpZXMgZnJvbSByZXN1bHQ6ICcke2pzQ29va2llc30nYCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnNldENvb2tpZSA9IGFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZSAoY29va2llKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgY29va2llID0gXy5jbG9uZShjb29raWUpO1xuXG4gIC8vIGlmIGBwYXRoYCBmaWVsZCBpcyBub3Qgc3BlY2lmaWVkLCBTYWZhcmkgd2lsbCBub3QgdXBkYXRlIGNvb2tpZXMgYXMgZXhwZWN0ZWQ7IGVnIGlzc3VlICMxNzA4XG4gIGlmICghY29va2llLnBhdGgpIHtcbiAgICBjb29raWUucGF0aCA9ICcvJztcbiAgfVxuXG4gIGNvbnN0IGpzQ29va2llID0gY29va2llVXRpbHMuY3JlYXRlSlNDb29raWUoY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSwge1xuICAgIGV4cGlyZXM6IF8uaXNOdW1iZXIoY29va2llLmV4cGlyeSkgPyAobmV3IERhdGUoY29va2llLmV4cGlyeSAqIDEwMDApKS50b1VUQ1N0cmluZygpIDpcbiAgICAgIGNvb2tpZS5leHBpcnksXG4gICAgcGF0aDogY29va2llLnBhdGgsXG4gICAgZG9tYWluOiBjb29raWUuZG9tYWluLFxuICAgIGh0dHBPbmx5OiBjb29raWUuaHR0cE9ubHksXG4gICAgc2VjdXJlOiBjb29raWUuc2VjdXJlXG4gIH0pO1xuICBsZXQgc2NyaXB0ID0gYGRvY3VtZW50LmNvb2tpZSA9ICR7SlNPTi5zdHJpbmdpZnkoanNDb29raWUpfWA7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW11dKTtcbn07XG5cbmNvbW1hbmRzLmRlbGV0ZUNvb2tpZSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNvb2tpZSAoY29va2llTmFtZSkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIC8vIGNoZWNrIGNvb2tpZSBleGlzdGVuY2VcbiAgbGV0IGNvb2tpZXMgPSBhd2FpdCB0aGlzLmdldENvb2tpZXMoKTtcbiAgaWYgKF8uaW5kZXhPZihfLm1hcChjb29raWVzLCAnbmFtZScpLCBjb29raWVOYW1lKSA9PT0gLTEpIHtcbiAgICBsb2cuZGVidWcoYENvb2tpZSAnJHtjb29raWVOYW1lfScgbm90IGZvdW5kLiBJZ25vcmluZy5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLl9kZWxldGVDb29raWUoY29va2llTmFtZSk7XG59O1xuXG5jb21tYW5kcy5kZWxldGVDb29raWVzID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29va2llcyAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgbGV0IGNvb2tpZXMgPSBhd2FpdCB0aGlzLmdldENvb2tpZXMoKTtcbiAgaWYgKGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgY29va2llIG9mIGNvb2tpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlbGV0ZUNvb2tpZShjb29raWUubmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuaGVscGVycy5fZGVsZXRlQ29va2llID0gYXN5bmMgZnVuY3Rpb24gX2RlbGV0ZUNvb2tpZSAoY29va2llTmFtZSkge1xuICBsb2cuZGVidWcoYERlbGV0aW5nIGNvb2tpZSAnJHtjb29raWVOYW1lfSdgKTtcbiAgbGV0IHdlYkNvb2tpZSA9IGNvb2tpZVV0aWxzLmV4cGlyZUNvb2tpZShjb29raWVOYW1lLCB7cGF0aDogJy8nfSk7XG4gIGxldCBzY3JpcHQgPSBgZG9jdW1lbnQuY29va2llID0gJHtKU09OLnN0cmluZ2lmeSh3ZWJDb29raWUpfWA7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW11dKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50ID0gZnVuY3Rpb24gY2FjaGVXZWJFbGVtZW50IChlbCkge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChlbCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgY29uc3QgZWxJZCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyKGVsSWQpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIC8vIEluIG5ld2VyIGRlYnVnZ2VyIHJlbGVhc2VzIGVsZW1lbnQgaWRlbnRpZmllcnMgbG9vayBsaWtlIGA6d2RjOjE2MjgxNTE2NDkzMjVgXG4gIC8vIFdlIGFzc3VtZSBpdCBpcyBzYWZlIHRvIHVzZSB0aGVzZSB0byBpZGVudGlmeSBjYWNoZWQgZWxlbWVudHNcbiAgY29uc3QgY2FjaGVJZCA9IF8uaW5jbHVkZXMoZWxJZCwgJzonKSA/IGVsSWQgOiB1dGlsLnV1aWRWNCgpO1xuICB0aGlzLndlYkVsZW1lbnRzQ2FjaGUuc2V0KGNhY2hlSWQsIGVsSWQpO1xuICByZXR1cm4gdXRpbC53cmFwRWxlbWVudChjYWNoZUlkKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50cyA9IGZ1bmN0aW9uIGNhY2hlV2ViRWxlbWVudHMgKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHRvQ2FjaGVkID0gKHYpID0+IF8uaXNBcnJheSh2KSB8fCBfLmlzUGxhaW5PYmplY3QodilcbiAgICA/IHRoaXMuY2FjaGVXZWJFbGVtZW50cyh2KVxuICAgIDogdjtcblxuICBpZiAoXy5pc0FycmF5KHJlc3BvbnNlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5tYXAodG9DYWNoZWQpO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChyZXNwb25zZSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7Li4ucmVzcG9uc2UsIC4uLih0aGlzLmNhY2hlV2ViRWxlbWVudChyZXNwb25zZSkpfTtcbiAgICByZXR1cm4gXy50b1BhaXJzKHJlc3VsdCkucmVkdWNlKFxuICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdG9DYWNoZWQodmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbmV4dGVuc2lvbnMuZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzID0gYXN5bmMgZnVuY3Rpb24gZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzIChzdHJhdGVneSwgc2VsZWN0b3IsIG1hbnksIGN0eCkge1xuICBjb25zdCBjb250ZXh0RWxlbWVudCA9IF8uaXNOaWwoY3R4KSA/IG51bGwgOiB0aGlzLmdldEF0b21zRWxlbWVudChjdHgpO1xuICBsZXQgZWxlbWVudDtcbiAgbGV0IGRvRmluZCA9IGFzeW5jICgpID0+IHtcbiAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbShgZmluZF9lbGVtZW50JHttYW55ID8gJ3MnIDogJyd9YCwgW3N0cmF0ZWd5LCBzZWxlY3RvciwgY29udGV4dEVsZW1lbnRdKTtcbiAgICByZXR1cm4gIV8uaXNOdWxsKGVsZW1lbnQpO1xuICB9O1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uKGRvRmluZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZSAmJiBfLmlzRnVuY3Rpb24oZXJyLm1lc3NhZ2UubWF0Y2gpICYmIGVyci5tZXNzYWdlLm1hdGNoKC9Db25kaXRpb24gdW5tZXQvKSkge1xuICAgICAgLy8gY29uZGl0aW9uIHdhcyBub3QgbWV0IHNldHRpbmcgcmVzIHRvIGVtcHR5IGFycmF5XG4gICAgICBlbGVtZW50ID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBpZiAobWFueSkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMoZWxlbWVudCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShlbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhlbGVtZW50KTtcbn07XG5cbmV4dGVuc2lvbnMuY2xpY2tXZWJDb29yZHMgPSBhc3luYyBmdW5jdGlvbiBjbGlja1dlYkNvb3JkcyAoKSB7XG4gIGxldCBjb29yZHMgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVdlYkNvb3Jkcyh0aGlzLmN1cldlYkNvb3Jkcyk7XG4gIGF3YWl0IHRoaXMuY2xpY2tDb29yZHMoY29vcmRzKTtcbn07XG5cbmhlbHBlcnMuZXhlY3V0ZUF0b20gPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbSAoYXRvbSwgYXJncywgYWx3YXlzRGVmYXVsdEZyYW1lID0gZmFsc2UpIHtcbiAgbGV0IGZyYW1lcyA9IGFsd2F5c0RlZmF1bHRGcmFtZSA9PT0gdHJ1ZSA/IFtdIDogdGhpcy5jdXJXZWJGcmFtZXM7XG4gIGxldCBwcm9taXNlID0gdGhpcy5yZW1vdGUuZXhlY3V0ZUF0b20oYXRvbSwgYXJncywgZnJhbWVzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSk7XG59O1xuXG5oZWxwZXJzLmV4ZWN1dGVBdG9tQXN5bmMgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbUFzeW5jIChhdG9tLCBhcmdzLCByZXNwb25zZVVybCkge1xuICAvLyBzYXZlIHRoZSByZXNvbHZlIGFuZCByZWplY3QgbWV0aG9kcyBvZiB0aGUgcHJvbWlzZSB0byBiZSB3YWl0ZWQgZm9yXG4gIGxldCBwcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuYXN5bmNQcm9taXNlID0ge3Jlc29sdmUsIHJlamVjdH07XG4gIH0pO1xuICBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbUFzeW5jKGF0b20sIGFyZ3MsIHRoaXMuY3VyV2ViRnJhbWVzLCByZXNwb25zZVVybCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JBdG9tKHByb21pc2UpO1xufTtcblxuaGVscGVycy5nZXRBdG9tc0VsZW1lbnQgPSBmdW5jdGlvbiBnZXRBdG9tc0VsZW1lbnQgKGVsT3JJZCkge1xuICBjb25zdCBlbElkID0gdXRpbC51bndyYXBFbGVtZW50KGVsT3JJZCk7XG4gIGlmICghdGhpcy53ZWJFbGVtZW50c0NhY2hlLmhhcyhlbElkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IoKTtcbiAgfVxuICByZXR1cm4ge0VMRU1FTlQ6IHRoaXMud2ViRWxlbWVudHNDYWNoZS5nZXQoZWxJZCl9O1xufTtcblxuaGVscGVycy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50c0ZvckF0b21zIChhcmdzID0gW10pIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoYXJnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXRvbXNFbGVtZW50KGFyZyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIHJldHVybiBfLmlzQXJyYXkoYXJnKSA/IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJnKSA6IGFyZztcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEVsZW1lbnRJZCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRJZCAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5FTEVNRU5UIHx8IGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdO1xufTtcblxuaGVscGVycy5oYXNFbGVtZW50SWQgPSBmdW5jdGlvbiBoYXNFbGVtZW50SWQgKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHV0aWwuaGFzVmFsdWUoZWxlbWVudCkgJiYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudC5FTEVNRU5UKSB8fCB1dGlsLmhhc1ZhbHVlKGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdKSk7XG59O1xuXG5leHRlbnNpb25zLmdldFNhZmFyaUlzSXBob25lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldFNhZmFyaUlzSXBob25lICgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoJ3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Jyk7XG4gICAgcmV0dXJuIHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpcGhvbmUnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIGRldmljZSB0eXBlIGZyb20gdXNlcmFnZW50LiBBc3N1bWluZyBpUGhvbmVgKTtcbiAgICBsb2cuZGVidWcoYEVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufSk7XG5cbmV4dGVuc2lvbnMuZ2V0U2FmYXJpRGV2aWNlU2l6ZSA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlEZXZpY2VTaXplICgpIHtcbiAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiB7aGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmF2YWlsSGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8sIHdpZHRoOiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb307JztcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gIGNvbnN0IFtub3JtSGVpZ2h0LCBub3JtV2lkdGhdID0gaGVpZ2h0ID4gd2lkdGggPyBbaGVpZ2h0LCB3aWR0aF0gOiBbd2lkdGgsIGhlaWdodF07XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5vcm1XaWR0aCxcbiAgICBoZWlnaHQ6IG5vcm1IZWlnaHQsXG4gIH07XG59KTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlJc05vdGNoZWQgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpSXNOb3RjaGVkICgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmdldFNhZmFyaURldmljZVNpemUoKTtcbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBOT1RDSEVEX0RFVklDRV9TSVpFUykge1xuICAgICAgaWYgKGRldmljZS53ID09PSB3aWR0aCAmJiBkZXZpY2UuaCA9PT0gaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIGRldmljZSB0eXBlIGZyb20gZGltZW5zaW9ucy4gQXNzdW1pbmcgdGhlIGRldmljZSBpcyBub3Qgbm90Y2hlZGApO1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG5cbmV4dGVuc2lvbnMuZ2V0RXh0cmFUcmFuc2xhdGVXZWJDb29yZHNPZmZzZXQgPSBhc3luYyBmdW5jdGlvbiBnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCAod3ZQb3MsIHJlYWxEaW1zKSB7XG4gIGxldCB0b3BPZmZzZXQgPSAwO1xuICBsZXQgYm90dG9tT2Zmc2V0ID0gMDtcblxuICAvLyBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIFNtYXJ0IEFwcCBCYW5uZXIgb3IgVGFiIEJhciBpcyB2aXNpYmxlIG9yIG5vdFxuICAvLyBpZiBhbHJlYWR5IGRlZmluZWQgYnkgbmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSBvciBuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkgaW4gc2V0dGluZ3MuXG4gIGNvbnN0IHtcbiAgICBuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5LFxuICAgIG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eVxuICB9ID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpO1xuICBsZXQgdGFiQmFyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkpO1xuICBsZXQgYmFubmVyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSk7XG4gIGlmICghVklTSUJJTElUSUVTLmluY2x1ZGVzKHRhYkJhclZpc2liaWxpdHkpKSB7XG4gICAgdGFiQmFyVmlzaWJpbGl0eSA9IERFVEVDVDtcbiAgfVxuICBpZiAoIVZJU0lCSUxJVElFUy5pbmNsdWRlcyhiYW5uZXJWaXNpYmlsaXR5KSkge1xuICAgIGJhbm5lclZpc2liaWxpdHkgPSBERVRFQ1Q7XG4gIH1cblxuICBjb25zdCBpc0lwaG9uZSA9IGF3YWl0IHRoaXMuZ2V0U2FmYXJpSXNJcGhvbmUoKTtcbiAgY29uc3QgaXNOb3RjaGVkID0gaXNJcGhvbmUgJiYgYXdhaXQgdGhpcy5nZXRTYWZhcmlJc05vdGNoZWQoKTtcblxuICBjb25zdCBvcmllbnRhdGlvbiA9IHJlYWxEaW1zLmggPiByZWFsRGltcy53ID8gJ1BPUlRSQUlUJyA6ICdMQU5EU0NBUEUnO1xuXG4gIGNvbnN0IG5vdGNoT2Zmc2V0ID0gaXNOb3RjaGVkXG4gICAgPyB1dGlsLmNvbXBhcmVWZXJzaW9ucyh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLCAnPScsICcxMy4wJylcbiAgICAgID8gSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xM1xuICAgICAgOiBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TXG4gICAgOiAwO1xuXG4gIGNvbnN0IGlzU2Nyb2xsZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoJ3JldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID4gMCcpO1xuICBpZiAoaXNTY3JvbGxlZCkge1xuICAgIHRvcE9mZnNldCA9IElQSE9ORV9TQ1JPTExFRF9UT1BfQkFSX0hFSUdIVCArIG5vdGNoT2Zmc2V0O1xuXG4gICAgaWYgKGlzTm90Y2hlZCkge1xuICAgICAgdG9wT2Zmc2V0IC09IElQSE9ORV9YX1NDUk9MTEVEX09GRlNFVDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaVBob25lIGlzIGxhbmRzY2FwZSB0aGVuIHRoZXJlIGlzIG5vIHRvcCBiYXJcbiAgICBpZiAob3JpZW50YXRpb24gPT09ICdMQU5EU0NBUEUnICYmIGlzSXBob25lKSB7XG4gICAgICB0b3BPZmZzZXQgPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3BPZmZzZXQgPSBJUEhPTkVfVE9QX0JBUl9IRUlHSFQgKyBub3RjaE9mZnNldDtcblxuICAgIGlmIChpc0lwaG9uZSkge1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnUE9SVFJBSVQnKSB7XG4gICAgICAgIC8vIFRoZSBib3R0b20gYmFyIGlzIG9ubHkgdmlzaWJsZSB3aGVuIHBvcnRyYWl0XG4gICAgICAgIGJvdHRvbU9mZnNldCA9IElQSE9ORV9CT1RUT01fQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcE9mZnNldCA9IElQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyB8fCAhaXNJcGhvbmUpIHtcbiAgICAgIGlmICh0YWJCYXJWaXNpYmlsaXR5ID09PSBWSVNJQkxFKSB7XG4gICAgICAgIHRvcE9mZnNldCArPSBUQUJfQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSBpZiAodGFiQmFyVmlzaWJpbGl0eSA9PT0gREVURUNUKSB7XG4gICAgICAgIC8vIFRhYnMgb25seSBhcHBlYXIgaWYgdGhlIGRldmljZSBpcyBsYW5kc2NhcGUgb3IgaWYgaXQncyBhbiBpUGFkIHNvIHdlIG9ubHkgY2hlY2sgdmlzaWJpbGl0eSBpbiB0aGlzIGNhc2VcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWFjaCB0YWIgYmFyIGlzIGEgV2ViVmlld1xuICAgICAgICBjb25zdCBjb250ZXh0c0FuZFZpZXdzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBjb250ZXh0c0FuZFZpZXdzLmZpbHRlcigoY3R4KSA9PiBjdHguaWQuc3RhcnRzV2l0aCgnV0VCVklFV18nKSk7XG5cbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgJHt0YWJzLmxlbmd0aH0gdGFicy4gQXNzdW1pbmcgdGhlIHRhYiBiYXIgaXMgdmlzaWJsZWApO1xuICAgICAgICAgIHRvcE9mZnNldCArPSBUQUJfQkFSX09GRlNFVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvcE9mZnNldCArPSBhd2FpdCB0aGlzLmdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0KGlzSXBob25lLCBiYW5uZXJWaXNpYmlsaXR5KTtcblxuICB3dlBvcy55ICs9IHRvcE9mZnNldDtcbiAgcmVhbERpbXMuaCAtPSAodG9wT2Zmc2V0ICsgYm90dG9tT2Zmc2V0KTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQgPSBhc3luYyBmdW5jdGlvbiBnZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldCAoaXNJcGhvbmUsIGJhbm5lclZpc2liaWxpdHkpIHtcbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgaWYgKGJhbm5lclZpc2liaWxpdHkgPT09IFZJU0lCTEUpIHtcbiAgICBvZmZzZXQgKz0gaXNJcGhvbmUgP1xuICAgICAgSVBIT05FX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA6XG4gICAgICBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVDtcbiAgfSBlbHNlIGlmIChiYW5uZXJWaXNpYmlsaXR5ID09PSBERVRFQ1QpIHtcbiAgICAvLyB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIFNtYXJ0IEFwcCBCYW5uZXJcbiAgICBjb25zdCBiYW5uZXJzID0gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnQ2xvc2UgYXBwIGRvd25sb2FkIG9mZmVyJywgdHJ1ZSk7XG4gICAgaWYgKGJhbm5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgb2Zmc2V0ICs9IGlzSXBob25lID9cbiAgICAgICAgSVBIT05FX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA6XG4gICAgICAgIElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUO1xuICAgIH1cbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgQWRkaXRpb25hbCBuYXRpdmUgd2ViIHRhcCBvZmZzZXQgY29tcHV0ZWQ6ICR7b2Zmc2V0fWApO1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuYXN5bmMgZnVuY3Rpb24gdGFwV2ViRWxlbWVudE5hdGl2ZWx5IChkcml2ZXIsIGF0b21zRWxlbWVudCkge1xuICAvLyB0cnkgdG8gZ2V0IHRoZSB0ZXh0IG9mIHRoZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGFjY2Vzc2libGUgaW4gdGhlXG4gIC8vIG5hdGl2ZSBjb250ZXh0XG4gIHRyeSB7XG4gICAgbGV0IHRleHQgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGV4dCA9IGF3YWl0IGRyaXZlci5leGVjdXRlQXRvbSgnZ2V0X2F0dHJpYnV0ZV92YWx1ZScsIFthdG9tc0VsZW1lbnQsICd2YWx1ZSddKTtcbiAgICB9XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgZWxzID0gYXdhaXQgZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnYWNjZXNzaWJpbGl0eSBpZCcsIHRleHQsIHRydWUpO1xuICAgICAgaWYgKGVscy5sZW5ndGggPT09IDEgfHwgZWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBlbCA9IGVsc1swXTtcbiAgICAgICAgLy8gdXNlIHRhcCBiZWNhdXNlIG9uIGlPUyAxMS4yIGFuZCBiZWxvdyBgbmF0aXZlQ2xpY2tgIGNyYXNoZXMgV0RBXG4gICAgICAgIGNvbnN0IHJlY3QgPSBhd2FpdCBkcml2ZXIucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke3V0aWwudW53cmFwRWxlbWVudChlbCl9L3JlY3RgLCAnR0VUJyk7XG4gICAgICAgIGlmIChlbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgZWwyID0gZWxzWzFdO1xuICAgICAgICAgIGNvbnN0IHJlY3QyID0gYXdhaXQgZHJpdmVyLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWwyKX0vcmVjdGAsICdHRVQnKTtcblxuICAgICAgICAgIGlmICgocmVjdC54ICE9PSByZWN0Mi54IHx8IHJlY3QueSAhPT0gcmVjdDIueSkgfHxcbiAgICAgICAgICAocmVjdC53aWR0aCAhPT0gcmVjdDIud2lkdGggfHwgcmVjdC5oZWlnaHQgIT09IHJlY3QyLmhlaWdodCkpIHtcbiAgICAgICAgICAgIC8vIFRoZXNlIDIgbmF0aXZlIGVsZW1lbnRzIGFyZSBub3QgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHdlYiBlbGVtZW50XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QueCArIHJlY3Qud2lkdGggLyAyKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHJlY3QueSArIHJlY3QuaGVpZ2h0IC8gMiksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IGRyaXZlci5jbGlja0Nvb3Jkcyhjb29yZHMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGFueSBmYWlsdXJlIHNob3VsZCBmYWxsIHRocm91Z2ggYW5kIHRyaWdnZXIgdGhlIG1vcmUgZWxhYm9yYXRlXG4gICAgLy8gbWV0aG9kIG9mIGNsaWNraW5nXG4gICAgbG9nLndhcm4oYEVycm9yIGF0dGVtcHRpbmcgdG8gY2xpY2s6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHRlbnNpb25zLm5hdGl2ZVdlYlRhcCA9IGFzeW5jIGZ1bmN0aW9uIG5hdGl2ZVdlYlRhcCAoZWwpIHtcbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuXG4gIC8vIGlmIHN0cmljdCBuYXRpdmUgdGFwLCBkbyBub3QgdHJ5IHRvIGRvIGl0IHdpdGggV0RBIGRpcmVjdGx5XG4gIGlmICghKGF3YWl0IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKSkubmF0aXZlV2ViVGFwU3RyaWN0ICYmIGF3YWl0IHRhcFdlYkVsZW1lbnROYXRpdmVseSh0aGlzLCBhdG9tc0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy53YXJuKCdVbmFibGUgdG8gZG8gc2ltcGxlIG5hdGl2ZSB3ZWIgdGFwLiBBdHRlbXB0aW5nIHRvIGNvbnZlcnQgY29vcmRpbmF0ZXMnKTtcblxuICAvLyBgZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzYCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBzb21ldGltZXMsXG4gIC8vIHVubGVzcyB3ZSBwcmUtY2FsbCBib3RoIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWZvcmUgdGhlIGFjdHVhbCBjYWxsc1xuICBhd2FpdCBCLlByb21pc2UuYWxsKFtcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKSxcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSksXG4gIF0pO1xuXG4gIGNvbnN0IFtzaXplLCBjb29yZGluYXRlc10gPSBhd2FpdCBCLlByb21pc2UuYWxsKFtcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKSxcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSksXG4gIF0pO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBzaXplO1xuICBsZXQge3gsIHl9ID0gY29vcmRpbmF0ZXM7XG4gIHggKz0gd2lkdGggLyAyO1xuICB5ICs9IGhlaWdodCAvIDI7XG5cbiAgdGhpcy5jdXJXZWJDb29yZHMgPSB7eCwgeX07XG4gIGF3YWl0IHRoaXMuY2xpY2tXZWJDb29yZHMoKTtcbn07XG5cbmV4dGVuc2lvbnMuY2xpY2tDb29yZHMgPSBhc3luYyBmdW5jdGlvbiBjbGlja0Nvb3JkcyAoY29vcmRzKSB7XG4gIGF3YWl0IHRoaXMucGVyZm9ybVRvdWNoKFtcbiAgICB7XG4gICAgICBhY3Rpb246ICd0YXAnLFxuICAgICAgb3B0aW9uczogY29vcmRzLFxuICAgIH0sXG4gIF0pO1xufTtcblxuZXh0ZW5zaW9ucy50cmFuc2xhdGVXZWJDb29yZHMgPSBhc3luYyBmdW5jdGlvbiB0cmFuc2xhdGVXZWJDb29yZHMgKGNvb3Jkcykge1xuICBsb2cuZGVidWcoYFRyYW5zbGF0aW5nIGNvb3JkaW5hdGVzICgke0pTT04uc3RyaW5naWZ5KGNvb3Jkcyl9KSB0byB3ZWIgY29vcmRpbmF0ZXNgKTtcblxuICAvLyBhYnNvbHV0aXplIHdlYiBjb29yZHNcbiAgbGV0IHdlYnZpZXc7XG4gIHRyeSB7XG4gICAgd2VidmlldyA9IGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVXZWJWaWV3JywgZmFsc2UpKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuXG4gIGlmICghd2Vidmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gV2ViVmlldyBmb3VuZC4gVW5hYmxlIHRvIHRyYW5zbGF0ZSB3ZWIgY29vcmRpbmF0ZXMgZm9yIG5hdGl2ZSB3ZWIgdGFwLmApO1xuICB9XG5cbiAgd2VidmlldyA9IHV0aWwudW53cmFwRWxlbWVudCh3ZWJ2aWV3KTtcblxuICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7d2Vidmlld30vcmVjdGAsICdHRVQnKTtcbiAgY29uc3Qgd3ZQb3MgPSB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xuICBjb25zdCByZWFsRGltcyA9IHt3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodH07XG5cbiAgY29uc3QgY21kID0gJyhmdW5jdGlvbiAoKSB7IHJldHVybiB7dzogd2luZG93LmlubmVyV2lkdGgsIGg6IHdpbmRvdy5pbm5lckhlaWdodH07IH0pKCknO1xuICBjb25zdCB3dkRpbXMgPSBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlKGNtZCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiBpbXBsaWNpdCB3YWl0LCBhbmQgc2V0IGxvY2FsbHkgdG8gMFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTQ5ODhcbiAgY29uc3QgaW1wbGljaXRXYWl0TXMgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICBhd2FpdCB0aGlzLnNldEltcGxpY2l0V2FpdCgwKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0KHd2UG9zLCByZWFsRGltcyk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdGhpcy5zZXRJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMpO1xuICB9XG5cbiAgaWYgKHd2RGltcyAmJiByZWFsRGltcyAmJiB3dlBvcykge1xuICAgIGxldCB4UmF0aW8gPSByZWFsRGltcy53IC8gd3ZEaW1zLnc7XG4gICAgbGV0IHlSYXRpbyA9IHJlYWxEaW1zLmggLyB3dkRpbXMuaDtcbiAgICBsZXQgbmV3Q29vcmRzID0ge1xuICAgICAgeDogd3ZQb3MueCArIE1hdGgucm91bmQoeFJhdGlvICogY29vcmRzLngpLFxuICAgICAgeTogd3ZQb3MueSArIE1hdGgucm91bmQoeVJhdGlvICogY29vcmRzLnkpLFxuICAgIH07XG5cbiAgICAvLyBhZGRpdGlvbmFsIGxvZ2dpbmcgZm9yIGNvb3JkaW5hdGVzLCBzaW5jZSBpdCBpcyBzb21ldGltZXMgYnJva2VuXG4gICAgLy8gICBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzkxNTlcbiAgICBsb2cuZGVidWcoYENvbnZlcnRlZCBjb29yZGluYXRlczogJHtKU09OLnN0cmluZ2lmeShuZXdDb29yZHMpfWApO1xuICAgIGxvZy5kZWJ1ZyhgICAgIHJlY3Q6ICR7SlNPTi5zdHJpbmdpZnkocmVjdCl9YCk7XG4gICAgbG9nLmRlYnVnKGAgICAgd3ZQb3M6ICR7SlNPTi5zdHJpbmdpZnkod3ZQb3MpfWApO1xuICAgIGxvZy5kZWJ1ZyhgICAgIHJlYWxEaW1zOiAke0pTT04uc3RyaW5naWZ5KHJlYWxEaW1zKX1gKTtcbiAgICBsb2cuZGVidWcoYCAgICB3dkRpbXM6ICR7SlNPTi5zdHJpbmdpZnkod3ZEaW1zKX1gKTtcbiAgICBsb2cuZGVidWcoYCAgICB4UmF0aW86ICR7SlNPTi5zdHJpbmdpZnkoeFJhdGlvKX1gKTtcbiAgICBsb2cuZGVidWcoYCAgICB5UmF0aW86ICR7SlNPTi5zdHJpbmdpZnkoeVJhdGlvKX1gKTtcblxuICAgIGxvZy5kZWJ1ZyhgQ29udmVydGVkIHdlYiBjb29yZHMgJHtKU09OLnN0cmluZ2lmeShjb29yZHMpfSBgICtcbiAgICAgICAgICAgICAgYGludG8gcmVhbCBjb29yZHMgJHtKU09OLnN0cmluZ2lmeShuZXdDb29yZHMpfWApO1xuICAgIHJldHVybiBuZXdDb29yZHM7XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuY2hlY2tGb3JBbGVydCA9IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRm9yQWxlcnQgKCkge1xuICByZXR1cm4gXy5pc1N0cmluZyhhd2FpdCB0aGlzLmdldEFsZXJ0VGV4dCgpKTtcbn07XG5cbmV4dGVuc2lvbnMud2FpdEZvckF0b20gPSBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXRvbSAocHJvbWlzZSkge1xuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuXG4gIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGFsZXJ0IHdoaWxlIHRoZSBhdG9tIGlzIGJlaW5nIGV4ZWN1dGVkLlxuICAvLyBzbyBub3RpZnkgb3Vyc2VsdmVzIHdoZW4gaXQgaGFwcGVuc1xuICBjb25zdCB0aW1lZEF0b21Qcm9taXNlID0gQi5yZXNvbHZlKHByb21pc2UpLnRpbWVvdXQoQVRPTV9XQUlUX1RJTUVPVVRfTVMpO1xuICBjb25zdCBoYW5kbGVQcm9taXNlRXJyb3IgPSBhc3luYyAocCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSAoZXJyIGluc3RhbmNlb2YgQi5BZ2dyZWdhdGVFcnJvcikgPyBlcnJbMF0gOiBlcnI7XG4gICAgICBsb2cuZGVidWcoYEVycm9yIHJlY2VpdmVkIHdoaWxlIGV4ZWN1dGluZyBhdG9tOiAke29yaWdpbmFsRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIGlmIChvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgQi5UaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGdldCBhbnkgcmVzcG9uc2UgZm9yIGF0b20gZXhlY3V0aW9uIGFmdGVyIGAgK1xuICAgICAgICAgIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgfVxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG4gIC8vIGlmIHRoZSBhdG9tIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGhpbiBBVE9NX0lOSVRJQUxfV0FJVF9NU1xuICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGFuIGFsZXJ0IHByZXNlbmNlXG4gIGF3YWl0IGhhbmRsZVByb21pc2VFcnJvcihCLmFueShbQi5kZWxheShBVE9NX0lOSVRJQUxfV0FJVF9NUyksIHRpbWVkQXRvbVByb21pc2VdKSk7XG4gIGlmICh0aW1lZEF0b21Qcm9taXNlLmlzRnVsZmlsbGVkKCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGltZWRBdG9tUHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLm90aGVyd2lzZSBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gdW5leHBlY3RlZCBhbGVydCBjb3ZlcmluZyB0aGUgZWxlbWVudFxuICBpZiAoIV8uaXNQbGFpbk9iamVjdCh0aGlzLl93YWl0aW5nQXRvbXMpKSB7XG4gICAgdGhpcy5fd2FpdGluZ0F0b21zID0ge1xuICAgICAgY291bnQ6IDAsXG4gICAgICBhbGVydE5vdGlmaWVyOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICBhbGVydE1vbml0b3I6IEIucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbiAgdGhpcy5fd2FpdGluZ0F0b21zLmNvdW50Kys7XG5cbiAgbGV0IG9uQWxlcnRDYWxsYmFjaztcbiAgdHJ5IHtcbiAgICAvLyBvbmx5IHJlc3RhcnQgdGhlIG1vbml0b3IgaWYgaXQgaXMgbm90IHJ1bm5pbmcgYWxyZWFkeVxuICAgIGlmICh0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnRNb25pdG9yLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0TW9uaXRvciA9IEIucmVzb2x2ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAodGhpcy5fd2FpdGluZ0F0b21zLmNvdW50ID4gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0ZvckFsZXJ0KCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIuZW1pdChPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICAgIGF3YWl0IEIuZGVsYXkoQVRPTV9JTklUSUFMX1dBSVRfTVMgLyAyKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG9uQWxlcnRDYWxsYmFjayA9ICgpID0+IHJlamVjdChuZXcgZXJyb3JzLlVuZXhwZWN0ZWRBbGVydE9wZW5FcnJvcigpKTtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLm9uY2UoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQsIG9uQWxlcnRDYWxsYmFjayk7XG4gICAgICBoYW5kbGVQcm9taXNlRXJyb3IodGltZWRBdG9tUHJvbWlzZSlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9uQWxlcnRDYWxsYmFjaykge1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIucmVtb3ZlTGlzdGVuZXIoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQsIG9uQWxlcnRDYWxsYmFjayk7XG4gICAgfVxuICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudC0tO1xuICB9XG59O1xuXG5leHRlbnNpb25zLm1vYmlsZVdlYk5hdiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVdlYk5hdiAobmF2VHlwZSkge1xuICB0aGlzLnJlbW90ZS5hbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtgaGlzdG9yeS4ke25hdlR5cGV9KCk7YCwgbnVsbF0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucmVtb3RlLmFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQgPSBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihjb21tYW5kcywgZXh0ZW5zaW9ucywgaGVscGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvd2ViLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
739
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy93ZWIuanMiXSwibmFtZXMiOlsiSVBIT05FX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX1NDUk9MTEVEX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX1hfU0NST0xMRURfT0ZGU0VUIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPUyIsIklQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTMiLCJJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUIiwiSVBIT05FX0JPVFRPTV9CQVJfT0ZGU0VUIiwiVEFCX0JBUl9PRkZTRVQiLCJJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIiwiSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJOT1RDSEVEX0RFVklDRV9TSVpFUyIsInciLCJoIiwiVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIiLCJ1dGlsIiwiQVRPTV9XQUlUX1RJTUVPVVRfTVMiLCJBVE9NX0lOSVRJQUxfV0FJVF9NUyIsIk9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UIiwiVklTSUJMRSIsIklOVklTSUJMRSIsIkRFVEVDVCIsIlZJU0lCSUxJVElFUyIsIlRBQl9CQVJfUE9TSVRJT05fVE9QIiwiVEFCX0JBUl9QT1NJVElPTl9CT1RUT00iLCJUQUJfQkFSX1BPU1NJVElPTlMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyIiwiaWQiLCJfIiwiaXNTdHJpbmciLCJpc051bWJlciIsImlzRW1wdHkiLCJpc05hTiIsInNldEZyYW1lIiwiZnJhbWUiLCJpc1dlYkNvbnRleHQiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiaXNOdWxsIiwiY3VyV2ViRnJhbWVzIiwibG9nIiwiZGVidWciLCJoYXNFbGVtZW50SWQiLCJhdG9tc0VsZW1lbnQiLCJnZXRBdG9tc0VsZW1lbnQiLCJ2YWx1ZSIsImV4ZWN1dGVBdG9tIiwiV0lORE9XIiwidW5zaGlmdCIsImF0b20iLCJpc1VuZGVmaW5lZCIsIk5vU3VjaEZyYW1lRXJyb3IiLCJnZXRDc3NQcm9wZXJ0eSIsInByb3BlcnR5TmFtZSIsImVsIiwic3VibWl0IiwicmVmcmVzaCIsImdldFVybCIsInJlbW90ZSIsImV4ZWN1dGUiLCJ0aXRsZSIsImdldENvb2tpZXMiLCJzY3JpcHQiLCJqc0Nvb2tpZXMiLCJjb29raWVzIiwibmFtZSIsInRvUGFpcnMiLCJjb29raWVVdGlscyIsImNyZWF0ZUpXUENvb2tpZSIsInVuZGVmaW5lZCIsInB1c2giLCJlcnIiLCJlcnJvciIsIlVua25vd25FcnJvciIsInNldENvb2tpZSIsImNvb2tpZSIsImNsb25lIiwicGF0aCIsImpzQ29va2llIiwiY3JlYXRlSlNDb29raWUiLCJleHBpcmVzIiwiZXhwaXJ5IiwiRGF0ZSIsInRvVVRDU3RyaW5nIiwiZG9tYWluIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGVsZXRlQ29va2llIiwiY29va2llTmFtZSIsImluZGV4T2YiLCJtYXAiLCJfZGVsZXRlQ29va2llIiwiZGVsZXRlQ29va2llcyIsImxlbmd0aCIsIndlYkNvb2tpZSIsImV4cGlyZUNvb2tpZSIsImNhY2hlV2ViRWxlbWVudCIsImlzUGxhaW5PYmplY3QiLCJlbElkIiwidW53cmFwRWxlbWVudCIsImNhY2hlSWQiLCJpbmNsdWRlcyIsInV1aWRWNCIsIndlYkVsZW1lbnRzQ2FjaGUiLCJzZXQiLCJ3cmFwRWxlbWVudCIsImNhY2hlV2ViRWxlbWVudHMiLCJyZXNwb25zZSIsInRvQ2FjaGVkIiwidiIsImlzQXJyYXkiLCJyZXN1bHQiLCJyZWR1Y2UiLCJhY2MiLCJrZXkiLCJmaW5kV2ViRWxlbWVudE9yRWxlbWVudHMiLCJzdHJhdGVneSIsInNlbGVjdG9yIiwibWFueSIsImN0eCIsImNvbnRleHRFbGVtZW50IiwiaXNOaWwiLCJlbGVtZW50IiwiZG9GaW5kIiwiaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uIiwibWVzc2FnZSIsImlzRnVuY3Rpb24iLCJtYXRjaCIsIk5vU3VjaEVsZW1lbnRFcnJvciIsImNsaWNrV2ViQ29vcmRzIiwiY29vcmRzIiwidHJhbnNsYXRlV2ViQ29vcmRzIiwiY3VyV2ViQ29vcmRzIiwiY2xpY2tDb29yZHMiLCJhcmdzIiwiYWx3YXlzRGVmYXVsdEZyYW1lIiwiZnJhbWVzIiwicHJvbWlzZSIsIndhaXRGb3JBdG9tIiwiZXhlY3V0ZUF0b21Bc3luYyIsInJlc3BvbnNlVXJsIiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJhc3luY1Byb21pc2UiLCJlbE9ySWQiLCJoYXMiLCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvciIsIkVMRU1FTlQiLCJnZXQiLCJjb252ZXJ0RWxlbWVudHNGb3JBdG9tcyIsImFyZyIsImdldEVsZW1lbnRJZCIsImhhc1ZhbHVlIiwiZ2V0U2FmYXJpSXNJcGhvbmUiLCJtZW1vaXplIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJ3YXJuIiwiZ2V0U2FmYXJpRGV2aWNlU2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwibm9ybUhlaWdodCIsIm5vcm1XaWR0aCIsImdldFNhZmFyaUlzTm90Y2hlZCIsImRldmljZSIsImdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0Iiwid3ZQb3MiLCJyZWFsRGltcyIsInRvcE9mZnNldCIsImJvdHRvbU9mZnNldCIsImlzSXBob25lIiwibmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSIsIm5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSIsInNhZmFyaVRhYkJhclBvc2l0aW9uIiwiY29tcGFyZVZlcnNpb25zIiwib3B0cyIsInBsYXRmb3JtVmVyc2lvbiIsInNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJ0YWJCYXJWaXNpYmlsaXR5IiwibG93ZXJDYXNlIiwiYmFubmVyVmlzaWJpbGl0eSIsInRhYkJhclBvc2l0aW9uIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpc05vdGNoZWQiLCJvcmllbnRhdGlvbiIsIm5vdGNoT2Zmc2V0IiwiaXNTY3JvbGxlZCIsImNvbnRleHRzQW5kVmlld3MiLCJnZXRDb250ZXh0c0FuZFZpZXdzIiwidGFicyIsImZpbHRlciIsInN0YXJ0c1dpdGgiLCJnZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldCIsInkiLCJvZmZzZXQiLCJiYW5uZXJzIiwiZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzIiwidGFwV2ViRWxlbWVudE5hdGl2ZWx5IiwiZHJpdmVyIiwidGV4dCIsImVscyIsInJlY3QiLCJwcm94eUNvbW1hbmQiLCJlbDIiLCJyZWN0MiIsIngiLCJNYXRoIiwicm91bmQiLCJuYXRpdmVXZWJUYXAiLCJuYXRpdmVXZWJUYXBTdHJpY3QiLCJQcm9taXNlIiwiYWxsIiwic2l6ZSIsImNvb3JkaW5hdGVzIiwicGVyZm9ybVRvdWNoIiwiYWN0aW9uIiwib3B0aW9ucyIsIndlYnZpZXciLCJpZ24iLCJFcnJvciIsImNtZCIsInd2RGltcyIsImltcGxpY2l0V2FpdE1zIiwic2V0SW1wbGljaXRXYWl0IiwieFJhdGlvIiwieVJhdGlvIiwibmV3Q29vcmRzIiwiY2hlY2tGb3JBbGVydCIsImdldEFsZXJ0VGV4dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInRpbWVkQXRvbVByb21pc2UiLCJ0aW1lb3V0IiwiaGFuZGxlUHJvbWlzZUVycm9yIiwicCIsIm9yaWdpbmFsRXJyb3IiLCJBZ2dyZWdhdGVFcnJvciIsIlRpbWVvdXRFcnJvciIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiYW55IiwiZGVsYXkiLCJpc0Z1bGZpbGxlZCIsIl93YWl0aW5nQXRvbXMiLCJjb3VudCIsImFsZXJ0Tm90aWZpZXIiLCJFdmVudEVtaXR0ZXIiLCJhbGVydE1vbml0b3IiLCJvbkFsZXJ0Q2FsbGJhY2siLCJpc1Jlc29sdmVkIiwiZW1pdCIsIlVuZXhwZWN0ZWRBbGVydE9wZW5FcnJvciIsIm9uY2UiLCJ0aGVuIiwiY2F0Y2giLCJyZW1vdmVMaXN0ZW5lciIsIm1vYmlsZVdlYk5hdiIsIm5hdlR5cGUiLCJhbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHFCQUFxQixHQUFHLEVBQTlCO0FBQ0EsTUFBTUMsOEJBQThCLEdBQUcsRUFBdkM7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxFQUFqQztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLEVBQWxDO0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsRUFBckM7QUFFQSxNQUFNQywrQkFBK0IsR0FBRyxFQUF4QztBQUNBLE1BQU1DLHdCQUF3QixHQUFHLEVBQWpDO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEVBQXZCO0FBQ0EsTUFBTUMsd0NBQXdDLEdBQUcsRUFBakQ7QUFDQSxNQUFNQyxzQ0FBc0MsR0FBRyxFQUEvQztBQUVBLE1BQU1DLG9CQUFvQixHQUFHLENBQzNCO0FBQUNDLEVBQUFBLENBQUMsRUFBRSxJQUFKO0FBQVVDLEVBQUFBLENBQUMsRUFBRTtBQUFiLENBRDJCLEVBRTNCO0FBQUNELEVBQUFBLENBQUMsRUFBRSxHQUFKO0FBQVNDLEVBQUFBLENBQUMsRUFBRTtBQUFaLENBRjJCLEVBRzNCO0FBQUNELEVBQUFBLENBQUMsRUFBRSxJQUFKO0FBQVVDLEVBQUFBLENBQUMsRUFBRTtBQUFiLENBSDJCLENBQTdCO0FBTUEsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQWlDQyxtQkFBdkM7QUFFQSxNQUFNQyxvQkFBb0IsR0FBRyxJQUFJLEtBQWpDO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsSUFBN0I7QUFFQSxNQUFNQywwQkFBMEIsR0FBRyxPQUFuQztBQUVBLE1BQU1DLE9BQU8sR0FBRyxTQUFoQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxXQUFsQjtBQUNBLE1BQU1DLE1BQU0sR0FBRyxRQUFmO0FBQ0EsTUFBTUMsWUFBWSxHQUFH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QVUwTixPQUFRLEtBQXBCLEVBQTBCLElBQTFCLENBQW5DLENBQU47QUFDRCxHQUZELFNBRVU7QUFDUixTQUFLOU0sTUFBTCxDQUFZK00sNEJBQVosR0FBMkMsS0FBM0M7QUFDRDtBQUNGLENBUEQ7O0FBU0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjcFAsUUFBZCxFQUF3QkUsVUFBeEIsRUFBb0NELE9BQXBDO2VBRWVELFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCwgdGltaW5nIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IGNvb2tpZVV0aWxzIGZyb20gJy4uL2Nvb2tpZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgSVBIT05FX1RPUF9CQVJfSEVJR0hUID0gNzE7XG5jb25zdCBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgPSA0MTtcbmNvbnN0IElQSE9ORV9YX1NDUk9MTEVEX09GRlNFVCA9IDU1O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPUyA9IDI0O1xuY29uc3QgSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyA9IDIwO1xuXG5jb25zdCBJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUID0gNTE7XG5jb25zdCBJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQgPSA0OTtcbmNvbnN0IFRBQl9CQVJfT0ZGU0VUID0gMzM7XG5jb25zdCBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUID0gODQ7XG5jb25zdCBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCA9IDk1O1xuXG5jb25zdCBOT1RDSEVEX0RFVklDRV9TSVpFUyA9IFtcbiAge3c6IDExMjUsIGg6IDI0MzZ9LCAvLyAxMSBQcm8sIFgsIFhzXG4gIHt3OiA4MjgsIGg6IDE3OTJ9LCAvLyAxMSwgWHJcbiAge3c6IDEyNDIsIGg6IDI2ODh9LCAvLyAxMSBQcm8gTWF4LCBYcyBNYXhcbl07XG5cbmNvbnN0IHsgVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIgfSA9IHV0aWw7XG5cbmNvbnN0IEFUT01fV0FJVF9USU1FT1VUX01TID0gMiAqIDYwMDAwO1xuY29uc3QgQVRPTV9JTklUSUFMX1dBSVRfTVMgPSAxMDAwO1xuXG5jb25zdCBPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCA9ICdhbGVydCc7XG5cbmNvbnN0IFZJU0lCTEUgPSAndmlzaWJsZSc7XG5jb25zdCBJTlZJU0lCTEUgPSAnaW52aXNpYmxlJztcbmNvbnN0IERFVEVDVCA9ICdkZXRlY3QnO1xuY29uc3QgVklTSUJJTElUSUVTID0gW1ZJU0lCTEUsIElOVklTSUJMRSwgREVURUNUXTtcblxuLy8gVGhlIHBvc2l0aW9uIG9mIFNhZmFyaSdzIHRhYiAoc2VhcmNoIGJhcikuXG4vLyBTaW5jZSBpT1MgMTUsIHRoZSBiYXIgaXMgdGhlIGJvdHRvbSBieSBkZWZhdWx0LlxuY29uc3QgVEFCX0JBUl9QT1NJVElPTl9UT1AgPSAndG9wJztcbmNvbnN0IFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NID0gJ2JvdHRvbSc7XG5jb25zdCBUQUJfQkFSX1BPU1NJVElPTlMgPSBbVEFCX0JBUl9QT1NJVElPTl9UT1AsIFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NXTtcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50SWRlbnRpZmllciAoaWQpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGlkKSAmJiAhXy5pc051bWJlcihpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKF8uaXNTdHJpbmcoaWQpICYmIF8uaXNFbXB0eShpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKF8uaXNOdW1iZXIoaWQpICYmIGlzTmFOKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29tbWFuZHMuc2V0RnJhbWUgPSBhc3luYyBmdW5jdGlvbiBzZXRGcmFtZSAoZnJhbWUpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBpZiAoXy5pc051bGwoZnJhbWUpKSB7XG4gICAgdGhpcy5jdXJXZWJGcmFtZXMgPSBbXTtcbiAgICBsb2cuZGVidWcoJ0xlYXZpbmcgd2ViIGZyYW1lIGFuZCBnb2luZyBiYWNrIHRvIGRlZmF1bHQgY29udGVudCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoZWxwZXJzLmhhc0VsZW1lbnRJZChmcmFtZSkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChmcmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfZnJhbWVfd2luZG93JywgW2F0b21zRWxlbWVudF0pO1xuICAgIGxvZy5kZWJ1ZyhgRW50ZXJpbmcgbmV3IHdlYiBmcmFtZTogJyR7dmFsdWUuV0lORE9XfSdgKTtcbiAgICB0aGlzLmN1cldlYkZyYW1lcy51bnNoaWZ0KHZhbHVlLldJTkRPVyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXRvbSA9IF8uaXNOdW1iZXIoZnJhbWUpID8gJ2ZyYW1lX2J5X2luZGV4JyA6ICdmcmFtZV9ieV9pZF9vcl9uYW1lJztcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oYXRvbSwgW2ZyYW1lXSk7XG4gICAgaWYgKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzVW5kZWZpbmVkKHZhbHVlLldJTkRPVykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRnJhbWVFcnJvcigpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEVudGVyaW5nIG5ldyB3ZWIgZnJhbWU6ICcke3ZhbHVlLldJTkRPV30nYCk7XG4gICAgdGhpcy5jdXJXZWJGcmFtZXMudW5zaGlmdCh2YWx1ZS5XSU5ET1cpO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRDc3NQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldENzc1Byb3BlcnR5IChwcm9wZXJ0eU5hbWUsIGVsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3ZhbHVlX29mX2Nzc19wcm9wZXJ0eScsIFthdG9tc0VsZW1lbnQsIHByb3BlcnR5TmFtZV0pO1xufTtcblxuY29tbWFuZHMuc3VibWl0ID0gYXN5bmMgZnVuY3Rpb24gc3VibWl0IChlbCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnc3VibWl0JywgW2F0b21zRWxlbWVudF0pO1xufTtcblxuY29tbWFuZHMucmVmcmVzaCA9IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2ggKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ3JlZnJlc2gnLCBbXSk7XG59O1xuXG5jb21tYW5kcy5nZXRVcmwgPSBhc3luYyBmdW5jdGlvbiBnZXRVcmwgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlKCd3aW5kb3cubG9jYXRpb24uaHJlZicpO1xufTtcblxuY29tbWFuZHMudGl0bGUgPSBhc3luYyBmdW5jdGlvbiB0aXRsZSAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ3RpdGxlJywgW10sIHRydWUpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29va2llcyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvb2tpZXMgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBhbGwgY29va2llcycpO1xuXG4gIGxldCBzY3JpcHQgPSAncmV0dXJuIGRvY3VtZW50LmNvb2tpZSc7XG4gIGxldCBqc0Nvb2tpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtzY3JpcHQsIFtdXSk7XG5cbiAgbGV0IGNvb2tpZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjb29raWVVdGlscy5jcmVhdGVKV1BDb29raWUodW5kZWZpbmVkLCBqc0Nvb2tpZXMpKSkge1xuICAgICAgY29va2llcy5wdXNoKHtuYW1lLCB2YWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gY29va2llcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKGVycik7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIHBhcnNpbmcgY29va2llcyBmcm9tIHJlc3VsdDogJyR7anNDb29raWVzfSdgKTtcbiAgfVxufTtcblxuY29tbWFuZHMuc2V0Q29va2llID0gYXN5bmMgZnVuY3Rpb24gc2V0Q29va2llIChjb29raWUpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb29raWUgPSBfLmNsb25lKGNvb2tpZSk7XG5cbiAgLy8gaWYgYHBhdGhgIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQsIFNhZmFyaSB3aWxsIG5vdCB1cGRhdGUgY29va2llcyBhcyBleHBlY3RlZDsgZWcgaXNzdWUgIzE3MDhcbiAgaWYgKCFjb29raWUucGF0aCkge1xuICAgIGNvb2tpZS5wYXRoID0gJy8nO1xuICB9XG5cbiAgY29uc3QganNDb29raWUgPSBjb29raWVVdGlscy5jcmVhdGVKU0Nvb2tpZShjb29raWUubmFtZSwgY29va2llLnZhbHVlLCB7XG4gICAgZXhwaXJlczogXy5pc051bWJlcihjb29raWUuZXhwaXJ5KSA/IChuZXcgRGF0ZShjb29raWUuZXhwaXJ5ICogMTAwMCkpLnRvVVRDU3RyaW5nKCkgOlxuICAgICAgY29va2llLmV4cGlyeSxcbiAgICBwYXRoOiBjb29raWUucGF0aCxcbiAgICBkb21haW46IGNvb2tpZS5kb21haW4sXG4gICAgaHR0cE9ubHk6IGNvb2tpZS5odHRwT25seSxcbiAgICBzZWN1cmU6IGNvb2tpZS5zZWN1cmVcbiAgfSk7XG4gIGxldCBzY3JpcHQgPSBgZG9jdW1lbnQuY29va2llID0gJHtKU09OLnN0cmluZ2lmeShqc0Nvb2tpZSl9YDtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xufTtcblxuY29tbWFuZHMuZGVsZXRlQ29va2llID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29va2llIChjb29raWVOYW1lKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLy8gY2hlY2sgY29va2llIGV4aXN0ZW5jZVxuICBsZXQgY29va2llcyA9IGF3YWl0IHRoaXMuZ2V0Q29va2llcygpO1xuICBpZiAoXy5pbmRleE9mKF8ubWFwKGNvb2tpZXMsICduYW1lJyksIGNvb2tpZU5hbWUpID09PSAtMSkge1xuICAgIGxvZy5kZWJ1ZyhgQ29va2llICcke2Nvb2tpZU5hbWV9JyBub3QgZm91bmQuIElnbm9yaW5nLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuX2RlbGV0ZUNvb2tpZShjb29raWVOYW1lKTtcbn07XG5cbmNvbW1hbmRzLmRlbGV0ZUNvb2tpZXMgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVDb29raWVzICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBsZXQgY29va2llcyA9IGF3YWl0IHRoaXMuZ2V0Q29va2llcygpO1xuICBpZiAoY29va2llcy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgYXdhaXQgdGhpcy5fZGVsZXRlQ29va2llKGNvb2tpZS5uYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5oZWxwZXJzLl9kZWxldGVDb29raWUgPSBhc3luYyBmdW5jdGlvbiBfZGVsZXRlQ29va2llIChjb29raWVOYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgRGVsZXRpbmcgY29va2llICcke2Nvb2tpZU5hbWV9J2ApO1xuICBsZXQgd2ViQ29va2llID0gY29va2llVXRpbHMuZXhwaXJlQ29va2llKGNvb2tpZU5hbWUsIHtwYXRoOiAnLyd9KTtcbiAgbGV0IHNjcmlwdCA9IGBkb2N1bWVudC5jb29raWUgPSAke0pTT04uc3RyaW5naWZ5KHdlYkNvb2tpZSl9YDtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xufTtcblxuaGVscGVycy5jYWNoZVdlYkVsZW1lbnQgPSBmdW5jdGlvbiBjYWNoZVdlYkVsZW1lbnQgKGVsKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuICBjb25zdCBlbElkID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIoZWxJZCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgLy8gSW4gbmV3ZXIgZGVidWdnZXIgcmVsZWFzZXMgZWxlbWVudCBpZGVudGlmaWVycyBsb29rIGxpa2UgYDp3ZGM6MTYyODE1MTY0OTMyNWBcbiAgLy8gV2UgYXNzdW1lIGl0IGlzIHNhZmUgdG8gdXNlIHRoZXNlIHRvIGlkZW50aWZ5IGNhY2hlZCBlbGVtZW50c1xuICBjb25zdCBjYWNoZUlkID0gXy5pbmNsdWRlcyhlbElkLCAnOicpID8gZWxJZCA6IHV0aWwudXVpZFY0KCk7XG4gIHRoaXMud2ViRWxlbWVudHNDYWNoZS5zZXQoY2FjaGVJZCwgZWxJZCk7XG4gIHJldHVybiB1dGlsLndyYXBFbGVtZW50KGNhY2hlSWQpO1xufTtcblxuaGVscGVycy5jYWNoZVdlYkVsZW1lbnRzID0gZnVuY3Rpb24gY2FjaGVXZWJFbGVtZW50cyAocmVzcG9uc2UpIHtcbiAgY29uc3QgdG9DYWNoZWQgPSAodikgPT4gXy5pc0FycmF5KHYpIHx8IF8uaXNQbGFpbk9iamVjdCh2KVxuICAgID8gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKHYpXG4gICAgOiB2O1xuXG4gIGlmIChfLmlzQXJyYXkocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLm1hcCh0b0NhY2hlZCk7XG4gIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsuLi5yZXNwb25zZSwgLi4uKHRoaXMuY2FjaGVXZWJFbGVtZW50KHJlc3BvbnNlKSl9O1xuICAgIHJldHVybiBfLnRvUGFpcnMocmVzdWx0KS5yZWR1Y2UoXG4gICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSB0b0NhY2hlZCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcblxuZXh0ZW5zaW9ucy5maW5kV2ViRWxlbWVudE9yRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiBmaW5kV2ViRWxlbWVudE9yRWxlbWVudHMgKHN0cmF0ZWd5LCBzZWxlY3RvciwgbWFueSwgY3R4KSB7XG4gIGNvbnN0IGNvbnRleHRFbGVtZW50ID0gXy5pc05pbChjdHgpID8gbnVsbCA6IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGN0eCk7XG4gIGxldCBlbGVtZW50O1xuICBsZXQgZG9GaW5kID0gYXN5bmMgKCkgPT4ge1xuICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKGBmaW5kX2VsZW1lbnQke21hbnkgPyAncycgOiAnJ31gLCBbc3RyYXRlZ3ksIHNlbGVjdG9yLCBjb250ZXh0RWxlbWVudF0pO1xuICAgIHJldHVybiAhXy5pc051bGwoZWxlbWVudCk7XG4gIH07XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5pbXBsaWNpdFdhaXRGb3JDb25kaXRpb24oZG9GaW5kKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5tZXNzYWdlICYmIF8uaXNGdW5jdGlvbihlcnIubWVzc2FnZS5tYXRjaCkgJiYgZXJyLm1lc3NhZ2UubWF0Y2goL0NvbmRpdGlvbiB1bm1ldC8pKSB7XG4gICAgICAvLyBjb25kaXRpb24gd2FzIG5vdCBtZXQgc2V0dGluZyByZXMgdG8gZW1wdHkgYXJyYXlcbiAgICAgIGVsZW1lbnQgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhlbGVtZW50KTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KGVsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKGVsZW1lbnQpO1xufTtcblxuZXh0ZW5zaW9ucy5jbGlja1dlYkNvb3JkcyA9IGFzeW5jIGZ1bmN0aW9uIGNsaWNrV2ViQ29vcmRzICgpIHtcbiAgbGV0IGNvb3JkcyA9IGF3YWl0IHRoaXMudHJhbnNsYXRlV2ViQ29vcmRzKHRoaXMuY3VyV2ViQ29vcmRzKTtcbiAgYXdhaXQgdGhpcy5jbGlja0Nvb3Jkcyhjb29yZHMpO1xufTtcblxuaGVscGVycy5leGVjdXRlQXRvbSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tIChhdG9tLCBhcmdzLCBhbHdheXNEZWZhdWx0RnJhbWUgPSBmYWxzZSkge1xuICBsZXQgZnJhbWVzID0gYWx3YXlzRGVmYXVsdEZyYW1lID09PSB0cnVlID8gW10gOiB0aGlzLmN1cldlYkZyYW1lcztcbiAgbGV0IHByb21pc2UgPSB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbShhdG9tLCBhcmdzLCBmcmFtZXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy53YWl0Rm9yQXRvbShwcm9taXNlKTtcbn07XG5cbmhlbHBlcnMuZXhlY3V0ZUF0b21Bc3luYyA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tQXN5bmMgKGF0b20sIGFyZ3MsIHJlc3BvbnNlVXJsKSB7XG4gIC8vIHNhdmUgdGhlIHJlc29sdmUgYW5kIHJlamVjdCBtZXRob2RzIG9mIHRoZSBwcm9taXNlIHRvIGJlIHdhaXRlZCBmb3JcbiAgbGV0IHByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5hc3luY1Byb21pc2UgPSB7cmVzb2x2ZSwgcmVqZWN0fTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMucmVtb3RlLmV4ZWN1dGVBdG9tQXN5bmMoYXRvbSwgYXJncywgdGhpcy5jdXJXZWJGcmFtZXMsIHJlc3BvbnNlVXJsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSk7XG59O1xuXG5oZWxwZXJzLmdldEF0b21zRWxlbWVudCA9IGZ1bmN0aW9uIGdldEF0b21zRWxlbWVudCAoZWxPcklkKSB7XG4gIGNvbnN0IGVsSWQgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWxPcklkKTtcbiAgaWYgKCF0aGlzLndlYkVsZW1lbnRzQ2FjaGUuaGFzKGVsSWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcigpO1xuICB9XG4gIHJldHVybiB7RUxFTUVOVDogdGhpcy53ZWJFbGVtZW50c0NhY2hlLmdldChlbElkKX07XG59O1xuXG5oZWxwZXJzLmNvbnZlcnRFbGVtZW50c0ZvckF0b21zID0gZnVuY3Rpb24gY29udmVydEVsZW1lbnRzRm9yQXRvbXMgKGFyZ3MgPSBbXSkge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgIGlmIChoZWxwZXJzLmhhc0VsZW1lbnRJZChhcmcpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdG9tc0VsZW1lbnQoYXJnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIWlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgcmV0dXJuIF8uaXNBcnJheShhcmcpID8gdGhpcy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyhhcmcpIDogYXJnO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0RWxlbWVudElkID0gZnVuY3Rpb24gZ2V0RWxlbWVudElkIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50LkVMRU1FTlQgfHwgZWxlbWVudFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl07XG59O1xuXG5oZWxwZXJzLmhhc0VsZW1lbnRJZCA9IGZ1bmN0aW9uIGhhc0VsZW1lbnRJZCAoZWxlbWVudCkge1xuICByZXR1cm4gdXRpbC5oYXNWYWx1ZShlbGVtZW50KSAmJiAodXRpbC5oYXNWYWx1ZShlbGVtZW50LkVMRU1FTlQpIHx8IHV0aWwuaGFzVmFsdWUoZWxlbWVudFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl0pKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0U2FmYXJpSXNJcGhvbmUgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpSXNJcGhvbmUgKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgncmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQnKTtcbiAgICByZXR1cm4gdXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2lwaG9uZScpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIGZpbmQgZGV2aWNlIHR5cGUgZnJvbSB1c2VyYWdlbnQuIEFzc3VtaW5nIGlQaG9uZWApO1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlEZXZpY2VTaXplID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldFNhZmFyaURldmljZVNpemUgKCkge1xuICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIHtoZWlnaHQ6IHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgd2lkdGg6IHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfTsnO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoc2NyaXB0KTtcbiAgY29uc3QgW25vcm1IZWlnaHQsIG5vcm1XaWR0aF0gPSBoZWlnaHQgPiB3aWR0aCA/IFtoZWlnaHQsIHdpZHRoXSA6IFt3aWR0aCwgaGVpZ2h0XTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbm9ybVdpZHRoLFxuICAgIGhlaWdodDogbm9ybUhlaWdodCxcbiAgfTtcbn0pO1xuXG5leHRlbnNpb25zLmdldFNhZmFyaUlzTm90Y2hlZCA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlJc05vdGNoZWQgKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2FmYXJpRGV2aWNlU2l6ZSgpO1xuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIE5PVENIRURfREVWSUNFX1NJWkVTKSB7XG4gICAgICBpZiAoZGV2aWNlLncgPT09IHdpZHRoICYmIGRldmljZS5oID09PSBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIGZpbmQgZGV2aWNlIHR5cGUgZnJvbSBkaW1lbnNpb25zLiBBc3N1bWluZyB0aGUgZGV2aWNlIGlzIG5vdCBub3RjaGVkYCk7XG4gICAgbG9nLmRlYnVnKGBFcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KTtcblxuZXh0ZW5zaW9ucy5nZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCA9IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0ICh3dlBvcywgcmVhbERpbXMpIHtcbiAgbGV0IHRvcE9mZnNldCA9IDA7XG4gIGxldCBib3R0b21PZmZzZXQgPSAwO1xuXG4gIGNvbnN0IGlzSXBob25lID0gYXdhaXQgdGhpcy5nZXRTYWZhcmlJc0lwaG9uZSgpO1xuXG4gIC8vIE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgU21hcnQgQXBwIEJhbm5lciBvciBUYWIgQmFyIGlzIHZpc2libGUgb3Igbm90XG4gIC8vIGlmIGFscmVhZHkgZGVmaW5lZCBieSBuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5IG9yIG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSBpbiBzZXR0aW5ncy5cbiAgY29uc3Qge1xuICAgIG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHksXG4gICAgbmF0aXZlV2ViVGFwU21hcnRBcHBCYW5uZXJWaXNpYmlsaXR5LFxuICAgIHNhZmFyaVRhYkJhclBvc2l0aW9uID0gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz49JywgJzE1LjAnKSAmJiBpc0lwaG9uZVxuICAgICAgPyBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA6IFRBQl9CQVJfUE9TSVRJT05fVE9QLFxuICB9ID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpO1xuICBsZXQgdGFiQmFyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkpO1xuICBsZXQgYmFubmVyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSk7XG4gIGNvbnN0IHRhYkJhclBvc2l0aW9uID0gXy5sb3dlckNhc2Uoc2FmYXJpVGFiQmFyUG9zaXRpb24pO1xuXG4gIGlmICghVklTSUJJTElUSUVTLmluY2x1ZGVzKHRhYkJhclZpc2liaWxpdHkpKSB7XG4gICAgdGFiQmFyVmlzaWJpbGl0eSA9IERFVEVDVDtcbiAgfVxuICBpZiAoIVZJU0lCSUxJVElFUy5pbmNsdWRlcyhiYW5uZXJWaXNpYmlsaXR5KSkge1xuICAgIGJhbm5lclZpc2liaWxpdHkgPSBERVRFQ1Q7XG4gIH1cblxuICBpZiAoIVRBQl9CQVJfUE9TU0lUSU9OUy5pbmNsdWRlcyh0YWJCYXJQb3NpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYCR7c2FmYXJpVGFiQmFyUG9zaXRpb259IGlzIGludmFsaWQgYXMgU2FmYXJpIHRhYiBiYXIgcG9zaXRpb24uIEF2YWlsYWJsZSBwb3NpdGlvbnMgYXJlICR7VEFCX0JBUl9QT1NTSVRJT05TfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGlzTm90Y2hlZCA9IGlzSXBob25lICYmIGF3YWl0IHRoaXMuZ2V0U2FmYXJpSXNOb3RjaGVkKCk7XG5cbiAgY29uc3Qgb3JpZW50YXRpb24gPSByZWFsRGltcy5oID4gcmVhbERpbXMudyA/ICdQT1JUUkFJVCcgOiAnTEFORFNDQVBFJztcblxuICBjb25zdCBub3RjaE9mZnNldCA9IGlzTm90Y2hlZFxuICAgID8gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz0nLCAnMTMuMCcpXG4gICAgICA/IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTNcbiAgICAgIDogSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU1xuICAgIDogMDtcblxuICBjb25zdCBpc1Njcm9sbGVkID0gYXdhaXQgdGhpcy5leGVjdXRlKCdyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDAnKTtcbiAgaWYgKGlzU2Nyb2xsZWQpIHtcbiAgICB0b3BPZmZzZXQgPSBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgKyBub3RjaE9mZnNldDtcblxuICAgIGlmIChpc05vdGNoZWQpIHtcbiAgICAgIHRvcE9mZnNldCAtPSBJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlQaG9uZSBpcyBsYW5kc2NhcGUgdGhlbiB0aGVyZSBpcyBubyB0b3AgYmFyXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyAmJiBpc0lwaG9uZSkge1xuICAgICAgdG9wT2Zmc2V0ID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9wT2Zmc2V0ID0gdGFiQmFyUG9zaXRpb24gPT09IFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NID8gMCA6IElQSE9ORV9UT1BfQkFSX0hFSUdIVDtcbiAgICB0b3BPZmZzZXQgKz0gbm90Y2hPZmZzZXQ7XG4gICAgbG9nLmRlYnVnKGB0YWJCYXJQb3NpdGlvbiBhbmQgdG9wT2Zmc2V0OiAke3RhYkJhclBvc2l0aW9ufSwgJHt0b3BPZmZzZXR9YCk7XG5cbiAgICBpZiAoaXNJcGhvbmUpIHtcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ1BPUlRSQUlUJykge1xuICAgICAgICAvLyBUaGUgYm90dG9tIGJhciBpcyBvbmx5IHZpc2libGUgd2hlbiBwb3J0cmFpdFxuICAgICAgICBib3R0b21PZmZzZXQgPSBJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b3BPZmZzZXQgPSBJUEhPTkVfTEFORFNDQVBFX1RPUF9CQVJfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0xBTkRTQ0FQRScgfHwgIWlzSXBob25lKSB7XG4gICAgICBpZiAodGFiQmFyVmlzaWJpbGl0eSA9PT0gVklTSUJMRSkge1xuICAgICAgICB0b3BPZmZzZXQgKz0gVEFCX0JBUl9PRkZTRVQ7XG4gICAgICB9IGVsc2UgaWYgKHRhYkJhclZpc2liaWxpdHkgPT09IERFVEVDVCkge1xuICAgICAgICAvLyBUYWJzIG9ubHkgYXBwZWFyIGlmIHRoZSBkZXZpY2UgaXMgbGFuZHNjYXBlIG9yIGlmIGl0J3MgYW4gaVBhZCBzbyB3ZSBvbmx5IGNoZWNrIHZpc2liaWxpdHkgaW4gdGhpcyBjYXNlXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IGVhY2ggdGFiIGJhciBpcyBhIFdlYlZpZXdcbiAgICAgICAgY29uc3QgY29udGV4dHNBbmRWaWV3cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cygpO1xuICAgICAgICBjb25zdCB0YWJzID0gY29udGV4dHNBbmRWaWV3cy5maWx0ZXIoKGN0eCkgPT4gY3R4LmlkLnN0YXJ0c1dpdGgoJ1dFQlZJRVdfJykpO1xuXG4gICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYEZvdW5kICR7dGFicy5sZW5ndGh9IHRhYnMuIEFzc3VtaW5nIHRoZSB0YWIgYmFyIGlzIHZpc2libGVgKTtcbiAgICAgICAgICB0b3BPZmZzZXQgKz0gVEFCX0JBUl9PRkZTRVQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b3BPZmZzZXQgKz0gYXdhaXQgdGhpcy5nZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldChpc0lwaG9uZSwgYmFubmVyVmlzaWJpbGl0eSk7XG5cbiAgd3ZQb3MueSArPSB0b3BPZmZzZXQ7XG4gIHJlYWxEaW1zLmggLT0gKHRvcE9mZnNldCArIGJvdHRvbU9mZnNldCk7XG59O1xuXG5leHRlbnNpb25zLmdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQgKGlzSXBob25lLCBiYW5uZXJWaXNpYmlsaXR5KSB7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGlmIChiYW5uZXJWaXNpYmlsaXR5ID09PSBWSVNJQkxFKSB7XG4gICAgb2Zmc2V0ICs9IGlzSXBob25lID9cbiAgICAgIElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgOlxuICAgICAgSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQ7XG4gIH0gZWxzZSBpZiAoYmFubmVyVmlzaWJpbGl0eSA9PT0gREVURUNUKSB7XG4gICAgLy8gdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBTbWFydCBBcHAgQmFubmVyXG4gICAgY29uc3QgYmFubmVycyA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdhY2Nlc3NpYmlsaXR5IGlkJywgJ0Nsb3NlIGFwcCBkb3dubG9hZCBvZmZlcicsIHRydWUpO1xuICAgIGlmIChiYW5uZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9mZnNldCArPSBpc0lwaG9uZSA/XG4gICAgICAgIElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgOlxuICAgICAgICBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVDtcbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoYEFkZGl0aW9uYWwgbmF0aXZlIHdlYiB0YXAgb2Zmc2V0IGNvbXB1dGVkOiAke29mZnNldH1gKTtcbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRhcFdlYkVsZW1lbnROYXRpdmVseSAoZHJpdmVyLCBhdG9tc0VsZW1lbnQpIHtcbiAgLy8gdHJ5IHRvIGdldCB0aGUgdGV4dCBvZiB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBhY2Nlc3NpYmxlIGluIHRoZVxuICAvLyBuYXRpdmUgY29udGV4dFxuICB0cnkge1xuICAgIGxldCB0ZXh0ID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVBdG9tKCdnZXRfdGV4dCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRleHQgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUF0b20oJ2dldF9hdHRyaWJ1dGVfdmFsdWUnLCBbYXRvbXNFbGVtZW50LCAndmFsdWUnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGVscyA9IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCB0ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChlbHMubGVuZ3RoID09PSAxIHx8IGVscy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgZWwgPSBlbHNbMF07XG4gICAgICAgIC8vIHVzZSB0YXAgYmVjYXVzZSBvbiBpT1MgMTEuMiBhbmQgYmVsb3cgYG5hdGl2ZUNsaWNrYCBjcmFzaGVzIFdEQVxuICAgICAgICBjb25zdCByZWN0ID0gYXdhaXQgZHJpdmVyLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWwpfS9yZWN0YCwgJ0dFVCcpO1xuICAgICAgICBpZiAoZWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGVsMiA9IGVsc1sxXTtcbiAgICAgICAgICBjb25zdCByZWN0MiA9IGF3YWl0IGRyaXZlci5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsMil9L3JlY3RgLCAnR0VUJyk7XG5cbiAgICAgICAgICBpZiAoKHJlY3QueCAhPT0gcmVjdDIueCB8fCByZWN0LnkgIT09IHJlY3QyLnkpIHx8XG4gICAgICAgICAgKHJlY3Qud2lkdGggIT09IHJlY3QyLndpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9PSByZWN0Mi5oZWlnaHQpKSB7XG4gICAgICAgICAgICAvLyBUaGVzZSAyIG5hdGl2ZSBlbGVtZW50cyBhcmUgbm90IHJlZmVycmluZyB0byB0aGUgc2FtZSB3ZWIgZWxlbWVudFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZChyZWN0LnggKyByZWN0LndpZHRoIC8gMiksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChyZWN0LnkgKyByZWN0LmhlaWdodCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBkcml2ZXIuY2xpY2tDb29yZHMoY29vcmRzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBhbnkgZmFpbHVyZSBzaG91bGQgZmFsbCB0aHJvdWdoIGFuZCB0cmlnZ2VyIHRoZSBtb3JlIGVsYWJvcmF0ZVxuICAgIC8vIG1ldGhvZCBvZiBjbGlja2luZ1xuICAgIGxvZy53YXJuKGBFcnJvciBhdHRlbXB0aW5nIHRvIGNsaWNrOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXh0ZW5zaW9ucy5uYXRpdmVXZWJUYXAgPSBhc3luYyBmdW5jdGlvbiBuYXRpdmVXZWJUYXAgKGVsKSB7XG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcblxuICAvLyBpZiBzdHJpY3QgbmF0aXZlIHRhcCwgZG8gbm90IHRyeSB0byBkbyBpdCB3aXRoIFdEQSBkaXJlY3RseVxuICBpZiAoIShhd2FpdCB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCkpLm5hdGl2ZVdlYlRhcFN0cmljdCAmJiBhd2FpdCB0YXBXZWJFbGVtZW50TmF0aXZlbHkodGhpcywgYXRvbXNFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cud2FybignVW5hYmxlIHRvIGRvIHNpbXBsZSBuYXRpdmUgd2ViIHRhcC4gQXR0ZW1wdGluZyB0byBjb252ZXJ0IGNvb3JkaW5hdGVzJyk7XG5cbiAgLy8gYGdldF90b3BfbGVmdF9jb29yZGluYXRlc2AgcmV0dXJucyB0aGUgd3JvbmcgdmFsdWUgc29tZXRpbWVzLFxuICAvLyB1bmxlc3Mgd2UgcHJlLWNhbGwgYm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbHNcbiAgYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcblxuICBjb25zdCBbc2l6ZSwgY29vcmRpbmF0ZXNdID0gYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gc2l6ZTtcbiAgbGV0IHt4LCB5fSA9IGNvb3JkaW5hdGVzO1xuICB4ICs9IHdpZHRoIC8gMjtcbiAgeSArPSBoZWlnaHQgLyAyO1xuXG4gIHRoaXMuY3VyV2ViQ29vcmRzID0ge3gsIHl9O1xuICBhd2FpdCB0aGlzLmNsaWNrV2ViQ29vcmRzKCk7XG59O1xuXG5leHRlbnNpb25zLmNsaWNrQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gY2xpY2tDb29yZHMgKGNvb3Jkcykge1xuICBhd2FpdCB0aGlzLnBlcmZvcm1Ub3VjaChbXG4gICAge1xuICAgICAgYWN0aW9uOiAndGFwJyxcbiAgICAgIG9wdGlvbnM6IGNvb3JkcyxcbiAgICB9LFxuICBdKTtcbn07XG5cbmV4dGVuc2lvbnMudHJhbnNsYXRlV2ViQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlV2ViQ29vcmRzIChjb29yZHMpIHtcbiAgbG9nLmRlYnVnKGBUcmFuc2xhdGluZyBjb29yZGluYXRlcyAoJHtKU09OLnN0cmluZ2lmeShjb29yZHMpfSkgdG8gd2ViIGNvb3JkaW5hdGVzYCk7XG5cbiAgLy8gYWJzb2x1dGl6ZSB3ZWIgY29vcmRzXG4gIGxldCB3ZWJ2aWV3O1xuICB0cnkge1xuICAgIHdlYnZpZXcgPSBhd2FpdCByZXRyeUludGVydmFsKDUsIDEwMCwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlV2ViVmlldycsIGZhbHNlKSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBpZiAoIXdlYnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIFdlYlZpZXcgZm91bmQuIFVuYWJsZSB0byB0cmFuc2xhdGUgd2ViIGNvb3JkaW5hdGVzIGZvciBuYXRpdmUgd2ViIHRhcC5gKTtcbiAgfVxuXG4gIHdlYnZpZXcgPSB1dGlsLnVud3JhcEVsZW1lbnQod2Vidmlldyk7XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke3dlYnZpZXd9L3JlY3RgLCAnR0VUJyk7XG4gIGNvbnN0IHd2UG9zID0ge3g6IHJlY3QueCwgeTogcmVjdC55fTtcbiAgY29uc3QgcmVhbERpbXMgPSB7dzogcmVjdC53aWR0aCwgaDogcmVjdC5oZWlnaHR9O1xuXG4gIGNvbnN0IGNtZCA9ICcoZnVuY3Rpb24gKCkgeyByZXR1cm4ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9OyB9KSgpJztcbiAgY29uc3Qgd3ZEaW1zID0gYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZShjbWQpO1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgaW1wbGljaXQgd2FpdCwgYW5kIHNldCBsb2NhbGx5IHRvIDBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0OTg4XG4gIGNvbnN0IGltcGxpY2l0V2FpdE1zID0gdGhpcy5pbXBsaWNpdFdhaXRNcztcbiAgYXdhaXQgdGhpcy5zZXRJbXBsaWNpdFdhaXQoMCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5nZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCh3dlBvcywgcmVhbERpbXMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHRoaXMuc2V0SW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zKTtcbiAgfVxuXG4gIGlmICh3dkRpbXMgJiYgcmVhbERpbXMgJiYgd3ZQb3MpIHtcbiAgICBsZXQgeFJhdGlvID0gcmVhbERpbXMudyAvIHd2RGltcy53O1xuICAgIGxldCB5UmF0aW8gPSByZWFsRGltcy5oIC8gd3ZEaW1zLmg7XG4gICAgbGV0IG5ld0Nvb3JkcyA9IHtcbiAgICAgIHg6IHd2UG9zLnggKyBNYXRoLnJvdW5kKHhSYXRpbyAqIGNvb3Jkcy54KSxcbiAgICAgIHk6IHd2UG9zLnkgKyBNYXRoLnJvdW5kKHlSYXRpbyAqIGNvb3Jkcy55KSxcbiAgICB9O1xuXG4gICAgLy8gYWRkaXRpb25hbCBsb2dnaW5nIGZvciBjb29yZGluYXRlcywgc2luY2UgaXQgaXMgc29tZXRpbWVzIGJyb2tlblxuICAgIC8vICAgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy85MTU5XG4gICAgbG9nLmRlYnVnKGBDb252ZXJ0ZWQgY29vcmRpbmF0ZXM6ICR7SlNPTi5zdHJpbmdpZnkobmV3Q29vcmRzKX1gKTtcbiAgICBsb2cuZGVidWcoYCAgICByZWN0OiAke0pTT04uc3RyaW5naWZ5KHJlY3QpfWApO1xuICAgIGxvZy5kZWJ1ZyhgICAgIHd2UG9zOiAke0pTT04uc3RyaW5naWZ5KHd2UG9zKX1gKTtcbiAgICBsb2cuZGVidWcoYCAgICByZWFsRGltczogJHtKU09OLnN0cmluZ2lmeShyZWFsRGltcyl9YCk7XG4gICAgbG9nLmRlYnVnKGAgICAgd3ZEaW1zOiAke0pTT04uc3RyaW5naWZ5KHd2RGltcyl9YCk7XG4gICAgbG9nLmRlYnVnKGAgICAgeFJhdGlvOiAke0pTT04uc3RyaW5naWZ5KHhSYXRpbyl9YCk7XG4gICAgbG9nLmRlYnVnKGAgICAgeVJhdGlvOiAke0pTT04uc3RyaW5naWZ5KHlSYXRpbyl9YCk7XG5cbiAgICBsb2cuZGVidWcoYENvbnZlcnRlZCB3ZWIgY29vcmRzICR7SlNPTi5zdHJpbmdpZnkoY29vcmRzKX0gYCArXG4gICAgICAgICAgICAgIGBpbnRvIHJlYWwgY29vcmRzICR7SlNPTi5zdHJpbmdpZnkobmV3Q29vcmRzKX1gKTtcbiAgICByZXR1cm4gbmV3Q29vcmRzO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmNoZWNrRm9yQWxlcnQgPSBhc3luYyBmdW5jdGlvbiBjaGVja0ZvckFsZXJ0ICgpIHtcbiAgcmV0dXJuIF8uaXNTdHJpbmcoYXdhaXQgdGhpcy5nZXRBbGVydFRleHQoKSk7XG59O1xuXG5leHRlbnNpb25zLndhaXRGb3JBdG9tID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckF0b20gKHByb21pc2UpIHtcbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcblxuICAvLyBuZWVkIHRvIGNoZWNrIGZvciBhbGVydCB3aGlsZSB0aGUgYXRvbSBpcyBiZWluZyBleGVjdXRlZC5cbiAgLy8gc28gbm90aWZ5IG91cnNlbHZlcyB3aGVuIGl0IGhhcHBlbnNcbiAgY29uc3QgdGltZWRBdG9tUHJvbWlzZSA9IEIucmVzb2x2ZShwcm9taXNlKS50aW1lb3V0KEFUT01fV0FJVF9USU1FT1VUX01TKTtcbiAgY29uc3QgaGFuZGxlUHJvbWlzZUVycm9yID0gYXN5bmMgKHApID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yID0gKGVyciBpbnN0YW5jZW9mIEIuQWdncmVnYXRlRXJyb3IpID8gZXJyWzBdIDogZXJyO1xuICAgICAgbG9nLmRlYnVnKGBFcnJvciByZWNlaXZlZCB3aGlsZSBleGVjdXRpbmcgYXRvbTogJHtvcmlnaW5hbEVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEIuVGltZW91dEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBnZXQgYW55IHJlc3BvbnNlIGZvciBhdG9tIGV4ZWN1dGlvbiBhZnRlciBgICtcbiAgICAgICAgICBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xuICAvLyBpZiB0aGUgYXRvbSBwcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoaW4gQVRPTV9JTklUSUFMX1dBSVRfTVNcbiAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBhbiBhbGVydCBwcmVzZW5jZVxuICBhd2FpdCBoYW5kbGVQcm9taXNlRXJyb3IoQi5hbnkoW0IuZGVsYXkoQVRPTV9JTklUSUFMX1dBSVRfTVMpLCB0aW1lZEF0b21Qcm9taXNlXSkpO1xuICBpZiAodGltZWRBdG9tUHJvbWlzZS5pc0Z1bGZpbGxlZCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRpbWVkQXRvbVByb21pc2U7XG4gIH1cblxuICAvLyAuLi5vdGhlcndpc2UgbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHVuZXhwZWN0ZWQgYWxlcnQgY292ZXJpbmcgdGhlIGVsZW1lbnRcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QodGhpcy5fd2FpdGluZ0F0b21zKSkge1xuICAgIHRoaXMuX3dhaXRpbmdBdG9tcyA9IHtcbiAgICAgIGNvdW50OiAwLFxuICAgICAgYWxlcnROb3RpZmllcjogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgYWxlcnRNb25pdG9yOiBCLnJlc29sdmUoKSxcbiAgICB9O1xuICB9XG4gIHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudCsrO1xuXG4gIGxldCBvbkFsZXJ0Q2FsbGJhY2s7XG4gIHRyeSB7XG4gICAgLy8gb25seSByZXN0YXJ0IHRoZSBtb25pdG9yIGlmIGl0IGlzIG5vdCBydW5uaW5nIGFscmVhZHlcbiAgICBpZiAodGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0TW9uaXRvci5pc1Jlc29sdmVkKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE1vbml0b3IgPSBCLnJlc29sdmUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudCA+IDApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tGb3JBbGVydCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLmVtaXQoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KEFUT01fSU5JVElBTF9XQUlUX01TIC8gMik7XG4gICAgICAgIH1cbiAgICAgIH0pKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBvbkFsZXJ0Q2FsbGJhY2sgPSAoKSA9PiByZWplY3QobmV3IGVycm9ycy5VbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IoKSk7XG4gICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5vbmNlKE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5ULCBvbkFsZXJ0Q2FsbGJhY2spO1xuICAgICAgaGFuZGxlUHJvbWlzZUVycm9yKHRpbWVkQXRvbVByb21pc2UpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvbkFsZXJ0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5ULCBvbkFsZXJ0Q2FsbGJhY2spO1xuICAgIH1cbiAgICB0aGlzLl93YWl0aW5nQXRvbXMuY291bnQtLTtcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5tb2JpbGVXZWJOYXYgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVXZWJOYXYgKG5hdlR5cGUpIHtcbiAgdGhpcy5yZW1vdGUuYWxsb3dOYXZpZ2F0aW9uV2l0aG91dFJlbG9hZCA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbYGhpc3RvcnkuJHtuYXZUeXBlfSgpO2AsIG51bGxdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnJlbW90ZS5hbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oY29tbWFuZHMsIGV4dGVuc2lvbnMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3dlYi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -153,8 +153,8 @@ class IOSDeploy {
153
153
  }
154
154
  }
155
155
 
156
- async installApp(app, timeout) {
157
- await this.install(app, timeout);
156
+ async installApp(...args) {
157
+ return await this.install(...args);
158
158
  }
159
159
 
160
160
  async isAppInstalled(bundleid) {
@@ -201,4 +201,4 @@ var _default = IOSDeploy;
201
201
  exports.default = _default;require('source-map-support').install();
202
202
 
203
203
 
204
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZGVwbG95LmpzIl0sIm5hbWVzIjpbIkFQUExJQ0FUSU9OX0lOU1RBTExFRF9OT1RJRklDQVRJT04iLCJJTlNUQUxMQVRJT05fU1RBR0lOR19ESVIiLCJBUFBMSUNBVElPTl9OT1RJRklDQVRJT05fVElNRU9VVF9NUyIsIklPU19ERVBMT1lfVElNRU9VVF9NUyIsIklPU19ERVBMT1kiLCJBUFBfSU5TVEFMTF9TVFJBVEVHWSIsIk9iamVjdCIsImZyZWV6ZSIsIlNFUklBTCIsIlBBUkFMTEVMIiwiSU9TRGVwbG95IiwiY29uc3RydWN0b3IiLCJ1ZGlkIiwicmVtb3ZlIiwiYnVuZGxlaWQiLCJzZXJ2aWNlIiwic2VydmljZXMiLCJzdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSIsInVuaW5zdGFsbEFwcGxpY2F0aW9uIiwiY2xvc2UiLCJyZW1vdmVBcHAiLCJidW5kbGVJZCIsImluc3RhbGwiLCJhcHAiLCJ0aW1lb3V0Iiwic3RyYXRlZ3kiLCJfIiwidmFsdWVzIiwiaW5jbHVkZXMiLCJ0b0xvd2VyIiwiRXJyb3IiLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxXaXRoSW9zRGVwbG95IiwiZnMiLCJ3aGljaCIsImVyciIsInN0ZGVyciIsInN0ZG91dCIsIm1lc3NhZ2UiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJhZmNTZXJ2aWNlIiwic3RhcnRBZmNTZXJ2aWNlIiwiYnVuZGxlUGF0aE9uUGhvbmUiLCJwYXRoIiwiam9pbiIsInRpbWVvdXRNcyIsImVuYWJsZVBhcmFsbGVsUHVzaCIsImluc3RhbGxPclVwZ3JhZGVBcHBsaWNhdGlvbiIsImlzQXBwSW5zdGFsbGVkIiwid2FybiIsIkIiLCJUaW1lb3V0RXJyb3IiLCJlcnIxIiwiaW5mbyIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiaXNVcGdyYWRlIiwibm90aWZpY2F0aW9uU2VydmljZSIsInN0YXJ0Tm90aWZpY2F0aW9uUHJveHlTZXJ2aWNlIiwiaW5zdGFsbGF0aW9uU2VydmljZSIsImFwcEluc3RhbGxlZE5vdGlmaWNhdGlvbiIsInJlc29sdmUiLCJvYnNlcnZlTm90aWZpY2F0aW9uIiwibm90aWZpY2F0aW9uIiwiY2xpZW50T3B0aW9ucyIsIlBhY2thZ2VUeXBlIiwidXBncmFkZUFwcGxpY2F0aW9uIiwiaW5zdGFsbEFwcGxpY2F0aW9uIiwiZSIsImluc3RhbGxBcHAiLCJhcHBsaWNhdGlvbnMiLCJsb29rdXBBcHBsaWNhdGlvbnMiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlTmFtZSIsImxpc3RBcHBsaWNhdGlvbnMiLCJhcHBsaWNhdGlvblR5cGUiLCJyZWR1Y2UiLCJhY2MiLCJDRkJ1bmRsZU5hbWUiLCJrZXkiLCJwdXNoIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidXRpbGl0aWVzIiwiZ2V0T1NWZXJzaW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGtDQUFrQyxHQUFHLHdDQUEzQztBQUNBLE1BQU1DLHdCQUF3QixHQUFHLGVBQWpDO0FBQ0EsTUFBTUMsbUNBQW1DLEdBQUcsS0FBSyxJQUFqRDtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLElBQUksRUFBSixHQUFTLElBQXZDO0FBQ0EsTUFBTUMsVUFBVSxHQUFHLFlBQW5CO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3pDQyxFQUFBQSxNQUFNLEVBQUUsUUFEaUM7QUFFekNDLEVBQUFBLFFBQVEsRUFBRSxVQUYrQjtBQUd6Q0wsRUFBQUE7QUFIeUMsQ0FBZCxDQUE3Qjs7QUFPQSxNQUFNTSxTQUFOLENBQWdCO0FBRWRDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBQ2pCLFNBQUtBLElBQUwsR0FBWUEsSUFBWjtBQUNEOztBQUVXLFFBQU5DLE1BQU0sQ0FB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QUFPLENBQUMsQ0FBQzZELFlBQVksQ0FBQzdELFFBQUQsQ0FBckI7QUFDRCxLQUhELFNBR1U7QUFDUkMsTUFBQUEsT0FBTyxDQUFDSSxLQUFSO0FBQ0Q7QUFDRjs7QUFRMEMsUUFBckMyRCxxQ0FBcUMsQ0FBRUMsVUFBRixFQUFjO0FBQ3ZELFVBQU1oRSxPQUFPLEdBQUcsTUFBTUMsMEJBQVNDLDZCQUFULENBQXVDLEtBQUtMLElBQTVDLENBQXRCOztBQUNBLFFBQUk7QUFDRixZQUFNK0QsWUFBWSxHQUFHLE1BQU01RCxPQUFPLENBQUNpRSxnQkFBUixDQUF5QjtBQUFDQyxRQUFBQSxlQUFlLEVBQUU7QUFBbEIsT0FBekIsQ0FBM0I7QUFDQSxhQUFPdkQsZ0JBQUV3RCxNQUFGLENBQVNQLFlBQVQsRUFBdUIsQ0FBQ1EsR0FBRCxFQUFNO0FBQUNDLFFBQUFBO0FBQUQsT0FBTixFQUFzQkMsR0FBdEIsS0FBOEI7QUFDMUQsWUFBSUQsWUFBWSxLQUFLTCxVQUFyQixFQUFpQztBQUMvQkksVUFBQUEsR0FBRyxDQUFDRyxJQUFKLENBQVNELEdBQVQ7QUFDRDs7QUFDRCxlQUFPRixHQUFQO0FBQ0QsT0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1ELEtBUkQsU0FRVTtBQUNScEUsTUFBQUEsT0FBTyxDQUFDSSxLQUFSO0FBQ0Q7QUFDRjs7QUFFdUIsUUFBbEJvRSxrQkFBa0IsR0FBSTtBQUMxQixXQUFPLE1BQU1DLDJCQUFVQyxZQUFWLENBQXVCLEtBQUs3RSxJQUE1QixDQUFiO0FBQ0Q7O0FBM0phOztlQThKREYsUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHNlcnZpY2VzLCB1dGlsaXRpZXMgfSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGV4dHJhY3RCdW5kbGVJZCB9IGZyb20gJy4vYXBwLXV0aWxzJztcbmltcG9ydCB7IHB1c2hGb2xkZXIgfSBmcm9tICcuL2lvcy1mcy1oZWxwZXJzJztcblxuY29uc3QgQVBQTElDQVRJT05fSU5TVEFMTEVEX05PVElGSUNBVElPTiA9ICdjb20uYXBwbGUubW9iaWxlLmFwcGxpY2F0aW9uX2luc3RhbGxlZCc7XG5jb25zdCBJTlNUQUxMQVRJT05fU1RBR0lOR19ESVIgPSAnUHVibGljU3RhZ2luZyc7XG5jb25zdCBBUFBMSUNBVElPTl9OT1RJRklDQVRJT05fVElNRU9VVF9NUyA9IDMwICogMTAwMDtcbmNvbnN0IElPU19ERVBMT1lfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5jb25zdCBJT1NfREVQTE9ZID0gJ2lvcy1kZXBsb3knO1xuY29uc3QgQVBQX0lOU1RBTExfU1RSQVRFR1kgPSBPYmplY3QuZnJlZXplKHtcbiAgU0VSSUFMOiAnc2VyaWFsJyxcbiAgUEFSQUxMRUw6ICdwYXJhbGxlbCcsXG4gIElPU19ERVBMT1ksXG59KTtcblxuXG5jbGFzcyBJT1NEZXBsb3kge1xuXG4gIGNvbnN0cnVjdG9yICh1ZGlkKSB7XG4gICAgdGhpcy51ZGlkID0gdWRpZDtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZSAoYnVuZGxlaWQpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnRJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UodGhpcy51ZGlkKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VydmljZS51bmluc3RhbGxBcHBsaWNhdGlvbihidW5kbGVpZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZW1vdmVBcHAgKGJ1bmRsZUlkKSB7XG4gICAgYXdhaXQgdGhpcy5yZW1vdmUoYnVuZGxlSWQpO1xuICB9XG5cbiAgYXN5bmMgaW5zdGFsbCAoYXBwLCB0aW1lb3V0LCBzdHJhdGVneSA9IG51bGwpIHtcbiAgICBpZiAoc3RyYXRlZ3kgJiYgIV8udmFsdWVzKEFQUF9JTlNUQUxMX1NUUkFURUdZKS5pbmNsdWRlcyhfLnRvTG93ZXIoc3RyYXRlZ3kpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHAgaW5zdGFsbGF0aW9uIHN0cmF0ZWd5ICcke3N0cmF0ZWd5fScgaXMgdW5rbm93bi4gYCArXG4gICAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkOiAke18udmFsdWVzKEFQUF9JTlNUQUxMX1NUUkFURUdZKX1gKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBVc2luZyAnJHtzdHJhdGVneSA/PyBBUFBfSU5TVEFMTF9TVFJBVEVHWS5TRVJJQUx9JyBhcHAgZGVwbG95bWVudCBzdHJhdGVneS4gYCArXG4gICAgICBgWW91IGNvdWxkIGNoYW5nZSBpdCBieSBwcm92aWRpbmcgYW5vdGhlciB2YWx1ZSB0byB0aGUgJ2FwcEluc3RhbGxTdHJhdGVneScgY2FwYWJpbGl0eWApO1xuXG4gICAgY29uc3QgaW5zdGFsbFdpdGhJb3NEZXBsb3kgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53aGljaChJT1NfREVQTE9ZKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke0lPU19ERVBMT1l9JyB1dGlsaXR5IGhhcyBub3QgYmVlbiBmb3VuZCBpbiBQQVRILiBJcyBpdCBpbnN0YWxsZWQ/YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKElPU19ERVBMT1ksIFtcbiAgICAgICAgICAnLS1pZCcsIHRoaXMudWRpZCxcbiAgICAgICAgICAnLS1idW5kbGUnLCBhcHAsXG4gICAgICAgIF0sIHt0aW1lb3V0OiB0aW1lb3V0ID8/IElPU19ERVBMT1lfVElNRU9VVF9NU30pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGlmIChfLnRvTG93ZXIoc3RyYXRlZ3kpID09PSBBUFBfSU5TVEFMTF9TVFJBVEVHWS5JT1NfREVQTE9ZKSB7XG4gICAgICBhd2FpdCBpbnN0YWxsV2l0aElvc0RlcGxveSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhZmNTZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnRBZmNTZXJ2aWNlKHRoaXMudWRpZCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidW5kbGVJZCA9IGF3YWl0IGV4dHJhY3RCdW5kbGVJZChhcHApO1xuICAgICAgICBjb25zdCBidW5kbGVQYXRoT25QaG9uZSA9IHBhdGguam9pbihJTlNUQUxMQVRJT05fU1RBR0lOR19ESVIsIGJ1bmRsZUlkKTtcbiAgICAgICAgYXdhaXQgcHVzaEZvbGRlcihhZmNTZXJ2aWNlLCBhcHAsIGJ1bmRsZVBhdGhPblBob25lLCB7XG4gICAgICAgICAgdGltZW91dE1zOiB0aW1lb3V0LFxuICAgICAgICAgIGVuYWJsZVBhcmFsbGVsUHVzaDogXy50b0xvd2VyKHN0cmF0ZWd5KSA9PT0gQVBQX0lOU1RBTExfU1RSQVRFR1kuUEFSQUxMRUwsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmluc3RhbGxPclVwZ3JhZGVBcHBsaWNhdGlvbihidW5kbGVQYXRoT25QaG9uZSwgYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChidW5kbGVJZCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKGBFcnJvciBpbnN0YWxsaW5nIGFwcCAnJHthcHB9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEIuVGltZW91dEVycm9yKSB7XG4gICAgICAgICAgbG9nLndhcm4oYENvbnNpZGVyIGluY3JlYXNpbmcgdGhlIHZhbHVlIG9mICdhcHBQdXNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICAgIGxvZy53YXJuKGBGYWxsaW5nIGJhY2sgdG8gJyR7SU9TX0RFUExPWX0nIHVzYWdlYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgaW5zdGFsbFdpdGhJb3NEZXBsb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGluc3RhbGwgJyR7YXBwfSc6XFxuYCArXG4gICAgICAgICAgICBgICAtICR7ZXJyLm1lc3NhZ2V9XFxuYCArXG4gICAgICAgICAgICBgICAtICR7ZXJyMS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhZmNTZXJ2aWNlLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5pbmZvKGBBcHAgaW5zdGFsbGF0aW9uIHN1Y2NlZWRlZCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICB9XG5cbiAgYXN5bmMgaW5zdGFsbE9yVXBncmFkZUFwcGxpY2F0aW9uIChidW5kbGVQYXRoT25QaG9uZSwgaXNVcGdyYWRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnROb3RpZmljYXRpb25Qcm94eVNlcnZpY2UodGhpcy51ZGlkKTtcbiAgICBjb25zdCBpbnN0YWxsYXRpb25TZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnRJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UodGhpcy51ZGlkKTtcbiAgICBjb25zdCBhcHBJbnN0YWxsZWROb3RpZmljYXRpb24gPSBuZXcgQigocmVzb2x2ZSkgPT4ge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5vYnNlcnZlTm90aWZpY2F0aW9uKEFQUExJQ0FUSU9OX0lOU1RBTExFRF9OT1RJRklDQVRJT04sIHtcbiAgICAgICAgbm90aWZpY2F0aW9uOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBjbGllbnRPcHRpb25zID0ge1BhY2thZ2VUeXBlOiAnRGV2ZWxvcGVyJ307XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1VwZ3JhZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBBbiB1cGdyYWRlIG9mIHRoZSBleGlzdGluZyBhcHBsaWNhdGlvbiBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWRgKTtcbiAgICAgICAgYXdhaXQgaW5zdGFsbGF0aW9uU2VydmljZS51cGdyYWRlQXBwbGljYXRpb24oYnVuZGxlUGF0aE9uUGhvbmUsIGNsaWVudE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKGBBIG5ldyBhcHBsaWNhdGlvbiBpbnN0YWxsYXRpb24gaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkYCk7XG4gICAgICAgIGF3YWl0IGluc3RhbGxhdGlvblNlcnZpY2UuaW5zdGFsbEFwcGxpY2F0aW9uKGJ1bmRsZVBhdGhPblBob25lLCBjbGllbnRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcEluc3RhbGxlZE5vdGlmaWNhdGlvbi50aW1lb3V0KEFQUExJQ0FUSU9OX05PVElGSUNBVElPTl9USU1FT1VUX01TLFxuICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgbm90aWZpY2F0aW9uIHdpdGhpbiBgICtcbiAgICAgICAgICBgJHtBUFBMSUNBVElPTl9OT1RJRklDQVRJT05fVElNRU9VVF9NU31tcyBidXQgd2Ugd2lsbCBjb250aW51ZWApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cud2FybihgRmFpbGVkIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbi4gRXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpbnN0YWxsYXRpb25TZXJ2aWNlLmNsb3NlKCk7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbEFwcCAoYXBwLCB0aW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5pbnN0YWxsKGFwcCwgdGltZW91dCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFwcGxpY2F0aW9uIG9iamVjdCBpZiB0ZXN0IGFwcCBoYXMgJ2J1bmRsZWlkJy5cbiAgICogVGhlIHRhcmdldCBidW5kbGVpZCBjYW4gYmUgVXNlciBhbmQgU3lzdGVtIGFwcHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVpZCBUaGUgYnVuZGxlSWQgdG8gZW5zdXJlIGl0IGlzIGluc3RhbGxlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIFRydWUgaWYgdGhlIGJ1bmRsZWlkIGV4aXN0cyBpbiB0aGUgcmVzdWx0IG9mICdsaXN0QXBwbGljYXRpb25zJyBsaWtlOlxuICAgKiB7IFwiY29tLmFwcGxlLlByZWZlcmVuY2VzXCI6e1xuICAgKiAgIFwiVUlSZXF1aXJlZERldmljZUNhcGFiaWxpdGllc1wiOltcImFybTY0XCJdLFxuICAgKiAgIFwiVUlSZXF1aXJlc0Z1bGxTY3JlZW5cIjp0cnVlLFxuICAgKiAgIFwiQ0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb25cIjpcIjYuMFwiLFxuICAgKiAgIFwiRW50aXRsZW1lbnRzXCI6XG4gICAqICAgICB7XCJjb20uYXBwbGUuZnJvbnRib2FyZC5kZWxldGUtYXBwbGljYXRpb24tc25hcHNob3RzXCI6dHJ1ZSwuLlxuICAgKi9cbiAgYXN5bmMgaXNBcHBJbnN0YWxsZWQgKGJ1bmRsZWlkKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IGF3YWl0IHNlcnZpY2VzLnN0YXJ0SW5zdGFsbGF0aW9uUHJveHlTZXJ2aWNlKHRoaXMudWRpZCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwcGxpY2F0aW9ucyA9IGF3YWl0IHNlcnZpY2UubG9va3VwQXBwbGljYXRpb25zKHsgYnVuZGxlSWRzOiBidW5kbGVpZCB9KTtcbiAgICAgIHJldHVybiAhIWFwcGxpY2F0aW9uc1tidW5kbGVpZF07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZU5hbWUgVGhlIG5hbWUgb2YgQ0ZCdW5kbGVOYW1lIGluIEluZm8ucGxpc3RcbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEEgbGlzdCBvZiBVc2VyIGxldmVsIGFwcHMnIGJ1bmRsZSBpZHMgd2hpY2ggaGFzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0ZCdW5kbGVOYW1lJyBhdHRyaWJ1dGUgYXMgJ2J1bmRsZU5hbWUnLlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSAoYnVuZGxlTmFtZSkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSh0aGlzLnVkaWQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBsaWNhdGlvbnMgPSBhd2FpdCBzZXJ2aWNlLmxpc3RBcHBsaWNhdGlvbnMoe2FwcGxpY2F0aW9uVHlwZTogJ1VzZXInfSk7XG4gICAgICByZXR1cm4gXy5yZWR1Y2UoYXBwbGljYXRpb25zLCAoYWNjLCB7Q0ZCdW5kbGVOYW1lfSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChDRkJ1bmRsZU5hbWUgPT09IGJ1bmRsZU5hbWUpIHtcbiAgICAgICAgICBhY2MucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRQbGF0Zm9ybVZlcnNpb24gKCkge1xuICAgIHJldHVybiBhd2FpdCB1dGlsaXRpZXMuZ2V0T1NWZXJzaW9uKHRoaXMudWRpZCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSU9TRGVwbG95O1xuIl0sImZpbGUiOiJsaWIvaW9zLWRlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
204
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZGVwbG95LmpzIl0sIm5hbWVzIjpbIkFQUExJQ0FUSU9OX0lOU1RBTExFRF9OT1RJRklDQVRJT04iLCJJTlNUQUxMQVRJT05fU1RBR0lOR19ESVIiLCJBUFBMSUNBVElPTl9OT1RJRklDQVRJT05fVElNRU9VVF9NUyIsIklPU19ERVBMT1lfVElNRU9VVF9NUyIsIklPU19ERVBMT1kiLCJBUFBfSU5TVEFMTF9TVFJBVEVHWSIsIk9iamVjdCIsImZyZWV6ZSIsIlNFUklBTCIsIlBBUkFMTEVMIiwiSU9TRGVwbG95IiwiY29uc3RydWN0b3IiLCJ1ZGlkIiwicmVtb3ZlIiwiYnVuZGxlaWQiLCJzZXJ2aWNlIiwic2VydmljZXMiLCJzdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSIsInVuaW5zdGFsbEFwcGxpY2F0aW9uIiwiY2xvc2UiLCJyZW1vdmVBcHAiLCJidW5kbGVJZCIsImluc3RhbGwiLCJhcHAiLCJ0aW1lb3V0Iiwic3RyYXRlZ3kiLCJfIiwidmFsdWVzIiwiaW5jbHVkZXMiLCJ0b0xvd2VyIiwiRXJyb3IiLCJsb2ciLCJkZWJ1ZyIsImluc3RhbGxXaXRoSW9zRGVwbG95IiwiZnMiLCJ3aGljaCIsImVyciIsInN0ZGVyciIsInN0ZG91dCIsIm1lc3NhZ2UiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJhZmNTZXJ2aWNlIiwic3RhcnRBZmNTZXJ2aWNlIiwiYnVuZGxlUGF0aE9uUGhvbmUiLCJwYXRoIiwiam9pbiIsInRpbWVvdXRNcyIsImVuYWJsZVBhcmFsbGVsUHVzaCIsImluc3RhbGxPclVwZ3JhZGVBcHBsaWNhdGlvbiIsImlzQXBwSW5zdGFsbGVkIiwid2FybiIsIkIiLCJUaW1lb3V0RXJyb3IiLCJlcnIxIiwiaW5mbyIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiaXNVcGdyYWRlIiwibm90aWZpY2F0aW9uU2VydmljZSIsInN0YXJ0Tm90aWZpY2F0aW9uUHJveHlTZXJ2aWNlIiwiaW5zdGFsbGF0aW9uU2VydmljZSIsImFwcEluc3RhbGxlZE5vdGlmaWNhdGlvbiIsInJlc29sdmUiLCJvYnNlcnZlTm90aWZpY2F0aW9uIiwibm90aWZpY2F0aW9uIiwiY2xpZW50T3B0aW9ucyIsIlBhY2thZ2VUeXBlIiwidXBncmFkZUFwcGxpY2F0aW9uIiwiaW5zdGFsbEFwcGxpY2F0aW9uIiwiZSIsImluc3RhbGxBcHAiLCJhcmdzIiwiYXBwbGljYXRpb25zIiwibG9va3VwQXBwbGljYXRpb25zIiwiYnVuZGxlSWRzIiwiZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSIsImJ1bmRsZU5hbWUiLCJsaXN0QXBwbGljYXRpb25zIiwiYXBwbGljYXRpb25UeXBlIiwicmVkdWNlIiwiYWNjIiwiQ0ZCdW5kbGVOYW1lIiwia2V5IiwicHVzaCIsImdldFBsYXRmb3JtVmVyc2lvbiIsInV0aWxpdGllcyIsImdldE9TVmVyc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQ0FBa0MsR0FBRyx3Q0FBM0M7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxlQUFqQztBQUNBLE1BQU1DLG1DQUFtQyxHQUFHLEtBQUssSUFBakQ7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJLEVBQUosR0FBUyxJQUF2QztBQUNBLE1BQU1DLFVBQVUsR0FBRyxZQUFuQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUN6Q0MsRUFBQUEsTUFBTSxFQUFFLFFBRGlDO0FBRXpDQyxFQUFBQSxRQUFRLEVBQUUsVUFGK0I7QUFHekNMLEVBQUFBO0FBSHlDLENBQWQsQ0FBN0I7O0FBT0EsTUFBTU0sU0FBTixDQUFnQjtBQUVkQyxFQUFBQSxXQUFXLENBQUVDLElBQUYsRUFBUTtBQUNqQixTQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDRDs7QUFFVyxRQUFOQyxN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QU8sQ0FBQyxDQUFDOEQsWUFBWSxDQUFDOUQsUUFBRCxDQUFyQjtBQUNELEtBSEQsU0FHVTtBQUNSQyxNQUFBQSxPQUFPLENBQUNJLEtBQVI7QUFDRDtBQUNGOztBQVEwQyxRQUFyQzRELHFDQUFxQyxDQUFFQyxVQUFGLEVBQWM7QUFDdkQsVUFBTWpFLE9BQU8sR0FBRyxNQUFNQywwQkFBU0MsNkJBQVQsQ0FBdUMsS0FBS0wsSUFBNUMsQ0FBdEI7O0FBQ0EsUUFBSTtBQUNGLFlBQU1nRSxZQUFZLEdBQUcsTUFBTTdELE9BQU8sQ0FBQ2tFLGdCQUFSLENBQXlCO0FBQUNDLFFBQUFBLGVBQWUsRUFBRTtBQUFsQixPQUF6QixDQUEzQjtBQUNBLGFBQU94RCxnQkFBRXlELE1BQUYsQ0FBU1AsWUFBVCxFQUF1QixDQUFDUSxHQUFELEVBQU07QUFBQ0MsUUFBQUE7QUFBRCxPQUFOLEVBQXNCQyxHQUF0QixLQUE4QjtBQUMxRCxZQUFJRCxZQUFZLEtBQUtMLFVBQXJCLEVBQWlDO0FBQy9CSSxVQUFBQSxHQUFHLENBQUNHLElBQUosQ0FBU0QsR0FBVDtBQUNEOztBQUNELGVBQU9GLEdBQVA7QUFDRCxPQUxNLEVBS0osRUFMSSxDQUFQO0FBTUQsS0FSRCxTQVFVO0FBQ1JyRSxNQUFBQSxPQUFPLENBQUNJLEtBQVI7QUFDRDtBQUNGOztBQUV1QixRQUFsQnFFLGtCQUFrQixHQUFJO0FBQzFCLFdBQU8sTUFBTUMsMkJBQVVDLFlBQVYsQ0FBdUIsS0FBSzlFLElBQTVCLENBQWI7QUFDRDs7QUEzSmE7O2VBOEpERixTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc2VydmljZXMsIHV0aWxpdGllcyB9IGZyb20gJ2FwcGl1bS1pb3MtZGV2aWNlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZXh0cmFjdEJ1bmRsZUlkIH0gZnJvbSAnLi9hcHAtdXRpbHMnO1xuaW1wb3J0IHsgcHVzaEZvbGRlciB9IGZyb20gJy4vaW9zLWZzLWhlbHBlcnMnO1xuXG5jb25zdCBBUFBMSUNBVElPTl9JTlNUQUxMRURfTk9USUZJQ0FUSU9OID0gJ2NvbS5hcHBsZS5tb2JpbGUuYXBwbGljYXRpb25faW5zdGFsbGVkJztcbmNvbnN0IElOU1RBTExBVElPTl9TVEFHSU5HX0RJUiA9ICdQdWJsaWNTdGFnaW5nJztcbmNvbnN0IEFQUExJQ0FUSU9OX05PVElGSUNBVElPTl9USU1FT1VUX01TID0gMzAgKiAxMDAwO1xuY29uc3QgSU9TX0RFUExPWV9USU1FT1VUX01TID0gNCAqIDYwICogMTAwMDtcbmNvbnN0IElPU19ERVBMT1kgPSAnaW9zLWRlcGxveSc7XG5jb25zdCBBUFBfSU5TVEFMTF9TVFJBVEVHWSA9IE9iamVjdC5mcmVlemUoe1xuICBTRVJJQUw6ICdzZXJpYWwnLFxuICBQQVJBTExFTDogJ3BhcmFsbGVsJyxcbiAgSU9TX0RFUExPWSxcbn0pO1xuXG5cbmNsYXNzIElPU0RlcGxveSB7XG5cbiAgY29uc3RydWN0b3IgKHVkaWQpIHtcbiAgICB0aGlzLnVkaWQgPSB1ZGlkO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlIChidW5kbGVpZCkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSh0aGlzLnVkaWQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXJ2aWNlLnVuaW5zdGFsbEFwcGxpY2F0aW9uKGJ1bmRsZWlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VydmljZS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUFwcCAoYnVuZGxlSWQpIHtcbiAgICBhd2FpdCB0aGlzLnJlbW92ZShidW5kbGVJZCk7XG4gIH1cblxuICBhc3luYyBpbnN0YWxsIChhcHAsIHRpbWVvdXQsIHN0cmF0ZWd5ID0gbnVsbCkge1xuICAgIGlmIChzdHJhdGVneSAmJiAhXy52YWx1ZXMoQVBQX0lOU1RBTExfU1RSQVRFR1kpLmluY2x1ZGVzKF8udG9Mb3dlcihzdHJhdGVneSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCBpbnN0YWxsYXRpb24gc3RyYXRlZ3kgJyR7c3RyYXRlZ3l9JyBpcyB1bmtub3duLiBgICtcbiAgICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGFyZSBzdXBwb3J0ZWQ6ICR7Xy52YWx1ZXMoQVBQX0lOU1RBTExfU1RSQVRFR1kpfWApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFVzaW5nICcke3N0cmF0ZWd5ID8/IEFQUF9JTlNUQUxMX1NUUkFURUdZLlNFUklBTH0nIGFwcCBkZXBsb3ltZW50IHN0cmF0ZWd5LiBgICtcbiAgICAgIGBZb3UgY291bGQgY2hhbmdlIGl0IGJ5IHByb3ZpZGluZyBhbm90aGVyIHZhbHVlIHRvIHRoZSAnYXBwSW5zdGFsbFN0cmF0ZWd5JyBjYXBhYmlsaXR5YCk7XG5cbiAgICBjb25zdCBpbnN0YWxsV2l0aElvc0RlcGxveSA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLndoaWNoKElPU19ERVBMT1kpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7SU9TX0RFUExPWX0nIHV0aWxpdHkgaGFzIG5vdCBiZWVuIGZvdW5kIGluIFBBVEguIElzIGl0IGluc3RhbGxlZD9gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGV4ZWMoSU9TX0RFUExPWSwgW1xuICAgICAgICAgICctLWlkJywgdGhpcy51ZGlkLFxuICAgICAgICAgICctLWJ1bmRsZScsIGFwcCxcbiAgICAgICAgXSwge3RpbWVvdXQ6IHRpbWVvdXQgPz8gSU9TX0RFUExPWV9USU1FT1VUX01TfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5zdGRlcnIgfHwgZXJyLnN0ZG91dCB8fCBlcnIubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgaWYgKF8udG9Mb3dlcihzdHJhdGVneSkgPT09IEFQUF9JTlNUQUxMX1NUUkFURUdZLklPU19ERVBMT1kpIHtcbiAgICAgIGF3YWl0IGluc3RhbGxXaXRoSW9zRGVwbG95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFmY1NlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydEFmY1NlcnZpY2UodGhpcy51ZGlkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1bmRsZUlkID0gYXdhaXQgZXh0cmFjdEJ1bmRsZUlkKGFwcCk7XG4gICAgICAgIGNvbnN0IGJ1bmRsZVBhdGhPblBob25lID0gcGF0aC5qb2luKElOU1RBTExBVElPTl9TVEFHSU5HX0RJUiwgYnVuZGxlSWQpO1xuICAgICAgICBhd2FpdCBwdXNoRm9sZGVyKGFmY1NlcnZpY2UsIGFwcCwgYnVuZGxlUGF0aE9uUGhvbmUsIHtcbiAgICAgICAgICB0aW1lb3V0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgZW5hYmxlUGFyYWxsZWxQdXNoOiBfLnRvTG93ZXIoc3RyYXRlZ3kpID09PSBBUFBfSU5TVEFMTF9TVFJBVEVHWS5QQVJBTExFTCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbE9yVXBncmFkZUFwcGxpY2F0aW9uKGJ1bmRsZVBhdGhPblBob25lLCBhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKGJ1bmRsZUlkKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oYEVycm9yIGluc3RhbGxpbmcgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQi5UaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgICBsb2cud2FybihgQ29uc2lkZXIgaW5jcmVhc2luZyB0aGUgdmFsdWUgb2YgJ2FwcFB1c2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLndhcm4oYEZhbGxpbmcgYmFjayB0byAnJHtJT1NfREVQTE9ZfScgdXNhZ2VgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpbnN0YWxsV2l0aElvc0RlcGxveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5zdGFsbCAnJHthcHB9JzpcXG5gICtcbiAgICAgICAgICAgIGAgIC0gJHtlcnIubWVzc2FnZX1cXG5gICtcbiAgICAgICAgICAgIGAgIC0gJHtlcnIxLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFmY1NlcnZpY2UuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmluZm8oYEFwcCBpbnN0YWxsYXRpb24gc3VjY2VlZGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gIH1cblxuICBhc3luYyBpbnN0YWxsT3JVcGdyYWRlQXBwbGljYXRpb24gKGJ1bmRsZVBhdGhPblBob25lLCBpc1VwZ3JhZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydE5vdGlmaWNhdGlvblByb3h5U2VydmljZSh0aGlzLnVkaWQpO1xuICAgIGNvbnN0IGluc3RhbGxhdGlvblNlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSh0aGlzLnVkaWQpO1xuICAgIGNvbnN0IGFwcEluc3RhbGxlZE5vdGlmaWNhdGlvbiA9IG5ldyBCKChyZXNvbHZlKSA9PiB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlLm9ic2VydmVOb3RpZmljYXRpb24oQVBQTElDQVRJT05fSU5TVEFMTEVEX05PVElGSUNBVElPTiwge1xuICAgICAgICBub3RpZmljYXRpb246IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudE9wdGlvbnMgPSB7UGFja2FnZVR5cGU6ICdEZXZlbG9wZXInfTtcbiAgICB0cnkge1xuICAgICAgaWYgKGlzVXBncmFkZSkge1xuICAgICAgICBsb2cuZGVidWcoYEFuIHVwZ3JhZGUgb2YgdGhlIGV4aXN0aW5nIGFwcGxpY2F0aW9uIGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZGApO1xuICAgICAgICBhd2FpdCBpbnN0YWxsYXRpb25TZXJ2aWNlLnVwZ3JhZGVBcHBsaWNhdGlvbihidW5kbGVQYXRoT25QaG9uZSwgY2xpZW50T3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoYEEgbmV3IGFwcGxpY2F0aW9uIGluc3RhbGxhdGlvbiBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWRgKTtcbiAgICAgICAgYXdhaXQgaW5zdGFsbGF0aW9uU2VydmljZS5pbnN0YWxsQXBwbGljYXRpb24oYnVuZGxlUGF0aE9uUGhvbmUsIGNsaWVudE9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwSW5zdGFsbGVkTm90aWZpY2F0aW9uLnRpbWVvdXQoQVBQTElDQVRJT05fTk9USUZJQ0FUSU9OX1RJTUVPVVRfTVMsXG4gICAgICAgICAgYENvdWxkIG5vdCBnZXQgdGhlIGFwcGxpY2F0aW9uIGluc3RhbGxlZCBub3RpZmljYXRpb24gd2l0aGluIGAgK1xuICAgICAgICAgIGAke0FQUExJQ0FUSU9OX05PVElGSUNBVElPTl9USU1FT1VUX01TfW1zIGJ1dCB3ZSB3aWxsIGNvbnRpbnVlYCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uLiBFcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluc3RhbGxhdGlvblNlcnZpY2UuY2xvc2UoKTtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnN0YWxsQXBwICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbCguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXBwbGljYXRpb24gb2JqZWN0IGlmIHRlc3QgYXBwIGhhcyAnYnVuZGxlaWQnLlxuICAgKiBUaGUgdGFyZ2V0IGJ1bmRsZWlkIGNhbiBiZSBVc2VyIGFuZCBTeXN0ZW0gYXBwcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZWlkIFRoZSBidW5kbGVJZCB0byBlbnN1cmUgaXQgaXMgaW5zdGFsbGVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgVHJ1ZSBpZiB0aGUgYnVuZGxlaWQgZXhpc3RzIGluIHRoZSByZXN1bHQgb2YgJ2xpc3RBcHBsaWNhdGlvbnMnIGxpa2U6XG4gICAqIHsgXCJjb20uYXBwbGUuUHJlZmVyZW5jZXNcIjp7XG4gICAqICAgXCJVSVJlcXVpcmVkRGV2aWNlQ2FwYWJpbGl0aWVzXCI6W1wiYXJtNjRcIl0sXG4gICAqICAgXCJVSVJlcXVpcmVzRnVsbFNjcmVlblwiOnRydWUsXG4gICAqICAgXCJDRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvblwiOlwiNi4wXCIsXG4gICAqICAgXCJFbnRpdGxlbWVudHNcIjpcbiAgICogICAgIHtcImNvbS5hcHBsZS5mcm9udGJvYXJkLmRlbGV0ZS1hcHBsaWNhdGlvbi1zbmFwc2hvdHNcIjp0cnVlLC4uXG4gICAqL1xuICBhc3luYyBpc0FwcEluc3RhbGxlZCAoYnVuZGxlaWQpIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnRJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UodGhpcy51ZGlkKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwbGljYXRpb25zID0gYXdhaXQgc2VydmljZS5sb29rdXBBcHBsaWNhdGlvbnMoeyBidW5kbGVJZHM6IGJ1bmRsZWlkIH0pO1xuICAgICAgcmV0dXJuICEhYXBwbGljYXRpb25zW2J1bmRsZWlkXTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VydmljZS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlTmFtZSBUaGUgbmFtZSBvZiBDRkJ1bmRsZU5hbWUgaW4gSW5mby5wbGlzdFxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQSBsaXN0IG9mIFVzZXIgbGV2ZWwgYXBwcycgYnVuZGxlIGlkcyB3aGljaCBoYXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICdDRkJ1bmRsZU5hbWUnIGF0dHJpYnV0ZSBhcyAnYnVuZGxlTmFtZScuXG4gICAqL1xuICBhc3luYyBnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIChidW5kbGVOYW1lKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IGF3YWl0IHNlcnZpY2VzLnN0YXJ0SW5zdGFsbGF0aW9uUHJveHlTZXJ2aWNlKHRoaXMudWRpZCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwcGxpY2F0aW9ucyA9IGF3YWl0IHNlcnZpY2UubGlzdEFwcGxpY2F0aW9ucyh7YXBwbGljYXRpb25UeXBlOiAnVXNlcid9KTtcbiAgICAgIHJldHVybiBfLnJlZHVjZShhcHBsaWNhdGlvbnMsIChhY2MsIHtDRkJ1bmRsZU5hbWV9LCBrZXkpID0+IHtcbiAgICAgICAgaWYgKENGQnVuZGxlTmFtZSA9PT0gYnVuZGxlTmFtZSkge1xuICAgICAgICAgIGFjYy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VydmljZS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHV0aWxpdGllcy5nZXRPU1ZlcnNpb24odGhpcy51ZGlkKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJT1NEZXBsb3k7XG4iXSwiZmlsZSI6ImxpYi9pb3MtZGVwbG95LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -39,33 +39,62 @@ async function pullFile(afcService, remotePath) {
39
39
  return Buffer.concat(buffers);
40
40
  }
41
41
 
42
+ async function folderExists(folderPath) {
43
+ try {
44
+ return (await _appiumSupport.fs.stat(folderPath)).isDirectory();
45
+ } catch (e) {
46
+ return false;
47
+ }
48
+ }
49
+
42
50
  async function pullFolder(afcService, remoteRootPath) {
43
51
  const tmpFolder = await _appiumSupport.tempDir.openDir();
44
52
 
45
53
  try {
54
+ let localTopItem = null;
55
+ let countFilesSuccess = 0;
56
+ let countFilesFail = 0;
57
+ let countFolders = 0;
46
58
  const pullPromises = [];
47
- await afcService.walkDir(remoteRootPath, true, async (itemPath, isDir) => {
48
- const pathOnServer = _path.default.join(tmpFolder, itemPath);
59
+ await afcService.walkDir(remoteRootPath, true, async (remotePath, isDir) => {
60
+ const localPath = _path.default.join(tmpFolder, remotePath);
61
+
62
+ const dirname = isDir ? localPath : _path.default.dirname(localPath);
63
+
64
+ if (!(await folderExists(dirname))) {
65
+ await (0, _appiumSupport.mkdirp)(dirname);
66
+ }
67
+
68
+ if (!localTopItem || localPath.split(_path.default.sep).length < localTopItem.split(_path.default.sep).length) {
69
+ localTopItem = localPath;
70
+ }
49
71
 
50
72
  if (isDir) {
51
- await (0, _appiumSupport.mkdirp)(pathOnServer);
73
+ ++countFolders;
52
74
  return;
53
75
  }
54
76
 
55
- const readStream = await afcService.createReadStream(itemPath, {
77
+ const readStream = await afcService.createReadStream(remotePath, {
56
78
  autoDestroy: true
57
79
  });
58
80
 
59
- const writeStream = _appiumSupport.fs.createWriteStream(pathOnServer, {
81
+ const writeStream = _appiumSupport.fs.createWriteStream(localPath, {
60
82
  autoClose: true
61
83
  });
62
84
 
63
- pullPromises.push(new _bluebird.default((resolve, reject) => {
64
- writeStream.on('close', resolve);
85
+ pullPromises.push(new _bluebird.default(resolve => {
86
+ writeStream.on('close', () => {
87
+ ++countFilesSuccess;
88
+ resolve();
89
+ });
65
90
 
66
91
  const onStreamingError = e => {
67
92
  readStream.unpipe(writeStream);
68
- reject(e);
93
+
94
+ _logger.default.warn(`Cannot pull '${remotePath}' to '${localPath}'. ` + `The file will be skipped. Original error: ${e.message}`);
95
+
96
+ ++countFilesFail;
97
+ resolve();
69
98
  };
70
99
 
71
100
  writeStream.on('error', onStreamingError);
@@ -79,8 +108,14 @@ async function pullFolder(afcService, remoteRootPath) {
79
108
 
80
109
  _lodash.default.remove(pullPromises, p => p.isFulfilled());
81
110
  });
82
- await _bluebird.default.all(pullPromises);
83
- return await _appiumSupport.zip.toInMemoryZip(tmpFolder, {
111
+
112
+ if (!_lodash.default.isEmpty(pullPromises)) {
113
+ await _bluebird.default.all(pullPromises);
114
+ }
115
+
116
+ _logger.default.info(`Pulled ${_appiumSupport.util.pluralize('file', countFilesSuccess, true)} out of ` + `${countFilesSuccess + countFilesFail} and ${_appiumSupport.util.pluralize('folder', countFolders, true)} ` + `from '${remoteRootPath}'`);
117
+
118
+ return await _appiumSupport.zip.toInMemoryZip(localTopItem ? _path.default.dirname(localTopItem) : tmpFolder, {
84
119
  encodeToBase64: true
85
120
  });
86
121
  } finally {
@@ -232,4 +267,4 @@ async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}) {
232
267
  }require('source-map-support').install();
233
268
 
234
269
 
235
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZnMtaGVscGVycy5qcyJdLCJuYW1lcyI6WyJJT19USU1FT1VUX01TIiwiTUFYX0lPX0NIVU5LX1NJWkUiLCJwdWxsRmlsZSIsImFmY1NlcnZpY2UiLCJyZW1vdGVQYXRoIiwic3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImF1dG9EZXN0cm95IiwicHVsbFByb21pc2UiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidGltZW91dCIsImJ1ZmZlcnMiLCJkYXRhIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsInB1bGxGb2xkZXIiLCJyZW1vdGVSb290UGF0aCIsInRtcEZvbGRlciIsInRlbXBEaXIiLCJvcGVuRGlyIiwicHVsbFByb21pc2VzIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXIiLCJwYXRoT25TZXJ2ZXIiLCJwYXRoIiwiam9pbiIsInJlYWRTdHJlYW0iLCJ3cml0ZVN0cmVhbSIsImZzIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJhdXRvQ2xvc2UiLCJvblN0cmVhbWluZ0Vycm9yIiwiZSIsInVucGlwZSIsInBpcGUiLCJsZW5ndGgiLCJhbnkiLCJfIiwicmVtb3ZlIiwicCIsImlzRnVsZmlsbGVkIiwiYWxsIiwiemlwIiwidG9Jbk1lbW9yeVppcCIsImVuY29kZVRvQmFzZTY0IiwicmltcmFmIiwicmVtb3RlTWtkaXJwIiwicmVtb3RlUm9vdCIsImxpc3REaXJlY3RvcnkiLCJkaXJuYW1lIiwiY3JlYXRlRGlyZWN0b3J5IiwicHVzaEZpbGUiLCJiYXNlNjREYXRhIiwicHVzaEVycm9yIiwicHVzaFByb21pc2UiLCJ3cml0ZSIsImZyb20iLCJlbmQiLCJwdXNoRm9sZGVyIiwic3JjUm9vdFBhdGgiLCJkc3RSb290UGF0aCIsIm9wdHMiLCJ0aW1lb3V0TXMiLCJlbmFibGVQYXJhbGxlbFB1c2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJpdGVtc1RvUHVzaCIsImdsb2IiLCJjd2QiLCJub3NvcnQiLCJtYXJrIiwibG9nIiwiZGVidWciLCJmb2xkZXJzVG9QdXNoIiwiZmlsZXNUb1B1c2giLCJyZWR1Y2UiLCJhY2MiLCJ4IiwiZW5kc1dpdGgiLCJzZXAiLCJ1dGlsIiwicGx1cmFsaXplIiwiZGVsZXRlRGlyZWN0b3J5IiwiaWduIiwiZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJyZWxhdGl2ZUZvbGRlclBhdGgiLCJhYnNvbHV0ZUZvbGRlclBhdGgiLCJ0cmltRW5kIiwicmVsYXRpdmVQYXRoIiwiYWJzb2x1dGVTb3VyY2VQYXRoIiwiYWJzb2x1dGVEZXN0aW5hdGlvblBhdGgiLCJkZXN0cm95IiwiZmlsZVB1c2hQcm9taXNlIiwib25TdHJlYW1FcnJvciIsInB1c2hQcm9taXNlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJzaHVmZmxlIiwiaXNFbXB0eSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxJQUFJLEVBQUosR0FBUyxJQUEvQjtBQUdBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCOztBQVVBLGVBQWVDLFFBQWYsQ0FBeUJDLFVBQXpCLEVBQXFDQyxVQUFyQyxFQUFpRDtBQUMvQyxRQUFNQyxNQUFNLEdBQUcsTUFBTUYsVUFBVSxDQUFDRyxnQkFBWCxDQUE0QkYsVUFBNUIsRUFBd0M7QUFBRUcsSUFBQUEsV0FBVyxFQUFFO0FBQWYsR0FBeEMsQ0FBckI7QUFDQSxRQUFNQyxXQUFXLEdBQUcsSUFBSUMsaUJBQUosQ0FBTSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDN0NOLElBQUFBLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLE9BQVYsRUFBbUJGLE9BQW5CO0FBQ0FMLElBQUFBLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLE9BQVYsRUFBbUJELE1BQW5CO0FBQ0QsR0FIbUIsRUFHakJFLE9B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RDtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBta2RpcnAsIHppcCwgdXRpbCwgdGltaW5nIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgSU9fVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG4vLyBNb2JpbGUgZGV2aWNlcyB1c2UgTkFORCBtZW1vcnkgbW9kdWxlcyBmb3IgdGhlIHN0b3JhZ2UsXG4vLyBhbmQgdGhlIHBhcmFsbGVsaXNtIHRoZXJlIGlzIG5vdCBhcyBwZXJmb3JtYW50IGFzIG9uIHJlZ3VsYXIgU1NEc1xuY29uc3QgTUFYX0lPX0NIVU5LX1NJWkUgPSA4O1xuXG4vKipcbiAqIFJldHJpZXZlIGEgZmlsZSBmcm9tIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggUmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgZGV2aWNlXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBUaGUgZmlsZSBjb250ZW50IGFzIGEgYnVmZmVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChhZmNTZXJ2aWNlLCByZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlUmVhZFN0cmVhbShyZW1vdGVQYXRoLCB7IGF1dG9EZXN0cm95OiB0cnVlIH0pO1xuICBjb25zdCBwdWxsUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzdHJlYW0ub24oJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pLnRpbWVvdXQoSU9fVElNRU9VVF9NUyk7XG4gIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgc3RyZWFtLm9uKCdkYXRhJywgKGRhdGEpID0+IGJ1ZmZlcnMucHVzaChkYXRhKSk7XG4gIGF3YWl0IHB1bGxQcm9taXNlO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBhIGZvbGRlciBmcm9tIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVJvb3RQYXRoIFJlbGF0aXZlIHBhdGggdG8gdGhlIGZvbGRlciBvbiB0aGUgZGV2aWNlXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBUaGUgZm9sZGVyIGNvbnRlbnQgYXMgYSB6aXBwZWQgYmFzZTY0LWVuY29kZWQgYnVmZmVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGb2xkZXIgKGFmY1NlcnZpY2UsIHJlbW90ZVJvb3RQYXRoKSB7XG4gIGNvbnN0IHRtcEZvbGRlciA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGNvbnN0IHB1bGxQcm9taXNlcyA9IFtdO1xuICAgIGF3YWl0IGFmY1NlcnZpY2Uud2Fsa0RpcihyZW1vdGVSb290UGF0aCwgdHJ1ZSwgYXN5bmMgKGl0ZW1QYXRoLCBpc0RpcikgPT4ge1xuICAgICAgY29uc3QgcGF0aE9uU2VydmVyID0gcGF0aC5qb2luKHRtcEZvbGRlciwgaXRlbVBhdGgpO1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGF3YWl0IG1rZGlycChwYXRoT25TZXJ2ZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVJlYWRTdHJlYW0oaXRlbVBhdGgsIHthdXRvRGVzdHJveTogdHJ1ZX0pO1xuICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShwYXRoT25TZXJ2ZXIsIHthdXRvQ2xvc2U6IHRydWV9KTtcbiAgICAgIHB1bGxQcm9taXNlcy5wdXNoKG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgIGNvbnN0IG9uU3RyZWFtaW5nRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH07XG4gICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtaW5nRXJyb3IpO1xuICAgICAgICByZWFkU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtaW5nRXJyb3IpO1xuICAgICAgfSkudGltZW91dChJT19USU1FT1VUX01TKSk7XG4gICAgICByZWFkU3RyZWFtLnBpcGUod3JpdGVTdHJlYW0pO1xuICAgICAgaWYgKHB1bGxQcm9taXNlcy5sZW5ndGggPj0gTUFYX0lPX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgYXdhaXQgQi5hbnkocHVsbFByb21pc2VzKTtcbiAgICAgIH1cbiAgICAgIF8ucmVtb3ZlKHB1bGxQcm9taXNlcywgKHApID0+IHAuaXNGdWxmaWxsZWQoKSk7XG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNodW5rc1xuICAgIGF3YWl0IEIuYWxsKHB1bGxQcm9taXNlcyk7XG4gICAgcmV0dXJuIGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHRtcEZvbGRlciwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcEZvbGRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHJlbW90ZSBmb2xkZXIgcGF0aCByZWN1cnNpdmVseS4gTm9vcCBpZiB0aGUgZ2l2ZW4gcGF0aFxuICogYWxyZWFkeSBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVJvb3QgVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJlbW90ZSBmb2xkZXIgc3RydWN0dXJlXG4gKiB0byBiZSBjcmVhdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW90ZU1rZGlycCAoYWZjU2VydmljZSwgcmVtb3RlUm9vdCkge1xuICBpZiAocmVtb3RlUm9vdCA9PT0gJy4nIHx8IHJlbW90ZVJvb3QgPT09ICcvJykge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFmY1NlcnZpY2UubGlzdERpcmVjdG9yeShyZW1vdGVSb290KTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBtaXNzaW5nIGFuZCB3ZSBnb3QgYW4gb2JqZWN0IG5vdCBmb3VuZCBlcnJvci5cbiAgICAvLyBUaGVyZWZvcmUsIHdlIGFyZSBnb2luZyB0byB0aGUgcGFyZW50XG4gICAgYXdhaXQgcmVtb3RlTWtkaXJwKGFmY1NlcnZpY2UsIHBhdGguZGlybmFtZShyZW1vdGVSb290KSk7XG4gIH1cbiAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkocmVtb3RlUm9vdCk7XG59XG5cbi8qKlxuICogUHVzaGVzIGEgZmlsZSB0byBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGRldmljZS4gVGhlIHJlbW90ZVxuICogZm9sZGVyIHN0cnVjdHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbmVjZXNzYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChhZmNTZXJ2aWNlLCByZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGF3YWl0IHJlbW90ZU1rZGlycChhZmNTZXJ2aWNlLCBwYXRoLmRpcm5hbWUocmVtb3RlUGF0aCkpO1xuICBjb25zdCBzdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVdyaXRlU3RyZWFtKHJlbW90ZVBhdGgsIHthdXRvRGVzdHJveTogdHJ1ZX0pO1xuICBsZXQgcHVzaEVycm9yID0gbnVsbDtcbiAgY29uc3QgcHVzaFByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICBwdXNoRXJyb3IgPSBlO1xuICAgIH0pO1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBpZiAocHVzaEVycm9yKSB7XG4gICAgICAgIHJlamVjdChwdXNoRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KS50aW1lb3V0KElPX1RJTUVPVVRfTVMpO1xuICBzdHJlYW0ud3JpdGUoQnVmZmVyLmZyb20oYmFzZTY0RGF0YSwgJ2Jhc2U2NCcpKTtcbiAgc3RyZWFtLmVuZCgpO1xuICBhd2FpdCBwdXNoUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRm9sZGVyT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzI0MDAwMF0gVGhlIG1heGltdW0gdGltZW91dCB0byB3YWl0IHVudGlsIGFcbiAqIHNpbmdsZSBmaWxlIGlzIGNvcGllZFxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVQYXJhbGxlbFB1c2ggW2ZhbHNlXSBXaGV0aGVyIHRvIHB1c2ggZmlsZXMgaW4gcGFyYWxsZWwuXG4gKiBUaGlzIHVzdWFsbHkgZ2l2ZXMgYmV0dGVyIHBlcmZvcm1hbmNlLCBidXQgbWlnaHQgc29tZXRpbWVzIGJlIGxlc3Mgc3RhYmxlLlxuICovXG5cbi8qKlxuICogUHVzaGVzIGEgZm9sZGVyIHRvIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1Jvb3RQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBmb2xkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBkc3RSb290UGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyLiBUaGUgZm9sZGVyXG4gKiB3aWxsIGJlIGRlbGV0ZWQgaWYgYWxyZWFkeSBleGlzdHMuXG4gKiBAcGFyYW0ge1B1c2hGb2xkZXJPcHRpb25zfSBvcHRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1c2hGb2xkZXIgKGFmY1NlcnZpY2UsIHNyY1Jvb3RQYXRoLCBkc3RSb290UGF0aCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aW1lb3V0TXMgPSBJT19USU1FT1VUX01TLFxuICAgIGVuYWJsZVBhcmFsbGVsUHVzaCA9IGZhbHNlLFxuICB9ID0gb3B0cztcblxuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICBjb25zdCBpdGVtc1RvUHVzaCA9IGF3YWl0IGZzLmdsb2IoJyoqJywge1xuICAgIGN3ZDogc3JjUm9vdFBhdGgsXG4gICAgbm9zb3J0OiB0cnVlLFxuICAgIG1hcms6IHRydWUsXG4gIH0pO1xuICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSBzY2FubmVkIHRoZSB0cmVlIHN0cnVjdHVyZSBvZiAnJHtzcmNSb290UGF0aH0nYCk7XG4gIGNvbnN0IFtmb2xkZXJzVG9QdXNoLCBmaWxlc1RvUHVzaF0gPSBpdGVtc1RvUHVzaC5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgIGFjY1tfLmVuZHNXaXRoKHgsIHBhdGguc2VwKSA/IDAgOiAxXS5wdXNoKHgpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIFtbXSwgW11dKTtcbiAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZm9sZGVyJywgZm9sZGVyc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBhbmQgYCArXG4gICAgYCR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBmaWxlc1RvUHVzaC5sZW5ndGgsIHRydWUpfSB0byBwdXNoYCk7XG4gIC8vIGNyZWF0ZSB0aGUgZm9sZGVyIHN0cnVjdHVyZSBmaXJzdFxuICB0cnkge1xuICAgIGF3YWl0IGFmY1NlcnZpY2UuZGVsZXRlRGlyZWN0b3J5KGRzdFJvb3RQYXRoKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuICBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZURpcmVjdG9yeShkc3RSb290UGF0aCk7XG4gIC8vIHRvcC1sZXZlbCBmb2xkZXJzIG11c3QgZ28gZmlyc3RcbiAgY29uc3QgZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5ID0gZm9sZGVyc1RvUHVzaFxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlRm9sZGVyUGF0aCBvZiBmb2xkZXJzVG9QdXNoQnlIaWVyYXJjaHkpIHtcbiAgICAvLyBjcmVhdGVEaXJlY3RvcnkgZG9lcyBub3QgYWNjZXB0IGZvbGRlciBuYW1lcyBlbmRpbmcgd2l0aCBhIHBhdGggc2VwYXJhdG9yXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXJQYXRoID0gXy50cmltRW5kKFxuICAgICAgcGF0aC5qb2luKGRzdFJvb3RQYXRoLCByZWxhdGl2ZUZvbGRlclBhdGgpLCBwYXRoLnNlcFxuICAgICk7XG4gICAgaWYgKGFic29sdXRlRm9sZGVyUGF0aCkge1xuICAgICAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkoYWJzb2x1dGVGb2xkZXJQYXRoKTtcbiAgICB9XG4gIH1cbiAgLy8gZG8gbm90IGZvcmdldCBhYm91dCB0aGUgcm9vdCBmb2xkZXJcbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgY3JlYXRlZCB0aGUgcmVtb3RlIGZvbGRlciBzdHJ1Y3R1cmUgYCArXG4gICAgYCgke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZm9sZGVyc1RvUHVzaC5sZW5ndGggKyAxLCB0cnVlKX0pYCk7XG5cbiAgY29uc3QgcHVzaEZpbGUgPSBhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVTb3VyY2VQYXRoID0gcGF0aC5qb2luKHNyY1Jvb3RQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGFic29sdXRlU291cmNlUGF0aCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGNvbnN0IGFic29sdXRlRGVzdGluYXRpb25QYXRoID0gcGF0aC5qb2luKGRzdFJvb3RQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVXcml0ZVN0cmVhbShhYnNvbHV0ZURlc3RpbmF0aW9uUGF0aCwge1xuICAgICAgYXV0b0Rlc3Ryb3k6IHRydWVcbiAgICB9KTtcbiAgICB3cml0ZVN0cmVhbS5vbignZmluaXNoJywgd3JpdGVTdHJlYW0uZGVzdHJveSk7XG4gICAgbGV0IHB1c2hFcnJvciA9IG51bGw7XG4gICAgY29uc3QgZmlsZVB1c2hQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBpZiAocHVzaEVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHB1c2hFcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9uU3RyZWFtRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICByZWFkU3RyZWFtLnVucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgICAgcHVzaEVycm9yID0gZTtcbiAgICAgIH07XG4gICAgICB3cml0ZVN0cmVhbS5vbignZXJyb3InLCBvblN0cmVhbUVycm9yKTtcbiAgICAgIHJlYWRTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1FcnJvcik7XG4gICAgfSk7XG4gICAgcmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICBhd2FpdCBmaWxlUHVzaFByb21pc2UudGltZW91dCh0aW1lb3V0TXMpO1xuICB9O1xuXG4gIGlmIChlbmFibGVQYXJhbGxlbFB1c2gpIHtcbiAgICBsb2cuZGVidWcoYFByb2NlZWRpbmcgdG8gcGFyYWxsZWwgZmlsZXMgcHVzaCAobWF4ICR7TUFYX0lPX0NIVU5LX1NJWkV9IHdyaXRlcnMpYCk7XG4gICAgY29uc3QgcHVzaFByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZUZpbGVQYXRoIG9mIF8uc2h1ZmZsZShmaWxlc1RvUHVzaCkpIHtcbiAgICAgIHB1c2hQcm9taXNlcy5wdXNoKEIucmVzb2x2ZShwdXNoRmlsZShyZWxhdGl2ZUZpbGVQYXRoKSkpO1xuICAgICAgLy8ga2VlcCB0aGUgcHVzaCBxdWV1ZSBmaWxsZWRcbiAgICAgIGlmIChwdXNoUHJvbWlzZXMubGVuZ3RoID49IE1BWF9JT19DSFVOS19TSVpFKSB7XG4gICAgICAgIGF3YWl0IEIuYW55KHB1c2hQcm9taXNlcyk7XG4gICAgICB9XG4gICAgICBfLnJlbW92ZShwdXNoUHJvbWlzZXMsIChwKSA9PiBwLmlzRnVsZmlsbGVkKCkpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShwdXNoUHJvbWlzZXMpKSB7XG4gICAgICAvLyBoYW5kbGUgdGhlIHJlc3Qgb2YgcHVzaCBwcm9taXNlc1xuICAgICAgYXdhaXQgQi5hbGwocHVzaFByb21pc2VzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmRlYnVnKGBQcm9jZWVkaW5nIHRvIHNlcmlhbCBmaWxlcyBwdXNoYCk7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZUZpbGVQYXRoIG9mIGZpbGVzVG9QdXNoKSB7XG4gICAgICBhd2FpdCBwdXNoRmlsZShyZWxhdGl2ZUZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSBwdXNoZWQgJHt1dGlsLnBsdXJhbGl6ZSgnZm9sZGVyJywgZm9sZGVyc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgYW5kICR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBmaWxlc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgd2l0aGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG59XG5cblxuZXhwb3J0IHsgcHVsbEZpbGUsIHB1bGxGb2xkZXIsIHB1c2hGaWxlLCBwdXNoRm9sZGVyIH07Il0sImZpbGUiOiJsaWIvaW9zLWZzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
270
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZnMtaGVscGVycy5qcyJdLCJuYW1lcyI6WyJJT19USU1FT1VUX01TIiwiTUFYX0lPX0NIVU5LX1NJWkUiLCJwdWxsRmlsZSIsImFmY1NlcnZpY2UiLCJyZW1vdGVQYXRoIiwic3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImF1dG9EZXN0cm95IiwicHVsbFByb21pc2UiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidGltZW91dCIsImJ1ZmZlcnMiLCJkYXRhIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsImZvbGRlckV4aXN0cyIsImZvbGRlclBhdGgiLCJmcyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImUiLCJwdWxsRm9sZGVyIiwicmVtb3RlUm9vdFBhdGgiLCJ0bXBGb2xkZXIiLCJ0ZW1wRGlyIiwib3BlbkRpciIsImxvY2FsVG9wSXRlbSIsImNvdW50RmlsZXNTdWNjZXNzIiwiY291bnRGaWxlc0ZhaWwiLCJjb3VudEZvbGRlcnMiLCJwdWxsUHJvbWlzZXMiLCJ3YWxrRGlyIiwiaXNEaXIiLCJsb2NhbFBhdGgiLCJwYXRoIiwiam9pbiIsImRpcm5hbWUiLCJzcGxpdCIsInNlcCIsImxlbmd0aCIsInJlYWRTdHJlYW0iLCJ3cml0ZVN0cmVhbSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiYXV0b0Nsb3NlIiwib25TdHJlYW1pbmdFcnJvciIsInVucGlwZSIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwicGlwZSIsImFueSIsIl8iLCJyZW1vdmUiLCJwIiwiaXNGdWxmaWxsZWQiLCJpc0VtcHR5IiwiYWxsIiwiaW5mbyIsInV0aWwiLCJwbHVyYWxpemUiLCJ6aXAiLCJ0b0luTWVtb3J5WmlwIiwiZW5jb2RlVG9CYXNlNjQiLCJyaW1yYWYiLCJyZW1vdGVNa2RpcnAiLCJyZW1vdGVSb290IiwibGlzdERpcmVjdG9yeSIsImNyZWF0ZURpcmVjdG9yeSIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsInB1c2hFcnJvciIsInB1c2hQcm9taXNlIiwid3JpdGUiLCJmcm9tIiwiZW5kIiwicHVzaEZvbGRlciIsInNyY1Jvb3RQYXRoIiwiZHN0Um9vdFBhdGgiLCJvcHRzIiwidGltZW91dE1zIiwiZW5hYmxlUGFyYWxsZWxQdXNoIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwiaXRlbXNUb1B1c2giLCJnbG9iIiwiY3dkIiwibm9zb3J0IiwibWFyayIsImRlYnVnIiwiZm9sZGVyc1RvUHVzaCIsImZpbGVzVG9QdXNoIiwicmVkdWNlIiwiYWNjIiwieCIsImVuZHNXaXRoIiwiZGVsZXRlRGlyZWN0b3J5IiwiaWduIiwiZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5Iiwic29ydCIsImEiLCJiIiwicmVsYXRpdmVGb2xkZXJQYXRoIiwiYWJzb2x1dGVGb2xkZXJQYXRoIiwidHJpbUVuZCIsInJlbGF0aXZlUGF0aCIsImFic29sdXRlU291cmNlUGF0aCIsImFic29sdXRlRGVzdGluYXRpb25QYXRoIiwiZGVzdHJveSIsImZpbGVQdXNoUHJvbWlzZSIsIm9uU3RyZWFtRXJyb3IiLCJwdXNoUHJvbWlzZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwic2h1ZmZsZSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxJQUFJLEVBQUosR0FBUyxJQUEvQjtBQUdBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCOztBQVVBLGVBQWVDLFFBQWYsQ0FBeUJDLFVBQXpCLEVBQXFDQyxVQUFyQyxFQUFpRDtBQUMvQyxRQUFNQyxNQUFNLEdBQUcsTUFBTUYsVUFBVSxDQUFDRyxnQkFBWCxDQUE0QkYsVUFBNUIsRUFBd0M7QUFBRUcsSUFBQUEsV0FBVyxFQUFFO0FBQWYsR0FBeEMsQ0FBckI7QUFDQSxRQUFNQyxXQUFXLEdBQUcsSUFBSUMsaUJBQUosQ0FBTSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FB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QWQ7QUFDRDtBQUNGOztBQUVEbkUsa0JBQUk0QyxLQUFKLENBQVcsdUJBQXNCaEMsb0JBQUtDLFNBQUwsQ0FBZSxRQUFmLEVBQXlCZ0MsYUFBYSxDQUFDcEQsTUFBdkMsRUFBK0MsSUFBL0MsQ0FBcUQsR0FBNUUsR0FDUCxPQUFNbUIsb0JBQUtDLFNBQUwsQ0FBZSxNQUFmLEVBQXVCaUMsV0FBVyxDQUFDckQsTUFBbkMsRUFBMkMsSUFBM0MsQ0FBaUQsR0FEaEQsR0FFUCxVQUFTMEMsS0FBSyxDQUFDa0MsV0FBTixHQUFvQkMsY0FBcEIsQ0FBbUNDLE9BQW5DLENBQTJDLENBQTNDLENBQThDLElBRjFEO0FBR0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIG1rZGlycCwgemlwLCB1dGlsLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5jb25zdCBJT19USU1FT1VUX01TID0gNCAqIDYwICogMTAwMDtcbi8vIE1vYmlsZSBkZXZpY2VzIHVzZSBOQU5EIG1lbW9yeSBtb2R1bGVzIGZvciB0aGUgc3RvcmFnZSxcbi8vIGFuZCB0aGUgcGFyYWxsZWxpc20gdGhlcmUgaXMgbm90IGFzIHBlcmZvcm1hbnQgYXMgb24gcmVndWxhciBTU0RzXG5jb25zdCBNQVhfSU9fQ0hVTktfU0laRSA9IDg7XG5cbi8qKlxuICogUmV0cmlldmUgYSBmaWxlIGZyb20gYSByZWFsIGRldmljZVxuICpcbiAqIEBwYXJhbSB7QWZjU2VydmljZX0gYWZjU2VydmljZSBBcHBsZSBGaWxlIENsaWVudCBzZXJ2aWNlIGluc3RhbmNlIGZyb21cbiAqICdhcHBpdW0taW9zLWRldmljZScgbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBkZXZpY2VcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBidWZmZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKGFmY1NlcnZpY2UsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3Qgc3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVSZWFkU3RyZWFtKHJlbW90ZVBhdGgsIHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSk7XG4gIGNvbnN0IHB1bGxQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCByZXNvbHZlKTtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSkudGltZW91dChJT19USU1FT1VUX01TKTtcbiAgY29uc3QgYnVmZmVycyA9IFtdO1xuICBzdHJlYW0ub24oJ2RhdGEnLCAoZGF0YSkgPT4gYnVmZmVycy5wdXNoKGRhdGEpKTtcbiAgYXdhaXQgcHVsbFByb21pc2U7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHByZXNlbmNlIG9mIGEgbG9jYWwgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb2xkZXJQYXRoIEZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgZm9sZGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9sZGVyIGV4aXN0cyBhbmQgaXMgYWN0dWFsbHkgYSBmb2xkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9sZGVyRXhpc3RzIChmb2xkZXJQYXRoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBmcy5zdGF0KGZvbGRlclBhdGgpKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmUgYSBmb2xkZXIgZnJvbSBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVSb290UGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIgb24gdGhlIGRldmljZVxuICogQHJldHVybnMge0J1ZmZlcn0gVGhlIGZvbGRlciBjb250ZW50IGFzIGEgemlwcGVkIGJhc2U2NC1lbmNvZGVkIGJ1ZmZlclxuICovXG5hc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChhZmNTZXJ2aWNlLCByZW1vdGVSb290UGF0aCkge1xuICBjb25zdCB0bXBGb2xkZXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBsZXQgbG9jYWxUb3BJdGVtID0gbnVsbDtcbiAgICBsZXQgY291bnRGaWxlc1N1Y2Nlc3MgPSAwO1xuICAgIGxldCBjb3VudEZpbGVzRmFpbCA9IDA7XG4gICAgbGV0IGNvdW50Rm9sZGVycyA9IDA7XG4gICAgY29uc3QgcHVsbFByb21pc2VzID0gW107XG4gICAgYXdhaXQgYWZjU2VydmljZS53YWxrRGlyKHJlbW90ZVJvb3RQYXRoLCB0cnVlLCBhc3luYyAocmVtb3RlUGF0aCwgaXNEaXIpID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGguam9pbih0bXBGb2xkZXIsIHJlbW90ZVBhdGgpO1xuICAgICAgY29uc3QgZGlybmFtZSA9IGlzRGlyID8gbG9jYWxQYXRoIDogcGF0aC5kaXJuYW1lKGxvY2FsUGF0aCk7XG4gICAgICBpZiAoIWF3YWl0IGZvbGRlckV4aXN0cyhkaXJuYW1lKSkge1xuICAgICAgICBhd2FpdCBta2RpcnAoZGlybmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWxvY2FsVG9wSXRlbVxuICAgICAgICAgIHx8IGxvY2FsUGF0aC5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIDwgbG9jYWxUb3BJdGVtLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpIHtcbiAgICAgICAgbG9jYWxUb3BJdGVtID0gbG9jYWxQYXRoO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgICsrY291bnRGb2xkZXJzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVJlYWRTdHJlYW0ocmVtb3RlUGF0aCwge2F1dG9EZXN0cm95OiB0cnVlfSk7XG4gICAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGxvY2FsUGF0aCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgICAgcHVsbFByb21pc2VzLnB1c2goXG4gICAgICAgIG5ldyBCKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgKytjb3VudEZpbGVzU3VjY2VzcztcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvblN0cmVhbWluZ0Vycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICAgICAgICAgIGxvZy53YXJuKGBDYW5ub3QgcHVsbCAnJHtyZW1vdGVQYXRofScgdG8gJyR7bG9jYWxQYXRofScuIGAgK1xuICAgICAgICAgICAgICBgVGhlIGZpbGUgd2lsbCBiZSBza2lwcGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICArK2NvdW50RmlsZXNGYWlsO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1pbmdFcnJvcik7XG4gICAgICAgICAgcmVhZFN0cmVhbS5vbignZXJyb3InLCBvblN0cmVhbWluZ0Vycm9yKTtcbiAgICAgICAgfSkudGltZW91dChJT19USU1FT1VUX01TKVxuICAgICAgKTtcbiAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgICBpZiAocHVsbFByb21pc2VzLmxlbmd0aCA+PSBNQVhfSU9fQ0hVTktfU0laRSkge1xuICAgICAgICBhd2FpdCBCLmFueShwdWxsUHJvbWlzZXMpO1xuICAgICAgfVxuICAgICAgXy5yZW1vdmUocHVsbFByb21pc2VzLCAocCkgPT4gcC5pc0Z1bGZpbGxlZCgpKTtcbiAgICB9KTtcbiAgICAvLyBXYWl0IGZvciB0aGUgcmVzdCBvZiBmaWxlcyB0byBiZSBwdWxsZWRcbiAgICBpZiAoIV8uaXNFbXB0eShwdWxsUHJvbWlzZXMpKSB7XG4gICAgICBhd2FpdCBCLmFsbChwdWxsUHJvbWlzZXMpO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgUHVsbGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBjb3VudEZpbGVzU3VjY2VzcywgdHJ1ZSl9IG91dCBvZiBgICtcbiAgICAgIGAke2NvdW50RmlsZXNTdWNjZXNzICsgY291bnRGaWxlc0ZhaWx9IGFuZCAke3V0aWwucGx1cmFsaXplKCdmb2xkZXInLCBjb3VudEZvbGRlcnMsIHRydWUpfSBgICtcbiAgICAgIGBmcm9tICcke3JlbW90ZVJvb3RQYXRofSdgKTtcbiAgICByZXR1cm4gYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAobG9jYWxUb3BJdGVtID8gcGF0aC5kaXJuYW1lKGxvY2FsVG9wSXRlbSkgOiB0bXBGb2xkZXIsIHtcbiAgICAgIGVuY29kZVRvQmFzZTY0OiB0cnVlLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBGb2xkZXIpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyByZW1vdGUgZm9sZGVyIHBhdGggcmVjdXJzaXZlbHkuIE5vb3AgaWYgdGhlIGdpdmVuIHBhdGhcbiAqIGFscmVhZHkgZXhpc3RzXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVSb290IFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyIHN0cnVjdHVyZVxuICogdG8gYmUgY3JlYXRlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdGVNa2RpcnAgKGFmY1NlcnZpY2UsIHJlbW90ZVJvb3QpIHtcbiAgaWYgKHJlbW90ZVJvb3QgPT09ICcuJyB8fCByZW1vdGVSb290ID09PSAnLycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBhZmNTZXJ2aWNlLmxpc3REaXJlY3RvcnkocmVtb3RlUm9vdCk7XG4gICAgcmV0dXJuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbWlzc2luZyBhbmQgd2UgZ290IGFuIG9iamVjdCBub3QgZm91bmQgZXJyb3IuXG4gICAgLy8gVGhlcmVmb3JlLCB3ZSBhcmUgZ29pbmcgdG8gdGhlIHBhcmVudFxuICAgIGF3YWl0IHJlbW90ZU1rZGlycChhZmNTZXJ2aWNlLCBwYXRoLmRpcm5hbWUocmVtb3RlUm9vdCkpO1xuICB9XG4gIGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlRGlyZWN0b3J5KHJlbW90ZVJvb3QpO1xufVxuXG4vKipcbiAqIFB1c2hlcyBhIGZpbGUgdG8gYSByZWFsIGRldmljZVxuICpcbiAqIEBwYXJhbSB7QWZjU2VydmljZX0gYWZjU2VydmljZSBBcHBsZSBGaWxlIENsaWVudCBzZXJ2aWNlIGluc3RhbmNlIGZyb21cbiAqICdhcHBpdW0taW9zLWRldmljZScgbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFRoZSByZW1vdGVcbiAqIGZvbGRlciBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjREYXRhIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlblxuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAoYWZjU2VydmljZSwgcmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBhd2FpdCByZW1vdGVNa2RpcnAoYWZjU2VydmljZSwgcGF0aC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgY29uc3Qgc3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVXcml0ZVN0cmVhbShyZW1vdGVQYXRoLCB7YXV0b0Rlc3Ryb3k6IHRydWV9KTtcbiAgbGV0IHB1c2hFcnJvciA9IG51bGw7XG4gIGNvbnN0IHB1c2hQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcHVzaEVycm9yID0gZTtcbiAgICB9KTtcbiAgICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgaWYgKHB1c2hFcnJvcikge1xuICAgICAgICByZWplY3QocHVzaEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkudGltZW91dChJT19USU1FT1VUX01TKTtcbiAgc3RyZWFtLndyaXRlKEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKSk7XG4gIHN0cmVhbS5lbmQoKTtcbiAgYXdhaXQgcHVzaFByb21pc2U7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVzaEZvbGRlck9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyNDAwMDBdIFRoZSBtYXhpbXVtIHRpbWVvdXQgdG8gd2FpdCB1bnRpbCBhXG4gKiBzaW5nbGUgZmlsZSBpcyBjb3BpZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlUGFyYWxsZWxQdXNoIFtmYWxzZV0gV2hldGhlciB0byBwdXNoIGZpbGVzIGluIHBhcmFsbGVsLlxuICogVGhpcyB1c3VhbGx5IGdpdmVzIGJldHRlciBwZXJmb3JtYW5jZSwgYnV0IG1pZ2h0IHNvbWV0aW1lcyBiZSBsZXNzIHN0YWJsZS5cbiAqL1xuXG4vKipcbiAqIFB1c2hlcyBhIGZvbGRlciB0byBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNSb290UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2UgZm9sZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gZHN0Um9vdFBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4gVGhlIGZvbGRlclxuICogd2lsbCBiZSBkZWxldGVkIGlmIGFscmVhZHkgZXhpc3RzLlxuICogQHBhcmFtIHtQdXNoRm9sZGVyT3B0aW9uc30gb3B0c1xuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRm9sZGVyIChhZmNTZXJ2aWNlLCBzcmNSb290UGF0aCwgZHN0Um9vdFBhdGgsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZW91dE1zID0gSU9fVElNRU9VVF9NUyxcbiAgICBlbmFibGVQYXJhbGxlbFB1c2ggPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgY29uc3QgaXRlbXNUb1B1c2ggPSBhd2FpdCBmcy5nbG9iKCcqKicsIHtcbiAgICBjd2Q6IHNyY1Jvb3RQYXRoLFxuICAgIG5vc29ydDogdHJ1ZSxcbiAgICBtYXJrOiB0cnVlLFxuICB9KTtcbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgc2Nhbm5lZCB0aGUgdHJlZSBzdHJ1Y3R1cmUgb2YgJyR7c3JjUm9vdFBhdGh9J2ApO1xuICBjb25zdCBbZm9sZGVyc1RvUHVzaCwgZmlsZXNUb1B1c2hdID0gaXRlbXNUb1B1c2gucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICBhY2NbXy5lbmRzV2l0aCh4LCBwYXRoLnNlcCkgPyAwIDogMV0ucHVzaCh4KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbW10sIFtdXSk7XG4gIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2ZvbGRlcicsIGZvbGRlcnNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYW5kIGAgK1xuICAgIGAke3V0aWwucGx1cmFsaXplKCdmaWxlJywgZmlsZXNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gdG8gcHVzaGApO1xuICAvLyBjcmVhdGUgdGhlIGZvbGRlciBzdHJ1Y3R1cmUgZmlyc3RcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZmNTZXJ2aWNlLmRlbGV0ZURpcmVjdG9yeShkc3RSb290UGF0aCk7XG4gIH0gY2F0Y2ggKGlnbikge31cbiAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkoZHN0Um9vdFBhdGgpO1xuICAvLyB0b3AtbGV2ZWwgZm9sZGVycyBtdXN0IGdvIGZpcnN0XG4gIGNvbnN0IGZvbGRlcnNUb1B1c2hCeUhpZXJhcmNoeSA9IGZvbGRlcnNUb1B1c2hcbiAgICAuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZUZvbGRlclBhdGggb2YgZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5KSB7XG4gICAgLy8gY3JlYXRlRGlyZWN0b3J5IGRvZXMgbm90IGFjY2VwdCBmb2xkZXIgbmFtZXMgZW5kaW5nIHdpdGggYSBwYXRoIHNlcGFyYXRvclxuICAgIGNvbnN0IGFic29sdXRlRm9sZGVyUGF0aCA9IF8udHJpbUVuZChcbiAgICAgIHBhdGguam9pbihkc3RSb290UGF0aCwgcmVsYXRpdmVGb2xkZXJQYXRoKSwgcGF0aC5zZXBcbiAgICApO1xuICAgIGlmIChhYnNvbHV0ZUZvbGRlclBhdGgpIHtcbiAgICAgIGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlRGlyZWN0b3J5KGFic29sdXRlRm9sZGVyUGF0aCk7XG4gICAgfVxuICB9XG4gIC8vIGRvIG5vdCBmb3JnZXQgYWJvdXQgdGhlIHJvb3QgZm9sZGVyXG4gIGxvZy5kZWJ1ZyhgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgdGhlIHJlbW90ZSBmb2xkZXIgc3RydWN0dXJlIGAgK1xuICAgIGAoJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGZvbGRlcnNUb1B1c2gubGVuZ3RoICsgMSwgdHJ1ZSl9KWApO1xuXG4gIGNvbnN0IHB1c2hGaWxlID0gYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGNvbnN0IGFic29sdXRlU291cmNlUGF0aCA9IHBhdGguam9pbihzcmNSb290UGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShhYnNvbHV0ZVNvdXJjZVBhdGgsIHthdXRvQ2xvc2U6IHRydWV9KTtcbiAgICBjb25zdCBhYnNvbHV0ZURlc3RpbmF0aW9uUGF0aCA9IHBhdGguam9pbihkc3RSb290UGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlV3JpdGVTdHJlYW0oYWJzb2x1dGVEZXN0aW5hdGlvblBhdGgsIHtcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlXG4gICAgfSk7XG4gICAgd3JpdGVTdHJlYW0ub24oJ2ZpbmlzaCcsIHdyaXRlU3RyZWFtLmRlc3Ryb3kpO1xuICAgIGxldCBwdXNoRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGZpbGVQdXNoUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdyaXRlU3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKHB1c2hFcnJvcikge1xuICAgICAgICAgIHJlamVjdChwdXNoRXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBvblN0cmVhbUVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVhZFN0cmVhbS51bnBpcGUod3JpdGVTdHJlYW0pO1xuICAgICAgICBsb2cuZGVidWcoZSk7XG4gICAgICAgIHB1c2hFcnJvciA9IGU7XG4gICAgICB9O1xuICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1FcnJvcik7XG4gICAgICByZWFkU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtRXJyb3IpO1xuICAgIH0pO1xuICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgYXdhaXQgZmlsZVB1c2hQcm9taXNlLnRpbWVvdXQodGltZW91dE1zKTtcbiAgfTtcblxuICBpZiAoZW5hYmxlUGFyYWxsZWxQdXNoKSB7XG4gICAgbG9nLmRlYnVnKGBQcm9jZWVkaW5nIHRvIHBhcmFsbGVsIGZpbGVzIHB1c2ggKG1heCAke01BWF9JT19DSFVOS19TSVpFfSB3cml0ZXJzKWApO1xuICAgIGNvbnN0IHB1c2hQcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmVGaWxlUGF0aCBvZiBfLnNodWZmbGUoZmlsZXNUb1B1c2gpKSB7XG4gICAgICBwdXNoUHJvbWlzZXMucHVzaChCLnJlc29sdmUocHVzaEZpbGUocmVsYXRpdmVGaWxlUGF0aCkpKTtcbiAgICAgIC8vIGtlZXAgdGhlIHB1c2ggcXVldWUgZmlsbGVkXG4gICAgICBpZiAocHVzaFByb21pc2VzLmxlbmd0aCA+PSBNQVhfSU9fQ0hVTktfU0laRSkge1xuICAgICAgICBhd2FpdCBCLmFueShwdXNoUHJvbWlzZXMpO1xuICAgICAgfVxuICAgICAgXy5yZW1vdmUocHVzaFByb21pc2VzLCAocCkgPT4gcC5pc0Z1bGZpbGxlZCgpKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkocHVzaFByb21pc2VzKSkge1xuICAgICAgLy8gaGFuZGxlIHRoZSByZXN0IG9mIHB1c2ggcHJvbWlzZXNcbiAgICAgIGF3YWl0IEIuYWxsKHB1c2hQcm9taXNlcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgUHJvY2VlZGluZyB0byBzZXJpYWwgZmlsZXMgcHVzaGApO1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmVGaWxlUGF0aCBvZiBmaWxlc1RvUHVzaCkge1xuICAgICAgYXdhaXQgcHVzaEZpbGUocmVsYXRpdmVGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcHVzaGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZvbGRlcicsIGZvbGRlcnNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgYGFuZCAke3V0aWwucGx1cmFsaXplKCdmaWxlJywgZmlsZXNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgYHdpdGhpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xufVxuXG5cbmV4cG9ydCB7IHB1bGxGaWxlLCBwdWxsRm9sZGVyLCBwdXNoRmlsZSwgcHVzaEZvbGRlciB9OyJdLCJmaWxlIjoibGliL2lvcy1mcy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -68,6 +68,11 @@ class ScreenRecorder {
68
68
 
69
69
  const args = [
70
70
  '-f', 'mjpeg',
71
+ // https://github.com/appium/appium/issues/16294
72
+ '-reconnect', '1',
73
+ '-reconnect_at_eof', '1',
74
+ '-reconnect_streamed', '1',
75
+ '-reconnect_delay_max', `${timeoutMs / 1000 + 1}`,
71
76
  ];
72
77
  //Parameter `-r` is optional. See details: https://github.com/appium/appium/issues/12067
73
78
  if (videoFps && videoType === 'libx264') {
@@ -37,6 +37,12 @@ const INVISIBLE = 'invisible';
37
37
  const DETECT = 'detect';
38
38
  const VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];
39
39
 
40
+ // The position of Safari's tab (search bar).
41
+ // Since iOS 15, the bar is the bottom by default.
42
+ const TAB_BAR_POSITION_TOP = 'top';
43
+ const TAB_BAR_POSITION_BOTTOM = 'bottom';
44
+ const TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];
45
+
40
46
  const commands = {}, helpers = {}, extensions = {};
41
47
 
42
48
  function isValidElementIdentifier (id) {
@@ -356,14 +362,20 @@ extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWe
356
362
  let topOffset = 0;
357
363
  let bottomOffset = 0;
358
364
 
365
+ const isIphone = await this.getSafariIsIphone();
366
+
359
367
  // No need to check whether the Smart App Banner or Tab Bar is visible or not
360
368
  // if already defined by nativeWebTapTabBarVisibility or nativeWebTapSmartAppBannerVisibility in settings.
361
369
  const {
362
370
  nativeWebTapTabBarVisibility,
363
- nativeWebTapSmartAppBannerVisibility
371
+ nativeWebTapSmartAppBannerVisibility,
372
+ safariTabBarPosition = util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone
373
+ ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP,
364
374
  } = await this.settings.getSettings();
365
375
  let tabBarVisibility = _.lowerCase(nativeWebTapTabBarVisibility);
366
376
  let bannerVisibility = _.lowerCase(nativeWebTapSmartAppBannerVisibility);
377
+ const tabBarPosition = _.lowerCase(safariTabBarPosition);
378
+
367
379
  if (!VISIBILITIES.includes(tabBarVisibility)) {
368
380
  tabBarVisibility = DETECT;
369
381
  }
@@ -371,7 +383,11 @@ extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWe
371
383
  bannerVisibility = DETECT;
372
384
  }
373
385
 
374
- const isIphone = await this.getSafariIsIphone();
386
+ if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {
387
+ throw new errors.InvalidArgumentError(
388
+ `${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);
389
+ }
390
+
375
391
  const isNotched = isIphone && await this.getSafariIsNotched();
376
392
 
377
393
  const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';
@@ -395,7 +411,9 @@ extensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWe
395
411
  topOffset = 0;
396
412
  }
397
413
  } else {
398
- topOffset = IPHONE_TOP_BAR_HEIGHT + notchOffset;
414
+ topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;
415
+ topOffset += notchOffset;
416
+ log.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);
399
417
 
400
418
  if (isIphone) {
401
419
  if (orientation === 'PORTRAIT') {
package/lib/ios-deploy.js CHANGED
@@ -126,8 +126,8 @@ class IOSDeploy {
126
126
  }
127
127
  }
128
128
 
129
- async installApp (app, timeout) {
130
- await this.install(app, timeout);
129
+ async installApp (...args) {
130
+ return await this.install(...args);
131
131
  }
132
132
 
133
133
  /**
@@ -29,6 +29,20 @@ async function pullFile (afcService, remotePath) {
29
29
  return Buffer.concat(buffers);
30
30
  }
31
31
 
32
+ /**
33
+ * Checks a presence of a local folder.
34
+ *
35
+ * @param {string} folderPath Full path to the local folder
36
+ * @returns {boolean} True if the folder exists and is actually a folder
37
+ */
38
+ async function folderExists (folderPath) {
39
+ try {
40
+ return (await fs.stat(folderPath)).isDirectory();
41
+ } catch (e) {
42
+ return false;
43
+ }
44
+ }
45
+
32
46
  /**
33
47
  * Retrieve a folder from a real device
34
48
  *
@@ -40,34 +54,59 @@ async function pullFile (afcService, remotePath) {
40
54
  async function pullFolder (afcService, remoteRootPath) {
41
55
  const tmpFolder = await tempDir.openDir();
42
56
  try {
57
+ let localTopItem = null;
58
+ let countFilesSuccess = 0;
59
+ let countFilesFail = 0;
60
+ let countFolders = 0;
43
61
  const pullPromises = [];
44
- await afcService.walkDir(remoteRootPath, true, async (itemPath, isDir) => {
45
- const pathOnServer = path.join(tmpFolder, itemPath);
62
+ await afcService.walkDir(remoteRootPath, true, async (remotePath, isDir) => {
63
+ const localPath = path.join(tmpFolder, remotePath);
64
+ const dirname = isDir ? localPath : path.dirname(localPath);
65
+ if (!await folderExists(dirname)) {
66
+ await mkdirp(dirname);
67
+ }
68
+ if (!localTopItem
69
+ || localPath.split(path.sep).length < localTopItem.split(path.sep).length) {
70
+ localTopItem = localPath;
71
+ }
46
72
  if (isDir) {
47
- await mkdirp(pathOnServer);
73
+ ++countFolders;
48
74
  return;
49
75
  }
50
76
 
51
- const readStream = await afcService.createReadStream(itemPath, {autoDestroy: true});
52
- const writeStream = fs.createWriteStream(pathOnServer, {autoClose: true});
53
- pullPromises.push(new B((resolve, reject) => {
54
- writeStream.on('close', resolve);
55
- const onStreamingError = (e) => {
56
- readStream.unpipe(writeStream);
57
- reject(e);
58
- };
59
- writeStream.on('error', onStreamingError);
60
- readStream.on('error', onStreamingError);
61
- }).timeout(IO_TIMEOUT_MS));
77
+ const readStream = await afcService.createReadStream(remotePath, {autoDestroy: true});
78
+ const writeStream = fs.createWriteStream(localPath, {autoClose: true});
79
+ pullPromises.push(
80
+ new B((resolve) => {
81
+ writeStream.on('close', () => {
82
+ ++countFilesSuccess;
83
+ resolve();
84
+ });
85
+ const onStreamingError = (e) => {
86
+ readStream.unpipe(writeStream);
87
+ log.warn(`Cannot pull '${remotePath}' to '${localPath}'. ` +
88
+ `The file will be skipped. Original error: ${e.message}`);
89
+ ++countFilesFail;
90
+ resolve();
91
+ };
92
+ writeStream.on('error', onStreamingError);
93
+ readStream.on('error', onStreamingError);
94
+ }).timeout(IO_TIMEOUT_MS)
95
+ );
62
96
  readStream.pipe(writeStream);
63
97
  if (pullPromises.length >= MAX_IO_CHUNK_SIZE) {
64
98
  await B.any(pullPromises);
65
99
  }
66
100
  _.remove(pullPromises, (p) => p.isFulfilled());
67
101
  });
68
- // Wait for the rest of the chunks
69
- await B.all(pullPromises);
70
- return await zip.toInMemoryZip(tmpFolder, {
102
+ // Wait for the rest of files to be pulled
103
+ if (!_.isEmpty(pullPromises)) {
104
+ await B.all(pullPromises);
105
+ }
106
+ log.info(`Pulled ${util.pluralize('file', countFilesSuccess, true)} out of ` +
107
+ `${countFilesSuccess + countFilesFail} and ${util.pluralize('folder', countFolders, true)} ` +
108
+ `from '${remoteRootPath}'`);
109
+ return await zip.toInMemoryZip(localTopItem ? path.dirname(localTopItem) : tmpFolder, {
71
110
  encodeToBase64: true,
72
111
  });
73
112
  } finally {
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "3.58.1",
11
+ "version": "3.59.2",
12
12
  "author": "appium",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {