appium-uiautomator2-driver 1.71.0 → 1.75.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 +25 -5
- package/build/lib/commands/find.js +5 -11
- package/build/lib/commands/general.js +4 -2
- package/build/lib/css-converter.js +119 -112
- package/build/lib/driver.js +4 -3
- package/build/lib/uiautomator2.js +2 -1
- package/lib/commands/find.js +5 -9
- package/lib/commands/general.js +3 -0
- package/lib/css-converter.js +177 -169
- package/lib/driver.js +16 -4
- package/lib/uiautomator2.js +1 -0
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ platformName | Could be set to `android`. Appium itself is not strict about this
|
|
|
29
29
|
appium:automationName | Must always be set to `uiautomator2`. Values of `automationName` are compared case-insensitively.
|
|
30
30
|
appium:deviceName | The name of the device under test (actually, it is not used to select a device under test). Consider setting `udid` for real devices and `avd` for emulators instead
|
|
31
31
|
appium:platformVersion | The platform version of an emulator or a real device. This capability is used for device autodetection if `udid` is not provided
|
|
32
|
-
appium:udid | UDID of the device to be tested. Could
|
|
32
|
+
appium:udid | UDID of the device to be tested. Could be retrieved from `adb devices -l` output. If unset then the driver will try to use the first connected device. Always set this capability if you run parallel tests.
|
|
33
33
|
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
|
|
34
34
|
appium:fullReset | Being set to `true` always enforces the application under test to be fully uninstalled before starting a new session. `false` by default
|
|
35
35
|
appium:printPageSourceOnFindFailure | Enforces the server to dump the actual XML page source into the log if any error happens. `false` by default.
|
|
@@ -210,7 +210,7 @@ Name | Description | Example
|
|
|
210
210
|
id | This strategy is mapped to the native UiAutomator's `By.res` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#res(java.lang.String)) (exact match of element's resource name). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | 'com.mycompany:id/resourceId'
|
|
211
211
|
accessibilityId | This strategy is mapped to the native UiAutomator's `By.desc` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#desc(java.lang.String)) (exact match of element's content description). | 'my description'
|
|
212
212
|
className | This strategy is mapped to the native UiAutomator's `By.clazz` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#clazz(java.lang.String)) (exact match of element's class). | 'android.view.View'
|
|
213
|
-
android uiautomator | This strategy is mapped to the native UiAutomator's `UiSelector` [locator](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)). It is even possible to perform some advanced operations, like scrolling, with this locator type | `new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))`
|
|
213
|
+
`-android uiautomator` | This strategy is mapped to the native UiAutomator's `UiSelector` [locator](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)). It is even possible to perform some advanced operations, like scrolling, with this locator type | `new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))`
|
|
214
214
|
xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported for appium-uiatomator2-server versions below 4.25.0. All server versions starting from 4.25.0 support both Xpath 1.0 and 2.0 | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
|
|
215
215
|
|
|
216
216
|
|
|
@@ -269,6 +269,7 @@ mjpegScalingFactor | int | The percentage value used to apply downscaling on the
|
|
|
269
269
|
mjpegServerScreenshotQuality | int | The percentage value used to apply lossy JPEG compression on the screenshots generated by the MJPEG screenshots broadcaster. Must be in range 1..100. `50` is by default, which means that screenshots are compressed to the half of their original quality.
|
|
270
270
|
mjpegBilinearFiltering | boolean | Controls whether (`true`) or not (`false`, the default value) to apply bilinear filtering to MJPEG screenshots broadcaster resize algorithm. Enabling this flag may improve the quality of the resulting scaled bitmap, but may introduce a small performance hit.
|
|
271
271
|
useResourcesForOrientationDetection | boolean | Defines the strategy used by UiAutomator2 server to detect the original device orientation. By default (`false` value) the server uses device rotation value for this purpose. Although, this approach may not work for some devices and a portrait orientation may erroneously be detected as the landscape one (and vice versa). In such case it makes sense to play with this setting.
|
|
272
|
+
enforceXPath1 | boolean | Since UiAutomator2 driver version `4.25.0` XPath2 is set as the default and the recommended interpreter for the corresponding element locators. This interpreter is based on [Psychopath XPath2](https://wiki.eclipse.org/PsychoPathXPathProcessor) implementation, which is now a part of the Eclipse foundation. In most of the cases XPath1 locators are also valid XPath2 locators, so there should be no issues while locating elements. Although, since the XPath2 standard is much more advanced in comparison to the previous version, some [issues](https://github.com/appium/appium/issues/16142) are possible for more sophisticated locators, which cannot be fixed easily, as we depend on the third-party library mentioned above. Then try to workaround such issues by enforcing XPath1 usage (whose implementation is a part of the Android platform itself) and assigning this setting to `true`. Note, this setting is actually applied at the time when the element lookup by XPath is executed, so you could switch it on or off whenever needed throughout your automated testing session.
|
|
272
273
|
|
|
273
274
|
|
|
274
275
|
## Platform-Specific Extensions
|
|
@@ -564,14 +565,15 @@ text | string | yes | The text to type | testing
|
|
|
564
565
|
|
|
565
566
|
### mobile: sensorSet
|
|
566
567
|
|
|
567
|
-
Emulate
|
|
568
|
+
Emulate changing of sensor values on the connected emulator.
|
|
569
|
+
This extension does not work on real devices.
|
|
568
570
|
|
|
569
571
|
#### Arguments
|
|
570
572
|
|
|
571
573
|
Name | Type | Required | Description | Example
|
|
572
574
|
--- | --- | --- | --- | ---
|
|
573
|
-
sensorType | string | yes |
|
|
574
|
-
value | string | yes |
|
|
575
|
+
sensorType | string | yes | The set of all supported sensor types could be found in [adb-emu-commands.js](https://github.com/appium/appium-adb/blob/master/lib/tools/adb-emu-commands.js) (look for *SENSORS* object values). Check the output of `sensor status` command in the [emulator console](https://developer.android.com/studio/run/emulator-console) to see more details on the available sensor types | light
|
|
576
|
+
value | string | yes | Check the output of `sensor get <sensorType>` command in the [emulator console](https://developer.android.com/studio/run/emulator-console) to see the acceptable value format for the given sensor type | 50
|
|
575
577
|
|
|
576
578
|
### mobile: deleteFile
|
|
577
579
|
|
|
@@ -761,6 +763,24 @@ type | string | yes | The unlock type. See the documentation on [appium:unlockTy
|
|
|
761
763
|
strategy | string | no | Unlock strategy. See the documentation on [appium:unlockStrategy](#device-locking) capability for more details | uiautomator
|
|
762
764
|
timeoutMs | number | no | Unlock timeout. See the documentation on [appium:unlockSuccessTimeout](#device-locking) capability for more details | 5000
|
|
763
765
|
|
|
766
|
+
### mobile: refreshGpsCache
|
|
767
|
+
|
|
768
|
+
Sends a request to refresh the GPS cache on the device under test.
|
|
769
|
+
By default the location tracking is configured for
|
|
770
|
+
[low battery consumption](https://github.com/appium/io.appium.settings/blob/master/app/src/main/java/io/appium/settings/LocationTracker.java),
|
|
771
|
+
so you might need to call this extension periodically to get the updated geo
|
|
772
|
+
location if the actual (or mocked) device location is changed too frequently.
|
|
773
|
+
The feature only works if the device under test has Google Play Services installed.
|
|
774
|
+
In case the vanilla
|
|
775
|
+
[LocationManager](https://developer.android.com/reference/android/location/LocationManager)
|
|
776
|
+
is used the device API level must be at version 30 (Android R) or higher.
|
|
777
|
+
|
|
778
|
+
#### Arguments
|
|
779
|
+
|
|
780
|
+
Name | Type | Required | Description | Example
|
|
781
|
+
--- | --- | --- | --- | ---
|
|
782
|
+
timeoutMs | number | no | The maximum number of milliseconds to block until GPS cache is refreshed. If the API call does not receive a confirmation about successful cache refresh within this timeout then an error is thrown. Providing zero or a negative value to it skips waiting completely and does not check for any errors. 20000 ms by default. | 60000
|
|
783
|
+
|
|
764
784
|
## Applications Management
|
|
765
785
|
|
|
766
786
|
UiAutomator2 driver supports Appium endpoints for applications management:
|
|
@@ -11,8 +11,7 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _cssConverter = _interopRequireDefault(require("../css-converter"));
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
extensions = {};
|
|
14
|
+
const helpers = {};
|
|
16
15
|
exports.helpers = helpers;
|
|
17
16
|
const MAGIC_FIRST_VIS_CHILD_SEL = /\/\*\[@firstVisible ?= ?('|")true\1\]/;
|
|
18
17
|
const MAGIC_SCROLLABLE_SEL = /\/\/\*\[@scrollable ?= ?('|")true\1\]/;
|
|
@@ -31,19 +30,14 @@ helpers.doFindElementOrEls = async function (params) {
|
|
|
31
30
|
|
|
32
31
|
if (params.strategy === 'css selector') {
|
|
33
32
|
params.strategy = '-android uiautomator';
|
|
34
|
-
params.selector = _cssConverter.default
|
|
33
|
+
params.selector = new _cssConverter.default(params.selector, this.opts.appPackage).toUiAutomatorSelector();
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
return await this.uiautomator2.jwproxy.command(`/elements`, 'POST', params);
|
|
39
|
-
} else {
|
|
40
|
-
return await this.uiautomator2.jwproxy.command(`/element`, 'POST', params);
|
|
41
|
-
}
|
|
36
|
+
return await this.uiautomator2.jwproxy.command(`/element${params.multiple ? 's' : ''}`, 'POST', params);
|
|
42
37
|
};
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
var _default = extensions;
|
|
39
|
+
var _default = helpers;
|
|
46
40
|
exports.default = _default;require('source-map-support').install();
|
|
47
41
|
|
|
48
42
|
|
|
49
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maW5kLmpzIl0sIm5hbWVzIjpbImhlbHBlcnMiLCJNQUdJQ19GSVJTVF9WSVNfQ0hJTERfU0VMIiwiTUFHSUNfU0NST0xMQUJMRV9TRUwiLCJNQUdJQ19TQ1JPTExBQkxFX0JZIiwiZG9GaW5kRWxlbWVudE9yRWxzIiwicGFyYW1zIiwic3RyYXRlZ3kiLCJ0ZXN0Iiwic2VsZWN0b3IiLCJlbGVtZW50SWQiLCJjb250ZXh0IiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJDc3NDb252ZXJ0ZXIiLCJvcHRzIiwiYXBwUGFja2FnZSIsInRvVWlBdXRvbWF0b3JTZWxlY3RvciIsIm11bHRpcGxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUVBLE1BQU1BLE9BQU8sR0FBRyxFQUFoQjs7QUFJQSxNQUFNQyx5QkFBeUIsR0FBRyx1Q0FBbEM7QUFFQSxNQUFNQyxvQkFBb0IsR0FBRyx1Q0FBN0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQ0FBNUI7O0FBTUFILE9BQU8sQ0FBQ0ksa0JBQVIsR0FBNkIsZ0JBQWdCQyxNQUFoQixFQUF3QjtBQUNuRCxNQUFJQSxNQUFNLENBQUNDLFFBQVAsS0FBb0IsT0FBcEIsSUFBK0JMLHlCQUF5QixDQUFDTSxJQUExQixDQUErQkYsTUFBTSxDQUFDRyxRQUF0QyxDQUFuQyxFQUFvRjtBQUNsRixRQUFJQyxTQUFTLEdBQUdKLE1BQU0sQ0FBQ0ssT0FBdkI7QUFDQSxXQUFPLE1BQU0sS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQW1DLG1CQUFrQkosU0FBVSxnQkFBL0QsRUFBZ0YsS0FBaEYsRUFBdUYsRUFBdkYsQ0FBYjtBQUNEOztBQUNELE1BQUlKLE1BQU0sQ0FBQ0MsUUFBUCxLQUFvQixPQUFwQixJQUErQkosb0JBQW9CLENBQUNLLElBQXJCLENBQTBCRixNQUFNLENBQUNHLFFBQWpDLENBQW5DLEVBQStFO0FBQzdFSCxJQUFBQSxNQUFNLENBQUNDLFFBQVAsR0FBa0Isc0JBQWxCO0FBQ0FELElBQUFBLE1BQU0sQ0FBQ0csUUFBUCxHQUFrQkwsbUJBQWxCO0FBQ0Q7O0FBQ0QsTUFBSUUsTUFBTSxDQUFDQyxRQUFQLEtBQW9CLGNBQXhCLEVBQXdDO0FBQ3RDRCxJQUFBQSxNQUFNLENBQUNDLFFBQVAsR0FBa0Isc0JBQWxCO0FBQ0FELElBQUFBLE1BQU0sQ0FBQ0csUUFBUCxHQUFrQixJQUFJTSxxQkFBSixDQUFpQlQsTUFBTSxDQUFDRyxRQUF4QixFQUFrQyxLQUFLTyxJQUFMLENBQVVDLFVBQTVDLEVBQ2ZDLHFCQURlLEVBQWxCO0FBRUQ7O0FBQ0QsU0FBTyxNQUFNLEtBQUtOLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFtQyxXQUFVUixNQUFNLENBQUNhLFFBQVAsR0FBa0IsR0FBbEIsR0FBd0IsRUFBRyxFQUF4RSxFQUEyRSxNQUEzRSxFQUFtRmIsTUFBbkYsQ0FBYjtBQUNELENBZkQ7O2VBa0JlTCxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENzc0NvbnZlcnRlciBmcm9tICcuLi9jc3MtY29udmVydGVyJztcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG4vLyB3ZSBvdmVycmlkZSB0aGUgeHBhdGggc2VhcmNoIGZvciB0aGlzIGZpcnN0LXZpc2libGUtY2hpbGQgc2VsZWN0b3IsIHdoaWNoXG4vLyBsb29rcyBsaWtlIC8qW0BmaXJzdFZpc2libGU9XCJ0cnVlXCJdXG5jb25zdCBNQUdJQ19GSVJTVF9WSVNfQ0hJTERfU0VMID0gL1xcL1xcKlxcW0BmaXJzdFZpc2libGUgPz0gPygnfFwiKXRydWVcXDFcXF0vO1xuXG5jb25zdCBNQUdJQ19TQ1JPTExBQkxFX1NFTCA9IC9cXC9cXC9cXCpcXFtAc2Nyb2xsYWJsZSA/PSA/KCd8XCIpdHJ1ZVxcMVxcXS87XG5jb25zdCBNQUdJQ19TQ1JPTExBQkxFX0JZID0gJ25ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKSc7XG5cbi8qKlxuICogT3ZlcnJpZGluZyBoZWxwZXJzLmRvRmluZEVsZW1lbnRPckVscyBmdW5jdGlvbmFsaXR5IG9mIGFwcGl1bS1hbmRyb2lkLWRyaXZlcixcbiAqIHRoaXMuZWxlbWVudCBpbml0aWFsaXplZCBpbiBmaW5kLmpzIG9mIGFwcGl1bS1hbmRyb2lkLWRyaXZlLlxuICovXG5oZWxwZXJzLmRvRmluZEVsZW1lbnRPckVscyA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKHBhcmFtcy5zdHJhdGVneSA9PT0gJ3hwYXRoJyAmJiBNQUdJQ19GSVJTVF9WSVNfQ0hJTERfU0VMLnRlc3QocGFyYW1zLnNlbGVjdG9yKSkge1xuICAgIGxldCBlbGVtZW50SWQgPSBwYXJhbXMuY29udGV4dDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2VsZW1lbnQvJHtlbGVtZW50SWR9L2ZpcnN0X3Zpc2libGVgLCAnR0VUJywge30pO1xuICB9XG4gIGlmIChwYXJhbXMuc3RyYXRlZ3kgPT09ICd4cGF0aCcgJiYgTUFHSUNfU0NST0xMQUJMRV9TRUwudGVzdChwYXJhbXMuc2VsZWN0b3IpKSB7XG4gICAgcGFyYW1zLnN0cmF0ZWd5ID0gJy1hbmRyb2lkIHVpYXV0b21hdG9yJztcbiAgICBwYXJhbXMuc2VsZWN0b3IgPSBNQUdJQ19TQ1JPTExBQkxFX0JZO1xuICB9XG4gIGlmIChwYXJhbXMuc3RyYXRlZ3kgPT09ICdjc3Mgc2VsZWN0b3InKSB7XG4gICAgcGFyYW1zLnN0cmF0ZWd5ID0gJy1hbmRyb2lkIHVpYXV0b21hdG9yJztcbiAgICBwYXJhbXMuc2VsZWN0b3IgPSBuZXcgQ3NzQ29udmVydGVyKHBhcmFtcy5zZWxlY3RvciwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpXG4gICAgICAudG9VaUF1dG9tYXRvclNlbGVjdG9yKCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChgL2VsZW1lbnQke3BhcmFtcy5tdWx0aXBsZSA/ICdzJyA6ICcnfWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmV4cG9ydCB7IGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9maW5kLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -165,7 +165,8 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
|
|
|
165
165
|
broadcast: 'mobileBroadcast',
|
|
166
166
|
getContexts: 'mobileGetContexts',
|
|
167
167
|
installMultipleApks: 'mobileInstallMultipleApks',
|
|
168
|
-
unlock: 'mobileUnlock'
|
|
168
|
+
unlock: 'mobileUnlock',
|
|
169
|
+
refreshGpsCache: 'mobileRefreshGpsCache'
|
|
169
170
|
};
|
|
170
171
|
|
|
171
172
|
if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
|
|
@@ -244,6 +245,7 @@ helpers.wrapBootstrapDisconnect = async function (wrapped) {
|
|
|
244
245
|
helpers.suspendChromedriverProxy = function () {
|
|
245
246
|
this.chromedriver = null;
|
|
246
247
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
248
|
+
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
247
249
|
this.jwpProxyActive = true;
|
|
248
250
|
};
|
|
249
251
|
|
|
@@ -277,4 +279,4 @@ var _default = extensions;
|
|
|
277
279
|
exports.default = _default;require('source-map-support').install();
|
|
278
280
|
|
|
279
281
|
|
|
280
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXREaXNwbGF5RGVuc2l0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImV4ZWN1dGVNb2JpbGUiLCJtb2JpbGVDb21tYW5kIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJkcmFnR2VzdHVyZSIsImZsaW5nR2VzdHVyZSIsImRvdWJsZUNsaWNrR2VzdHVyZSIsImNsaWNrR2VzdHVyZSIsImxvbmdDbGlja0dlc3R1cmUiLCJwaW5jaENsb3NlR2VzdHVyZSIsInBpbmNoT3Blbkdlc3R1cmUiLCJzd2lwZUdlc3R1cmUiLCJzY3JvbGxHZXN0dXJlIiwic2Nyb2xsQmFja1RvIiwic2Nyb2xsIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0IiwiZGVlcExpbmsiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImFjY2VwdEFsZXJ0IiwiZGlzbWlzc0FsZXJ0IiwiYmF0dGVyeUluZm8iLCJkZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVGltZSIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwiZ2V0Tm90aWZpY2F0aW9ucyIsImxpc3RTbXMiLCJ0eXBlIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRBY3Rpdml0eSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwidW5sb2NrIiwiaGFzIiwiZXJyb3JzIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsImtleXMiLCJtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QiLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJtb2JpbGVWaWV3UG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJzZXRVcmwiLCJ1cmwiLCJzdGFydFVyaSIsIm1vYmlsZURlZXBMaW5rIiwicGFja2FnZSIsInBrZyIsIndhaXRGb3JMYXVuY2giLCJvcGVuTm90aWZpY2F0aW9ucyIsInVwZGF0ZVNldHRpbmdzIiwic2V0dGluZ3MiLCJkcml2ZXJPbmx5U2V0dGluZ3MiLCJzZXJ2ZXJTZXR0aW5ncyIsInNldHRpbmciLCJCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MiLCJpbmNsdWRlcyIsImlzRW1wdHkiLCJ1cGRhdGUiLCJnZXRTZXR0aW5ncyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwiYmluZCIsImp3cFByb3h5QWN0aXZlIiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZVR5cGUiLCJ0ZXh0IiwiaXNVbmRlZmluZWQiLCJ0eXBlVW5pY29kZSIsIm1vYmlsZUluc3RhbGxNdWx0aXBsZUFwa3MiLCJpc0FycmF5IiwiYXBrcyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiQiIsImFsbCIsIm1hcCIsImNvbmZpZ3VyZUFwcCIsIkFQS19FWFRFTlNJT04iLCJvcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLFVBQVUsR0FBRyxFQUFqQjtBQUFBLElBQ0lDLFFBQVEsR0FBRyxFQURmO0FBQUEsSUFFSUMsT0FBTyxHQUFHLEVBRmQ7O0FBSUFELFFBQVEsQ0FBQ0UsYUFBVCxHQUF5QixrQkFBa0I7QUFDekMsU0FBTyxNQUFNLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxLQUE3QyxFQUFvRCxFQUFwRCxDQUFiO0FBQ0QsQ0FGRDs7QUFJQUwsUUFBUSxDQUFDTSxZQUFULEdBQXdCLGtCQUFrQjtBQUN4QyxTQUFRLE9BQU0sS0FBS0MsR0FBTCxDQUFTQyxXQUFULEVBQU4sSUFBK0IsRUFBaEMsR0FDRixNQUFNLEtBQUtMLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw4QkFBbEMsRUFBa0UsTUFBbEUsRUFBMEUsRUFBMUUsQ0FESixHQUVGLE1BQU0sS0FBS0UsR0FBTCxDQUFTRCxZQUFULEVBRlg7QUFHRCxDQUpEOztBQU9BTixRQUFRLENBQUNTLFVBQVQsR0FBc0IsZ0JBQWdCQyxNQUFoQixFQUF3QjtBQUM1QyxRQUFNLEtBQUtQLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxPQUFsQyxFQUEyQyxNQUEzQyxFQUFtREssTUFBbkQsQ0FBTjtB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QUEyQm5HLElBQUksR0FBRyxFQUFsQyxFQUFzQztBQUMxRCxRQUFNO0FBQ0pvRyxJQUFBQTtBQURJLE1BRUZwRyxJQUZKOztBQUdBLE1BQUlOLGdCQUFFMkcsV0FBRixDQUFjRCxJQUFkLENBQUosRUFBeUI7QUFDdkJ0SCxvQkFBSXFCLGFBQUosQ0FBbUIsa0NBQW5CO0FBQ0Q7O0FBQ0QsU0FBTyxNQUFNLEtBQUs1QixHQUFMLENBQVMrSCxXQUFULENBQXFCRixJQUFyQixDQUFiO0FBQ0QsQ0FSRDs7QUF5Q0FwSSxRQUFRLENBQUN1SSx5QkFBVCxHQUFxQyxnQkFBZ0J2RyxJQUFJLEdBQUcsRUFBdkIsRUFBMkI7QUFDOUQsTUFBSSxDQUFDTixnQkFBRThHLE9BQUYsQ0FBVXhHLElBQUksQ0FBQ3lHLElBQWYsQ0FBRCxJQUF5Qi9HLGdCQUFFOEYsT0FBRixDQUFVeEYsSUFBSSxDQUFDeUcsSUFBZixDQUE3QixFQUFtRDtBQUNqRCxVQUFNLElBQUl2Qyx5QkFBT3dDLG9CQUFYLENBQWdDLDhCQUFoQyxDQUFOO0FBQ0Q7O0FBQ0QsUUFBTUQsSUFBSSxHQUFHLE1BQU1FLGtCQUFFQyxHQUFGLENBQU01RyxJQUFJLENBQUN5RyxJQUFMLENBQ3RCSSxHQURzQixDQUNqQjVHLEdBQUQsSUFBUyxLQUFLaEMsT0FBTCxDQUFhNkksWUFBYixDQUEwQjdHLEdBQTFCLEVBQStCLENBQUM4Ryx5QkFBRCxDQUEvQixDQURTLENBQU4sQ0FBbkI7QUFFQSxRQUFNLEtBQUt4SSxHQUFMLENBQVN3RixtQkFBVCxDQUE2QjBDLElBQTdCLEVBQW1DekcsSUFBSSxDQUFDZ0gsT0FBeEMsQ0FBTjtBQUNELENBUEQ7O0FBU0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjbkosVUFBZCxFQUEwQkMsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVGLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucyc7XG5cbmxldCBleHRlbnNpb25zID0ge30sXG4gICAgY29tbWFuZHMgPSB7fSxcbiAgICBoZWxwZXJzID0ge307XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zb3VyY2UnLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG4vLyBOZWVkIHRvIG92ZXJyaWRlIHRoaXMgZm9yIGNvcnJlY3QgdW5pY29kZSBzdXBwb3J0XG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9rZXlzJywgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuLy8gdWlhdXRvbWF0b3IyIGRvZXNuJ3Qgc3VwcG9ydCBtZXRhc3RhdGUgZm9yIGtleWV2ZW50c1xuY29tbWFuZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiAoa2V5Y29kZSwgbWV0YXN0YXRlKSB7XG4gIGxvZy5kZWJ1ZyhgSWdub3JpbmcgbWV0YXN0YXRlICR7bWV0YXN0YXRlfWApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXljb2RlKTtcbn07XG5cbi8vIFVzZSBBREIgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBVaUF1dG9tYXRvclxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoNCk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIGlmICghdGhpcy5vcHRzLmFwcCAmJiAhdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcIk9uZSBvZiAnYXBwJyBvciAnYXBwUGFja2FnZScgY2FwYWJpbGl0aWVzIHNob3VsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgfVxuXG4gIGxldCBhcHAgPSB0aGlzLm9wdHMuYXBwO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcCA9IGF3YWl0IHRoaXMuYWRiLnB1bGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRtcFJvb3QpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHApKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGFwcCBhdCAnJHthcHB9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7YXBrU3RyaW5nc30gPSBhd2FpdCB0aGlzLmFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgdG1wUm9vdCk7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXBrU3RyaW5ncztcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcChhcGtTdHJpbmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZXh0cmFjdCBzdHJpbmdzIGZyb20gJyR7YXBwfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9kaXNwbGF5X2RlbnNpdHknLCAnR0VUJywge30pO1xufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGRvdWJsZUNsaWNrR2VzdHVyZTogJ21vYmlsZURvdWJsZUNsaWNrR2VzdHVyZScsXG4gICAgY2xpY2tHZXN0dXJlOiAnbW9iaWxlQ2xpY2tHZXN0dXJlJyxcbiAgICBsb25nQ2xpY2tHZXN0dXJlOiAnbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZScsXG4gICAgcGluY2hDbG9zZUdlc3R1cmU6ICdtb2JpbGVQaW5jaENsb3NlR2VzdHVyZScsXG4gICAgcGluY2hPcGVuR2VzdHVyZTogJ21vYmlsZVBpbmNoT3Blbkdlc3R1cmUnLFxuICAgIHN3aXBlR2VzdHVyZTogJ21vYmlsZVN3aXBlR2VzdHVyZScsXG4gICAgc2Nyb2xsR2VzdHVyZTogJ21vYmlsZVNjcm9sbEdlc3R1cmUnLFxuICAgIHNjcm9sbEJhY2tUbzogJ21vYmlsZVNjcm9sbEJhY2tUbycsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ21vYmlsZVZpZXdQb3J0UmVjdCcsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBhY2NlcHRBbGVydDogJ21vYmlsZUFjY2VwdEFsZXJ0JyxcbiAgICBkaXNtaXNzQWxlcnQ6ICdtb2JpbGVEaXNtaXNzQWxlcnQnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG5cbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHR5cGU6ICdtb2JpbGVUeXBlJyxcbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdwb3J0U2NyZWVuc2hvdCgpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWN0YW5nbGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIFJlY3RhbmdsZS5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICogQHJldHVybnMge1JlY3RhbmdsZX0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICovXG5jb21tYW5kcy5tb2JpbGVWaWV3UG9ydFJlY3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVWaWV3UG9ydFJlY3QgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbn07XG5cbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uICh1cmwpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZXBMaW5rT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSB1cmwgLSBUaGUgbmFtZSBvZiBVUkwgdG8gc3RhcnQuXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBzdGFydCB0aGUgVVJJIHdpdGguXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgVVJMIHRoYXQgdGFrZSB1c2VycyBkaXJlY3RseSB0byBzcGVjaWZpYyBjb250ZW50IGluIHRoZSBhcHBcbiAqIEBwYXJhbSB7RGVlcExpbmtPcHRzfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlZXBMaW5rID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXJsLFxuICAgIHBhY2thZ2U6IHBrZyxcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVybCwgcGtnLCB7IHdhaXRGb3JMYXVuY2ggfSk7XG59O1xuXG5jb21tYW5kcy5vcGVuTm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2Uvb3Blbl9ub3RpZmljYXRpb25zJywgJ1BPU1QnLCB7fSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAvLyB3ZSBoYXZlIHNvbWUgc2V0dGluZ3MgdGhhdCBhcmUgc2V0IG9uIHRoZSBzZXR0aW5ncyBvYmplY3QgaW4gdGhlIGRyaXZlclxuICAvLyBvbmx5LCBmb3IgZXhhbXBsZSBpbWFnZSBmaW5kaW5nIHNldHRpbmdzLiBUaGUgdWlhdXRvMiBzZXJ2ZXIgZG9lcyBub3Qga25vd1xuICAvLyB3aGF0IHRvIGRvIHdpdGggdGhlbSwgc28ganVzdCBzZXQgdGhlbSBvbiB0aGlzIGRyaXZlcidzIHNldHRpbmdzIGluc3RhbmNlLFxuICAvLyBhbmQgZG9uJ3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBzZXJ2ZXJcbiAgbGV0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHt9O1xuICBsZXQgc2VydmVyU2V0dGluZ3MgPSB7fTtcbiAgZm9yIChsZXQgW3NldHRpbmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ3MpKSB7XG4gICAgaWYgKEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUy5pbmNsdWRlcyhzZXR0aW5nKSkge1xuICAgICAgZHJpdmVyT25seVNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlclNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGRyaXZlck9ubHlTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbyhgRm91bmQgc29tZSBzZXR0aW5ncyBkZXNpZ25lZCB0byBiZSBoYW5kbGVkIGJ5IEJhc2VEcml2ZXI6IGAgK1xuICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhkcml2ZXJPbmx5U2V0dGluZ3MpKX0uIE5vdCBgICtcbiAgICAgICAgICAgICBgc2VuZGluZyB0aGVzZSBvbiB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlciBhbmQgaW5zdGVhZCBgICtcbiAgICAgICAgICAgICBgc2V0dGluZyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyYCk7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy51cGRhdGUoZHJpdmVyT25seVNldHRpbmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXJ2ZXJTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbygnRm9yd2FyZGluZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyOiAnICtcbiAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShfLmtleXMoc2VydmVyU2V0dGluZ3MpKSk7XG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ1BPU1QnLFxuICAgICAge3NldHRpbmdzOiBzZXJ2ZXJTZXR0aW5nc30pO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gYXMgYWJvdmUsIHdlIG1pZ2h0IGhhdmUgc29tZSBkcml2ZXItb25seSBzZXR0aW5ncyB0byByZXR1cm4gYXMgd2VsbFxuICBjb25zdCBkcml2ZXJPbmx5U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCk7XG4gIGNvbnN0IHNlcnZlclNldHRpbmdzID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ0dFVCcpO1xuICByZXR1cm4gey4uLmRyaXZlck9ubHlTZXR0aW5ncywgLi4uc2VydmVyU2V0dGluZ3N9O1xufTtcblxuLyoqXG4gKiBPdmVycmlkaW5nIGFwcGl1bS1hbmRyb2lkLWRyaXZlcidzIHdyYXBCb290c3RyYXBEaXNjb25uZWN0LFxuICogdW5saWtlIGluIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBhdm9pZGluZyBhZGIgcmVzdGFydGluZyBhcyBpdCBpbnRlcm5cbiAqIGtpbGxzIFVpQXV0b21hdG9yMiBzZXJ2ZXIgcnVubmluZyBpbiB0aGUgZGV2aWNlLlxuICoqL1xuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uICh3cmFwcGVkKSB7XG4gIGF3YWl0IHdyYXBwZWQoKTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlciBhbmQgcmVkaXJlY3QgdG8gdWlhdXRvbWF0b3IyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgaW5mbyBlbnRyaWVzIGNhbiBiZSBmb3VuZCBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tdWlhdXRvbWF0b3IyLXNlcnZlci9ibG9iL21hc3Rlci9hcHAvc3JjL21haW4vamF2YS9pby9hcHBpdW0vdWlhdXRvbWF0b3IyL2hhbmRsZXIvR2V0RGV2aWNlSW5mby5qYXZhXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZUluZm8gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2luZm8nLCAnR0VUJyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xudW1iZXJ8Ym9vbGVhbn0gdGV4dCAtIFRoZSB0ZXh0IHRvIHR5cGVcbiAqL1xuXG4vKipcbiAqIFR5cGVzIHRoZSBnaXZlbiBVbmljb2RlIHN0cmluZy5cbiAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZvY3VzIGlzIGFscmVhZHkgcHV0XG4gKiB0byB0aGUgZGVzdGluYXRpb24gaW5wdXQgZmllbGQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge1R5cGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGlucHV0IHRleHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gYWRiXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYHRleHRgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBwcm92aWRlZFxuICovXG5jb21tYW5kcy5tb2JpbGVUeXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVHlwZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0ZXh0LFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNVbmRlZmluZWQodGV4dCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlICd0ZXh0JyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudHlwZVVuaWNvZGUodGV4dCk7XG59O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXJ0aWFsSW5zdGFsbCBbZmFsc2VdIC0gSW5zdGFsbCBhcGtzIHBhcnRpYWxseS4gSXQgaXMgdXNlZCBmb3IgJ2luc3RhbGwtbXVsdGlwbGUnLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGFwa3MgLSBUaGUgbGlzdCBvZiBBUEtzIHRvIGluc3RhbGwuIEVhY2ggQVBLIHNob3VsZCBiZSBhIHBhdGggdG8gYSBhcGtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvd25sb2FkYWJsZSBVUkwgYXMgSFRUUC9IVFRQUy5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgbXVsdGlwbGUgQVBLcyB3aXRoIGBpbnN0YWxsLW11bHRpcGxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5zdGFsbGluZyB0aGUgZ2l2ZW4gQVBLcy5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzQXJyYXkob3B0cy5hcGtzKSB8fCBfLmlzRW1wdHkob3B0cy5hcGtzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ05vIGFwa3MgYXJlIGdpdmVuIHRvIGluc3RhbGwnKTtcbiAgfVxuICBjb25zdCBhcGtzID0gYXdhaXQgQi5hbGwob3B0cy5hcGtzXG4gICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT05dKSkpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsTXVsdGlwbGVBcGtzKGFwa3MsIG9wdHMub3B0aW9ucyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2dlbmVyYWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
282
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXREaXNwbGF5RGVuc2l0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImV4ZWN1dGVNb2JpbGUiLCJtb2JpbGVDb21tYW5kIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJkcmFnR2VzdHVyZSIsImZsaW5nR2VzdHVyZSIsImRvdWJsZUNsaWNrR2VzdHVyZSIsImNsaWNrR2VzdHVyZSIsImxvbmdDbGlja0dlc3R1cmUiLCJwaW5jaENsb3NlR2VzdHVyZSIsInBpbmNoT3Blbkdlc3R1cmUiLCJzd2lwZUdlc3R1cmUiLCJzY3JvbGxHZXN0dXJlIiwic2Nyb2xsQmFja1RvIiwic2Nyb2xsIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0IiwiZGVlcExpbmsiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImFjY2VwdEFsZXJ0IiwiZGlzbWlzc0FsZXJ0IiwiYmF0dGVyeUluZm8iLCJkZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVGltZSIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwiZ2V0Tm90aWZpY2F0aW9ucyIsImxpc3RTbXMiLCJ0eXBlIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRBY3Rpdml0eSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwidW5sb2NrIiwicmVmcmVzaEdwc0NhY2hlIiwiaGFzIiwiZXJyb3JzIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsImtleXMiLCJtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QiLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJtb2JpbGVWaWV3UG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJzZXRVcmwiLCJ1cmwiLCJzdGFydFVyaSIsIm1vYmlsZURlZXBMaW5rIiwicGFja2FnZSIsInBrZyIsIndhaXRGb3JMYXVuY2giLCJvcGVuTm90aWZpY2F0aW9ucyIsInVwZGF0ZVNldHRpbmdzIiwic2V0dGluZ3MiLCJkcml2ZXJPbmx5U2V0dGluZ3MiLCJzZXJ2ZXJTZXR0aW5ncyIsInNldHRpbmciLCJCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MiLCJpbmNsdWRlcyIsImlzRW1wdHkiLCJ1cGRhdGUiLCJnZXRTZXR0aW5ncyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cFByb3h5QWN0aXZlIiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZVR5cGUiLCJ0ZXh0IiwiaXNVbmRlZmluZWQiLCJ0eXBlVW5pY29kZSIsIm1vYmlsZUluc3RhbGxNdWx0aXBsZUFwa3MiLCJpc0FycmF5IiwiYXBrcyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiQiIsImFsbCIsIm1hcCIsImNvbmZpZ3VyZUFwcCIsIkFQS19FWFRFTlNJT04iLCJvcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLFVBQVUsR0FBRyxFQUFqQjtBQUFBLElBQ0lDLFFBQVEsR0FBRyxFQURmO0FBQUEsSUFFSUMsT0FBTyxHQUFHLEVBRmQ7O0FBSUFELFFBQVEsQ0FBQ0UsYUFBVCxHQUF5QixrQkFBa0I7QUFDekMsU0FBTyxNQUFNLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxLQUE3QyxFQUFvRCxFQUFwRCxDQUFiO0FBQ0QsQ0FGRDs7QUFJQUwsUUFBUSxDQUFDTSxZQUFULEdBQXdCLGtCQUFrQjtBQUN4QyxTQUFRLE9BQU0sS0FBS0MsR0FBTCxDQUFTQyxXQUFULEVBQU4sSUFBK0IsRUFBaEMsR0FDRixNQUFNLEtBQUtMLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw4QkFBbEMsRUFBa0UsTUFBbEUsRUFBMEUsRUFBMUUsQ0FESixHQUVGLE1BQU0sS0FBS0UsR0FBTCxDQUFTRCxZQUFULEVBRlg7QUFHRCxDQUpEOztBQU9BTixRQUFRLENBQUNTLFVBQVQsR0FBc0IsZ0JBQWdCQyxNQUFoQixFQUF3QjtBQUM1QyxRQUFNLEtBQUtQLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxPQUFs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ckosVUFBZCxFQUEwQkMsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVGLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucyc7XG5cbmxldCBleHRlbnNpb25zID0ge30sXG4gICAgY29tbWFuZHMgPSB7fSxcbiAgICBoZWxwZXJzID0ge307XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zb3VyY2UnLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG4vLyBOZWVkIHRvIG92ZXJyaWRlIHRoaXMgZm9yIGNvcnJlY3QgdW5pY29kZSBzdXBwb3J0XG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9rZXlzJywgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuLy8gdWlhdXRvbWF0b3IyIGRvZXNuJ3Qgc3VwcG9ydCBtZXRhc3RhdGUgZm9yIGtleWV2ZW50c1xuY29tbWFuZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiAoa2V5Y29kZSwgbWV0YXN0YXRlKSB7XG4gIGxvZy5kZWJ1ZyhgSWdub3JpbmcgbWV0YXN0YXRlICR7bWV0YXN0YXRlfWApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXljb2RlKTtcbn07XG5cbi8vIFVzZSBBREIgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBVaUF1dG9tYXRvclxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoNCk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIGlmICghdGhpcy5vcHRzLmFwcCAmJiAhdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcIk9uZSBvZiAnYXBwJyBvciAnYXBwUGFja2FnZScgY2FwYWJpbGl0aWVzIHNob3VsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgfVxuXG4gIGxldCBhcHAgPSB0aGlzLm9wdHMuYXBwO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcCA9IGF3YWl0IHRoaXMuYWRiLnB1bGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRtcFJvb3QpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHApKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGFwcCBhdCAnJHthcHB9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7YXBrU3RyaW5nc30gPSBhd2FpdCB0aGlzLmFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgdG1wUm9vdCk7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXBrU3RyaW5ncztcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcChhcGtTdHJpbmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZXh0cmFjdCBzdHJpbmdzIGZyb20gJyR7YXBwfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9kaXNwbGF5X2RlbnNpdHknLCAnR0VUJywge30pO1xufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGRvdWJsZUNsaWNrR2VzdHVyZTogJ21vYmlsZURvdWJsZUNsaWNrR2VzdHVyZScsXG4gICAgY2xpY2tHZXN0dXJlOiAnbW9iaWxlQ2xpY2tHZXN0dXJlJyxcbiAgICBsb25nQ2xpY2tHZXN0dXJlOiAnbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZScsXG4gICAgcGluY2hDbG9zZUdlc3R1cmU6ICdtb2JpbGVQaW5jaENsb3NlR2VzdHVyZScsXG4gICAgcGluY2hPcGVuR2VzdHVyZTogJ21vYmlsZVBpbmNoT3Blbkdlc3R1cmUnLFxuICAgIHN3aXBlR2VzdHVyZTogJ21vYmlsZVN3aXBlR2VzdHVyZScsXG4gICAgc2Nyb2xsR2VzdHVyZTogJ21vYmlsZVNjcm9sbEdlc3R1cmUnLFxuICAgIHNjcm9sbEJhY2tUbzogJ21vYmlsZVNjcm9sbEJhY2tUbycsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ21vYmlsZVZpZXdQb3J0UmVjdCcsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBhY2NlcHRBbGVydDogJ21vYmlsZUFjY2VwdEFsZXJ0JyxcbiAgICBkaXNtaXNzQWxlcnQ6ICdtb2JpbGVEaXNtaXNzQWxlcnQnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG5cbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHR5cGU6ICdtb2JpbGVUeXBlJyxcbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuXG4gICAgcmVmcmVzaEdwc0NhY2hlOiAnbW9iaWxlUmVmcmVzaEdwc0NhY2hlJyxcbiAgfTtcblxuICBpZiAoIV8uaGFzKG1vYmlsZUNvbW1hbmRzTWFwcGluZywgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgXCIke21vYmlsZUNvbW1hbmR9XCIuIGAgK1xuICAgICAgYE9ubHkgJHtfLmtleXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nKX0gY29tbWFuZHMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpc1ttb2JpbGVDb21tYW5kc01hcHBpbmdbbW9iaWxlQ29tbWFuZF1dKG9wdHMpO1xufTtcblxuY29tbWFuZHMubW9iaWxlVmlld3BvcnRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWV3cG9ydFNjcmVlbnNob3QoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVjdGFuZ2xlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAqIEByZXR1cm5zIHtSZWN0YW5nbGV9IFRoZSB2aWV3cG9ydCBjb29yZGluYXRlcy5cbiAqL1xuY29tbWFuZHMubW9iaWxlVmlld1BvcnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVmlld1BvcnRSZWN0ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG59O1xuXG5jb21tYW5kcy5zZXRVcmwgPSBhc3luYyBmdW5jdGlvbiAodXJsKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVybCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWVwTGlua09wdHNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gdXJsIC0gVGhlIG5hbWUgb2YgVVJMIHRvIHN0YXJ0LlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBwYWNrYWdlIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gc3RhcnQgdGhlIFVSSSB3aXRoLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gd2FpdEZvckxhdW5jaCBbdHJ1ZV0gLSBpZiBgZmFsc2VgIHRoZW4gYWRiIHdvbid0IHdhaXRcbiAqIGZvciB0aGUgc3RhcnRlZCBhY3Rpdml0eSB0byByZXR1cm4gdGhlIGNvbnRyb2xcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IFVSTCB0aGF0IHRha2UgdXNlcnMgZGlyZWN0bHkgdG8gc3BlY2lmaWMgY29udGVudCBpbiB0aGUgYXBwXG4gKiBAcGFyYW0ge0RlZXBMaW5rT3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVEZWVwTGluayA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVybCxcbiAgICBwYWNrYWdlOiBwa2csXG4gICAgd2FpdEZvckxhdW5jaCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHBrZywgeyB3YWl0Rm9yTGF1bmNoIH0pO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL29wZW5fbm90aWZpY2F0aW9ucycsICdQT1NUJywge30pO1xufTtcblxuY29tbWFuZHMudXBkYXRlU2V0dGluZ3MgPSBhc3luYyBmdW5jdGlvbiAoc2V0dGluZ3MpIHtcbiAgLy8gd2UgaGF2ZSBzb21lIHNldHRpbmdzIHRoYXQgYXJlIHNldCBvbiB0aGUgc2V0dGluZ3Mgb2JqZWN0IGluIHRoZSBkcml2ZXJcbiAgLy8gb25seSwgZm9yIGV4YW1wbGUgaW1hZ2UgZmluZGluZyBzZXR0aW5ncy4gVGhlIHVpYXV0bzIgc2VydmVyIGRvZXMgbm90IGtub3dcbiAgLy8gd2hhdCB0byBkbyB3aXRoIHRoZW0sIHNvIGp1c3Qgc2V0IHRoZW0gb24gdGhpcyBkcml2ZXIncyBzZXR0aW5ncyBpbnN0YW5jZSxcbiAgLy8gYW5kIGRvbid0IGZvcndhcmQgdGhlbSB0byB0aGUgc2VydmVyXG4gIGxldCBkcml2ZXJPbmx5U2V0dGluZ3MgPSB7fTtcbiAgbGV0IHNlcnZlclNldHRpbmdzID0ge307XG4gIGZvciAobGV0IFtzZXR0aW5nLCB2YWx1ZV0gb2YgXy50b1BhaXJzKHNldHRpbmdzKSkge1xuICAgIGlmIChCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MuaW5jbHVkZXMoc2V0dGluZykpIHtcbiAgICAgIGRyaXZlck9ubHlTZXR0aW5nc1tzZXR0aW5nXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXJ2ZXJTZXR0aW5nc1tzZXR0aW5nXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShkcml2ZXJPbmx5U2V0dGluZ3MpKSB7XG4gICAgbG9nLmluZm8oYEZvdW5kIHNvbWUgc2V0dGluZ3MgZGVzaWduZWQgdG8gYmUgaGFuZGxlZCBieSBCYXNlRHJpdmVyOiBgICtcbiAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShfLmtleXMoZHJpdmVyT25seVNldHRpbmdzKSl9LiBOb3QgYCArXG4gICAgICAgICAgICAgYHNlbmRpbmcgdGhlc2Ugb24gdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXIgYW5kIGluc3RlYWQgYCArXG4gICAgICAgICAgICAgYHNldHRpbmcgZGlyZWN0bHkgb24gdGhlIGRyaXZlcmApO1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKGRyaXZlck9ubHlTZXR0aW5ncyk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoc2VydmVyU2V0dGluZ3MpKSB7XG4gICAgbG9nLmluZm8oJ0ZvcndhcmRpbmcgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlcjogJyArXG4gICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoXy5rZXlzKHNlcnZlclNldHRpbmdzKSkpO1xuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9zZXR0aW5ncycsICdQT1NUJyxcbiAgICAgIHtzZXR0aW5nczogc2VydmVyU2V0dGluZ3N9KTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0U2V0dGluZ3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIGFzIGFib3ZlLCB3ZSBtaWdodCBoYXZlIHNvbWUgZHJpdmVyLW9ubHkgc2V0dGluZ3MgdG8gcmV0dXJuIGFzIHdlbGxcbiAgY29uc3QgZHJpdmVyT25seVNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpO1xuICBjb25zdCBzZXJ2ZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9zZXR0aW5ncycsICdHRVQnKTtcbiAgcmV0dXJuIHsuLi5kcml2ZXJPbmx5U2V0dGluZ3MsIC4uLnNlcnZlclNldHRpbmdzfTtcbn07XG5cbi8qKlxuICogT3ZlcnJpZGluZyBhcHBpdW0tYW5kcm9pZC1kcml2ZXIncyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCxcbiAqIHVubGlrZSBpbiBhcHBpdW0tYW5kcm9pZC1kcml2ZXIgYXZvaWRpbmcgYWRiIHJlc3RhcnRpbmcgYXMgaXQgaW50ZXJuXG4gKiBraWxscyBVaUF1dG9tYXRvcjIgc2VydmVyIHJ1bm5pbmcgaW4gdGhlIGRldmljZS5cbiAqKi9cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiAod3JhcHBlZCkge1xuICBhd2FpdCB3cmFwcGVkKCk7XG59O1xuXG4vLyBTdG9wIHByb3h5aW5nIHRvIGFueSBDaHJvbWVkcml2ZXIgYW5kIHJlZGlyZWN0IHRvIHVpYXV0b21hdG9yMlxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXBrcyAtIFRoZSBsaXN0IG9mIEFQS3MgdG8gaW5zdGFsbC4gRWFjaCBBUEsgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGFwa1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG93bmxvYWRhYmxlIFVSTCBhcyBIVFRQL0hUVFBTLlxuICogQHByb3BlcnR5IHtJbnN0YWxsT3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogSW5zdGFsbCBtdWx0aXBsZSBBUEtzIHdpdGggYGluc3RhbGwtbXVsdGlwbGVgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0luc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBnaXZlbiBBUEtzLlxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNBcnJheShvcHRzLmFwa3MpIHx8IF8uaXNFbXB0eShvcHRzLmFwa3MpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTm8gYXBrcyBhcmUgZ2l2ZW4gdG8gaW5zdGFsbCcpO1xuICB9XG4gIGNvbnN0IGFwa3MgPSBhd2FpdCBCLmFsbChvcHRzLmFwa3NcbiAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTl0pKSk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGxNdWx0aXBsZUFwa3MoYXBrcywgb3B0cy5vcHRpb25zKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|