appium-espresso-driver 1.48.0 → 2.0.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.
Files changed (39) hide show
  1. package/README.md +114 -8
  2. package/build/index.js +1 -1
  3. package/build/lib/commands/execute.js +7 -5
  4. package/build/lib/commands/general.js +21 -20
  5. package/build/lib/driver.js +11 -10
  6. package/build/lib/espresso-runner.js +18 -17
  7. package/build/lib/logger.js +3 -3
  8. package/build/lib/server-builder.js +11 -10
  9. package/build/lib/server.js +5 -5
  10. package/build/lib/utils.js +6 -6
  11. package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
  12. package/espresso-server/app/build.gradle.kts +13 -3
  13. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +1 -2
  14. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +0 -8
  15. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +35 -4
  16. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +25 -5
  17. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +75 -10
  18. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +6 -0
  19. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +14 -14
  20. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +12 -2
  21. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AttributesEnum.kt +111 -0
  22. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ComposeNodeElement.kt +18 -24
  23. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +78 -51
  24. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +1 -1
  25. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +4 -3
  26. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +2 -2
  27. package/lib/commands/execute.js +6 -2
  28. package/lib/commands/general.js +3 -2
  29. package/lib/driver.js +24 -4
  30. package/lib/espresso-runner.js +3 -2
  31. package/lib/logger.js +1 -1
  32. package/lib/server-builder.js +5 -2
  33. package/lib/server.js +1 -1
  34. package/lib/utils.js +1 -1
  35. package/package.json +17 -14
  36. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +0 -26
  37. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +0 -61
  38. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +0 -122
  39. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +0 -51
package/README.md CHANGED
@@ -61,7 +61,7 @@ appium:showGradleLog | Whether to include Gradle log to the regular server logs
61
61
 
62
62
  Capability Name | Description
63
63
  --- | ---
64
- appium:app | Full path to the application to be tested (the app must be located on the same machine where the server is running). Both `.apk` and `.apks` application extensions are supported. Could also be an URL to a remote location. If neither of the `app` or `appPackage` capabilities are provided then the driver will fail to start a session. Also, if `app` capability is not provided it is expected that the app under test is already installed on the device under test and `noReset` is equal to `true`.
64
+ appium:app | Full path to the application to be tested (the app must be located on the same machine where the server is running). Only `.apk` application extension is supported. `.aab` files need to be [converted](https://stackoverflow.com/questions/53040047/generate-apk-file-from-aab-file-android-app-bundle) to `.apk` format using [bundletool](https://developer.android.com/studio/command-line/bundletool) first in order to be used with this driver. Could also be an URL to a remote location. If neither of the `app` or `appPackage` capabilities are provided then the driver will fail to start a session. Also, if `app` capability is not provided it is expected that the app under test is already installed on the device under test and `noReset` is equal to `true`.
65
65
  appium:appPackage | Application package identifier to be started. If not provided then Espresso will try to detect it automatically from the package provided by the `app` capability. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
66
66
  appium:appActivity | Main application activity identifier. If not provided then Espresso will try to detect it automatically from the package provided by the `app` capability. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
67
67
  appium:appWaitActivity | Identifier of the first activity that the application invokes. If not provided then equals to `appium:appActivity`. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
@@ -134,6 +134,7 @@ Capability Name | Description
134
134
  appium:skipUnlock | Whether to skip the check for lock screen presence (`true`). By default Espresso driver tries to detect if the device's screen is locked before starting the test and to unlock that (which sometimes might be unstable). Note, that this operation takes some time, so it is highly recommended to set this capability to `false` and disable screen locking on devices under test.
135
135
  appium:unlockType | Set one of the possible types of Android lock screens to unlock. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
136
136
  appium:unlockKey | Allows to set an unlock key. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
137
+ appium:unlockStrategy | Either 'locksettings' (default) or 'uiautomator'. Setting it to 'uiautomator' will enforce the driver to avoid using special ADB shortcuts in order to speed up the unlock procedure.
137
138
  appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the device is unlocked. `2000` ms by default
138
139
 
139
140
  ### Web Context
@@ -167,6 +168,42 @@ Capability Name | Description
167
168
  appium:disableSuppressAccessibilityService | Being set to `true` tells the instrumentation process to not suppress accessibility services during the automated test. This might be useful if your automated test needs these services. `false` by default
168
169
 
169
170
 
171
+ ## Settings API
172
+
173
+ Espresso driver supports Appium [Settings API](https://appium.io/docs/en/advanced-concepts/settings/).
174
+ Along with the common settings the following driver-specific settings are currently available:
175
+
176
+ Name | Type | Description
177
+ --- | --- | ---
178
+ driver | 'compose' or 'espresso' | The name of the subdriver to use for elements interactions. The default value is `espresso`. Switching the value to `compose` enables interactions with [Jetpack Compose](https://developer.android.com/jetpack/compose)-based application user interfaces. Read [Jetpack Compose Support](#jetpack-compose-support) for more details.
179
+
180
+
181
+ ## Jetpack Compose Support
182
+
183
+ [Jetpack Compose](https://developer.android.com/jetpack/compose) is Android’s modern toolkit for building native UI. Espresso driver supports basic interactions with Compose-based applications since version *1.46.0*.
184
+
185
+ ### Interaction With Compose Elements
186
+
187
+ Espresso driver has the concept of subdrivers. This works quite similarly to the concept of contexts, while contexts are used to switch between native and web, and subdrivers are still
188
+ under the native one. Each subdriver operates its own elements cache, so it is not be possible
189
+ to mix Espresso and Compose elements.
190
+
191
+ In order to change between subdrivers use the [driver](#settings-api) setting. Setting its value to `compose` modifies driver behavior in the way it interacts with Compose elements rather that with classic Android views. It is possible to switch between `espresso` and `compose` modes at any point of time. When `compose` mode is active the the following webdriver commands behave differently (as of driver version *1.50.0*):
192
+ - findElement(s): Element finding commands only support Compose-based locators. Read [Compose Elements Location](#compose-elements-location) for more details.
193
+ - getPageSource: The returned page source is retrieved from Compose and all elements there contain [Compose-specific](#compose-element-attributes) attributes.
194
+ - click, isDisplayed, isEnabled, clear, getText, sendKeys, getElementRect, getValue: These commands should properly support compose elements.
195
+ - getAttribute: Accepts and returns Compose-specific element attributes. See [Compose Element Attributes](#compose-element-attributes) for the full list of supported Compose element attributes.
196
+
197
+ Calling other driver element-specific APIs not listed above would most likely throw an exception as Compose and Espresso elements are being stored in completely separated internal caches and must not be mixed.
198
+
199
+ You could also check end-to-end tests for more examples on how to setup test capabilities and
200
+ on the Compose usage in general:
201
+ - https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-componse-element-values-e2e-specs.js
202
+ - https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-attributes-e2e-specs.js
203
+ - https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-e2e-specs.js
204
+ - https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-e2e-specs.js
205
+
206
+
170
207
  ## Espresso Build Config
171
208
 
172
209
  Espresso server is in tight connection with the application under test. That is why it is important that the server uses the same versions of common dependencies and there are no conflicts. Espresso driver allows to configure several build options via `espressoBuildConfig` capability. The configuration JSON supports the following entries:
@@ -184,6 +221,9 @@ buildTools | Target Android build tools version to compile the server with. By d
184
221
  minSdk | Minimum Android SDK version to compile the server for. By default the version from the app [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/build.gradle.kts) is used | 18
185
222
  targetSdk | Target Android SDK version to compile the server for. By default the version from the app [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/build.gradle.kts) is used | 28
186
223
  kotlin | Kotlin version to compile the server for. By default the version from the [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/build.gradle.kts) is used | '1.3.72'
224
+ sourceCompatibility | The minimum version of JVM the project sources are compatible with. The default value is `VERSION_1_8` | VERSION_12
225
+ sourceCompatibility | The target version of JVM the project sources are compatible with. The default value is `VERSION_1_8` | VERSION_12
226
+ jvmTarget | Target version of the generated JVM bytecode as a string. The default value is `1.8` | `1_10`
187
227
 
188
228
  ### additionalAppDependencies
189
229
 
@@ -251,9 +291,9 @@ Name | Type | Description | Example
251
291
  launchDisplayId | string or int | Display id which you want to assign to launch the main app activity on. This might be useful if the device under test supports multiple displays | 1
252
292
 
253
293
 
254
- ## Element Attributes
294
+ ## Espresso Element Attributes
255
295
 
256
- Espresso driver supports the following element attributes:
296
+ Espresso driver supports the following element attributes in `espresso` subdriver:
257
297
 
258
298
  Name | Description | Example
259
299
  --- | --- | ---
@@ -281,9 +321,31 @@ visible | Whether the element is visible to the user | 'true'
281
321
  view-tag | The tag value assigned to the element. Could be `null` | 'my tag'
282
322
 
283
323
 
284
- ## Element Location
324
+ ## Compose Element Attributes
285
325
 
286
- Espresso driver supports the following location strategies:
326
+ Espresso driver supports the following element attributes in `compose` subdriver:
327
+
328
+ Name | Description | Example
329
+ --- | --- | ---
330
+ bounds | The element's visible frame (`[left, top][right, bottom]`) | `[0,0][100,100]`
331
+ checked | Whether the element is checked. Always `false` if the element is not checkable | 'false'
332
+ class | The full name of the element's class. Could be `ComposeNode` for some elements | 'ComposeNode'
333
+ clickable | Whether the element could be clicked | 'false'
334
+ content-desc | The content-description attribute of the accessible element | 'foo'
335
+ enabled | Whether the element could be clicked | 'true'
336
+ focused | Whether the element could is focused. Always `false` if the element is not focusable | 'false'
337
+ index | Element's index in the tree hierarchy | `0`
338
+ password | Whether the element is a password input field | 'true'
339
+ resource-id | Element's resource identifier. Could be `null` | 'com.mycompany:id/resId'
340
+ scrollable | Whether the element is scrollable | 'true'
341
+ selected | Whether the element is selected | 'false'
342
+ text | The element's text | 'my text'
343
+ view-tag | The [testTag](https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/package-summary#(androidx.compose.ui.Modifier).testTag(kotlin.String)) element's value. Could be `null` | 'my tag'
344
+
345
+
346
+ ## Espresso Elements Location
347
+
348
+ Espresso driver supports the following location strategies in `espresso` subdriver:
287
349
 
288
350
  Name | Description | Example
289
351
  --- | --- | ---
@@ -297,6 +359,18 @@ text | This strategy is mapped to the native Espresso `withText` [matcher](https
297
359
  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. | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
298
360
 
299
361
 
362
+ ## Compose Elements Location
363
+
364
+ Espresso driver supports the following location strategies in `compose` subdriver:
365
+
366
+ Name | Description | Example
367
+ --- | --- | ---
368
+ accessibility id | This strategy is mapped to the native Espresso `hasContentDescription` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasContentDescription(kotlin.String,kotlin.Boolean,kotlin.Boolean)) (exact match of element's content description). | 'my description'
369
+ `-android viewtag` or `tag name` | This strategy is mapped to the native Compose `hasTestTag` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasTestTag(kotlin.String)) (exact match of element's tag value). | 'my tag'
370
+ `text` or `link text` | This strategy is mapped to the native Compose `hasText` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasText(kotlin.String,kotlin.Boolean,kotlin.Boolean)) (exact match of element's text). | 'my text'
371
+ 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. | `By.xpath("//ComposeNode[@text=\"Regular\" and @selected=\"true\"]")`
372
+
373
+
300
374
  ## Platform-Specific Extensions
301
375
 
302
376
  Beside of standard W3C APIs the driver provides the following custom command extensions to execute platform specific scenarios:
@@ -612,14 +686,33 @@ The example output is:
612
686
 
613
687
  ### mobile: sensorSet
614
688
 
615
- Emulate sensors values on the connected emulator.
689
+ Emulate changing of sensor values on the connected emulator.
690
+ This extension does not work on real devices.
691
+
692
+ #### Arguments
693
+
694
+ Name | Type | Required | Description | Example
695
+ --- | --- | --- | --- | ---
696
+ 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
697
+ 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
698
+
699
+ ### mobile: refreshGpsCache
700
+
701
+ Sends a request to refresh the GPS cache on the device under test.
702
+ By default the location tracking is configured for
703
+ [low battery consumption](https://github.com/appium/io.appium.settings/blob/master/app/src/main/java/io/appium/settings/LocationTracker.java),
704
+ so you might need to call this extension periodically to get the updated geo
705
+ location if the actual (or mocked) device location is changed too frequently.
706
+ The feature only works if the device under test has Google Play Services installed.
707
+ In case the vanilla
708
+ [LocationManager](https://developer.android.com/reference/android/location/LocationManager)
709
+ is used the device API level must be at version 30 (Android R) or higher.
616
710
 
617
711
  #### Arguments
618
712
 
619
713
  Name | Type | Required | Description | Example
620
714
  --- | --- | --- | --- | ---
621
- sensorType | string | yes | Supported sensor types are: `acceleration`, `light`, `proximity`, `temperature`, `pressure` and `humidity` | light
622
- value | string | yes | value to set to the sensor | 50
715
+ 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
623
716
 
624
717
  ### mobile: deleteFile
625
718
 
@@ -792,6 +885,19 @@ Lists all the previously registered [idling resources](https://developer.android
792
885
 
793
886
  List of fully qualified class names of currently registered idling resources or an empty list if no resources have been registered yet.
794
887
 
888
+ ### mobile: unlock
889
+
890
+ Unlocks the device if it is locked. Noop if the device's screen is not locked.
891
+
892
+ #### Arguments
893
+
894
+ Name | Type | Required | Description | Example
895
+ --- | --- | --- | --- | ---
896
+ key | string | yes | The unlock key. See the documentation on [appium:unlockKey](#device-locking) capability for more details | 12345
897
+ type | string | yes | The unlock type. See the documentation on [appium:unlockType](#device-locking) capability for more details | password
898
+ strategy | string | no | Unlock strategy. See the documentation on [appium:unlockStrategy](#device-locking) capability for more details | uiautomator
899
+ timeoutMs | number | no | Unlock timeout. See the documentation on [appium:unlockSuccessTimeout](#device-locking) capability for more details | 5000
900
+
795
901
 
796
902
  ## Backdoor Extension Usage
797
903
 
package/build/index.js CHANGED
@@ -5,7 +5,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.startServer = exports.EspressoDriver = void 0;
8
+ exports.startServer = exports.default = exports.EspressoDriver = void 0;
9
9
 
10
10
  require("source-map-support/register");
11
11
 
@@ -11,9 +11,9 @@ require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _appiumBaseDriver = require("appium-base-driver");
14
+ var _baseDriver = require("@appium/base-driver");
15
15
 
16
- let extensions = {};
16
+ const extensions = {};
17
17
 
18
18
  extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}) {
19
19
  const mobileCommandsMapping = {
@@ -50,11 +50,13 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
50
50
  stopService: 'mobileStopService',
51
51
  registerIdlingResources: 'mobileRegisterIdlingResources',
52
52
  unregisterIdlingResources: 'mobileUnregisterIdlingResources',
53
- listIdlingResources: 'mobileListIdlingResources'
53
+ listIdlingResources: 'mobileListIdlingResources',
54
+ unlock: 'mobileUnlock',
55
+ refreshGpsCache: 'mobileRefreshGpsCache'
54
56
  };
55
57
 
56
58
  if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
57
- throw new _appiumBaseDriver.errors.UnknownCommandError(`Unknown mobile command "${mobileCommand}". ` + `Only ${_lodash.default.keys(mobileCommandsMapping)} commands are supported.`);
59
+ throw new _baseDriver.errors.UnknownCommandError(`Unknown mobile command "${mobileCommand}". ` + `Only ${_lodash.default.keys(mobileCommandsMapping)} commands are supported.`);
58
60
  }
59
61
 
60
62
  return await this[mobileCommandsMapping[mobileCommand]](opts);
@@ -64,4 +66,4 @@ var _default = extensions;
64
66
  exports.default = _default;require('source-map-support').install();
65
67
 
66
68
 
67
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJtb2JpbGVDb21tYW5kc01hcHBpbmciLCJzaGVsbCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInBlcmZvcm1FZGl0b3JBY3Rpb24iLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwic3dpcGUiLCJzY3JvbGxUb1BhZ2UiLCJuYXZpZ2F0ZVRvIiwiY2xpY2tBY3Rpb24iLCJkZXZpY2VJbmZvIiwiaXNUb2FzdFZpc2libGUiLCJvcGVuRHJhd2VyIiwiY2xvc2VEcmF3ZXIiLCJzZXREYXRlIiwic2V0VGltZSIsImdldERldmljZVRpbWUiLCJiYWNrZG9vciIsImZsYXNoRWxlbWVudCIsInVpYXV0b21hdG9yIiwidWlhdXRvbWF0b3JQYWdlU291cmNlIiwid2ViQXRvbXMiLCJnZXRDb250ZXh0cyIsImRpc21pc3NBdXRvZmlsbCIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwicmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMiLCJ1bnJlZ2lzdGVySWRsaW5nUmVzb3VyY2VzIiwibGlzdElkbGluZ1Jlc291cmNlcyIsIl8iLCJoYXMiLCJlcnJvcnMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7O0FBRUFBLFVBQVUsQ0FBQ0MsYUFBWCxHQUEyQixlQUFlQSxhQUFmLENBQThCQyxhQUE5QixFQUE2Q0MsSUFBSSxHQUFHLEVBQXBELEVBQXdEO0FBQ2pGLFFBQU1DLHFCQUFxQixHQUFHO0FBQzVCQyxJQUFBQSxLQUFLLEVBQUUsYUFEcUI7QUFHNUJDLElBQUFBLHFCQUFxQixFQUFFLDZCQUhLO0FBSzVCQyxJQUFBQSxtQkFBbUIsRUFBRSwyQkFMTztBQU81QkMsSUFBQUEsaUJBQWlCLEVBQUUseUJBUFM7QUFRNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFSWTtBQVU1QkMsSUFBQUEsb0JBQW9CLEVBQUUsNEJBVk07QUFXNUJDLElBQUFBLG1CQUFtQixFQUFFLDJCQVhPO0FBYTVCQyxJQUFBQSxLQUFLLEVBQUUsYUFicUI7QUFjNUJDLElBQUFBLFlBQVksRUFBRSxvQkFkYztBQWU1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWZnQjtBQWdCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkFoQmU7QUFrQjVCQyxJQUFBQSxVQUFVLEVBQUUscUJBbEJnQjtBQW9CNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFwQlk7QUFzQjVCQyxJQUFBQSxVQUFVLEVBQUUsa0JBdEJnQjtBQXVCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkF2QmU7QUF5QjVCQyxJQUFBQSxPQUFPLEVBQUUsZUF6Qm1CO0FBMEI1QkMsSUFBQUEsT0FBTyxFQUFFLGVBMUJtQjtBQTRCNUJDLElBQUFBLGFBQWEsRUFBRSxxQkE1QmE7QUE4QjVCQyxJQUFBQSxRQUFRLEVBQUUsZ0JBOUJrQjtBQWdDNUJDLElBQUFBLFlBQVksRUFBRSxvQkFoQ2M7QUFrQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBbENlO0FBbUM1QkMsSUFBQUEscUJBQXFCLEVBQUUsNkJBbkNLO0FBcUM1QkMsSUFBQUEsUUFBUSxFQUFFLGdCQXJDa0I7QUFzQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBdENlO0FBd0M1QkMsSUFBQUEsZUFBZSxFQUFFLHVCQXhDVztBQTBDNUJDLElBQUFBLGdCQUFnQixFQUFFLHdCQTFDVTtBQTRDNUJDLElBQUFBLE9BQU8sRUFBRSxlQTVDbUI7QUE4QzVCQyxJQUFBQSxTQUFTLEVBQUUsV0E5Q2lCO0FBZ0Q1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWhEZ0I7QUFrRDVCQyxJQUFBQSxZQUFZLEVBQUUsb0JBbERjO0FBbUQ1QkMsSUFBQUEsV0FBVyxFQUFFLG1CQW5EZTtBQXFENUJDLElBQUFBLHVCQUF1QixFQUFFLCtCQXJERztBQXNENUJDLElBQUFBLHlCQUF5QixFQUFFLGlDQXREQztBQXVENUJDLElBQUFBLG1CQUFtQixFQUFFO0FBdkRPLEdBQTlCOztBQTBEQSxNQUFJLENBQUNDLGdCQUFFQyxHQUFGLENBQU1wQyxxQkFBTixFQUE2QkYsYUFBN0IsQ0FBTCxFQUFrRDtBQUNoRCxVQUFNLElBQUl1Qyx5QkFBT0MsbUJBQVgsQ0FBZ0MsMkJBQTBCeEMsYUFBYyxLQUF6QyxHQUNsQyxRQUFPcUMsZ0JBQUVJLElBQUYsQ0FBT3ZDLHFCQUFQLENBQThCLDBCQURsQyxDQUFOO0FBRUQ7O0FBQ0QsU0FBTyxNQUFNLEtBQUtBLHFCQUFxQixDQUFDRixhQUFELENBQTFCLEVBQTJDQyxJQUEzQyxDQUFiO0FBQ0QsQ0FoRUQ7O2VBa0VlSCxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmxldCBleHRlbnNpb25zID0ge307XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVNb2JpbGUgKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgY2hhbmdlUGVybWlzc2lvbnM6ICdtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucycsXG4gICAgZ2V0UGVybWlzc2lvbnM6ICdtb2JpbGVHZXRQZXJtaXNzaW9ucycsXG5cbiAgICBzdGFydFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nJyxcbiAgICBzdG9wU2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZycsXG5cbiAgICBzd2lwZTogJ21vYmlsZVN3aXBlJyxcbiAgICBzY3JvbGxUb1BhZ2U6ICdtb2JpbGVTY3JvbGxUb1BhZ2UnLFxuICAgIG5hdmlnYXRlVG86ICdtb2JpbGVOYXZpZ2F0ZVRvJyxcbiAgICBjbGlja0FjdGlvbjogJ21vYmlsZUNsaWNrQWN0aW9uJyxcblxuICAgIGRldmljZUluZm86ICdtb2JpbGVHZXREZXZpY2VJbmZvJyxcblxuICAgIGlzVG9hc3RWaXNpYmxlOiAnbW9iaWxlSXNUb2FzdFZpc2libGUnLFxuXG4gICAgb3BlbkRyYXdlcjogJ21vYmlsZU9wZW5EcmF3ZXInLFxuICAgIGNsb3NlRHJhd2VyOiAnbW9iaWxlQ2xvc2VEcmF3ZXInLFxuXG4gICAgc2V0RGF0ZTogJ21vYmlsZVNldERhdGUnLFxuICAgIHNldFRpbWU6ICdtb2JpbGVTZXRUaW1lJyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIGJhY2tkb29yOiAnbW9iaWxlQmFja2Rvb3InLFxuXG4gICAgZmxhc2hFbGVtZW50OiAnbW9iaWxlRmxhc2hFbGVtZW50JyxcblxuICAgIHVpYXV0b21hdG9yOiAnbW9iaWxlVWlhdXRvbWF0b3InLFxuICAgIHVpYXV0b21hdG9yUGFnZVNvdXJjZTogJ21vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZScsXG5cbiAgICB3ZWJBdG9tczogJ21vYmlsZVdlYkF0b21zJyxcbiAgICBnZXRDb250ZXh0czogJ21vYmlsZUdldENvbnRleHRzJyxcblxuICAgIGRpc21pc3NBdXRvZmlsbDogJ21vYmlsZURpc21pc3NBdXRvZmlsbCcsXG5cbiAgICBnZXROb3RpZmljYXRpb25zOiAnbW9iaWxlR2V0Tm90aWZpY2F0aW9ucycsXG5cbiAgICBsaXN0U21zOiAnbW9iaWxlTGlzdFNtcycsXG5cbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcblxuICAgIHJlZ2lzdGVySWRsaW5nUmVzb3VyY2VzOiAnbW9iaWxlUmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMnLFxuICAgIHVucmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXM6ICdtb2JpbGVVbnJlZ2lzdGVySWRsaW5nUmVzb3VyY2VzJyxcbiAgICBsaXN0SWRsaW5nUmVzb3VyY2VzOiAnbW9iaWxlTGlzdElkbGluZ1Jlc291cmNlcycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
69
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJtb2JpbGVDb21tYW5kc01hcHBpbmciLCJzaGVsbCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInBlcmZvcm1FZGl0b3JBY3Rpb24iLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwic3dpcGUiLCJzY3JvbGxUb1BhZ2UiLCJuYXZpZ2F0ZVRvIiwiY2xpY2tBY3Rpb24iLCJkZXZpY2VJbmZvIiwiaXNUb2FzdFZpc2libGUiLCJvcGVuRHJhd2VyIiwiY2xvc2VEcmF3ZXIiLCJzZXREYXRlIiwic2V0VGltZSIsImdldERldmljZVRpbWUiLCJiYWNrZG9vciIsImZsYXNoRWxlbWVudCIsInVpYXV0b21hdG9yIiwidWlhdXRvbWF0b3JQYWdlU291cmNlIiwid2ViQXRvbXMiLCJnZXRDb250ZXh0cyIsImRpc21pc3NBdXRvZmlsbCIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwicmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMiLCJ1bnJlZ2lzdGVySWRsaW5nUmVzb3VyY2VzIiwibGlzdElkbGluZ1Jlc291cmNlcyIsInVubG9jayIsInJlZnJlc2hHcHNDYWNoZSIsIl8iLCJoYXMiLCJlcnJvcnMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsRUFBbkI7O0FBRUFBLFVBQVUsQ0FBQ0MsYUFBWCxHQUEyQixlQUFlQSxhQUFmLENBQThCQyxhQUE5QixFQUE2Q0MsSUFBSSxHQUFHLEVBQXBELEVBQXdEO0FBQ2pGLFFBQU1DLHFCQUFxQixHQUFHO0FBQzVCQyxJQUFBQSxLQUFLLEVBQUUsYUFEcUI7QUFHNUJDLElBQUFBLHFCQUFxQixFQUFFLDZCQUhLO0FBSzVCQyxJQUFBQSxtQkFBbUIsRUFBRSwyQkFMTztBQU81QkMsSUFBQUEsaUJBQWlCLEVBQUUseUJBUFM7QUFRNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFSWTtBQVU1QkMsSUFBQUEsb0JBQW9CLEVBQUUsNEJBVk07QUFXNUJDLElBQUFBLG1CQUFtQixFQUFFLDJCQVhPO0FBYTVCQyxJQUFBQSxLQUFLLEVBQUUsYUFicUI7QUFjNUJDLElBQUFBLFlBQVksRUFBRSxvQkFkYztBQWU1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWZnQjtBQWdCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkFoQmU7QUFrQjVCQyxJQUFBQSxVQUFVLEVBQUUscUJBbEJnQjtBQW9CNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFwQlk7QUFzQjVCQyxJQUFBQSxVQUFVLEVBQUUsa0JBdEJnQjtBQXVCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkF2QmU7QUF5QjVCQyxJQUFBQSxPQUFPLEVBQUUsZUF6Qm1CO0FBMEI1QkMsSUFBQUEsT0FBTyxFQUFFLGVBMUJtQjtBQTRCNUJDLElBQUFBLGFBQWEsRUFBRSxxQkE1QmE7QUE4QjVCQyxJQUFBQSxRQUFRLEVBQUUsZ0JBOUJrQjtBQWdDNUJDLElBQUFBLFlBQVksRUFBRSxvQkFoQ2M7QUFrQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBbENlO0FBbUM1QkMsSUFBQUEscUJBQXFCLEVBQUUsNkJBbkNLO0FBcUM1QkMsSUFBQUEsUUFBUSxFQUFFLGdCQXJDa0I7QUFzQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBdENlO0FBd0M1QkMsSUFBQUEsZUFBZSxFQUFFLHVCQXhDVztBQTBDNUJDLElBQUFBLGdCQUFnQixFQUFFLHdCQTFDVTtBQTRDNUJDLElBQUFBLE9BQU8sRUFBRSxlQTVDbUI7QUE4QzVCQyxJQUFBQSxTQUFTLEVBQUUsV0E5Q2lCO0FBZ0Q1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWhEZ0I7QUFrRDVCQyxJQUFBQSxZQUFZLEVBQUUsb0JBbERjO0FBbUQ1QkMsSUFBQUEsV0FBVyxFQUFFLG1CQW5EZTtBQXFENUJDLElBQUFBLHVCQUF1QixFQUFFLCtCQXJERztBQXNENUJDLElBQUFBLHlCQUF5QixFQUFFLGlDQXREQztBQXVENUJDLElBQUFBLG1CQUFtQixFQUFFLDJCQXZETztBQXlENUJDLElBQUFBLE1BQU0sRUFBRSxjQXpEb0I7QUEyRDVCQyxJQUFBQSxlQUFlLEVBQUU7QUEzRFcsR0FBOUI7O0FBOERBLE1BQUksQ0FBQ0MsZ0JBQUVDLEdBQUYsQ0FBTXRDLHFCQUFOLEVBQTZCRixhQUE3QixDQUFMLEVBQWtEO0FBQ2hELFVBQU0sSUFBSXlDLG1CQUFPQyxtQkFBWCxDQUFnQywyQkFBMEIxQyxhQUFjLEtBQXpDLEdBQ2xDLFFBQU91QyxnQkFBRUksSUFBRixDQUFPekMscUJBQVAsQ0FBOEIsMEJBRGxDLENBQU47QUFFRDs7QUFDRCxTQUFPLE1BQU0sS0FBS0EscUJBQXFCLENBQUNGLGFBQUQsQ0FBMUIsRUFBMkNDLElBQTNDLENBQWI7QUFDRCxDQXBFRDs7ZUFzRWVILFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIHN3aXBlOiAnbW9iaWxlU3dpcGUnLFxuICAgIHNjcm9sbFRvUGFnZTogJ21vYmlsZVNjcm9sbFRvUGFnZScsXG4gICAgbmF2aWdhdGVUbzogJ21vYmlsZU5hdmlnYXRlVG8nLFxuICAgIGNsaWNrQWN0aW9uOiAnbW9iaWxlQ2xpY2tBY3Rpb24nLFxuXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuXG4gICAgaXNUb2FzdFZpc2libGU6ICdtb2JpbGVJc1RvYXN0VmlzaWJsZScsXG5cbiAgICBvcGVuRHJhd2VyOiAnbW9iaWxlT3BlbkRyYXdlcicsXG4gICAgY2xvc2VEcmF3ZXI6ICdtb2JpbGVDbG9zZURyYXdlcicsXG5cbiAgICBzZXREYXRlOiAnbW9iaWxlU2V0RGF0ZScsXG4gICAgc2V0VGltZTogJ21vYmlsZVNldFRpbWUnLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgYmFja2Rvb3I6ICdtb2JpbGVCYWNrZG9vcicsXG5cbiAgICBmbGFzaEVsZW1lbnQ6ICdtb2JpbGVGbGFzaEVsZW1lbnQnLFxuXG4gICAgdWlhdXRvbWF0b3I6ICdtb2JpbGVVaWF1dG9tYXRvcicsXG4gICAgdWlhdXRvbWF0b3JQYWdlU291cmNlOiAnbW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlJyxcblxuICAgIHdlYkF0b21zOiAnbW9iaWxlV2ViQXRvbXMnLFxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgZGlzbWlzc0F1dG9maWxsOiAnbW9iaWxlRGlzbWlzc0F1dG9maWxsJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBkZWxldGVGaWxlOiAnbW9iaWxlRGVsZXRlRmlsZScsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgcmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXM6ICdtb2JpbGVSZWdpc3RlcklkbGluZ1Jlc291cmNlcycsXG4gICAgdW5yZWdpc3RlcklkbGluZ1Jlc291cmNlczogJ21vYmlsZVVucmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMnLFxuICAgIGxpc3RJZGxpbmdSZXNvdXJjZXM6ICdtb2JpbGVMaXN0SWRsaW5nUmVzb3VyY2VzJyxcblxuICAgIHVubG9jazogJ21vYmlsZVVubG9jaycsXG5cbiAgICByZWZyZXNoR3BzQ2FjaGU6ICdtb2JpbGVSZWZyZXNoR3BzQ2FjaGUnLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -5,19 +5,19 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.helpers = exports.commands = void 0;
8
+ exports.helpers = exports.default = exports.commands = void 0;
9
9
 
10
10
  require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _appiumSupport = require("appium-support");
14
+ var _support = require("@appium/support");
15
15
 
16
16
  var _logger = _interopRequireDefault(require("../logger"));
17
17
 
18
18
  var _validate = _interopRequireDefault(require("validate.js"));
19
19
 
20
- var _appiumBaseDriver = require("appium-base-driver");
20
+ var _baseDriver = require("@appium/base-driver");
21
21
 
22
22
  var _utils = require("../utils");
23
23
 
@@ -44,15 +44,15 @@ function assertRequiredOptions(options, requiredOptionNames) {
44
44
  }
45
45
 
46
46
  commands.launchApp = async function launchApp() {
47
- throw new _appiumBaseDriver.errors.UnsupportedOperationError('Please create a new session in order to launch the application under test');
47
+ throw new _baseDriver.errors.UnsupportedOperationError('Please create a new session in order to launch the application under test');
48
48
  };
49
49
 
50
50
  commands.closeApp = async function closeApp() {
51
- throw new _appiumBaseDriver.errors.UnsupportedOperationError('Please quit the session in order to close the application under test');
51
+ throw new _baseDriver.errors.UnsupportedOperationError('Please quit the session in order to close the application under test');
52
52
  };
53
53
 
54
54
  commands.reset = async function reset() {
55
- throw new _appiumBaseDriver.errors.UnsupportedOperationError('Please quit the session and create a new one ' + 'in order to close and launch the application under test');
55
+ throw new _baseDriver.errors.UnsupportedOperationError('Please quit the session and create a new one ' + 'in order to close and launch the application under test');
56
56
  };
57
57
 
58
58
  commands.getClipboard = async function getClipboard() {
@@ -77,7 +77,7 @@ commands.mobileSwipe = async function mobileSwipe(opts = {}) {
77
77
  endCoordinates,
78
78
  precisionDescriber
79
79
  } = assertRequiredOptions(opts, ['element']);
80
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/swipe`, 'POST', {
80
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/swipe`, 'POST', {
81
81
  direction,
82
82
  element,
83
83
  swiper,
@@ -97,7 +97,7 @@ commands.mobileIsToastVisible = async function mobileIsToastVisible(opts = {}) {
97
97
  isRegexp
98
98
  } = opts;
99
99
 
100
- if (!_appiumSupport.util.hasValue(text)) {
100
+ if (!_support.util.hasValue(text)) {
101
101
  _logger.default.errorAndThrow(`'text' argument is mandatory`);
102
102
  }
103
103
 
@@ -112,7 +112,7 @@ commands.mobileOpenDrawer = async function mobileOpenDrawer(opts = {}) {
112
112
  element,
113
113
  gravity
114
114
  } = assertRequiredOptions(opts, ['element']);
115
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/open_drawer`, 'POST', {
115
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/open_drawer`, 'POST', {
116
116
  gravity
117
117
  });
118
118
  };
@@ -122,7 +122,7 @@ commands.mobileCloseDrawer = async function mobileCloseDrawer(opts = {}) {
122
122
  element,
123
123
  gravity
124
124
  } = assertRequiredOptions(opts, ['element']);
125
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/close_drawer`, 'POST', {
125
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/close_drawer`, 'POST', {
126
126
  gravity
127
127
  });
128
128
  };
@@ -134,7 +134,7 @@ commands.mobileSetDate = async function mobileSetDate(opts = {}) {
134
134
  monthOfYear,
135
135
  dayOfMonth
136
136
  } = assertRequiredOptions(opts, ['element', 'year', 'monthOfYear', 'dayOfMonth']);
137
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/set_date`, 'POST', {
137
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/set_date`, 'POST', {
138
138
  year,
139
139
  monthOfYear,
140
140
  dayOfMonth
@@ -147,7 +147,7 @@ commands.mobileSetTime = async function mobileSetTime(opts = {}) {
147
147
  hours,
148
148
  minutes
149
149
  } = assertRequiredOptions(opts, ['element', 'hours', 'minutes']);
150
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/set_time`, 'POST', {
150
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/set_time`, 'POST', {
151
151
  hours,
152
152
  minutes
153
153
  });
@@ -166,7 +166,7 @@ commands.mobileNavigateTo = async function mobileNavigateTo(opts = {}) {
166
166
  menuItemId = menuItemIdAsNumber;
167
167
  }
168
168
 
169
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/navigate_to`, 'POST', {
169
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/navigate_to`, 'POST', {
170
170
  menuItemId
171
171
  });
172
172
  };
@@ -201,7 +201,7 @@ commands.mobileScrollToPage = async function mobileScrollToPage(opts = {}) {
201
201
  }
202
202
  });
203
203
 
204
- if (_appiumSupport.util.hasValue(res)) {
204
+ if (_support.util.hasValue(res)) {
205
205
  _logger.default.errorAndThrow(`Invalid scrollTo parameters: ${JSON.stringify(res)}`);
206
206
  }
207
207
 
@@ -212,11 +212,11 @@ commands.mobileScrollToPage = async function mobileScrollToPage(opts = {}) {
212
212
  smoothScroll
213
213
  } = opts;
214
214
 
215
- if (_appiumSupport.util.hasValue(scrollTo) && _appiumSupport.util.hasValue(scrollToPage)) {
215
+ if (_support.util.hasValue(scrollTo) && _support.util.hasValue(scrollToPage)) {
216
216
  _logger.default.warn(`'scrollTo' and 'scrollToPage' where both provided. Defaulting to 'scrollTo'`);
217
217
  }
218
218
 
219
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/scroll_to_page`, 'POST', {
219
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/scroll_to_page`, 'POST', {
220
220
  scrollTo,
221
221
  scrollToPage,
222
222
  smoothScroll
@@ -271,7 +271,7 @@ commands.mobileFlashElement = async function mobileFlashElement(opts = {}) {
271
271
  durationMillis,
272
272
  repeatCount
273
273
  } = opts;
274
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/flash`, 'POST', {
274
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/flash`, 'POST', {
275
275
  durationMillis,
276
276
  repeatCount
277
277
  });
@@ -286,7 +286,7 @@ commands.mobileClickAction = async function mobileClickAction(opts = {}) {
286
286
  inputDevice,
287
287
  buttonState
288
288
  } = assertRequiredOptions(opts, ['element']);
289
- return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/click_action`, 'POST', {
289
+ return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/click_action`, 'POST', {
290
290
  tapper,
291
291
  coordinatesProvider,
292
292
  precisionDescriber,
@@ -308,6 +308,7 @@ commands.getSettings = async function getSettings() {
308
308
  helpers.suspendChromedriverProxy = function suspendChromedriverProxy() {
309
309
  this.chromedriver = null;
310
310
  this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);
311
+ this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);
311
312
  this.jwpProxyActive = true;
312
313
  };
313
314
 
@@ -330,7 +331,7 @@ commands.mobileDismissAutofill = async function mobileDismissAutofill(opts = {})
330
331
  const {
331
332
  element
332
333
  } = assertRequiredOptions(opts, ['element']);
333
- await this.espresso.jwproxy.command(`/session/:sessionId/appium/execute_mobile/${_appiumSupport.util.unwrapElement(element)}/dismiss_autofill`, 'POST', {});
334
+ await this.espresso.jwproxy.command(`/session/:sessionId/appium/execute_mobile/${_support.util.unwrapElement(element)}/dismiss_autofill`, 'POST', {});
334
335
  };
335
336
 
336
337
  Object.assign(extensions, commands, helpers);
@@ -338,4 +339,4 @@ var _default = extensions;
338
339
  exports.default = _default;require('source-map-support').install();
339
340
 
340
341
 
341
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJhc3NlcnRSZXF1aXJlZE9wdGlvbnMiLCJvcHRpb25zIiwicmVxdWlyZWRPcHRpb25OYW1lcyIsIl8iLCJpc0FycmF5IiwicHJlc2VudE9wdGlvbk5hbWVzIiwia2V5cyIsIm1pc3NpbmdPcHRpb25OYW1lcyIsImRpZmZlcmVuY2UiLCJpc0VtcHR5IiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibGF1bmNoQXBwIiwiZXJyb3JzIiwiVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciIsImNsb3NlQXBwIiwicmVzZXQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImVzcHJlc3NvIiwiandwcm94eSIsImNvbW1hbmQiLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwib3B0cyIsImFjdGlvbiIsIm1vYmlsZVN3aXBlIiwiZGlyZWN0aW9uIiwiZWxlbWVudCIsInN3aXBlciIsInN0YXJ0Q29vcmRpbmF0ZXMiLCJlbmRDb29yZGluYXRlcyIsInByZWNpc2lvbkRlc2NyaWJlciIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZUlzVG9hc3RWaXNpYmxlIiwidGV4dCIsImlzUmVnZXhwIiwiaGFzVmFsdWUiLCJsb2dnZXIiLCJlcnJvckFuZFRocm93IiwibW9iaWxlT3BlbkRyYXdlciIsImdyYXZpdHkiLCJtb2JpbGVDbG9zZURyYXdlciIsIm1vYmlsZVNldERhdGUiLCJ5ZWFyIiwibW9udGhPZlllYXIiLCJkYXlPZk1vbnRoIiwibW9iaWxlU2V0VGltZSIsImhvdXJzIiwibWludXRlcyIsIm1vYmlsZU5hdmlnYXRlVG8iLCJtZW51SXRlbUlkIiwibWVudUl0ZW1JZEFzTnVtYmVyIiwicGFyc2VJbnQiLCJpc05hTiIsIm1vYmlsZVdlYkF0b21zIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJtb2JpbGVTY3JvbGxUb1BhZ2UiLCJzY3JvbGxUb1R5cGVzIiwicmVzIiwicHJlc2VuY2UiLCJzY3JvbGxUbyIsImluY2x1c2lvbiIsIndpdGhpbiIsIm1lc3NhZ2UiLCJqb2luIiwic2Nyb2xsVG9QYWdlIiwibnVtZXJpY2FsaXR5Iiwib25seUludGVnZXIiLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsInNtb290aFNjcm9sbCIsIndhcm4iLCJtb2JpbGVCYWNrZG9vciIsInRhcmdldCIsIm1ldGhvZHMiLCJlbGVtZW50SWQiLCJ0YXJnZXRFbGVtZW50IiwibW9iaWxlVWlhdXRvbWF0b3IiLCJzdHJhdGVneSIsImxvY2F0b3IiLCJpbmRleCIsIm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSIsIm1vYmlsZUZsYXNoRWxlbWVudCIsImR1cmF0aW9uTWlsbGlzIiwicmVwZWF0Q291bnQiLCJtb2JpbGVDbGlja0FjdGlvbiIsInRhcHBlciIsImNvb3JkaW5hdGVzUHJvdmlkZXIiLCJpbnB1dERldmljZSIsImJ1dHRvblN0YXRlIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwiandwUHJveHlBY3RpdmUiLCJzdGFydEFjdGl2aXR5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJjYXBzIiwiZGVidWciLCJ3YWl0Rm9yQWN0aXZpdHkiLCJtb2JpbGVEaXNtaXNzQXV0b2ZpbGwiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxFQUE5Qzs7OztBQUVBLFNB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QXFCLENBQUN5QixJQUFELEVBQU8sQ0FBQyxTQUFELENBQVAsQ0FBdkM7QUFDQSxRQUFNLEtBQUtKLFFBQUwsQ0FBY0MsT0FBZCxDQUFzQkMsT0FBdEIsQ0FDSCw2Q0FBNENXLG9CQUFLQyxhQUFMLENBQW1CTixPQUFuQixDQUE0QixtQkFEckUsRUFDeUYsTUFEekYsRUFDaUcsRUFEakcsQ0FBTjtBQUVELENBSkQ7O0FBTUFpRixNQUFNLENBQUNDLE1BQVAsQ0FBY2hILFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAndmFsaWRhdGUuanMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IHF1YWxpZnlBY3Rpdml0eU5hbWUgfSBmcm9tICcuLi91dGlscyc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRPcHRpb25zIChvcHRpb25zLCByZXF1aXJlZE9wdGlvbk5hbWVzKSB7XG4gIGlmICghXy5pc0FycmF5KHJlcXVpcmVkT3B0aW9uTmFtZXMpKSB7XG4gICAgcmVxdWlyZWRPcHRpb25OYW1lcyA9IFtyZXF1aXJlZE9wdGlvbk5hbWVzXTtcbiAgfVxuICBjb25zdCBwcmVzZW50T3B0aW9uTmFtZXMgPSBfLmtleXMob3B0aW9ucyk7XG4gIGNvbnN0IG1pc3NpbmdPcHRpb25OYW1lcyA9IF8uZGlmZmVyZW5jZShyZXF1aXJlZE9wdGlvbk5hbWVzLCBwcmVzZW50T3B0aW9uTmFtZXMpO1xuICBpZiAoXy5pc0VtcHR5KG1pc3NpbmdPcHRpb25OYW1lcykpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVxdWlyZWQ6ICR7SlNPTi5zdHJpbmdpZnkobWlzc2luZ09wdGlvbk5hbWVzKX0uIGAgK1xuICAgIGBZb3UgaGF2ZSBvbmx5IHByb3ZpZGVkOiAke0pTT04uc3RyaW5naWZ5KHByZXNlbnRPcHRpb25OYW1lcyl9YCk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5sYXVuY2hBcHAgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBcHAgKCkge1xuICB0aHJvdyBuZXcgZXJyb3JzLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoJ1BsZWFzZSBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBpbiBvcmRlciB0byBsYXVuY2ggdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QnKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKCdQbGVhc2UgcXVpdCB0aGUgc2Vzc2lvbiBpbiBvcmRlciB0byBjbG9zZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCcpO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXdhaXRcbmNvbW1hbmRzLnJlc2V0ID0gYXN5bmMgZnVuY3Rpb24gcmVzZXQgKCkge1xuICB0aHJvdyBuZXcgZXJyb3JzLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXG4gICAgJ1BsZWFzZSBxdWl0IHRoZSBzZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lICcgK1xuICAgICdpbiBvcmRlciB0byBjbG9zZSBhbmQgbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0Jyk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiBnZXRDbGlwYm9hcmQgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FjdGlvbn0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydhY3Rpb24nXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvcGVyZm9ybV9lZGl0b3JfYWN0aW9uJywgJ1BPU1QnLCB7YWN0aW9ufSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN3aXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2RpcmVjdGlvbiwgZWxlbWVudCwgc3dpcGVyLCBzdGFydENvb3JkaW5hdGVzLCBlbmRDb29yZGluYXRlcywgcHJlY2lzaW9uRGVzY3JpYmVyfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc3dpcGVgLCAnUE9TVCcsIHtcbiAgICBkaXJlY3Rpb24sIGVsZW1lbnQsIHN3aXBlciwgc3RhcnRDb29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMsIHByZWNpc2lvbkRlc2NyaWJlclxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZUluZm8gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VJbmZvICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9pbmZvJywgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMubW9iaWxlSXNUb2FzdFZpc2libGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJc1RvYXN0VmlzaWJsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt0ZXh0LCBpc1JlZ2V4cH0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUodGV4dCkpIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9leGVjdXRlX21vYmlsZS9pc190b2FzdF9kaXNwbGF5ZWQnLCAnUE9TVCcsIHtcbiAgICB0ZXh0LFxuICAgIGlzUmVnZXhwLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZU9wZW5EcmF3ZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVPcGVuRHJhd2VyIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGdyYXZpdHl9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L29wZW5fZHJhd2VyYCwgJ1BPU1QnLCB7XG4gICAgZ3Jhdml0eVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUNsb3NlRHJhd2VyID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xvc2VEcmF3ZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgZ3Jhdml0eX0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vY2xvc2VfZHJhd2VyYCwgJ1BPU1QnLCB7XG4gICAgZ3Jhdml0eVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNldERhdGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXREYXRlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIHllYXIsIG1vbnRoT2ZZZWFyLCBkYXlPZk1vbnRofSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnLCAneWVhcicsICdtb250aE9mWWVhcicsICdkYXlPZk1vbnRoJ10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2V0X2RhdGVgLCAnUE9TVCcsIHtcbiAgICB5ZWFyLFxuICAgIG1vbnRoT2ZZZWFyLFxuICAgIGRheU9mTW9udGgsXG4gIH0pO1xufTtcblxuY29tbWFuZHMubW9iaWxlU2V0VGltZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNldFRpbWUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgaG91cnMsIG1pbnV0ZXN9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCcsICdob3VycycsICdtaW51dGVzJ10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2V0X3RpbWVgLCAnUE9TVCcsIHtcbiAgICBob3VycyxcbiAgICBtaW51dGVzLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZU5hdmlnYXRlVG8gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVOYXZpZ2F0ZVRvIChvcHRzID0ge30pIHtcbiAgbGV0IHtlbGVtZW50LCBtZW51SXRlbUlkfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ21lbnVJdGVtSWQnLCAnZWxlbWVudCddKTtcblxuICBsZXQgbWVudUl0ZW1JZEFzTnVtYmVyID0gcGFyc2VJbnQobWVudUl0ZW1JZCwgMTApO1xuICBpZiAoXy5pc05hTihtZW51SXRlbUlkQXNOdW1iZXIpIHx8IG1lbnVJdGVtSWRBc051bWJlciA8IDApIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgJ21lbnVJdGVtSWQnIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBGb3VuZCAke21lbnVJdGVtSWR9YCk7XG4gICAgbWVudUl0ZW1JZCA9IG1lbnVJdGVtSWRBc051bWJlcjtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vbmF2aWdhdGVfdG9gLCAnUE9TVCcsIHtcbiAgICBtZW51SXRlbUlkXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSdW5zIGEgY2hhaW4gb2YgRXNwcmVzc28gd2ViIGF0b21zIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvdGVzdGluZy9lc3ByZXNzby93ZWIgZm9yIHJlZmVyZW5jZSlcbiAqXG4gKiBUYWtlcyBKU09OIG9mIHRoZSBmb3JtXG4gKlxuICoge1xuICogICBcIndlYnZpZXdFbFwiOiBcIjxFTEVNRU5UX0lEPlwiLCAvLyBvcHRpb25hbCB3ZWJ2aWV3IGVsZW1lbnQgdG8gb3BlcmF0ZSBvblxuICogICBcImZvcmNlSmF2YXNjcmlwdEVuYWJsZWRcIjogdHJ1ZXxmYWxzZSwgLy8gaWYgd2VidmlldyBkaXNhYmxlcyBqYXZhc2NyaXB0LCB3ZWJhdG9tcyB3b24ndCB3b3JrLCB0aGlzIGZvcmNlcyBpdFxuICogICBcIm1ldGhvZENoYWluXCI6IFtcbiAqICAgICB7XCJuYW1lXCI6IFwibWV0aG9kTmFtZVwiLCBcImF0b21cIjoge1wibmFtZVwiOiBcImF0b21OYW1lXCIsIFwiYXJnc1wiOiBbXCJhcmcxXCIsIFwiYXJnMlwiLCAuLi5dfX0sXG4gKiAgICAgLi4uXG4gKiAgIF1cbiAqIH1cbiAqXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVdlYkF0b21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlV2ViQXRvbXMgKG9wdHMgPSB7fSkge1xuICBvcHRzID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnbWV0aG9kQ2hhaW4nXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS93ZWJfYXRvbXNgLCAnUE9TVCcsIG9wdHMpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JywgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbFRvUGFnZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNjcm9sbFRvUGFnZSAob3B0cyA9IHt9KSB7XG5cbiAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnNcbiAgY29uc3Qgc2Nyb2xsVG9UeXBlcyA9IFsnZmlyc3QnLCAnbGFzdCcsICdsZWZ0JywgJ3JpZ2h0J107XG4gIGNvbnN0IHJlcyA9IHZhbGlkYXRlKG9wdHMsIHtcbiAgICBlbGVtZW50OiB7cHJlc2VuY2U6IHRydWV9LFxuICAgIHNjcm9sbFRvOiB7XG4gICAgICBpbmNsdXNpb246IHtcbiAgICAgICAgd2l0aGluOiBzY3JvbGxUb1R5cGVzLFxuICAgICAgICBtZXNzYWdlOiBgXCJzY3JvbGxUb1wiIG11c3QgYmUgb25lIG9mIFwiJHtzY3JvbGxUb1R5cGVzLmpvaW4oJywgJyl9XCIgZm91bmQgJyV7dmFsdWV9J2AsXG4gICAgICB9XG4gICAgfSxcbiAgICBzY3JvbGxUb1BhZ2U6IHtcbiAgICAgIG51bWVyaWNhbGl0eToge1xuICAgICAgICBvbmx5SW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IDAsXG4gICAgICAgIG1lc3NhZ2U6IGBcInNjcm9sbFRvUGFnZVwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gRm91bmQgJyV7dmFsdWV9J2BcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUocmVzKSkge1xuICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBJbnZhbGlkIHNjcm9sbFRvIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHtlbGVtZW50LCBzY3JvbGxUbywgc2Nyb2xsVG9QYWdlLCBzbW9vdGhTY3JvbGx9ID0gb3B0cztcblxuICBpZiAodXRpbC5oYXNWYWx1ZShzY3JvbGxUbykgJiYgdXRpbC5oYXNWYWx1ZShzY3JvbGxUb1BhZ2UpKSB7XG4gICAgbG9nZ2VyLndhcm4oYCdzY3JvbGxUbycgYW5kICdzY3JvbGxUb1BhZ2UnIHdoZXJlIGJvdGggcHJvdmlkZWQuIERlZmF1bHRpbmcgdG8gJ3Njcm9sbFRvJ2ApO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpfS9zY3JvbGxfdG9fcGFnZWAsICdQT1NUJywge1xuICAgIHNjcm9sbFRvLFxuICAgIHNjcm9sbFRvUGFnZSxcbiAgICBzbW9vdGhTY3JvbGwsXG4gIH0pO1xufTtcblxuXG4vKipcbiAqICBBUEkgdG8gaW52b2tlIG1ldGhvZHMgZGVmaW5lZCBpbiBBbmRyb2lkIGFwcC5cbiAqXG4gKiAgRXhhbXBsZSBkYXRhXG4gKiAge1xuICogICB0YXJnZXQ6ICdhY3Rpdml0eScsXG4gKiAgIG1ldGhvZHM6XG4gKiAgICAgICAgIFtcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgIG5hbWU6IFwic29tZU1ldGhvZFwiLFxuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgICBuYW1lOiBcImFub3RoZXJNZXRob2RcIixcbiAqICAgICAgICAgICAgICAgYXJnczpcbiAqICAgICAgICAgICAgICAgICAgIFtcbiAqICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWU6IFwiTG9sXCIsIHR5cGU6ICdqYXZhLmxhbmcuQ2hhclNlcXVlbmNlJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlOiAxLCB0eXBlOiAnaW50J31cbiAqICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqIH1cbiAqXG4gKiBJbiBhYm92ZSBleGFtcGxlLCBtZXRob2QgXCJzb21lTWV0aG9kXCIgd2lsbCBiZSBpbnZva2VkIG9uICdhY3Rpdml0eScuIE9uIHRoZSByZXN1bHQsIFwiYW5vdGhlck1ldGhvZFwiIHdpbGwgYmUgaW52b2tlZFxuICogIFwidGFyZ2V0XCIgY2FuIGJlIGVpdGhlciAnYWN0aXZpdHknLCAnYXBwbGljYXRpb24nIG9yICdlbGVtZW50J1xuICogIElmIHRhcmdldCBpcyBzZXQgdG8gJ2FwcGxpY2F0aW9uJywgbWV0aG9kcyB3aWxsIGJlIGludm9rZWQgb24gYXBwbGljYXRpb24gY2xhc3NcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdhY3Rpdml0eScsIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIG9uIGN1cnJlbnQgYWN0aXZpdHlcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdlbGVtZW50JywgJ2VsZW1lbnRJZCcgbXVzdCBiZSBzcGVjaWZpZWRcbiAqXG4gKiAtIE9ubHkgJ1B1YmxpYycgbWV0aG9kcyBjYW4gYmUgaW52b2tlZC4gKCdvcGVuJyBtb2RpZmlyZSBpcyBuZWNlc3NhcnkgaW4gS290bGluKVxuICogLSBmb2xsb3dpbmcgcHJpbWl0aXZlIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6IFwiaW50XCIsIFwiYm9vbGVhblwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImxvbmdcIiwgXCJmbG9hdFwiLCBcImNoYXJcIlxuICogLSAgTm9uLXByaW1pdGl2ZSB0eXBlcyB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIFwiamF2YS5sYW5nLipcIiBpcyBhbHNvIHN1cHBvcnRlZDpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWcuIFwiamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVwiLCBcImphdmEubGFuZy5TdHJpbmdcIiwgXCJqYXZhLmxhbmcuSW50ZWdlclwiLCBcImphdmEubGFuZy5GbG9hdFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImphdmEubGFuZy5Eb3VibGVcIiwgXCJqYXZhLmxhbmcuQm9vbGVhblwiLCBcImphdmEubGFuZy5Mb25nXCIsIFwiamF2YS5sYW5nLlNob3J0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiamF2YS5sYW5nLkNoYXJhY3RlclwiIGV0Yy4uLlxuICpcbiAqXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIHRhcmdldCBpcyBub3QgJ2FjdGl2aXR5JyBvciAnYXBwbGljYXRpb24nXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIGEgbWV0aG9kIGlzIG5vdCBmb3VuZCB3aXRoIGdpdmVuIGFyZ3VtZW50IHR5cGVzXG4gKlxuICogQHJldHVybiB7Kn0gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBtZXRob2QgaW4gdGhlIGludm9jYXRpb24gY2hhaW4uIElmIG1ldGhvZCByZXR1cm4gdHlwZSBpcyB2b2lkLCB0aGVuIFwiPFZPSUQ+XCIgd2lsbCBiZSByZXR1cm5lZFxuICpcbiAqL1xuY29tbWFuZHMubW9iaWxlQmFja2Rvb3IgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVCYWNrZG9vciAob3B0cyA9IHt9KSB7XG4gIGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ3RhcmdldCcsICdtZXRob2RzJ10pO1xuICBjb25zdCB7dGFyZ2V0LCBtZXRob2RzfSA9IG9wdHM7XG4gIGlmICh0YXJnZXQgPT09ICdlbGVtZW50Jykge1xuICAgIGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnRJZCddKTtcbiAgfVxuICBjb25zdCB7ZWxlbWVudElkOiB0YXJnZXRFbGVtZW50fSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS9iYWNrZG9vcmAsICdQT1NUJywge3RhcmdldCwgbWV0aG9kcywgdGFyZ2V0RWxlbWVudH0pO1xufTtcblxuLyoqXG4gKiAgRXhlY3V0ZSBVaUF1dG9tYXRvcjIgY29tbWFuZHMgdG8gZHJpdmUgb3V0IG9mIGFwcCBhcmVhcy5cbiAqICBzdHJhdGVneSBjYW4gYmUgb25lIG9mOiBcImNsYXp6XCIsIFwicmVzXCIsIFwidGV4dFwiLCBcInRleHRDb250YWluc1wiLCBcInRleHRFbmRzV2l0aFwiLCBcInRleHRTdGFydHNXaXRoXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjXCIsIFwiZGVzY0NvbnRhaW5zXCIsIFwiZGVzY0VuZHNXaXRoXCIsIFwiZGVzY1N0YXJ0c1dpdGhcIiwgXCJwa2dcIlxuICpcbiAqICBhY3Rpb24gY2FuIGJlIG9uZSBvZjogXCJjbGlja1wiLCBcImxvbmdDbGlja1wiLCBcImdldFRleHRcIiwgXCJnZXRDb250ZW50RGVzY3JpcHRpb25cIiwgXCJnZXRDbGFzc05hbWVcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJnZXRSZXNvdXJjZU5hbWVcIiwgXCJnZXRWaXNpYmxlQm91bmRzXCIsIFwiZ2V0VmlzaWJsZUNlbnRlclwiLCBcImdldEFwcGxpY2F0aW9uUGFja2FnZVwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICBcImdldENoaWxkQ291bnRcIiwgXCJjbGVhclwiLCBcImlzQ2hlY2thYmxlXCIsIFwiaXNDaGVja2VkXCIsIFwiaXNDbGlja2FibGVcIiwgXCJpc0VuYWJsZWRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJpc0ZvY3VzYWJsZVwiLCBcImlzRm9jdXNlZFwiLCBcImlzTG9uZ0NsaWNrYWJsZVwiLCBcImlzU2Nyb2xsYWJsZVwiLCBcImlzU2VsZWN0ZWRcIlxuICovXG5jb21tYW5kcy5tb2JpbGVVaWF1dG9tYXRvciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVpYXV0b21hdG9yIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0cmF0ZWd5LCBsb2NhdG9yLCBhY3Rpb24sIGluZGV4fSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ3N0cmF0ZWd5JywgJ2xvY2F0b3InLCAnYWN0aW9uJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvdWlhdXRvbWF0b3JgLCAnUE9TVCcsIHtzdHJhdGVneSwgbG9jYXRvciwgaW5kZXgsIGFjdGlvbn0pO1xufTtcblxuLyoqXG4gKiAgRXhlY3V0ZSBVaUF1dG9tYXRvcjIgY29tbWFuZCB0byByZXR1cm4gdGhlIFVJIGR1bXAgd2hlbiBBVVQgaXMgaW4gYmFja2dyb3VuZC5cbiAqIEB0aHJvd3MgIHtFcnJvcn0gaWYgdWlhdXRvbWF0b3IgdmlldyBkdW1wIGlzIHVuc3VjY2Vzc2Z1bFxuICogQHJldHVybnMge3N0cmluZ30gdWlhdXRvbWF0b3IgRE9NIHhtbCBhcyBzdHJpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlL3VpYXV0b21hdG9yX3BhZ2Vfc291cmNlYCwgJ0dFVCcpO1xufTtcblxuLyoqXG4gKiAgRmxhc2ggdGhlIGVsZW1lbnQgd2l0aCBnaXZlbiBpZC5cbiAqICBkdXJhdGlvbk1pbGxpcyBhbmQgcmVwZWF0Q291bnQgYXJlIG9wdGlvbmFsXG4gKlxuICovXG5jb21tYW5kcy5tb2JpbGVGbGFzaEVsZW1lbnQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVGbGFzaEVsZW1lbnQgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBjb25zdCB7ZHVyYXRpb25NaWxsaXMsIHJlcGVhdENvdW50fSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vZmxhc2hgLCAnUE9TVCcsIHtcbiAgICBkdXJhdGlvbk1pbGxpcyxcbiAgICByZXBlYXRDb3VudFxuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBhICdHZW5lcmFsQ2xpY2tBY3Rpb24nIChodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZHgvdGVzdC9lc3ByZXNzby9hY3Rpb24vR2VuZXJhbENsaWNrQWN0aW9uKVxuICovXG5jb21tYW5kcy5tb2JpbGVDbGlja0FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsaWNrQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIHRhcHBlciwgY29vcmRpbmF0ZXNQcm92aWRlciwgcHJlY2lzaW9uRGVzY3JpYmVyLFxuICAgICAgICAgaW5wdXREZXZpY2UsIGJ1dHRvblN0YXRlfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vY2xpY2tfYWN0aW9uYCwgJ1BPU1QnLCB7XG4gICAgdGFwcGVyLCBjb29yZGluYXRlc1Byb3ZpZGVyLCBwcmVjaXNpb25EZXNjcmliZXIsIGlucHV0RGV2aWNlLCBidXR0b25TdGF0ZVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2V0dGluZ3MgKHNldHRpbmdzKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9zZXR0aW5nc2AsICdQT1NUJywgeyBzZXR0aW5ncyB9KTtcbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZ3MgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vc2V0dGluZ3NgLCAnR0VUJyk7XG59O1xuXG4vLyBTdG9wIHByb3h5aW5nIHRvIGFueSBDaHJvbWVkcml2ZXIgYW5kIHJlZGlyZWN0IHRvIEVzcHJlc3NvXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpIHtcbiAgLy8gaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXRcbiAgLy8gcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBFc3ByZXNzb1xuICBhcHBQYWNrYWdlID0gYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgYXBwV2FpdFBhY2thZ2UgPSBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlO1xuICBhcHBBY3Rpdml0eSA9IHF1YWxpZnlBY3Rpdml0eU5hbWUoYXBwQWN0aXZpdHksIGFwcFBhY2thZ2UpO1xuICBhcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UpO1xuICBsb2dnZXIuZGVidWcoYFN0YXJ0aW5nIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fScgZm9yIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nYCk7XG4gIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eWAsICdQT1NUJywge1xuICAgIGFwcFBhY2thZ2UsXG4gICAgYXBwQWN0aXZpdHksXG4gIH0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkoYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVEaXNtaXNzQXV0b2ZpbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEaXNtaXNzQXV0b2ZpbGwgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChcbiAgICBgL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Rpc21pc3NfYXV0b2ZpbGxgLCAnUE9TVCcsIHt9KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
342
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJhc3NlcnRSZXF1aXJlZE9wdGlvbnMiLCJvcHRpb25zIiwicmVxdWlyZWRPcHRpb25OYW1lcyIsIl8iLCJpc0FycmF5IiwicHJlc2VudE9wdGlvbk5hbWVzIiwia2V5cyIsIm1pc3NpbmdPcHRpb25OYW1lcyIsImRpZmZlcmVuY2UiLCJpc0VtcHR5IiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibGF1bmNoQXBwIiwiZXJyb3JzIiwiVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciIsImNsb3NlQXBwIiwicmVzZXQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImVzcHJlc3NvIiwiandwcm94eSIsImNvbW1hbmQiLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwib3B0cyIsImFjdGlvbiIsIm1vYmlsZVN3aXBlIiwiZGlyZWN0aW9uIiwiZWxlbWVudCIsInN3aXBlciIsInN0YXJ0Q29vcmRpbmF0ZXMiLCJlbmRDb29yZGluYXRlcyIsInByZWNpc2lvbkRlc2NyaWJlciIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZUlzVG9hc3RWaXNpYmxlIiwidGV4dCIsImlzUmVnZXhwIiwiaGFzVmFsdWUiLCJsb2dnZXIiLCJlcnJvckFuZFRocm93IiwibW9iaWxlT3BlbkRyYXdlciIsImdyYXZpdHkiLCJtb2JpbGVDbG9zZURyYXdlciIsIm1vYmlsZVNldERhdGUiLCJ5ZWFyIiwibW9udGhPZlllYXIiLCJkYXlPZk1vbnRoIiwibW9iaWxlU2V0VGltZSIsImhvdXJzIiwibWludXRlcyIsIm1vYmlsZU5hdmlnYXRlVG8iLCJtZW51SXRlbUlkIiwibWVudUl0ZW1JZEFzTnVtYmVyIiwicGFyc2VJbnQiLCJpc05hTiIsIm1vYmlsZVdlYkF0b21zIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJtb2JpbGVTY3JvbGxUb1BhZ2UiLCJzY3JvbGxUb1R5cGVzIiwicmVzIiwicHJlc2VuY2UiLCJzY3JvbGxUbyIsImluY2x1c2lvbiIsIndpdGhpbiIsIm1lc3NhZ2UiLCJqb2luIiwic2Nyb2xsVG9QYWdlIiwibnVtZXJpY2FsaXR5Iiwib25seUludGVnZXIiLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsInNtb290aFNjcm9sbCIsIndhcm4iLCJtb2JpbGVCYWNrZG9vciIsInRhcmdldCIsIm1ldGhvZHMiLCJlbGVtZW50SWQiLCJ0YXJnZXRFbGVtZW50IiwibW9iaWxlVWlhdXRvbWF0b3IiLCJzdHJhdGVneSIsImxvY2F0b3IiLCJpbmRleCIsIm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSIsIm1vYmlsZUZsYXNoRWxlbWVudCIsImR1cmF0aW9uTWlsbGlzIiwicmVwZWF0Q291bnQiLCJtb2JpbGVDbGlja0FjdGlvbiIsInRhcHBlciIsImNvb3JkaW5hdGVzUHJvdmlkZXIiLCJpbnB1dERldmljZSIsImJ1dHRvblN0YXRlIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwicHJveHlDb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJzdGFydEFjdGl2aXR5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJjYXBzIiwiZGVidWciLCJ3YWl0Rm9yQWN0aXZpdHkiLCJtb2JpbGVEaXNtaXNzQXV0b2ZpbGwiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxF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LEdBQWlDLGVBQWVBLHFCQUFmLENBQXNDckYsSUFBSSxHQUFHLEVBQTdDLEVBQWlEO0FBQ2hGLFFBQU07QUFBQ0ksSUFBQUE7QUFBRCxNQUFZN0IscUJBQXFCLENBQUN5QixJQUFELEVBQU8sQ0FBQyxTQUFELENBQVAsQ0FBdkM7QUFDQSxRQUFNLEtBQUtKLFFBQUwsQ0FBY0MsT0FBZCxDQUFzQkMsT0FBdEIsQ0FDSCw2Q0FBNENXLGNBQUtDLGFBQUwsQ0FBbUJOLE9BQW5CLENBQTRCLG1CQURyRSxFQUN5RixNQUR6RixFQUNpRyxFQURqRyxDQUFOO0FBRUQsQ0FKRDs7QUFNQWtGLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjakgsVUFBZCxFQUEwQkYsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVDLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAndmFsaWRhdGUuanMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmZ1bmN0aW9uIGFzc2VydFJlcXVpcmVkT3B0aW9ucyAob3B0aW9ucywgcmVxdWlyZWRPcHRpb25OYW1lcykge1xuICBpZiAoIV8uaXNBcnJheShyZXF1aXJlZE9wdGlvbk5hbWVzKSkge1xuICAgIHJlcXVpcmVkT3B0aW9uTmFtZXMgPSBbcmVxdWlyZWRPcHRpb25OYW1lc107XG4gIH1cbiAgY29uc3QgcHJlc2VudE9wdGlvbk5hbWVzID0gXy5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nT3B0aW9uTmFtZXMgPSBfLmRpZmZlcmVuY2UocmVxdWlyZWRPcHRpb25OYW1lcywgcHJlc2VudE9wdGlvbk5hbWVzKTtcbiAgaWYgKF8uaXNFbXB0eShtaXNzaW5nT3B0aW9uTmFtZXMpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlcXVpcmVkOiAke0pTT04uc3RyaW5naWZ5KG1pc3NpbmdPcHRpb25OYW1lcyl9LiBgICtcbiAgICBgWW91IGhhdmUgb25seSBwcm92aWRlZDogJHtKU09OLnN0cmluZ2lmeShwcmVzZW50T3B0aW9uTmFtZXMpfWApO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKCdQbGVhc2UgY3JlYXRlIGEgbmV3IHNlc3Npb24gaW4gb3JkZXIgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0Jyk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuY29tbWFuZHMuY2xvc2VBcHAgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFwcCAoKSB7XG4gIHRocm93IG5ldyBlcnJvcnMuVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcignUGxlYXNlIHF1aXQgdGhlIHNlc3Npb24gaW4gb3JkZXIgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QnKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFxuICAgICdQbGVhc2UgcXVpdCB0aGUgc2Vzc2lvbiBhbmQgY3JlYXRlIGEgbmV3IG9uZSAnICtcbiAgICAnaW4gb3JkZXIgdG8gY2xvc2UgYW5kIGxhdW5jaCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q2xpcGJvYXJkICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjkpXG4gICAgPyAoYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthY3Rpb259ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnYWN0aW9uJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL3BlcmZvcm1fZWRpdG9yX2FjdGlvbicsICdQT1NUJywge2FjdGlvbn0pO1xufTtcblxuY29tbWFuZHMubW9iaWxlU3dpcGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTd2lwZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtkaXJlY3Rpb24sIGVsZW1lbnQsIHN3aXBlciwgc3RhcnRDb29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMsIHByZWNpc2lvbkRlc2NyaWJlcn0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3N3aXBlYCwgJ1BPU1QnLCB7XG4gICAgZGlyZWN0aW9uLCBlbGVtZW50LCBzd2lwZXIsIHN0YXJ0Q29vcmRpbmF0ZXMsIGVuZENvb3JkaW5hdGVzLCBwcmVjaXNpb25EZXNjcmliZXJcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VJbmZvID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlSW5mbyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUlzVG9hc3RWaXNpYmxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNUb2FzdFZpc2libGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dGV4dCwgaXNSZWdleHB9ID0gb3B0cztcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHRleHQpKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYCd0ZXh0JyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvaXNfdG9hc3RfZGlzcGxheWVkJywgJ1BPU1QnLCB7XG4gICAgdGV4dCxcbiAgICBpc1JlZ2V4cCxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVPcGVuRHJhd2VyID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlT3BlbkRyYXdlciAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCBncmF2aXR5fSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpfS9vcGVuX2RyYXdlcmAsICdQT1NUJywge1xuICAgIGdyYXZpdHlcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVDbG9zZURyYXdlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsb3NlRHJhd2VyIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGdyYXZpdHl9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Nsb3NlX2RyYXdlcmAsICdQT1NUJywge1xuICAgIGdyYXZpdHlcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTZXREYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2V0RGF0ZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCB5ZWFyLCBtb250aE9mWWVhciwgZGF5T2ZNb250aH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50JywgJ3llYXInLCAnbW9udGhPZlllYXInLCAnZGF5T2ZNb250aCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3NldF9kYXRlYCwgJ1BPU1QnLCB7XG4gICAgeWVhcixcbiAgICBtb250aE9mWWVhcixcbiAgICBkYXlPZk1vbnRoLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNldFRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXRUaW1lIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGhvdXJzLCBtaW51dGVzfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnLCAnaG91cnMnLCAnbWludXRlcyddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3NldF90aW1lYCwgJ1BPU1QnLCB7XG4gICAgaG91cnMsXG4gICAgbWludXRlcyxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVOYXZpZ2F0ZVRvID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmF2aWdhdGVUbyAob3B0cyA9IHt9KSB7XG4gIGxldCB7ZWxlbWVudCwgbWVudUl0ZW1JZH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydtZW51SXRlbUlkJywgJ2VsZW1lbnQnXSk7XG5cbiAgbGV0IG1lbnVJdGVtSWRBc051bWJlciA9IHBhcnNlSW50KG1lbnVJdGVtSWQsIDEwKTtcbiAgaWYgKF8uaXNOYU4obWVudUl0ZW1JZEFzTnVtYmVyKSB8fCBtZW51SXRlbUlkQXNOdW1iZXIgPCAwKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYCdtZW51SXRlbUlkJyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gRm91bmQgJHttZW51SXRlbUlkfWApO1xuICAgIG1lbnVJdGVtSWQgPSBtZW51SXRlbUlkQXNOdW1iZXI7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L25hdmlnYXRlX3RvYCwgJ1BPU1QnLCB7XG4gICAgbWVudUl0ZW1JZFxuICB9KTtcbn07XG5cbi8qKlxuICogUnVucyBhIGNoYWluIG9mIEVzcHJlc3NvIHdlYiBhdG9tcyAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Rlc3RpbmcvZXNwcmVzc28vd2ViIGZvciByZWZlcmVuY2UpXG4gKlxuICogVGFrZXMgSlNPTiBvZiB0aGUgZm9ybVxuICpcbiAqIHtcbiAqICAgXCJ3ZWJ2aWV3RWxcIjogXCI8RUxFTUVOVF9JRD5cIiwgLy8gb3B0aW9uYWwgd2VidmlldyBlbGVtZW50IHRvIG9wZXJhdGUgb25cbiAqICAgXCJmb3JjZUphdmFzY3JpcHRFbmFibGVkXCI6IHRydWV8ZmFsc2UsIC8vIGlmIHdlYnZpZXcgZGlzYWJsZXMgamF2YXNjcmlwdCwgd2ViYXRvbXMgd29uJ3Qgd29yaywgdGhpcyBmb3JjZXMgaXRcbiAqICAgXCJtZXRob2RDaGFpblwiOiBbXG4gKiAgICAge1wibmFtZVwiOiBcIm1ldGhvZE5hbWVcIiwgXCJhdG9tXCI6IHtcIm5hbWVcIjogXCJhdG9tTmFtZVwiLCBcImFyZ3NcIjogW1wiYXJnMVwiLCBcImFyZzJcIiwgLi4uXX19LFxuICogICAgIC4uLlxuICogICBdXG4gKiB9XG4gKlxuICovXG5jb21tYW5kcy5tb2JpbGVXZWJBdG9tcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVdlYkF0b21zIChvcHRzID0ge30pIHtcbiAgb3B0cyA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ21ldGhvZENoYWluJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvd2ViX2F0b21zYCwgJ1BPU1QnLCBvcHRzKTtcbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxUb1BhZ2UgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGxUb1BhZ2UgKG9wdHMgPSB7fSkge1xuXG4gIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IHNjcm9sbFRvVHlwZXMgPSBbJ2ZpcnN0JywgJ2xhc3QnLCAnbGVmdCcsICdyaWdodCddO1xuICBjb25zdCByZXMgPSB2YWxpZGF0ZShvcHRzLCB7XG4gICAgZWxlbWVudDoge3ByZXNlbmNlOiB0cnVlfSxcbiAgICBzY3JvbGxUbzoge1xuICAgICAgaW5jbHVzaW9uOiB7XG4gICAgICAgIHdpdGhpbjogc2Nyb2xsVG9UeXBlcyxcbiAgICAgICAgbWVzc2FnZTogYFwic2Nyb2xsVG9cIiBtdXN0IGJlIG9uZSBvZiBcIiR7c2Nyb2xsVG9UeXBlcy5qb2luKCcsICcpfVwiIGZvdW5kICcle3ZhbHVlfSdgLFxuICAgICAgfVxuICAgIH0sXG4gICAgc2Nyb2xsVG9QYWdlOiB7XG4gICAgICBudW1lcmljYWxpdHk6IHtcbiAgICAgICAgb25seUludGVnZXI6IHRydWUsXG4gICAgICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiAwLFxuICAgICAgICBtZXNzYWdlOiBgXCJzY3JvbGxUb1BhZ2VcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIEZvdW5kICcle3ZhbHVlfSdgXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKHJlcykpIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgSW52YWxpZCBzY3JvbGxUbyBwYXJhbWV0ZXJzOiAke0pTT04uc3RyaW5naWZ5KHJlcyl9YCk7XG4gIH1cblxuICBjb25zdCB7ZWxlbWVudCwgc2Nyb2xsVG8sIHNjcm9sbFRvUGFnZSwgc21vb3RoU2Nyb2xsfSA9IG9wdHM7XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUoc2Nyb2xsVG8pICYmIHV0aWwuaGFzVmFsdWUoc2Nyb2xsVG9QYWdlKSkge1xuICAgIGxvZ2dlci53YXJuKGAnc2Nyb2xsVG8nIGFuZCAnc2Nyb2xsVG9QYWdlJyB3aGVyZSBib3RoIHByb3ZpZGVkLiBEZWZhdWx0aW5nIHRvICdzY3JvbGxUbydgKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2Nyb2xsX3RvX3BhZ2VgLCAnUE9TVCcsIHtcbiAgICBzY3JvbGxUbyxcbiAgICBzY3JvbGxUb1BhZ2UsXG4gICAgc21vb3RoU2Nyb2xsLFxuICB9KTtcbn07XG5cblxuLyoqXG4gKiAgQVBJIHRvIGludm9rZSBtZXRob2RzIGRlZmluZWQgaW4gQW5kcm9pZCBhcHAuXG4gKlxuICogIEV4YW1wbGUgZGF0YVxuICogIHtcbiAqICAgdGFyZ2V0OiAnYWN0aXZpdHknLFxuICogICBtZXRob2RzOlxuICogICAgICAgICBbXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgICBuYW1lOiBcInNvbWVNZXRob2RcIixcbiAqICAgICAgICAgICB9LFxuICogICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgbmFtZTogXCJhbm90aGVyTWV0aG9kXCIsXG4gKiAgICAgICAgICAgICAgIGFyZ3M6XG4gKiAgICAgICAgICAgICAgICAgICBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlOiBcIkxvbFwiLCB0eXBlOiAnamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSd9LFxuICogICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZTogMSwgdHlwZTogJ2ludCd9XG4gKiAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiB9XG4gKlxuICogSW4gYWJvdmUgZXhhbXBsZSwgbWV0aG9kIFwic29tZU1ldGhvZFwiIHdpbGwgYmUgaW52b2tlZCBvbiAnYWN0aXZpdHknLiBPbiB0aGUgcmVzdWx0LCBcImFub3RoZXJNZXRob2RcIiB3aWxsIGJlIGludm9rZWRcbiAqICBcInRhcmdldFwiIGNhbiBiZSBlaXRoZXIgJ2FjdGl2aXR5JywgJ2FwcGxpY2F0aW9uJyBvciAnZWxlbWVudCdcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdhcHBsaWNhdGlvbicsIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIG9uIGFwcGxpY2F0aW9uIGNsYXNzXG4gKiAgSWYgdGFyZ2V0IGlzIHNldCB0byAnYWN0aXZpdHknLCBtZXRob2RzIHdpbGwgYmUgaW52b2tlZCBvbiBjdXJyZW50IGFjdGl2aXR5XG4gKiAgSWYgdGFyZ2V0IGlzIHNldCB0byAnZWxlbWVudCcsICdlbGVtZW50SWQnIG11c3QgYmUgc3BlY2lmaWVkXG4gKlxuICogLSBPbmx5ICdQdWJsaWMnIG1ldGhvZHMgY2FuIGJlIGludm9rZWQuICgnb3BlbicgbW9kaWZpcmUgaXMgbmVjZXNzYXJ5IGluIEtvdGxpbilcbiAqIC0gZm9sbG93aW5nIHByaW1pdGl2ZSB0eXBlcyBhcmUgc3VwcG9ydGVkOiBcImludFwiLCBcImJvb2xlYW5cIiwgXCJieXRlXCIsIFwic2hvcnRcIiwgXCJsb25nXCIsIFwiZmxvYXRcIiwgXCJjaGFyXCJcbiAqIC0gIE5vbi1wcmltaXRpdmUgdHlwZXMgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSBcImphdmEubGFuZy4qXCIgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnLiBcImphdmEubGFuZy5DaGFyU2VxdWVuY2VcIiwgXCJqYXZhLmxhbmcuU3RyaW5nXCIsIFwiamF2YS5sYW5nLkludGVnZXJcIiwgXCJqYXZhLmxhbmcuRmxvYXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJqYXZhLmxhbmcuRG91YmxlXCIsIFwiamF2YS5sYW5nLkJvb2xlYW5cIiwgXCJqYXZhLmxhbmcuTG9uZ1wiLCBcImphdmEubGFuZy5TaG9ydFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImphdmEubGFuZy5DaGFyYWN0ZXJcIiBldGMuLi5cbiAqXG4gKlxuICogQHRocm93cyAge0Vycm9yfSBpZiB0YXJnZXQgaXMgbm90ICdhY3Rpdml0eScgb3IgJ2FwcGxpY2F0aW9uJ1xuICogQHRocm93cyAge0Vycm9yfSBpZiBhIG1ldGhvZCBpcyBub3QgZm91bmQgd2l0aCBnaXZlbiBhcmd1bWVudCB0eXBlc1xuICpcbiAqIEByZXR1cm4geyp9IHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgbWV0aG9kIGluIHRoZSBpbnZvY2F0aW9uIGNoYWluLiBJZiBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdm9pZCwgdGhlbiBcIjxWT0lEPlwiIHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJhY2tkb29yID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQmFja2Rvb3IgKG9wdHMgPSB7fSkge1xuICBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWyd0YXJnZXQnLCAnbWV0aG9kcyddKTtcbiAgY29uc3Qge3RhcmdldCwgbWV0aG9kc30gPSBvcHRzO1xuICBpZiAodGFyZ2V0ID09PSAnZWxlbWVudCcpIHtcbiAgICBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50SWQnXSk7XG4gIH1cbiAgY29uc3Qge2VsZW1lbnRJZDogdGFyZ2V0RWxlbWVudH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvYmFja2Rvb3JgLCAnUE9TVCcsIHt0YXJnZXQsIG1ldGhvZHMsIHRhcmdldEVsZW1lbnR9KTtcbn07XG5cbi8qKlxuICogIEV4ZWN1dGUgVWlBdXRvbWF0b3IyIGNvbW1hbmRzIHRvIGRyaXZlIG91dCBvZiBhcHAgYXJlYXMuXG4gKiAgc3RyYXRlZ3kgY2FuIGJlIG9uZSBvZjogXCJjbGF6elwiLCBcInJlc1wiLCBcInRleHRcIiwgXCJ0ZXh0Q29udGFpbnNcIiwgXCJ0ZXh0RW5kc1dpdGhcIiwgXCJ0ZXh0U3RhcnRzV2l0aFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY1wiLCBcImRlc2NDb250YWluc1wiLCBcImRlc2NFbmRzV2l0aFwiLCBcImRlc2NTdGFydHNXaXRoXCIsIFwicGtnXCJcbiAqXG4gKiAgYWN0aW9uIGNhbiBiZSBvbmUgb2Y6IFwiY2xpY2tcIiwgXCJsb25nQ2xpY2tcIiwgXCJnZXRUZXh0XCIsIFwiZ2V0Q29udGVudERlc2NyaXB0aW9uXCIsIFwiZ2V0Q2xhc3NOYW1lXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2V0UmVzb3VyY2VOYW1lXCIsIFwiZ2V0VmlzaWJsZUJvdW5kc1wiLCBcImdldFZpc2libGVDZW50ZXJcIiwgXCJnZXRBcHBsaWNhdGlvblBhY2thZ2VcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJnZXRDaGlsZENvdW50XCIsIFwiY2xlYXJcIiwgXCJpc0NoZWNrYWJsZVwiLCBcImlzQ2hlY2tlZFwiLCBcImlzQ2xpY2thYmxlXCIsIFwiaXNFbmFibGVkXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNGb2N1c2FibGVcIiwgXCJpc0ZvY3VzZWRcIiwgXCJpc0xvbmdDbGlja2FibGVcIiwgXCJpc1Njcm9sbGFibGVcIiwgXCJpc1NlbGVjdGVkXCJcbiAqL1xuY29tbWFuZHMubW9iaWxlVWlhdXRvbWF0b3IgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVaWF1dG9tYXRvciAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdHJhdGVneSwgbG9jYXRvciwgYWN0aW9uLCBpbmRleH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydzdHJhdGVneScsICdsb2NhdG9yJywgJ2FjdGlvbiddKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlL3VpYXV0b21hdG9yYCwgJ1BPU1QnLCB7c3RyYXRlZ3ksIGxvY2F0b3IsIGluZGV4LCBhY3Rpb259KTtcbn07XG5cbi8qKlxuICogIEV4ZWN1dGUgVWlBdXRvbWF0b3IyIGNvbW1hbmQgdG8gcmV0dXJuIHRoZSBVSSBkdW1wIHdoZW4gQVVUIGlzIGluIGJhY2tncm91bmQuXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIHVpYXV0b21hdG9yIHZpZXcgZHVtcCBpcyB1bnN1Y2Nlc3NmdWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHVpYXV0b21hdG9yIERPTSB4bWwgYXMgc3RyaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS91aWF1dG9tYXRvcl9wYWdlX3NvdXJjZWAsICdHRVQnKTtcbn07XG5cbi8qKlxuICogIEZsYXNoIHRoZSBlbGVtZW50IHdpdGggZ2l2ZW4gaWQuXG4gKiAgZHVyYXRpb25NaWxsaXMgYW5kIHJlcGVhdENvdW50IGFyZSBvcHRpb25hbFxuICpcbiAqL1xuY29tbWFuZHMubW9iaWxlRmxhc2hFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRmxhc2hFbGVtZW50IChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnR9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcbiAgY29uc3Qge2R1cmF0aW9uTWlsbGlzLCByZXBlYXRDb3VudH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2ZsYXNoYCwgJ1BPU1QnLCB7XG4gICAgZHVyYXRpb25NaWxsaXMsXG4gICAgcmVwZWF0Q291bnRcbiAgfSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gYSAnR2VuZXJhbENsaWNrQWN0aW9uJyAoaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWR4L3Rlc3QvZXNwcmVzc28vYWN0aW9uL0dlbmVyYWxDbGlja0FjdGlvbilcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2xpY2tBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDbGlja0FjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCB0YXBwZXIsIGNvb3JkaW5hdGVzUHJvdmlkZXIsIHByZWNpc2lvbkRlc2NyaWJlcixcbiAgICAgICAgIGlucHV0RGV2aWNlLCBidXR0b25TdGF0ZX0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2NsaWNrX2FjdGlvbmAsICdQT1NUJywge1xuICAgIHRhcHBlciwgY29vcmRpbmF0ZXNQcm92aWRlciwgcHJlY2lzaW9uRGVzY3JpYmVyLCBpbnB1dERldmljZSwgYnV0dG9uU3RhdGVcbiAgfSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzZXR0aW5ncykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vc2V0dGluZ3NgLCAnUE9TVCcsIHsgc2V0dGluZ3MgfSk7XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmdzICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL3NldHRpbmdzYCwgJ0dFVCcpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byBFc3ByZXNzb1xuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5lc3ByZXNzby5wcm94eUNvbW1hbmQuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpIHtcbiAgLy8gaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXRcbiAgLy8gcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBFc3ByZXNzb1xuICBhcHBQYWNrYWdlID0gYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgYXBwV2FpdFBhY2thZ2UgPSBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlO1xuICBhcHBBY3Rpdml0eSA9IHF1YWxpZnlBY3Rpdml0eU5hbWUoYXBwQWN0aXZpdHksIGFwcFBhY2thZ2UpO1xuICBhcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UpO1xuICBsb2dnZXIuZGVidWcoYFN0YXJ0aW5nIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fScgZm9yIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nYCk7XG4gIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eWAsICdQT1NUJywge1xuICAgIGFwcFBhY2thZ2UsXG4gICAgYXBwQWN0aXZpdHksXG4gIH0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkoYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVEaXNtaXNzQXV0b2ZpbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEaXNtaXNzQXV0b2ZpbGwgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChcbiAgICBgL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Rpc21pc3NfYXV0b2ZpbGxgLCAnUE9TVCcsIHt9KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=