appium-xcuitest-driver 3.58.2 → 3.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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
@@ -30,6 +30,8 @@ var _teen_process = require("teen_process");
30
30
 
31
31
  var _portscanner = require("portscanner");
32
32
 
33
+ var _pyIosDeviceClient = _interopRequireDefault(require("../py-ios-device-client"));
34
+
33
35
  let extensions = {},
34
36
  commands = {};
35
37
  exports.commands = commands;
@@ -281,6 +283,17 @@ commands.mobileInstallCertificate = async function mobileInstallCertificate(opts
281
283
 
282
284
  _logger.default.info(`The certificate cannot be installed via CLI. ` + `Falling back to UI-based deployment`);
283
285
  }
286
+ } else {
287
+ const client = new _pyIosDeviceClient.default(this.opts.udid);
288
+
289
+ if (await client.assertExists(false)) {
290
+ await client.installProfile({
291
+ payload: Buffer.from(content, 'base64')
292
+ });
293
+ return;
294
+ } else {
295
+ _logger.default.info('pyidevice is not installed on your system. ' + 'Falling back to the (slow) UI-based installation');
296
+ }
284
297
  }
285
298
 
286
299
  const tmpRoot = await _appiumSupport.tempDir.openDir();
@@ -387,4 +400,4 @@ var _default = extensions;
387
400
  exports.default = _default;require('source-map-support').install();
388
401
 
389
402
 
390
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jZXJ0aWZpY2F0ZS5qcyJdLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJDT05GSUdfRVhURU5TSU9OIiwiSE9TVF9QT1JUX1JBTkdFIiwiVE1QU0VSVkVSX1NUQVJUVVBfVElNRU9VVCIsIlNldHRpbmdzIiwiR2VuZXJhbCIsInR5cGUiLCJ2YWx1ZSIsIlByb2ZpbGUiLCJBYm91dCIsIkNlcnRpZmljYXRlX1RydXN0X1NldHRpbmdzIiwiQnV0dG9uIiwiSW5zdGFsbCIsIkFsbG93IiwiRG9uZSIsIlJldHVybl90b19TZXR0aW5ncyIsIkFsZXJ0IiwiZXh0cmFjdENvbW1vbk5hbWUiLCJjZXJ0QnVmZmVyIiwidGVtcENlcnQiLCJ0ZW1wRGlyIiwib3BlbiIsInByZWZpeCIsInN1ZmZpeCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsInN0ZG91dCIsInBhcnNlQ29tbW9uTmFtZSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsInJpbXJhZiIsIkxJQlJFX1NTTF9QQVRURVJOIiwiT1BFTl9TU0xfUEFUVEVSTiIsInN0cmluZ0NlcnRpZmljYXRlIiwicmVzdWx0IiwicmVkdWNlIiwiYWNjIiwiciIsIm1hdGNoIiwiZXhlYyIsInRvTW9iaWxlQ29uZmlnIiwiY29tbW9uTmFtZSIsImdldFVVSUQiLCJ1dGlsIiwidXVpZFY0IiwidG9VcHBlckNhc2UiLCJjb250ZW50VXVpZCIsIlBheWxvYWRDb250ZW50IiwiUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWUiLCJQYXlsb2FkRGVzY3JpcHRpb24iLCJQYXlsb2FkRGlzcGxheU5hbWUiLCJQYXlsb2FkSWRlbnRpZmllciIsIlBheWxvYWRUeXBlIiwiUGF5bG9hZFVVSUQiLCJQYXlsb2FkVmVyc2lvbiIsIm9zIiwiaG9zdG5hbWUiLCJzcGxpdCIsIlBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZCIsImNsaWNrRWxlbWVudCIsImRyaXZlciIsImxvY2F0b3IiLCJvcHRpb25zIiwiZWxlbWVudCIsInRpbWVvdXQiLCJza2lwSWZJbnZpc2libGUiLCJsb29rdXBEZWxheSIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsIkpTT04iLCJzdHJpbmdpZnkiLCJuYXRpdmVDbGljayIsImluc3RhbGxQcmUxMjJDZXJ0aWZpY2F0ZSIsIkIiLCJkZWxheSIsInRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzIiwibmFtZSIsInN3aXRjaExvY2F0b3IiLCJtb2JpbGVTd2lwZSIsImRpcmVjdGlvbiIsInBvc3RBY2NlcHRBbGVydCIsImluc3RhbGxQb3N0MTIyQ2VydGlmaWNhdGUiLCJhY3RpdmF0ZUFwcCIsImlzQ2VydEZvdW5kIiwic3dpcGVOdW0iLCJtb2JpbGVJbnN0YWxsQ2VydGlmaWNhdGUiLCJvcHRzIiwiY29udGVudCIsImlzUm9vdCIsIl8iLCJpc0VtcHR5IiwiaXNTaW11bGF0b3IiLCJtZXRob2ROYW1lIiwiZGV2aWNlIiwic2ltY3RsIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicmF3IiwiZSIsImxvZyIsImRlYnVnIiwiaW5mbyIsInRtcFJvb3QiLCJvcGVuRGlyIiwidG1wUG9ydCIsImNvbmZpZ05hbWUiLCJjb25maWdQYXRoIiwicmVzb2x2ZSIsInRtcFNlcnZlciIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjb25maWdGaWxlIiwicmVhZEZpbGUiLCJlbmQiLCJjbiIsIm1vYmlsZUNvbmZpZyIsInBsaXN0IiwidXBkYXRlUGxpc3RGaWxlIiwiaG9zdCIsImNlcnRVcmwiLCJsaXN0ZW4iLCJpZ24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiaXNSZWFsRGV2aWNlIiwicHJveHlDb21tYW5kIiwidXJsIiwiaXNXZWJDb250ZXh0Iiwic2V0VXJsIiwib3BlblVybCIsImlzQ2VydEFscmVhZHlJbnN0YWxsZWQiLCJjb21wYXJlVmVyc2lvbnMiLCJwbGF0Zm9ybVZlcnNpb24iLCJidW5kbGVJZCIsIndhcm4iLCJ0b0luTWVtb3J5QmFzZTY0IiwiY2xvc2UiLCJP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ICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHBsaXN0LCB0ZW1wRGlyLCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcblxubGV0IGV4dGVuc2lvbnMgPSB7fSwgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgQ09ORklHX0VYVEVOU0lPTiA9ICdtb2JpbGVjb25maWcnO1xuY29uc3QgSE9TVF9QT1JUX1JBTkdFID0gWzM4MjAwLCAzODI5OV07XG5jb25zdCBUTVBTRVJWRVJfU1RBUlRVUF9USU1FT1VUID0gNTAwMDtcbmNvbnN0IFNldHRpbmdzID0ge1xuICBHZW5lcmFsOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnR2VuZXJhbCcsXG4gIH0sXG4gIFByb2ZpbGU6IHtcbiAgICB0eXBlOiAnLWlvcyBwcmVkaWNhdGUgc3RyaW5nJyxcbiAgICB2YWx1ZTogYG5hbWUgQkVHSU5TV0lUSCAnUHJvZmlsZSdgLFxuICB9LFxuICBBYm91dDoge1xuICAgIHR5cGU6ICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICB2YWx1ZTogJ0Fib3V0JyxcbiAgfSxcbiAgQ2VydGlmaWNhdGVfVHJ1c3RfU2V0dGluZ3M6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdDZXJ0aWZpY2F0ZSBUcnVzdCBTZXR0aW5ncycsXG4gIH0sXG59O1xuY29uc3QgQnV0dG9uID0ge1xuICBJbnN0YWxsOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnSW5zdGFsbCcsXG4gIH0sXG4gIEFsbG93OiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnQWxsb3cnLFxuICB9LFxuICBEb25lOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnRG9uZScsXG4gIH0sXG4gIFJldHVybl90b19TZXR0aW5nczoge1xuICAgIHR5cGU6ICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICB2YWx1ZTogJ1JldHVybiB0byBTZXR0aW5ncycsXG4gIH0sXG59O1xuY29uc3QgQWxlcnQgPSB7XG4gIEluc3RhbGw6IHtcbiAgICB0eXBlOiAnLWlvcyBjbGFzcyBjaGFpbicsXG4gICAgdmFsdWU6ICcqKi9YQ1VJRWxlbWVudFR5cGVBbnlbYHR5cGUgPT0gXFwnWENVSUVsZW1lbnRUeXBlQWxlcnRcXCcgT1IgdHlwZSA9PSBcXCdYQ1VJRWxlbWVudFR5cGVTaGVldFxcJ2BdLyoqL1hDVUlFbGVtZW50VHlwZUJ1dHRvbltgbGFiZWwgPT0gXFwnSW5zdGFsbFxcJ2BdJyxcbiAgfSxcbn07XG5cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbW1vbk5hbWUgKGNlcnRCdWZmZXIpIHtcbiAgY29uc3QgdGVtcENlcnQgPSBhd2FpdCB0ZW1wRGlyLm9wZW4oe1xuICAgIHByZWZpeDogJ2NlcnQnLFxuICAgIHN1ZmZpeDogJy5jZXInXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wQ2VydC5wYXRoLCBjZXJ0QnVmZmVyKTtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ29wZW5zc2wnLCBbJ3g1MDknLCAnLW5vb3V0JywgJy1zdWJqZWN0JywgJy1pbicsIHRlbXBDZXJ0LnBhdGhdKTtcbiAgICByZXR1cm4gcGFyc2VDb21tb25OYW1lKHN0ZG91dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIGNvbW1vbiBuYW1lIHZhbHVlIGZyb20gdGhlIGNlcnRpZmljYXRlLiBJcyBpdCB2YWxpZCBhbmQgYmFzZTY0LWVuY29kZWQ/IGAgK1xuICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRlbXBDZXJ0LnBhdGgpO1xuICB9XG59XG5cbmNvbnN0IExJQlJFX1NTTF9QQVRURVJOID0gL1xcL0NOPShbXlxcL10rKS87IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmNvbnN0IE9QRU5fU1NMX1BBVFRFUk4gPSAvLFxcc0NOXFxzPVxccyhbXixdKykvO1xuXG5mdW5jdGlvbiBwYXJzZUNvbW1vbk5hbWUgKHN0cmluZ0NlcnRpZmljYXRlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtMSUJSRV9TU0xfUEFUVEVSTiwgT1BFTl9TU0xfUEFUVEVSTl0ucmVkdWNlKChhY2MsIHIpID0+IHtcbiAgICBpZiAoYWNjKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IHIuZXhlYyhzdHJpbmdDZXJ0aWZpY2F0ZSk7XG4gICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdO1xuICB9LCBudWxsKTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIGNvbW1vbiBuYW1lIHZhbHVlIGluICcke3N0cmluZ0NlcnRpZmljYXRlfScgb3V0cHV0YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgQXBwbGUncyBvdmVyLXRoZS1haXIgY29uZmlndXJhdGlvbiBwcm9maWxlXG4gKiBmb3IgY2VydGlmaWNhdGUgZGVwbG95bWVudCBiYXNlZCBvbiB0aGUgZ2l2ZW4gUEVNIGNlcnRpZmljYXRlIGNvbnRlbnQuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2NvbnRlbnQvZG9jdW1lbnRhdGlvbi9OZXR3b3JraW5nSW50ZXJuZXQvQ29uY2VwdHVhbC9pUGhvbmVPVEFDb25maWd1cmF0aW9uL0ludHJvZHVjdGlvbi9JbnRyb2R1Y3Rpb24uaHRtbFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBzdWNoIHByb2ZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjZXJ0QnVmZmVyIC0gVGhlIGFjdHVhbCBjb250ZW50IG9mIFBFTSBjZXJ0aWZpY2F0ZSBlbmNvZGVkIGludG8gTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1vbk5hbWUgLSBDZXJ0aWZpY2F0ZSdzIGNvbW1vbiBuYW1lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZW5jb2RlZCBzdHJ1Y3R1cmUgb2YgdGhlIGdpdmVuIGNlcnRpZmljYXRlLCB3aGljaCBpcyByZWFkeSB0byBiZSBwYXNzZWRcbiAqIGFzIGFuIGFyZ3VtZW50IHRvIHBsaXN0IGJ1aWxkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiB0b01vYmlsZUNvbmZpZyAoY2VydEJ1ZmZlciwgY29tbW9uTmFtZSkge1xuICBjb25zdCBnZXRVVUlEID0gKCkgPT4gdXRpbC51dWlkVjQoKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBjb250ZW50VXVpZCA9IGdldFVVSUQoKTtcbiAgcmV0dXJuIHtcbiAgICBQYXlsb2FkQ29udGVudDogW3tcbiAgICAgIFBheWxvYWRDZXJ0aWZpY2F0ZUZpbGVOYW1lOiBgJHtjb21tb25OYW1lfS5jZXJgLFxuICAgICAgUGF5bG9hZENvbnRlbnQ6IGNlcnRCdWZmZXIsXG4gICAgICBQYXlsb2FkRGVzY3JpcHRpb246ICdBZGRzIGEgQ0Egcm9vdCBjZXJ0aWZpY2F0ZScsXG4gICAgICBQYXlsb2FkRGlzcGxheU5hbWU6IGNvbW1vbk5hbWUsXG4gICAgICBQYXlsb2FkSWRlbnRpZmllcjogYGNvbS5hcHBsZS5zZWN1cml0eS5yb290LiR7Y29udGVudFV1aWR9YCxcbiAgICAgIFBheWxvYWRUeXBlOiAnY29tLmFwcGxlLnNlY3VyaXR5LnJvb3QnLFxuICAgICAgUGF5bG9hZFVVSUQ6IGNvbnRlbnRVdWlkLFxuICAgICAgUGF5bG9hZFZlcnNpb246IDFcbiAgICB9XSxcbiAgICBQYXlsb2FkRGlzcGxheU5hbWU6IGNvbW1vbk5hbWUsXG4gICAgUGF5bG9hZElkZW50aWZpZXI6IGAke29zLmhvc3RuYW1lKCkuc3BsaXQoJy4nKVswXX0uJHtnZXRVVUlEKCl9YCxcbiAgICBQYXlsb2FkUmVtb3ZhbERpc2FsbG93ZWQ6IGZhbHNlLFxuICAgIFBheWxvYWRUeXBlOiAnQ29uZmlndXJhdGlvbicsXG4gICAgUGF5bG9hZFVVSUQ6IGdldFVVSUQoKSxcbiAgICBQYXlsb2FkVmVyc2lvbjogMVxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGlja0VsZW1lbnQgKGRyaXZlciwgbG9jYXRvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBlbGVtZW50ID0gbnVsbDtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICAgIHNraXBJZkludmlzaWJsZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsb29rdXBEZWxheSA9IDUwMDtcbiAgdHJ5IHtcbiAgICBlbGVtZW50ID0gYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IDwgbG9va3VwRGVsYXkgPyAxIDogdGltZW91dCAvIGxvb2t1cERlbGF5LCBsb29rdXBEZWxheSxcbiAgICAgICgpID0+IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMobG9jYXRvci50eXBlLCBsb2NhdG9yLnZhbHVlLCBmYWxzZSlcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc2tpcElmSW52aXNpYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgJHtKU09OLnN0cmluZ2lmeShsb2NhdG9yKX0gd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgYXdhaXQgZHJpdmVyLm5hdGl2ZUNsaWNrKGVsZW1lbnQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFByZTEyMkNlcnRpZmljYXRlIChkcml2ZXIpIHtcbiAgLy8gQWNjZXB0IFNhZmFyaSBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uQWxsb3csIHtcbiAgICAvLyBjZXJ0aWZpY2F0ZSBsb2FkIG1pZ2h0IHRha2Ugc29tZSB0aW1lIG9uIHNsb3cgbWFjaGluZXNcbiAgICB0aW1lb3V0OiAxNTAwMCxcbiAgfSk7XG4gIC8vIFdhaXQgdW50aWwgUHJlZmVyZW5jZXMgYXJlIG9wZW5lZFxuICBhd2FpdCBCLmRlbGF5KDIwMDApO1xuXG4gIC8vIEdvIHRocm91Z2ggUHJlZmVyZW5jZXMgd2l6YXJkXG4gIGlmICghYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkluc3RhbGwsIHtcbiAgICBza2lwSWZJbnZpc2libGU6IHRydWUsXG4gIH0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFdlIG5lZWQgdG8gY2xpY2sgSW5zdGFsbCBidXR0b24gb24gdHdvIGRpZmZlcmVudCB0YWJzXG4gIC8vIFRoZSBzZWNvbmQgb25lIGNvbmZpcm1zIHRoZSBwcmV2aW91c1xuICBhd2FpdCBCLmRlbGF5KDE1MDApO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCk7XG4gIC8vIEFjY2VwdCBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBBbGVydC5JbnN0YWxsKTtcbiAgLy8gRmluaXNoIGFkZGluZyBjZXJ0aWZpY2F0ZVxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uRG9uZSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0cnVzdENlcnRpZmljYXRlSW5QcmVmZXJlbmNlcyAoZHJpdmVyLCBuYW1lKSB7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkdlbmVyYWwpO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBTZXR0aW5ncy5BYm91dCk7XG4gIGNvbnN0IHN3aXRjaExvY2F0b3IgPSB7XG4gICAgdHlwZTogJy1pb3MgY2xhc3MgY2hhaW4nLFxuICAgIHZhbHVlOiBgKiovWENVSUVsZW1lbnRUeXBlQ2VsbFtcXGBsYWJlbCA9PSAnJHtuYW1lfSdcXGBdLyoqL1hDVUlFbGVtZW50VHlwZVN3aXRjaGAsXG4gIH07XG4gIGF3YWl0IHJldHJ5KDUsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkcml2ZXIubW9iaWxlU3dpcGUoe1xuICAgICAgZWxlbWVudDogYXdhaXQgZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVUYWJsZScsIGZhbHNlKSxcbiAgICAgIGRpcmVjdGlvbjogJ3VwJ1xuICAgIH0pO1xuICAgIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkNlcnRpZmljYXRlX1RydXN0X1NldHRpbmdzLCB7XG4gICAgICB0aW1lb3V0OiA1MDAsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKHN3aXRjaExvY2F0b3IudHlwZSwgc3dpdGNoTG9jYXRvci52YWx1ZSwgZmFsc2UpO1xuICB9KTtcbiAgLy8gT25seSBjbGljayB0aGUgc3dpdGNoIGlmIGl0IGlzIHNldCB0byBPZmZcbiAgaWYgKGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIHtcbiAgICB0eXBlOiBzd2l0Y2hMb2NhdG9yLnR5cGUsXG4gICAgdmFsdWU6IGAke3N3aXRjaExvY2F0b3IudmFsdWV9W1xcYHZhbHVlID09ICcwJ1xcYF1gXG4gIH0sIHtcbiAgICB0aW1lb3V0OiAxMDAwLFxuICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgfSkpIHtcbiAgICBhd2FpdCBkcml2ZXIucG9zdEFjY2VwdEFsZXJ0KCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBvc3QxMjJDZXJ0aWZpY2F0ZSAoZHJpdmVyLCBuYW1lKSB7XG4gIC8vIEFjY2VwdCBTYWZhcmkgYWxlcnRcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkFsbG93LCB7XG4gICAgLy8gY2VydGlmaWNhdGUgbG9hZCBtaWdodCB0YWtlIHNvbWUgdGltZSBvbiBzbG93IG1hY2hpbmVzXG4gICAgdGltZW91dDogMTUwMDAsXG4gIH0pO1xuICAvLyBXYWl0IGZvciB0aGUgc2Vjb25kIGFsZXJ0XG4gIGF3YWl0IEIuZGVsYXkoMjAwMCk7XG5cbiAgYXdhaXQgZHJpdmVyLnBvc3RBY2NlcHRBbGVydCgpO1xuICBhd2FpdCBkcml2ZXIuYWN0aXZhdGVBcHAoJ2NvbS5hcHBsZS5QcmVmZXJlbmNlcycpO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBTZXR0aW5ncy5HZW5lcmFsKTtcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuUHJvZmlsZSk7XG4gIC8vIFNlbGVjdCB0aGUgdGFyZ2V0IGNlcnRcbiAgbGV0IGlzQ2VydEZvdW5kID0gZmFsc2U7XG4gIGZvciAobGV0IHN3aXBlTnVtID0gMDsgc3dpcGVOdW0gPCA1OyArK3N3aXBlTnVtKSB7XG4gICAgaWYgKGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIHtcbiAgICAgIHR5cGU6ICctaW9zIGNsYXNzIGNoYWluJyxcbiAgICAgIHZhbHVlOiBgKiovWENVSUVsZW1lbnRUeXBlQ2VsbFtcXGBsYWJlbCA9PSAnJHtuYW1lfSdcXGBdYCxcbiAgICB9LCB7XG4gICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICBza2lwSWZJbnZpc2libGU6IHRydWUsXG4gICAgfSkpIHtcbiAgICAgIGlzQ2VydEZvdW5kID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IGRyaXZlci5tb2JpbGVTd2lwZSh7XG4gICAgICBlbGVtZW50OiBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRhYmxlJywgZmFsc2UpLFxuICAgICAgZGlyZWN0aW9uOiAndXAnXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFpc0NlcnRGb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmFtZX0nIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2VydGlmaWNhdGVzIGxpc3RgKTtcbiAgfVxuXG4gIC8vIEluc3RhbGwgb3B0aW9uIGlzIG9ubHkgdmlzaWJsZSBpZiB0aGUgY2VydCBpcyBub3QgaW5zdGFsbGVkIHlldFxuICBpZiAoIWF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5JbnN0YWxsLCB7XG4gICAgc2tpcElmSW52aXNpYmxlOiB0cnVlLFxuICB9KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCBCLmRlbGF5KDE1MDApO1xuICAvLyBDb25maXJtIHVudHJ1c3RlZCBjZXJ0IGluc3RhbGxcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkluc3RhbGwpO1xuICAvLyBBY2NlcHQgYWxlcnRcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQWxlcnQuSW5zdGFsbCk7XG4gIC8vIEZpbmlzaCBhZGRpbmcgY2VydGlmaWNhdGVcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkRvbmUpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENlcnRpZmljYXRlSW5zdGFsbGF0aW9uT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gY29udGVudCAtIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHB1YmxpYyBjZXJ0aWZpY2F0ZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21tb25OYW1lIC0gQ29tbW9uIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlLiBJZiB0aGlzIGlzIG5vdCBzZXRcbiAqIHRoZW4gdGhlIHNjcmlwdCB3aWxsIHRyeSB0byBwYXJzZSBpdCBmcm9tIHRoZSBnaXZlbiBjZXJ0aWZpY2F0ZSBjb250ZW50LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gaXNSb290IFt0cnVlXSAtIFRoaXMgb3B0aW9uIGRlZmluZXMgd2hlcmUgdGhlIGNlcnRpZmljYXRlIHNob3VsZCBiZVxuICogaW5zdGFsbGVkIHRvOiBlaXRoZXIgVHJ1c3RlZCBSb290IFN0b3JlIChgdHJ1ZWAsIHRoZSBkZWZhdWx0IG9wdGlvbikgb3JcbiAqIHRoZSBLZXljaGFpbiAoYGZhbHNlYCkuIE9uIGVudmlyb25tZW50cyBvdGhlciB0aGFuIFhjb2RlIDExLjQrIFNpbXVsYXRvciB0aGlzXG4gKiBvcHRpb24gaXMgaWdub3JlZC5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIGEgY3VzdG9tIGNlcnRpZmljYXRlIG9udG8gdGhlIGRldmljZS5cbiAqIFNpbmNlIFhjb2RlIFNESyAxMS40IEFwcGxlIGhhcyBhZGRlZCBhIGRlZGljYXRlZCBzaW1jdGwgc3ViY29tbWFuZCB0byBxdWlja2x5IGhhbmRsZVxuICogY2VydGlmaWNhdGVzIG9uIFNpbXVsYXRvciBvdmVyIENMSS5cbiAqIE9uIHJlYWwgZGV2aWNlcyBvciBzaW11bGF0b3JzIGJlZm9yZSBYY29kZSAxMS40IFNES1xuICogQXBwbGUgcHJvdmlkZXMgbm8gb2ZmaWNpYWwgd2F5IHRvIGRvIGl0IHZpYSB0aGUgY29tbWFuZCBsaW5lLlxuICogSW4gc3VjaCBjYXNlIChhbmQgYWxzbyBhcyBhIGZhbGxiYWNrIGlmIENMSSBzZXR1cCBmYWlscylcbiAqIHRoaXMgbWV0aG9kIHRyaWVzIHRvIHdyYXAgdGhlIGNlcnRpZmljYXRlIGludG8gLm1vYmlsZWNvbmZpZyBmb3JtYXRcbiAqIGFuZCB0aGVuIGRlcGxveXMgdGhlIHdyYXBwZWQgZmlsZSB0byB0aGUgaW50ZXJuYWwgSFRUUCBzZXJ2ZXIsXG4gKiBzbyBvbmUgY2FuIG9wZW4gaXQgdmlhIG1vYmlsZSBTYWZhcmkuXG4gKiBUaGVuIHRoZSBhbGdvcml0aG0gZ29lcyB0aHJvdWdoIHRoZSBwcm9maWxlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgYnlcbiAqIGNsaWNraW5nIHRoZSBuZWNlc3NhcnkgYnV0dG9ucyB1c2luZyBXZWJEcml2ZXJBZ2VudC5cbiAqXG4gKiBAcGFyYW0ge0NlcnRpZmljYXRlSW5zdGFsbGF0aW9uT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMgez9zdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBnZW5lcmF0ZWQgLm1vYmlsZWNvbmZpZyBmaWxlIGFzXG4gKiBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuIFRoaXMgY29uZmlnIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICogSWYgdGhlIGNlcnRpZmljYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQgdmlhIENMSSB0aGVuIG5vdGhpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUluc3RhbGxDZXJ0aWZpY2F0ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUluc3RhbGxDZXJ0aWZpY2F0ZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZW50LFxuICAgIGNvbW1vbk5hbWUsXG4gICAgaXNSb290ID0gdHJ1ZSxcbiAgfSA9IG9wdHM7XG4gIGlmIChfLmlzRW1wdHkoY29udGVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NlcnRpZmljYXRlIGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgaWYgKHRoaXMuaXNTaW11bGF0b3IoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gaXNSb290ID8gJ2FkZFJvb3RDZXJ0aWZpY2F0ZScgOiAnYWRkQ2VydGlmaWNhdGUnO1xuICAgICAgYXdhaXQgdGhpcy5vcHRzLmRldmljZS5zaW1jdGxbbWV0aG9kTmFtZV0oXG4gICAgICAgIEJ1ZmZlci5mcm9tKGNvbnRlbnQsICdiYXNlNjQnKS50b1N0cmluZygpLCB7cmF3OiB0cnVlfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZSk7XG4gICAgICBsb2cuaW5mbyhgVGhlIGNlcnRpZmljYXRlIGNhbm5vdCBiZSBpbnN0YWxsZWQgdmlhIENMSS4gYCArXG4gICAgICAgIGBGYWxsaW5nIGJhY2sgdG8gVUktYmFzZWQgZGVwbG95bWVudGApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgdG1wUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKEhPU1RfUE9SVF9SQU5HRVswXSwgSE9TVF9QT1JUX1JBTkdFWzFdKTtcbiAgY29uc3QgY29uZmlnTmFtZSA9IGBhcHBpdW0uJHtDT05GSUdfRVhURU5TSU9OfWA7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgY29uZmlnTmFtZSk7XG4gIGNvbnN0IHRtcFNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIGZ1bmN0aW9uIChfLCByZXMpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgZnMucmVhZEZpbGUoY29uZmlnUGF0aCk7XG4gICAgcmVzLmVuZChjb25maWdGaWxlKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2VydEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQsICdiYXNlNjQnKTtcbiAgICBjb25zdCBjbiA9IGNvbW1vbk5hbWUgfHwgYXdhaXQgZXh0cmFjdENvbW1vbk5hbWUoY2VydEJ1ZmZlcik7XG4gICAgY29uc3QgbW9iaWxlQ29uZmlnID0gdG9Nb2JpbGVDb25maWcoY2VydEJ1ZmZlciwgY24pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUoY29uZmlnUGF0aCwgbW9iaWxlQ29uZmlnLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb25maWcgYXMgJyR7Y29uZmlnUGF0aH0nLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBvcy5ob3N0bmFtZSgpO1xuICAgICAgY29uc3QgY2VydFVybCA9IGBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9LyR7Y29uZmlnTmFtZX1gO1xuICAgICAgYXdhaXQgdG1wU2VydmVyLmxpc3Rlbih0bXBQb3J0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0bXBQb3J0LCBob3N0KSkgPT09ICdvcGVuJztcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3YWl0TXM6IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgdGVtcG9yYXJ5IHdlYiBzZXJ2ZXIgaXMgcnVubmluZyBhdCBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHRlbXBvcmFyeSB3ZWIgc2VydmVyIGNhbm5vdCBiZSBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7dG1wUG9ydH0uYCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvdXJsJywgJ1BPU1QnLCB7dXJsOiBjZXJ0VXJsfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29tbWFuZCBhYm92ZSBkb2VzIG5vdCBhbHdheXMgd29yayBvbiByZWFsIGRldmljZXNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0VXJsKGNlcnRVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLm9wZW5VcmwoY2VydFVybCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpc0NlcnRBbHJlYWR5SW5zdGFsbGVkID0gZmFsc2U7XG4gICAgICBpZiAodXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz49JywgJzEyLjInKSkge1xuICAgICAgICBpZiAoYXdhaXQgaW5zdGFsbFBvc3QxMjJDZXJ0aWZpY2F0ZSh0aGlzLCBjbikpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0VsZW1lbnQodGhpcywgU2V0dGluZ3MuUHJvZmlsZSk7XG4gICAgICAgICAgYXdhaXQgdHJ1c3RDZXJ0aWZpY2F0ZUluUHJlZmVyZW5jZXModGhpcywgY24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYXdhaXQgaW5zdGFsbFByZTEyMkNlcnRpZmljYXRlKHRoaXMpKSB7XG4gICAgICAgICAgYXdhaXQgY2xpY2tFbGVtZW50KHRoaXMsIEJ1dHRvbi5SZXR1cm5fdG9fU2V0dGluZ3MpO1xuICAgICAgICAgIGF3YWl0IHRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzKHRoaXMsIGNuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc0NlcnRBbHJlYWR5SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ2VydEFscmVhZHlJbnN0YWxsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEl0IGxvb2tzIGxpa2UgdGhlICcke2NufScgY2VydGlmaWNhdGUgaGFzIGJlZW4gYWxyZWFkeSBhZGRlZCB0byB0aGUgQ0Egcm9vdGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmJ1bmRsZUlkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcCh0aGlzLm9wdHMuYnVuZGxlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYENhbm5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiAnJHt0aGlzLm9wdHMuYnVuZGxlSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQoY29uZmlnUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdG1wU2VydmVyLmNsb3NlKCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBwYXJzZUNvbW1vbk5hbWUgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9jZXJ0aWZpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
403
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jZXJ0aWZpY2F0ZS5qcyJdLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJDT05GSUdfRVhURU5TSU9OIiwiSE9TVF9QT1JUX1JBTkdFIiwiVE1QU0VSVkVSX1NUQVJUVVBfVElNRU9VVCIsIlNldHRpbmdzIiwiR2VuZXJhbCIsInR5cGUiLCJ2YWx1ZSIsIlByb2ZpbGUiLCJBYm91dCIsIkNlcnRpZmljYXRlX1RydXN0X1NldHRpbmdzIiwiQnV0dG9uIiwiSW5zdGFsbCIsIkFsbG93IiwiRG9uZSIsIlJldHVybl90b19TZXR0aW5ncyIsIkFsZXJ0IiwiZXh0cmFjdENvbW1vbk5hbWUiLCJjZXJ0QnVmZmVyIiwidGVtcENlcnQiLCJ0ZW1wRGlyIiwib3BlbiIsInByZWZpeCIsInN1ZmZpeCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsInN0ZG91dCIsInBhcnNlQ29tbW9uTmFtZSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsInJpbXJhZiIsIkxJQlJFX1NTTF9QQVRURVJOIiwiT1BFTl9TU0xfUEFUVEVSTiIsInN0cmluZ0NlcnRpZmljYXRlIiwicmVzdWx0IiwicmVkdWNlIiwiYWNjIiwiciIsIm1hdGNoIiwiZXhlYyIsInRvTW9iaWxlQ29uZmlnIiwiY29tbW9uTmFtZSIsImdldFVVSUQiLCJ1dGlsIiwidXVpZFY0IiwidG9VcHBlckNhc2UiLCJjb250ZW50VXVpZCIsIlBheWxvYWRDb250ZW50IiwiUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWUiLCJQYXlsb2FkRGVzY3JpcHRpb24iLCJQYXlsb2FkRGlzcGxheU5hbWUiLCJQYXlsb2FkSWRlbnRpZmllciIsIlBheWxvYWRUeXBlIiwiUGF5bG9hZFVVSUQiLCJQYXlsb2FkVmVyc2lvbiIsIm9zIiwiaG9zdG5hbWUiLCJzcGxpdCIsIlBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZCIsImNsaWNrRWxlbWVudCIsImRyaXZlciIsImxvY2F0b3IiLCJvcHRpb25zIiwiZWxlbWVudCIsInRpbWVvdXQiLCJza2lwSWZJbnZpc2libGUiLCJsb29rdXBEZWxheSIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsIkpTT04iLCJzdHJpbmdpZnkiLCJuYXRpdmVDbGljayIsImluc3RhbGxQcmUxMjJDZXJ0aWZpY2F0ZSIsIkIiLCJkZWxheSIsInRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzIiwibmFtZSIsInN3aXRjaExvY2F0b3IiLCJtb2JpbGVTd2lwZSIsImRpcmVjdGlvbiIsInBvc3RBY2NlcHRBbGVydCIsImluc3RhbGxQb3N0MTIyQ2VydGlmaWNhdGUiLCJhY3RpdmF0ZUFwcCIsImlzQ2VydEZvdW5kIiwic3dpcGVOdW0iLCJtb2JpbGVJbnN0YWxsQ2VydGlmaWNhdGUiLCJvcHRzIiwiY29udGVudCIsImlzUm9vdCIsIl8iLCJpc0VtcHR5IiwiaXNTaW11bGF0b3IiLCJtZXRob2ROYW1lIiwiZGV2aWNlIiwic2ltY3RsIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicmF3IiwiZSIsImxvZyIsImRlYnVnIiwiaW5mbyIsImNsaWVudCIsIlB5aWRldmljZSIsInVkaWQiLCJhc3NlcnRFeGlzdHMiLCJpbnN0YWxsUHJvZmlsZSIsInBheWxvYWQiLCJ0bXBSb290Iiwib3BlbkRpciIsInRtcFBvcnQiLCJjb25maWdOYW1lIiwiY29uZmlnUGF0aCIsInJlc29sdmUiLCJ0bXBTZXJ2ZXIiLCJodHRwIiwiY3JlYXRlU2VydmVyIiwicmVzIiwiY29uZmlnRmlsZSIsInJlYWRGaWxlIiwiZW5kIiwiY24iLCJtb2JpbGVDb25maWciLCJwbGlzdCIsInVwZGF0ZVBsaXN0RmlsZSIsImhvc3QiLCJjZXJ0VXJsIiwibGlzdGVuIiwiaWduIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzUmVhbERldmljZSIsInByb3h5Q29tbWFuZCIsInVybCIsImlzV2ViQ29udGV4dCIsInNldFVybCIsIm9wZW5VcmwiLCJpc0NlcnRBbHJlYWR5SW5zdGFsbGVkIiwiY29tcGFyZVZlcnNpb25zIiwicGxhdGZvcm1WZXJzaW9uIiwiYnVuZGxlSWQiLCJ3YXJuIiwidG9Jbk1lbW9yeUJhc2U2NCIsImNsb3NlIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7QUFBQSxJQUFxQkMsUUFBUSxHQUFHLEVBQWhDOztBQUVBLE1BQU1DLGdCQUFnQixHQUFHLGNBQXpCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FBeEI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxJQUFsQztBQUNBLE1BQU1DLFFBQVEsR0FBRztBQUNmQyxFQUFBQSxPQUFPLEVBQUU7QUFDUEMsSUFBQUEsSUFBSSxFQUFFLGtCQURDO0FBRVBDLElBQUFBLEtBQUssRUFBRTtBQUZBLEdBRE07QUFLZkMsRUFBQUEsT0FBTyxFQUFFO0FBQ1BGLElBQUFBLElBQUksRUFBRSx1QkFEQztBQUVQQyxJQUFBQSxLQUFLLEVBQUc7QUFGRCxHQUxNO0FBU2ZFLEVBQUFBLEtBQUssRUFBRTtBQUNMSCxJQUFBQSxJQUFJLEVBQUUsa0JBREQ7QUFFTEMsSUFBQUEsS0FBSyxFQUFFO0FBRkYsR0FUUTtBQWFmRyxFQUFBQSwwQkFBMEIsRUFBRTtBQUMxQkosSUFBQUEsSUFBSSxFQUFFLGtCQURvQjtBQUUxQkMsSUFBQUEsS0FBSyxFQUFFO0FBRm1CO0FBYmIsQ0FBakI7QUFrQkEsTUFBTUksTUFBTSxHQUFHO0FBQ2JDLEVBQUFBLE9BQU8sRUFBRTtBQUNQTixJQUFBQSxJQUFJLEVBQUUsa0JBREM7QUFFUEMsSUFBQUEsS0FBSyxFQUFFO0FBRkEsR0FESTtBQUtiTSxFQUFBQSxLQUFLLEVBQUU7QUFDTFAsSUFBQUEsSUFBSSxFQUFFLGtCQUREO0FBRUxDLElBQUFBLEtBQUssRUFBRTtBQUZGLEdBTE07QUFTYk8sRUFBQUEsSUFB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QU8xQyxDQUFQLEVBQVU7QUFDVkMsMEJBQUkwQyxJQUFKLENBQVUsbUNBQWtDLEtBQUt4RCxJQUFMLENBQVV1RCxRQUFTLHNCQUFxQjFDLENBQUMsQ0FBQ3JFLE9BQVEsRUFBOUY7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsV0FBTyxDQUFDLE1BQU1jLG9CQUFLbUcsZ0JBQUwsQ0FBc0I5QixVQUF0QixDQUFQLEVBQTBDaEIsUUFBMUMsRUFBUDtBQUNELEdBM0VELFNBMkVVO0FBQ1IsVUFBTWtCLFNBQVMsQ0FBQzZCLEtBQVYsRUFBTjtBQUNBLFVBQU16SCxrQkFBR1EsTUFBSCxDQUFVOEUsT0FBVixDQUFOO0FBQ0Q7QUFDRixDQXhIRDs7QUEwSEFvQyxNQUFNLENBQUNDLE1BQVAsQ0FBY3BKLFVBQWQsRUFBMEJDLFFBQTFCO2VBRWVELFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHBsaXN0LCB0ZW1wRGlyLCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBQeWlkZXZpY2UgZnJvbSAnLi4vcHktaW9zLWRldmljZS1jbGllbnQnO1xuXG5sZXQgZXh0ZW5zaW9ucyA9IHt9LCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBDT05GSUdfRVhURU5TSU9OID0gJ21vYmlsZWNvbmZpZyc7XG5jb25zdCBIT1NUX1BPUlRfUkFOR0UgPSBbMzgyMDAsIDM4Mjk5XTtcbmNvbnN0IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQgPSA1MDAwO1xuY29uc3QgU2V0dGluZ3MgPSB7XG4gIEdlbmVyYWw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdHZW5lcmFsJyxcbiAgfSxcbiAgUHJvZmlsZToge1xuICAgIHR5cGU6ICctaW9zIHByZWRpY2F0ZSBzdHJpbmcnLFxuICAgIHZhbHVlOiBgbmFtZSBCRUdJTlNXSVRIICdQcm9maWxlJ2AsXG4gIH0sXG4gIEFib3V0OiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnQWJvdXQnLFxuICB9LFxuICBDZXJ0aWZpY2F0ZV9UcnVzdF9TZXR0aW5nczoge1xuICAgIHR5cGU6ICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICB2YWx1ZTogJ0NlcnRpZmljYXRlIFRydXN0IFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBCdXR0b24gPSB7XG4gIEluc3RhbGw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdJbnN0YWxsJyxcbiAgfSxcbiAgQWxsb3c6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdBbGxvdycsXG4gIH0sXG4gIERvbmU6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdEb25lJyxcbiAgfSxcbiAgUmV0dXJuX3RvX1NldHRpbmdzOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnUmV0dXJuIHRvIFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBBbGVydCA9IHtcbiAgSW5zdGFsbDoge1xuICAgIHR5cGU6ICctaW9zIGNsYXNzIGNoYWluJyxcbiAgICB2YWx1ZTogJyoqL1hDVUlFbGVtZW50VHlwZUFueVtgdHlwZSA9PSBcXCdYQ1VJRWxlbWVudFR5cGVBbGVydFxcJyBPUiB0eXBlID09IFxcJ1hDVUlFbGVtZW50VHlwZVNoZWV0XFwnYF0vKiovWENVSUVsZW1lbnRUeXBlQnV0dG9uW2BsYWJlbCA9PSBcXCdJbnN0YWxsXFwnYF0nLFxuICB9LFxufTtcblxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0Q29tbW9uTmFtZSAoY2VydEJ1ZmZlcikge1xuICBjb25zdCB0ZW1wQ2VydCA9IGF3YWl0IHRlbXBEaXIub3Blbih7XG4gICAgcHJlZml4OiAnY2VydCcsXG4gICAgc3VmZml4OiAnLmNlcidcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBDZXJ0LnBhdGgsIGNlcnRCdWZmZXIpO1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnb3BlbnNzbCcsIFsneDUwOScsICctbm9vdXQnLCAnLXN1YmplY3QnLCAnLWluJywgdGVtcENlcnQucGF0aF0pO1xuICAgIHJldHVybiBwYXJzZUNvbW1vbk5hbWUoc3Rkb3V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgY29tbW9uIG5hbWUgdmFsdWUgZnJvbSB0aGUgY2VydGlmaWNhdGUuIElzIGl0IHZhbGlkIGFuZCBiYXNlNjQtZW5jb2RlZD8gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGVtcENlcnQucGF0aCk7XG4gIH1cbn1cblxuY29uc3QgTElCUkVfU1NMX1BBVFRFUk4gPSAvXFwvQ049KFteXFwvXSspLzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuY29uc3QgT1BFTl9TU0xfUEFUVEVSTiA9IC8sXFxzQ05cXHM9XFxzKFteLF0rKS87XG5cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uTmFtZSAoc3RyaW5nQ2VydGlmaWNhdGUpIHtcbiAgY29uc3QgcmVzdWx0ID0gW0xJQlJFX1NTTF9QQVRURVJOLCBPUEVOX1NTTF9QQVRURVJOXS5yZWR1Y2UoKGFjYywgcikgPT4ge1xuICAgIGlmIChhY2MpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gci5leGVjKHN0cmluZ0NlcnRpZmljYXRlKTtcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG4gIH0sIG51bGwpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gY29tbW9uIG5hbWUgdmFsdWUgaW4gJyR7c3RyaW5nQ2VydGlmaWNhdGV9JyBvdXRwdXRgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBBcHBsZSdzIG92ZXItdGhlLWFpciBjb25maWd1cmF0aW9uIHByb2ZpbGVcbiAqIGZvciBjZXJ0aWZpY2F0ZSBkZXBsb3ltZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBQRU0gY2VydGlmaWNhdGUgY29udGVudC5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvY29udGVudC9kb2N1bWVudGF0aW9uL05ldHdvcmtpbmdJbnRlcm5ldC9Db25jZXB0dWFsL2lQaG9uZU9UQUNvbmZpZ3VyYXRpb24vSW50cm9kdWN0aW9uL0ludHJvZHVjdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHN1Y2ggcHJvZmlsZXMuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNlcnRCdWZmZXIgLSBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgUEVNIGNlcnRpZmljYXRlIGVuY29kZWQgaW50byBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbW9uTmFtZSAtIENlcnRpZmljYXRlJ3MgY29tbW9uIG5hbWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBlbmNvZGVkIHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUsIHdoaWNoIGlzIHJlYWR5IHRvIGJlIHBhc3NlZFxuICogYXMgYW4gYXJndW1lbnQgdG8gcGxpc3QgYnVpbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHRvTW9iaWxlQ29uZmlnIChjZXJ0QnVmZmVyLCBjb21tb25OYW1lKSB7XG4gIGNvbnN0IGdldFVVSUQgPSAoKSA9PiB1dGlsLnV1aWRWNCgpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IGNvbnRlbnRVdWlkID0gZ2V0VVVJRCgpO1xuICByZXR1cm4ge1xuICAgIFBheWxvYWRDb250ZW50OiBbe1xuICAgICAgUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWU6IGAke2NvbW1vbk5hbWV9LmNlcmAsXG4gICAgICBQYXlsb2FkQ29udGVudDogY2VydEJ1ZmZlcixcbiAgICAgIFBheWxvYWREZXNjcmlwdGlvbjogJ0FkZHMgYSBDQSByb290IGNlcnRpZmljYXRlJyxcbiAgICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICAgIFBheWxvYWRJZGVudGlmaWVyOiBgY29tLmFwcGxlLnNlY3VyaXR5LnJvb3QuJHtjb250ZW50VXVpZH1gLFxuICAgICAgUGF5bG9hZFR5cGU6ICdjb20uYXBwbGUuc2VjdXJpdHkucm9vdCcsXG4gICAgICBQYXlsb2FkVVVJRDogY29udGVudFV1aWQsXG4gICAgICBQYXlsb2FkVmVyc2lvbjogMVxuICAgIH1dLFxuICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICBQYXlsb2FkSWRlbnRpZmllcjogYCR7b3MuaG9zdG5hbWUoKS5zcGxpdCgnLicpWzBdfS4ke2dldFVVSUQoKX1gLFxuICAgIFBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZDogZmFsc2UsXG4gICAgUGF5bG9hZFR5cGU6ICdDb25maWd1cmF0aW9uJyxcbiAgICBQYXlsb2FkVVVJRDogZ2V0VVVJRCgpLFxuICAgIFBheWxvYWRWZXJzaW9uOiAxXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrRWxlbWVudCAoZHJpdmVyLCBsb2NhdG9yLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxvb2t1cERlbGF5ID0gNTAwO1xuICB0cnkge1xuICAgIGVsZW1lbnQgPSBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgPCBsb29rdXBEZWxheSA/IDEgOiB0aW1lb3V0IC8gbG9va3VwRGVsYXksIGxvb2t1cERlbGF5LFxuICAgICAgKCkgPT4gZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhsb2NhdG9yLnR5cGUsIGxvY2F0b3IudmFsdWUsIGZhbHNlKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChza2lwSWZJbnZpc2libGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCAke0pTT04uc3RyaW5naWZ5KGxvY2F0b3IpfSB3aXRoaW4gJHt0aW1lb3V0fW1zIHRpbWVvdXRgKTtcbiAgfVxuICBhd2FpdCBkcml2ZXIubmF0aXZlQ2xpY2soZWxlbWVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUgKGRyaXZlcikge1xuICAvLyBBY2NlcHQgU2FmYXJpIGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5BbGxvdywge1xuICAgIC8vIGNlcnRpZmljYXRlIGxvYWQgbWlnaHQgdGFrZSBzb21lIHRpbWUgb24gc2xvdyBtYWNoaW5lc1xuICAgIHRpbWVvdXQ6IDE1MDAwLFxuICB9KTtcbiAgLy8gV2FpdCB1bnRpbCBQcmVmZXJlbmNlcyBhcmUgb3BlbmVkXG4gIGF3YWl0IEIuZGVsYXkoMjAwMCk7XG5cbiAgLy8gR28gdGhyb3VnaCBQcmVmZXJlbmNlcyB3aXphcmRcbiAgaWYgKCFhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCwge1xuICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgfSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gV2UgbmVlZCB0byBjbGljayBJbnN0YWxsIGJ1dHRvbiBvbiB0d28gZGlmZmVyZW50IHRhYnNcbiAgLy8gVGhlIHNlY29uZCBvbmUgY29uZmlybXMgdGhlIHByZXZpb3VzXG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5JbnN0YWxsKTtcbiAgLy8gQWNjZXB0IGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEFsZXJ0Lkluc3RhbGwpO1xuICAvLyBGaW5pc2ggYWRkaW5nIGNlcnRpZmljYXRlXG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5Eb25lKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzIChkcml2ZXIsIG5hbWUpIHtcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuR2VuZXJhbCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkFib3V0KTtcbiAgY29uc3Qgc3dpdGNoTG9jYXRvciA9IHtcbiAgICB0eXBlOiAnLWlvcyBjbGFzcyBjaGFpbicsXG4gICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF0vKiovWENVSUVsZW1lbnRUeXBlU3dpdGNoYCxcbiAgfTtcbiAgYXdhaXQgcmV0cnkoNSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRyaXZlci5tb2JpbGVTd2lwZSh7XG4gICAgICBlbGVtZW50OiBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRhYmxlJywgZmFsc2UpLFxuICAgICAgZGlyZWN0aW9uOiAndXAnXG4gICAgfSk7XG4gICAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuQ2VydGlmaWNhdGVfVHJ1c3RfU2V0dGluZ3MsIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoc3dpdGNoTG9jYXRvci50eXBlLCBzd2l0Y2hMb2NhdG9yLnZhbHVlLCBmYWxzZSk7XG4gIH0pO1xuICAvLyBPbmx5IGNsaWNrIHRoZSBzd2l0Y2ggaWYgaXQgaXMgc2V0IHRvIE9mZlxuICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgIHR5cGU6IHN3aXRjaExvY2F0b3IudHlwZSxcbiAgICB2YWx1ZTogYCR7c3dpdGNoTG9jYXRvci52YWx1ZX1bXFxgdmFsdWUgPT0gJzAnXFxgXWBcbiAgfSwge1xuICAgIHRpbWVvdXQ6IDEwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlOiB0cnVlLFxuICB9KSkge1xuICAgIGF3YWl0IGRyaXZlci5wb3N0QWNjZXB0QWxlcnQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUG9zdDEyMkNlcnRpZmljYXRlIChkcml2ZXIsIG5hbWUpIHtcbiAgLy8gQWNjZXB0IFNhZmFyaSBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uQWxsb3csIHtcbiAgICAvLyBjZXJ0aWZpY2F0ZSBsb2FkIG1pZ2h0IHRha2Ugc29tZSB0aW1lIG9uIHNsb3cgbWFjaGluZXNcbiAgICB0aW1lb3V0OiAxNTAwMCxcbiAgfSk7XG4gIC8vIFdhaXQgZm9yIHRoZSBzZWNvbmQgYWxlcnRcbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcblxuICBhd2FpdCBkcml2ZXIucG9zdEFjY2VwdEFsZXJ0KCk7XG4gIGF3YWl0IGRyaXZlci5hY3RpdmF0ZUFwcCgnY29tLmFwcGxlLlByZWZlcmVuY2VzJyk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkdlbmVyYWwpO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBTZXR0aW5ncy5Qcm9maWxlKTtcbiAgLy8gU2VsZWN0IHRoZSB0YXJnZXQgY2VydFxuICBsZXQgaXNDZXJ0Rm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgc3dpcGVOdW0gPSAwOyBzd2lwZU51bSA8IDU7ICsrc3dpcGVOdW0pIHtcbiAgICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgICAgdHlwZTogJy1pb3MgY2xhc3MgY2hhaW4nLFxuICAgICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF1gLFxuICAgIH0sIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgICB9KSkge1xuICAgICAgaXNDZXJ0Rm91bmQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgZHJpdmVyLm1vYmlsZVN3aXBlKHtcbiAgICAgIGVsZW1lbnQ6IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlVGFibGUnLCBmYWxzZSksXG4gICAgICBkaXJlY3Rpb246ICd1cCdcbiAgICB9KTtcbiAgfVxuICBpZiAoIWlzQ2VydEZvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjZXJ0aWZpY2F0ZXMgbGlzdGApO1xuICB9XG5cbiAgLy8gSW5zdGFsbCBvcHRpb24gaXMgb25seSB2aXNpYmxlIGlmIHRoZSBjZXJ0IGlzIG5vdCBpbnN0YWxsZWQgeWV0XG4gIGlmICghYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkluc3RhbGwsIHtcbiAgICBza2lwSWZJbnZpc2libGU6IHRydWUsXG4gIH0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIC8vIENvbmZpcm0gdW50cnVzdGVkIGNlcnQgaW5zdGFsbFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCk7XG4gIC8vIEFjY2VwdCBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBBbGVydC5JbnN0YWxsKTtcbiAgLy8gRmluaXNoIGFkZGluZyBjZXJ0aWZpY2F0ZVxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uRG9uZSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBjb250ZW50IC0gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcHVibGljIGNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbW1vbk5hbWUgLSBDb21tb24gbmFtZSBvZiB0aGUgY2VydGlmaWNhdGUuIElmIHRoaXMgaXMgbm90IHNldFxuICogdGhlbiB0aGUgc2NyaXB0IHdpbGwgdHJ5IHRvIHBhcnNlIGl0IGZyb20gdGhlIGdpdmVuIGNlcnRpZmljYXRlIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBpc1Jvb3QgW3RydWVdIC0gVGhpcyBvcHRpb24gZGVmaW5lcyB3aGVyZSB0aGUgY2VydGlmaWNhdGUgc2hvdWxkIGJlXG4gKiBpbnN0YWxsZWQgdG86IGVpdGhlciBUcnVzdGVkIFJvb3QgU3RvcmUgKGB0cnVlYCwgdGhlIGRlZmF1bHQgb3B0aW9uKSBvclxuICogdGhlIEtleWNoYWluIChgZmFsc2VgKS4gT24gZW52aXJvbm1lbnRzIG90aGVyIHRoYW4gWGNvZGUgMTEuNCsgU2ltdWxhdG9yIHRoaXNcbiAqIG9wdGlvbiBpcyBpZ25vcmVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgYSBjdXN0b20gY2VydGlmaWNhdGUgb250byB0aGUgZGV2aWNlLlxuICogU2luY2UgWGNvZGUgU0RLIDExLjQgQXBwbGUgaGFzIGFkZGVkIGEgZGVkaWNhdGVkIHNpbWN0bCBzdWJjb21tYW5kIHRvIHF1aWNrbHkgaGFuZGxlXG4gKiBjZXJ0aWZpY2F0ZXMgb24gU2ltdWxhdG9yIG92ZXIgQ0xJLlxuICogT24gcmVhbCBkZXZpY2VzIG9yIHNpbXVsYXRvcnMgYmVmb3JlIFhjb2RlIDExLjQgU0RLXG4gKiBBcHBsZSBwcm92aWRlcyBubyBvZmZpY2lhbCB3YXkgdG8gZG8gaXQgdmlhIHRoZSBjb21tYW5kIGxpbmUuXG4gKiBJbiBzdWNoIGNhc2UgKGFuZCBhbHNvIGFzIGEgZmFsbGJhY2sgaWYgQ0xJIHNldHVwIGZhaWxzKVxuICogdGhpcyBtZXRob2QgdHJpZXMgdG8gd3JhcCB0aGUgY2VydGlmaWNhdGUgaW50byAubW9iaWxlY29uZmlnIGZvcm1hdFxuICogYW5kIHRoZW4gZGVwbG95cyB0aGUgd3JhcHBlZCBmaWxlIHRvIHRoZSBpbnRlcm5hbCBIVFRQIHNlcnZlcixcbiAqIHNvIG9uZSBjYW4gb3BlbiBpdCB2aWEgbW9iaWxlIFNhZmFyaS5cbiAqIFRoZW4gdGhlIGFsZ29yaXRobSBnb2VzIHRocm91Z2ggdGhlIHByb2ZpbGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBieVxuICogY2xpY2tpbmcgdGhlIG5lY2Vzc2FyeSBidXR0b25zIHVzaW5nIFdlYkRyaXZlckFnZW50LlxuICpcbiAqIEBwYXJhbSB7Q2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGdlbmVyYXRlZCAubW9iaWxlY29uZmlnIGZpbGUgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZy4gVGhpcyBjb25maWcgbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKiBJZiB0aGUgY2VydGlmaWNhdGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCB2aWEgQ0xJIHRoZW4gbm90aGluZyBpcyByZXR1cm5lZC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbENlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSW5zdGFsbENlcnRpZmljYXRlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnQsXG4gICAgY29tbW9uTmFtZSxcbiAgICBpc1Jvb3QgPSB0cnVlLFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNFbXB0eShjb250ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2VydGlmaWNhdGUgY29udGVudCBzaG91bGQgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICBpZiAodGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpc1Jvb3QgPyAnYWRkUm9vdENlcnRpZmljYXRlJyA6ICdhZGRDZXJ0aWZpY2F0ZSc7XG4gICAgICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLnNpbWN0bFttZXRob2ROYW1lXShcbiAgICAgICAgQnVmZmVyLmZyb20oY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCksIHtyYXc6IHRydWV9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIGxvZy5pbmZvKGBUaGUgY2VydGlmaWNhdGUgY2Fubm90IGJlIGluc3RhbGxlZCB2aWEgQ0xJLiBgICtcbiAgICAgICAgYEZhbGxpbmcgYmFjayB0byBVSS1iYXNlZCBkZXBsb3ltZW50YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBQeWlkZXZpY2UodGhpcy5vcHRzLnVkaWQpO1xuICAgIGlmIChhd2FpdCBjbGllbnQuYXNzZXJ0RXhpc3RzKGZhbHNlKSkge1xuICAgICAgYXdhaXQgY2xpZW50Lmluc3RhbGxQcm9maWxlKHtwYXlsb2FkOiBCdWZmZXIuZnJvbShjb250ZW50LCAnYmFzZTY0Jyl9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ3B5aWRldmljZSBpcyBub3QgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiAnICtcbiAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byB0aGUgKHNsb3cpIFVJLWJhc2VkIGluc3RhbGxhdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgdG1wUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKEhPU1RfUE9SVF9SQU5HRVswXSwgSE9TVF9QT1JUX1JBTkdFWzFdKTtcbiAgY29uc3QgY29uZmlnTmFtZSA9IGBhcHBpdW0uJHtDT05GSUdfRVhURU5TSU9OfWA7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgY29uZmlnTmFtZSk7XG4gIGNvbnN0IHRtcFNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIGZ1bmN0aW9uIChfLCByZXMpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgZnMucmVhZEZpbGUoY29uZmlnUGF0aCk7XG4gICAgcmVzLmVuZChjb25maWdGaWxlKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2VydEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQsICdiYXNlNjQnKTtcbiAgICBjb25zdCBjbiA9IGNvbW1vbk5hbWUgfHwgYXdhaXQgZXh0cmFjdENvbW1vbk5hbWUoY2VydEJ1ZmZlcik7XG4gICAgY29uc3QgbW9iaWxlQ29uZmlnID0gdG9Nb2JpbGVDb25maWcoY2VydEJ1ZmZlciwgY24pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUoY29uZmlnUGF0aCwgbW9iaWxlQ29uZmlnLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb25maWcgYXMgJyR7Y29uZmlnUGF0aH0nLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBvcy5ob3N0bmFtZSgpO1xuICAgICAgY29uc3QgY2VydFVybCA9IGBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9LyR7Y29uZmlnTmFtZX1gO1xuICAgICAgYXdhaXQgdG1wU2VydmVyLmxpc3Rlbih0bXBQb3J0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0bXBQb3J0LCBob3N0KSkgPT09ICdvcGVuJztcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3YWl0TXM6IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgdGVtcG9yYXJ5IHdlYiBzZXJ2ZXIgaXMgcnVubmluZyBhdCBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHRlbXBvcmFyeSB3ZWIgc2VydmVyIGNhbm5vdCBiZSBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7dG1wUG9ydH0uYCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvdXJsJywgJ1BPU1QnLCB7dXJsOiBjZXJ0VXJsfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29tbWFuZCBhYm92ZSBkb2VzIG5vdCBhbHdheXMgd29yayBvbiByZWFsIGRldmljZXNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0VXJsKGNlcnRVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLm9wZW5VcmwoY2VydFVybCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpc0NlcnRBbHJlYWR5SW5zdGFsbGVkID0gZmFsc2U7XG4gICAgICBpZiAodXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz49JywgJzEyLjInKSkge1xuICAgICAgICBpZiAoYXdhaXQgaW5zdGFsbFBvc3QxMjJDZXJ0aWZpY2F0ZSh0aGlzLCBjbikpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0VsZW1lbnQodGhpcywgU2V0dGluZ3MuUHJvZmlsZSk7XG4gICAgICAgICAgYXdhaXQgdHJ1c3RDZXJ0aWZpY2F0ZUluUHJlZmVyZW5jZXModGhpcywgY24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYXdhaXQgaW5zdGFsbFByZTEyMkNlcnRpZmljYXRlKHRoaXMpKSB7XG4gICAgICAgICAgYXdhaXQgY2xpY2tFbGVtZW50KHRoaXMsIEJ1dHRvbi5SZXR1cm5fdG9fU2V0dGluZ3MpO1xuICAgICAgICAgIGF3YWl0IHRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzKHRoaXMsIGNuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc0NlcnRBbHJlYWR5SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ2VydEFscmVhZHlJbnN0YWxsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEl0IGxvb2tzIGxpa2UgdGhlICcke2NufScgY2VydGlmaWNhdGUgaGFzIGJlZW4gYWxyZWFkeSBhZGRlZCB0byB0aGUgQ0Egcm9vdGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmJ1bmRsZUlkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcCh0aGlzLm9wdHMuYnVuZGxlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYENhbm5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiAnJHt0aGlzLm9wdHMuYnVuZGxlSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQoY29uZmlnUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdG1wU2VydmVyLmNsb3NlKCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBwYXJzZUNvbW1vbk5hbWUgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9jZXJ0aWZpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -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==