appium-xcuitest-driver 3.46.0 → 3.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -341,7 +341,7 @@ one to select or value selection suing `sendKeys` API does not work because of a
341
341
 
342
342
  Name | Type | Required | Description | Example
343
343
  --- | --- | --- | --- | ---
344
- element | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | abcdef12-1111-2222-3333-444444
344
+ elementId (`element` before version 1.22) | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | abcdef12-1111-2222-3333-444444
345
345
  order | string | yes | Either `next` to select the value next to the current one from the target picker wheel or `previous` to select the previous one. | next
346
346
  offset | number | no | The value in range [0.01, 0.5]. It defines how far from picker wheel's center the click should happen. The actual distance is calculated by multiplying this value to the actual picker wheel height. Too small offset value may not change the picker wheel value and too high value may cause the wheel to switch two or more values at once. Usually the optimal value is located in range [0.15, 0.3]. `0.2` by default | 0.15
347
347
 
@@ -934,24 +934,293 @@ The response looks like `{"value":{"statusBarSize":{"width":414,"height":48},"sc
934
934
  `statusBarSize` contains status bar dimensions. It is the result of [status bar](https://developer.apple.com/documentation/xctest/xcuielementtypequeryprovider/1500428-statusbars).
935
935
  `scale` is [screen scale](https://developer.apple.com/documentation/uikit/uiscreen/1617836-scale).
936
936
 
937
+ ### mobile: swipe
937
938
 
939
+ This gesture performs a simple "swipe" gesture on the particular screen element or
940
+ on the application element, which is usually the whole screen. This method does not
941
+ accept coordinates and simply emulates single swipe with one finger. It might be
942
+ useful for such cases like album pagination, switching views, etc. More advanced
943
+ cases may require to call [mobile: dragFromToForDuration](#mobile-dragfromtoforduration),
944
+ where one can supply coordinates and duration.
938
945
 
939
- ### Mobile Gesture Commands
946
+ #### Arguments
947
+
948
+ Name | Type | Required | Description | Example
949
+ --- | --- | --- | --- | ---
950
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to swipe on. Application element will be used instead if this argument is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
951
+ direction | Either 'up', 'down', 'left' or 'right' | yes | The direction in which to swipe | up
952
+ velocity | number | no | This argument is optional and is only supported since Appium server version 1.19 and Xcode SDK version 11.4+. The value is measured in pixels per second and same values could behave differently on different devices depending on their display density. Higher values make swipe gesture faster (which usually scrolls larger areas if we apply it to a list) and lower values slow it down. Only values greater than zero have effect. | 250
953
+
954
+ #### Examples
955
+
956
+ ```java
957
+ // Java
958
+ JavascriptExecutor js = (JavascriptExecutor) driver;
959
+ Map<String, Object> params = new HashMap<>();
960
+ params.put("direction", "down");
961
+ params.put("velocity", 2500);
962
+ params.put("element", ((RemoteWebElement) element).getId());
963
+ js.executeScript("mobile: swipe", params);
964
+ ```
965
+
966
+ #### References
967
+
968
+ - [swipeDown](https://developer.apple.com/documentation/xctest/xcuielement/1618664-swipedown?language=objc)
969
+ - [swipeDownWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551694-swipedownwithvelocity?language=objc)
970
+ - [swipeUp](https://developer.apple.com/documentation/xctest/xcuielement/1618667-swipeup?language=objc)
971
+ - [swipeUpWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551697-swipeupwithvelocity?language=objc)
972
+ - [swipeLeft](https://developer.apple.com/documentation/xctest/xcuielement/1618668-swipeleft?language=objc)
973
+ - [swipeLeftWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551695-swipeleftwithvelocity?language=objc)
974
+ - [swipeRight](https://developer.apple.com/documentation/xctest/xcuielement/1618674-swiperight?language=objc)
975
+ - [swipeRightWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551696-swiperightwithvelocity?language=objc)
976
+
977
+ ### mobile: scroll
978
+
979
+ Scrolls the element or the whole screen. Different scrolling strategies are supported.
980
+ Arguments define the choosen strategy: either 'name', 'direction', 'predicateString' or
981
+ 'toVisible' in that order. All strategies are exclusive and only one strategy
982
+ can be applied at a single moment of time. Use "mobile: scroll" to emulate precise
983
+ scrolling in tables or collection views, where it is already known to which element
984
+ the scrolling should be performed. Although, there is one known limitation there: in case
985
+ it is necessary to perform too many scroll gestures on parent container to reach the
986
+ necessary child element (tens of them) then the method call may fail.
987
+ _Important_: The implemntation of this extension relies on several undocumented XCTest features, which might not always be reliable. Thus it might *not* always work as expected.
988
+
989
+ #### Arguments
990
+
991
+ Name | Type | Required | Description | Example
992
+ --- | --- | --- | --- | ---
993
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to scroll on (e.g. the container). Application element will be used if this argument is not set | fe50b60b-916d-420b-8728-ee2072ec53eb
994
+ name | string | no | The accessibility id of the child element, to which scrolling is performed. The same result can be achieved by setting _predicateString_ argument to 'name == accessibilityId'. Has no effect if _elementId_ is not a container | cell12
995
+ direction | Either 'up', 'down', 'left' or 'right' | yes | The main difference from [swipe](#mobile-swipe) call with the same argument is that _scroll_ will try to move the current viewport exactly to the next/previous page (the term "page" means the content, which fits into a single device screen) | down
996
+ predicateString | string | no | The NSPredicate locator of the child element, to which the scrolling should be performed. Has no effect if _elementId_ is not a container | label == "foo"
997
+ toVisible | boolean | no | If set to _true_ then asks to scroll to the first visible _elementId_ in the parent container. Has no effect if _elementId_ is not set | true
998
+
999
+ #### Examples
1000
+
1001
+ ```python
1002
+ # Python
1003
+ driver.execute_script('mobile: scroll', {'direction': 'down'});
1004
+ ```
1005
+
1006
+ ### mobile: pinch
1007
+
1008
+ Performs pinch gesture on the given element or on the application element.
1009
+
1010
+ #### Arguments
1011
+
1012
+ Name | Type | Required | Description | Example
1013
+ --- | --- | --- | --- | ---
1014
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to pinch on. Application element will be used instead if this parameter is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
1015
+ scale | number | yes | Pinch scale of type float. Use a scale between 0 and 1 to "pinch close" or zoom out and a scale greater than 1 to "pinch open" or zoom in. | 0.5
1016
+ velocity | number | yes | The velocity of the pinch in scale factor per second (float value) | 2.2
1017
+
1018
+ #### Examples
1019
+
1020
+ ```ruby
1021
+ # Ruby
1022
+ execute_script 'mobile: pinch', scale: 0.5, velocity: 1.1, element: element.ref
1023
+ ```
1024
+
1025
+ #### Reference
1026
+
1027
+ [pinchWithScale:velocity:](https://developer.apple.com/documentation/xctest/xcuielement/1618669-pinchwithscale?language=objc)
1028
+
1029
+ ### mobile: doubleTap
1030
+
1031
+ Performs double tap gesture on the given element or on the screen.
1032
+
1033
+ #### Arguments
1034
+
1035
+ Name | Type | Required | Description | Example
1036
+ --- | --- | --- | --- | ---
1037
+ elementId ("element" prior to Appium v 1.22) | string | no if x and y are set | The internal element identifier (as hexadecimal hash string) to double tap on | fe50b60b-916d-420b-8728-ee2072ec53eb
1038
+ x | number | no if elementId is set | Screen x tap coordinate of type float. | 100
1039
+ y | number | no if elementId is set | Screen y tap coordinate of type float. | 100
1040
+
1041
+ #### Examples
1042
+
1043
+ ```javascript
1044
+ // javascript
1045
+ driver.execute('mobile: doubleTap', {element: element.value.ELEMENT});
1046
+ ```
1047
+
1048
+ ### mobile: touchAndHold
1049
+
1050
+ Performs long press gesture on the given element or on the screen.
1051
+
1052
+ #### Arguments
1053
+
1054
+ Name | Type | Required | Description | Example
1055
+ --- | --- | --- | --- | ---
1056
+ elementId ("element" prior to Appium v 1.22) | string | no if x and y are set | The internal element identifier (as hexadecimal hash string) to long tap on | fe50b60b-916d-420b-8728-ee2072ec53eb
1057
+ duration | number | yes | The float duration of press action in seconds | 1.5
1058
+ x | number | no if elementId is set | Screen x tap coordinate of type float. | 100
1059
+ y | number | no if elementId is set | Screen y tap coordinate of type float. | 100
1060
+
1061
+ #### Examples
1062
+
1063
+ ```csharp
1064
+ // c#
1065
+ Dictionary<string, object> tfLongTap = new Dictionary<string, object>();
1066
+ tfLongTap.Add("element", element.Id);
1067
+ tfLongTap.Add("duration", 2.0);
1068
+ ((IJavaScriptExecutor)driver).ExecuteScript("mobile: touchAndHold", tfLongTap);
1069
+ ```
1070
+
1071
+ #### Reference
1072
+
1073
+ [pressForDuration:](https://developer.apple.com/documentation/xctest/xcuielement/1618663-pressforduration?language=objc)
1074
+
1075
+ ### mobile: twoFingerTap
1076
+
1077
+ Performs two finger tap gesture on the given element or on the application element.
1078
+
1079
+ #### Arguments
1080
+
1081
+ Name | Type | Required | Description | Example
1082
+ --- | --- | --- | --- | ---
1083
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to tap on. Application element will be used instead if this parameter is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
1084
+
1085
+ #### Examples
1086
+
1087
+ ```csharp
1088
+ // c#
1089
+ Dictionary<string, object> tfTap = new Dictionary<string, object>();
1090
+ tfTap.Add("element", element.Id);
1091
+ ((IJavaScriptExecutor)driver).ExecuteScript("mobile: twoFingerTap", tfTap);
1092
+ ```
1093
+
1094
+ #### Reference
1095
+
1096
+ [twoFingerTap](https://developer.apple.com/documentation/xctest/xcuielement/1618675-twofingertap?language=objc)
1097
+
1098
+ ### mobile: tap
1099
+
1100
+ Performs tap gesture by coordinates on the given element or on the screen.
1101
+
1102
+ #### Arguments
1103
+
1104
+ Name | Type | Required | Description | Example
1105
+ --- | --- | --- | --- | ---
1106
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to tap on. _x_ and _y_ tap coordinates will be calulated relatively to the current element position on the screen if this argument is provided. Otherwise they should be calculated relatively to the active application element. | fe50b60b-916d-420b-8728-ee2072ec53eb
1107
+ x | number | yes | Screen x tap coordinate of type float. | 100
1108
+ y | number | yes | Screen y tap coordinate of type float. | 100
1109
+
1110
+ ### mobile: dragFromToForDuration
1111
+
1112
+ Performs drag and drop gesture by coordinates. This can be done either on an element or
1113
+ on the screen
1114
+
1115
+ #### Arguments
1116
+
1117
+ Name | Type | Required | Description | Example
1118
+ --- | --- | --- | --- | ---
1119
+ elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to perform drag on. All the coordinates will be calculated relatively this this element position on the screen. Absolute screen coordinates are expected if this argument is not set | fe50b60b-916d-420b-8728-ee2072ec53eb
1120
+ duration | number | yes | Float number of seconds in range [0.5, 60]. How long the tap gesture at starting drag point should be before to start dragging | 5.3
1121
+ fromX | number | yes | The x coordinate of starting drag point | 100
1122
+ fromY | number | yes | The y coordinate of starting drag point | 100
1123
+ toX | number | yes | The x coordinate of ending drag point | 200
1124
+ toY | number | yes | The y coordinate of ending drag point | 200
1125
+
1126
+ #### Examples
1127
+
1128
+ ```java
1129
+ // Java
1130
+ JavascriptExecutor js = (JavascriptExecutor) driver;
1131
+ Map<String, Object> params = new HashMap<>();
1132
+ params.put("duration", 1.0);
1133
+ params.put("fromX", 100);
1134
+ params.put("fromY", 100);
1135
+ params.put("toX", 200);
1136
+ params.put("toY", 200);
1137
+ params.put("element", ((RemoteWebElement) element).getId());
1138
+ js.executeScript("mobile: dragFromToForDuration", params);
1139
+ ```
1140
+
1141
+ #### Reference
1142
+
1143
+ [clickForDuration:thenDragToElement:](https://developer.apple.com/documentation/xctest/xcuielement/1500989-clickforduration?language=objc)
1144
+
1145
+ ### mobile: selectPickerWheelValue
1146
+
1147
+ Performs selection of the next or previous picker wheel value. This might
1148
+ be useful if these values are populated dynamically, so you don't know which
1149
+ one to select or value selection does not work because of XCTest bug.
1150
+
1151
+ #### Arguments
1152
+
1153
+ Name | Type | Required | Description | Example
1154
+ --- | --- | --- | --- | ---
1155
+ elementId ("element" prior to Appium v 1.22) | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | fe50b60b-916d-420b-8728-ee2072ec53eb
1156
+ order | string | yes | Either _next_ to select the value next to the current one from the target picker wheel or _previous_ to select the previous one | next
1157
+ offset | number | no | The value in range [0.01, 0.5]. It defines how far from picker wheel's center the click should happen. The actual distance is calculated by multiplying this value to the actual picker wheel height. Too small offset value may not change the picker wheel value and too high value may cause the wheel to switch two or more values at once. Usually the optimal value is located in range [0.15, 0.3]. _0.2_ by default | 0.3
1158
+
1159
+ #### Examples
1160
+
1161
+ ```java
1162
+ // Java
1163
+ JavascriptExecutor js = (JavascriptExecutor) driver;
1164
+ Map<String, Object> params = new HashMap<>();
1165
+ params.put("order", "next");
1166
+ params.put("offset", 0.15);
1167
+ params.put("element", ((RemoteWebElement) element).getId());
1168
+ js.executeScript("mobile: selectPickerWheelValue", params);
1169
+ ```
1170
+
1171
+ ### mobile: rotateElement
1172
+
1173
+ Performs [rotate](https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc) gesture on the given element.
1174
+
1175
+ #### Arguments
1176
+
1177
+ Name | Type | Required | Description | Example
1178
+ --- | --- | --- | --- | ---
1179
+ elementId ("element" prior to Appium v 1.22) | string | yes | Internal element id (as hexadecimal hash string) to perform rotation on | fe50b60b-916d-420b-8728-ee2072ec53eb
1180
+ rotation | number | yes | The rotation of the gesture in radians | Math.PI
1181
+ velocity | number | yes | The velocity of the rotation gesture in radians per second | Math.PI / 4
1182
+
1183
+ #### Examples
1184
+
1185
+ ```java
1186
+ // Java
1187
+ JavascriptExecutor js = (JavascriptExecutor) driver;
1188
+ js.executeScript("mobile: rotateElement", ImmutableMap.of(
1189
+ // rotate clockwise, 90 degrees
1190
+ "rotation", -Math.PI / 2,
1191
+ // in approximately two seconds
1192
+ "velocity", Math.PI / 4,
1193
+ "element", ((RemoteWebElement) element).getId()
1194
+ ));
1195
+ ```
1196
+
1197
+ #### Reference
940
1198
 
941
- XCUITest driver provides several extensions that allow to automate popular mobile gesture shortcuts:
1199
+ [rotate:withVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc)
942
1200
 
943
- - mobile: tap
944
- - mobile: scroll
945
- - mobile: pinch
946
- - mobile: doubleTap
947
- - mobile: touchAndHold
948
- - mobile: twoFingerTap
949
- - mobile: tap
950
- - mobile: dragFromToForDuration
951
- - mobile: tapWithNumberOfTaps
952
- - mobile: rotateElement
1201
+ ### mobile: tapWithNumberOfTaps
1202
+
1203
+ Sends one or more taps with one or more touch points since Appium 1.17.1.
1204
+
1205
+ #### Arguments
1206
+
1207
+ Name | Type | Required | Description | Example
1208
+ --- | --- | --- | --- | ---
1209
+ elementId ("element" prior to Appium v 1.22) | string | yes | The internal element identifier (as hexadecimal hash string) to perform one or more taps. | fe50b60b-916d-420b-8728-ee2072ec53eb
1210
+ numberOfTaps | number | yes | The number of taps | 2
1211
+ numberOfTouches | number | yes | The number of touch points | 2
1212
+
1213
+ #### Examples
1214
+
1215
+ ```ruby
1216
+ # Ruby
1217
+ e = @driver.find_element :id, 'target element'
1218
+ # Taps the element with a single touch point twice
1219
+ @driver.execute_script 'mobile: tapWithNumberOfTaps', {element: e.ref, numberOfTaps: 2, numberOfTouches: 1}
1220
+ ```
953
1221
 
954
- These gestures are documented in the [Automating Mobile Gestures for iOS](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/ios/ios-xctest-mobile-gestures.md) tutorial. Refer [W3C Actions API](https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api) if you need to automate more complicated gestures.
1222
+ #### Reference
1223
+ [tapWithNumberOfTaps:numberOfTouches:](https://developer.apple.com/documentation/xctest/xcuielement/1618671-tapwithnumberoftaps)
955
1224
 
956
1225
 
957
1226
  ## Known issues
@@ -59,7 +59,7 @@ commands.getName = async function getName(el) {
59
59
 
60
60
  if (this.isWebContext()) {
61
61
  const atomsElement = this.useAtomsElement(el);
62
- const script = 'return arguments[0].tagName';
62
+ const script = 'return arguments[0].tagName.toLowerCase()';
63
63
  return await this.executeAtom('execute_script', [script, [atomsElement]]);
64
64
  }
65
65
 
@@ -330,4 +330,4 @@ var _default = extensions;
330
330
  exports.default = _default;require('source-map-support').install();
331
331
 
332
332
 
333
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbCIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwiZXhlY3V0ZUF0b20iLCJwcm94eUNvbW1hbmQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJzY3JpcHQiLCJnZXROYXRpdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRDb250ZW50U2l6ZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZ2V0VGV4dCIsImdldEVsZW1lbnRSZWN0IiwieCIsInkiLCJnZXRMb2NhdGlvbiIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0U2l6ZSIsImdldE5hdGl2ZVJlY3QiLCJsb2MiLCJvcHRzIiwiYWJzb2x1dGVXZWJMb2NhdGlvbnMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImV4ZWN1dGUiLCJyZWN0IiwiZ2V0TG9jYXRpb25JblZpZXciLCJwcmVwYXJlSW5wdXRWYWx1ZSIsImlucCIsImlzQXJyYXkiLCJpc0Zpbml0ZSIsInNvbWUiLCJmIiwiRXJyb3IiLCJqb2luIiwibWFwIiwiayIsInNldFZhbHVlSW1tZWRpYXRlIiwibG9nIiwiaW5mbyIsInNldFZhbHVlIiwia2V5cyIsImNsZWFyIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInR5cGUiLCJsb2NhdG9yIiwiY29udGVudEhlaWdodCIsImNoaWxkcmVuIiwiZmluZEVsT3JFbHMiLCJsZW5ndGgiLCJoZWFkIiwiZmlyc3RSZWN0IiwibGFzdFJlY3QiLCJsYXN0IiwiZWxzSW5Sb3ciLCJpbml0aWFsUmVjdHMiLCJpIiwicHVzaCIsInNwYWNlQmV0d2VlbkVscyIsIm51bVJvd3MiLCJNYXRoIiwiY2VpbCIsInNpemUiLCJvcmlnaW4iLCJ0b3AiLCJsZWZ0Iiwic2Nyb2xsYWJsZU9mZnNldCIsImlzS2V5Ym9hcmRTaG93biIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsImlnbiIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsVUFBVSxHQUFHLEVBQWxDOzs7QUFFQUQsUUFBUSxDQUFDRSxnQkFBVCxHQUE0QixlQUFlQSxnQkFBZixDQUFpQ0MsRUFBakMsRUFBcUM7QUFDL0RBLEVBQUFBLEVBQUUsR0FBR0Msb0JBQUtDLGFBQUwsQ0FBbUJGLEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxLQUFLRyxZQUFMLEVBQUosRUFBeUI7QUFDdkIsVUFBTUMsWUFBWSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJMLEVBQXJCLENBQXJCO0FBQ0EsV0FBTyxNQUFNLEtBQUtNLFdBQUwsQ0FBaUIsY0FBakIsRUFBaUMsQ0FBQ0YsWUFBRCxDQUFqQyxDQUFiO0FBQ0Q7O0FBRUQsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBbUIsWUFBV1AsRUFBRyxZQUFqQyxFQUE4QyxLQUE5QyxDQUFiO0FBQ0QsQ0FSRDs7QUFVQUgsUUFBUSxDQUFDVyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JSLEVBQS9CLEVBQW1DO0FBQzNEQSxFQUFBQSxFQUFFLEdBQUdDLG9CQUFLQyxhQUFMLENBQW1CRixFQUFuQixDQUFMOztBQUNBLE1BQUksS0FBS0csWUFBTCxFQUFKLEVBQXlCO0FBQ3ZCLFVBQU1DLFlBQVksR0FBRyxLQUFLQyxlQUFMLENBQXFCTCxFQUFyQixDQUFyQjtBQUNBLFdBQU8sTUFBTSxLQUFLTSxXQUFMLENBQWlCLFlBQWpCLEVBQStCLENBQUNGLFlBQUQsQ0FBL0IsQ0FB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QTFCWDtBQTZCRDs7QUFDRCxRQUFNa0IsSUFBSSxHQUFHLE1BQU0sS0FBSzdDLE9BQUwsQ0FBYWpDLEVBQWIsQ0FBbkI7QUFDQSxRQUFNK0UsTUFBTSxHQUFHLE1BQU0sS0FBS3JDLGlCQUFMLENBQXVCMUMsRUFBdkIsQ0FBckI7QUFFQSxTQUFPb0IsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDcEJVLElBQUFBLEtBQUssRUFBRStDLElBQUksQ0FBQy9DLEtBRFE7QUFFcEJDLElBQUFBLE1BQU0sRUFBRThDLElBQUksQ0FBQzlDLE1BRk87QUFHcEJnRCxJQUFBQSxHQUFHLEVBQUVELE1BQU0sQ0FBQ2xELENBSFE7QUFJcEJvRCxJQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ25ELENBSk87QUFLcEJzRCxJQUFBQSxnQkFBZ0IsRUFBRXBCO0FBTEUsR0FBZixDQUFQO0FBT0QsQ0FwRUQ7O0FBc0VBakUsUUFBUSxDQUFDc0YsZUFBVCxHQUEyQixlQUFlQSxlQUFmLEdBQWtDO0FBQzNELE1BQUk7QUFDRixVQUFNLEtBQUtDLDJCQUFMLENBQWlDLFlBQWpDLEVBQStDLHlCQUEvQyxFQUEwRSxLQUExRSxDQUFOO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWN6RixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZWxlbWVudERpc3BsYXllZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnREaXNwbGF5ZWQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2lzX2Rpc3BsYXllZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZGlzcGxheWVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfZW5hYmxlZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZW5hYmxlZGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfc2VsZWN0ZWQnLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3NlbGVjdGVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBhcmd1bWVudHNbMF0udGFnTmFtZSc7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW2F0b21zRWxlbWVudF1dKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vbmFtZWAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldE5hdGl2ZUF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZUF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBpZiAoYXR0cmlidXRlID09PSAnY29udGVudFNpemUnKSB7XG4gICAgLy8gZG9uJ3QgcHJveHkgcmVxdWVzdHMgZm9yIHRoZSBjb250ZW50IHNpemUgb2YgYSBzY3JvbGxhYmxlIGVsZW1lbnRcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDb250ZW50U2l6ZShlbCk7XG4gIH1cblxuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG5cbiAgLy8gb3RoZXJ3aXNlIGxldCBXREEgaGFuZGxlIGF0dHJpYnV0ZSByZXF1ZXN0c1xuICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vYXR0cmlidXRlLyR7YXR0cmlidXRlfWAsICdHRVQnKTtcbiAgLy8gVHJhbnNmb3JtIHRoZSByZXN1bHQgZm9yIHRoZSBjYXNlIHdoZW4gV0RBIHJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBmb3IgYSBib29sZWFuIHZhbHVlXG4gIGlmIChbMCwgMV0uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgdmFsdWUgPSAhIXZhbHVlO1xuICB9XG4gIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIGFjY29yZGluZyB0byBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNnZXQtZWxlbWVudC1hdHRyaWJ1dGVcbiAgcmV0dXJuIChfLmlzTnVsbCh2YWx1ZSkgfHwgXy5pc1N0cmluZyh2YWx1ZSkpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59O1xuXG5jb21tYW5kcy5nZXRBdHRyaWJ1dGUgPSBhc3luYyBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUgKGF0dHJpYnV0ZSwgZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVBdHRyaWJ1dGUoYXR0cmlidXRlLCBlbCk7XG4gIH1cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICBpZiAoXy5pc051bGwoYXRvbXNFbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBFcnJvciBjb252ZXJ0aW5nIGVsZW1lbnQgSUQgZm9yIHVzaW5nIGluIFdEIGF0b21zOiAnJHtlbH1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X2F0dHJpYnV0ZV92YWx1ZScsIFthdG9tc0VsZW1lbnQsIGF0dHJpYnV0ZV0pO1xufTtcblxuY29tbWFuZHMuZ2V0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldFRleHQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS90ZXh0YCwgJ0dFVCcpO1xuICB9XG4gIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdGV4dCcsIFthdG9tc0VsZW1lbnRdKTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsKSB7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgLy8gTW9iaWxlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgcmVjdFxuICAgIGNvbnN0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24oZWwpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gICAgcmV0dXJuIHt4LCB5LCB3aWR0aCwgaGVpZ2h0fTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmF0aXZlUmVjdChlbCk7XG59O1xuXG5leHRlbnNpb25zLmdldE5hdGl2ZVJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXROYXRpdmVSZWN0IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3JlY3RgLCAnR0VUJyk7XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gYXdhaXQgdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGxldCBsb2MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSk7XG4gICAgaWYgKHRoaXMub3B0cy5hYnNvbHV0ZVdlYkxvY2F0aW9ucykge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBbZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcF07JztcbiAgICAgIGNvbnN0IFt4T2Zmc2V0LCB5T2Zmc2V0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShzY3JpcHQpO1xuICAgICAgbG9jLnggKz0geE9mZnNldDtcbiAgICAgIGxvYy55ICs9IHlPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG4gIH1cblxuICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChlbCk7XG4gIHJldHVybiB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xufTtcblxuY29tbWFuZHMuZ2V0TG9jYXRpb25JblZpZXcgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvbkluVmlldyAoZWwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24oZWwpO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBsZXQgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGlmIChhdG9tc0VsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBFcnJvciBjb252ZXJ0aW5nIGVsZW1lbnQgSUQgZm9yIHVzaW5nIGluIFdEIGF0b21zOiAnJHtlbH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt3aWR0aDogcmVjdC53aWR0aCwgaGVpZ2h0OiByZWN0LmhlaWdodH07XG59O1xuXG4vKipcbiAqIFByZXBhcmVzIHRoZSBpbnB1dCB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gV0RBLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz58bnVtYmVyfSBpbnAgVGhlIGFjdHVhbCB0ZXh0IHRvIHR5cGUuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBvZiBgaW5wYDpcbiAqICAgWydzb21lIHRleHQnXVxuICogICBbJ3MnLCAnbycsICdtJywgJ2UnLCAnICcsICd0JywgJ2UnLCAneCcsICd0J11cbiAqICAgJ3NvbWUgdGV4dCdcbiAqICAgMTIzNFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB2YWx1ZSBpcyBub3QgYWNjZXB0YWJsZSBmb3IgaW5wdXRcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgcHJlcHJvY2Vzc2VkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVJbnB1dFZhbHVlIChpbnApIHtcbiAgaWYgKCFbXy5pc0FycmF5LCBfLmlzU3RyaW5nLCBfLmlzRmluaXRlXS5zb21lKChmKSA9PiBmKGlucCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHN0cmluZ3MsIG51bWJlcnMgYW5kIGFycmF5cyBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFyZ3VtZW50cy4gYCArXG4gICAgICBgUmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5wKX1gKTtcbiAgfVxuXG4gIC8vIG1ha2UgaXQgaW50byBhIHN0cmluZywgc28gdGhlbiB3ZSBhc3N1cmVcbiAgLy8gdGhlIGFycmF5IGl0ZW1zIGFyZSBzaW5nbGUgY2hhcmFjdGVyc1xuICBpZiAoXy5pc0FycmF5KGlucCkpIHtcbiAgICBpbnAgPSBpbnAuam9pbignJyk7XG4gIH0gZWxzZSBpZiAoXy5pc0Zpbml0ZShpbnApKSB7XG4gICAgaW5wID0gYCR7aW5wfWA7XG4gIH1cbiAgLy8gVGhlIGBzcGxpdGAgbWV0aG9kIG11c3Qgbm90IGJlIHVzZWQgb24gdGhlIHN0cmluZ1xuICAvLyB0byBwcm9wZXJseSBoYW5kbGUgYWxsIFVuaWNvZGUgY29kZSBwb2ludHNcbiAgcmV0dXJuIFsuLi5pbnBdLm1hcCgoaykgPT4ge1xuICAgIGlmIChbJ1xcdUUwMDYnLCAnXFx1RTAwNyddLmluY2x1ZGVzKGspKSB7IC8vIFJFVFVSTiBvciBFTlRFUlxuICAgICAgcmV0dXJuICdcXG4nO1xuICAgIH1cbiAgICBpZiAoWydcXHVFMDAzJywgJ1xcdWUwMTcnXS5pbmNsdWRlcyhrKSkgeyAvLyBCQUNLU1BBQ0Ugb3IgREVMRVRFXG4gICAgICByZXR1cm4gJ1xcYic7XG4gICAgfVxuICAgIHJldHVybiBrO1xuICB9KTtcbn1cblxuY29tbWFuZHMuc2V0VmFsdWVJbW1lZGlhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZUltbWVkaWF0ZSAodmFsdWUsIGVsKSB7XG4gIC8vIFdEQSBkb2VzIG5vdCBwcm92aWRlIG5vIHdheSB0byBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5XG4gIGxvZy5pbmZvKCdUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGJ5cGFzcyB0eXBpbmcgdXNpbmcgWENVSVRlc3QuIFNldHRpbmcgdmFsdWUgdGhyb3VnaCBrZXlib2FyZCcpO1xuICBhd2FpdCB0aGlzLnNldFZhbHVlKHZhbHVlLCBlbCk7XG59O1xuXG5jb21tYW5kcy5zZXRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlICh2YWx1ZSwgZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vdmFsdWVgLCAnUE9TVCcsIHtcbiAgICAgIHZhbHVlOiBwcmVwYXJlSW5wdXRWYWx1ZSh2YWx1ZSksXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdjbGljaycsIFthdG9tc0VsZW1lbnRdKTtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgndHlwZScsIFthdG9tc0VsZW1lbnQsIHZhbHVlXSk7XG59O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAodmFsdWUpIHtcbiAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy93ZGEva2V5cycsICdQT1NUJywge1xuICAgIHZhbHVlOiBwcmVwYXJlSW5wdXRWYWx1ZSh2YWx1ZSksXG4gIH0pO1xufTtcblxuY29tbWFuZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdjbGVhcicsIFthdG9tc0VsZW1lbnRdKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L2NsZWFyYCwgJ1BPU1QnKTtcbn07XG5cbmNvbW1hbmRzLmdldENvbnRlbnRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGVudFNpemUgKGVsKSB7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCdTdXBwb3J0IGZvciBnZXRDb250ZW50U2l6ZSBmb3Igd2ViIGNvbnRleHQgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4gUGxlYXNlIGNvbnRhY3QgYW4gQXBwaXVtIGRldicpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJywgZWwpO1xuXG4gIGlmICh0eXBlICE9PSAnWENVSUVsZW1lbnRUeXBlVGFibGUnICYmXG4gICAgICB0eXBlICE9PSAnWENVSUVsZW1lbnRUeXBlQ29sbGVjdGlvblZpZXcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBnZXQgY29udGVudCBzaXplIGZvciB0eXBlICcke3R5cGV9Jywgb25seSBmb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0YWJsZXMgYW5kIGNvbGxlY3Rpb24gdmlld3NgKTtcbiAgfVxuICBsZXQgbG9jYXRvciA9ICcqJztcbiAgaWYgKHR5cGUgPT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScpIHtcbiAgICAvLyBvbmx5IGZpbmQgdGFibGUgY2VsbHMsIG5vdCBqdXN0IGFueSBjaGlsZHJlblxuICAgIGxvY2F0b3IgPSAnWENVSUVsZW1lbnRUeXBlQ2VsbCc7XG4gIH1cblxuICBsZXQgY29udGVudEhlaWdodCA9IDA7XG4gIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5maW5kRWxPckVscyhgY2xhc3MgY2hhaW5gLCBsb2NhdG9yLCB0cnVlLCBlbCk7XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBpZiB3ZSBrbm93IHRoZXJlJ3Mgb25seSBvbmUgZWxlbWVudCwgd2UgY2FuIG9wdGltaXplIHRvIG1ha2UganVzdCBvbmVcbiAgICAvLyBjYWxsIHRvIFdEQVxuICAgIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8uaGVhZChjaGlsZHJlbikpO1xuICAgIGNvbnRlbnRIZWlnaHQgPSByZWN0LmhlaWdodDtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAvLyBvdGhlcndpc2UgaWYgd2UgaGF2ZSBtdWx0aXBsZSBlbGVtZW50cywgbG9naWMgZGlmZmVycyBiYXNlZCBvbiBlbGVtZW50XG4gICAgLy8gdHlwZVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnWENVSUVsZW1lbnRUeXBlVGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGZpcnN0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgICAgIGNvbnN0IGxhc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmxhc3QoY2hpbGRyZW4pKTtcbiAgICAgICAgY29udGVudEhlaWdodCA9IGxhc3RSZWN0LnkgKyBsYXN0UmVjdC5oZWlnaHQgLSBmaXJzdFJlY3QueTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldyc6IHtcbiAgICAgICAgbGV0IGVsc0luUm93ID0gMTsgLy8gd2Uga25vdyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSByb3dcbiAgICAgICAgbGV0IGZpcnN0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgICAgIGxldCBpbml0aWFsUmVjdHMgPSBbZmlyc3RSZWN0XTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICBpbml0aWFsUmVjdHMucHVzaChyZWN0KTtcbiAgICAgICAgICBpZiAocmVjdC55ICE9PSBmaXJzdFJlY3QueSkge1xuICAgICAgICAgICAgZWxzSW5Sb3cgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwYWNlQmV0d2VlbkVscyA9IGluaXRpYWxSZWN0c1tlbHNJblJvd10ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLnkgLSBpbml0aWFsUmVjdHNbZWxzSW5Sb3cgLSAxXS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bVJvd3MgPSBNYXRoLmNlaWwoY2hpbGRyZW4ubGVuZ3RoIC8gZWxzSW5Sb3cpO1xuXG4gICAgICAgIC8vIGFzc3VtZSBhbGwgY2VsbHMgYXJlIHRoZSBzYW1lIGhlaWdodFxuICAgICAgICBjb250ZW50SGVpZ2h0ID0gKG51bVJvd3MgKiBmaXJzdFJlY3QuaGVpZ2h0KSArIChzcGFjZUJldHdlZW5FbHMgKiAobnVtUm93cyAtIDEpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYFByb2dyYW1taW5nIGVycm9yOiB0eXBlICcke3R5cGV9JyB3YXMgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB2YWxpZCBidXQgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlamVjdGVkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNpemUgPSBhd2FpdCB0aGlzLmdldFNpemUoZWwpO1xuICBjb25zdCBvcmlnaW4gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsKTtcbiAgLy8gYXR0cmlidXRlcyBoYXZlIHRvIGJlIHN0cmluZ3MsIHNvIHN0cmluZ2lmeSB0aGlzIHVwXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgd2lkdGg6IHNpemUud2lkdGgsXG4gICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcbiAgICB0b3A6IG9yaWdpbi55LFxuICAgIGxlZnQ6IG9yaWdpbi54LFxuICAgIHNjcm9sbGFibGVPZmZzZXQ6IGNvbnRlbnRIZWlnaHRcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5pc0tleWJvYXJkU2hvd24gPSBhc3luYyBmdW5jdGlvbiBpc0tleWJvYXJkU2hvd24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZUtleWJvYXJkJywgZmFsc2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMpO1xuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
333
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbCIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwiZXhlY3V0ZUF0b20iLCJwcm94eUNvbW1hbmQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJzY3JpcHQiLCJnZXROYXRpdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRDb250ZW50U2l6ZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZ2V0VGV4dCIsImdldEVsZW1lbnRSZWN0IiwieCIsInkiLCJnZXRMb2NhdGlvbiIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0U2l6ZSIsImdldE5hdGl2ZVJlY3QiLCJsb2MiLCJvcHRzIiwiYWJzb2x1dGVXZWJMb2NhdGlvbnMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImV4ZWN1dGUiLCJyZWN0IiwiZ2V0TG9jYXRpb25JblZpZXciLCJwcmVwYXJlSW5wdXRWYWx1ZSIsImlucCIsImlzQXJyYXkiLCJpc0Zpbml0ZSIsInNvbWUiLCJmIiwiRXJyb3IiLCJqb2luIiwibWFwIiwiayIsInNldFZhbHVlSW1tZWRpYXRlIiwibG9nIiwiaW5mbyIsInNldFZhbHVlIiwia2V5cyIsImNsZWFyIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInR5cGUiLCJsb2NhdG9yIiwiY29udGVudEhlaWdodCIsImNoaWxkcmVuIiwiZmluZEVsT3JFbHMiLCJsZW5ndGgiLCJoZWFkIiwiZmlyc3RSZWN0IiwibGFzdFJlY3QiLCJsYXN0IiwiZWxzSW5Sb3ciLCJpbml0aWFsUmVjdHMiLCJpIiwicHVzaCIsInNwYWNlQmV0d2VlbkVscyIsIm51bVJvd3MiLCJNYXRoIiwiY2VpbCIsInNpemUiLCJvcmlnaW4iLCJ0b3AiLCJsZWZ0Iiwic2Nyb2xsYWJsZU9mZnNldCIsImlzS2V5Ym9hcmRTaG93biIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsImlnbiIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsVUFBVSxHQUFHLEVBQWxDOzs7QUFFQUQsUUFBUSxDQUFDRSxnQkFBVCxHQUE0QixlQUFlQSxnQkFBZixDQUFpQ0MsRUFBakMsRUFBcUM7QUFDL0RBLEVBQUFBLEVBQUUsR0FBR0Msb0JBQUtDLGFBQUwsQ0FBbUJGLEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxLQUFLRyxZQUFMLEVBQUosRUFBeUI7QUFDdkIsVUFBTUMsWUFBWSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJMLEVBQXJCLENBQXJCO0FBQ0EsV0FBTyxNQUFNLEtBQUtNLFdBQUwsQ0FBaUIsY0FBakIsRUFBaUMsQ0FBQ0YsWUFBRCxDQUFqQyxDQUFiO0FBQ0Q7O0FBRUQsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBbUIsWUFBV1AsRUFBRyxZQUFqQyxFQUE4QyxLQUE5QyxDQUFiO0FBQ0QsQ0FSRDs7QUFVQUgsUUFBUSxDQUFDVyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JSLEVBQS9CLEVBQW1DO0FBQzNEQSxFQUFBQSxFQUFFLEdBQUdDLG9CQUFLQyxhQUFMLENBQW1CRixFQUFuQixDQUFMOztBQUNBLE1BQUksS0FBS0csWUFBTCxFQUFKLEVBQXlCO0FBQ3ZCLFVBQU1DLFlBQVksR0FBRyxLQUFLQyxlQUFMLENBQXFCTCxFQUFyQixDQUFyQjtBQUNBLFdBQU8sTUFBTSxLQUFLTSxXQUFMLENBQWlCLFlBQWpCLEVBQStCLENBQUNGLFlBQUQsQ0FBL0IsQ0FB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QTFCWDtBQTZCRDs7QUFDRCxRQUFNa0IsSUFBSSxHQUFHLE1BQU0sS0FBSzdDLE9BQUwsQ0FBYWpDLEVBQWIsQ0FBbkI7QUFDQSxRQUFNK0UsTUFBTSxHQUFHLE1BQU0sS0FBS3JDLGlCQUFMLENBQXVCMUMsRUFBdkIsQ0FBckI7QUFFQSxTQUFPb0IsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDcEJVLElBQUFBLEtBQUssRUFBRStDLElBQUksQ0FBQy9DLEtBRFE7QUFFcEJDLElBQUFBLE1BQU0sRUFBRThDLElBQUksQ0FBQzlDLE1BRk87QUFHcEJnRCxJQUFBQSxHQUFHLEVBQUVELE1BQU0sQ0FBQ2xELENBSFE7QUFJcEJvRCxJQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ25ELENBSk87QUFLcEJzRCxJQUFBQSxnQkFBZ0IsRUFBRXBCO0FBTEUsR0FBZixDQUFQO0FBT0QsQ0FwRUQ7O0FBc0VBakUsUUFBUSxDQUFDc0YsZUFBVCxHQUEyQixlQUFlQSxlQUFmLEdBQWtDO0FBQzNELE1BQUk7QUFDRixVQUFNLEtBQUtDLDJCQUFMLENBQWlDLFlBQWpDLEVBQStDLHlCQUEvQyxFQUEwRSxLQUExRSxDQUFOO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWN6RixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZWxlbWVudERpc3BsYXllZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnREaXNwbGF5ZWQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2lzX2Rpc3BsYXllZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZGlzcGxheWVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfZW5hYmxlZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZW5hYmxlZGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfc2VsZWN0ZWQnLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3NlbGVjdGVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBhcmd1bWVudHNbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpJztcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbYXRvbXNFbGVtZW50XV0pO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9uYW1lYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmF0aXZlQXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmF0aXZlQXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsKSB7XG4gIGlmIChhdHRyaWJ1dGUgPT09ICdjb250ZW50U2l6ZScpIHtcbiAgICAvLyBkb24ndCBwcm94eSByZXF1ZXN0cyBmb3IgdGhlIGNvbnRlbnQgc2l6ZSBvZiBhIHNjcm9sbGFibGUgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbnRlbnRTaXplKGVsKTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICAvLyBvdGhlcndpc2UgbGV0IFdEQSBoYW5kbGUgYXR0cmlidXRlIHJlcXVlc3RzXG4gIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcpO1xuICAvLyBUcmFuc2Zvcm0gdGhlIHJlc3VsdCBmb3IgdGhlIGNhc2Ugd2hlbiBXREEgcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGZvciBhIGJvb2xlYW4gdmFsdWVcbiAgaWYgKFswLCAxXS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gIH1cbiAgLy8gVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2dldC1lbGVtZW50LWF0dHJpYnV0ZVxuICByZXR1cm4gKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzU3RyaW5nKHZhbHVlKSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn07XG5cbmNvbW1hbmRzLmdldEF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE5hdGl2ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVsKTtcbiAgfVxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGlmIChfLmlzTnVsbChhdG9tc0VsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfYXR0cmlidXRlX3ZhbHVlJywgW2F0b21zRWxlbWVudCwgYXR0cmlidXRlXSk7XG59O1xuXG5jb21tYW5kcy5nZXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGV4dCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3RleHRgLCAnR0VUJyk7XG4gIH1cbiAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAvLyBNb2JpbGUgc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCByZWN0XG4gICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsKTtcbiAgICByZXR1cm4ge3gsIHksIHdpZHRoLCBoZWlnaHR9O1xuICB9XG5cbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVSZWN0KGVsKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmF0aXZlUmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVJlY3QgKGVsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vcmVjdGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSBhd2FpdCB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAodGhpcy5vcHRzLmFic29sdXRlV2ViTG9jYXRpb25zKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIFtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXTsnO1xuICAgICAgY29uc3QgW3hPZmZzZXQsIHlPZmZzZXRdID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gICAgICBsb2MueCArPSB4T2Zmc2V0O1xuICAgICAgbG9jLnkgKz0geU9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIGxvYztcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt4OiByZWN0LngsIHk6IHJlY3QueX07XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbkluVmlldyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uSW5WaWV3IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG59O1xuXG5jb21tYW5kcy5nZXRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2l6ZSAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gICAgaWYgKGF0b21zRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICByZXR1cm4ge3dpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0fTtcbn07XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGlucHV0IHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBXREEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8c3RyaW5nPnxudW1iZXJ9IGlucCBUaGUgYWN0dWFsIHRleHQgdG8gdHlwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIG9mIGBpbnBgOlxuICogICBbJ3NvbWUgdGV4dCddXG4gKiAgIFsncycsICdvJywgJ20nLCAnZScsICcgJywgJ3QnLCAnZScsICd4JywgJ3QnXVxuICogICAnc29tZSB0ZXh0J1xuICogICAxMjM0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBpbnB1dFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBwcmVwcm9jZXNzZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUlucHV0VmFsdWUgKGlucCkge1xuICBpZiAoIVtfLmlzQXJyYXksIF8uaXNTdHJpbmcsIF8uaXNGaW5pdGVdLnNvbWUoKGYpID0+IGYoaW5wKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgc3RyaW5ncywgbnVtYmVycyBhbmQgYXJyYXlzIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYXJndW1lbnRzLiBgICtcbiAgICAgIGBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShpbnApfWApO1xuICB9XG5cbiAgLy8gbWFrZSBpdCBpbnRvIGEgc3RyaW5nLCBzbyB0aGVuIHdlIGFzc3VyZVxuICAvLyB0aGUgYXJyYXkgaXRlbXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzXG4gIGlmIChfLmlzQXJyYXkoaW5wKSkge1xuICAgIGlucCA9IGlucC5qb2luKCcnKTtcbiAgfSBlbHNlIGlmIChfLmlzRmluaXRlKGlucCkpIHtcbiAgICBpbnAgPSBgJHtpbnB9YDtcbiAgfVxuICAvLyBUaGUgYHNwbGl0YCBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgc3RyaW5nXG4gIC8vIHRvIHByb3Blcmx5IGhhbmRsZSBhbGwgVW5pY29kZSBjb2RlIHBvaW50c1xuICByZXR1cm4gWy4uLmlucF0ubWFwKChrKSA9PiB7XG4gICAgaWYgKFsnXFx1RTAwNicsICdcXHVFMDA3J10uaW5jbHVkZXMoaykpIHsgLy8gUkVUVVJOIG9yIEVOVEVSXG4gICAgICByZXR1cm4gJ1xcbic7XG4gICAgfVxuICAgIGlmIChbJ1xcdUUwMDMnLCAnXFx1ZTAxNyddLmluY2x1ZGVzKGspKSB7IC8vIEJBQ0tTUEFDRSBvciBERUxFVEVcbiAgICAgIHJldHVybiAnXFxiJztcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH0pO1xufVxuXG5jb21tYW5kcy5zZXRWYWx1ZUltbWVkaWF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlSW1tZWRpYXRlICh2YWx1ZSwgZWwpIHtcbiAgLy8gV0RBIGRvZXMgbm90IHByb3ZpZGUgbm8gd2F5IHRvIHNldCB0aGUgdmFsdWUgZGlyZWN0bHlcbiAgbG9nLmluZm8oJ1RoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gYnlwYXNzIHR5cGluZyB1c2luZyBYQ1VJVGVzdC4gU2V0dGluZyB2YWx1ZSB0aHJvdWdoIGtleWJvYXJkJyk7XG4gIGF3YWl0IHRoaXMuc2V0VmFsdWUodmFsdWUsIGVsKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWUgKHZhbHVlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS92YWx1ZWAsICdQT1NUJywge1xuICAgICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0eXBlJywgW2F0b21zRWxlbWVudCwgdmFsdWVdKTtcbn07XG5cbmNvbW1hbmRzLmtleXMgPSBhc3luYyBmdW5jdGlvbiBrZXlzICh2YWx1ZSkge1xuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9rZXlzJywgJ1BPU1QnLCB7XG4gICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsZWFyJywgW2F0b21zRWxlbWVudF0pO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vY2xlYXJgLCAnUE9TVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGVudFNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2l6ZSAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoJ1N1cHBvcnQgZm9yIGdldENvbnRlbnRTaXplIGZvciB3ZWIgY29udGV4dCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBQbGVhc2UgY29udGFjdCBhbiBBcHBpdW0gZGV2Jyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnLCBlbCk7XG5cbiAgaWYgKHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScgJiZcbiAgICAgIHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGdldCBjb250ZW50IHNpemUgZm9yIHR5cGUgJyR7dHlwZX0nLCBvbmx5IGZvciBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhYmxlcyBhbmQgY29sbGVjdGlvbiB2aWV3c2ApO1xuICB9XG4gIGxldCBsb2NhdG9yID0gJyonO1xuICBpZiAodHlwZSA9PT0gJ1hDVUlFbGVtZW50VHlwZVRhYmxlJykge1xuICAgIC8vIG9ubHkgZmluZCB0YWJsZSBjZWxscywgbm90IGp1c3QgYW55IGNoaWxkcmVuXG4gICAgbG9jYXRvciA9ICdYQ1VJRWxlbWVudFR5cGVDZWxsJztcbiAgfVxuXG4gIGxldCBjb250ZW50SGVpZ2h0ID0gMDtcbiAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKGBjbGFzcyBjaGFpbmAsIGxvY2F0b3IsIHRydWUsIGVsKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGlmIHdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50LCB3ZSBjYW4gb3B0aW1pemUgdG8gbWFrZSBqdXN0IG9uZVxuICAgIC8vIGNhbGwgdG8gV0RBXG4gICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgY29udGVudEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIG90aGVyd2lzZSBpZiB3ZSBoYXZlIG11bHRpcGxlIGVsZW1lbnRzLCBsb2dpYyBkaWZmZXJzIGJhc2VkIG9uIGVsZW1lbnRcbiAgICAvLyB0eXBlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVUYWJsZSc6IHtcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8ubGFzdChjaGlsZHJlbikpO1xuICAgICAgICBjb250ZW50SGVpZ2h0ID0gbGFzdFJlY3QueSArIGxhc3RSZWN0LmhlaWdodCAtIGZpcnN0UmVjdC55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1hDVUlFbGVtZW50VHlwZUNvbGxlY3Rpb25WaWV3Jzoge1xuICAgICAgICBsZXQgZWxzSW5Sb3cgPSAxOyAvLyB3ZSBrbm93IHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIHJvd1xuICAgICAgICBsZXQgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgbGV0IGluaXRpYWxSZWN0cyA9IFtmaXJzdFJlY3RdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoY2hpbGRyZW5baV0pO1xuICAgICAgICAgIGluaXRpYWxSZWN0cy5wdXNoKHJlY3QpO1xuICAgICAgICAgIGlmIChyZWN0LnkgIT09IGZpcnN0UmVjdC55KSB7XG4gICAgICAgICAgICBlbHNJblJvdyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BhY2VCZXR3ZWVuRWxzID0gaW5pdGlhbFJlY3RzW2Vsc0luUm93XS55IC0gaW5pdGlhbFJlY3RzW2Vsc0luUm93IC0gMV0ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtUm93cyA9IE1hdGguY2VpbChjaGlsZHJlbi5sZW5ndGggLyBlbHNJblJvdyk7XG5cbiAgICAgICAgLy8gYXNzdW1lIGFsbCBjZWxscyBhcmUgdGhlIHNhbWUgaGVpZ2h0XG4gICAgICAgIGNvbnRlbnRIZWlnaHQgPSAobnVtUm93cyAqIGZpcnN0UmVjdC5oZWlnaHQpICsgKHNwYWNlQmV0d2VlbkVscyAqIChudW1Sb3dzIC0gMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgUHJvZ3JhbW1pbmcgZXJyb3I6IHR5cGUgJyR7dHlwZX0nIHdhcyBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHZhbGlkIGJ1dCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVqZWN0ZWRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gIGNvbnN0IG9yaWdpbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWwpO1xuICAvLyBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gc3RyaW5naWZ5IHRoaXMgdXBcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgIHRvcDogb3JpZ2luLnksXG4gICAgbGVmdDogb3JpZ2luLngsXG4gICAgc2Nyb2xsYWJsZU9mZnNldDogY29udGVudEhlaWdodFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlS2V5Ym9hcmQnLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2VsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -25,6 +25,19 @@ exports.commands = commands;
25
25
  exports.extensions = extensions;
26
26
  exports.helpers = helpers;
27
27
 
28
+ function toElementId(opts = {}) {
29
+ if (opts.element) {
30
+ _logger.default.info(`The 'element' argument name is deprecated. Consider using 'elementId' instead`);
31
+ }
32
+
33
+ const el = opts.elementId || opts.element;
34
+ return el ? _appiumSupport.util.unwrapElement(el) : null;
35
+ }
36
+
37
+ async function toElementOrApplicationId(driver, opts = {}) {
38
+ return toElementId(opts) || _appiumSupport.util.unwrapElement(await driver.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false));
39
+ }
40
+
28
41
  commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
29
42
  el = _appiumSupport.util.unwrapElement(el);
30
43
 
@@ -45,7 +58,7 @@ commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
45
58
  };
46
59
  await this.executeAtom('move_mouse', [atomsElement, relCoords]);
47
60
  } else {
48
- if (_lodash.default.isNull(el) || _lodash.default.isUndefined(el)) {
61
+ if (_lodash.default.isNil(el)) {
49
62
  if (!this.curCoords) {
50
63
  throw new _appiumBaseDriver.errors.UnknownException('Current cursor position unknown, please use moveTo with an element the first time.');
51
64
  }
@@ -66,13 +79,13 @@ commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
66
79
 
67
80
  function requireFloatParameter(paramName, paramValue, methodName) {
68
81
  if (_lodash.default.isUndefined(paramValue)) {
69
- _logger.default.errorAndThrow(`"${paramName}" parameter is mandatory for "${methodName}" call`);
82
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
70
83
  }
71
84
 
72
85
  const result = parseFloat(paramValue);
73
86
 
74
87
  if (isNaN(result)) {
75
- _logger.default.errorAndThrow(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
88
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
76
89
  }
77
90
 
78
91
  return result;
@@ -80,13 +93,13 @@ function requireFloatParameter(paramName, paramValue, methodName) {
80
93
 
81
94
  function requireIntParameter(paramName, paramValue, methodName) {
82
95
  if (_lodash.default.isUndefined(paramValue)) {
83
- _logger.default.errorAndThrow(`"${paramName}" parameter is mandatory for "${methodName}" call`);
96
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
84
97
  }
85
98
 
86
99
  const result = parseInt(paramValue, 10);
87
100
 
88
101
  if (isNaN(result)) {
89
- _logger.default.errorAndThrow(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
102
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
90
103
  }
91
104
 
92
105
  return result;
@@ -194,11 +207,7 @@ commands.nativeClick = async function nativeClick(el) {
194
207
  };
195
208
 
196
209
  helpers.mobileScroll = async function mobileScroll(opts = {}, swipe = false) {
197
- if (!opts.element) {
198
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
199
- }
200
-
201
- let params = {};
210
+ const params = {};
202
211
 
203
212
  if (opts.name && !swipe) {
204
213
  params.name = opts.name;
@@ -215,18 +224,16 @@ helpers.mobileScroll = async function mobileScroll(opts = {}, swipe = false) {
215
224
  } else if (opts.toVisible && !swipe) {
216
225
  params.toVisible = opts.toVisible;
217
226
  } else {
218
- let msg = swipe ? 'Mobile swipe requires direction' : 'Mobile scroll supports the following strategies: name, direction, predicateString, and toVisible. Specify one of these';
219
-
220
- _logger.default.errorAndThrow(msg);
227
+ const msg = swipe ? 'Mobile swipe requires direction' : 'Mobile scroll supports the following strategies: name, direction, predicateString, and toVisible. Specify one of these';
228
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(msg);
221
229
  }
222
230
 
223
231
  if (!swipe && opts.distance) {
224
232
  params.distance = opts.distance;
225
233
  }
226
234
 
227
- let element = _appiumSupport.util.unwrapElement(opts.element);
228
-
229
- let endpoint = `/wda/element/${element}/${swipe ? 'swipe' : 'scroll'}`;
235
+ const elementId = await toElementOrApplicationId(this, opts);
236
+ const endpoint = `/wda/element/${elementId}/${swipe ? 'swipe' : 'scroll'}`;
230
237
  return await this.proxyCommand(endpoint, 'POST', params);
231
238
  };
232
239
 
@@ -235,25 +242,19 @@ helpers.mobileSwipe = async function mobileSwipe(opts = {}) {
235
242
  };
236
243
 
237
244
  helpers.mobilePinch = async function mobilePinch(opts = {}) {
238
- if (!opts.element) {
239
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
240
- }
241
-
242
245
  const params = {
243
246
  scale: requireFloatParameter('scale', opts.scale, 'pinch'),
244
247
  velocity: requireFloatParameter('velocity', opts.velocity, 'pinch')
245
248
  };
246
-
247
- const el = _appiumSupport.util.unwrapElement(opts.element);
248
-
249
- return await this.proxyCommand(`/wda/element/${el}/pinch`, 'POST', params);
249
+ const elementId = await toElementOrApplicationId(this, opts);
250
+ return await this.proxyCommand(`/wda/element/${elementId}/pinch`, 'POST', params);
250
251
  };
251
252
 
252
253
  helpers.mobileDoubleTap = async function mobileDoubleTap(opts = {}) {
253
- if (opts.element) {
254
- const el = _appiumSupport.util.unwrapElement(opts.element);
254
+ const elementId = toElementId(opts);
255
255
 
256
- return await this.proxyCommand(`/wda/element/${el}/doubleTap`, 'POST');
256
+ if (elementId) {
257
+ return await this.proxyCommand(`/wda/element/${elementId}/doubleTap`, 'POST');
257
258
  }
258
259
 
259
260
  const params = {
@@ -264,24 +265,18 @@ helpers.mobileDoubleTap = async function mobileDoubleTap(opts = {}) {
264
265
  };
265
266
 
266
267
  helpers.mobileTwoFingerTap = async function mobileTwoFingerTap(opts = {}) {
267
- if (!opts.element) {
268
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
269
- }
270
-
271
- const el = _appiumSupport.util.unwrapElement(opts.element);
272
-
273
- return await this.proxyCommand(`/wda/element/${el}/twoFingerTap`, 'POST');
268
+ const elementId = await toElementOrApplicationId(this, opts);
269
+ return await this.proxyCommand(`/wda/element/${elementId}/twoFingerTap`, 'POST');
274
270
  };
275
271
 
276
272
  helpers.mobileTouchAndHold = async function mobileTouchAndHold(opts = {}) {
277
- let params = {
273
+ const params = {
278
274
  duration: requireFloatParameter('duration', opts.duration, 'touchAndHold')
279
275
  };
276
+ const elementId = toElementId(opts);
280
277
 
281
- if (opts.element) {
282
- const el = _appiumSupport.util.unwrapElement(opts.element);
283
-
284
- return await this.proxyCommand(`/wda/element/${el}/touchAndHold`, 'POST', params);
278
+ if (elementId) {
279
+ return await this.proxyCommand(`/wda/element/${elementId}/touchAndHold`, 'POST', params);
285
280
  }
286
281
 
287
282
  params.x = requireFloatParameter('x', opts.x, 'touchAndHold');
@@ -294,8 +289,8 @@ helpers.mobileTap = async function mobileTap(opts = {}) {
294
289
  x: requireFloatParameter('x', opts.x, 'tap'),
295
290
  y: requireFloatParameter('y', opts.y, 'tap')
296
291
  };
297
- const el = opts.element ? _appiumSupport.util.unwrapElement(opts.element) : '0';
298
- return await this.proxyCommand(`/wda/tap/${el}`, 'POST', params);
292
+ const elementId = toElementId(opts) || '0';
293
+ return await this.proxyCommand(`/wda/tap/${elementId}`, 'POST', params);
299
294
  };
300
295
 
301
296
  helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration(opts = {}) {
@@ -306,42 +301,35 @@ helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration
306
301
  toX: requireFloatParameter('toX', opts.toX, 'dragFromToForDuration'),
307
302
  toY: requireFloatParameter('toY', opts.toY, 'dragFromToForDuration')
308
303
  };
309
-
310
- if (opts.element) {
311
- const el = _appiumSupport.util.unwrapElement(opts.element);
312
-
313
- return await this.proxyCommand(`/wda/element/${el}/dragfromtoforduration`, 'POST', params);
314
- }
315
-
316
- return await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
304
+ const elementId = toElementId(opts);
305
+ return elementId ? await this.proxyCommand(`/wda/element/${elementId}/dragfromtoforduration`, 'POST', params) : await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
317
306
  };
318
307
 
319
308
  helpers.mobileTapWithNumberOfTaps = async function mobileTapWithNumberOfTaps(opts = {}) {
320
- if (!opts.element) {
321
- _logger.default.errorAndThrow('Element id is expected to be set for tapWithNumberOfTaps method');
309
+ const elementId = toElementId(opts);
310
+
311
+ if (!elementId) {
312
+ throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for tapWithNumberOfTaps method');
322
313
  }
323
314
 
324
315
  const params = {
325
316
  numberOfTaps: requireIntParameter('numberOfTaps', opts.numberOfTaps, 'tapWithNumberOfTaps'),
326
317
  numberOfTouches: requireIntParameter('numberOfTouches', opts.numberOfTouches, 'tapWithNumberOfTaps')
327
318
  };
328
-
329
- const el = _appiumSupport.util.unwrapElement(opts.element);
330
-
331
- return await this.proxyCommand(`/wda/element/${el}/tapWithNumberOfTaps`, 'POST', params);
319
+ return await this.proxyCommand(`/wda/element/${elementId}/tapWithNumberOfTaps`, 'POST', params);
332
320
  };
333
321
 
334
322
  helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelValue(opts = {}) {
335
- if (!opts.element) {
336
- _logger.default.errorAndThrow('Element id is expected to be set for selectPickerWheelValue method');
323
+ const elementId = toElementId(opts);
324
+
325
+ if (!elementId) {
326
+ throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for selectPickerWheelValue method');
337
327
  }
338
328
 
339
329
  if (!_lodash.default.isString(opts.order) || !['next', 'previous'].includes(opts.order.toLowerCase())) {
340
- _logger.default.errorAndThrow(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` + `'${opts.order}' is given instead`);
330
+ throw new _appiumBaseDriver.errors.InvalidArgumentError(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` + `'${opts.order}' is given instead`);
341
331
  }
342
332
 
343
- const el = _appiumSupport.util.unwrapElement(opts.element);
344
-
345
333
  const params = {
346
334
  order: opts.order
347
335
  };
@@ -350,25 +338,24 @@ helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelVal
350
338
  params.offset = requireFloatParameter('offset', opts.offset, 'selectPickerWheelValue');
351
339
  }
352
340
 
353
- return await this.proxyCommand(`/wda/pickerwheel/${el}/select`, 'POST', params);
341
+ return await this.proxyCommand(`/wda/pickerwheel/${elementId}/select`, 'POST', params);
354
342
  };
355
343
 
356
344
  helpers.mobileRotateElement = async function mobileRotateElement(opts = {}) {
357
- if (!opts.element) {
358
- _logger.default.errorAndThrow('Element id is expected to be set for rotateElement method');
359
- }
345
+ const elementId = toElementId(opts);
360
346
 
361
- const el = _appiumSupport.util.unwrapElement(opts.element);
347
+ if (!elementId) {
348
+ throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for rotateElement method');
349
+ }
362
350
 
363
351
  const params = {
364
352
  rotation: requireFloatParameter('rotation', opts.rotation, 'rotateElement'),
365
353
  velocity: requireFloatParameter('velocity', opts.velocity, 'rotateElement')
366
354
  };
367
- return await this.proxyCommand(`/wda/element/${el}/rotate`, 'POST', params);
355
+ return await this.proxyCommand(`/wda/element/${elementId}/rotate`, 'POST', params);
368
356
  };
369
357
 
370
358
  helpers.getCoordinates = async function getCoordinates(gesture) {
371
- let el = gesture.options.element;
372
359
  let coordinates = {
373
360
  x: 0,
374
361
  y: 0,
@@ -386,8 +373,10 @@ helpers.getCoordinates = async function getCoordinates(gesture) {
386
373
  optionY = requireFloatParameter('y', gesture.options.y, 'getCoordinates');
387
374
  }
388
375
 
389
- if (el) {
390
- let rect = await this.getElementRect(el);
376
+ const elementId = toElementId(gesture.options);
377
+
378
+ if (elementId) {
379
+ let rect = await this.getElementRect(elementId);
391
380
  let pos = {
392
381
  x: rect.x,
393
382
  y: rect.y
@@ -434,4 +423,4 @@ var _default = extensions;
434
423
  exports.default = _default;require('source-map-support').install();
435
424
 
436
425
 
437
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIl0sIm5hbWVzIjpbImhlbHBlcnMiLCJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJtb3ZlVG8iLCJlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwidXRpbCIsInVud3JhcEVsZW1lbnQiLCJpc1dlYkNvbnRleHQiLCJ4IiwieSIsImdldExvY2F0aW9uIiwiY29vcmRzIiwiY3VyV2ViQ29vcmRzIiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwicmVsQ29vcmRzIiwiZXhlY3V0ZUF0b20iLCJfIiwiaXNOdWxsIiwiaXNVbmRlZmluZWQiLCJjdXJDb29yZHMiLCJlcnJvcnMiLCJVbmtub3duRXhjZXB0aW9uIiwiZWxQb3MiLCJyZXF1aXJlRmxvYXRQYXJhbWV0ZXIiLCJwYXJhbU5hbWUiLCJwYXJhbVZhbHVlIiwibWV0aG9kTmFtZSIsImxvZyIsImVycm9yQW5kVGhyb3ciLCJyZXN1bHQiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJyZXF1aXJlSW50UGFyYW1ldGVyIiwicGFyc2VJbnQiLCJtb2JpbGVTaGFrZSIsImlzU2ltdWxhdG9yIiwiVW5rbm93bkVycm9yIiwib3B0cyIsImRldmljZSIsInNoYWtlIiwiY2xpY2siLCJuYXRpdmVDbGljayIsInNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJuYXRpdmVXZWJUYXAiLCJuYXRpdmVXZWJUYXBTdHJpY3QiLCJkZWJ1ZyIsImdlc3R1cmVzQ2hhaW5Ub1N0cmluZyIsImdlc3R1cmVzIiwia2V5c1RvSW5jbHVkZSIsIm1hcCIsIml0ZW0iLCJvdGhlcktleXMiLCJkaWZmZXJlbmNlIiwia2V5cyIsImlzQXJyYXkiLCJpbnRlcnNlY3Rpb24iLCJsZW5ndGgiLCJhY3Rpb24iLCJpc1BsYWluT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsImpvaW4iLCJwZXJmb3JtQWN0aW9ucyIsImFjdGlvbnMiLCJwcmVwcm9jZXNzZWRBY3Rpb25zIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwb2ludGVyVHlwZSIsIm1vZGlmaWVkQWN0aW9uIiwiY2xvbmUiLCJmaWx0ZXIiLCJpbm5lckFjdGlvbiIsImR1cmF0aW9uIiwicHJveHlDb21tYW5kIiwicGVyZm9ybVRvdWNoIiwiZSIsIm1lc3NhZ2UiLCJwZXJmb3JtTXVsdGlBY3Rpb24iLCJpIiwiZW5kcG9pbnQiLCJtb2JpbGVTY3JvbGwiLCJzd2lwZSIsImVsZW1lbnQiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJwYXJhbXMiLCJuYW1lIiwiZGlyZWN0aW9uIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsIm1zZyIsInByZWRpY2F0ZVN0cmluZyIsInRvVmlzaWJsZSIsImRpc3RhbmNlIiwibW9iaWxlU3dpcGUiLCJtb2JpbGVQaW5jaCIsInNjYWxlIiwidmVsb2NpdHkiLCJtb2JpbGVEb3VibGVUYXAiLCJtb2JpbGVUd29GaW5nZXJUYXAiLCJtb2JpbGVUb3VjaEFuZEhvbGQiLCJtb2JpbGVUYXAiLCJtb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24iLCJmcm9tWCIsImZyb21ZIiwidG9YIiwidG9ZIiwibW9iaWxlVGFwV2l0aE51bWJlck9mVGFwcyIsIm51bWJlck9mVGFwcyIsIm51bWJlck9mVG91Y2hlcyIsIm1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUiLCJpc1N0cmluZyIsIm9yZGVyIiwib2Zmc2V0IiwibW9iaWxlUm90YXRlRWxlbWVudCIsInJvdGF0aW9uIiwiZ2V0Q29vcmRpbmF0ZXMiLCJnZXN0dXJlIiwib3B0aW9ucyIsImNvb3JkaW5hdGVzIiwiYXJlT2Zmc2V0cyIsIm9wdGlvblgiLCJvcHRpb25ZIiwicmVjdCIsImdldEVsZW1lbnRSZWN0IiwicG9zIiwic2l6ZSIsInciLCJ3aWR0aCIsImgiLCJoZWlnaHQiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImFwcGx5TW92ZVRvT2Zmc2V0IiwiZmlyc3RDb29yZGluYXRlcyIsInNlY29uZENvb3JkaW5hdGVzIl0sIm1hcHBpbmdz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QTBCSCxPQUFPLENBQUM3RCxNQUFSLEtBQW1CLFFBQTdDO0FBQ0ErRCxJQUFBQSxXQUFXLENBQUNsSCxDQUFaLEdBQWlCb0gsT0FBTyxJQUFJLENBQTVCO0FBQ0FGLElBQUFBLFdBQVcsQ0FBQ2pILENBQVosR0FBaUJvSCxPQUFPLElBQUksQ0FBNUI7QUFDRDs7QUFDRCxTQUFPSCxXQUFQO0FBQ0QsQ0E1Q0Q7O0FBOENBNUgsT0FBTyxDQUFDMEksaUJBQVIsR0FBNEIsU0FBU0EsaUJBQVQsQ0FBNEJDLGdCQUE1QixFQUE4Q0MsaUJBQTlDLEVBQWlFO0FBQzNGLE1BQUlBLGlCQUFpQixDQUFDZixVQUF0QixFQUFrQztBQUNoQyxXQUFPO0FBQ0xuSCxNQUFBQSxDQUFDLEVBQUVpSSxnQkFBZ0IsQ0FBQ2pJLENBQWpCLEdBQXFCa0ksaUJBQWlCLENBQUNsSSxDQURyQztBQUVMQyxNQUFBQSxDQUFDLEVBQUVnSSxnQkFBZ0IsQ0FBQ2hJLENBQWpCLEdBQXFCaUksaUJBQWlCLENBQUNqSTtBQUZyQyxLQUFQO0FBSUQsR0FMRCxNQUtPO0FBQ0wsV0FBT2lJLGlCQUFQO0FBQ0Q7QUFDRixDQVREOztBQVdBdkUsTUFBTSxDQUFDQyxNQUFQLENBQWNyRSxVQUFkLEVBQTBCRCxPQUExQixFQUFtQ0UsUUFBbkM7ZUFFZUQsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcblxuXG5jb25zdCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fSwgY29tbWFuZHMgPSB7fTtcblxuY29tbWFuZHMubW92ZVRvID0gYXN5bmMgZnVuY3Rpb24gbW92ZVRvIChlbCwgeG9mZnNldCA9IDAsIHlvZmZzZXQgPSAwKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uKGVsKTtcbiAgICBsZXQgY29vcmRzID0ge1xuICAgICAgeDogeCArIHhvZmZzZXQsXG4gICAgICB5OiB5ICsgeW9mZnNldFxuICAgIH07XG4gICAgdGhpcy5jdXJXZWJDb29yZHMgPSBjb29yZHM7XG4gICAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICBsZXQgcmVsQ29vcmRzID0ge3g6IHhvZmZzZXQsIHk6IHlvZmZzZXR9O1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ21vdmVfbW91c2UnLCBbYXRvbXNFbGVtZW50LCByZWxDb29yZHNdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXy5pc051bGwoZWwpIHx8IF8uaXNVbmRlZmluZWQoZWwpKSB7XG4gICAgICBpZiAoIXRoaXMuY3VyQ29vcmRzKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkV4Y2VwdGlvbihcbiAgICAgICAgICAnQ3VycmVudCBjdXJzb3IgcG9zaXRpb24gdW5rbm93biwgcGxlYXNlIHVzZSBtb3ZlVG8gd2l0aCBhbiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJDb29yZHMgPSB7XG4gICAgICAgIHg6IHRoaXMuY3VyQ29vcmRzLnggKyB4b2Zmc2V0LFxuICAgICAgICB5OiB0aGlzLmN1ckNvb3Jkcy55ICsgeW9mZnNldFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsUG9zID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgICB0aGlzLmN1ckNvb3JkcyA9IHtcbiAgICAgICAgeDogZWxQb3MueCArIHhvZmZzZXQsXG4gICAgICAgIHk6IGVsUG9zLnkgKyB5b2Zmc2V0XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gcmVxdWlyZUZsb2F0UGFyYW1ldGVyIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1WYWx1ZSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGZvciBcIiR7bWV0aG9kTmFtZX1cIiBjYWxsYCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VGbG9hdChwYXJhbVZhbHVlKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgdmFsaWQgbnVtYmVyLiBcIiR7cGFyYW1WYWx1ZX1cIiBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZUludFBhcmFtZXRlciAocGFyYW1OYW1lLCBwYXJhbVZhbHVlLCBtZXRob2ROYW1lKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgXCIke21ldGhvZE5hbWV9XCIgY2FsbGApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHBhcmFtVmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgdmFsaWQgaW50ZWdlci4gXCIke3BhcmFtVmFsdWV9XCIgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLm1vYmlsZVNoYWtlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2hha2UgKCkge1xuICBpZiAoIXRoaXMuaXNTaW11bGF0b3IoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKCdTaGFrZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHJlYWwgZGV2aWNlcycpO1xuICB9XG4gIGF3YWl0IHRoaXMub3B0cy5kZXZpY2Uuc2hha2UoKTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gY2xpY2sgKGVsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSBjb21tYW5kcyB0aGF0IG1hcCBoZXJlLCBzbyBtYW51YWxseSBwcm94eVxuICAgIHJldHVybiBhd2FpdCB0aGlzLm5hdGl2ZUNsaWNrKGVsKTtcbiAgfVxuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICgoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXAgfHwgKGF3YWl0IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKSkubmF0aXZlV2ViVGFwU3RyaWN0KSB7XG4gICAgLy8gYXRvbXMtYmFzZWQgY2xpY2tzIGRvbid0IGFsd2F5cyB3b3JrIGluIHNhZmFyaSA3XG4gICAgbG9nLmRlYnVnKCdVc2luZyBuYXRpdmUgd2ViIHRhcCcpO1xuICAgIGF3YWl0IHRoaXMubmF0aXZlV2ViVGFwKGVsKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXN0dXJlc0NoYWluVG9TdHJpbmcgKGdlc3R1cmVzLCBrZXlzVG9JbmNsdWRlID0gWydvcHRpb25zJ10pIHtcbiAgcmV0dXJuIGdlc3R1cmVzLm1hcCgoaXRlbSkgPT4ge1xuICAgIGxldCBvdGhlcktleXMgPSBfLmRpZmZlcmVuY2UoXy5rZXlzKGl0ZW0pLCBbJ2FjdGlvbiddKTtcbiAgICBvdGhlcktleXMgPSBfLmlzQXJyYXkoa2V5c1RvSW5jbHVkZSkgPyBfLmludGVyc2VjdGlvbihvdGhlcktleXMsIGtleXNUb0luY2x1ZGUpIDogb3RoZXJLZXlzO1xuICAgIGlmIChvdGhlcktleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYCR7aXRlbS5hY3Rpb259YCArXG4gICAgICAgIGAoJHtfLm1hcChvdGhlcktleXMsICh4KSA9PiB4ICsgJz0nICsgKF8uaXNQbGFpbk9iamVjdChpdGVtW3hdKSA/IEpTT04uc3RyaW5naWZ5KGl0ZW1beF0pIDogaXRlbVt4XSkpLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIHJldHVybiBpdGVtLmFjdGlvbjtcbiAgfSkuam9pbignLScpO1xufVxuXG5jb21tYW5kcy5wZXJmb3JtQWN0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1BY3Rpb25zIChhY3Rpb25zKSB7XG4gIGxvZy5kZWJ1ZyhgUmVjZWl2ZWQgdGhlIGZvbGxvd2luZyBXM0MgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShhY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgLy8gVGhpcyBpcyBtYW5kYXRvcnksIHNpbmNlIFdEQSBvbmx5IHN1cHBvcnRzIFRPVUNIIHBvaW50ZXIgdHlwZVxuICAvLyBhbmQgU2VsZW5pdW0gQVBJIHVzZXMgTU9VU0UgYXMgdGhlIGRlZmF1bHQgb25lXG4gIGNvbnN0IHByZXByb2Nlc3NlZEFjdGlvbnMgPSBhY3Rpb25zXG4gICAgLm1hcCgoYWN0aW9uKSA9PiBPYmplY3QuYXNzaWduKHt9LCBhY3Rpb24sIGFjdGlvbi50eXBlID09PSAncG9pbnRlcicgPyB7XG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHBvaW50ZXJUeXBlOiAndG91Y2gnXG4gICAgICB9XG4gICAgfSA6IHt9KSlcbiAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IG1vZGlmaWVkQWN0aW9uID0gXy5jbG9uZShhY3Rpb24pIHx8IHt9O1xuICAgICAgLy8gU2VsZW5pdW0gQVBJIHVuZXhwZWN0ZWRseSBpbnNlcnRzIHplcm8gcGF1c2VzLCB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSBXREFcbiAgICAgIG1vZGlmaWVkQWN0aW9uLmFjdGlvbnMgPSAoYWN0aW9uLmFjdGlvbnMgfHwgW10pXG4gICAgICAgIC5maWx0ZXIoKGlubmVyQWN0aW9uKSA9PiAhKGlubmVyQWN0aW9uLnR5cGUgPT09ICdwYXVzZScgJiYgaW5uZXJBY3Rpb24uZHVyYXRpb24gPT09IDApKTtcbiAgICAgIHJldHVybiBtb2RpZmllZEFjdGlvbjtcbiAgICB9KTtcbiAgbG9nLmRlYnVnKGBQcmVwcm9jZXNzZWQgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShwcmVwcm9jZXNzZWRBY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvYWN0aW9ucycsICdQT1NUJywge2FjdGlvbnM6IHByZXByb2Nlc3NlZEFjdGlvbnN9KTtcbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1Ub3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Ub3VjaCAoZ2VzdHVyZXMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIHRvdWNoIGFjdGlvbjogJHtnZXN0dXJlc0NoYWluVG9TdHJpbmcoZ2VzdHVyZXMpfWApO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS90b3VjaC9wZXJmb3JtJywgJ1BPU1QnLCB7YWN0aW9uczogZ2VzdHVyZXN9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBUb3VjaCBBUEkgaXMgYWltZWQgZm9yIHVzYWdlIGluIE5BVElWRSBjb250ZXh0LiAnICtcbiAgICAgICdDb25zaWRlciB1c2luZyBcImV4ZWN1dGVcIiBBUEkgd2l0aCBjdXN0b20gZXZlbnRzIHRyaWdnZXIgc2NyaXB0ICcgK1xuICAgICAgYHRvIGVtdWxhdGUgdG91Y2ggZXZlbnRzIGJlaW5nIGluIFdFQlZJRVcgY29udGV4dC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5jb21tYW5kcy5wZXJmb3JtTXVsdGlBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtTXVsdGlBY3Rpb24gKGFjdGlvbnMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIG11bHRpIHRvdWNoIGFjdGlvbjpgKTtcbiAgZm9yIChsZXQgaSBpbiBhY3Rpb25zKSB7XG4gICAgbG9nLmRlYnVnKGAgICAgJHtwYXJzZUludChpLCAxMCkgKyAxfTogJHtfLm1hcChhY3Rpb25zW2ldLCAnYWN0aW9uJykuam9pbignLScpfWApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoL211bHRpL3BlcmZvcm0nLCAnUE9TVCcsIHthY3Rpb25zfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgTXVsdGlUb3VjaCBBUEkgaXMgYWltZWQgZm9yIHVzYWdlIGluIE5BVElWRSBjb250ZXh0LiAnICtcbiAgICAgICdDb25zaWRlciB1c2luZyBcImV4ZWN1dGVcIiBBUEkgd2l0aCBjdXN0b20gZXZlbnRzIHRyaWdnZXIgc2NyaXB0ICcgK1xuICAgICAgYHRvIGVtdWxhdGUgbXVsdGl0b3VjaCBldmVudHMgYmVpbmcgaW4gV0VCVklFVyBjb250ZXh0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLm5hdGl2ZUNsaWNrID0gYXN5bmMgZnVuY3Rpb24gbmF0aXZlQ2xpY2sgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgbGV0IGVuZHBvaW50ID0gYC9lbGVtZW50LyR7ZWx9L2NsaWNrYDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHt9KTtcbn07XG5cbi8qXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL1dlYkRyaXZlckFnZW50L2Jsb2IvbWFzdGVyL1dlYkRyaXZlckFnZW50TGliL0NvbW1hbmRzL0ZCRWxlbWVudENvbW1hbmRzLm1cbiAqIHRvIGdldCB0aGUgaW5mbyBhYm91dCBhdmFpbGFibGUgV0RBIGdlc3R1cmVzIEFQSVxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vcmVmZXJlbmNlL3hjdGVzdC94Y3VpZWxlbWVudCBhbmRcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9yZWZlcmVuY2UveGN0ZXN0L3hjdWljb29yZGluYXRlIHRvIGdldCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2ZcbiAqIGFsbCBYQ1Rlc3QgZ2VzdHVyZXNcbiovXG5cbmhlbHBlcnMubW9iaWxlU2Nyb2xsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2Nyb2xsIChvcHRzID0ge30sIHN3aXBlID0gZmFsc2UpIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBvcHRzLmVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKTtcbiAgfVxuICAvLyBXREEgc3VwcG9ydHMgZm91ciBzY3JvbGxpbmcgc3RyYXRlZ2llczogcHJlZGljYXRpb24gYmFzZWQgb24gbmFtZSwgZGlyZWN0aW9uLFxuICAvLyBwcmVkaWNhdGVTdHJpbmcsIGFuZCB0b1Zpc2libGUsIGluIHRoYXQgb3JkZXIuIFN3aXBpbmcgcmVxdWlyZXMgZGlyZWN0aW9uLlxuICBsZXQgcGFyYW1zID0ge307XG4gIGlmIChvcHRzLm5hbWUgJiYgIXN3aXBlKSB7XG4gICAgcGFyYW1zLm5hbWUgPSBvcHRzLm5hbWU7XG4gIH0gZWxzZSBpZiAob3B0cy5kaXJlY3Rpb24pIHtcbiAgICBpZiAoIVsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J10uaW5jbHVkZXMob3B0cy5kaXJlY3Rpb24udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGxldCBtc2cgPSAnRGlyZWN0aW9uIG11c3QgYmUgdXAsIGRvd24sIGxlZnQgb3IgcmlnaHQnO1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgICB9XG4gICAgcGFyYW1zLmRpcmVjdGlvbiA9IG9wdHMuZGlyZWN0aW9uO1xuICB9IGVsc2UgaWYgKG9wdHMucHJlZGljYXRlU3RyaW5nICYmICFzd2lwZSkge1xuICAgIHBhcmFtcy5wcmVkaWNhdGVTdHJpbmcgPSBvcHRzLnByZWRpY2F0ZVN0cmluZztcbiAgfSBlbHNlIGlmIChvcHRzLnRvVmlzaWJsZSAmJiAhc3dpcGUpIHtcbiAgICBwYXJhbXMudG9WaXNpYmxlID0gb3B0cy50b1Zpc2libGU7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG1zZyA9IHN3aXBlXG4gICAgICA/ICdNb2JpbGUgc3dpcGUgcmVxdWlyZXMgZGlyZWN0aW9uJ1xuICAgICAgOiAnTW9iaWxlIHNjcm9sbCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHN0cmF0ZWdpZXM6IG5hbWUsIGRpcmVjdGlvbiwgcHJlZGljYXRlU3RyaW5nLCBhbmQgdG9WaXNpYmxlLiBTcGVjaWZ5IG9uZSBvZiB0aGVzZSc7XG4gICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgfVxuXG4gIC8vIHdlIGNhbiBhbHNvIG9wdGlvbmFsbHkgcGFzcyBhIGRpc3RhbmNlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSByYXRpbyBvZlxuICAvLyBzY3JlZW4gaGVpZ2h0LCBzbyAxLjAgbWVhbnMgYSBmdWxsIHNjcmVlbidzIHdvcnRoIG9mIHNjcm9sbGluZ1xuICBpZiAoIXN3aXBlICYmIG9wdHMuZGlzdGFuY2UpIHtcbiAgICBwYXJhbXMuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICB9XG5cbiAgbGV0IGVsZW1lbnQgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgbGV0IGVuZHBvaW50ID0gYC93ZGEvZWxlbWVudC8ke2VsZW1lbnR9LyR7c3dpcGUgPyAnc3dpcGUnIDogJ3Njcm9sbCd9YDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVN3aXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5tb2JpbGVTY3JvbGwob3B0cywgdHJ1ZSk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVBpbmNoID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2ggKG9wdHMgPSB7fSkge1xuICBpZiAoIW9wdHMuZWxlbWVudCkge1xuICAgIG9wdHMuZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKGBjbGFzcyBuYW1lYCwgYFhDVUlFbGVtZW50VHlwZUFwcGxpY2F0aW9uYCwgZmFsc2UpO1xuICB9XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBzY2FsZTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdzY2FsZScsIG9wdHMuc2NhbGUsICdwaW5jaCcpLFxuICAgIHZlbG9jaXR5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3ZlbG9jaXR5Jywgb3B0cy52ZWxvY2l0eSwgJ3BpbmNoJylcbiAgfTtcbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbH0vcGluY2hgLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZURvdWJsZVRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURvdWJsZVRhcCAob3B0cyA9IHt9KSB7XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBEb3VibGUgdGFwIGVsZW1lbnRcbiAgICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L2RvdWJsZVRhcGAsICdQT1NUJyk7XG4gIH1cbiAgLy8gRG91YmxlIHRhcCBjb29yZGluYXRlc1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgeDogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd4Jywgb3B0cy54LCAnZG91YmxlVGFwJyksXG4gICAgeTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd5Jywgb3B0cy55LCAnZG91YmxlVGFwJylcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL2RvdWJsZVRhcCcsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVHdvRmluZ2VyVGFwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVHdvRmluZ2VyVGFwIChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBvcHRzLmVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsfS90d29GaW5nZXJUYXBgLCAnUE9TVCcpO1xufTtcblxuaGVscGVycy5tb2JpbGVUb3VjaEFuZEhvbGQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUb3VjaEFuZEhvbGQgKG9wdHMgPSB7fSkge1xuICBsZXQgcGFyYW1zID0ge1xuICAgIGR1cmF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2R1cmF0aW9uJywgb3B0cy5kdXJhdGlvbiwgJ3RvdWNoQW5kSG9sZCcpXG4gIH07XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBMb25nIHRhcCBlbGVtZW50XG4gICAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsfS90b3VjaEFuZEhvbGRgLCAnUE9TVCcsIHBhcmFtcyk7XG4gIH1cbiAgLy8gTG9uZyB0YXAgY29vcmRpbmF0ZXNcbiAgcGFyYW1zLnggPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3gnLCBvcHRzLngsICd0b3VjaEFuZEhvbGQnKTtcbiAgcGFyYW1zLnkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBvcHRzLnksICd0b3VjaEFuZEhvbGQnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoQW5kSG9sZCcsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVGFwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVGFwIChvcHRzID0ge30pIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIG9wdHMueCwgJ3RhcCcpLFxuICAgIHk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneScsIG9wdHMueSwgJ3RhcCcpXG4gIH07XG4gIGNvbnN0IGVsID0gb3B0cy5lbGVtZW50ID8gKHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpKSA6ICcwJztcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL3RhcC8ke2VsfWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGR1cmF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2R1cmF0aW9uJywgb3B0cy5kdXJhdGlvbiwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIGZyb21YOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2Zyb21YJywgb3B0cy5mcm9tWCwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIGZyb21ZOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2Zyb21ZJywgb3B0cy5mcm9tWSwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIHRvWDogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd0b1gnLCBvcHRzLnRvWCwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIHRvWTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd0b1knLCBvcHRzLnRvWSwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpXG4gIH07XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBEcmFnIGVsZW1lbnRcbiAgICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L2RyYWdmcm9tdG9mb3JkdXJhdGlvbmAsICdQT1NUJywgcGFyYW1zKTtcbiAgfVxuICAvLyBEcmFnIGNvb3JkaW5hdGVzXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9kcmFnZnJvbXRvZm9yZHVyYXRpb24nLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUYXBXaXRoTnVtYmVyT2ZUYXBzIChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnRWxlbWVudCBpZCBpcyBleHBlY3RlZCB0byBiZSBzZXQgZm9yIHRhcFdpdGhOdW1iZXJPZlRhcHMgbWV0aG9kJyk7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG51bWJlck9mVGFwczogcmVxdWlyZUludFBhcmFtZXRlcignbnVtYmVyT2ZUYXBzJywgb3B0cy5udW1iZXJPZlRhcHMsICd0YXBXaXRoTnVtYmVyT2ZUYXBzJyksXG4gICAgbnVtYmVyT2ZUb3VjaGVzOiByZXF1aXJlSW50UGFyYW1ldGVyKCdudW1iZXJPZlRvdWNoZXMnLCBvcHRzLm51bWJlck9mVG91Y2hlcywgJ3RhcFdpdGhOdW1iZXJPZlRhcHMnKSxcbiAgfTtcbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbH0vdGFwV2l0aE51bWJlck9mVGFwc2AsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUgKG9wdHMgPSB7fSkge1xuICBpZiAoIW9wdHMuZWxlbWVudCkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igc2VsZWN0UGlja2VyV2hlZWxWYWx1ZSBtZXRob2QnKTtcbiAgfVxuICBpZiAoIV8uaXNTdHJpbmcob3B0cy5vcmRlcikgfHwgIVsnbmV4dCcsICdwcmV2aW91cyddLmluY2x1ZGVzKG9wdHMub3JkZXIudG9Mb3dlckNhc2UoKSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIG1hbmRhdG9yeSAnb3JkZXInIHBhcmFtZXRlciBpcyBleHBlY3RlZCB0byBiZSBlcXVhbCBlaXRoZXIgdG8gJ25leHQnIG9yICdwcmV2aW91cycuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAnJHtvcHRzLm9yZGVyfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGNvbnN0IGVsID0gdXRpbC51bndyYXBFbGVtZW50KG9wdHMuZWxlbWVudCk7XG4gIGNvbnN0IHBhcmFtcyA9IHtvcmRlcjogb3B0cy5vcmRlcn07XG4gIGlmIChvcHRzLm9mZnNldCkge1xuICAgIHBhcmFtcy5vZmZzZXQgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ29mZnNldCcsIG9wdHMub2Zmc2V0LCAnc2VsZWN0UGlja2VyV2hlZWxWYWx1ZScpO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9waWNrZXJ3aGVlbC8ke2VsfS9zZWxlY3RgLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVJvdGF0ZUVsZW1lbnQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSb3RhdGVFbGVtZW50IChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnRWxlbWVudCBpZCBpcyBleHBlY3RlZCB0byBiZSBzZXQgZm9yIHJvdGF0ZUVsZW1lbnQgbWV0aG9kJyk7XG4gIH1cbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHJvdGF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3JvdGF0aW9uJywgb3B0cy5yb3RhdGlvbiwgJ3JvdGF0ZUVsZW1lbnQnKSxcbiAgICB2ZWxvY2l0eTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd2ZWxvY2l0eScsIG9wdHMudmVsb2NpdHksICdyb3RhdGVFbGVtZW50JyksXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L3JvdGF0ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q29vcmRpbmF0ZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29yZGluYXRlcyAoZ2VzdHVyZSkge1xuICBsZXQgZWwgPSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcblxuICAvLyBkZWZhdWx0c1xuICBsZXQgY29vcmRpbmF0ZXMgPSB7eDogMCwgeTogMCwgYXJlT2Zmc2V0czogZmFsc2V9O1xuXG4gIGxldCBvcHRpb25YID0gbnVsbDtcbiAgaWYgKGdlc3R1cmUub3B0aW9ucy54KSB7XG4gICAgb3B0aW9uWCA9IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIGdlc3R1cmUub3B0aW9ucy54LCAnZ2V0Q29vcmRpbmF0ZXMnKTtcbiAgfVxuICBsZXQgb3B0aW9uWSA9IG51bGw7XG4gIGlmIChnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgIG9wdGlvblkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBnZXN0dXJlLm9wdGlvbnMueSwgJ2dldENvb3JkaW5hdGVzJyk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IHRoZSBlbGVtZW50IGNvb3JkaW5hdGVzLlxuICBpZiAoZWwpIHtcbiAgICBsZXQgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICAgIGxldCBwb3MgPSB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xuICAgIGxldCBzaXplID0ge3c6IHJlY3Qud2lkdGgsIGg6IHJlY3QuaGVpZ2h0fTtcblxuICAgIC8vIGRlZmF1bHRzXG4gICAgbGV0IG9mZnNldFggPSAwO1xuICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgIC8vIGdldCB0aGUgcmVhbCBvZmZzZXRzXG4gICAgaWYgKG9wdGlvblggfHwgb3B0aW9uWSkge1xuICAgICAgb2Zmc2V0WCA9IChvcHRpb25YIHx8IDApO1xuICAgICAgb2Zmc2V0WSA9IChvcHRpb25ZIHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRYID0gKHNpemUudyAvIDIpO1xuICAgICAgb2Zmc2V0WSA9IChzaXplLmggLyAyKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0aGUgb2Zmc2V0c1xuICAgIGNvb3JkaW5hdGVzLnggPSBwb3MueCArIG9mZnNldFg7XG4gICAgY29vcmRpbmF0ZXMueSA9IHBvcy55ICsgb2Zmc2V0WTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtb3ZlVG8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZCBpbiBhcyBvZmZzZXRzXG4gICAgY29vcmRpbmF0ZXMuYXJlT2Zmc2V0cyA9IChnZXN0dXJlLmFjdGlvbiA9PT0gJ21vdmVUbycpO1xuICAgIGNvb3JkaW5hdGVzLnggPSAob3B0aW9uWCB8fCAwKTtcbiAgICBjb29yZGluYXRlcy55ID0gKG9wdGlvblkgfHwgMCk7XG4gIH1cbiAgcmV0dXJuIGNvb3JkaW5hdGVzO1xufTtcblxuaGVscGVycy5hcHBseU1vdmVUb09mZnNldCA9IGZ1bmN0aW9uIGFwcGx5TW92ZVRvT2Zmc2V0IChmaXJzdENvb3JkaW5hdGVzLCBzZWNvbmRDb29yZGluYXRlcykge1xuICBpZiAoc2Vjb25kQ29vcmRpbmF0ZXMuYXJlT2Zmc2V0cykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBmaXJzdENvb3JkaW5hdGVzLnggKyBzZWNvbmRDb29yZGluYXRlcy54LFxuICAgICAgeTogZmlyc3RDb29yZGluYXRlcy55ICsgc2Vjb25kQ29vcmRpbmF0ZXMueSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzZWNvbmRDb29yZGluYXRlcztcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBoZWxwZXJzLCBjb21tYW5kcyk7XG5leHBvcnQgeyBleHRlbnNpb25zLCBoZWxwZXJzLCBjb21tYW5kcywgZ2VzdHVyZXNDaGFpblRvU3RyaW5nIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VzdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
426
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIl0sIm5hbWVzIjpbImhlbHBlcnMiLCJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJ0b0VsZW1lbnRJZCIsIm9wdHMiLCJlbGVtZW50IiwibG9nIiwiaW5mbyIsImVsIiwiZWxlbWVudElkIiwidXRpbCIsInVud3JhcEVsZW1lbnQiLCJ0b0VsZW1lbnRPckFwcGxpY2F0aW9uSWQiLCJkcml2ZXIiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJtb3ZlVG8iLCJ4b2Zmc2V0IiwieW9mZnNldCIsImlzV2ViQ29udGV4dCIsIngiLCJ5IiwiZ2V0TG9jYXRpb24iLCJjb29yZHMiLCJjdXJXZWJDb29yZHMiLCJhdG9tc0VsZW1lbnQiLCJ1c2VBdG9tc0VsZW1lbnQiLCJyZWxDb29yZHMiLCJleGVjdXRlQXRvbSIsIl8iLCJpc05pbCIsImN1ckNvb3JkcyIsImVycm9ycyIsIlVua25vd25FeGNlcHRpb24iLCJlbFBvcyIsInJlcXVpcmVGbG9hdFBhcmFtZXRlciIsInBhcmFtTmFtZSIsInBhcmFtVmFsdWUiLCJtZXRob2ROYW1lIiwiaXNVbmRlZmluZWQiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInJlc3VsdCIsInBhcnNlRmxvYXQiLCJpc05hTiIsInJlcXVpcmVJbnRQYXJhbWV0ZXIiLCJwYXJzZUludCIsIm1vYmlsZVNoYWtlIiwiaXNTaW11bGF0b3IiLCJVbmtub3duRXJyb3IiLCJkZXZpY2UiLCJzaGFrZSIsImNsaWNrIiwibmF0aXZlQ2xpY2siLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiZGVidWciLCJnZXN0dXJlc0NoYWluVG9TdHJpbmciLCJnZXN0dXJlcyIsImtleXNUb0luY2x1ZGUiLCJtYXAiLCJpdGVtIiwib3RoZXJLZXlzIiwiZGlmZmVyZW5jZSIsImtleXMiLCJpc0FycmF5IiwiaW50ZXJzZWN0aW9uIiwibGVuZ3RoIiwiYWN0aW9uIiwiaXNQbGFpbk9iamVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJqb2luIiwicGVyZm9ybUFjdGlvbnMiLCJhY3Rpb25zIiwicHJlcHJvY2Vzc2VkQWN0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInR5cGUiLCJwYXJhbWV0ZXJzIiwicG9pbnRlclR5cGUiLCJtb2RpZmllZEFjdGlvbiIsImNsb25lIiwiZmlsdGVyIiwiaW5uZXJBY3Rpb24iLCJkdXJhdGlvbiIsInByb3h5Q29tbWFuZCIsInBlcmZvcm1Ub3VjaCIsImUiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInBlcmZvcm1NdWx0aUFjdGlvbiIsImkiLCJlbmRwb2ludCIsIm1vYmlsZVNjcm9sbCIsInN3aXBlIiwicGFyYW1zIiwibmFtZSIsImRpcmVjdGlvbiIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJtc2ciLCJwcmVkaWNhdGVTdHJpbmciLCJ0b1Zpc2libGUiLCJkaXN0YW5jZSIsIm1vYmlsZVN3aXBlIiwibW9iaWxlUGluY2giLCJzY2FsZSIsInZlbG9jaXR5IiwibW9iaWxlRG91YmxlVGFwIiwibW9iaWxlVHdvRmluZ2VyVGFwIiwibW9iaWxlVG91Y2hBbmRIb2xkIiwibW9iaWxlVGFwIiwibW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwiZnJvbVgiLCJmcm9tWSIsInRvWCIsInRvWSIsIm1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMiLCJudW1iZXJPZlRhcHMiLCJudW1iZXJPZlRvdWNoZXMiLCJtb2JpbGVTZWxlY3RQaWNrZXJXaGVlbFZhbHVlIiwiaXNTdHJpbmciLCJvcmRlciIsIm9mZnNldCIsIm1vYmlsZVJvdGF0ZUVsZW1lbnQiLCJyb3RhdGlvbiIsImdldENvb3JkaW5hdGVzIiwiZ2VzdHVyZSIsImNvb3JkaW5hdGVzIiwiYXJlT2Zmc2V0cyIsIm9wdGlvblgiLCJvcHRpb25zIiwib3B0aW9uWSIsInJlY3QiLCJnZXRFbGVtZW50UmVjdCIsInBvcyIsInNpemUiLCJ3Iiwid2lkdGgiLCJoIiwiaGVpZ2h0Iiwib2Zmc2V0WCIsIm9mZnNldFkiLCJhcHBseU1vdmVUb09mZnNldCIsImZpcnN0Q29vcmRpbmF0ZXMiLCJzZWNvbmRDb29yZGluYXRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsT0FBTyxHQUFHLEVBQWhCO0FBQUEsTUFBb0JDLFVBQVUsR0FBRyxFQUFqQztBQUFBLE1BQXFDQyxRQUFRLEdBQUcsRUFBaEQ7Ozs7O0FBRUEsU0FBU0MsV0FBVCxDQUFzQkMsSUFBSSxHQUFHLEVBQTdCLEVBQWlDO0FBQy9CLE1BQUlBLElBQUksQ0FBQ0MsT0FBVCxFQUFrQjtBQUNoQkMsb0JBQUlDLElBQUosQ0FBVSwrRUFBVjtBQUNEOztBQUNELFFBQU1DLEVBQUUsR0FBR0osSUFBSSxDQUFDSyxTQUFMLElBQWtCTCxJQUFJLENBQUNDLE9BQWxDO0FBQ0EsU0FBT0csRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBSCxHQUE0QixJQUFyQztBQUNEOztBQUVELGVBQWVJLHdCQUFmLENBQXlDQyxNQUF6QyxFQUFpRFQsSUFBSSxHQUFHLEVBQXhELEVBQTREO0FBQzFELFNBQU9ELFdBQVcsQ0FBQ0MsSUFBRCxDQUFYLElBQ0ZNLG9CQUFLQyxhQUFMLENBQW1CLE1BQU1FLE1BQU0sQ0FBQ0MsMkJBQVAsQ0FBb0MsWUFBcEMsRUFBa0QsNEJBQWxELEVBQStFLEtBQS9FLENBQXpCLENBREw7QUFFRDs7QUFFRFosUUFBUSxDQUFDYSxNQUFULEdBQWtCLGVBQWVBLE1BQWYsQ0FBdUJQLEVBQXZCLEVBQTJCUSxPQUFPLEdBQUcsQ0FBckMsRUFBd0NDLE9BQU8sR0FBRyxDQUFsRCxFQUFxRDtBQUNyRVQsRUFBQUEsRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBTDs7QUFFQSxNQUFJLEtBQUtVLFlBQUwsRUFBSixFQUF5QjtBQUN2QixRQUFJO0FBQUNDLE1BQUFBLENBQUQ7QUFBSUMsTUFBQUE7QUFBSixRQUFTLE1B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LENBQUM5RyxDQUFaLEdBQWlCZ0gsT0FBTyxJQUFJLENBQTVCO0FBQ0FGLElBQUFBLFdBQVcsQ0FBQzdHLENBQVosR0FBaUJpSCxPQUFPLElBQUksQ0FBNUI7QUFDRDs7QUFDRCxTQUFPSixXQUFQO0FBQ0QsQ0EzQ0Q7O0FBNkNBakksT0FBTyxDQUFDZ0osaUJBQVIsR0FBNEIsU0FBU0EsaUJBQVQsQ0FBNEJDLGdCQUE1QixFQUE4Q0MsaUJBQTlDLEVBQWlFO0FBQzNGLE1BQUlBLGlCQUFpQixDQUFDaEIsVUFBdEIsRUFBa0M7QUFDaEMsV0FBTztBQUNML0csTUFBQUEsQ0FBQyxFQUFFOEgsZ0JBQWdCLENBQUM5SCxDQUFqQixHQUFxQitILGlCQUFpQixDQUFDL0gsQ0FEckM7QUFFTEMsTUFBQUEsQ0FBQyxFQUFFNkgsZ0JBQWdCLENBQUM3SCxDQUFqQixHQUFxQjhILGlCQUFpQixDQUFDOUg7QUFGckMsS0FBUDtBQUlELEdBTEQsTUFLTztBQUNMLFdBQU84SCxpQkFBUDtBQUNEO0FBQ0YsQ0FURDs7QUFXQXRFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjNUUsVUFBZCxFQUEwQkQsT0FBMUIsRUFBbUNFLFFBQW5DO2VBRWVELFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5cblxuY29uc3QgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge30sIGNvbW1hbmRzID0ge307XG5cbmZ1bmN0aW9uIHRvRWxlbWVudElkIChvcHRzID0ge30pIHtcbiAgaWYgKG9wdHMuZWxlbWVudCkge1xuICAgIGxvZy5pbmZvKGBUaGUgJ2VsZW1lbnQnIGFyZ3VtZW50IG5hbWUgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgdXNpbmcgJ2VsZW1lbnRJZCcgaW5zdGVhZGApO1xuICB9XG4gIGNvbnN0IGVsID0gb3B0cy5lbGVtZW50SWQgfHwgb3B0cy5lbGVtZW50O1xuICByZXR1cm4gZWwgPyB1dGlsLnVud3JhcEVsZW1lbnQoZWwpIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9FbGVtZW50T3JBcHBsaWNhdGlvbklkIChkcml2ZXIsIG9wdHMgPSB7fSkge1xuICByZXR1cm4gdG9FbGVtZW50SWQob3B0cylcbiAgICB8fCB1dGlsLnVud3JhcEVsZW1lbnQoYXdhaXQgZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKSk7XG59XG5cbmNvbW1hbmRzLm1vdmVUbyA9IGFzeW5jIGZ1bmN0aW9uIG1vdmVUbyAoZWwsIHhvZmZzZXQgPSAwLCB5b2Zmc2V0ID0gMCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG5cbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBsZXQge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgbGV0IGNvb3JkcyA9IHtcbiAgICAgIHg6IHggKyB4b2Zmc2V0LFxuICAgICAgeTogeSArIHlvZmZzZXRcbiAgICB9O1xuICAgIHRoaXMuY3VyV2ViQ29vcmRzID0gY29vcmRzO1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IHJlbENvb3JkcyA9IHt4OiB4b2Zmc2V0LCB5OiB5b2Zmc2V0fTtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdtb3ZlX21vdXNlJywgW2F0b21zRWxlbWVudCwgcmVsQ29vcmRzXSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKF8uaXNOaWwoZWwpKSB7XG4gICAgICBpZiAoIXRoaXMuY3VyQ29vcmRzKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkV4Y2VwdGlvbihcbiAgICAgICAgICAnQ3VycmVudCBjdXJzb3IgcG9zaXRpb24gdW5rbm93biwgcGxlYXNlIHVzZSBtb3ZlVG8gd2l0aCBhbiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJDb29yZHMgPSB7XG4gICAgICAgIHg6IHRoaXMuY3VyQ29vcmRzLnggKyB4b2Zmc2V0LFxuICAgICAgICB5OiB0aGlzLmN1ckNvb3Jkcy55ICsgeW9mZnNldFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsUG9zID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgICB0aGlzLmN1ckNvb3JkcyA9IHtcbiAgICAgICAgeDogZWxQb3MueCArIHhvZmZzZXQsXG4gICAgICAgIHk6IGVsUG9zLnkgKyB5b2Zmc2V0XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gcmVxdWlyZUZsb2F0UGFyYW1ldGVyIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1WYWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBcIiR7cGFyYW1OYW1lfVwiIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIFwiJHttZXRob2ROYW1lfVwiIGNhbGxgKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHBhcmFtVmFsdWUpO1xuICBpZiAoaXNOYU4ocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIHNob3VsZCBiZSBhIHZhbGlkIG51bWJlci4gXCIke3BhcmFtVmFsdWV9XCIgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVJbnRQYXJhbWV0ZXIgKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbVZhbHVlKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgXCIke21ldGhvZE5hbWV9XCIgY2FsbGApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHBhcmFtVmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBcIiR7cGFyYW1OYW1lfVwiIHBhcmFtZXRlciBzaG91bGQgYmUgYSB2YWxpZCBpbnRlZ2VyLiBcIiR7cGFyYW1WYWx1ZX1cIiBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29tbWFuZHMubW9iaWxlU2hha2UgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTaGFrZSAoKSB7XG4gIGlmICghdGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoJ1NoYWtlIGlzIG5vdCBzdXBwb3J0ZWQgb24gcmVhbCBkZXZpY2VzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5vcHRzLmRldmljZS5zaGFrZSgpO1xufTtcblxuY29tbWFuZHMuY2xpY2sgPSBhc3luYyBmdW5jdGlvbiBjbGljayAoZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIGNvbW1hbmRzIHRoYXQgbWFwIGhlcmUsIHNvIG1hbnVhbGx5IHByb3h5XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubmF0aXZlQ2xpY2soZWwpO1xuICB9XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKChhd2FpdCB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCkpLm5hdGl2ZVdlYlRhcCB8fCAoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXBTdHJpY3QpIHtcbiAgICAvLyBhdG9tcy1iYXNlZCBjbGlja3MgZG9uJ3QgYWx3YXlzIHdvcmsgaW4gc2FmYXJpIDdcbiAgICBsb2cuZGVidWcoJ1VzaW5nIG5hdGl2ZSB3ZWIgdGFwJyk7XG4gICAgYXdhaXQgdGhpcy5uYXRpdmVXZWJUYXAoZWwpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnY2xpY2snLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdlc3R1cmVzQ2hhaW5Ub1N0cmluZyAoZ2VzdHVyZXMsIGtleXNUb0luY2x1ZGUgPSBbJ29wdGlvbnMnXSkge1xuICByZXR1cm4gZ2VzdHVyZXMubWFwKChpdGVtKSA9PiB7XG4gICAgbGV0IG90aGVyS2V5cyA9IF8uZGlmZmVyZW5jZShfLmtleXMoaXRlbSksIFsnYWN0aW9uJ10pO1xuICAgIG90aGVyS2V5cyA9IF8uaXNBcnJheShrZXlzVG9JbmNsdWRlKSA/IF8uaW50ZXJzZWN0aW9uKG90aGVyS2V5cywga2V5c1RvSW5jbHVkZSkgOiBvdGhlcktleXM7XG4gICAgaWYgKG90aGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBgJHtpdGVtLmFjdGlvbn1gICtcbiAgICAgICAgYCgke18ubWFwKG90aGVyS2V5cywgKHgpID0+IHggKyAnPScgKyAoXy5pc1BsYWluT2JqZWN0KGl0ZW1beF0pID8gSlNPTi5zdHJpbmdpZnkoaXRlbVt4XSkgOiBpdGVtW3hdKSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW0uYWN0aW9uO1xuICB9KS5qb2luKCctJyk7XG59XG5cbmNvbW1hbmRzLnBlcmZvcm1BY3Rpb25zID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbnMgKGFjdGlvbnMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIFczQyBhY3Rpb25zOiAke0pTT04uc3RyaW5naWZ5KGFjdGlvbnMsIG51bGwsICcgICcpfWApO1xuICAvLyBUaGlzIGlzIG1hbmRhdG9yeSwgc2luY2UgV0RBIG9ubHkgc3VwcG9ydHMgVE9VQ0ggcG9pbnRlciB0eXBlXG4gIC8vIGFuZCBTZWxlbml1bSBBUEkgdXNlcyBNT1VTRSBhcyB0aGUgZGVmYXVsdCBvbmVcbiAgY29uc3QgcHJlcHJvY2Vzc2VkQWN0aW9ucyA9IGFjdGlvbnNcbiAgICAubWFwKChhY3Rpb24pID0+IE9iamVjdC5hc3NpZ24oe30sIGFjdGlvbiwgYWN0aW9uLnR5cGUgPT09ICdwb2ludGVyJyA/IHtcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcG9pbnRlclR5cGU6ICd0b3VjaCdcbiAgICAgIH1cbiAgICB9IDoge30pKVxuICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3QgbW9kaWZpZWRBY3Rpb24gPSBfLmNsb25lKGFjdGlvbikgfHwge307XG4gICAgICAvLyBTZWxlbml1bSBBUEkgdW5leHBlY3RlZGx5IGluc2VydHMgemVybyBwYXVzZXMsIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFdEQVxuICAgICAgbW9kaWZpZWRBY3Rpb24uYWN0aW9ucyA9IChhY3Rpb24uYWN0aW9ucyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcigoaW5uZXJBY3Rpb24pID0+ICEoaW5uZXJBY3Rpb24udHlwZSA9PT0gJ3BhdXNlJyAmJiBpbm5lckFjdGlvbi5kdXJhdGlvbiA9PT0gMCkpO1xuICAgICAgcmV0dXJuIG1vZGlmaWVkQWN0aW9uO1xuICAgIH0pO1xuICBsb2cuZGVidWcoYFByZXByb2Nlc3NlZCBhY3Rpb25zOiAke0pTT04uc3RyaW5naWZ5KHByZXByb2Nlc3NlZEFjdGlvbnMsIG51bGwsICcgICcpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy9hY3Rpb25zJywgJ1BPU1QnLCB7YWN0aW9uczogcHJlcHJvY2Vzc2VkQWN0aW9uc30pO1xufTtcblxuY29tbWFuZHMucGVyZm9ybVRvdWNoID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybVRvdWNoIChnZXN0dXJlcykge1xuICBsb2cuZGVidWcoYFJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdG91Y2ggYWN0aW9uOiAke2dlc3R1cmVzQ2hhaW5Ub1N0cmluZyhnZXN0dXJlcyl9YCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoL3BlcmZvcm0nLCAnUE9TVCcsIHthY3Rpb25zOiBnZXN0dXJlc30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnVGhlIFRvdWNoIEFQSSBpcyBhaW1lZCBmb3IgdXNhZ2UgaW4gTkFUSVZFIGNvbnRleHQuICcgK1xuICAgICAgJ0NvbnNpZGVyIHVzaW5nIFwiZXhlY3V0ZVwiIEFQSSB3aXRoIGN1c3RvbSBldmVudHMgdHJpZ2dlciBzY3JpcHQgJyArXG4gICAgICBgdG8gZW11bGF0ZSB0b3VjaCBldmVudHMgYmVpbmcgaW4gV0VCVklFVyBjb250ZXh0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1NdWx0aUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1NdWx0aUFjdGlvbiAoYWN0aW9ucykge1xuICBsb2cuZGVidWcoYFJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgbXVsdGkgdG91Y2ggYWN0aW9uOmApO1xuICBmb3IgKGxldCBpIGluIGFjdGlvbnMpIHtcbiAgICBsb2cuZGVidWcoYCAgICAke3BhcnNlSW50KGksIDEwKSArIDF9OiAke18ubWFwKGFjdGlvbnNbaV0sICdhY3Rpb24nKS5qb2luKCctJyl9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy93ZGEvdG91Y2gvbXVsdGkvcGVyZm9ybScsICdQT1NUJywge2FjdGlvbnN9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBNdWx0aVRvdWNoIEFQSSBpcyBhaW1lZCBmb3IgdXNhZ2UgaW4gTkFUSVZFIGNvbnRleHQuICcgK1xuICAgICAgJ0NvbnNpZGVyIHVzaW5nIFwiZXhlY3V0ZVwiIEFQSSB3aXRoIGN1c3RvbSBldmVudHMgdHJpZ2dlciBzY3JpcHQgJyArXG4gICAgICBgdG8gZW11bGF0ZSBtdWx0aXRvdWNoIGV2ZW50cyBiZWluZyBpbiBXRUJWSUVXIGNvbnRleHQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuY29tbWFuZHMubmF0aXZlQ2xpY2sgPSBhc3luYyBmdW5jdGlvbiBuYXRpdmVDbGljayAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBsZXQgZW5kcG9pbnQgPSBgL2VsZW1lbnQvJHtlbH0vY2xpY2tgO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoZW5kcG9pbnQsICdQT1NUJywge30pO1xufTtcblxuLypcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svV2ViRHJpdmVyQWdlbnQvYmxvYi9tYXN0ZXIvV2ViRHJpdmVyQWdlbnRMaWIvQ29tbWFuZHMvRkJFbGVtZW50Q29tbWFuZHMubVxuICogdG8gZ2V0IHRoZSBpbmZvIGFib3V0IGF2YWlsYWJsZSBXREEgZ2VzdHVyZXMgQVBJXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9yZWZlcmVuY2UveGN0ZXN0L3hjdWllbGVtZW50IGFuZFxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3JlZmVyZW5jZS94Y3Rlc3QveGN1aWNvb3JkaW5hdGUgdG8gZ2V0IHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZlxuICogYWxsIFhDVGVzdCBnZXN0dXJlc1xuKi9cblxuaGVscGVycy5tb2JpbGVTY3JvbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGwgKG9wdHMgPSB7fSwgc3dpcGUgPSBmYWxzZSkge1xuICAvLyBXREEgc3VwcG9ydHMgZm91ciBzY3JvbGxpbmcgc3RyYXRlZ2llczogcHJlZGljYXRpb24gYmFzZWQgb24gbmFtZSwgZGlyZWN0aW9uLFxuICAvLyBwcmVkaWNhdGVTdHJpbmcsIGFuZCB0b1Zpc2libGUsIGluIHRoYXQgb3JkZXIuIFN3aXBpbmcgcmVxdWlyZXMgZGlyZWN0aW9uLlxuICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgaWYgKG9wdHMubmFtZSAmJiAhc3dpcGUpIHtcbiAgICBwYXJhbXMubmFtZSA9IG9wdHMubmFtZTtcbiAgfSBlbHNlIGlmIChvcHRzLmRpcmVjdGlvbikge1xuICAgIGlmICghWyd1cCcsICdkb3duJywgJ2xlZnQnLCAncmlnaHQnXS5pbmNsdWRlcyhvcHRzLmRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgbGV0IG1zZyA9ICdEaXJlY3Rpb24gbXVzdCBiZSB1cCwgZG93biwgbGVmdCBvciByaWdodCc7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICAgIH1cbiAgICBwYXJhbXMuZGlyZWN0aW9uID0gb3B0cy5kaXJlY3Rpb247XG4gIH0gZWxzZSBpZiAob3B0cy5wcmVkaWNhdGVTdHJpbmcgJiYgIXN3aXBlKSB7XG4gICAgcGFyYW1zLnByZWRpY2F0ZVN0cmluZyA9IG9wdHMucHJlZGljYXRlU3RyaW5nO1xuICB9IGVsc2UgaWYgKG9wdHMudG9WaXNpYmxlICYmICFzd2lwZSkge1xuICAgIHBhcmFtcy50b1Zpc2libGUgPSBvcHRzLnRvVmlzaWJsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtc2cgPSBzd2lwZVxuICAgICAgPyAnTW9iaWxlIHN3aXBlIHJlcXVpcmVzIGRpcmVjdGlvbidcbiAgICAgIDogJ01vYmlsZSBzY3JvbGwgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOiBuYW1lLCBkaXJlY3Rpb24sIHByZWRpY2F0ZVN0cmluZywgYW5kIHRvVmlzaWJsZS4gU3BlY2lmeSBvbmUgb2YgdGhlc2UnO1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IobXNnKTtcbiAgfVxuXG4gIC8vIHdlIGNhbiBhbHNvIG9wdGlvbmFsbHkgcGFzcyBhIGRpc3RhbmNlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSByYXRpbyBvZlxuICAvLyBzY3JlZW4gaGVpZ2h0LCBzbyAxLjAgbWVhbnMgYSBmdWxsIHNjcmVlbidzIHdvcnRoIG9mIHNjcm9sbGluZ1xuICBpZiAoIXN3aXBlICYmIG9wdHMuZGlzdGFuY2UpIHtcbiAgICBwYXJhbXMuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudElkID0gYXdhaXQgdG9FbGVtZW50T3JBcHBsaWNhdGlvbklkKHRoaXMsIG9wdHMpO1xuICBjb25zdCBlbmRwb2ludCA9IGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9LyR7c3dpcGUgPyAnc3dpcGUnIDogJ3Njcm9sbCd9YDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVN3aXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5tb2JpbGVTY3JvbGwob3B0cywgdHJ1ZSk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVBpbmNoID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2ggKG9wdHMgPSB7fSkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgc2NhbGU6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignc2NhbGUnLCBvcHRzLnNjYWxlLCAncGluY2gnKSxcbiAgICB2ZWxvY2l0eTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd2ZWxvY2l0eScsIG9wdHMudmVsb2NpdHksICdwaW5jaCcpXG4gIH07XG4gIGNvbnN0IGVsZW1lbnRJZCA9IGF3YWl0IHRvRWxlbWVudE9yQXBwbGljYXRpb25JZCh0aGlzLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3BpbmNoYCwgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuaGVscGVycy5tb2JpbGVEb3VibGVUYXAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEb3VibGVUYXAgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKGVsZW1lbnRJZCkge1xuICAgIC8vIERvdWJsZSB0YXAgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWxlbWVudElkfS9kb3VibGVUYXBgLCAnUE9TVCcpO1xuICB9XG4gIC8vIERvdWJsZSB0YXAgY29vcmRpbmF0ZXNcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIG9wdHMueCwgJ2RvdWJsZVRhcCcpLFxuICAgIHk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneScsIG9wdHMueSwgJ2RvdWJsZVRhcCcpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9kb3VibGVUYXAnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVR3b0ZpbmdlclRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVR3b0ZpbmdlclRhcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IGVsZW1lbnRJZCA9IGF3YWl0IHRvRWxlbWVudE9yQXBwbGljYXRpb25JZCh0aGlzLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3R3b0ZpbmdlclRhcGAsICdQT1NUJyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRvdWNoQW5kSG9sZCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRvdWNoQW5kSG9sZCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBkdXJhdGlvbjogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdkdXJhdGlvbicsIG9wdHMuZHVyYXRpb24sICd0b3VjaEFuZEhvbGQnKVxuICB9O1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKGVsZW1lbnRJZCkge1xuICAgIC8vIExvbmcgdGFwIGVsZW1lbnRcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsZW1lbnRJZH0vdG91Y2hBbmRIb2xkYCwgJ1BPU1QnLCBwYXJhbXMpO1xuICB9XG4gIC8vIExvbmcgdGFwIGNvb3JkaW5hdGVzXG4gIHBhcmFtcy54ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd4Jywgb3B0cy54LCAndG91Y2hBbmRIb2xkJyk7XG4gIHBhcmFtcy55ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd5Jywgb3B0cy55LCAndG91Y2hBbmRIb2xkJyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS90b3VjaEFuZEhvbGQnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRhcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICB4OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3gnLCBvcHRzLngsICd0YXAnKSxcbiAgICB5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBvcHRzLnksICd0YXAnKVxuICB9O1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKSB8fCAnMCc7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS90YXAvJHtlbGVtZW50SWR9YCwgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuaGVscGVycy5tb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgZHVyYXRpb246IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZHVyYXRpb24nLCBvcHRzLmR1cmF0aW9uLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgZnJvbVg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZnJvbVgnLCBvcHRzLmZyb21YLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgZnJvbVk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZnJvbVknLCBvcHRzLmZyb21ZLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgdG9YOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3RvWCcsIG9wdHMudG9YLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgdG9ZOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3RvWScsIG9wdHMudG9ZLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJylcbiAgfTtcbiAgY29uc3QgZWxlbWVudElkID0gdG9FbGVtZW50SWQob3B0cyk7XG4gIHJldHVybiBlbGVtZW50SWRcbiAgICAvLyBEcmFnIGVsZW1lbnRcbiAgICA/IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L2RyYWdmcm9tdG9mb3JkdXJhdGlvbmAsICdQT1NUJywgcGFyYW1zKVxuICAgIC8vIERyYWcgY29vcmRpbmF0ZXNcbiAgICA6IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL2RyYWdmcm9tdG9mb3JkdXJhdGlvbicsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVGFwV2l0aE51bWJlck9mVGFwcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3IgdGFwV2l0aE51bWJlck9mVGFwcyBtZXRob2QnKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgbnVtYmVyT2ZUYXBzOiByZXF1aXJlSW50UGFyYW1ldGVyKCdudW1iZXJPZlRhcHMnLCBvcHRzLm51bWJlck9mVGFwcywgJ3RhcFdpdGhOdW1iZXJPZlRhcHMnKSxcbiAgICBudW1iZXJPZlRvdWNoZXM6IHJlcXVpcmVJbnRQYXJhbWV0ZXIoJ251bWJlck9mVG91Y2hlcycsIG9wdHMubnVtYmVyT2ZUb3VjaGVzLCAndGFwV2l0aE51bWJlck9mVGFwcycpLFxuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsZW1lbnRJZH0vdGFwV2l0aE51bWJlck9mVGFwc2AsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igc2VsZWN0UGlja2VyV2hlZWxWYWx1ZSBtZXRob2QnKTtcbiAgfVxuICBpZiAoIV8uaXNTdHJpbmcob3B0cy5vcmRlcikgfHwgIVsnbmV4dCcsICdwcmV2aW91cyddLmluY2x1ZGVzKG9wdHMub3JkZXIudG9Mb3dlckNhc2UoKSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgbWFuZGF0b3J5ICdvcmRlcicgcGFyYW1ldGVyIGlzIGV4cGVjdGVkIHRvIGJlIGVxdWFsIGVpdGhlciB0byAnbmV4dCcgb3IgJ3ByZXZpb3VzJy4gYCArXG4gICAgICBgJyR7b3B0cy5vcmRlcn0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7b3JkZXI6IG9wdHMub3JkZXJ9O1xuICBpZiAob3B0cy5vZmZzZXQpIHtcbiAgICBwYXJhbXMub2Zmc2V0ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdvZmZzZXQnLCBvcHRzLm9mZnNldCwgJ3NlbGVjdFBpY2tlcldoZWVsVmFsdWUnKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvcGlja2Vyd2hlZWwvJHtlbGVtZW50SWR9L3NlbGVjdGAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlUm90YXRlRWxlbWVudCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJvdGF0ZUVsZW1lbnQgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igcm90YXRlRWxlbWVudCBtZXRob2QnKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgcm90YXRpb246IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigncm90YXRpb24nLCBvcHRzLnJvdGF0aW9uLCAncm90YXRlRWxlbWVudCcpLFxuICAgIHZlbG9jaXR5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3ZlbG9jaXR5Jywgb3B0cy52ZWxvY2l0eSwgJ3JvdGF0ZUVsZW1lbnQnKSxcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JvdGF0ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q29vcmRpbmF0ZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29yZGluYXRlcyAoZ2VzdHVyZSkge1xuICAvLyBkZWZhdWx0c1xuICBsZXQgY29vcmRpbmF0ZXMgPSB7eDogMCwgeTogMCwgYXJlT2Zmc2V0czogZmFsc2V9O1xuXG4gIGxldCBvcHRpb25YID0gbnVsbDtcbiAgaWYgKGdlc3R1cmUub3B0aW9ucy54KSB7XG4gICAgb3B0aW9uWCA9IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIGdlc3R1cmUub3B0aW9ucy54LCAnZ2V0Q29vcmRpbmF0ZXMnKTtcbiAgfVxuICBsZXQgb3B0aW9uWSA9IG51bGw7XG4gIGlmIChnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgIG9wdGlvblkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBnZXN0dXJlLm9wdGlvbnMueSwgJ2dldENvb3JkaW5hdGVzJyk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IHRoZSBlbGVtZW50IGNvb3JkaW5hdGVzLlxuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChnZXN0dXJlLm9wdGlvbnMpO1xuICBpZiAoZWxlbWVudElkKSB7XG4gICAgbGV0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsZW1lbnRJZCk7XG4gICAgbGV0IHBvcyA9IHt4OiByZWN0LngsIHk6IHJlY3QueX07XG4gICAgbGV0IHNpemUgPSB7dzogcmVjdC53aWR0aCwgaDogcmVjdC5oZWlnaHR9O1xuXG4gICAgLy8gZGVmYXVsdHNcbiAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgLy8gZ2V0IHRoZSByZWFsIG9mZnNldHNcbiAgICBpZiAob3B0aW9uWCB8fCBvcHRpb25ZKSB7XG4gICAgICBvZmZzZXRYID0gKG9wdGlvblggfHwgMCk7XG4gICAgICBvZmZzZXRZID0gKG9wdGlvblkgfHwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldFggPSAoc2l6ZS53IC8gMik7XG4gICAgICBvZmZzZXRZID0gKHNpemUuaCAvIDIpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHRoZSBvZmZzZXRzXG4gICAgY29vcmRpbmF0ZXMueCA9IHBvcy54ICsgb2Zmc2V0WDtcbiAgICBjb29yZGluYXRlcy55ID0gcG9zLnkgKyBvZmZzZXRZO1xuICB9IGVsc2Uge1xuICAgIC8vIG1vdmVUbyBjb29yZGluYXRlcyBhcmUgcGFzc2VkIGluIGFzIG9mZnNldHNcbiAgICBjb29yZGluYXRlcy5hcmVPZmZzZXRzID0gKGdlc3R1cmUuYWN0aW9uID09PSAnbW92ZVRvJyk7XG4gICAgY29vcmRpbmF0ZXMueCA9IChvcHRpb25YIHx8IDApO1xuICAgIGNvb3JkaW5hdGVzLnkgPSAob3B0aW9uWSB8fCAwKTtcbiAgfVxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59O1xuXG5oZWxwZXJzLmFwcGx5TW92ZVRvT2Zmc2V0ID0gZnVuY3Rpb24gYXBwbHlNb3ZlVG9PZmZzZXQgKGZpcnN0Q29vcmRpbmF0ZXMsIHNlY29uZENvb3JkaW5hdGVzKSB7XG4gIGlmIChzZWNvbmRDb29yZGluYXRlcy5hcmVPZmZzZXRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGZpcnN0Q29vcmRpbmF0ZXMueCArIHNlY29uZENvb3JkaW5hdGVzLngsXG4gICAgICB5OiBmaXJzdENvb3JkaW5hdGVzLnkgKyBzZWNvbmRDb29yZGluYXRlcy55LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlY29uZENvb3JkaW5hdGVzO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGhlbHBlcnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGV4dGVuc2lvbnMsIGhlbHBlcnMsIGNvbW1hbmRzLCBnZXN0dXJlc0NoYWluVG9TdHJpbmcgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -40,7 +40,7 @@ commands.getName = async function getName (el) {
40
40
  el = util.unwrapElement(el);
41
41
  if (this.isWebContext()) {
42
42
  const atomsElement = this.useAtomsElement(el);
43
- const script = 'return arguments[0].tagName';
43
+ const script = 'return arguments[0].tagName.toLowerCase()';
44
44
  return await this.executeAtom('execute_script', [script, [atomsElement]]);
45
45
  }
46
46
 
@@ -6,6 +6,19 @@ import log from '../logger';
6
6
 
7
7
  const helpers = {}, extensions = {}, commands = {};
8
8
 
9
+ function toElementId (opts = {}) {
10
+ if (opts.element) {
11
+ log.info(`The 'element' argument name is deprecated. Consider using 'elementId' instead`);
12
+ }
13
+ const el = opts.elementId || opts.element;
14
+ return el ? util.unwrapElement(el) : null;
15
+ }
16
+
17
+ async function toElementOrApplicationId (driver, opts = {}) {
18
+ return toElementId(opts)
19
+ || util.unwrapElement(await driver.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false));
20
+ }
21
+
9
22
  commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
10
23
  el = util.unwrapElement(el);
11
24
 
@@ -20,7 +33,7 @@ commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
20
33
  let relCoords = {x: xoffset, y: yoffset};
21
34
  await this.executeAtom('move_mouse', [atomsElement, relCoords]);
22
35
  } else {
23
- if (_.isNull(el) || _.isUndefined(el)) {
36
+ if (_.isNil(el)) {
24
37
  if (!this.curCoords) {
25
38
  throw new errors.UnknownException(
26
39
  'Current cursor position unknown, please use moveTo with an element the first time.');
@@ -41,22 +54,22 @@ commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
41
54
 
42
55
  function requireFloatParameter (paramName, paramValue, methodName) {
43
56
  if (_.isUndefined(paramValue)) {
44
- log.errorAndThrow(`"${paramName}" parameter is mandatory for "${methodName}" call`);
57
+ throw new errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
45
58
  }
46
59
  const result = parseFloat(paramValue);
47
60
  if (isNaN(result)) {
48
- log.errorAndThrow(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
61
+ throw new errors.InvalidArgumentError(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
49
62
  }
50
63
  return result;
51
64
  }
52
65
 
53
66
  function requireIntParameter (paramName, paramValue, methodName) {
54
67
  if (_.isUndefined(paramValue)) {
55
- log.errorAndThrow(`"${paramName}" parameter is mandatory for "${methodName}" call`);
68
+ throw new errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
56
69
  }
57
70
  const result = parseInt(paramValue, 10);
58
71
  if (isNaN(result)) {
59
- log.errorAndThrow(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
72
+ throw new errors.InvalidArgumentError(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
60
73
  }
61
74
  return result;
62
75
  }
@@ -164,12 +177,9 @@ commands.nativeClick = async function nativeClick (el) {
164
177
  */
165
178
 
166
179
  helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
167
- if (!opts.element) {
168
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
169
- }
170
180
  // WDA supports four scrolling strategies: predication based on name, direction,
171
181
  // predicateString, and toVisible, in that order. Swiping requires direction.
172
- let params = {};
182
+ const params = {};
173
183
  if (opts.name && !swipe) {
174
184
  params.name = opts.name;
175
185
  } else if (opts.direction) {
@@ -183,10 +193,10 @@ helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
183
193
  } else if (opts.toVisible && !swipe) {
184
194
  params.toVisible = opts.toVisible;
185
195
  } else {
186
- let msg = swipe
196
+ const msg = swipe
187
197
  ? 'Mobile swipe requires direction'
188
198
  : 'Mobile scroll supports the following strategies: name, direction, predicateString, and toVisible. Specify one of these';
189
- log.errorAndThrow(msg);
199
+ throw new errors.InvalidArgumentError(msg);
190
200
  }
191
201
 
192
202
  // we can also optionally pass a distance which appears to be a ratio of
@@ -195,8 +205,8 @@ helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
195
205
  params.distance = opts.distance;
196
206
  }
197
207
 
198
- let element = util.unwrapElement(opts.element);
199
- let endpoint = `/wda/element/${element}/${swipe ? 'swipe' : 'scroll'}`;
208
+ const elementId = await toElementOrApplicationId(this, opts);
209
+ const endpoint = `/wda/element/${elementId}/${swipe ? 'swipe' : 'scroll'}`;
200
210
  return await this.proxyCommand(endpoint, 'POST', params);
201
211
  };
202
212
 
@@ -205,22 +215,19 @@ helpers.mobileSwipe = async function mobileSwipe (opts = {}) {
205
215
  };
206
216
 
207
217
  helpers.mobilePinch = async function mobilePinch (opts = {}) {
208
- if (!opts.element) {
209
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
210
- }
211
218
  const params = {
212
219
  scale: requireFloatParameter('scale', opts.scale, 'pinch'),
213
220
  velocity: requireFloatParameter('velocity', opts.velocity, 'pinch')
214
221
  };
215
- const el = util.unwrapElement(opts.element);
216
- return await this.proxyCommand(`/wda/element/${el}/pinch`, 'POST', params);
222
+ const elementId = await toElementOrApplicationId(this, opts);
223
+ return await this.proxyCommand(`/wda/element/${elementId}/pinch`, 'POST', params);
217
224
  };
218
225
 
219
226
  helpers.mobileDoubleTap = async function mobileDoubleTap (opts = {}) {
220
- if (opts.element) {
227
+ const elementId = toElementId(opts);
228
+ if (elementId) {
221
229
  // Double tap element
222
- const el = util.unwrapElement(opts.element);
223
- return await this.proxyCommand(`/wda/element/${el}/doubleTap`, 'POST');
230
+ return await this.proxyCommand(`/wda/element/${elementId}/doubleTap`, 'POST');
224
231
  }
225
232
  // Double tap coordinates
226
233
  const params = {
@@ -231,21 +238,18 @@ helpers.mobileDoubleTap = async function mobileDoubleTap (opts = {}) {
231
238
  };
232
239
 
233
240
  helpers.mobileTwoFingerTap = async function mobileTwoFingerTap (opts = {}) {
234
- if (!opts.element) {
235
- opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
236
- }
237
- const el = util.unwrapElement(opts.element);
238
- return await this.proxyCommand(`/wda/element/${el}/twoFingerTap`, 'POST');
241
+ const elementId = await toElementOrApplicationId(this, opts);
242
+ return await this.proxyCommand(`/wda/element/${elementId}/twoFingerTap`, 'POST');
239
243
  };
240
244
 
241
245
  helpers.mobileTouchAndHold = async function mobileTouchAndHold (opts = {}) {
242
- let params = {
246
+ const params = {
243
247
  duration: requireFloatParameter('duration', opts.duration, 'touchAndHold')
244
248
  };
245
- if (opts.element) {
249
+ const elementId = toElementId(opts);
250
+ if (elementId) {
246
251
  // Long tap element
247
- const el = util.unwrapElement(opts.element);
248
- return await this.proxyCommand(`/wda/element/${el}/touchAndHold`, 'POST', params);
252
+ return await this.proxyCommand(`/wda/element/${elementId}/touchAndHold`, 'POST', params);
249
253
  }
250
254
  // Long tap coordinates
251
255
  params.x = requireFloatParameter('x', opts.x, 'touchAndHold');
@@ -258,8 +262,8 @@ helpers.mobileTap = async function mobileTap (opts = {}) {
258
262
  x: requireFloatParameter('x', opts.x, 'tap'),
259
263
  y: requireFloatParameter('y', opts.y, 'tap')
260
264
  };
261
- const el = opts.element ? (util.unwrapElement(opts.element)) : '0';
262
- return await this.proxyCommand(`/wda/tap/${el}`, 'POST', params);
265
+ const elementId = toElementId(opts) || '0';
266
+ return await this.proxyCommand(`/wda/tap/${elementId}`, 'POST', params);
263
267
  };
264
268
 
265
269
  helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration (opts = {}) {
@@ -270,58 +274,55 @@ helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration
270
274
  toX: requireFloatParameter('toX', opts.toX, 'dragFromToForDuration'),
271
275
  toY: requireFloatParameter('toY', opts.toY, 'dragFromToForDuration')
272
276
  };
273
- if (opts.element) {
277
+ const elementId = toElementId(opts);
278
+ return elementId
274
279
  // Drag element
275
- const el = util.unwrapElement(opts.element);
276
- return await this.proxyCommand(`/wda/element/${el}/dragfromtoforduration`, 'POST', params);
277
- }
278
- // Drag coordinates
279
- return await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
280
+ ? await this.proxyCommand(`/wda/element/${elementId}/dragfromtoforduration`, 'POST', params)
281
+ // Drag coordinates
282
+ : await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
280
283
  };
281
284
 
282
285
  helpers.mobileTapWithNumberOfTaps = async function mobileTapWithNumberOfTaps (opts = {}) {
283
- if (!opts.element) {
284
- log.errorAndThrow('Element id is expected to be set for tapWithNumberOfTaps method');
286
+ const elementId = toElementId(opts);
287
+ if (!elementId) {
288
+ throw new errors.InvalidArgumentError('Element id is expected to be set for tapWithNumberOfTaps method');
285
289
  }
286
290
  const params = {
287
291
  numberOfTaps: requireIntParameter('numberOfTaps', opts.numberOfTaps, 'tapWithNumberOfTaps'),
288
292
  numberOfTouches: requireIntParameter('numberOfTouches', opts.numberOfTouches, 'tapWithNumberOfTaps'),
289
293
  };
290
- const el = util.unwrapElement(opts.element);
291
- return await this.proxyCommand(`/wda/element/${el}/tapWithNumberOfTaps`, 'POST', params);
294
+ return await this.proxyCommand(`/wda/element/${elementId}/tapWithNumberOfTaps`, 'POST', params);
292
295
  };
293
296
 
294
297
  helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelValue (opts = {}) {
295
- if (!opts.element) {
296
- log.errorAndThrow('Element id is expected to be set for selectPickerWheelValue method');
298
+ const elementId = toElementId(opts);
299
+ if (!elementId) {
300
+ throw new errors.InvalidArgumentError('Element id is expected to be set for selectPickerWheelValue method');
297
301
  }
298
302
  if (!_.isString(opts.order) || !['next', 'previous'].includes(opts.order.toLowerCase())) {
299
- log.errorAndThrow(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` +
300
- `'${opts.order}' is given instead`);
303
+ throw new errors.InvalidArgumentError(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` +
304
+ `'${opts.order}' is given instead`);
301
305
  }
302
- const el = util.unwrapElement(opts.element);
303
306
  const params = {order: opts.order};
304
307
  if (opts.offset) {
305
308
  params.offset = requireFloatParameter('offset', opts.offset, 'selectPickerWheelValue');
306
309
  }
307
- return await this.proxyCommand(`/wda/pickerwheel/${el}/select`, 'POST', params);
310
+ return await this.proxyCommand(`/wda/pickerwheel/${elementId}/select`, 'POST', params);
308
311
  };
309
312
 
310
313
  helpers.mobileRotateElement = async function mobileRotateElement (opts = {}) {
311
- if (!opts.element) {
312
- log.errorAndThrow('Element id is expected to be set for rotateElement method');
314
+ const elementId = toElementId(opts);
315
+ if (!elementId) {
316
+ throw new errors.InvalidArgumentError('Element id is expected to be set for rotateElement method');
313
317
  }
314
- const el = util.unwrapElement(opts.element);
315
318
  const params = {
316
319
  rotation: requireFloatParameter('rotation', opts.rotation, 'rotateElement'),
317
320
  velocity: requireFloatParameter('velocity', opts.velocity, 'rotateElement'),
318
321
  };
319
- return await this.proxyCommand(`/wda/element/${el}/rotate`, 'POST', params);
322
+ return await this.proxyCommand(`/wda/element/${elementId}/rotate`, 'POST', params);
320
323
  };
321
324
 
322
325
  helpers.getCoordinates = async function getCoordinates (gesture) {
323
- let el = gesture.options.element;
324
-
325
326
  // defaults
326
327
  let coordinates = {x: 0, y: 0, areOffsets: false};
327
328
 
@@ -335,8 +336,9 @@ helpers.getCoordinates = async function getCoordinates (gesture) {
335
336
  }
336
337
 
337
338
  // figure out the element coordinates.
338
- if (el) {
339
- let rect = await this.getElementRect(el);
339
+ const elementId = toElementId(gesture.options);
340
+ if (elementId) {
341
+ let rect = await this.getElementRect(elementId);
340
342
  let pos = {x: rect.x, y: rect.y};
341
343
  let size = {w: rect.width, h: rect.height};
342
344
 
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "3.46.0",
11
+ "version": "3.46.1",
12
12
  "author": "appium",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {
@@ -27,7 +27,10 @@
27
27
  "platformNames": [
28
28
  "iOS"
29
29
  ],
30
- "mainClass": "XCUITestDriver"
30
+ "mainClass": "XCUITestDriver",
31
+ "scripts": {
32
+ "build-wda": "./node_modules/appium-webdriveragent/Scripts/build-webdriveragent.js"
33
+ }
31
34
  },
32
35
  "main": "./build/index.js",
33
36
  "bin": {},
@@ -114,7 +117,7 @@
114
117
  "pngjs": "^6.0.0",
115
118
  "pre-commit": "^1.1.3",
116
119
  "semantic-release": "^17.1.2",
117
- "sinon": "^10.0.0",
120
+ "sinon": "^11.0.0",
118
121
  "wd": "^1.5.0"
119
122
  }
120
123
  }