appium-espresso-driver 2.13.9 → 2.13.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +16 -16
- package/build/lib/driver.js +3 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/method-map.js +21 -0
- package/build/lib/method-map.js.map +1 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/lib/driver.js +5 -1
- package/lib/method-map.js +11 -0
- package/npm-shrinkwrap.json +16 -16
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [2.13.10](https://github.com/appium/appium-espresso-driver/compare/v2.13.9...v2.13.10) (2023-01-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* specify supported non-standard commands in newMethodMap ([578ef7c](https://github.com/appium/appium-espresso-driver/commit/578ef7c4ab1fe703f92c12799436863ebfb2df42))
|
|
7
|
+
|
|
1
8
|
## [2.13.9](https://github.com/appium/appium-espresso-driver/compare/v2.13.8...v2.13.9) (2023-01-03)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -359,28 +359,28 @@ view-tag | The [testTag](https://developer.android.com/reference/kotlin/androidx
|
|
|
359
359
|
|
|
360
360
|
Espresso driver supports the following location strategies in `espresso` subdriver:
|
|
361
361
|
|
|
362
|
-
Name | Description | Example
|
|
363
|
-
--- | --- | ---
|
|
364
|
-
id | This strategy is mapped to the native Espresso `withId` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withId(org.hamcrest.Matcher%3Cjava.lang.Integer%3E)) (exact match of element's resource id). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | 'com.mycompany:id/resourceId'
|
|
365
|
-
accessibility id | This strategy is mapped to the native Espresso `withContentDescription` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withcontentdescription_1) (exact match of element's content description). | 'my description'
|
|
366
|
-
class name | This strategy is mapped to the native Espresso `withClassName` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withClassName(org.hamcrest.Matcher%3Cjava.lang.String%3E)) (exact match of element's class name). | 'android.view.View'
|
|
367
|
-
text | This strategy is mapped to the native Espresso `withText` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withText(org.hamcrest.Matcher%3Cjava.lang.String%3E)) (exact match of element's text). | 'my text'
|
|
368
|
-
`-android viewtag` or `tag name` | This strategy is mapped to the native Espresso `withTagValue` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withtagvalue) (exact match of element's tag value). | 'my tag'
|
|
369
|
-
-android datamatcher | This strategy allows to create Espresso [data interaction](https://developer.android.com/reference/android/support/test/espresso/DataInteraction) selectors which can quickly and reliably scroll to the necessary elements. Read [Espresso DataMatcher Selector](docs/espresso-datamatcher-selector.md) to know more on how to construct these locators. Also check the [Unlocking New Testing Capabilities with Espresso Driver by Daniel Graham](https://www.youtube.com/watch?v=gU9EEUV5n9U) presentation video from Appium Conf 2019. |
|
|
370
|
-
-android viewmatcher | This strategy allows constructing of Espresso [view matchers](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers) based on the given JSON representation of them. The representation is expected to contain the following fields: `name`: _mandatory_ matcher function name; `args`: _optional_ matcher function arguments, each argument could also be a function; `class`: _optional_ full qualified class name of the corresponding matcher (if not provided then [org.hamcrest.Matchers](https://hamcrest.org/JavaHamcrest/javadoc/2.2/org/hamcrest/Matchers.html) one is used), `scope` (since Espresso driver 2.11.0): _optional_ JSON representation of a [RootMatchers](https://developer.android.com/reference/androidx/test/espresso/matcher/RootMatchers) method. Check [unit tests](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt) for more examples. |
|
|
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. |
|
|
362
|
+
Name | Description | Speed Ranking | Example
|
|
363
|
+
--- | --- | --- | ---
|
|
364
|
+
id | This strategy is mapped to the native Espresso `withId` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withId(org.hamcrest.Matcher%3Cjava.lang.Integer%3E)) (exact match of element's resource id). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | `⭐⭐⭐⭐⭐` | 'com.mycompany:id/resourceId'
|
|
365
|
+
accessibility id | This strategy is mapped to the native Espresso `withContentDescription` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withcontentdescription_1) (exact match of element's content description). | `⭐⭐⭐⭐⭐` | 'my description'
|
|
366
|
+
class name | This strategy is mapped to the native Espresso `withClassName` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withClassName(org.hamcrest.Matcher%3Cjava.lang.String%3E)) (exact match of element's class name). | `⭐⭐⭐⭐⭐` | 'android.view.View'
|
|
367
|
+
text | This strategy is mapped to the native Espresso `withText` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withText(org.hamcrest.Matcher%3Cjava.lang.String%3E)) (exact match of element's text). | `⭐⭐⭐⭐⭐` | 'my text'
|
|
368
|
+
`-android viewtag` or `tag name` | This strategy is mapped to the native Espresso `withTagValue` [matcher](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers#withtagvalue) (exact match of element's tag value). | `⭐⭐⭐⭐⭐` | 'my tag'
|
|
369
|
+
-android datamatcher | This strategy allows to create Espresso [data interaction](https://developer.android.com/reference/android/support/test/espresso/DataInteraction) selectors which can quickly and reliably scroll to the necessary elements. Read [Espresso DataMatcher Selector](docs/espresso-datamatcher-selector.md) to know more on how to construct these locators. Also check the [Unlocking New Testing Capabilities with Espresso Driver by Daniel Graham](https://www.youtube.com/watch?v=gU9EEUV5n9U) presentation video from Appium Conf 2019. | `⭐⭐⭐⭐` | {"name": "hasEntry", "args": ["title", "WebView3"]}
|
|
370
|
+
-android viewmatcher | This strategy allows constructing of Espresso [view matchers](https://developer.android.com/reference/androidx/test/espresso/matcher/ViewMatchers) based on the given JSON representation of them. The representation is expected to contain the following fields: `name`: _mandatory_ matcher function name; `args`: _optional_ matcher function arguments, each argument could also be a function; `class`: _optional_ full qualified class name of the corresponding matcher (if not provided then [org.hamcrest.Matchers](https://hamcrest.org/JavaHamcrest/javadoc/2.2/org/hamcrest/Matchers.html) one is used), `scope` (since Espresso driver 2.11.0): _optional_ JSON representation of a [RootMatchers](https://developer.android.com/reference/androidx/test/espresso/matcher/RootMatchers) method. Check [unit tests](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt) for more examples. | `⭐⭐⭐⭐` | {"name": "withText", "args": [{"name": "containsString", "args": "getExternalStoragePublicDirectory", "class": "org.hamcrest.Matchers"}], "class": "androidx.test.espresso.matcher.ViewMatchers"}
|
|
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("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")
|
|
372
372
|
|
|
373
373
|
|
|
374
374
|
## Compose Elements Location
|
|
375
375
|
|
|
376
376
|
Espresso driver supports the following location strategies in `compose` subdriver:
|
|
377
377
|
|
|
378
|
-
Name | Description | Example
|
|
379
|
-
--- | --- | ---
|
|
380
|
-
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'
|
|
381
|
-
`-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'
|
|
382
|
-
`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'
|
|
383
|
-
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. |
|
|
378
|
+
Name | Description | Speed Ranking | Example
|
|
379
|
+
--- | --- | --- | ---
|
|
380
|
+
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'
|
|
381
|
+
`-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'
|
|
382
|
+
`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'
|
|
383
|
+
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\"]")
|
|
384
384
|
|
|
385
385
|
|
|
386
386
|
## Platform-Specific Extensions
|
package/build/lib/driver.js
CHANGED
|
@@ -19,6 +19,7 @@ var _desiredCaps = _interopRequireDefault(require("./desired-caps"));
|
|
|
19
19
|
var _portscanner = require("portscanner");
|
|
20
20
|
var _asyncbox = require("asyncbox");
|
|
21
21
|
var _utils = require("./utils");
|
|
22
|
+
var _methodMap = require("./method-map");
|
|
22
23
|
const helpers = _appiumAndroidDriver.androidHelpers;
|
|
23
24
|
const SYSTEM_PORT_RANGE = [8300, 8399];
|
|
24
25
|
const DEVICE_PORT = 6791;
|
|
@@ -28,6 +29,7 @@ const APK_EXT = '.apk';
|
|
|
28
29
|
const AAB_EXT = '.aab';
|
|
29
30
|
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
30
31
|
class EspressoDriver extends _driver.BaseDriver {
|
|
32
|
+
static newMethodMap = _methodMap.newMethodMap;
|
|
31
33
|
constructor(opts = {}, shouldValidateCaps = true) {
|
|
32
34
|
delete opts.shell;
|
|
33
35
|
super(opts, shouldValidateCaps);
|
|
@@ -452,4 +454,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_commands.default)) {
|
|
|
452
454
|
}
|
|
453
455
|
var _default = EspressoDriver;
|
|
454
456
|
exports.default = _default;
|
|
455
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiYW5kcm9pZEhlbHBlcnMiLCJTWVNURU1fUE9SVF9SQU5HRSIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJBUEtfRVhUIiwiQUFCX0VYVCIsIlNVUFBPUlRFRF9FWFRFTlNJT05TIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiXyIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwiYXBwIiwibG9nIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYWRkV2lwZURhdGFUb0F2ZEFyZ3MiLCJzeXN0ZW1Qb3J0IiwiZmluZEFQb3J0Tm90SW5Vc2UiLCJ1ZGlkIiwiZW1Qb3J0IiwiZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIiwiYWRiIiwiY3JlYXRlQURCIiwiY29uZmlndXJlQXBwIiwib25Qb3N0UHJvY2VzcyIsIm9uUG9zdENvbmZpZ3VyZUFwcCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJhcHBPbkRldmljZSIsImluZm8iLCJhcHBQYWNrYWdlIiwiaXNBcHBJbnN0YWxsZWQiLCJzdGFydEVzcHJlc3NvU2Vzc2lvbiIsImUiLCJkZWxldGVTZXNzaW9uIiwibWVzc2FnZSIsImVuZHNXaXRoIiwiaXNFcnJvclR5cGUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJtYW5pZmVzdFBheWxvYWQiLCJnZXRQYWNrYWdlSW5mbyIsInZlcnNpb24iLCJnZXRBcGlMZXZlbCIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJpbml0RGV2aWNlIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwid2FzQW5pbWF0aW9uRW5hYmxlZCIsImN1ckRldmljZUlkIiwiZGV2aWNlVURJRCIsImluaXRFc3ByZXNzb1NlcnZlciIsImZvcndhcmRQb3J0Iiwic2tpcFVubG9jayIsInVubG9jayIsImluaXRBVVQiLCJhcHBXYWl0UGFja2FnZSIsImFwcEFjdGl2aXR5IiwicXVhbGlmeUFjdGl2aXR5TmFtZSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwiYXBpVmVyc2lvbiIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwicmVhbERpc3BsYXlTaXplIiwiZGlzcGxheURlbnNpdHkiLCJtb2JpbGVHZXREZXZpY2VJbmZvIiwiZGV2aWNlQXBpTGV2ZWwiLCJwYXJzZUludCIsImRldmljZVNjcmVlblNpemUiLCJkZXZpY2VTY3JlZW5EZW5zaXR5IiwiZGV2aWNlTW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJFc3ByZXNzb1J1bm5lciIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImZvcmNlRXNwcmVzc29SZWJ1aWxkIiwiZXNwcmVzc29CdWlsZENvbmZpZyIsInNob3dHcmFkbGVMb2ciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0Iiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiVEVTVF9BUEtfUEtHIiwiZmFzdFJlc2V0IiwicmVzZXRBcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImluc3RhbGxUZXN0QXBrIiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0Iiwic3RkZXJyIiwic2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzIiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJCIiwiYWxsIiwidGFzayIsImlnbiIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJ1bmRlZmluZWQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImVycm9yIiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwiaXNOaWwiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJpc1BhY2thZ2VPckJ1bmRsZSIsImNtZCIsImZuIiwidG9QYWlycyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyBFc3ByZXNzb1J1bm5lciwgVEVTVF9BUEtfUEtHIH0gZnJvbSAnLi9lc3ByZXNzby1ydW5uZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHppcCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lLCBnZXRQYWNrYWdlSW5mbyB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8vIFRPRE8gbWVyZ2Ugb3VyIG93biBoZWxwZXJzIG9udG8gdGhpcyBsYXRlclxuY29uc3QgaGVscGVycyA9IGFuZHJvaWRIZWxwZXJzO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gRXNwcmVzc28gSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgU1lTVEVNX1BPUlRfUkFOR0UgPSBbODMwMCwgODM5OV07XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgZXNwcmVzc28gc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbFxuLy8gZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTE7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19rZXlib2FyZF9zaG93bicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFycycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fdGltZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2JhY2tncm91bmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2Nsb3NlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9sYXVuY2gnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3Jlc2V0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9zdHJpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hY3RpdmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9zdGF0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pbnN0YWxsX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3JlbW92ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS91bmxvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuXG5jb25zdCBBUEtfRVhUID0gJy5hcGsnO1xuY29uc3QgQUFCX0VYVCA9ICcuYWFiJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRFTlNJT05TID0gW0FQS19FWFQsIEFBQl9FWFRdO1xuXG5jbGFzcyBFc3ByZXNzb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgJ2Jyb3dzZXJOYW1lJyBjYXBhYmlsaXR5IHdpbGwgYmUgaWdub3JlZGApO1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBicm93c2VyIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gc2Vzc2lvbnMgYmVjYXVzZSBFc3ByZXNzbyBhdXRvbWF0aW9uIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgIGBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIENocm9tZWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHAgZmlsZSB3YXMgbm90IGxpc3RlZCwgaW5zdGVhZCB3ZSdyZSBnb2luZyB0byBydW4gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIHRoZSBwYWNrYWdlICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgYCArXG4gICAgICAgICAgICBgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0RXNwcmVzc29TZXNzaW9uKCk7XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYCR7Xy5lbmRzV2l0aChlLm1lc3NhZ2UsICcuJykgPyAnJyA6ICcuJ30gQ2hlY2sgYCArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1lc3ByZXNzby1kcml2ZXIjdHJvdWJsZXNob290aW5nICcgK1xuICAgICAgICAncmVnYXJkaW5nIGFkdmFuY2VkIHNlc3Npb24gc3RhcnR1cCB0cm91Ymxlc2hvb3RpbmcuJztcbiAgICAgIGlmIChpc0Vycm9yVHlwZShlLCBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgZXJyLnN0YWNrID0gZS5zdGFjaztcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW56aXAgdGhlIGdpdmVuIGFwcCBwYXRoIGFuZCByZXR1cm4gdGhlIGZpcnN0IHBhY2thZ2UgdGhhdCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlNcbiAgICogaW4gdGhlIGFyY2hpdmVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIFRoZSBwYXRoIHRvIGFwcCBmaWxlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1bnMgdGhlIHBhdGggdG8gYW4gdW56aXBwZWQgYXBwIGZpbGUgcGF0aC5cbiAgICogQHRocm93cyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHppcCBkaWQgbm90IGhhdmUgYW55IFNVUFBPUlRFRF9FWFRFTlNJT05TIHBhY2thZ2VzLlxuICAgKi9cbiAgYXN5bmMgdW56aXBBcHAgKGFwcFBhdGgpIHtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgICAgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFwcFBhdGgsIHRtcFJvb3QsIHt1c2VTeXN0ZW1VbnppcH0pO1xuXG4gICAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7U1VQUE9SVEVEX0VYVEVOU0lPTlMubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKS5qb2luKCd8Jyl9KWA7XG4gICAgY29uc3Qgc29ydGVkQnVuZGxlSXRlbXMgPSAoYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybiwge1xuICAgICAgY3dkOiB0bXBSb290LFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICB9KSkuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgICBpZiAoc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBubyBleHBlY3RlZCBwYWNrYWdlcyBpbiB0aGUgemlwXG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAke3RoaXMub3B0cy5hcHB9IGRpZCBub3QgaGF2ZSBhbnkgb2YgJyR7U1VQUE9SVEVEX0VYVEVOU0lPTlMuam9pbignLCAnKX0nIGAgK1xuICAgICAgICBgZXh0ZW5zaW9uIHBhY2thZ2VzLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCAuemlwIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IHVuemlwcGVkQXBwUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCcke3VuemlwcGVkQXBwUGF0aH0nIGlzIHRoZSB1bnppcHBlZCBmaWxlIGZyb20gJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHVuemlwcGVkQXBwUGF0aDtcbiAgfVxuXG4gIGFzeW5jIG9uUG9zdENvbmZpZ3VyZUFwcCAoe2NhY2hlZEFwcEluZm8sIGlzVXJsLCBhcHBQYXRofSkge1xuICAgIGNvbnN0IHByZXNpZ25BcHAgPSBhc3luYyAoYXBwTG9jYXRpb24pID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9TaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwaW5nIGFwcGxpY2F0aW9uIHNpZ25pbmcgYmVjYXVzZSBub1NpZ24gY2FwYWJpbGl0eSBpcyBzZXQgdG8gdHJ1ZS4gJyArXG4gICAgICAgICAgJ0hhdmluZyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB3aXRoIGltcHJvcGVyIHNpZ25hdHVyZS9ub24tc2lnbmVkIHdpbGwgY2F1c2UgJyArXG4gICAgICAgICAgJ0VzcHJlc3NvIGF1dG9tYXRpb24gc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfSBlbHNlIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbihhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYXNBcGtFeHQgPSAoYXBwUGF0aCkgPT4gXy5lbmRzV2l0aChfLnRvTG93ZXIoYXBwUGF0aCksIEFQS19FWFQpO1xuICAgIGNvbnN0IGhhc0FhYkV4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQUFCX0VYVCk7XG4gICAgY29uc3QgZXh0cmFjdFVuaXZlcnNhbEFwayA9IGFzeW5jIChzaG91bGRFeHRyYWN0LCBhcHBQYXRoKSA9PlxuICAgICAgc2hvdWxkRXh0cmFjdCA/IGFwcFBhdGggOiBhd2FpdCB0aGlzLmFkYi5leHRyYWN0VW5pdmVyc2FsQXBrKGFwcFBhdGgpO1xuXG4gICAgbGV0IHBhdGhJbkNhY2hlID0gbnVsbDtcbiAgICBsZXQgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IGZhbHNlO1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mby5wYWNrYWdlSGFzaCAmJiBhd2FpdCBmcy5leGlzdHMoY2FjaGVkQXBwSW5mby5mdWxsUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgJyR7Y2FjaGVkQXBwSW5mby5mdWxsUGF0aH0nIHdoaWNoIGlzIGNhY2hlZCBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgICAgICBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgcGF0aEluQ2FjaGUgPSBjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcFBhdGggY2FuIGJlIC56aXAsIC5hcGsgb3IgLmFhYlxuICAgIGNvbnN0IGlzQXBrID0gaGFzQXBrRXh0KGFwcFBhdGgpO1xuICAgIC8vIE9ubHkgbG9jYWwgLmFwayBmaWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4tcGxhY2Ugc2hvdWxkIG5vdCBiZSBjYWNoZWRcbiAgICBjb25zdCBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPSAhaXNBcGsgfHwgKGlzQXBrICYmIGlzVXJsKTtcblxuICAgIGlmICghaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCkge1xuICAgICAgaWYgKHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCkge1xuICAgICAgICAvLyAuemlwLCAuYWFiIG9yIGRvd25sb2FkZWQgLmFwa1xuXG4gICAgICAgIGxldCB1bnppcHBlZEFwcFBhdGg7XG4gICAgICAgIGxldCBpc1VuemlwcGVkQXBrID0gZmFsc2U7XG4gICAgICAgIGlmICghKGhhc0Fwa0V4dChhcHBQYXRoKSB8fCBoYXNBYWJFeHQoYXBwUGF0aCkpKSB7XG4gICAgICAgICAgdW56aXBwZWRBcHBQYXRoID0gYXdhaXQgdGhpcy51bnppcEFwcChhcHBQYXRoKTtcbiAgICAgICAgICBpc1VuemlwcGVkQXBrID0gaGFzQXBrRXh0KHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnppcHBlZEFwcFBhdGggb3IgYXBwUGF0aCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlMuXG4gICAgICAgIHBhdGhJbkNhY2hlID0gdW56aXBwZWRBcHBQYXRoXG4gICAgICAgICAgPyBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzVW56aXBwZWRBcGssIHVuemlwcGVkQXBwUGF0aClcbiAgICAgICAgICA6IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNBcGssIGFwcFBhdGgpO1xuXG4gICAgICAgIGlmICghaXNBcGsgJiYgaXNVcmwpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcG9yYXJpbHkgZG93bmxvYWRlZCAuYWFiIG9yIC56aXAgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQWFiRXh0KHVuemlwcGVkQXBwUGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBsb2NhbCB1bnppcHBlZCAuYWFiIGZpbGVcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGNvbnN0IHttYW5pZmVzdFBheWxvYWR9ID0gYXdhaXQgZ2V0UGFja2FnZUluZm8oKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke21hbmlmZXN0UGF5bG9hZC52ZXJzaW9ufWApO1xuXG4gICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1hbmRyb2lkLWRyaXZlci9wdWxsLzQ2MSB3aGF0IGhhcHBlbnMgaWYgdGhlciBpcyBubyBzZXRIaWRkZW5BcGlQb2xpY3kgZm9yIEFuZHJvaWQgUCtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdHVybiBvZmYgYW5pbWF0aW9uczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBlc3ByZXNzbyBzZXJ2ZXIgZXRjXG4gICAgdGhpcy5pbml0RXNwcmVzc29TZXJ2ZXIoKTtcbiAgICAvLyBGdXJ0aGVyIHByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBlc3ByZXNzbyBwb3J0XG4gICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgRXNwcmVzc28gU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gJHt0aGlzLm9wdHMuc3lzdGVtUG9ydH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCwgREVWSUNFX1BPUlQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHdhaXRpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbiBhY3Rpdml0eSB0byBzdGFydCBiZWNhdXNlICdhdXRvTGF1bmNoJyBpcyBkaXNhYmxlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkodGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlLCB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXZWJ2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gZXNwcmVzc29cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdFdlYnZpZXcgKCkge1xuICAgIGNvbnN0IHZpZXdOYW1lID0gYW5kcm9pZENvbW1hbmRzLmRlZmF1bHRXZWJ2aWV3TmFtZS5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgaW5pdEVzcHJlc3NvU2VydmVyICgpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gZXNwcmVzc28gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YVxuICAgIHRoaXMuZXNwcmVzc28gPSBuZXcgRXNwcmVzc29SdW5uZXIodGhpcy5sb2csIHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBmb3JjZUVzcHJlc3NvUmVidWlsZDogISF0aGlzLm9wdHMuZm9yY2VFc3ByZXNzb1JlYnVpbGQsXG4gICAgICBlc3ByZXNzb0J1aWxkQ29uZmlnOiB0aGlzLm9wdHMuZXNwcmVzc29CdWlsZENvbmZpZyxcbiAgICAgIHNob3dHcmFkbGVMb2c6ICEhdGhpcy5vcHRzLnNob3dHcmFkbGVMb2csXG4gICAgICBzZXJ2ZXJMYXVuY2hUaW1lb3V0OiB0aGlzLm9wdHMuZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0LFxuICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB0aGlzLm9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjogdGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24sXG4gICAgICB1c2VLZXlzdG9yZTogdGhpcy5vcHRzLnVzZUtleXN0b3JlLFxuICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLm9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAga2V5c3RvcmVQYXNzd29yZDogdGhpcy5vcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICBrZXlBbGlhczogdGhpcy5vcHRzLmtleUFsaWFzLFxuICAgICAga2V5UGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlQYXNzd29yZCxcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuZXNwcmVzc28ucHJveHlDb21tYW5kLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHNldCB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZyb20gdGhlIGFwa1xuICAgIC8vIFRPRE86IGluY29ycG9yYXRlIGNoYW5nZXMgZnJvbSBhcHBpdW0jNTMwOCB3aGljaCBmaXggYSByYWNlIGNvbmQtXG4gICAgLy8gaXRpb24gYnVnIGluIG9sZCBhcHBpdW0gYW5kIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBoZXJlXG4gICAgLy8gdGhpcy5hcGtTdHJpbmdzW3RoaXMub3B0cy5sYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhcbiAgICAvLyAgICAgdGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1Zygnc2tpcFNlcnZlckluc3RhbGxhdGlvbiBjYXBhYmlsaXR5IGlzIHNldC4gTm90IGluc3RhbGxpZyBlc3ByZXNzby1zZXJ2ZXIgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uaW5zdGFsbFRlc3RBcGsoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIGNvbnN0IHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcyA9IFthc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5tb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG4gICAgICB9XG4gICAgfV07XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGlmICh0aGlzLmVzcHJlc3NvKSB7XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXNwcmVzc28gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGF3YWl0IEIuYWxsKHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgfSkoKTtcbiAgICAgIH0pKTtcbiAgICAgIGlmICh0aGlzLndhc0FuaW1hdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlICYmICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgJiYgIXRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYEZVTExfUkVTRVQgc2V0IHRvICd0cnVlJywgVW5pbnN0YWxsaW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIGxldCBhdmROYW1lID0gdGhpcy5vcHRzLmF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHBvcnQgZm9yd2FyZCAnJHtlcnJvci5tZXNzYWdlfSdgKTtcbiAgICAgICAgLy9JZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlICgpIHtcbiAgICAvLyBpbnRlbnRpb25hbGx5IGRvIG5vdGhpbmcgaGVyZSwgc2luY2UgY29tbWFuZHMudXBkYXRlU2V0dGluZ3MgcHJveGllc1xuICAgIC8vIHNldHRpbmdzIHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBhbHdheXMgaGF2ZSBhbiBhY3RpdmUgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIEVzcHJlc3NvKE5PX1BST1hZKSwgYmFzZWQgb24gY3VycmVudCBjb250ZXh0IHdpbGwgcmV0dXJuIHJlbGF0ZWQgTk9fUFJPWFkgbGlzdFxuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uaXNOaWwodGhpcy5jaHJvbWVkcml2ZXIpID8gTk9fUFJPWFkgOiBDSFJPTUVfTk9fUFJPWFk7XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cblxuICBnZXQgYXBwT25EZXZpY2UgKCkge1xuICAgIHJldHVybiAhdGhpcy5vcHRzLmFwcCAmJiB0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICAvLyB3ZSBkbyBzb21lIGRpZmZlcmVudC9zcGVjaWFsIHRoaW5ncyB3aXRoIHRoZXNlIG1ldGhvZHNcbiAgaWYgKCFfLmluY2x1ZGVzKFsnZGVmYXVsdFdlYnZpZXdOYW1lJ10sIGNtZCkpIHtcbiAgICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICB9XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IGVzcHJlc3NvLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBFc3ByZXNzb0RyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29Ecml2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQSxNQUFNQSxPQUFPLEdBQUdDLG1DQUFjO0FBSTlCLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUl0QyxNQUFNQyxXQUFXLEdBQUcsSUFBSTtBQU14QixNQUFNQyxRQUFRLEdBQUcsQ0FDZixDQUFDLEtBQUssRUFBRSxJQUFJQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUN4QyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxFQUNyRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsaURBQWlELENBQUMsQ0FBQyxFQUN0RSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNoRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNoRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUN0RCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUM5QyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUN6RCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUMxQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUN4RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxFQUN6RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUN4RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUNsRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUNuRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUNsRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUNuRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNqRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJ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
|
|
457
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiYW5kcm9pZEhlbHBlcnMiLCJTWVNURU1fUE9SVF9SQU5HRSIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJBUEtfRVhUIiwiQUFCX0VYVCIsIlNVUFBPUlRFRF9FWFRFTlNJT05TIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwibmV3TWV0aG9kTWFwIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiXyIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwiYXBwIiwibG9nIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYWRkV2lwZURhdGFUb0F2ZEFyZ3MiLCJzeXN0ZW1Qb3J0IiwiZmluZEFQb3J0Tm90SW5Vc2UiLCJ1ZGlkIiwiZW1Qb3J0IiwiZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIiwiYWRiIiwiY3JlYXRlQURCIiwiY29uZmlndXJlQXBwIiwib25Qb3N0UHJvY2VzcyIsIm9uUG9zdENvbmZpZ3VyZUFwcCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJhcHBPbkRldmljZSIsImluZm8iLCJhcHBQYWNrYWdlIiwiaXNBcHBJbnN0YWxsZWQiLCJzdGFydEVzcHJlc3NvU2Vzc2lvbiIsImUiLCJkZWxldGVTZXNzaW9uIiwibWVzc2FnZSIsImVuZHNXaXRoIiwiaXNFcnJvclR5cGUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJtYW5pZmVzdFBheWxvYWQiLCJnZXRQYWNrYWdlSW5mbyIsInZlcnNpb24iLCJnZXRBcGlMZXZlbCIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJpbml0RGV2aWNlIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwid2FzQW5pbWF0aW9uRW5hYmxlZCIsImN1ckRldmljZUlkIiwiZGV2aWNlVURJRCIsImluaXRFc3ByZXNzb1NlcnZlciIsImZvcndhcmRQb3J0Iiwic2tpcFVubG9jayIsInVubG9jayIsImluaXRBVVQiLCJhcHBXYWl0UGFja2FnZSIsImFwcEFjdGl2aXR5IiwicXVhbGlmeUFjdGl2aXR5TmFtZSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwiYXBpVmVyc2lvbiIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwicmVhbERpc3BsYXlTaXplIiwiZGlzcGxheURlbnNpdHkiLCJtb2JpbGVHZXREZXZpY2VJbmZvIiwiZGV2aWNlQXBpTGV2ZWwiLCJwYXJzZUludCIsImRldmljZVNjcmVlblNpemUiLCJkZXZpY2VTY3JlZW5EZW5zaXR5IiwiZGV2aWNlTW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJFc3ByZXNzb1J1bm5lciIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImZvcmNlRXNwcmVzc29SZWJ1aWxkIiwiZXNwcmVzc29CdWlsZENvbmZpZyIsInNob3dHcmFkbGVMb2ciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0Iiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiVEVTVF9BUEtfUEtHIiwiZmFzdFJlc2V0IiwicmVzZXRBcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImluc3RhbGxUZXN0QXBrIiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0Iiwic3RkZXJyIiwic2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzIiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJCIiwiYWxsIiwidGFzayIsImlnbiIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJ1bmRlZmluZWQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImVycm9yIiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwiaXNOaWwiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJpc1BhY2thZ2VPckJ1bmRsZSIsImNtZCIsImZuIiwidG9QYWlycyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyBFc3ByZXNzb1J1bm5lciwgVEVTVF9BUEtfUEtHIH0gZnJvbSAnLi9lc3ByZXNzby1ydW5uZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHppcCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSwgZ2V0UGFja2FnZUluZm8gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5cblxuLy8gVE9ETyBtZXJnZSBvdXIgb3duIGhlbHBlcnMgb250byB0aGlzIGxhdGVyXG5jb25zdCBoZWxwZXJzID0gYW5kcm9pZEhlbHBlcnM7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBFc3ByZXNzbyBIVFRQIHNlcnZlciBvbiB0aGUgZGV2aWNlXG5jb25zdCBTWVNURU1fUE9SVF9SQU5HRSA9IFs4MzAwLCA4Mzk5XTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBlc3ByZXNzbyBzZXJ2ZXIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsXG4vLyBmb3J3YXJkIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MTtcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiBOZWVkIHRvIHNlZ3JlZ2F0ZSB0aGUgcGF0aHMgYmV0dGVyIHdheSB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZXJldmVyIGFwcGxpY2FibGUuXG4vLyAoTm90IHNlZ3JlZ2F0aW5nIHJpZ2h0IGF3YXkgYmVjYXVzZSBtb3JlIHBhdGhzIHRvIGJlIGFkZGVkIGluIHRoZSBOT19QUk9YWSBsaXN0KVxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uLyg/IS4qLyknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9jdXJyZW50X3BhY2thZ2UnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2lzX2tleWJvYXJkX3Nob3duJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV90aW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvYmFja2dyb3VuZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvY2xvc2UnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2xhdW5jaCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvcmVzZXQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3N0cmluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FjdGl2YXRlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX2luc3RhbGxlZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX3N0YXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9maW5nZXJfcHJpbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2luc3RhbGxfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19sb2NrZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2xvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVsbF9mb2xkZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1c2hfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcmVtb3ZlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3Rlcm1pbmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3VubG9jaycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBDaHJvbWVkcml2ZXIuXG5jb25zdCBDSFJPTUVfTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9yZWN0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG5cbmNvbnN0IEFQS19FWFQgPSAnLmFwayc7XG5jb25zdCBBQUJfRVhUID0gJy5hYWInO1xuY29uc3QgU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBbQVBLX0VYVCwgQUFCX0VYVF07XG5cbmNsYXNzIEVzcHJlc3NvRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG5cbiAgc3RhdGljIG5ld01ldGhvZE1hcCA9IG5ld01ldGhvZE1hcDtcblxuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgJ2Jyb3dzZXJOYW1lJyBjYXBhYmlsaXR5IHdpbGwgYmUgaWdub3JlZGApO1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBicm93c2VyIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gc2Vzc2lvbnMgYmVjYXVzZSBFc3ByZXNzbyBhdXRvbWF0aW9uIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgIGBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIENocm9tZWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHAgZmlsZSB3YXMgbm90IGxpc3RlZCwgaW5zdGVhZCB3ZSdyZSBnb2luZyB0byBydW4gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIHRoZSBwYWNrYWdlICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgYCArXG4gICAgICAgICAgICBgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0RXNwcmVzc29TZXNzaW9uKCk7XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYCR7Xy5lbmRzV2l0aChlLm1lc3NhZ2UsICcuJykgPyAnJyA6ICcuJ30gQ2hlY2sgYCArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1lc3ByZXNzby1kcml2ZXIjdHJvdWJsZXNob290aW5nICcgK1xuICAgICAgICAncmVnYXJkaW5nIGFkdmFuY2VkIHNlc3Npb24gc3RhcnR1cCB0cm91Ymxlc2hvb3RpbmcuJztcbiAgICAgIGlmIChpc0Vycm9yVHlwZShlLCBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgZXJyLnN0YWNrID0gZS5zdGFjaztcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW56aXAgdGhlIGdpdmVuIGFwcCBwYXRoIGFuZCByZXR1cm4gdGhlIGZpcnN0IHBhY2thZ2UgdGhhdCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlNcbiAgICogaW4gdGhlIGFyY2hpdmVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIFRoZSBwYXRoIHRvIGFwcCBmaWxlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1bnMgdGhlIHBhdGggdG8gYW4gdW56aXBwZWQgYXBwIGZpbGUgcGF0aC5cbiAgICogQHRocm93cyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHppcCBkaWQgbm90IGhhdmUgYW55IFNVUFBPUlRFRF9FWFRFTlNJT05TIHBhY2thZ2VzLlxuICAgKi9cbiAgYXN5bmMgdW56aXBBcHAgKGFwcFBhdGgpIHtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgICAgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFwcFBhdGgsIHRtcFJvb3QsIHt1c2VTeXN0ZW1VbnppcH0pO1xuXG4gICAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7U1VQUE9SVEVEX0VYVEVOU0lPTlMubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKS5qb2luKCd8Jyl9KWA7XG4gICAgY29uc3Qgc29ydGVkQnVuZGxlSXRlbXMgPSAoYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybiwge1xuICAgICAgY3dkOiB0bXBSb290LFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICB9KSkuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgICBpZiAoc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBubyBleHBlY3RlZCBwYWNrYWdlcyBpbiB0aGUgemlwXG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAke3RoaXMub3B0cy5hcHB9IGRpZCBub3QgaGF2ZSBhbnkgb2YgJyR7U1VQUE9SVEVEX0VYVEVOU0lPTlMuam9pbignLCAnKX0nIGAgK1xuICAgICAgICBgZXh0ZW5zaW9uIHBhY2thZ2VzLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCAuemlwIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IHVuemlwcGVkQXBwUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCcke3VuemlwcGVkQXBwUGF0aH0nIGlzIHRoZSB1bnppcHBlZCBmaWxlIGZyb20gJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHVuemlwcGVkQXBwUGF0aDtcbiAgfVxuXG4gIGFzeW5jIG9uUG9zdENvbmZpZ3VyZUFwcCAoe2NhY2hlZEFwcEluZm8sIGlzVXJsLCBhcHBQYXRofSkge1xuICAgIGNvbnN0IHByZXNpZ25BcHAgPSBhc3luYyAoYXBwTG9jYXRpb24pID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9TaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwaW5nIGFwcGxpY2F0aW9uIHNpZ25pbmcgYmVjYXVzZSBub1NpZ24gY2FwYWJpbGl0eSBpcyBzZXQgdG8gdHJ1ZS4gJyArXG4gICAgICAgICAgJ0hhdmluZyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB3aXRoIGltcHJvcGVyIHNpZ25hdHVyZS9ub24tc2lnbmVkIHdpbGwgY2F1c2UgJyArXG4gICAgICAgICAgJ0VzcHJlc3NvIGF1dG9tYXRpb24gc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfSBlbHNlIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbihhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYXNBcGtFeHQgPSAoYXBwUGF0aCkgPT4gXy5lbmRzV2l0aChfLnRvTG93ZXIoYXBwUGF0aCksIEFQS19FWFQpO1xuICAgIGNvbnN0IGhhc0FhYkV4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQUFCX0VYVCk7XG4gICAgY29uc3QgZXh0cmFjdFVuaXZlcnNhbEFwayA9IGFzeW5jIChzaG91bGRFeHRyYWN0LCBhcHBQYXRoKSA9PlxuICAgICAgc2hvdWxkRXh0cmFjdCA/IGFwcFBhdGggOiBhd2FpdCB0aGlzLmFkYi5leHRyYWN0VW5pdmVyc2FsQXBrKGFwcFBhdGgpO1xuXG4gICAgbGV0IHBhdGhJbkNhY2hlID0gbnVsbDtcbiAgICBsZXQgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IGZhbHNlO1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mby5wYWNrYWdlSGFzaCAmJiBhd2FpdCBmcy5leGlzdHMoY2FjaGVkQXBwSW5mby5mdWxsUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgJyR7Y2FjaGVkQXBwSW5mby5mdWxsUGF0aH0nIHdoaWNoIGlzIGNhY2hlZCBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgICAgICBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgcGF0aEluQ2FjaGUgPSBjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcFBhdGggY2FuIGJlIC56aXAsIC5hcGsgb3IgLmFhYlxuICAgIGNvbnN0IGlzQXBrID0gaGFzQXBrRXh0KGFwcFBhdGgpO1xuICAgIC8vIE9ubHkgbG9jYWwgLmFwayBmaWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4tcGxhY2Ugc2hvdWxkIG5vdCBiZSBjYWNoZWRcbiAgICBjb25zdCBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPSAhaXNBcGsgfHwgKGlzQXBrICYmIGlzVXJsKTtcblxuICAgIGlmICghaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCkge1xuICAgICAgaWYgKHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCkge1xuICAgICAgICAvLyAuemlwLCAuYWFiIG9yIGRvd25sb2FkZWQgLmFwa1xuXG4gICAgICAgIGxldCB1bnppcHBlZEFwcFBhdGg7XG4gICAgICAgIGxldCBpc1VuemlwcGVkQXBrID0gZmFsc2U7XG4gICAgICAgIGlmICghKGhhc0Fwa0V4dChhcHBQYXRoKSB8fCBoYXNBYWJFeHQoYXBwUGF0aCkpKSB7XG4gICAgICAgICAgdW56aXBwZWRBcHBQYXRoID0gYXdhaXQgdGhpcy51bnppcEFwcChhcHBQYXRoKTtcbiAgICAgICAgICBpc1VuemlwcGVkQXBrID0gaGFzQXBrRXh0KHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnppcHBlZEFwcFBhdGggb3IgYXBwUGF0aCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlMuXG4gICAgICAgIHBhdGhJbkNhY2hlID0gdW56aXBwZWRBcHBQYXRoXG4gICAgICAgICAgPyBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzVW56aXBwZWRBcGssIHVuemlwcGVkQXBwUGF0aClcbiAgICAgICAgICA6IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNBcGssIGFwcFBhdGgpO1xuXG4gICAgICAgIGlmICghaXNBcGsgJiYgaXNVcmwpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcG9yYXJpbHkgZG93bmxvYWRlZCAuYWFiIG9yIC56aXAgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQWFiRXh0KHVuemlwcGVkQXBwUGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBsb2NhbCB1bnppcHBlZCAuYWFiIGZpbGVcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGNvbnN0IHttYW5pZmVzdFBheWxvYWR9ID0gYXdhaXQgZ2V0UGFja2FnZUluZm8oKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke21hbmlmZXN0UGF5bG9hZC52ZXJzaW9ufWApO1xuXG4gICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1hbmRyb2lkLWRyaXZlci9wdWxsLzQ2MSB3aGF0IGhhcHBlbnMgaWYgdGhlciBpcyBubyBzZXRIaWRkZW5BcGlQb2xpY3kgZm9yIEFuZHJvaWQgUCtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdHVybiBvZmYgYW5pbWF0aW9uczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBlc3ByZXNzbyBzZXJ2ZXIgZXRjXG4gICAgdGhpcy5pbml0RXNwcmVzc29TZXJ2ZXIoKTtcbiAgICAvLyBGdXJ0aGVyIHByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBlc3ByZXNzbyBwb3J0XG4gICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgRXNwcmVzc28gU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gJHt0aGlzLm9wdHMuc3lzdGVtUG9ydH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCwgREVWSUNFX1BPUlQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHdhaXRpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbiBhY3Rpdml0eSB0byBzdGFydCBiZWNhdXNlICdhdXRvTGF1bmNoJyBpcyBkaXNhYmxlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkodGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlLCB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXZWJ2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gZXNwcmVzc29cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdFdlYnZpZXcgKCkge1xuICAgIGNvbnN0IHZpZXdOYW1lID0gYW5kcm9pZENvbW1hbmRzLmRlZmF1bHRXZWJ2aWV3TmFtZS5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgaW5pdEVzcHJlc3NvU2VydmVyICgpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gZXNwcmVzc28gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YVxuICAgIHRoaXMuZXNwcmVzc28gPSBuZXcgRXNwcmVzc29SdW5uZXIodGhpcy5sb2csIHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBmb3JjZUVzcHJlc3NvUmVidWlsZDogISF0aGlzLm9wdHMuZm9yY2VFc3ByZXNzb1JlYnVpbGQsXG4gICAgICBlc3ByZXNzb0J1aWxkQ29uZmlnOiB0aGlzLm9wdHMuZXNwcmVzc29CdWlsZENvbmZpZyxcbiAgICAgIHNob3dHcmFkbGVMb2c6ICEhdGhpcy5vcHRzLnNob3dHcmFkbGVMb2csXG4gICAgICBzZXJ2ZXJMYXVuY2hUaW1lb3V0OiB0aGlzLm9wdHMuZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0LFxuICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB0aGlzLm9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjogdGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24sXG4gICAgICB1c2VLZXlzdG9yZTogdGhpcy5vcHRzLnVzZUtleXN0b3JlLFxuICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLm9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAga2V5c3RvcmVQYXNzd29yZDogdGhpcy5vcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICBrZXlBbGlhczogdGhpcy5vcHRzLmtleUFsaWFzLFxuICAgICAga2V5UGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlQYXNzd29yZCxcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuZXNwcmVzc28ucHJveHlDb21tYW5kLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHNldCB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZyb20gdGhlIGFwa1xuICAgIC8vIFRPRE86IGluY29ycG9yYXRlIGNoYW5nZXMgZnJvbSBhcHBpdW0jNTMwOCB3aGljaCBmaXggYSByYWNlIGNvbmQtXG4gICAgLy8gaXRpb24gYnVnIGluIG9sZCBhcHBpdW0gYW5kIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBoZXJlXG4gICAgLy8gdGhpcy5hcGtTdHJpbmdzW3RoaXMub3B0cy5sYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhcbiAgICAvLyAgICAgdGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1Zygnc2tpcFNlcnZlckluc3RhbGxhdGlvbiBjYXBhYmlsaXR5IGlzIHNldC4gTm90IGluc3RhbGxpZyBlc3ByZXNzby1zZXJ2ZXIgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uaW5zdGFsbFRlc3RBcGsoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIGNvbnN0IHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcyA9IFthc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5tb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG4gICAgICB9XG4gICAgfV07XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGlmICh0aGlzLmVzcHJlc3NvKSB7XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXNwcmVzc28gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGF3YWl0IEIuYWxsKHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgfSkoKTtcbiAgICAgIH0pKTtcbiAgICAgIGlmICh0aGlzLndhc0FuaW1hdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlICYmICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgJiYgIXRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYEZVTExfUkVTRVQgc2V0IHRvICd0cnVlJywgVW5pbnN0YWxsaW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIGxldCBhdmROYW1lID0gdGhpcy5vcHRzLmF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHBvcnQgZm9yd2FyZCAnJHtlcnJvci5tZXNzYWdlfSdgKTtcbiAgICAgICAgLy9JZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlICgpIHtcbiAgICAvLyBpbnRlbnRpb25hbGx5IGRvIG5vdGhpbmcgaGVyZSwgc2luY2UgY29tbWFuZHMudXBkYXRlU2V0dGluZ3MgcHJveGllc1xuICAgIC8vIHNldHRpbmdzIHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBhbHdheXMgaGF2ZSBhbiBhY3RpdmUgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIEVzcHJlc3NvKE5PX1BST1hZKSwgYmFzZWQgb24gY3VycmVudCBjb250ZXh0IHdpbGwgcmV0dXJuIHJlbGF0ZWQgTk9fUFJPWFkgbGlzdFxuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uaXNOaWwodGhpcy5jaHJvbWVkcml2ZXIpID8gTk9fUFJPWFkgOiBDSFJPTUVfTk9fUFJPWFk7XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cblxuICBnZXQgYXBwT25EZXZpY2UgKCkge1xuICAgIHJldHVybiAhdGhpcy5vcHRzLmFwcCAmJiB0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICAvLyB3ZSBkbyBzb21lIGRpZmZlcmVudC9zcGVjaWFsIHRoaW5ncyB3aXRoIHRoZXNlIG1ldGhvZHNcbiAgaWYgKCFfLmluY2x1ZGVzKFsnZGVmYXVsdFdlYnZpZXdOYW1lJ10sIGNtZCkpIHtcbiAgICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICB9XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IGVzcHJlc3NvLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBFc3ByZXNzb0RyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29Ecml2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBLE1BQU1BLE9BQU8sR0FBR0MsbUNBQWM7QUFJOUIsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBSXRDLE1BQU1DLFdBQVcsR0FBRyxJQUFJO0FBTXhCLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLEVBQ3RFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2hFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2hFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQ3pELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQzFELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2pFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElB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
|
package/build/lib/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","names":["helpers","androidHelpers","SYSTEM_PORT_RANGE","DEVICE_PORT","NO_PROXY","RegExp","CHROME_NO_PROXY","APK_EXT","AAB_EXT","SUPPORTED_EXTENSIONS","EspressoDriver","BaseDriver","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","espresso","jwpProxyActive","defaultIME","jwpProxyAvoid","apkStrings","settings","DeviceSettings","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","createSession","args","sessionId","caps","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","Object","assign","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","_","defaults","isChromeSession","app","log","warn","errorAndThrow","reboot","setAvdFromCapabilities","addWipeDataToAvdArgs","systemPort","findAPortNotInUse","udid","emPort","getDeviceInfoFromCaps","adb","createADB","configureApp","onPostProcess","onPostConfigureApp","supportedExtensions","appOnDevice","info","appPackage","isAppInstalled","startEspressoSession","e","deleteSession","message","endsWith","isErrorType","errors","SessionNotCreatedError","err","stack","unzipApp","appPath","useSystemUnzipEnv","process","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","isEmpty","includes","toLower","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","map","ext","replace","join","sortedBundleItems","fs","glob","cwd","strict","sort","a","b","split","path","sep","length","unzippedAppPath","first","debug","cachedAppInfo","isUrl","presignApp","appLocation","noSign","checkApkCert","sign","hasApkExt","hasAabExt","extractUniversalApk","shouldExtract","pathInCache","isResultAppPathAlreadyCached","isPlainObject","packageHash","hash","exists","fullPath","isApk","shouldResultAppPathBeCached","isUnzippedApk","rimraf","driverData","isEmulator","avd","deviceName","platformVersion","avdDevice","avdArgs","toLowerCase","manifestPayload","getPackageInfo","version","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","appInfo","getLaunchInfo","initDevice","isAnimationOn","setAnimationState","wasAnimationEnabled","curDeviceId","deviceUDID","initEspressoServer","forwardPort","skipUnlock","unlock","initAUT","appWaitPackage","appActivity","qualifyActivityName","appWaitActivity","startSession","waitForActivity","appWaitDuration","autoWebview","initWebview","addDeviceInfoToCaps","viewName","androidCommands","defaultWebviewName","call","timeout","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","EspressoRunner","host","remoteAdbHost","devicePort","apk","tmpDir","forceEspressoRebuild","espressoBuildConfig","showGradleLog","serverLaunchTimeout","espressoServerLaunchTimeout","skipServerInstallation","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","disableSuppressAccessibilityService","proxyReqRes","proxyCommand","uninstallOtherPackages","parseArray","SETTINGS_HELPER_PKG_ID","TEST_APK_PKG","fastReset","resetApp","skipUninstall","uninstallApk","installApk","installTestApk","addToDeviceIdleWhitelist","stderr","screenRecordingStopTasks","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","B","all","task","ign","unicodeKeyboard","resetKeyboard","setIME","dontStopAppOnReset","forceStop","stopLogcat","avdName","killEmulator","setDefaultHiddenApiPolicy","undefined","removePortForward","error","proxyActive","canProxy","getProxyAvoidList","isNil","nativeWebScreenshot","isChromeBrowser","browserName","isPackageOrBundle","cmd","fn","toPairs","prototype","commands"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport B from 'bluebird';\nimport { BaseDriver, errors, isErrorType, DeviceSettings} from 'appium/driver';\nimport { EspressoRunner, TEST_APK_PKG } from './espresso-runner';\nimport { fs, tempDir, zip } from 'appium/support';\nimport commands from './commands';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse } from 'portscanner';\nimport { retryInterval } from 'asyncbox';\nimport { qualifyActivityName, getPackageInfo } from './utils';\n\n\n// TODO merge our own helpers onto this later\nconst helpers = androidHelpers;\n\n// The range of ports we can use on the system for communicating to the\n// Espresso HTTP server on the device\nconst SYSTEM_PORT_RANGE = [8300, 8399];\n\n// This is the port that the espresso server listens to on the device. We will\n// forward one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6791;\n\n// NO_PROXY contains the paths that we never want to proxy to espresso server.\n// TODO: Add the list of paths that we never want to proxy to espresso server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/background')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/close')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/launch')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/reset')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/strings')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/lock')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n\nconst APK_EXT = '.apk';\nconst AAB_EXT = '.aab';\nconst SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];\n\nclass EspressoDriver extends BaseDriver {\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'id',\n 'class name',\n 'accessibility id',\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.espresso = null;\n this.jwpProxyActive = false;\n this.defaultIME = null;\n this.jwpProxyAvoid = NO_PROXY;\n\n this.apkStrings = {}; // map of language -> strings obj\n this.settings = new DeviceSettings({}, this.onSettingsUpdate.bind(this));\n\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: Object.assign({}, this.caps)\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n if (this.opts.app) {\n this.log.warn(`'browserName' capability will be ignored`);\n this.log.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +\n `have permission to access Chrome`);\n } else {\n this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +\n `automation doesn't have permission to access Chrome`);\n }\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n this.addWipeDataToAvdArgs();\n }\n\n this.opts.systemPort = this.opts.systemPort\n || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n // get device udid for this session\n const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, {\n onPostProcess: this.onPostConfigureApp.bind(this),\n supportedExtensions: SUPPORTED_EXTENSIONS\n });\n } else if (this.appOnDevice) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`App file was not listed, instead we're going to run ` +\n `${this.opts.appPackage} directly on the device`);\n if (!await this.adb.isAppInstalled(this.opts.appPackage)) {\n this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +\n `installed on the device`);\n }\n }\n\n await this.startEspressoSession();\n return [sessionId, caps];\n } catch (e) {\n await this.deleteSession();\n e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +\n 'https://github.com/appium/appium-espresso-driver#troubleshooting ' +\n 'regarding advanced session startup troubleshooting.';\n if (isErrorType(e, errors.SessionNotCreatedError)) {\n throw e;\n }\n const err = new errors.SessionNotCreatedError(e.message);\n err.stack = e.stack;\n throw err;\n }\n }\n\n /**\n * Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS\n * in the archived file.\n *\n * @param {string} appPath The path to app file.\n * @returns {string} Retuns the path to an unzipped app file path.\n * @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.\n */\n async unzipApp (appPath) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});\n\n const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n if (sortedBundleItems.length === 0) {\n // no expected packages in the zip\n this.log.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +\n `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);\n }\n const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));\n this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);\n return unzippedAppPath;\n }\n\n async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {\n const presignApp = async (appLocation) => {\n if (this.opts.noSign) {\n this.log.info('Skipping application signing because noSign capability is set to true. ' +\n 'Having the application under test with improper signature/non-signed will cause ' +\n 'Espresso automation startup failure.');\n } else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {\n await this.adb.sign(appLocation, this.opts.appPackage);\n }\n };\n\n const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);\n const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);\n const extractUniversalApk = async (shouldExtract, appPath) =>\n shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);\n\n let pathInCache = null;\n let isResultAppPathAlreadyCached = false;\n if (_.isPlainObject(cachedAppInfo)) {\n const packageHash = await fs.hash(appPath);\n if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {\n this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);\n isResultAppPathAlreadyCached = true;\n pathInCache = cachedAppInfo.fullPath;\n }\n }\n\n // appPath can be .zip, .apk or .aab\n const isApk = hasApkExt(appPath);\n // Only local .apk files that are available in-place should not be cached\n const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);\n\n if (!isResultAppPathAlreadyCached) {\n if (shouldResultAppPathBeCached) {\n // .zip, .aab or downloaded .apk\n\n let unzippedAppPath;\n let isUnzippedApk = false;\n if (!(hasApkExt(appPath) || hasAabExt(appPath))) {\n unzippedAppPath = await this.unzipApp(appPath);\n isUnzippedApk = hasApkExt(unzippedAppPath);\n }\n\n // unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.\n pathInCache = unzippedAppPath\n ? await extractUniversalApk(isUnzippedApk, unzippedAppPath)\n : await extractUniversalApk(isApk, appPath);\n\n if (!isApk && isUrl) {\n // Clean up the temporarily downloaded .aab or .zip package\n await fs.rimraf(appPath);\n }\n if (hasAabExt(unzippedAppPath)) {\n // Cleanup the local unzipped .aab file\n await fs.rimraf(unzippedAppPath);\n }\n await presignApp(pathInCache);\n } else if (isApk) {\n // It is probably not the best idea to modify the provided app in-place,\n // but this is how it was always working\n await presignApp(appPath);\n }\n }\n return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;\n }\n\n get driverData () {\n // TODO fille out resource info here\n return {};\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n addWipeDataToAvdArgs () {\n if (!this.opts.avdArgs) {\n this.opts.avdArgs = '-wipe-data';\n } else if (!this.opts.avdArgs.toLowerCase().includes('-wipe-data')) {\n this.opts.avdArgs += ' -wipe-data';\n }\n }\n\n // TODO much of this logic is duplicated from uiautomator2\n async startEspressoSession () {\n const {manifestPayload} = await getPackageInfo();\n this.log.info(`EspressoDriver version: ${manifestPayload.version}`);\n\n // Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.warn('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // get appPackage et al from manifest if necessary\n let appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n if (appInfo) {\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo);\n } else {\n appInfo = this.opts;\n }\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n // https://github.com/appium/appium-espresso-driver/issues/72\n if (await this.adb.isAnimationOn()) {\n try {\n await this.adb.setAnimationState(false);\n this.wasAnimationEnabled = true;\n } catch (err) {\n this.log.warn(`Unable to turn off animations: ${err.message}`);\n }\n }\n\n // set actual device name, udid\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // set up the modified espresso server etc\n this.initEspressoServer();\n // Further prepare the device by forwarding the espresso port\n this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);\n await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);\n\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n //Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage) {\n this.caps.appPackage = appInfo.appPackage;\n }\n if (!this.caps.appWaitPackage) {\n this.caps.appWaitPackage = appInfo.appWaitPackage || appInfo.appPackage || this.caps.appPackage;\n }\n if (this.caps.appActivity) {\n this.caps.appActivity = qualifyActivityName(this.caps.appActivity, this.caps.appPackage);\n } else {\n this.caps.appActivity = qualifyActivityName(appInfo.appActivity, this.caps.appPackage);\n }\n if (this.caps.appWaitActivity) {\n this.caps.appWaitActivity = qualifyActivityName(this.caps.appWaitActivity, this.caps.appWaitPackage);\n } else {\n this.caps.appWaitActivity = qualifyActivityName(appInfo.appWaitActivity || appInfo.appActivity || this.caps.appActivity,\n this.caps.appWaitPackage);\n }\n\n // launch espresso and wait till its online and we have a session\n await this.espresso.startSession(this.caps);\n if (this.caps.autoLaunch === false) {\n this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);\n } else {\n await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);\n }\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n await this.initWebview();\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from espresso\n this.jwpProxyActive = true;\n\n await this.addDeviceInfoToCaps();\n }\n\n async initWebview () {\n const viewName = androidCommands.defaultWebviewName.call(this);\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n initEspressoServer () {\n // now that we have package and activity, we can create an instance of\n // espresso with the appropriate data\n this.espresso = new EspressoRunner(this.log, {\n host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n forceEspressoRebuild: !!this.opts.forceEspressoRebuild,\n espressoBuildConfig: this.opts.espressoBuildConfig,\n showGradleLog: !!this.opts.showGradleLog,\n serverLaunchTimeout: this.opts.espressoServerLaunchTimeout,\n androidInstallTimeout: this.opts.androidInstallTimeout,\n skipServerInstallation: this.opts.skipServerInstallation,\n useKeystore: this.opts.useKeystore,\n keystorePath: this.opts.keystorePath,\n keystorePassword: this.opts.keystorePassword,\n keyAlias: this.opts.keyAlias,\n keyPassword: this.opts.keyPassword,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n });\n this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);\n this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);\n }\n\n // TODO this method is mostly duplicated from uiautomator2\n async initAUT () {\n // set the localized strings for the current language from the apk\n // TODO: incorporate changes from appium#5308 which fix a race cond-\n // ition bug in old appium and need to be replicated here\n // this.apkStrings[this.opts.language] = await androidHelpers.pushStrings(\n // this.opts.language, this.adb, this.opts);\n\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, TEST_APK_PKG]\n );\n }\n\n if (!this.opts.app) {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n if (this.opts.app) {\n await helpers.installApk(this.adb, this.opts);\n }\n if (this.opts.skipServerInstallation) {\n this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');\n } else {\n await this.espresso.installTestApk();\n try {\n await this.adb.addToDeviceIdleWhitelist(SETTINGS_HELPER_PKG_ID, TEST_APK_PKG);\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async deleteSession () {\n this.log.debug('Deleting espresso session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.espresso) {\n if (this.jwpProxyActive) {\n await this.espresso.deleteSession();\n }\n this.espresso = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n if (this.wasAnimationEnabled) {\n try {\n await this.adb.setAnimationState(true);\n } catch (err) {\n this.log.warn(`Unable to reset animation: ${err.message}`);\n }\n }\n if (this.opts.unicodeKeyboard && this.opts.resetKeyboard &&\n this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n await this.adb.setIME(this.defaultIME);\n }\n if (!this.isChromeSession && this.opts.appPackage && !this.opts.dontStopAppOnReset) {\n await this.adb.forceStop(this.opts.appPackage);\n }\n if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {\n this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await this.adb.stopLogcat();\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`closing emulator '${avdName}'`);\n await this.adb.killEmulator(avdName);\n }\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n }\n await super.deleteSession();\n if (this.opts.systemPort !== undefined) {\n try {\n await this.adb.removePortForward(this.opts.systemPort);\n } catch (error) {\n this.log.warn(`Unable to remove port forward '${error.message}'`);\n //Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the espresso server already\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the espresso server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the espresso server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for Espresso(NO_PROXY), based on current context will return related NO_PROXY list\n this.jwpProxyAvoid = _.isNil(this.chromedriver) ? NO_PROXY : CHROME_NO_PROXY;\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n\n get appOnDevice () {\n return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n // we do some different/special things with these methods\n if (!_.includes(['defaultWebviewName'], cmd)) {\n EspressoDriver.prototype[cmd] = fn;\n }\n}\n\n// then overwrite with any espresso-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n EspressoDriver.prototype[cmd] = fn;\n}\n\nexport { EspressoDriver };\nexport default EspressoDriver;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA,MAAMA,OAAO,GAAGC,mCAAc;AAI9B,MAAMC,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAItC,MAAMC,WAAW,GAAG,IAAI;AAMxB,MAAMC,QAAQ,GAAG,CACf,CAAC,KAAK,EAAE,IAAIC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EACxC,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,gDAAgD,CAAC,CAAC,EACrE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACpE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACpE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,iDAAiD,CAAC,CAAC,EACtE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EAChE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EAChE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACtD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAC1C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACxD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,mCAAmC,CAAC,CAAC,EACzD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACxD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4CAA4C,CAAC,CAAC,EAClE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4CAA4C,CAAC,CAAC,EAClE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0CAA0C,CAAC,CAAC,EAChE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,sCAAsC,CAAC,CAAC,EAC5D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACvD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACrE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EACpD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EACjD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAG3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAI3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAEnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAC/C;AAGD,MAAMC,eAAe,GAAG,CACtB,CAAC,KAAK,EAAE,IAAID,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC7C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC9C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EACnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qCAAqC,CAAC,CAAC,EAC3D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAGrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAGpD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAI3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAEnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAC/C;AAGD,MAAME,OAAO,GAAG,MAAM;AACtB,MAAMC,OAAO,GAAG,MAAM;AACtB,MAAMC,oBAAoB,GAAG,CAACF,OAAO,EAAEC,OAAO,CAAC;AAE/C,MAAME,cAAc,SAASC,kBAAU,CAAC;EACtCC,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAEC,kBAAkB,GAAG,IAAI,EAAE;IAEjD,OAAOD,IAAI,CAACE,KAAK;IAEjB,KAAK,CAACF,IAAI,EAAEC,kBAAkB,CAAC;IAC/B,IAAI,CAACE,iBAAiB,GAAG,CACvB,IAAI,EACJ,YAAY,EACZ,kBAAkB,CACnB;IACD,IAAI,CAACC,qBAAqB,GAAGA,oBAAqB;IAClD,IAAI,CAACC,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACC,cAAc,GAAG,KAAK;IAC3B,IAAI,CAACC,UAAU,GAAG,IAAI;IACtB,IAAI,CAACC,aAAa,GAAGjB,QAAQ;IAE7B,IAAI,CAACkB,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAACC,QAAQ,GAAG,IAAIC,sBAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAACC,gBAAgB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExE,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,oBAAoB,GAAG,CAAC,CAAC;EAChC;EAEA,MAAMC,aAAa,CAAE,GAAGC,IAAI,EAAE;IAC5B,IAAI;MAEF,IAAI,CAACC,SAAS,EAAEC,IAAI,CAAC,GAAG,MAAM,KAAK,CAACH,aAAa,CAAC,GAAGC,IAAI,CAAC;MAE1D,IAAIG,aAAa,GAAG;QAClBC,QAAQ,EAAE,OAAO;QACjBC,iBAAiB,EAAE,KAAK;QACxBC,eAAe,EAAE,IAAI;QACrBC,iBAAiB,EAAE,IAAI;QACvBC,eAAe,EAAE,KAAK;QACtBC,wBAAwB,EAAE,IAAI;QAC9BC,sBAAsB,EAAE,KAAK;QAC7BC,QAAQ,EAAE,CAAC,CAAC;QACZC,OAAO,EAAEC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAACZ,IAAI;MACtC,CAAC;MAED,IAAI,CAACA,IAAI,GAAGW,MAAM,CAACC,MAAM,CAACX,aAAa,EAAE,IAAI,CAACD,IAAI,CAAC;MAEnD,IAAI,CAACa,UAAU,GAAG,IAAI,CAACC,kBAAkB,EAAE;MAE3C,IAAIC,WAAW,GAAG;QAChBC,SAAS,EAAE,KAAK;QAChBC,UAAU,EAAE,IAAI;QAChBC,OAAO,EAAEC,2BAAgB;QACzBC,qBAAqB,EAAE;MACzB,CAAC;MACDC,eAAC,CAACC,QAAQ,CAAC,IAAI,CAACzC,IAAI,EAAEkC,WAAW,CAAC;MAElC,IAAI,IAAI,CAACQ,eAAe,EAAE;QACxB,IAAI,IAAI,CAAC1C,IAAI,CAAC2C,GAAG,EAAE;UACjB,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,0CAAyC,CAAC;UACzD,IAAI,CAACD,GAAG,CAACC,IAAI,CAAE,wFAAuF,GACjG,kCAAiC,CAAC;QACzC,CAAC,MAAM;UACL,IAAI,CAACD,GAAG,CAACE,aAAa,CAAE,qEAAoE,GACzF,qDAAoD,CAAC;QAC1D;MACF;MAEA,IAAI,IAAI,CAAC9C,IAAI,CAAC+C,MAAM,EAAE;QACpB,IAAI,CAACC,sBAAsB,CAAC7B,IAAI,CAAC;QACjC,IAAI,CAAC8B,oBAAoB,EAAE;MAC7B;MAEA,IAAI,CAACjD,IAAI,CAACkD,UAAU,GAAG,IAAI,CAAClD,IAAI,CAACkD,UAAU,KACtC,MAAM,IAAAC,8BAAiB,EAAC9D,iBAAiB,CAAC,CAAC,CAAC,EAAEA,iBAAiB,CAAC,CAAC,CAAC,CAAC;MACxE,IAAI,CAACW,IAAI,CAACqC,OAAO,GAAG,IAAI,CAACrC,IAAI,CAACqC,OAAO,IAAIC,2BAAgB;MAEzD,MAAM;QAACc,IAAI;QAAEC;MAAM,CAAC,GAAG,MAAMlE,OAAO,CAACmE,qBAAqB,CAAC,IAAI,CAACtD,IAAI,CAAC;MACrE,IAAI,CAACA,IAAI,CAACoD,IAAI,GAAGA,IAAI;MACrB,IAAI,CAACpD,IAAI,CAACqD,MAAM,GAAGA,MAAM;MAGzB,IAAI,CAACE,GAAG,GAAG,MAAMnE,mCAAc,CAACoE,SAAS,CAAC,IAAI,CAACxD,IAAI,CAAC;MAEpD,IAAI,IAAI,CAACA,IAAI,CAAC2C,GAAG,EAAE;QAEjB,IAAI,CAAC3C,IAAI,CAAC2C,GAAG,GAAG,MAAM,IAAI,CAACxD,OAAO,CAACsE,YAAY,CAAC,IAAI,CAACzD,IAAI,CAAC2C,GAAG,EAAE;UAC7De,aAAa,EAAE,IAAI,CAACC,kBAAkB,CAAC9C,IAAI,CAAC,IAAI,CAAC;UACjD+C,mBAAmB,EAAEhE;QACvB,CAAC,CAAC;MACJ,CAAC,MAAM,IAAI,IAAI,CAACiE,WAAW,EAAE;QAG3B,IAAI,CAACjB,GAAG,CAACkB,IAAI,CAAE,sDAAqD,GAC/D,GAAE,IAAI,CAAC9D,IAAI,CAAC+D,UAAW,yBAAwB,CAAC;QACrD,IAAI,EAAC,MAAM,IAAI,CAACR,GAAG,CAACS,cAAc,CAAC,IAAI,CAAChE,IAAI,CAAC+D,UAAU,CAAC,GAAE;UACxD,IAAI,CAACnB,GAAG,CAACE,aAAa,CAAE,+BAA8B,IAAI,CAAC9C,IAAI,CAAC+D,UAAW,IAAG,GAC3E,yBAAwB,CAAC;QAC9B;MACF;MAEA,MAAM,IAAI,CAACE,oBAAoB,EAAE;MACjC,OAAO,CAAC/C,SAAS,EAAEC,IAAI,CAAC;IAC1B,CAAC,CAAC,OAAO+C,CAAC,EAAE;MACV,MAAM,IAAI,CAACC,aAAa,EAAE;MAC1BD,CAAC,CAACE,OAAO,IAAK,GAAE5B,eAAC,CAAC6B,QAAQ,CAACH,CAAC,CAACE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAI,SAAQ,GAC5D,mEAAmE,GACnE,qDAAqD;MACvD,IAAI,IAAAE,mBAAW,EAACJ,CAAC,EAAEK,cAAM,CAACC,sBAAsB,CAAC,EAAE;QACjD,MAAMN,CAAC;MACT;MACA,MAAMO,GAAG,GAAG,IAAIF,cAAM,CAACC,sBAAsB,CAACN,CAAC,CAACE,OAAO,CAAC;MACxDK,GAAG,CAACC,KAAK,GAAGR,CAAC,CAACQ,KAAK;MACnB,MAAMD,GAAG;IACX;EACF;EAUA,MAAME,QAAQ,CAAEC,OAAO,EAAE;IACvB,MAAMC,iBAAiB,GAAGC,OAAO,CAACC,GAAG,CAACC,0BAA0B;IAChE,MAAMC,cAAc,GAAGzC,eAAC,CAAC0C,OAAO,CAACL,iBAAiB,CAAC,IAC9C,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAACM,QAAQ,CAAC3C,eAAC,CAAC4C,OAAO,CAACP,iBAAiB,CAAC,CAAC;IAC3D,MAAMQ,OAAO,GAAG,MAAMC,gBAAO,CAACC,OAAO,EAAE;IACvC,MAAMC,YAAG,CAACC,YAAY,CAACb,OAAO,EAAES,OAAO,EAAE;MAACJ;IAAc,CAAC,CAAC;IAE1D,MAAMS,WAAW,GAAI,UAAS9F,oBAAoB,CAAC+F,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAE,GAAE;IACpG,MAAMC,iBAAiB,GAAG,CAAC,MAAMC,WAAE,CAACC,IAAI,CAACP,WAAW,EAAE;MACpDQ,GAAG,EAAEb,OAAO;MACZc,MAAM,EAAE;IACV,CAAC,CAAC,EAAEC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,CAACC,aAAI,CAACC,GAAG,CAAC,CAACC,MAAM,GAAGJ,CAAC,CAACC,KAAK,CAACC,aAAI,CAACC,GAAG,CAAC,CAACC,MAAM,CAAC;IACvE,IAAIX,iBAAiB,CAACW,MAAM,KAAK,CAAC,EAAE;MAElC,IAAI,CAAC9D,GAAG,CAACE,aAAa,CAAE,GAAE,IAAI,CAAC9C,IAAI,CAAC2C,GAAI,yBAAwB/C,oBAAoB,CAACkG,IAAI,CAAC,IAAI,CAAE,IAAG,GAChG,iHAAgH,CAAC;IACtH;IACA,MAAMa,eAAe,GAAGH,aAAI,CAACV,IAAI,CAACT,OAAO,EAAE7C,eAAC,CAACoE,KAAK,CAACb,iBAAiB,CAAC,CAAC;IACtE,IAAI,CAACnD,GAAG,CAACiE,KAAK,CAAE,IAAGF,eAAgB,gCAA+B/B,OAAQ,GAAE,CAAC;IAC7E,OAAO+B,eAAe;EACxB;EAEA,MAAMhD,kBAAkB,CAAE;IAACmD,aAAa;IAAEC,KAAK;IAAEnC;EAAO,CAAC,EAAE;IACzD,MAAMoC,UAAU,GAAG,MAAOC,WAAW,IAAK;MACxC,IAAI,IAAI,CAACjH,IAAI,CAACkH,MAAM,EAAE;QACpB,IAAI,CAACtE,GAAG,CAACkB,IAAI,CAAC,yEAAyE,GACrF,kFAAkF,GAClF,sCAAsC,CAAC;MAC3C,CAAC,MAAM,IAAI,EAAC,MAAM,IAAI,CAACP,GAAG,CAAC4D,YAAY,CAACF,WAAW,EAAE,IAAI,CAACjH,IAAI,CAAC+D,UAAU,CAAC,GAAE;QAC1E,MAAM,IAAI,CAACR,GAAG,CAAC6D,IAAI,CAACH,WAAW,EAAE,IAAI,CAACjH,IAAI,CAAC+D,UAAU,CAAC;MACxD;IACF,CAAC;IAED,MAAMsD,SAAS,GAAIzC,OAAO,IAAKpC,eAAC,CAAC6B,QAAQ,CAAC7B,eAAC,CAAC4C,OAAO,CAACR,OAAO,CAAC,EAAElF,OAAO,CAAC;IACtE,MAAM4H,SAAS,GAAI1C,OAAO,IAAKpC,eAAC,CAAC6B,QAAQ,CAAC7B,eAAC,CAAC4C,OAAO,CAACR,OAAO,CAAC,EAAEjF,OAAO,CAAC;IACtE,MAAM4H,mBAAmB,GAAG,OAAOC,aAAa,EAAE5C,OAAO,KACvD4C,aAAa,GAAG5C,OAAO,GAAG,MAAM,IAAI,CAACrB,GAAG,CAACgE,mBAAmB,CAAC3C,OAAO,CAAC;IAEvE,IAAI6C,WAAW,GAAG,IAAI;IACtB,IAAIC,4BAA4B,GAAG,KAAK;IACxC,IAAIlF,eAAC,CAACmF,aAAa,CAACb,aAAa,CAAC,EAAE;MAClC,MAAMc,WAAW,GAAG,MAAM5B,WAAE,CAAC6B,IAAI,CAACjD,OAAO,CAAC;MAC1C,IAAIgD,WAAW,KAAKd,aAAa,CAACc,WAAW,KAAI,MAAM5B,WAAE,CAAC8B,MAAM,CAAChB,aAAa,CAACiB,QAAQ,CAAC,GAAE;QACxF,IAAI,CAACnF,GAAG,CAACkB,IAAI,CAAE,UAASgD,aAAa,CAACiB,QAAS,2BAA0BnD,OAAQ,GAAE,CAAC;QACpF8C,4BAA4B,GAAG,IAAI;QACnCD,WAAW,GAAGX,aAAa,CAACiB,QAAQ;MACtC;IACF;IAGA,MAAMC,KAAK,GAAGX,SAAS,CAACzC,OAAO,CAAC;IAEhC,MAAMqD,2BAA2B,GAAG,CAACD,KAAK,IAAKA,KAAK,IAAIjB,KAAM;IAE9D,IAAI,CAACW,4BAA4B,EAAE;MACjC,IAAIO,2BAA2B,EAAE;QAG/B,IAAItB,eAAe;QACnB,IAAIuB,aAAa,GAAG,KAAK;QACzB,IAAI,EAAEb,SAAS,CAACzC,OAAO,CAAC,IAAI0C,SAAS,CAAC1C,OAAO,CAAC,CAAC,EAAE;UAC/C+B,eAAe,GAAG,MAAM,IAAI,CAAChC,QAAQ,CAACC,OAAO,CAAC;UAC9CsD,aAAa,GAAGb,SAAS,CAACV,eAAe,CAAC;QAC5C;QAGAc,WAAW,GAAGd,eAAe,GACzB,MAAMY,mBAAmB,CAACW,aAAa,EAAEvB,eAAe,CAAC,GACzD,MAAMY,mBAAmB,CAACS,KAAK,EAAEpD,OAAO,CAAC;QAE7C,IAAI,CAACoD,KAAK,IAAIjB,KAAK,EAAE;UAEnB,MAAMf,WAAE,CAACmC,MAAM,CAACvD,OAAO,CAAC;QAC1B;QACA,IAAI0C,SAAS,CAACX,eAAe,CAAC,EAAE;UAE9B,MAAMX,WAAE,CAACmC,MAAM,CAACxB,eAAe,CAAC;QAClC;QACA,MAAMK,UAAU,CAACS,WAAW,CAAC;MAC/B,CAAC,MAAM,IAAIO,KAAK,EAAE;QAGhB,MAAMhB,UAAU,CAACpC,OAAO,CAAC;MAC3B;IACF;IACA,OAAOqD,2BAA2B,GAAG;MAACrD,OAAO,EAAE6C;IAAW,CAAC,GAAG,KAAK;EACrE;EAEA,IAAIW,UAAU,GAAI;IAEhB,OAAO,CAAC,CAAC;EACX;EAEAC,UAAU,GAAI;IACZ,OAAOlJ,OAAO,CAACkJ,UAAU,CAAC,IAAI,CAAC9E,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;EAChD;EAGAgD,sBAAsB,CAAE7B,IAAI,EAAE;IAC5B,IAAI,IAAI,CAACnB,IAAI,CAACsI,GAAG,EAAE;MACjB,IAAI,CAAC1F,GAAG,CAACkB,IAAI,CAAC,6DAA6D,CAAC;IAC9E,CAAC,MAAM;MACL,IAAI,CAAC3C,IAAI,CAACoH,UAAU,EAAE;QACpB,IAAI,CAAC3F,GAAG,CAACE,aAAa,CAAC,qEAAqE,CAAC;MAC/F;MACA,IAAI,CAAC3B,IAAI,CAACqH,eAAe,EAAE;QACzB,IAAI,CAAC5F,GAAG,CAACE,aAAa,CAAC,0EAA0E,CAAC;MACpG;MACA,IAAI2F,SAAS,GAAGtH,IAAI,CAACoH,UAAU,CAAC1C,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;MAC/D,IAAI,CAAC7F,IAAI,CAACsI,GAAG,GAAI,GAAEG,SAAU,KAAItH,IAAI,CAACqH,eAAgB,EAAC;IACzD;EACF;EAGAvF,oBAAoB,GAAI;IACtB,IAAI,CAAC,IAAI,CAACjD,IAAI,CAAC0I,OAAO,EAAE;MACtB,IAAI,CAAC1I,IAAI,CAAC0I,OAAO,GAAG,YAAY;IAClC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC1I,IAAI,CAAC0I,OAAO,CAACC,WAAW,EAAE,CAACxD,QAAQ,CAAC,YAAY,CAAC,EAAE;MAClE,IAAI,CAACnF,IAAI,CAAC0I,OAAO,IAAI,aAAa;IACpC;EACF;EAGA,MAAMzE,oBAAoB,GAAI;IAC5B,MAAM;MAAC2E;IAAe,CAAC,GAAG,MAAM,IAAAC,qBAAc,GAAE;IAChD,IAAI,CAACjG,GAAG,CAACkB,IAAI,CAAE,2BAA0B8E,eAAe,CAACE,OAAQ,EAAC,CAAC;IAGnE,IAAI,OAAM,IAAI,CAACvF,GAAG,CAACwF,WAAW,EAAE,KAAI,EAAE,EAAE;MACtC,IAAI,CAACnG,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;MAC3C,MAAM,IAAI,CAACU,GAAG,CAACyF,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAChJ,IAAI,CAACiJ,0BAA0B,CAAC;IAChF;IAGA,IAAIC,OAAO,GAAG,MAAM/J,OAAO,CAACgK,aAAa,CAAC,IAAI,CAAC5F,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAC9D,IAAIkJ,OAAO,EAAE;MAEXpH,MAAM,CAACC,MAAM,CAAC,IAAI,CAAC/B,IAAI,EAAEkJ,OAAO,CAAC;IACnC,CAAC,MAAM;MACLA,OAAO,GAAG,IAAI,CAAClJ,IAAI;IACrB;IAIA,MAAMb,OAAO,CAACiK,UAAU,CAAC,IAAI,CAAC7F,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAE7C,IAAI,MAAM,IAAI,CAACuD,GAAG,CAAC8F,aAAa,EAAE,EAAE;MAClC,IAAI;QACF,MAAM,IAAI,CAAC9F,GAAG,CAAC+F,iBAAiB,CAAC,KAAK,CAAC;QACvC,IAAI,CAACC,mBAAmB,GAAG,IAAI;MACjC,CAAC,CAAC,OAAO9E,GAAG,EAAE;QACZ,IAAI,CAAC7B,GAAG,CAACC,IAAI,CAAE,kCAAiC4B,GAAG,CAACL,OAAQ,EAAC,CAAC;MAChE;IACF;IAGA,IAAI,CAACjD,IAAI,CAACoH,UAAU,GAAG,IAAI,CAAChF,GAAG,CAACiG,WAAW;IAC3C,IAAI,CAACrI,IAAI,CAACsI,UAAU,GAAG,IAAI,CAACzJ,IAAI,CAACoD,IAAI;IAGrC,IAAI,CAACsG,kBAAkB,EAAE;IAEzB,IAAI,CAAC9G,GAAG,CAACiE,KAAK,CAAE,mCAAkCvH,WAAY,OAAM,IAAI,CAACU,IAAI,CAACkD,UAAW,EAAC,CAAC;IAC3F,MAAM,IAAI,CAACK,GAAG,CAACoG,WAAW,CAAC,IAAI,CAAC3J,IAAI,CAACkD,UAAU,EAAE5D,WAAW,CAAC;IAE7D,IAAI,CAAC,IAAI,CAACU,IAAI,CAAC4J,UAAU,EAAE;MAEzB,MAAMzK,OAAO,CAAC0K,MAAM,CAAC,IAAI,EAAE,IAAI,CAACtG,GAAG,EAAE,IAAI,CAACpC,IAAI,CAAC;IACjD,CAAC,MAAM;MACL,IAAI,CAACyB,GAAG,CAACiE,KAAK,CAAE,wDAAuD,CAAC;IAC1E;IAIA,MAAM,IAAI,CAACiD,OAAO,EAAE;IAGpB,IAAI,CAAC,IAAI,CAAC3I,IAAI,CAAC4C,UAAU,EAAE;MACzB,IAAI,CAAC5C,IAAI,CAAC4C,UAAU,GAAGmF,OAAO,CAACnF,UAAU;IAC3C;IACA,IAAI,CAAC,IAAI,CAAC5C,IAAI,CAAC4I,cAAc,EAAE;MAC7B,IAAI,CAAC5I,IAAI,CAAC4I,cAAc,GAAGb,OAAO,CAACa,cAAc,IAAIb,OAAO,CAACnF,UAAU,IAAI,IAAI,CAAC5C,IAAI,CAAC4C,UAAU;IACjG;IACA,IAAI,IAAI,CAAC5C,IAAI,CAAC6I,WAAW,EAAE;MACzB,IAAI,CAAC7I,IAAI,CAAC6I,WAAW,GAAG,IAAAC,0BAAmB,EAAC,IAAI,CAAC9I,IAAI,CAAC6I,WAAW,EAAE,IAAI,CAAC7I,IAAI,CAAC4C,UAAU,CAAC;IAC1F,CAAC,MAAM;MACL,IAAI,CAAC5C,IAAI,CAAC6I,WAAW,GAAG,IAAAC,0BAAmB,EAACf,OAAO,CAACc,WAAW,EAAE,IAAI,CAAC7I,IAAI,CAAC4C,UAAU,CAAC;IACxF;IACA,IAAI,IAAI,CAAC5C,IAAI,CAAC+I,eAAe,EAAE;MAC7B,IAAI,CAAC/I,IAAI,CAAC+I,eAAe,GAAG,IAAAD,0BAAmB,EAAC,IAAI,CAAC9I,IAAI,CAAC+I,eAAe,EAAE,IAAI,CAAC/I,IAAI,CAAC4I,cAAc,CAAC;IACtG,CAAC,MAAM;MACL,IAAI,CAAC5I,IAAI,CAAC+I,eAAe,GAAG,IAAAD,0BAAmB,EAACf,OAAO,CAACgB,eAAe,IAAIhB,OAAO,CAACc,WAAW,IAAI,IAAI,CAAC7I,IAAI,CAAC6I,WAAW,EACrH,IAAI,CAAC7I,IAAI,CAAC4I,cAAc,CAAC;IAC7B;IAGA,MAAM,IAAI,CAAC1J,QAAQ,CAAC8J,YAAY,CAAC,IAAI,CAAChJ,IAAI,CAAC;IAC3C,IAAI,IAAI,CAACA,IAAI,CAACiB,UAAU,KAAK,KAAK,EAAE;MAClC,IAAI,CAACQ,GAAG,CAACkB,IAAI,CAAE,oFAAmF,CAAC;IACrG,CAAC,MAAM;MACL,MAAM,IAAI,CAACP,GAAG,CAAC6G,eAAe,CAAC,IAAI,CAACjJ,IAAI,CAAC4I,cAAc,EAAE,IAAI,CAAC5I,IAAI,CAAC+I,eAAe,EAAE,IAAI,CAAClK,IAAI,CAACqK,eAAe,CAAC;IAChH;IAGA,IAAI,IAAI,CAACrK,IAAI,CAACsK,WAAW,EAAE;MACzB,MAAM,IAAI,CAACC,WAAW,EAAE;IAC1B;IAIA,IAAI,CAACjK,cAAc,GAAG,IAAI;IAE1B,MAAM,IAAI,CAACkK,mBAAmB,EAAE;EAClC;EAEA,MAAMD,WAAW,GAAI;IACnB,MAAME,QAAQ,GAAGC,oCAAe,CAACC,kBAAkB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC9D,MAAMC,OAAO,GAAG,IAAI,CAAC7K,IAAI,CAAC8K,kBAAkB,IAAI,IAAI;IACpD,IAAI,CAAClI,GAAG,CAACkB,IAAI,CAAE,+BAA8B2G,QAAS,kBAAiBI,OAAQ,IAAG,CAAC;IACnF,MAAM,IAAAE,uBAAa,EAACF,OAAO,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAACG,UAAU,CAACnK,IAAI,CAAC,IAAI,CAAC,EAAE4J,QAAQ,CAAC;EAC/E;EAEA,MAAMD,mBAAmB,GAAI;IAC3B,MAAM;MACJS,UAAU;MACVzC,eAAe;MACf0C,YAAY;MACZC,KAAK;MACLC,eAAe;MACfC;IACF,CAAC,GAAG,MAAM,IAAI,CAACC,mBAAmB,EAAE;IACpC,IAAI,CAACnK,IAAI,CAACoK,cAAc,GAAGC,QAAQ,CAACP,UAAU,EAAE,EAAE,CAAC;IACnD,IAAI,CAAC9J,IAAI,CAACqH,eAAe,GAAGA,eAAe;IAC3C,IAAI,CAACrH,IAAI,CAACsK,gBAAgB,GAAGL,eAAe;IAC5C,IAAI,CAACjK,IAAI,CAACuK,mBAAmB,GAAGL,cAAc;IAC9C,IAAI,CAAClK,IAAI,CAACwK,WAAW,GAAGR,KAAK;IAC7B,IAAI,CAAChK,IAAI,CAACyK,kBAAkB,GAAGV,YAAY;EAC7C;EAEAxB,kBAAkB,GAAI;IAGpB,IAAI,CAACrJ,QAAQ,GAAG,IAAIwL,8BAAc,CAAC,IAAI,CAACjJ,GAAG,EAAE;MAC3CkJ,IAAI,EAAE,IAAI,CAAC9L,IAAI,CAAC+L,aAAa,IAAI,IAAI,CAAC/L,IAAI,CAAC8L,IAAI,IAAI,WAAW;MAC9D5I,UAAU,EAAE,IAAI,CAAClD,IAAI,CAACkD,UAAU;MAChC8I,UAAU,EAAE1M,WAAW;MACvBiE,GAAG,EAAE,IAAI,CAACA,GAAG;MACb0I,GAAG,EAAE,IAAI,CAACjM,IAAI,CAAC2C,GAAG;MAClBuJ,MAAM,EAAE,IAAI,CAAClM,IAAI,CAACkM,MAAM;MACxBnI,UAAU,EAAE,IAAI,CAAC/D,IAAI,CAAC+D,UAAU;MAChCiG,WAAW,EAAE,IAAI,CAAChK,IAAI,CAACgK,WAAW;MAClCmC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAACnM,IAAI,CAACmM,oBAAoB;MACtDC,mBAAmB,EAAE,IAAI,CAACpM,IAAI,CAACoM,mBAAmB;MAClDC,aAAa,EAAE,CAAC,CAAC,IAAI,CAACrM,IAAI,CAACqM,aAAa;MACxCC,mBAAmB,EAAE,IAAI,CAACtM,IAAI,CAACuM,2BAA2B;MAC1DhK,qBAAqB,EAAE,IAAI,CAACvC,IAAI,CAACuC,qBAAqB;MACtDiK,sBAAsB,EAAE,IAAI,CAACxM,IAAI,CAACwM,sBAAsB;MACxDC,WAAW,EAAE,IAAI,CAACzM,IAAI,CAACyM,WAAW;MAClCC,YAAY,EAAE,IAAI,CAAC1M,IAAI,CAAC0M,YAAY;MACpCC,gBAAgB,EAAE,IAAI,CAAC3M,IAAI,CAAC2M,gBAAgB;MAC5CC,QAAQ,EAAE,IAAI,CAAC5M,IAAI,CAAC4M,QAAQ;MAC5BC,WAAW,EAAE,IAAI,CAAC7M,IAAI,CAAC6M,WAAW;MAClCC,mCAAmC,EAAE,IAAI,CAAC9M,IAAI,CAAC8M;IACjD,CAAC,CAAC;IACF,IAAI,CAACC,WAAW,GAAG,IAAI,CAAC1M,QAAQ,CAAC0M,WAAW,CAAClM,IAAI,CAAC,IAAI,CAACR,QAAQ,CAAC;IAChE,IAAI,CAAC2M,YAAY,GAAG,IAAI,CAAC3M,QAAQ,CAAC2M,YAAY,CAACnM,IAAI,CAAC,IAAI,CAACR,QAAQ,CAAC;EACpE;EAGA,MAAMyJ,OAAO,GAAI;IAQf,IAAI,IAAI,CAAC9J,IAAI,CAACiN,sBAAsB,EAAE;MACpC,MAAM9N,OAAO,CAAC8N,sBAAsB,CAClC,IAAI,CAAC1J,GAAG,EACRpE,OAAO,CAAC+N,UAAU,CAAC,IAAI,CAAClN,IAAI,CAACiN,sBAAsB,CAAC,EACpD,CAACE,2CAAsB,EAAEC,4BAAY,CAAC,CACvC;IACH;IAEA,IAAI,CAAC,IAAI,CAACpN,IAAI,CAAC2C,GAAG,EAAE;MAClB,IAAI,IAAI,CAAC3C,IAAI,CAACmC,SAAS,EAAE;QACvB,IAAI,CAACS,GAAG,CAACE,aAAa,CAAC,6EAA6E,CAAC;MACvG;MACA,IAAI,CAACF,GAAG,CAACiE,KAAK,CAAC,yDAAyD,CAAC;MACzE,IAAI,IAAI,CAAC7G,IAAI,CAACqN,SAAS,EAAE;QACvB,MAAMlO,OAAO,CAACmO,QAAQ,CAAC,IAAI,CAAC/J,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;MAC7C;IACF;IAEA,IAAI,CAAC,IAAI,CAACA,IAAI,CAACuN,aAAa,EAAE;MAC5B,MAAM,IAAI,CAAChK,GAAG,CAACiK,YAAY,CAAC,IAAI,CAACxN,IAAI,CAAC+D,UAAU,CAAC;IACnD;IACA,IAAI,IAAI,CAAC/D,IAAI,CAAC2C,GAAG,EAAE;MACjB,MAAMxD,OAAO,CAACsO,UAAU,CAAC,IAAI,CAAClK,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAC/C;IACA,IAAI,IAAI,CAACA,IAAI,CAACwM,sBAAsB,EAAE;MACpC,IAAI,CAAC5J,GAAG,CAACiE,KAAK,CAAC,0EAA0E,CAAC;IAC5F,CAAC,MAAM;MACL,MAAM,IAAI,CAACxG,QAAQ,CAACqN,cAAc,EAAE;MACpC,IAAI;QACF,MAAM,IAAI,CAACnK,GAAG,CAACoK,wBAAwB,CAACR,2CAAsB,EAAEC,4BAAY,CAAC;MAC/E,CAAC,CAAC,OAAOlJ,CAAC,EAAE;QACV,IAAI,CAACtB,GAAG,CAACC,IAAI,CAAE,oEAAmE,IAC/EqB,CAAC,CAAC0J,MAAM,IAAI1J,CAAC,CAACE,OAAO,CAAC,CAAC;MAC5B;IACF;EACF;EAEA,MAAMD,aAAa,GAAI;IACrB,IAAI,CAACvB,GAAG,CAACiE,KAAK,CAAC,2BAA2B,CAAC;IAE3C,MAAMgH,wBAAwB,GAAG,CAAC,YAAY;MAC5C,IAAI,CAACrL,eAAC,CAAC0C,OAAO,CAAC,IAAI,CAAC4I,0BAA0B,CAAC,EAAE;QAC/C,MAAM,IAAI,CAACC,mBAAmB,EAAE;MAClC;IACF,CAAC,EAAE,YAAY;MACb,IAAI,MAAM,IAAI,CAACC,uCAAuC,EAAE,EAAE;QACxD,MAAM,IAAI,CAACC,kCAAkC,EAAE;MACjD;IACF,CAAC,EAAE,YAAY;MACb,IAAI,CAACzL,eAAC,CAAC0C,OAAO,CAAC,IAAI,CAACgJ,qBAAqB,CAAC,EAAE;QAC1C,MAAM,IAAI,CAACC,yBAAyB,EAAE;MACxC;IACF,CAAC,CAAC;IAEF,MAAM/O,mCAAc,CAACgP,iCAAiC,CAAC,IAAI,CAACC,MAAM,EAAE,IAAI,CAACnN,SAAS,CAAC;IAEnF,IAAI,IAAI,CAACb,QAAQ,EAAE;MACjB,IAAI,IAAI,CAACC,cAAc,EAAE;QACvB,MAAM,IAAI,CAACD,QAAQ,CAAC8D,aAAa,EAAE;MACrC;MACA,IAAI,CAAC9D,QAAQ,GAAG,IAAI;IACtB;IACA,IAAI,CAACC,cAAc,GAAG,KAAK;IAE3B,IAAI,IAAI,CAACiD,GAAG,EAAE;MACZ,MAAM+K,iBAAC,CAACC,GAAG,CAACV,wBAAwB,CAAClI,GAAG,CAAE6I,IAAI,IAAK;QACjD,CAAC,YAAY;UACX,IAAI;YACF,MAAMA,IAAI,EAAE;UACd,CAAC,CAAC,OAAOC,GAAG,EAAE,CAAC;QACjB,CAAC,GAAG;MACN,CAAC,CAAC,CAAC;MACH,IAAI,IAAI,CAAClF,mBAAmB,EAAE;QAC5B,IAAI;UACF,MAAM,IAAI,CAAChG,GAAG,CAAC+F,iBAAiB,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,OAAO7E,GAAG,EAAE;UACZ,IAAI,CAAC7B,GAAG,CAACC,IAAI,CAAE,8BAA6B4B,GAAG,CAACL,OAAQ,EAAC,CAAC;QAC5D;MACF;MACA,IAAI,IAAI,CAACpE,IAAI,CAAC0O,eAAe,IAAI,IAAI,CAAC1O,IAAI,CAAC2O,aAAa,IACpD,IAAI,CAACpO,UAAU,EAAE;QACnB,IAAI,CAACqC,GAAG,CAACiE,KAAK,CAAE,qBAAoB,IAAI,CAACtG,UAAW,GAAE,CAAC;QACvD,MAAM,IAAI,CAACgD,GAAG,CAACqL,MAAM,CAAC,IAAI,CAACrO,UAAU,CAAC;MACxC;MACA,IAAI,CAAC,IAAI,CAACmC,eAAe,IAAI,IAAI,CAAC1C,IAAI,CAAC+D,UAAU,IAAI,CAAC,IAAI,CAAC/D,IAAI,CAAC6O,kBAAkB,EAAE;QAClF,MAAM,IAAI,CAACtL,GAAG,CAACuL,SAAS,CAAC,IAAI,CAAC9O,IAAI,CAAC+D,UAAU,CAAC;MAChD;MACA,IAAI,IAAI,CAAC/D,IAAI,CAACmC,SAAS,IAAI,CAAC,IAAI,CAACnC,IAAI,CAACuN,aAAa,IAAI,CAAC,IAAI,CAAC1J,WAAW,EAAE;QACxE,IAAI,CAACjB,GAAG,CAACiE,KAAK,CAAE,2CAA0C,IAAI,CAAC7G,IAAI,CAAC+D,UAAW,GAAE,CAAC;QAClF,MAAM,IAAI,CAACR,GAAG,CAACiK,YAAY,CAAC,IAAI,CAACxN,IAAI,CAAC+D,UAAU,CAAC;MACnD;MACA,MAAM,IAAI,CAACR,GAAG,CAACwL,UAAU,EAAE;MAC3B,IAAI,IAAI,CAAC/O,IAAI,CAAC+C,MAAM,EAAE;QACpB,IAAIiM,OAAO,GAAG,IAAI,CAAChP,IAAI,CAACsI,GAAG,CAACzC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,IAAI,CAACjD,GAAG,CAACiE,KAAK,CAAE,qBAAoBmI,OAAQ,GAAE,CAAC;QAC/C,MAAM,IAAI,CAACzL,GAAG,CAAC0L,YAAY,CAACD,OAAO,CAAC;MACtC;MACA,IAAI,OAAM,IAAI,CAACzL,GAAG,CAACwF,WAAW,EAAE,KAAI,EAAE,EAAE;QACtC,IAAI,CAACnG,GAAG,CAACkB,IAAI,CAAC,iEAAiE,CAAC;QAChF,MAAM,IAAI,CAACP,GAAG,CAAC2L,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAClP,IAAI,CAACiJ,0BAA0B,CAAC;MAClF;IACF;IACA,MAAM,KAAK,CAAC9E,aAAa,EAAE;IAC3B,IAAI,IAAI,CAACnE,IAAI,CAACkD,UAAU,KAAKiM,SAAS,EAAE;MACtC,IAAI;QACF,MAAM,IAAI,CAAC5L,GAAG,CAAC6L,iBAAiB,CAAC,IAAI,CAACpP,IAAI,CAACkD,UAAU,CAAC;MACxD,CAAC,CAAC,OAAOmM,KAAK,EAAE;QACd,IAAI,CAACzM,GAAG,CAACC,IAAI,CAAE,kCAAiCwM,KAAK,CAACjL,OAAQ,GAAE,CAAC;MAGnE;IACF;EACF;EAEA,MAAMxD,gBAAgB,GAAI,CAG1B;EAEA0O,WAAW,CAAEpO,SAAS,EAAE;IACtB,KAAK,CAACoO,WAAW,CAACpO,SAAS,CAAC;IAG5B,OAAO,IAAI;EACb;EAEAqO,QAAQ,CAAErO,SAAS,EAAE;IACnB,KAAK,CAACqO,QAAQ,CAACrO,SAAS,CAAC;IAGzB,OAAO,IAAI;EACb;EAEAsO,iBAAiB,CAAEtO,SAAS,EAAE;IAC5B,KAAK,CAACsO,iBAAiB,CAACtO,SAAS,CAAC;IAGlC,IAAI,CAACV,aAAa,GAAGgC,eAAC,CAACiN,KAAK,CAAC,IAAI,CAAC3O,YAAY,CAAC,GAAGvB,QAAQ,GAAGE,eAAe;IAC5E,IAAI,IAAI,CAACO,IAAI,CAAC0P,mBAAmB,EAAE;MACjC,IAAI,CAAClP,aAAa,GAAG,CAAC,GAAG,IAAI,CAACA,aAAa,EAAE,CAAC,KAAK,EAAE,IAAIhB,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACjG;IAEA,OAAO,IAAI,CAACgB,aAAa;EAC3B;EAEA,IAAIkC,eAAe,GAAI;IACrB,OAAOvD,OAAO,CAACwQ,eAAe,CAAC,IAAI,CAAC3P,IAAI,CAAC4P,WAAW,CAAC;EACvD;EAEA,IAAI/L,WAAW,GAAI;IACjB,OAAO,CAAC,IAAI,CAAC7D,IAAI,CAAC2C,GAAG,IAAI,IAAI,CAACxD,OAAO,CAAC0Q,iBAAiB,CAAC,IAAI,CAAC7P,IAAI,CAAC+D,UAAU,CAAC;EAC/E;AACF;AAAC;AAGD,KAAK,IAAI,CAAC+L,GAAG,EAAEC,EAAE,CAAC,IAAIvN,eAAC,CAACwN,OAAO,CAACtF,oCAAe,CAAC,EAAE;EAEhD,IAAI,CAAClI,eAAC,CAAC2C,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE2K,GAAG,CAAC,EAAE;IAC5CjQ,cAAc,CAACoQ,SAAS,CAACH,GAAG,CAAC,GAAGC,EAAE;EACpC;AACF;AAGA,KAAK,IAAI,CAACD,GAAG,EAAEC,EAAE,CAAC,IAAIvN,eAAC,CAACwN,OAAO,CAACE,iBAAQ,CAAC,EAAE;EACzCrQ,cAAc,CAACoQ,SAAS,CAACH,GAAG,CAAC,GAAGC,EAAE;AACpC;AAAC,eAGclQ,cAAc;AAAA"}
|
|
1
|
+
{"version":3,"file":"driver.js","names":["helpers","androidHelpers","SYSTEM_PORT_RANGE","DEVICE_PORT","NO_PROXY","RegExp","CHROME_NO_PROXY","APK_EXT","AAB_EXT","SUPPORTED_EXTENSIONS","EspressoDriver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","espresso","jwpProxyActive","defaultIME","jwpProxyAvoid","apkStrings","settings","DeviceSettings","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","createSession","args","sessionId","caps","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","Object","assign","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","_","defaults","isChromeSession","app","log","warn","errorAndThrow","reboot","setAvdFromCapabilities","addWipeDataToAvdArgs","systemPort","findAPortNotInUse","udid","emPort","getDeviceInfoFromCaps","adb","createADB","configureApp","onPostProcess","onPostConfigureApp","supportedExtensions","appOnDevice","info","appPackage","isAppInstalled","startEspressoSession","e","deleteSession","message","endsWith","isErrorType","errors","SessionNotCreatedError","err","stack","unzipApp","appPath","useSystemUnzipEnv","process","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","isEmpty","includes","toLower","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","map","ext","replace","join","sortedBundleItems","fs","glob","cwd","strict","sort","a","b","split","path","sep","length","unzippedAppPath","first","debug","cachedAppInfo","isUrl","presignApp","appLocation","noSign","checkApkCert","sign","hasApkExt","hasAabExt","extractUniversalApk","shouldExtract","pathInCache","isResultAppPathAlreadyCached","isPlainObject","packageHash","hash","exists","fullPath","isApk","shouldResultAppPathBeCached","isUnzippedApk","rimraf","driverData","isEmulator","avd","deviceName","platformVersion","avdDevice","avdArgs","toLowerCase","manifestPayload","getPackageInfo","version","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","appInfo","getLaunchInfo","initDevice","isAnimationOn","setAnimationState","wasAnimationEnabled","curDeviceId","deviceUDID","initEspressoServer","forwardPort","skipUnlock","unlock","initAUT","appWaitPackage","appActivity","qualifyActivityName","appWaitActivity","startSession","waitForActivity","appWaitDuration","autoWebview","initWebview","addDeviceInfoToCaps","viewName","androidCommands","defaultWebviewName","call","timeout","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","EspressoRunner","host","remoteAdbHost","devicePort","apk","tmpDir","forceEspressoRebuild","espressoBuildConfig","showGradleLog","serverLaunchTimeout","espressoServerLaunchTimeout","skipServerInstallation","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","disableSuppressAccessibilityService","proxyReqRes","proxyCommand","uninstallOtherPackages","parseArray","SETTINGS_HELPER_PKG_ID","TEST_APK_PKG","fastReset","resetApp","skipUninstall","uninstallApk","installApk","installTestApk","addToDeviceIdleWhitelist","stderr","screenRecordingStopTasks","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","B","all","task","ign","unicodeKeyboard","resetKeyboard","setIME","dontStopAppOnReset","forceStop","stopLogcat","avdName","killEmulator","setDefaultHiddenApiPolicy","undefined","removePortForward","error","proxyActive","canProxy","getProxyAvoidList","isNil","nativeWebScreenshot","isChromeBrowser","browserName","isPackageOrBundle","cmd","fn","toPairs","prototype","commands"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport B from 'bluebird';\nimport { BaseDriver, errors, isErrorType, DeviceSettings} from 'appium/driver';\nimport { EspressoRunner, TEST_APK_PKG } from './espresso-runner';\nimport { fs, tempDir, zip } from 'appium/support';\nimport commands from './commands';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse } from 'portscanner';\nimport { retryInterval } from 'asyncbox';\nimport { qualifyActivityName, getPackageInfo } from './utils';\nimport { newMethodMap } from './method-map';\n\n\n// TODO merge our own helpers onto this later\nconst helpers = androidHelpers;\n\n// The range of ports we can use on the system for communicating to the\n// Espresso HTTP server on the device\nconst SYSTEM_PORT_RANGE = [8300, 8399];\n\n// This is the port that the espresso server listens to on the device. We will\n// forward one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6791;\n\n// NO_PROXY contains the paths that we never want to proxy to espresso server.\n// TODO: Add the list of paths that we never want to proxy to espresso server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/background')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/close')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/launch')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/reset')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/strings')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/lock')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n\nconst APK_EXT = '.apk';\nconst AAB_EXT = '.aab';\nconst SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];\n\nclass EspressoDriver extends BaseDriver {\n\n static newMethodMap = newMethodMap;\n\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'id',\n 'class name',\n 'accessibility id',\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.espresso = null;\n this.jwpProxyActive = false;\n this.defaultIME = null;\n this.jwpProxyAvoid = NO_PROXY;\n\n this.apkStrings = {}; // map of language -> strings obj\n this.settings = new DeviceSettings({}, this.onSettingsUpdate.bind(this));\n\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: Object.assign({}, this.caps)\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n if (this.opts.app) {\n this.log.warn(`'browserName' capability will be ignored`);\n this.log.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +\n `have permission to access Chrome`);\n } else {\n this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +\n `automation doesn't have permission to access Chrome`);\n }\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n this.addWipeDataToAvdArgs();\n }\n\n this.opts.systemPort = this.opts.systemPort\n || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n // get device udid for this session\n const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, {\n onPostProcess: this.onPostConfigureApp.bind(this),\n supportedExtensions: SUPPORTED_EXTENSIONS\n });\n } else if (this.appOnDevice) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`App file was not listed, instead we're going to run ` +\n `${this.opts.appPackage} directly on the device`);\n if (!await this.adb.isAppInstalled(this.opts.appPackage)) {\n this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +\n `installed on the device`);\n }\n }\n\n await this.startEspressoSession();\n return [sessionId, caps];\n } catch (e) {\n await this.deleteSession();\n e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +\n 'https://github.com/appium/appium-espresso-driver#troubleshooting ' +\n 'regarding advanced session startup troubleshooting.';\n if (isErrorType(e, errors.SessionNotCreatedError)) {\n throw e;\n }\n const err = new errors.SessionNotCreatedError(e.message);\n err.stack = e.stack;\n throw err;\n }\n }\n\n /**\n * Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS\n * in the archived file.\n *\n * @param {string} appPath The path to app file.\n * @returns {string} Retuns the path to an unzipped app file path.\n * @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.\n */\n async unzipApp (appPath) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});\n\n const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n if (sortedBundleItems.length === 0) {\n // no expected packages in the zip\n this.log.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +\n `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);\n }\n const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));\n this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);\n return unzippedAppPath;\n }\n\n async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {\n const presignApp = async (appLocation) => {\n if (this.opts.noSign) {\n this.log.info('Skipping application signing because noSign capability is set to true. ' +\n 'Having the application under test with improper signature/non-signed will cause ' +\n 'Espresso automation startup failure.');\n } else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {\n await this.adb.sign(appLocation, this.opts.appPackage);\n }\n };\n\n const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);\n const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);\n const extractUniversalApk = async (shouldExtract, appPath) =>\n shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);\n\n let pathInCache = null;\n let isResultAppPathAlreadyCached = false;\n if (_.isPlainObject(cachedAppInfo)) {\n const packageHash = await fs.hash(appPath);\n if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {\n this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);\n isResultAppPathAlreadyCached = true;\n pathInCache = cachedAppInfo.fullPath;\n }\n }\n\n // appPath can be .zip, .apk or .aab\n const isApk = hasApkExt(appPath);\n // Only local .apk files that are available in-place should not be cached\n const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);\n\n if (!isResultAppPathAlreadyCached) {\n if (shouldResultAppPathBeCached) {\n // .zip, .aab or downloaded .apk\n\n let unzippedAppPath;\n let isUnzippedApk = false;\n if (!(hasApkExt(appPath) || hasAabExt(appPath))) {\n unzippedAppPath = await this.unzipApp(appPath);\n isUnzippedApk = hasApkExt(unzippedAppPath);\n }\n\n // unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.\n pathInCache = unzippedAppPath\n ? await extractUniversalApk(isUnzippedApk, unzippedAppPath)\n : await extractUniversalApk(isApk, appPath);\n\n if (!isApk && isUrl) {\n // Clean up the temporarily downloaded .aab or .zip package\n await fs.rimraf(appPath);\n }\n if (hasAabExt(unzippedAppPath)) {\n // Cleanup the local unzipped .aab file\n await fs.rimraf(unzippedAppPath);\n }\n await presignApp(pathInCache);\n } else if (isApk) {\n // It is probably not the best idea to modify the provided app in-place,\n // but this is how it was always working\n await presignApp(appPath);\n }\n }\n return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;\n }\n\n get driverData () {\n // TODO fille out resource info here\n return {};\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n addWipeDataToAvdArgs () {\n if (!this.opts.avdArgs) {\n this.opts.avdArgs = '-wipe-data';\n } else if (!this.opts.avdArgs.toLowerCase().includes('-wipe-data')) {\n this.opts.avdArgs += ' -wipe-data';\n }\n }\n\n // TODO much of this logic is duplicated from uiautomator2\n async startEspressoSession () {\n const {manifestPayload} = await getPackageInfo();\n this.log.info(`EspressoDriver version: ${manifestPayload.version}`);\n\n // Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.warn('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // get appPackage et al from manifest if necessary\n let appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n if (appInfo) {\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo);\n } else {\n appInfo = this.opts;\n }\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n // https://github.com/appium/appium-espresso-driver/issues/72\n if (await this.adb.isAnimationOn()) {\n try {\n await this.adb.setAnimationState(false);\n this.wasAnimationEnabled = true;\n } catch (err) {\n this.log.warn(`Unable to turn off animations: ${err.message}`);\n }\n }\n\n // set actual device name, udid\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // set up the modified espresso server etc\n this.initEspressoServer();\n // Further prepare the device by forwarding the espresso port\n this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);\n await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);\n\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n //Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage) {\n this.caps.appPackage = appInfo.appPackage;\n }\n if (!this.caps.appWaitPackage) {\n this.caps.appWaitPackage = appInfo.appWaitPackage || appInfo.appPackage || this.caps.appPackage;\n }\n if (this.caps.appActivity) {\n this.caps.appActivity = qualifyActivityName(this.caps.appActivity, this.caps.appPackage);\n } else {\n this.caps.appActivity = qualifyActivityName(appInfo.appActivity, this.caps.appPackage);\n }\n if (this.caps.appWaitActivity) {\n this.caps.appWaitActivity = qualifyActivityName(this.caps.appWaitActivity, this.caps.appWaitPackage);\n } else {\n this.caps.appWaitActivity = qualifyActivityName(appInfo.appWaitActivity || appInfo.appActivity || this.caps.appActivity,\n this.caps.appWaitPackage);\n }\n\n // launch espresso and wait till its online and we have a session\n await this.espresso.startSession(this.caps);\n if (this.caps.autoLaunch === false) {\n this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);\n } else {\n await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);\n }\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n await this.initWebview();\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from espresso\n this.jwpProxyActive = true;\n\n await this.addDeviceInfoToCaps();\n }\n\n async initWebview () {\n const viewName = androidCommands.defaultWebviewName.call(this);\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n initEspressoServer () {\n // now that we have package and activity, we can create an instance of\n // espresso with the appropriate data\n this.espresso = new EspressoRunner(this.log, {\n host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n forceEspressoRebuild: !!this.opts.forceEspressoRebuild,\n espressoBuildConfig: this.opts.espressoBuildConfig,\n showGradleLog: !!this.opts.showGradleLog,\n serverLaunchTimeout: this.opts.espressoServerLaunchTimeout,\n androidInstallTimeout: this.opts.androidInstallTimeout,\n skipServerInstallation: this.opts.skipServerInstallation,\n useKeystore: this.opts.useKeystore,\n keystorePath: this.opts.keystorePath,\n keystorePassword: this.opts.keystorePassword,\n keyAlias: this.opts.keyAlias,\n keyPassword: this.opts.keyPassword,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n });\n this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);\n this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);\n }\n\n // TODO this method is mostly duplicated from uiautomator2\n async initAUT () {\n // set the localized strings for the current language from the apk\n // TODO: incorporate changes from appium#5308 which fix a race cond-\n // ition bug in old appium and need to be replicated here\n // this.apkStrings[this.opts.language] = await androidHelpers.pushStrings(\n // this.opts.language, this.adb, this.opts);\n\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, TEST_APK_PKG]\n );\n }\n\n if (!this.opts.app) {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n if (this.opts.app) {\n await helpers.installApk(this.adb, this.opts);\n }\n if (this.opts.skipServerInstallation) {\n this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');\n } else {\n await this.espresso.installTestApk();\n try {\n await this.adb.addToDeviceIdleWhitelist(SETTINGS_HELPER_PKG_ID, TEST_APK_PKG);\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async deleteSession () {\n this.log.debug('Deleting espresso session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.espresso) {\n if (this.jwpProxyActive) {\n await this.espresso.deleteSession();\n }\n this.espresso = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n if (this.wasAnimationEnabled) {\n try {\n await this.adb.setAnimationState(true);\n } catch (err) {\n this.log.warn(`Unable to reset animation: ${err.message}`);\n }\n }\n if (this.opts.unicodeKeyboard && this.opts.resetKeyboard &&\n this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n await this.adb.setIME(this.defaultIME);\n }\n if (!this.isChromeSession && this.opts.appPackage && !this.opts.dontStopAppOnReset) {\n await this.adb.forceStop(this.opts.appPackage);\n }\n if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {\n this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await this.adb.stopLogcat();\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`closing emulator '${avdName}'`);\n await this.adb.killEmulator(avdName);\n }\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n }\n await super.deleteSession();\n if (this.opts.systemPort !== undefined) {\n try {\n await this.adb.removePortForward(this.opts.systemPort);\n } catch (error) {\n this.log.warn(`Unable to remove port forward '${error.message}'`);\n //Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the espresso server already\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the espresso server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the espresso server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for Espresso(NO_PROXY), based on current context will return related NO_PROXY list\n this.jwpProxyAvoid = _.isNil(this.chromedriver) ? NO_PROXY : CHROME_NO_PROXY;\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n\n get appOnDevice () {\n return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n // we do some different/special things with these methods\n if (!_.includes(['defaultWebviewName'], cmd)) {\n EspressoDriver.prototype[cmd] = fn;\n }\n}\n\n// then overwrite with any espresso-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n EspressoDriver.prototype[cmd] = fn;\n}\n\nexport { EspressoDriver };\nexport default EspressoDriver;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA,MAAMA,OAAO,GAAGC,mCAAc;AAI9B,MAAMC,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAItC,MAAMC,WAAW,GAAG,IAAI;AAMxB,MAAMC,QAAQ,GAAG,CACf,CAAC,KAAK,EAAE,IAAIC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EACxC,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,gDAAgD,CAAC,CAAC,EACrE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACpE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACpE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,iDAAiD,CAAC,CAAC,EACtE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EAChE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EAChE,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACtD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAC/C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAC1C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACxD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,mCAAmC,CAAC,CAAC,EACzD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,kCAAkC,CAAC,CAAC,EACxD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4CAA4C,CAAC,CAAC,EAClE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4CAA4C,CAAC,CAAC,EAClE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yCAAyC,CAAC,CAAC,EAC/D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0CAA0C,CAAC,CAAC,EAChE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6CAA6C,CAAC,CAAC,EACnE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,sCAAsC,CAAC,CAAC,EAC5D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2CAA2C,CAAC,CAAC,EACjE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,iCAAiC,CAAC,CAAC,EACvD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,uCAAuC,CAAC,CAAC,EAC7D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+CAA+C,CAAC,CAAC,EACrE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8CAA8C,CAAC,CAAC,EACpE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EACpD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EACrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EACjD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EAC1D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAG3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAI3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAEnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAC/C;AAGD,MAAMC,eAAe,GAAG,CACtB,CAAC,KAAK,EAAE,IAAID,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC7C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC9C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,oCAAoC,CAAC,CAAC,EACzD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EAClD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC9C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAC/C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,6BAA6B,CAAC,CAAC,EACnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qCAAqC,CAAC,CAAC,EAC3D,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAGrD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAGpD,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,2BAA2B,CAAC,CAAC,EAChD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAI3C,CAAC,KAAK,EAAE,IAAIA,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAEnD,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAC/C;AAGD,MAAME,OAAO,GAAG,MAAM;AACtB,MAAMC,OAAO,GAAG,MAAM;AACtB,MAAMC,oBAAoB,GAAG,CAACF,OAAO,EAAEC,OAAO,CAAC;AAE/C,MAAME,cAAc,SAASC,kBAAU,CAAC;EAEtC,OAAOC,YAAY,GAAGA,uBAAY;EAElCC,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAEC,kBAAkB,GAAG,IAAI,EAAE;IAEjD,OAAOD,IAAI,CAACE,KAAK;IAEjB,KAAK,CAACF,IAAI,EAAEC,kBAAkB,CAAC;IAC/B,IAAI,CAACE,iBAAiB,GAAG,CACvB,IAAI,EACJ,YAAY,EACZ,kBAAkB,CACnB;IACD,IAAI,CAACC,qBAAqB,GAAGA,oBAAqB;IAClD,IAAI,CAACC,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACC,cAAc,GAAG,KAAK;IAC3B,IAAI,CAACC,UAAU,GAAG,IAAI;IACtB,IAAI,CAACC,aAAa,GAAGlB,QAAQ;IAE7B,IAAI,CAACmB,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAACC,QAAQ,GAAG,IAAIC,sBAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAACC,gBAAgB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExE,IAAI,CAACC,YAAY,GAAG,IAAI;IACxB,IAAI,CAACC,oBAAoB,GAAG,CAAC,CAAC;EAChC;EAEA,MAAMC,aAAa,CAAE,GAAGC,IAAI,EAAE;IAC5B,IAAI;MAEF,IAAI,CAACC,SAAS,EAAEC,IAAI,CAAC,GAAG,MAAM,KAAK,CAACH,aAAa,CAAC,GAAGC,IAAI,CAAC;MAE1D,IAAIG,aAAa,GAAG;QAClBC,QAAQ,EAAE,OAAO;QACjBC,iBAAiB,EAAE,KAAK;QACxBC,eAAe,EAAE,IAAI;QACrBC,iBAAiB,EAAE,IAAI;QACvBC,eAAe,EAAE,KAAK;QACtBC,wBAAwB,EAAE,IAAI;QAC9BC,sBAAsB,EAAE,KAAK;QAC7BC,QAAQ,EAAE,CAAC,CAAC;QACZC,OAAO,EAAEC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAACZ,IAAI;MACtC,CAAC;MAED,IAAI,CAACA,IAAI,GAAGW,MAAM,CAACC,MAAM,CAACX,aAAa,EAAE,IAAI,CAACD,IAAI,CAAC;MAEnD,IAAI,CAACa,UAAU,GAAG,IAAI,CAACC,kBAAkB,EAAE;MAE3C,IAAIC,WAAW,GAAG;QAChBC,SAAS,EAAE,KAAK;QAChBC,UAAU,EAAE,IAAI;QAChBC,OAAO,EAAEC,2BAAgB;QACzBC,qBAAqB,EAAE;MACzB,CAAC;MACDC,eAAC,CAACC,QAAQ,CAAC,IAAI,CAACzC,IAAI,EAAEkC,WAAW,CAAC;MAElC,IAAI,IAAI,CAACQ,eAAe,EAAE;QACxB,IAAI,IAAI,CAAC1C,IAAI,CAAC2C,GAAG,EAAE;UACjB,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,0CAAyC,CAAC;UACzD,IAAI,CAACD,GAAG,CAACC,IAAI,CAAE,wFAAuF,GACjG,kCAAiC,CAAC;QACzC,CAAC,MAAM;UACL,IAAI,CAACD,GAAG,CAACE,aAAa,CAAE,qEAAoE,GACzF,qDAAoD,CAAC;QAC1D;MACF;MAEA,IAAI,IAAI,CAAC9C,IAAI,CAAC+C,MAAM,EAAE;QACpB,IAAI,CAACC,sBAAsB,CAAC7B,IAAI,CAAC;QACjC,IAAI,CAAC8B,oBAAoB,EAAE;MAC7B;MAEA,IAAI,CAACjD,IAAI,CAACkD,UAAU,GAAG,IAAI,CAAClD,IAAI,CAACkD,UAAU,KACtC,MAAM,IAAAC,8BAAiB,EAAC/D,iBAAiB,CAAC,CAAC,CAAC,EAAEA,iBAAiB,CAAC,CAAC,CAAC,CAAC;MACxE,IAAI,CAACY,IAAI,CAACqC,OAAO,GAAG,IAAI,CAACrC,IAAI,CAACqC,OAAO,IAAIC,2BAAgB;MAEzD,MAAM;QAACc,IAAI;QAAEC;MAAM,CAAC,GAAG,MAAMnE,OAAO,CAACoE,qBAAqB,CAAC,IAAI,CAACtD,IAAI,CAAC;MACrE,IAAI,CAACA,IAAI,CAACoD,IAAI,GAAGA,IAAI;MACrB,IAAI,CAACpD,IAAI,CAACqD,MAAM,GAAGA,MAAM;MAGzB,IAAI,CAACE,GAAG,GAAG,MAAMpE,mCAAc,CAACqE,SAAS,CAAC,IAAI,CAACxD,IAAI,CAAC;MAEpD,IAAI,IAAI,CAACA,IAAI,CAAC2C,GAAG,EAAE;QAEjB,IAAI,CAAC3C,IAAI,CAAC2C,GAAG,GAAG,MAAM,IAAI,CAACzD,OAAO,CAACuE,YAAY,CAAC,IAAI,CAACzD,IAAI,CAAC2C,GAAG,EAAE;UAC7De,aAAa,EAAE,IAAI,CAACC,kBAAkB,CAAC9C,IAAI,CAAC,IAAI,CAAC;UACjD+C,mBAAmB,EAAEjE;QACvB,CAAC,CAAC;MACJ,CAAC,MAAM,IAAI,IAAI,CAACkE,WAAW,EAAE;QAG3B,IAAI,CAACjB,GAAG,CAACkB,IAAI,CAAE,sDAAqD,GAC/D,GAAE,IAAI,CAAC9D,IAAI,CAAC+D,UAAW,yBAAwB,CAAC;QACrD,IAAI,EAAC,MAAM,IAAI,CAACR,GAAG,CAACS,cAAc,CAAC,IAAI,CAAChE,IAAI,CAAC+D,UAAU,CAAC,GAAE;UACxD,IAAI,CAACnB,GAAG,CAACE,aAAa,CAAE,+BAA8B,IAAI,CAAC9C,IAAI,CAAC+D,UAAW,IAAG,GAC3E,yBAAwB,CAAC;QAC9B;MACF;MAEA,MAAM,IAAI,CAACE,oBAAoB,EAAE;MACjC,OAAO,CAAC/C,SAAS,EAAEC,IAAI,CAAC;IAC1B,CAAC,CAAC,OAAO+C,CAAC,EAAE;MACV,MAAM,IAAI,CAACC,aAAa,EAAE;MAC1BD,CAAC,CAACE,OAAO,IAAK,GAAE5B,eAAC,CAAC6B,QAAQ,CAACH,CAAC,CAACE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAI,SAAQ,GAC5D,mEAAmE,GACnE,qDAAqD;MACvD,IAAI,IAAAE,mBAAW,EAACJ,CAAC,EAAEK,cAAM,CAACC,sBAAsB,CAAC,EAAE;QACjD,MAAMN,CAAC;MACT;MACA,MAAMO,GAAG,GAAG,IAAIF,cAAM,CAACC,sBAAsB,CAACN,CAAC,CAACE,OAAO,CAAC;MACxDK,GAAG,CAACC,KAAK,GAAGR,CAAC,CAACQ,KAAK;MACnB,MAAMD,GAAG;IACX;EACF;EAUA,MAAME,QAAQ,CAAEC,OAAO,EAAE;IACvB,MAAMC,iBAAiB,GAAGC,OAAO,CAACC,GAAG,CAACC,0BAA0B;IAChE,MAAMC,cAAc,GAAGzC,eAAC,CAAC0C,OAAO,CAACL,iBAAiB,CAAC,IAC9C,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAACM,QAAQ,CAAC3C,eAAC,CAAC4C,OAAO,CAACP,iBAAiB,CAAC,CAAC;IAC3D,MAAMQ,OAAO,GAAG,MAAMC,gBAAO,CAACC,OAAO,EAAE;IACvC,MAAMC,YAAG,CAACC,YAAY,CAACb,OAAO,EAAES,OAAO,EAAE;MAACJ;IAAc,CAAC,CAAC;IAE1D,MAAMS,WAAW,GAAI,UAAS/F,oBAAoB,CAACgG,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAE,GAAE;IACpG,MAAMC,iBAAiB,GAAG,CAAC,MAAMC,WAAE,CAACC,IAAI,CAACP,WAAW,EAAE;MACpDQ,GAAG,EAAEb,OAAO;MACZc,MAAM,EAAE;IACV,CAAC,CAAC,EAAEC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,CAACC,aAAI,CAACC,GAAG,CAAC,CAACC,MAAM,GAAGJ,CAAC,CAACC,KAAK,CAACC,aAAI,CAACC,GAAG,CAAC,CAACC,MAAM,CAAC;IACvE,IAAIX,iBAAiB,CAACW,MAAM,KAAK,CAAC,EAAE;MAElC,IAAI,CAAC9D,GAAG,CAACE,aAAa,CAAE,GAAE,IAAI,CAAC9C,IAAI,CAAC2C,GAAI,yBAAwBhD,oBAAoB,CAACmG,IAAI,CAAC,IAAI,CAAE,IAAG,GAChG,iHAAgH,CAAC;IACtH;IACA,MAAMa,eAAe,GAAGH,aAAI,CAACV,IAAI,CAACT,OAAO,EAAE7C,eAAC,CAACoE,KAAK,CAACb,iBAAiB,CAAC,CAAC;IACtE,IAAI,CAACnD,GAAG,CAACiE,KAAK,CAAE,IAAGF,eAAgB,gCAA+B/B,OAAQ,GAAE,CAAC;IAC7E,OAAO+B,eAAe;EACxB;EAEA,MAAMhD,kBAAkB,CAAE;IAACmD,aAAa;IAAEC,KAAK;IAAEnC;EAAO,CAAC,EAAE;IACzD,MAAMoC,UAAU,GAAG,MAAOC,WAAW,IAAK;MACxC,IAAI,IAAI,CAACjH,IAAI,CAACkH,MAAM,EAAE;QACpB,IAAI,CAACtE,GAAG,CAACkB,IAAI,CAAC,yEAAyE,GACrF,kFAAkF,GAClF,sCAAsC,CAAC;MAC3C,CAAC,MAAM,IAAI,EAAC,MAAM,IAAI,CAACP,GAAG,CAAC4D,YAAY,CAACF,WAAW,EAAE,IAAI,CAACjH,IAAI,CAAC+D,UAAU,CAAC,GAAE;QAC1E,MAAM,IAAI,CAACR,GAAG,CAAC6D,IAAI,CAACH,WAAW,EAAE,IAAI,CAACjH,IAAI,CAAC+D,UAAU,CAAC;MACxD;IACF,CAAC;IAED,MAAMsD,SAAS,GAAIzC,OAAO,IAAKpC,eAAC,CAAC6B,QAAQ,CAAC7B,eAAC,CAAC4C,OAAO,CAACR,OAAO,CAAC,EAAEnF,OAAO,CAAC;IACtE,MAAM6H,SAAS,GAAI1C,OAAO,IAAKpC,eAAC,CAAC6B,QAAQ,CAAC7B,eAAC,CAAC4C,OAAO,CAACR,OAAO,CAAC,EAAElF,OAAO,CAAC;IACtE,MAAM6H,mBAAmB,GAAG,OAAOC,aAAa,EAAE5C,OAAO,KACvD4C,aAAa,GAAG5C,OAAO,GAAG,MAAM,IAAI,CAACrB,GAAG,CAACgE,mBAAmB,CAAC3C,OAAO,CAAC;IAEvE,IAAI6C,WAAW,GAAG,IAAI;IACtB,IAAIC,4BAA4B,GAAG,KAAK;IACxC,IAAIlF,eAAC,CAACmF,aAAa,CAACb,aAAa,CAAC,EAAE;MAClC,MAAMc,WAAW,GAAG,MAAM5B,WAAE,CAAC6B,IAAI,CAACjD,OAAO,CAAC;MAC1C,IAAIgD,WAAW,KAAKd,aAAa,CAACc,WAAW,KAAI,MAAM5B,WAAE,CAAC8B,MAAM,CAAChB,aAAa,CAACiB,QAAQ,CAAC,GAAE;QACxF,IAAI,CAACnF,GAAG,CAACkB,IAAI,CAAE,UAASgD,aAAa,CAACiB,QAAS,2BAA0BnD,OAAQ,GAAE,CAAC;QACpF8C,4BAA4B,GAAG,IAAI;QACnCD,WAAW,GAAGX,aAAa,CAACiB,QAAQ;MACtC;IACF;IAGA,MAAMC,KAAK,GAAGX,SAAS,CAACzC,OAAO,CAAC;IAEhC,MAAMqD,2BAA2B,GAAG,CAACD,KAAK,IAAKA,KAAK,IAAIjB,KAAM;IAE9D,IAAI,CAACW,4BAA4B,EAAE;MACjC,IAAIO,2BAA2B,EAAE;QAG/B,IAAItB,eAAe;QACnB,IAAIuB,aAAa,GAAG,KAAK;QACzB,IAAI,EAAEb,SAAS,CAACzC,OAAO,CAAC,IAAI0C,SAAS,CAAC1C,OAAO,CAAC,CAAC,EAAE;UAC/C+B,eAAe,GAAG,MAAM,IAAI,CAAChC,QAAQ,CAACC,OAAO,CAAC;UAC9CsD,aAAa,GAAGb,SAAS,CAACV,eAAe,CAAC;QAC5C;QAGAc,WAAW,GAAGd,eAAe,GACzB,MAAMY,mBAAmB,CAACW,aAAa,EAAEvB,eAAe,CAAC,GACzD,MAAMY,mBAAmB,CAACS,KAAK,EAAEpD,OAAO,CAAC;QAE7C,IAAI,CAACoD,KAAK,IAAIjB,KAAK,EAAE;UAEnB,MAAMf,WAAE,CAACmC,MAAM,CAACvD,OAAO,CAAC;QAC1B;QACA,IAAI0C,SAAS,CAACX,eAAe,CAAC,EAAE;UAE9B,MAAMX,WAAE,CAACmC,MAAM,CAACxB,eAAe,CAAC;QAClC;QACA,MAAMK,UAAU,CAACS,WAAW,CAAC;MAC/B,CAAC,MAAM,IAAIO,KAAK,EAAE;QAGhB,MAAMhB,UAAU,CAACpC,OAAO,CAAC;MAC3B;IACF;IACA,OAAOqD,2BAA2B,GAAG;MAACrD,OAAO,EAAE6C;IAAW,CAAC,GAAG,KAAK;EACrE;EAEA,IAAIW,UAAU,GAAI;IAEhB,OAAO,CAAC,CAAC;EACX;EAEAC,UAAU,GAAI;IACZ,OAAOnJ,OAAO,CAACmJ,UAAU,CAAC,IAAI,CAAC9E,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;EAChD;EAGAgD,sBAAsB,CAAE7B,IAAI,EAAE;IAC5B,IAAI,IAAI,CAACnB,IAAI,CAACsI,GAAG,EAAE;MACjB,IAAI,CAAC1F,GAAG,CAACkB,IAAI,CAAC,6DAA6D,CAAC;IAC9E,CAAC,MAAM;MACL,IAAI,CAAC3C,IAAI,CAACoH,UAAU,EAAE;QACpB,IAAI,CAAC3F,GAAG,CAACE,aAAa,CAAC,qEAAqE,CAAC;MAC/F;MACA,IAAI,CAAC3B,IAAI,CAACqH,eAAe,EAAE;QACzB,IAAI,CAAC5F,GAAG,CAACE,aAAa,CAAC,0EAA0E,CAAC;MACpG;MACA,IAAI2F,SAAS,GAAGtH,IAAI,CAACoH,UAAU,CAAC1C,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;MAC/D,IAAI,CAAC7F,IAAI,CAACsI,GAAG,GAAI,GAAEG,SAAU,KAAItH,IAAI,CAACqH,eAAgB,EAAC;IACzD;EACF;EAGAvF,oBAAoB,GAAI;IACtB,IAAI,CAAC,IAAI,CAACjD,IAAI,CAAC0I,OAAO,EAAE;MACtB,IAAI,CAAC1I,IAAI,CAAC0I,OAAO,GAAG,YAAY;IAClC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC1I,IAAI,CAAC0I,OAAO,CAACC,WAAW,EAAE,CAACxD,QAAQ,CAAC,YAAY,CAAC,EAAE;MAClE,IAAI,CAACnF,IAAI,CAAC0I,OAAO,IAAI,aAAa;IACpC;EACF;EAGA,MAAMzE,oBAAoB,GAAI;IAC5B,MAAM;MAAC2E;IAAe,CAAC,GAAG,MAAM,IAAAC,qBAAc,GAAE;IAChD,IAAI,CAACjG,GAAG,CAACkB,IAAI,CAAE,2BAA0B8E,eAAe,CAACE,OAAQ,EAAC,CAAC;IAGnE,IAAI,OAAM,IAAI,CAACvF,GAAG,CAACwF,WAAW,EAAE,KAAI,EAAE,EAAE;MACtC,IAAI,CAACnG,GAAG,CAACC,IAAI,CAAC,4BAA4B,CAAC;MAC3C,MAAM,IAAI,CAACU,GAAG,CAACyF,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAChJ,IAAI,CAACiJ,0BAA0B,CAAC;IAChF;IAGA,IAAIC,OAAO,GAAG,MAAMhK,OAAO,CAACiK,aAAa,CAAC,IAAI,CAAC5F,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAC9D,IAAIkJ,OAAO,EAAE;MAEXpH,MAAM,CAACC,MAAM,CAAC,IAAI,CAAC/B,IAAI,EAAEkJ,OAAO,CAAC;IACnC,CAAC,MAAM;MACLA,OAAO,GAAG,IAAI,CAAClJ,IAAI;IACrB;IAIA,MAAMd,OAAO,CAACkK,UAAU,CAAC,IAAI,CAAC7F,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAE7C,IAAI,MAAM,IAAI,CAACuD,GAAG,CAAC8F,aAAa,EAAE,EAAE;MAClC,IAAI;QACF,MAAM,IAAI,CAAC9F,GAAG,CAAC+F,iBAAiB,CAAC,KAAK,CAAC;QACvC,IAAI,CAACC,mBAAmB,GAAG,IAAI;MACjC,CAAC,CAAC,OAAO9E,GAAG,EAAE;QACZ,IAAI,CAAC7B,GAAG,CAACC,IAAI,CAAE,kCAAiC4B,GAAG,CAACL,OAAQ,EAAC,CAAC;MAChE;IACF;IAGA,IAAI,CAACjD,IAAI,CAACoH,UAAU,GAAG,IAAI,CAAChF,GAAG,CAACiG,WAAW;IAC3C,IAAI,CAACrI,IAAI,CAACsI,UAAU,GAAG,IAAI,CAACzJ,IAAI,CAACoD,IAAI;IAGrC,IAAI,CAACsG,kBAAkB,EAAE;IAEzB,IAAI,CAAC9G,GAAG,CAACiE,KAAK,CAAE,mCAAkCxH,WAAY,OAAM,IAAI,CAACW,IAAI,CAACkD,UAAW,EAAC,CAAC;IAC3F,MAAM,IAAI,CAACK,GAAG,CAACoG,WAAW,CAAC,IAAI,CAAC3J,IAAI,CAACkD,UAAU,EAAE7D,WAAW,CAAC;IAE7D,IAAI,CAAC,IAAI,CAACW,IAAI,CAAC4J,UAAU,EAAE;MAEzB,MAAM1K,OAAO,CAAC2K,MAAM,CAAC,IAAI,EAAE,IAAI,CAACtG,GAAG,EAAE,IAAI,CAACpC,IAAI,CAAC;IACjD,CAAC,MAAM;MACL,IAAI,CAACyB,GAAG,CAACiE,KAAK,CAAE,wDAAuD,CAAC;IAC1E;IAIA,MAAM,IAAI,CAACiD,OAAO,EAAE;IAGpB,IAAI,CAAC,IAAI,CAAC3I,IAAI,CAAC4C,UAAU,EAAE;MACzB,IAAI,CAAC5C,IAAI,CAAC4C,UAAU,GAAGmF,OAAO,CAACnF,UAAU;IAC3C;IACA,IAAI,CAAC,IAAI,CAAC5C,IAAI,CAAC4I,cAAc,EAAE;MAC7B,IAAI,CAAC5I,IAAI,CAAC4I,cAAc,GAAGb,OAAO,CAACa,cAAc,IAAIb,OAAO,CAACnF,UAAU,IAAI,IAAI,CAAC5C,IAAI,CAAC4C,UAAU;IACjG;IACA,IAAI,IAAI,CAAC5C,IAAI,CAAC6I,WAAW,EAAE;MACzB,IAAI,CAAC7I,IAAI,CAAC6I,WAAW,GAAG,IAAAC,0BAAmB,EAAC,IAAI,CAAC9I,IAAI,CAAC6I,WAAW,EAAE,IAAI,CAAC7I,IAAI,CAAC4C,UAAU,CAAC;IAC1F,CAAC,MAAM;MACL,IAAI,CAAC5C,IAAI,CAAC6I,WAAW,GAAG,IAAAC,0BAAmB,EAACf,OAAO,CAACc,WAAW,EAAE,IAAI,CAAC7I,IAAI,CAAC4C,UAAU,CAAC;IACxF;IACA,IAAI,IAAI,CAAC5C,IAAI,CAAC+I,eAAe,EAAE;MAC7B,IAAI,CAAC/I,IAAI,CAAC+I,eAAe,GAAG,IAAAD,0BAAmB,EAAC,IAAI,CAAC9I,IAAI,CAAC+I,eAAe,EAAE,IAAI,CAAC/I,IAAI,CAAC4I,cAAc,CAAC;IACtG,CAAC,MAAM;MACL,IAAI,CAAC5I,IAAI,CAAC+I,eAAe,GAAG,IAAAD,0BAAmB,EAACf,OAAO,CAACgB,eAAe,IAAIhB,OAAO,CAACc,WAAW,IAAI,IAAI,CAAC7I,IAAI,CAAC6I,WAAW,EACrH,IAAI,CAAC7I,IAAI,CAAC4I,cAAc,CAAC;IAC7B;IAGA,MAAM,IAAI,CAAC1J,QAAQ,CAAC8J,YAAY,CAAC,IAAI,CAAChJ,IAAI,CAAC;IAC3C,IAAI,IAAI,CAACA,IAAI,CAACiB,UAAU,KAAK,KAAK,EAAE;MAClC,IAAI,CAACQ,GAAG,CAACkB,IAAI,CAAE,oFAAmF,CAAC;IACrG,CAAC,MAAM;MACL,MAAM,IAAI,CAACP,GAAG,CAAC6G,eAAe,CAAC,IAAI,CAACjJ,IAAI,CAAC4I,cAAc,EAAE,IAAI,CAAC5I,IAAI,CAAC+I,eAAe,EAAE,IAAI,CAAClK,IAAI,CAACqK,eAAe,CAAC;IAChH;IAGA,IAAI,IAAI,CAACrK,IAAI,CAACsK,WAAW,EAAE;MACzB,MAAM,IAAI,CAACC,WAAW,EAAE;IAC1B;IAIA,IAAI,CAACjK,cAAc,GAAG,IAAI;IAE1B,MAAM,IAAI,CAACkK,mBAAmB,EAAE;EAClC;EAEA,MAAMD,WAAW,GAAI;IACnB,MAAME,QAAQ,GAAGC,oCAAe,CAACC,kBAAkB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC9D,MAAMC,OAAO,GAAG,IAAI,CAAC7K,IAAI,CAAC8K,kBAAkB,IAAI,IAAI;IACpD,IAAI,CAAClI,GAAG,CAACkB,IAAI,CAAE,+BAA8B2G,QAAS,kBAAiBI,OAAQ,IAAG,CAAC;IACnF,MAAM,IAAAE,uBAAa,EAACF,OAAO,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAACG,UAAU,CAACnK,IAAI,CAAC,IAAI,CAAC,EAAE4J,QAAQ,CAAC;EAC/E;EAEA,MAAMD,mBAAmB,GAAI;IAC3B,MAAM;MACJS,UAAU;MACVzC,eAAe;MACf0C,YAAY;MACZC,KAAK;MACLC,eAAe;MACfC;IACF,CAAC,GAAG,MAAM,IAAI,CAACC,mBAAmB,EAAE;IACpC,IAAI,CAACnK,IAAI,CAACoK,cAAc,GAAGC,QAAQ,CAACP,UAAU,EAAE,EAAE,CAAC;IACnD,IAAI,CAAC9J,IAAI,CAACqH,eAAe,GAAGA,eAAe;IAC3C,IAAI,CAACrH,IAAI,CAACsK,gBAAgB,GAAGL,eAAe;IAC5C,IAAI,CAACjK,IAAI,CAACuK,mBAAmB,GAAGL,cAAc;IAC9C,IAAI,CAAClK,IAAI,CAACwK,WAAW,GAAGR,KAAK;IAC7B,IAAI,CAAChK,IAAI,CAACyK,kBAAkB,GAAGV,YAAY;EAC7C;EAEAxB,kBAAkB,GAAI;IAGpB,IAAI,CAACrJ,QAAQ,GAAG,IAAIwL,8BAAc,CAAC,IAAI,CAACjJ,GAAG,EAAE;MAC3CkJ,IAAI,EAAE,IAAI,CAAC9L,IAAI,CAAC+L,aAAa,IAAI,IAAI,CAAC/L,IAAI,CAAC8L,IAAI,IAAI,WAAW;MAC9D5I,UAAU,EAAE,IAAI,CAAClD,IAAI,CAACkD,UAAU;MAChC8I,UAAU,EAAE3M,WAAW;MACvBkE,GAAG,EAAE,IAAI,CAACA,GAAG;MACb0I,GAAG,EAAE,IAAI,CAACjM,IAAI,CAAC2C,GAAG;MAClBuJ,MAAM,EAAE,IAAI,CAAClM,IAAI,CAACkM,MAAM;MACxBnI,UAAU,EAAE,IAAI,CAAC/D,IAAI,CAAC+D,UAAU;MAChCiG,WAAW,EAAE,IAAI,CAAChK,IAAI,CAACgK,WAAW;MAClCmC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAACnM,IAAI,CAACmM,oBAAoB;MACtDC,mBAAmB,EAAE,IAAI,CAACpM,IAAI,CAACoM,mBAAmB;MAClDC,aAAa,EAAE,CAAC,CAAC,IAAI,CAACrM,IAAI,CAACqM,aAAa;MACxCC,mBAAmB,EAAE,IAAI,CAACtM,IAAI,CAACuM,2BAA2B;MAC1DhK,qBAAqB,EAAE,IAAI,CAACvC,IAAI,CAACuC,qBAAqB;MACtDiK,sBAAsB,EAAE,IAAI,CAACxM,IAAI,CAACwM,sBAAsB;MACxDC,WAAW,EAAE,IAAI,CAACzM,IAAI,CAACyM,WAAW;MAClCC,YAAY,EAAE,IAAI,CAAC1M,IAAI,CAAC0M,YAAY;MACpCC,gBAAgB,EAAE,IAAI,CAAC3M,IAAI,CAAC2M,gBAAgB;MAC5CC,QAAQ,EAAE,IAAI,CAAC5M,IAAI,CAAC4M,QAAQ;MAC5BC,WAAW,EAAE,IAAI,CAAC7M,IAAI,CAAC6M,WAAW;MAClCC,mCAAmC,EAAE,IAAI,CAAC9M,IAAI,CAAC8M;IACjD,CAAC,CAAC;IACF,IAAI,CAACC,WAAW,GAAG,IAAI,CAAC1M,QAAQ,CAAC0M,WAAW,CAAClM,IAAI,CAAC,IAAI,CAACR,QAAQ,CAAC;IAChE,IAAI,CAAC2M,YAAY,GAAG,IAAI,CAAC3M,QAAQ,CAAC2M,YAAY,CAACnM,IAAI,CAAC,IAAI,CAACR,QAAQ,CAAC;EACpE;EAGA,MAAMyJ,OAAO,GAAI;IAQf,IAAI,IAAI,CAAC9J,IAAI,CAACiN,sBAAsB,EAAE;MACpC,MAAM/N,OAAO,CAAC+N,sBAAsB,CAClC,IAAI,CAAC1J,GAAG,EACRrE,OAAO,CAACgO,UAAU,CAAC,IAAI,CAAClN,IAAI,CAACiN,sBAAsB,CAAC,EACpD,CAACE,2CAAsB,EAAEC,4BAAY,CAAC,CACvC;IACH;IAEA,IAAI,CAAC,IAAI,CAACpN,IAAI,CAAC2C,GAAG,EAAE;MAClB,IAAI,IAAI,CAAC3C,IAAI,CAACmC,SAAS,EAAE;QACvB,IAAI,CAACS,GAAG,CAACE,aAAa,CAAC,6EAA6E,CAAC;MACvG;MACA,IAAI,CAACF,GAAG,CAACiE,KAAK,CAAC,yDAAyD,CAAC;MACzE,IAAI,IAAI,CAAC7G,IAAI,CAACqN,SAAS,EAAE;QACvB,MAAMnO,OAAO,CAACoO,QAAQ,CAAC,IAAI,CAAC/J,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;MAC7C;IACF;IAEA,IAAI,CAAC,IAAI,CAACA,IAAI,CAACuN,aAAa,EAAE;MAC5B,MAAM,IAAI,CAAChK,GAAG,CAACiK,YAAY,CAAC,IAAI,CAACxN,IAAI,CAAC+D,UAAU,CAAC;IACnD;IACA,IAAI,IAAI,CAAC/D,IAAI,CAAC2C,GAAG,EAAE;MACjB,MAAMzD,OAAO,CAACuO,UAAU,CAAC,IAAI,CAAClK,GAAG,EAAE,IAAI,CAACvD,IAAI,CAAC;IAC/C;IACA,IAAI,IAAI,CAACA,IAAI,CAACwM,sBAAsB,EAAE;MACpC,IAAI,CAAC5J,GAAG,CAACiE,KAAK,CAAC,0EAA0E,CAAC;IAC5F,CAAC,MAAM;MACL,MAAM,IAAI,CAACxG,QAAQ,CAACqN,cAAc,EAAE;MACpC,IAAI;QACF,MAAM,IAAI,CAACnK,GAAG,CAACoK,wBAAwB,CAACR,2CAAsB,EAAEC,4BAAY,CAAC;MAC/E,CAAC,CAAC,OAAOlJ,CAAC,EAAE;QACV,IAAI,CAACtB,GAAG,CAACC,IAAI,CAAE,oEAAmE,IAC/EqB,CAAC,CAAC0J,MAAM,IAAI1J,CAAC,CAACE,OAAO,CAAC,CAAC;MAC5B;IACF;EACF;EAEA,MAAMD,aAAa,GAAI;IACrB,IAAI,CAACvB,GAAG,CAACiE,KAAK,CAAC,2BAA2B,CAAC;IAE3C,MAAMgH,wBAAwB,GAAG,CAAC,YAAY;MAC5C,IAAI,CAACrL,eAAC,CAAC0C,OAAO,CAAC,IAAI,CAAC4I,0BAA0B,CAAC,EAAE;QAC/C,MAAM,IAAI,CAACC,mBAAmB,EAAE;MAClC;IACF,CAAC,EAAE,YAAY;MACb,IAAI,MAAM,IAAI,CAACC,uCAAuC,EAAE,EAAE;QACxD,MAAM,IAAI,CAACC,kCAAkC,EAAE;MACjD;IACF,CAAC,EAAE,YAAY;MACb,IAAI,CAACzL,eAAC,CAAC0C,OAAO,CAAC,IAAI,CAACgJ,qBAAqB,CAAC,EAAE;QAC1C,MAAM,IAAI,CAACC,yBAAyB,EAAE;MACxC;IACF,CAAC,CAAC;IAEF,MAAMhP,mCAAc,CAACiP,iCAAiC,CAAC,IAAI,CAACC,MAAM,EAAE,IAAI,CAACnN,SAAS,CAAC;IAEnF,IAAI,IAAI,CAACb,QAAQ,EAAE;MACjB,IAAI,IAAI,CAACC,cAAc,EAAE;QACvB,MAAM,IAAI,CAACD,QAAQ,CAAC8D,aAAa,EAAE;MACrC;MACA,IAAI,CAAC9D,QAAQ,GAAG,IAAI;IACtB;IACA,IAAI,CAACC,cAAc,GAAG,KAAK;IAE3B,IAAI,IAAI,CAACiD,GAAG,EAAE;MACZ,MAAM+K,iBAAC,CAACC,GAAG,CAACV,wBAAwB,CAAClI,GAAG,CAAE6I,IAAI,IAAK;QACjD,CAAC,YAAY;UACX,IAAI;YACF,MAAMA,IAAI,EAAE;UACd,CAAC,CAAC,OAAOC,GAAG,EAAE,CAAC;QACjB,CAAC,GAAG;MACN,CAAC,CAAC,CAAC;MACH,IAAI,IAAI,CAAClF,mBAAmB,EAAE;QAC5B,IAAI;UACF,MAAM,IAAI,CAAChG,GAAG,CAAC+F,iBAAiB,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,OAAO7E,GAAG,EAAE;UACZ,IAAI,CAAC7B,GAAG,CAACC,IAAI,CAAE,8BAA6B4B,GAAG,CAACL,OAAQ,EAAC,CAAC;QAC5D;MACF;MACA,IAAI,IAAI,CAACpE,IAAI,CAAC0O,eAAe,IAAI,IAAI,CAAC1O,IAAI,CAAC2O,aAAa,IACpD,IAAI,CAACpO,UAAU,EAAE;QACnB,IAAI,CAACqC,GAAG,CAACiE,KAAK,CAAE,qBAAoB,IAAI,CAACtG,UAAW,GAAE,CAAC;QACvD,MAAM,IAAI,CAACgD,GAAG,CAACqL,MAAM,CAAC,IAAI,CAACrO,UAAU,CAAC;MACxC;MACA,IAAI,CAAC,IAAI,CAACmC,eAAe,IAAI,IAAI,CAAC1C,IAAI,CAAC+D,UAAU,IAAI,CAAC,IAAI,CAAC/D,IAAI,CAAC6O,kBAAkB,EAAE;QAClF,MAAM,IAAI,CAACtL,GAAG,CAACuL,SAAS,CAAC,IAAI,CAAC9O,IAAI,CAAC+D,UAAU,CAAC;MAChD;MACA,IAAI,IAAI,CAAC/D,IAAI,CAACmC,SAAS,IAAI,CAAC,IAAI,CAACnC,IAAI,CAACuN,aAAa,IAAI,CAAC,IAAI,CAAC1J,WAAW,EAAE;QACxE,IAAI,CAACjB,GAAG,CAACiE,KAAK,CAAE,2CAA0C,IAAI,CAAC7G,IAAI,CAAC+D,UAAW,GAAE,CAAC;QAClF,MAAM,IAAI,CAACR,GAAG,CAACiK,YAAY,CAAC,IAAI,CAACxN,IAAI,CAAC+D,UAAU,CAAC;MACnD;MACA,MAAM,IAAI,CAACR,GAAG,CAACwL,UAAU,EAAE;MAC3B,IAAI,IAAI,CAAC/O,IAAI,CAAC+C,MAAM,EAAE;QACpB,IAAIiM,OAAO,GAAG,IAAI,CAAChP,IAAI,CAACsI,GAAG,CAACzC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,IAAI,CAACjD,GAAG,CAACiE,KAAK,CAAE,qBAAoBmI,OAAQ,GAAE,CAAC;QAC/C,MAAM,IAAI,CAACzL,GAAG,CAAC0L,YAAY,CAACD,OAAO,CAAC;MACtC;MACA,IAAI,OAAM,IAAI,CAACzL,GAAG,CAACwF,WAAW,EAAE,KAAI,EAAE,EAAE;QACtC,IAAI,CAACnG,GAAG,CAACkB,IAAI,CAAC,iEAAiE,CAAC;QAChF,MAAM,IAAI,CAACP,GAAG,CAAC2L,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAClP,IAAI,CAACiJ,0BAA0B,CAAC;MAClF;IACF;IACA,MAAM,KAAK,CAAC9E,aAAa,EAAE;IAC3B,IAAI,IAAI,CAACnE,IAAI,CAACkD,UAAU,KAAKiM,SAAS,EAAE;MACtC,IAAI;QACF,MAAM,IAAI,CAAC5L,GAAG,CAAC6L,iBAAiB,CAAC,IAAI,CAACpP,IAAI,CAACkD,UAAU,CAAC;MACxD,CAAC,CAAC,OAAOmM,KAAK,EAAE;QACd,IAAI,CAACzM,GAAG,CAACC,IAAI,CAAE,kCAAiCwM,KAAK,CAACjL,OAAQ,GAAE,CAAC;MAGnE;IACF;EACF;EAEA,MAAMxD,gBAAgB,GAAI,CAG1B;EAEA0O,WAAW,CAAEpO,SAAS,EAAE;IACtB,KAAK,CAACoO,WAAW,CAACpO,SAAS,CAAC;IAG5B,OAAO,IAAI;EACb;EAEAqO,QAAQ,CAAErO,SAAS,EAAE;IACnB,KAAK,CAACqO,QAAQ,CAACrO,SAAS,CAAC;IAGzB,OAAO,IAAI;EACb;EAEAsO,iBAAiB,CAAEtO,SAAS,EAAE;IAC5B,KAAK,CAACsO,iBAAiB,CAACtO,SAAS,CAAC;IAGlC,IAAI,CAACV,aAAa,GAAGgC,eAAC,CAACiN,KAAK,CAAC,IAAI,CAAC3O,YAAY,CAAC,GAAGxB,QAAQ,GAAGE,eAAe;IAC5E,IAAI,IAAI,CAACQ,IAAI,CAAC0P,mBAAmB,EAAE;MACjC,IAAI,CAAClP,aAAa,GAAG,CAAC,GAAG,IAAI,CAACA,aAAa,EAAE,CAAC,KAAK,EAAE,IAAIjB,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACjG;IAEA,OAAO,IAAI,CAACiB,aAAa;EAC3B;EAEA,IAAIkC,eAAe,GAAI;IACrB,OAAOxD,OAAO,CAACyQ,eAAe,CAAC,IAAI,CAAC3P,IAAI,CAAC4P,WAAW,CAAC;EACvD;EAEA,IAAI/L,WAAW,GAAI;IACjB,OAAO,CAAC,IAAI,CAAC7D,IAAI,CAAC2C,GAAG,IAAI,IAAI,CAACzD,OAAO,CAAC2Q,iBAAiB,CAAC,IAAI,CAAC7P,IAAI,CAAC+D,UAAU,CAAC;EAC/E;AACF;AAAC;AAGD,KAAK,IAAI,CAAC+L,GAAG,EAAEC,EAAE,CAAC,IAAIvN,eAAC,CAACwN,OAAO,CAACtF,oCAAe,CAAC,EAAE;EAEhD,IAAI,CAAClI,eAAC,CAAC2C,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE2K,GAAG,CAAC,EAAE;IAC5ClQ,cAAc,CAACqQ,SAAS,CAACH,GAAG,CAAC,GAAGC,EAAE;EACpC;AACF;AAGA,KAAK,IAAI,CAACD,GAAG,EAAEC,EAAE,CAAC,IAAIvN,eAAC,CAACwN,OAAO,CAACE,iBAAQ,CAAC,EAAE;EACzCtQ,cAAc,CAACqQ,SAAS,CAACH,GAAG,CAAC,GAAGC,EAAE;AACpC;AAAC,eAGcnQ,cAAc;AAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.newMethodMap = void 0;
|
|
7
|
+
require("source-map-support/register");
|
|
8
|
+
var _appiumAndroidDriver = require("appium-android-driver");
|
|
9
|
+
const newMethodMap = {
|
|
10
|
+
..._appiumAndroidDriver.AndroidDriver.newMethodMap,
|
|
11
|
+
'/session/:sessionId/appium/device/get_clipboard': {
|
|
12
|
+
POST: {
|
|
13
|
+
command: 'getClipboard',
|
|
14
|
+
payloadParams: {
|
|
15
|
+
optional: ['contentType']
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.newMethodMap = newMethodMap;
|
|
21
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJuZXdNZXRob2RNYXAiLCJBbmRyb2lkRHJpdmVyIiwiUE9TVCIsImNvbW1hbmQiLCJwYXlsb2FkUGFyYW1zIiwib3B0aW9uYWwiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbWV0aG9kLW1hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmRyb2lkRHJpdmVyIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcblxuZXhwb3J0IGNvbnN0IG5ld01ldGhvZE1hcCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIC4uLkFuZHJvaWREcml2ZXIubmV3TWV0aG9kTWFwLFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2dldENsaXBib2FyZCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7IG9wdGlvbmFsOiBbJ2NvbnRlbnRUeXBlJ10gfVxuICAgIH1cbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVPLE1BQU1BLFlBQVksR0FBeUI7RUFDaEQsR0FBR0Msa0NBQWEsQ0FBQ0QsWUFBWTtFQUM3QixpREFBaUQsRUFBRTtJQUNqREUsSUFBSSxFQUFFO01BQ0pDLE9BQU8sRUFBRSxjQUFjO01BQ3ZCQyxhQUFhLEVBQUU7UUFBRUMsUUFBUSxFQUFFLENBQUMsYUFBYTtNQUFFO0lBQzdDO0VBQ0Y7QUFDRixDQUFFO0FBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-map.js","names":["newMethodMap","AndroidDriver","POST","command","payloadParams","optional"],"sources":["../../lib/method-map.js"],"sourcesContent":["import { AndroidDriver } from 'appium-android-driver';\n\nexport const newMethodMap = /** @type {const} */ ({\n ...AndroidDriver.newMethodMap,\n '/session/:sessionId/appium/device/get_clipboard': {\n POST: {\n command: 'getClipboard',\n payloadParams: { optional: ['contentType'] }\n }\n }\n});\n"],"mappings":";;;;;;;AAAA;AAEO,MAAMA,YAAY,GAAyB;EAChD,GAAGC,kCAAa,CAACD,YAAY;EAC7B,iDAAiD,EAAE;IACjDE,IAAI,EAAE;MACJC,OAAO,EAAE,cAAc;MACvBC,aAAa,EAAE;QAAEC,QAAQ,EAAE,CAAC,aAAa;MAAE;IAC7C;EACF;AACF,CAAE;AAAC"}
|
|
Binary file
|
package/lib/driver.js
CHANGED
|
@@ -6,11 +6,12 @@ import { EspressoRunner, TEST_APK_PKG } from './espresso-runner';
|
|
|
6
6
|
import { fs, tempDir, zip } from 'appium/support';
|
|
7
7
|
import commands from './commands';
|
|
8
8
|
import { DEFAULT_ADB_PORT } from 'appium-adb';
|
|
9
|
-
import { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID } from 'appium-android-driver';
|
|
9
|
+
import { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';
|
|
10
10
|
import desiredCapConstraints from './desired-caps';
|
|
11
11
|
import { findAPortNotInUse } from 'portscanner';
|
|
12
12
|
import { retryInterval } from 'asyncbox';
|
|
13
13
|
import { qualifyActivityName, getPackageInfo } from './utils';
|
|
14
|
+
import { newMethodMap } from './method-map';
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
// TODO merge our own helpers onto this later
|
|
@@ -125,6 +126,9 @@ const AAB_EXT = '.aab';
|
|
|
125
126
|
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
126
127
|
|
|
127
128
|
class EspressoDriver extends BaseDriver {
|
|
129
|
+
|
|
130
|
+
static newMethodMap = newMethodMap;
|
|
131
|
+
|
|
128
132
|
constructor (opts = {}, shouldValidateCaps = true) {
|
|
129
133
|
// `shell` overwrites adb.shell, so remove
|
|
130
134
|
delete opts.shell;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AndroidDriver } from 'appium-android-driver';
|
|
2
|
+
|
|
3
|
+
export const newMethodMap = /** @type {const} */ ({
|
|
4
|
+
...AndroidDriver.newMethodMap,
|
|
5
|
+
'/session/:sessionId/appium/device/get_clipboard': {
|
|
6
|
+
POST: {
|
|
7
|
+
command: 'getClipboard',
|
|
8
|
+
payloadParams: { optional: ['contentType'] }
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
});
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-espresso-driver",
|
|
3
|
-
"version": "2.13.
|
|
3
|
+
"version": "2.13.10",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-espresso-driver",
|
|
9
|
-
"version": "2.13.
|
|
9
|
+
"version": "2.13.10",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@babel/runtime": "^7.4.3",
|
|
13
13
|
"appium-adb": "^9.10.2",
|
|
14
|
-
"appium-android-driver": "^5.
|
|
14
|
+
"appium-android-driver": "^5.8.7",
|
|
15
15
|
"asyncbox": "^2.3.1",
|
|
16
16
|
"bluebird": "^3.5.0",
|
|
17
17
|
"lodash": "^4.17.11",
|
|
@@ -1246,7 +1246,7 @@
|
|
|
1246
1246
|
"license": "ISC"
|
|
1247
1247
|
},
|
|
1248
1248
|
"node_modules/appium-android-driver": {
|
|
1249
|
-
"version": "5.8.
|
|
1249
|
+
"version": "5.8.7",
|
|
1250
1250
|
"license": "Apache-2.0",
|
|
1251
1251
|
"dependencies": {
|
|
1252
1252
|
"@babel/runtime": "^7.0.0",
|
|
@@ -1312,7 +1312,7 @@
|
|
|
1312
1312
|
"license": "ISC"
|
|
1313
1313
|
},
|
|
1314
1314
|
"node_modules/appium-chromedriver": {
|
|
1315
|
-
"version": "5.2.
|
|
1315
|
+
"version": "5.2.13",
|
|
1316
1316
|
"hasInstallScript": true,
|
|
1317
1317
|
"license": "Apache-2.0",
|
|
1318
1318
|
"dependencies": {
|
|
@@ -2589,7 +2589,7 @@
|
|
|
2589
2589
|
}
|
|
2590
2590
|
},
|
|
2591
2591
|
"node_modules/io.appium.settings": {
|
|
2592
|
-
"version": "5.0.
|
|
2592
|
+
"version": "5.0.2",
|
|
2593
2593
|
"license": "Apache-2.0",
|
|
2594
2594
|
"engines": {
|
|
2595
2595
|
"node": ">=14",
|
|
@@ -3216,7 +3216,7 @@
|
|
|
3216
3216
|
}
|
|
3217
3217
|
},
|
|
3218
3218
|
"node_modules/object-inspect": {
|
|
3219
|
-
"version": "1.12.
|
|
3219
|
+
"version": "1.12.3",
|
|
3220
3220
|
"license": "MIT",
|
|
3221
3221
|
"funding": {
|
|
3222
3222
|
"url": "https://github.com/sponsors/ljharb"
|
|
@@ -3629,7 +3629,7 @@
|
|
|
3629
3629
|
}
|
|
3630
3630
|
},
|
|
3631
3631
|
"node_modules/punycode": {
|
|
3632
|
-
"version": "2.
|
|
3632
|
+
"version": "2.2.0",
|
|
3633
3633
|
"extraneous": true,
|
|
3634
3634
|
"license": "MIT",
|
|
3635
3635
|
"engines": {
|
|
@@ -4467,14 +4467,14 @@
|
|
|
4467
4467
|
"license": "ISC"
|
|
4468
4468
|
},
|
|
4469
4469
|
"node_modules/ws": {
|
|
4470
|
-
"version": "8.
|
|
4470
|
+
"version": "8.12.0",
|
|
4471
4471
|
"license": "MIT",
|
|
4472
4472
|
"engines": {
|
|
4473
4473
|
"node": ">=10.0.0"
|
|
4474
4474
|
},
|
|
4475
4475
|
"peerDependencies": {
|
|
4476
4476
|
"bufferutil": "^4.0.1",
|
|
4477
|
-
"utf-8-validate": "
|
|
4477
|
+
"utf-8-validate": ">=5.0.2"
|
|
4478
4478
|
},
|
|
4479
4479
|
"peerDependenciesMeta": {
|
|
4480
4480
|
"bufferutil": {
|
|
@@ -5408,7 +5408,7 @@
|
|
|
5408
5408
|
}
|
|
5409
5409
|
},
|
|
5410
5410
|
"appium-android-driver": {
|
|
5411
|
-
"version": "5.8.
|
|
5411
|
+
"version": "5.8.7",
|
|
5412
5412
|
"requires": {
|
|
5413
5413
|
"@babel/runtime": "^7.0.0",
|
|
5414
5414
|
"appium-adb": "^9.10.9",
|
|
@@ -5454,7 +5454,7 @@
|
|
|
5454
5454
|
}
|
|
5455
5455
|
},
|
|
5456
5456
|
"appium-chromedriver": {
|
|
5457
|
-
"version": "5.2.
|
|
5457
|
+
"version": "5.2.13",
|
|
5458
5458
|
"requires": {
|
|
5459
5459
|
"@appium/base-driver": "^9.1.0",
|
|
5460
5460
|
"@appium/support": "^3.0.0",
|
|
@@ -6284,7 +6284,7 @@
|
|
|
6284
6284
|
"version": "3.0.1"
|
|
6285
6285
|
},
|
|
6286
6286
|
"io.appium.settings": {
|
|
6287
|
-
"version": "5.0.
|
|
6287
|
+
"version": "5.0.2"
|
|
6288
6288
|
},
|
|
6289
6289
|
"ipaddr.js": {
|
|
6290
6290
|
"version": "1.9.1"
|
|
@@ -6695,7 +6695,7 @@
|
|
|
6695
6695
|
}
|
|
6696
6696
|
},
|
|
6697
6697
|
"object-inspect": {
|
|
6698
|
-
"version": "1.12.
|
|
6698
|
+
"version": "1.12.3"
|
|
6699
6699
|
},
|
|
6700
6700
|
"omggif": {
|
|
6701
6701
|
"version": "1.0.10"
|
|
@@ -6957,7 +6957,7 @@
|
|
|
6957
6957
|
}
|
|
6958
6958
|
},
|
|
6959
6959
|
"punycode": {
|
|
6960
|
-
"version": "2.
|
|
6960
|
+
"version": "2.2.0",
|
|
6961
6961
|
"extraneous": true
|
|
6962
6962
|
},
|
|
6963
6963
|
"qs": {
|
|
@@ -7508,7 +7508,7 @@
|
|
|
7508
7508
|
"version": "1.0.2"
|
|
7509
7509
|
},
|
|
7510
7510
|
"ws": {
|
|
7511
|
-
"version": "8.
|
|
7511
|
+
"version": "8.12.0",
|
|
7512
7512
|
"requires": {}
|
|
7513
7513
|
},
|
|
7514
7514
|
"xhr": {
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"automated testing",
|
|
8
8
|
"android"
|
|
9
9
|
],
|
|
10
|
-
"version": "2.13.
|
|
10
|
+
"version": "2.13.10",
|
|
11
11
|
"author": "Appium Contributors",
|
|
12
12
|
"license": "Apache-2.0",
|
|
13
13
|
"repository": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"@babel/runtime": "^7.4.3",
|
|
65
65
|
"appium-adb": "^9.10.2",
|
|
66
|
-
"appium-android-driver": "^5.
|
|
66
|
+
"appium-android-driver": "^5.8.7",
|
|
67
67
|
"asyncbox": "^2.3.1",
|
|
68
68
|
"bluebird": "^3.5.0",
|
|
69
69
|
"lodash": "^4.17.11",
|