@sapui5/sap.fe.core 1.141.2 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +78 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +91 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +91 -8
  7. package/src/sap/fe/core/AppStateHandler.js +7 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +9 -8
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -11
  14. package/src/sap/fe/core/ExtensionAPI.ts +3 -16
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +12 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +16 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -3
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +5 -2
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -44
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +92 -59
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +87 -50
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +4 -4
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +3 -6
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +49 -21
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +64 -24
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +6 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +21 -15
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +18 -15
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  75. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  76. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  77. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +3 -2
  78. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +2 -1
  79. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
  85. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  86. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  87. package/src/sap/fe/core/converters/common/AnnotationConverter.js +118 -39
  88. package/src/sap/fe/core/converters/controls/Common/Action.js +58 -21
  89. package/src/sap/fe/core/converters/controls/Common/Action.ts +72 -22
  90. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  91. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  92. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  93. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  94. package/src/sap/fe/core/converters/controls/Common/Table.js +87 -22
  95. package/src/sap/fe/core/converters/controls/Common/Table.ts +112 -21
  96. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  97. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  99. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +174 -79
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  102. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  104. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  105. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  106. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  107. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  108. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  109. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +10 -5
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +13 -1
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  114. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  115. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  116. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  117. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  118. package/src/sap/fe/core/flexibility/AppComponent.flexibility.js +55 -0
  119. package/src/sap/fe/core/flexibility/AppComponent.flexibility.ts +65 -0
  120. package/src/sap/fe/core/flexibility/XMLTools.js +71 -0
  121. package/src/sap/fe/core/flexibility/XMLTools.ts +61 -0
  122. package/src/sap/fe/core/fpm/manifest.json +2 -2
  123. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  124. package/src/sap/fe/core/helpers/AppStartupHelper.ts +92 -32
  125. package/src/sap/fe/core/helpers/DeleteHelper.js +13 -13
  126. package/src/sap/fe/core/helpers/DeleteHelper.ts +17 -15
  127. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  128. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  129. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  130. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  131. package/src/sap/fe/core/helpers/ModelHelper.js +47 -11
  132. package/src/sap/fe/core/helpers/ModelHelper.ts +62 -15
  133. package/src/sap/fe/core/helpers/PasteHelper.js +6 -2
  134. package/src/sap/fe/core/helpers/PasteHelper.ts +5 -7
  135. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  136. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  137. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  138. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  139. package/src/sap/fe/core/library.js +33 -3
  140. package/src/sap/fe/core/library.ts +31 -1
  141. package/src/sap/fe/core/messagebundle.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_ar.properties +8 -1
  143. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  144. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  146. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  148. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  149. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  152. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  153. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -1
  154. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  159. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  167. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_no.properties +9 -2
  175. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  184. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  185. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  186. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  187. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  188. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  189. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  190. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  191. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  192. package/src/sap/fe/core/rootView/Fcl.controller.ts +22 -5
  193. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  194. package/src/sap/fe/core/rootView/NavContainer.controller.ts +2 -1
  195. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  196. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  197. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  198. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +9 -9
  199. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  200. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  201. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -4
  202. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -6
  203. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  204. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  205. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +57 -5
  206. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +69 -10
  207. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  208. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  209. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  210. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  211. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  212. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  213. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  214. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  215. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  216. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  217. package/ui5.yaml +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.core",
3
- "version": "1.141.2",
3
+ "version": "1.143.0",
4
4
  "description": "SAPUI5 Library sap.fe.core",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.141.2</version>
9
+ <version>1.143.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.core</documentation>
12
12
 
@@ -30,6 +30,9 @@
30
30
  <dependency>
31
31
  <libraryName>sap.m</libraryName>
32
32
  </dependency>
33
+ <dependency>
34
+ <libraryName>sap.ui.fl</libraryName>
35
+ </dependency>
33
36
  <dependency>
34
37
  <libraryName>sap.ui.layout</libraryName>
35
38
  <lazy>true</lazy>
@@ -73,14 +73,43 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
73
73
  }
74
74
  }
75
75
  const ActionRuntime = {
76
+ /**
77
+ * Checks if a required parameter field is empty.
78
+ * @param parameterInfo Information identifying an action parameter
79
+ * @returns True if the field is empty, false otherwise
80
+ */
81
+ isRequiredFieldEmpty: function (parameterInfo) {
82
+ const fieldId = parameterInfo.field.getId();
83
+ const allMessages = Messaging.getMessageModel().getData();
84
+ const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(fieldId)));
85
+ if (relevantMessages.length > 0) {
86
+ return false;
87
+ } else if (parameterInfo.isMultiValue) {
88
+ const items = parameterInfo.field.getItems();
89
+ return items === undefined || Array.isArray(items) && items.length === 0;
90
+ } else {
91
+ const fieldValue = parameterInfo.field.getValue();
92
+ const isFieldArray = Array.isArray(parameterInfo.field.getValue());
93
+ if (isFieldArray) {
94
+ // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
95
+ // both of which can or cannot be null, so we shall check only the field value
96
+ return fieldValue[0] === null || fieldValue[0] === "";
97
+ }
98
+ return fieldValue === undefined || fieldValue === null || fieldValue === "";
99
+ }
100
+ },
76
101
  /**
77
102
  * Adds error messages for an action parameter field to the message manager.
78
103
  * @param messageParameters Information identifying an action parameter and messages referring to this parameter
79
104
  */
80
105
  _addMessageForActionParameter: function (messageParameters) {
81
- Messaging.addMessages(messageParameters.map(messageParameter => {
106
+ const messages = [];
107
+ messageParameters.forEach(messageParameter => {
82
108
  const binding = messageParameter.actionParameterInfo.field.getBinding(messageParameter.actionParameterInfo.isMultiValue ? "items" : "value");
83
- return new Message({
109
+ if (messageParameter.actionParameterInfo.isMultiValue) {
110
+ return this.manageMessageOnMultiValueField(messageParameter);
111
+ }
112
+ const message = new Message({
84
113
  message: messageParameter.message,
85
114
  type: MessageType.Error,
86
115
  processor: binding?.getModel() ?? undefined,
@@ -88,7 +117,51 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
88
117
  persistent: true,
89
118
  target: binding?.getResolvedPath()
90
119
  });
91
- }));
120
+
121
+ // Attach change handler to validate value and remove message if field is not empty
122
+ if (binding) {
123
+ const changeHandler = () => {
124
+ // Check if the field is no longer empty using the extracted validation function
125
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
126
+ // Remove the message
127
+ Messaging.removeMessages([message]);
128
+ // Detach the change handler
129
+ binding.detachChange(changeHandler);
130
+ }
131
+ };
132
+ // There might be sceanrios like value help out parameters where the field is not explicitly changed instead property value changes due to setProperty.
133
+ // In such cases, field change is not called and is not a reliable event to validate the field value again.
134
+ // So we use value/items binding change to re-validate the property value to remove the messages.
135
+ binding.attachChange(changeHandler);
136
+ }
137
+ messages.push(message);
138
+ });
139
+ Messaging.addMessages(messages);
140
+ },
141
+ /**
142
+ * Manages the message state on multi value fields.
143
+ * @param messageParameter
144
+ * @param messageParameter.actionParameterInfo
145
+ * @param messageParameter.message
146
+ */
147
+ manageMessageOnMultiValueField: function (messageParameter) {
148
+ const binding = messageParameter.actionParameterInfo.field.getBinding("items");
149
+ messageParameter.actionParameterInfo.field.setValueState("Error");
150
+ messageParameter.actionParameterInfo.field.setValueStateText(messageParameter.message);
151
+ if (binding) {
152
+ const changeHandler = () => {
153
+ // Check if the field is no longer empty using the extracted validation function
154
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
155
+ // Remove the ERROR state
156
+ messageParameter.actionParameterInfo.field.setValueState("None");
157
+ messageParameter.actionParameterInfo.field.setValueStateText("");
158
+ // Detach the change handler
159
+ binding.detachChange(changeHandler);
160
+ }
161
+ };
162
+ binding.attachChange(changeHandler);
163
+ }
164
+ return;
92
165
  },
93
166
  /**
94
167
  * Checks if all required action parameters contain data and checks for all action parameters if the
@@ -100,25 +173,7 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
100
173
  validateProperties: async function (actionParameterInfos, resourceModel) {
101
174
  await Promise.allSettled(actionParameterInfos.map(actionParameterInfo => actionParameterInfo.validationPromise));
102
175
  const requiredParameterInfos = actionParameterInfos.filter(parameterInfo => parameterInfo.field.getRequired && parameterInfo.field.getRequired());
103
- const allMessages = Messaging.getMessageModel().getData();
104
- const emptyRequiredFields = requiredParameterInfos.filter(requiredParameterInfo => {
105
- const fieldId = requiredParameterInfo.field.getId();
106
- const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(fieldId)));
107
- if (relevantMessages.length > 0) {
108
- return false;
109
- } else if (requiredParameterInfo.isMultiValue) {
110
- return requiredParameterInfo.value === undefined || !requiredParameterInfo.value.length;
111
- } else {
112
- const fieldValue = requiredParameterInfo.field.getValue();
113
- const isFieldArray = Array.isArray(requiredParameterInfo.field.getValue());
114
- if (isFieldArray) {
115
- // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
116
- // both of which can or cannot be null, so we shall check only the field value
117
- return fieldValue[0] === null || fieldValue[0] === "";
118
- }
119
- return fieldValue === undefined || fieldValue === null || fieldValue === "";
120
- }
121
- });
176
+ const emptyRequiredFields = requiredParameterInfos.filter(this.isRequiredFieldEmpty);
122
177
  /* Message for missing mandatory value of the action parameter */
123
178
  if (emptyRequiredFields.length) {
124
179
  this._addMessageForActionParameter(emptyRequiredFields.map(actionParameterInfo => ({
@@ -310,4 +365,4 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/base/BindingToolkit", "sap/fe/core
310
365
  };
311
366
  return ActionRuntime;
312
367
  }, false);
313
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbml0aWFsaXplVGFibGVBY3Rpb25Qcm9wZXJ0aWVzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJhY3Rpb24iLCJmb3JDb250ZXh0TWVudSIsInNldFByb3BlcnR5IiwiaGFuZGxlTm9TZWxlY3RlZENvbnRleHRzIiwicHJvbWlzZXMiLCJiRW5hYmxlZCIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJwdXNoIiwiQ29tbW9uVXRpbHMiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJ0aGVuIiwiaGFuZGxlU2VsZWN0ZWRDb250ZXh0cyIsInJlcXVlc3RQcm9taXNlcyIsImhhbmRsZVRhYmxlQ29udGV4dHMiLCJzZWxlY3RlZENvbnRleHRzIiwicHJvcGVydHkiLCJsZW5ndGgiLCJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZmllbGQiLCJnZXRCaW5kaW5nIiwiaXNNdWx0aVZhbHVlIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidW5kZWZpbmVkIiwicGVyc2lzdGVudCIsInRhcmdldCIsImdldFJlc29sdmVkUGF0aCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZmlsdGVyIiwicGFyYW1ldGVySW5mbyIsImdldFJlcXVpcmVkIiwiYWxsTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZW1wdHlSZXF1aXJlZEZpZWxkcyIsInJlcXVpcmVkUGFyYW1ldGVySW5mbyIsImZpZWxkSWQiLCJnZXRJZCIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwidmFsdWUiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZXh0IiwiZ2V0UGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJmaXJzdEludmFsaWRQYXJhbWV0ZXIiLCJmaW5kIiwiZ2V0VmlzaWJsZSIsImhhc0Vycm9yIiwiZ2V0VmFsdWVTdGF0ZSIsInNldFZpc2libGUiLCJmb2N1cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJzQ29udHJvbCIsImFyZ3VtZW50cyIsImFQcm9taXNlcyIsInNBY3Rpb24iLCJhUmVxdWVzdFByb21pc2VzIiwic1Byb3BlcnR5Iiwic2VsZWN0ZWRDb250ZXh0Iiwib0NvbnRleHREYXRhIiwiZ2V0T2JqZWN0IiwiX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZSIsImdldFByb3BlcnR5IiwiYWxsIiwicmVzdWx0cyIsImZsYXQiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsIm9WaWV3Iiwib0xpc3RCaW5kaW5nIiwib0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSIsIm9Db250cm9scyIsImNvbnRyb2xzIiwic0tleSIsIm9UYWJsZSIsImJ5SWQiLCJpc0EiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0YWJsZUFQSSIsImdldEJpbmRpbmdDb250ZXh0IiwiSlNPTiIsInBhcnNlIiwidGFibGVEZWZpbml0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsImlzRWRpdGFibGUiLCJnZXRJc0VkaXRhYmxlIiwib0NvbnRleHQiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50Iiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzRW50aXR5U2V0IiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJnZXREaWFnbm9zdGljcyIsIm1lcmdlIiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJ1cGRhdGVIaWRkZW4iLCJiVXBkYXRlSGlkZGVuIiwiaXNFbnRpdHlTZXQiLCJhbm5vdGF0aW9ucyIsIlVJIiwiVXBkYXRlSGlkZGVuIiwidmFsdWVPZiIsImlzVXBkYXRlSGlkZGVuIiwic0VkaXRFbmFibGVCaW5kaW5nIiwiZ2V0RWRpdEJ1dHRvbkVuYWJsZWQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNTdGlja3lSb290UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwic1BhdGgiLCJvUm9vdENvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInNIaWRkZW5FeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJlcXVhbCIsImdldEhpZGRlbkV4cHJlc3Npb24iLCJ1cGRhdGVFZGl0TW9kZWxDb250ZXh0Iiwic0JpbmRpbmdFeHByZXNzaW9uIiwib0hpZGRlbkVsZW1lbnQiLCJBbnlFbGVtZW50IiwiYW55VGV4dCIsInNldEJpbmRpbmdDb250ZXh0IiwiYWRkRGVwZW5kZW50IiwiJCRncm91cElkIiwiYXR0YWNoQ2hhbmdlIiwib0V2ZW50Iiwib05ld1ZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9TZWxlY3RlZENvbnRleHQiLCJzRW5hYmxlbWVudEZpZWxkTmFtZSIsImJBY3Rpb25FbmFibGVkIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9UcmFuc2Zvcm1lZEJpbmRpbmciLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsIm9CaW5kaW5nRXhwcmVzc2lvbiIsImNvbnN0YW50IiwicGF0aCIsInNSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJyZXF1ZXN0UHJvcGVydHkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGlvblJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgUGF0aEluTW9kZWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCB0cmFuc2Zvcm1SZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgX1JlcXVlc3RlZFByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IHR5cGUgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBGaWxlVXBsb2FkZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRFZGl0QnV0dG9uRW5hYmxlZCwgZ2V0SGlkZGVuRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvb2JqZWN0UGFnZS9IZWFkZXJBbmRGb290ZXJBY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUGFyYW1ldGVySW5mbyA9IHtcblx0cGFyYW1ldGVyPzogRWRtQWN0aW9uUGFyYW1ldGVyO1xuXHRmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWxlVXBsb2FkZXI7XG5cdGlzTXVsdGlWYWx1ZTogYm9vbGVhbjtcblx0dmFsdWU/OiBzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR2YWxpZGF0aW9uUHJvbWlzZT86IFByb21pc2U8c3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPjtcblx0aGFzRXJyb3I6IGJvb2xlYW47XG5cdHByb3BlcnR5UGF0aD86IHN0cmluZztcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB0YWJsZSBhY3Rpb24gaW4gdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgd2hlcmUgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzIGFyZSBzZXQuXG4gKiBAcGFyYW0gYWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gZm9yIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaXRpYWxpemVkLlxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGlzIGZvciBhIGNvbnRleHQgbWVudS5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVRhYmxlQWN0aW9uUHJvcGVydGllcyhpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIGFjdGlvbjogc3RyaW5nLCBmb3JDb250ZXh0TWVudTogYm9vbGVhbik6IHZvaWQge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2FBcHBsaWNhYmxlYCwgW10pO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2FOb3RBcHBsaWNhYmxlYCwgW10pO1xuXHRpZiAoZm9yQ29udGV4dE1lbnUpIHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259L2JFbmFibGVkRm9yQ29udGV4dE1lbnVgLCBmYWxzZSk7XG5cdH0gZWxzZSB7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufS9iRW5hYmxlZGAsIGZhbHNlKTtcblx0fVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBubyBjb250ZXh0cyBhcmUgc2VsZWN0ZWQgZm9yIGFuIGFjdGlvbi5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dCBUaGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB3aGVyZSB0aGUgYWN0aW9uIHByb3BlcnRpZXMgYXJlIHNldC5cbiAqIEBwYXJhbSBhY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBmb3Igd2hpY2ggcHJvcGVydGllcyBhcmUgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0gcHJvbWlzZXMgQW4gYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyLlxuICovXG5mdW5jdGlvbiBoYW5kbGVOb1NlbGVjdGVkQ29udGV4dHMoXG5cdGludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0YWN0aW9uOiBzdHJpbmcsXG5cdHByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXSxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHthY3Rpb259YCwge1xuXHRcdGJFbmFibGVkOiBmYWxzZSxcblx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdH0pO1xuXHRwcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShpbnRlcm5hbE1vZGVsQ29udGV4dCwgW10sIGZvckNvbnRleHRNZW51KS50aGVuKCgpID0+IFtdKSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY2FzZSB3aGVuIGNvbnRleHRzIGFyZSBzZWxlY3RlZCBmb3IgYW4gYWN0aW9uLlxuICogQHBhcmFtIGludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHdoZXJlIHRoZSBhY3Rpb24gcHJvcGVydGllcyBhcmUgc2V0LlxuICogQHBhcmFtIHJlcXVlc3RQcm9taXNlcyBBbiBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBhZnRlciBzZXR0aW5nIHRoZSBhY3Rpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSBwcm9taXNlc1x0QW4gYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyLlxuICovXG5mdW5jdGlvbiBoYW5kbGVTZWxlY3RlZENvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdHByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXSxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRwcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShpbnRlcm5hbE1vZGVsQ29udGV4dCwgcmVxdWVzdFByb21pc2VzLCBmb3JDb250ZXh0TWVudSkudGhlbigoKSA9PiBbXSkpO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGFjdGlvbiBlbmFibGVtZW50IGZvciB0YWJsZSBjb250ZXh0cy5cbiAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHRzICBTZWxlY3RlZCBjb250ZXh0cyBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dCBcdEludGVybmFsIG1vZGVsIGNvbnRleHQgd2hlcmUgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzIGFyZSBzZXQuXG4gKiBAcGFyYW0gYWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvbiBmb3Igd2hpY2ggcHJvcGVydGllcyBhcmUgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgdG8gYmUgY2hlY2tlZCBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSByZXF1ZXN0UHJvbWlzZXMgUHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudSwgZmFsc2UgaWYgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhci5cbiAqIEBwYXJhbSBwcm9taXNlcyBQ4oCacm9taXNlcyB0byBiZSByZXNvbHZlZCBhZnRlciBzZXR0aW5nIHRoZSBhY3Rpb24gcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlVGFibGVDb250ZXh0cyhcblx0c2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFjdGlvbjogc3RyaW5nLFxuXHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRyZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRmb3JDb250ZXh0TWVudTogYm9vbGVhbixcblx0cHJvbWlzZXM6IFByb21pc2U8dm9pZFtdPltdXG4pOiB2b2lkIHtcblx0aWYgKCFzZWxlY3RlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdGhhbmRsZU5vU2VsZWN0ZWRDb250ZXh0cyhpbnRlcm5hbE1vZGVsQ29udGV4dCwgYWN0aW9uLCBwcm9taXNlcywgZm9yQ29udGV4dE1lbnUpO1xuXHR9IGVsc2UgaWYgKHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoICYmIHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGhhbmRsZVNlbGVjdGVkQ29udGV4dHMoaW50ZXJuYWxNb2RlbENvbnRleHQsIHJlcXVlc3RQcm9taXNlcywgcHJvbWlzZXMsIGZvckNvbnRleHRNZW51KTtcblx0fVxufVxuXG5jb25zdCBBY3Rpb25SdW50aW1lID0ge1xuXHQvKipcblx0ICogQWRkcyBlcnJvciBtZXNzYWdlcyBmb3IgYW4gYWN0aW9uIHBhcmFtZXRlciBmaWVsZCB0byB0aGUgbWVzc2FnZSBtYW5hZ2VyLlxuXHQgKiBAcGFyYW0gbWVzc2FnZVBhcmFtZXRlcnMgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlciBhbmQgbWVzc2FnZXMgcmVmZXJyaW5nIHRvIHRoaXMgcGFyYW1ldGVyXG5cdCAqL1xuXHRfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlcjogZnVuY3Rpb24gKG1lc3NhZ2VQYXJhbWV0ZXJzOiB7IGFjdGlvblBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm87IG1lc3NhZ2U6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRtZXNzYWdlUGFyYW1ldGVycy5tYXAoKG1lc3NhZ2VQYXJhbWV0ZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRCaW5kaW5nKFxuXHRcdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlUGFyYW1ldGVyLm1lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0cHJvY2Vzc29yOiBiaW5kaW5nPy5nZXRNb2RlbCgpID8/IHVuZGVmaW5lZCwgLy8gZ2V0TW9kZWwoKTogbnVsbCB8IE1vZGVsIH5+PiBwcm9jZXNzb3I/OiBNZXNzYWdlUHJvY2Vzc29yXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0YXJnZXQ6IGJpbmRpbmc/LmdldFJlc29sdmVkUGF0aCgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGFjdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW4gZGF0YSBhbmQgY2hlY2tzIGZvciBhbGwgYWN0aW9uIHBhcmFtZXRlcnMgaWYgdGhlXG5cdCAqIGNvbnRhaW5lZCBkYXRhIGlzIHZhbGlkLlxuXHQgKiBAcGFyYW0gYWN0aW9uUGFyYW1ldGVySW5mb3MgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiByZXN1bHQgY2FuIGJlIHRydWUgb3IgZmFsc2Vcblx0ICovXG5cdHZhbGlkYXRlUHJvcGVydGllczogYXN5bmMgZnVuY3Rpb24gKGFjdGlvblBhcmFtZXRlckluZm9zOiBBY3Rpb25QYXJhbWV0ZXJJbmZvW10sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvcy5tYXAoXG5cdFx0XHRcdChhY3Rpb25QYXJhbWV0ZXJJbmZvKTogUHJvbWlzZTxzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+IHwgdW5kZWZpbmVkID0+IGFjdGlvblBhcmFtZXRlckluZm8udmFsaWRhdGlvblByb21pc2Vcblx0XHRcdClcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWlyZWRQYXJhbWV0ZXJJbmZvcyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbHRlcihcblx0XHRcdChwYXJhbWV0ZXJJbmZvKSA9PlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQgfCBNdWx0aVZhbHVlRmllbGQpLmdldFJlcXVpcmVkKClcblx0XHQpO1xuXG5cdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGVtcHR5UmVxdWlyZWRGaWVsZHMgPSByZXF1aXJlZFBhcmFtZXRlckluZm9zLmZpbHRlcigocmVxdWlyZWRQYXJhbWV0ZXJJbmZvKSA9PiB7XG5cdFx0XHRjb25zdCBmaWVsZElkID0gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0XHRjb25zdCByZWxldmFudE1lc3NhZ2VzID0gYWxsTWVzc2FnZXMuZmlsdGVyKChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoY29udHJvbElkOiBzdHJpbmcpID0+IGNvbnRyb2xJZC5pbmNsdWRlcyhmaWVsZElkKSlcblx0XHRcdCk7XG5cdFx0XHRpZiAocmVsZXZhbnRNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlID09PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkUGFyYW1ldGVySW5mby52YWx1ZS5sZW5ndGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gKHJlcXVpcmVkUGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEFycmF5ID0gQXJyYXkuaXNBcnJheSgocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpKTtcblx0XHRcdFx0aWYgKGlzRmllbGRBcnJheSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgZmlyc3QgdmFsdWUgY2hlY2sgaXMgZW5vdWdoIGFzIHRoZSBmaWVsZCB2YWx1ZSBjb21lcyBvbiBbMF0gcmVzdCBvZiB0aGUgYXJyYXkgaW5jbHVkZXMgY3VycmVuY3kgYW5kIGN1cnJlbmN5IGNvZGVcblx0XHRcdFx0XHQvLyBib3RoIG9mIHdoaWNoIGNhbiBvciBjYW5ub3QgYmUgbnVsbCwgc28gd2Ugc2hhbGwgY2hlY2sgb25seSB0aGUgZmllbGQgdmFsdWVcblx0XHRcdFx0XHRyZXR1cm4gZmllbGRWYWx1ZVswXSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlWzBdID09PSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgfHwgZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlID09PSBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8qIE1lc3NhZ2UgZm9yIG1pc3NpbmcgbWFuZGF0b3J5IHZhbHVlIG9mIHRoZSBhY3Rpb24gcGFyYW1ldGVyICovXG5cdFx0aWYgKGVtcHR5UmVxdWlyZWRGaWVsZHMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLl9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyKFxuXHRcdFx0XHRlbXB0eVJlcXVpcmVkRmllbGRzLm1hcCgoYWN0aW9uUGFyYW1ldGVySW5mbykgPT4gKHtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvOiBhY3Rpb25QYXJhbWV0ZXJJbmZvLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIiwgW1xuXHRcdFx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQuZ2V0UGFyZW50KCk/LmdldEFnZ3JlZ2F0aW9uKFwibGFiZWxcIikgYXMgTGFiZWwpLmdldFRleHQoKVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdH0pKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0LyogQ2hlY2sgdmFsdWUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgKi9cblx0XHRjb25zdCBmaXJzdEludmFsaWRQYXJhbWV0ZXIgPSBhY3Rpb25QYXJhbWV0ZXJJbmZvcy5maW5kKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdHBhcmFtZXRlckluZm8uZmllbGQuZ2V0VmlzaWJsZSgpICYmXG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmhhc0Vycm9yIHx8IHBhcmFtZXRlckluZm8uZmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBcIkVycm9yXCIgfHwgZW1wdHlSZXF1aXJlZEZpZWxkcy5pbmNsdWRlcyhwYXJhbWV0ZXJJbmZvKSlcblx0XHQpO1xuXHRcdGlmIChmaXJzdEludmFsaWRQYXJhbWV0ZXIpIHtcblx0XHRcdGZpcnN0SW52YWxpZFBhcmFtZXRlci5maWVsZC5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgYWN0aW9uIGVuYWJsZW1lbnQuXG5cdCAqIEBwYXJhbSBvSW50ZXJuYWxNb2RlbENvbnRleHQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbnRleHQgbW9kZWxcblx0ICogQHBhcmFtIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgTWFwIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbiBhdmFpbGFiaWxpdHkgb2YgYWN0aW9uc1xuXHQgKiBAcGFyYW0gYVNlbGVjdGVkQ29udGV4dHMgQXJyYXkgY29udGFpbmluZyBzZWxlY3RlZCBjb250ZXh0cyBvZiB0aGUgY2hhcnRcblx0ICogQHBhcmFtIHNDb250cm9sIENvbnRyb2wgbmFtZVxuXHQgKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyXG5cdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gZW5hYmxlbWVudCBwcm9taXNlc1xuXHQgKi9cblx0c2V0QWN0aW9uRW5hYmxlbWVudDogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0b0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0XHRhU2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdHNDb250cm9sOiBzdHJpbmcsXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPHZvaWRbXT4ge1xuXHRcdGNvbnN0IGFQcm9taXNlczogUHJvbWlzZTx2b2lkW10+W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHNBY3Rpb24gaW4gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0bGV0IGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdID0gW107XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0FjdGlvbiwgZmFsc2UpO1xuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aW5pdGlhbGl6ZVRhYmxlQWN0aW9uUHJvcGVydGllcyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGZvckNvbnRleHRNZW51KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IHNlbGVjdGVkQ29udGV4dCBvZiBhU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJjaGFydFwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoKHNQcm9wZXJ0eSA9PT0gbnVsbCAmJiAhIW9Db250ZXh0RGF0YVtgIyR7c0FjdGlvbn1gXSkgfHwgc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vbG9vayBmb3IgYWN0aW9uIGFkdmVydGlzZW1lbnQgaWYgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBudWxsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzQWN0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzQ29udHJvbCA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzID0gdGhpcy5fc2V0QWN0aW9uRW5hYmxlbWVudEZvclRhYmxlKFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRmb3JDb250ZXh0TWVudVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aGFuZGxlVGFibGVDb250ZXh0cyhcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcyxcblx0XHRcdFx0XHRmb3JDb250ZXh0TWVudSxcblx0XHRcdFx0XHRhUHJvbWlzZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gdHJpZ2dlciBhbiBleHBsaWNpdCByZWZyZXNoIG9mIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVwZGF0ZVxuXHRcdFx0Ly8gYWxzbyB0aGUgY29udGV4dHMgaW4gY2FzZSBvZiBjdXN0b20gYWN0aW9uc1xuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb250ZXh0cyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgfHwgW107XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcykudGhlbigocmVzdWx0cykgPT4gcmVzdWx0cy5mbGF0KCkpO1xuXHR9LFxuXHRzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaDogZnVuY3Rpb24gKFxuXHRcdG9WaWV3OiBWaWV3LFxuXHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGEgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQ/LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGNvbnN0IG9Db250cm9scyA9IChvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhPy5jb250cm9scyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgeyBjb250cm9sSWQ/OiBzdHJpbmcgfT47XG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG9Db250cm9scykge1xuXHRcdFx0aWYgKG9Db250cm9sc1tzS2V5XSAmJiBvQ29udHJvbHNbc0tleV0uY29udHJvbElkKSB7XG5cdFx0XHRcdGNvbnN0IG9UYWJsZSA9IG9WaWV3LmJ5SWQoc0tleSk7XG5cdFx0XHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZyA9PSBvTGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gb1RhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZSh0YWJsZUFQSS50YWJsZURlZmluaXRpb24ub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdFx0b1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBDb250ZXh0W10sXG5cdFx0XHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50KG9WaWV3OiBGRVZpZXcpOiB2b2lkIHtcblx0XHRjb25zdCBpVmlld0xldmVsID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MpPy52aWV3TGV2ZWwsXG5cdFx0XHRpc0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldyk7XG5cdFx0aWYgKChpVmlld0xldmVsIGFzIG51bWJlcikgPiAxICYmIGlzRWRpdGFibGUgIT09IHRydWUpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBNb2RlbEhlbHBlci5nZXRSb290RW50aXR5U2V0UGF0aChzTWV0YVBhdGgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBvQ29udGV4dFxuXHRcdFx0XHQ/LmdldE1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdD8uZ2V0Q29udGV4dChvQ29udGV4dD8uZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGNvbnZlcnRlckNvbnRleHQgPSBDb252ZXJ0ZXJDb250ZXh0Py5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0XHRcdHNFbnRpdHlTZXQsXG5cdFx0XHRcdG1ldGFDb250ZXh0LFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCksXG5cdFx0XHRcdG1lcmdlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRcdGxldCB1cGRhdGVIaWRkZW47XG5cdFx0XHQvL0ZpbmQgdGhlIFVwZGF0ZSBIaWRkZW4gb2YgdGhlIHJvb3QgZW50aXR5IHNldCBhbmQgYmluZCB0aGUgcHJvcGVydHkgdG8gQW55RWxlbWVudCwgYW55IGNoYW5nZXMgaW4gdGhlIHBhdGggb2YgdGhlIHJvb3QgVXBkYXRlSGlkZGVuIHdpbGwgYmUgdXBkYXRlZCB2aWEgdGhlIHByb3BlcnR5LCBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGlzIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHByb3BlcnR5XG5cdFx0XHRjb25zdCBiVXBkYXRlSGlkZGVuID0gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbj8udmFsdWVPZigpO1xuXHRcdFx0aWYgKGJVcGRhdGVIaWRkZW4gIT09IHRydWUpIHtcblx0XHRcdFx0dXBkYXRlSGlkZGVuID0gTW9kZWxIZWxwZXIuaXNVcGRhdGVIaWRkZW4oZW50aXR5U2V0LCBlbnRpdHlUeXBlKTtcblx0XHRcdH1cblx0XHRcdC8vRmluZCB0aGUgb3BlcmF0aW9uIGF2YWlsYWJsZSBwcm9wZXJ0eSBvZiB0aGUgcm9vdCBlZGl0IGNvbmZpZ3VyYXRpb24gYW5kIGZldGNoIHRoZSBwcm9wZXJ0eSB1c2luZyBBbnlFbGVtZW50XG5cdFx0XHRjb25zdCBzRWRpdEVuYWJsZUJpbmRpbmcgPSBnZXRFZGl0QnV0dG9uRW5hYmxlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdGlja3lSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldFN0aWNreVJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNQYXRoID0gZHJhZnRSb290UGF0aCB8fCBzU3RpY2t5Um9vdFBhdGg7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKHNQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Q29udGV4dCA9IG9WaWV3LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1BhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAodXBkYXRlSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBzSGlkZGVuRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKGVxdWFsKGdldEhpZGRlbkV4cHJlc3Npb24oY29udmVydGVyQ29udGV4dCwgdXBkYXRlSGlkZGVuKSwgZmFsc2UpKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUVkaXRNb2RlbENvbnRleHQoc0hpZGRlbkV4cHJlc3Npb24sIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRWaXNpYmxlXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNFZGl0RW5hYmxlQmluZGluZykge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzRWRpdEVuYWJsZUJpbmRpbmcsIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRFbmFibGVkXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWRpdE1vZGVsQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHNCaW5kaW5nRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3OiBWaWV3LFxuXHRcdG9Sb290Q29udGV4dDogQ29udGV4dCxcblx0XHRzUHJvcGVydHk6IHN0cmluZyxcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0XG5cdCk6IHZvaWQge1xuXHRcdGlmIChzQmluZGluZ0V4cHJlc3Npb24pIHtcblx0XHRcdGNvbnN0IG9IaWRkZW5FbGVtZW50ID0gbmV3IEFueUVsZW1lbnQoeyBhbnlUZXh0OiBzQmluZGluZ0V4cHJlc3Npb24gfSk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdG9WaWV3LmFkZERlcGVuZGVudChvSGlkZGVuRWxlbWVudCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb0hpZGRlbkVsZW1lbnRcblx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0Py5iaW5kQ29udGV4dChvUm9vdENvbnRleHQuZ2V0UGF0aCgpLCBvUm9vdENvbnRleHQsIHsgJCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiIH0pXG5cdFx0XHRcdD8uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudD8uZ2V0QmluZGluZyhcImFueVRleHRcIik/LmF0dGFjaENoYW5nZSgob0V2ZW50OiBFdmVudDx7fSwgUHJvcGVydHlCaW5kaW5nPikgPT4ge1xuXHRcdFx0XHRjb25zdCBvTmV3VmFsdWUgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0RXh0ZXJuYWxWYWx1ZSgpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc1Byb3BlcnR5LCBvTmV3VmFsdWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGU6IGZ1bmN0aW9uIChcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0c0FjdGlvbjogc3RyaW5nLFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10ge1xuXHRcdC8vIFJldHJpZXZlIHByZXZpb3VzbHkgY2hlY2tlZCBjb250ZXh0cyBpbiBjYXNlIG9mICFmb3JDb250ZXh0TWVudVxuXHRcdGNvbnN0IHNFbmFibGVtZW50RmllbGROYW1lID0gZm9yQ29udGV4dE1lbnUgPyBcImJFbmFibGVkRm9yQ29udGV4dE1lbnVcIiA6IFwiYkVuYWJsZWRcIixcblx0XHRcdGFBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYUFwcGxpY2FibGVgKSB8fCBbXSxcblx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSB8fCBbXTtcblx0XHRsZXQgYkFjdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vJHtzRW5hYmxlbWVudEZpZWxkTmFtZX1gKSB8fCBmYWxzZTtcblxuXHRcdGlmICghZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbXVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0Ly8gRG8gbm90IGNoYW5nZSBlbmFibGVkLCBhQXBwbGljYWJsZSBhbmQgYU5vdEFwcGxpY2FibGUgcHJvcGVydHkgaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUgY2FsY3VsYXRpb25cblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUsIG9ubHkgdGhlIGNsaWNrZWQgY29udGV4dCBnb2VzIGludG8gdGhlIHByb2Nlc3NpbmcgLSBvdGhlciBzZWxlY3RlZCBjb250ZXh0cyBtdXN0IGJlIGtlcHQgaW4gdGhlIG1vZGVsXG5cdFx0XHRcdGJFbmFibGVkOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgKSxcblx0XHRcdFx0YUFwcGxpY2FibGU6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGJFbmFibGVkRm9yQ29udGV4dE1lbnU6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBOb3RlIHRoYXQgbm9uIGR5bmFtaWMgYWN0aW9ucyBhcmUgbm90IHByb2Nlc3NlZCBoZXJlLiBUaGV5IGFyZSBlbmFibGVkIGJlY2F1c2Vcblx0XHQvLyBvbmUgb3IgbW9yZSBhcmUgc2VsZWN0ZWQgYW5kIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY29uZGl0aW9uIGluIHRoZSB0ZW1wbGF0aW5nXG5cdFx0Ly8gaXMgdGhlbiB1bmRlZmluZWQgYW5kIHRodXMgdGhlIGJ1dHRvbiB0YWtlcyB0aGUgZGVmYXVsdCBlbmFibGluZywgd2hpY2ggaXMgdHJ1ZSFcblx0XHRjb25zdCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWA7XG5cblx0XHRpZiAodHlwZW9mIHNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIiAmJiBzUHJvcGVydHkgIT09IG51bGwgJiYgc1Byb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRcdGNvbnN0IG9UcmFuc2Zvcm1lZEJpbmRpbmcgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShcblx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0XCJQYXRoSW5Nb2RlbFwiLFxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcblx0XHRcdFx0XHRmdW5jdGlvbiAob0JpbmRpbmdFeHByZXNzaW9uOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dERhdGEgPyBjb25zdGFudChvQ29udGV4dERhdGFbb0JpbmRpbmdFeHByZXNzaW9uLnBhdGhdKSA6IGNvbnN0YW50KGZhbHNlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgc1Jlc3VsdCA9IGNvbXBpbGVFeHByZXNzaW9uKG9UcmFuc2Zvcm1lZEJpbmRpbmcpO1xuXHRcdFx0XHRiQWN0aW9uRW5hYmxlZCA9IGJBY3Rpb25FbmFibGVkIHx8IHNSZXN1bHQgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoLCBiQWN0aW9uRW5hYmxlZCk7XG5cdFx0XHRcdChzUmVzdWx0ID09PSBcInRydWVcIiA/IGFBcHBsaWNhYmxlIDogYU5vdEFwcGxpY2FibGUpLnB1c2gob1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRDb21tb25VdGlscy5zZXREeW5hbWljQWN0aW9uQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBzQWN0aW9uLCBhQXBwbGljYWJsZSwgYU5vdEFwcGxpY2FibGUsIGZvckNvbnRleHRNZW51KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRpZiAoc1Byb3BlcnR5ID09PSBudWxsICYmICEhb0NvbnRleHREYXRhW2AjJHtzQWN0aW9ufWBdKSB7XG5cdFx0XHRcdC8vbG9vayBmb3IgYWN0aW9uIGFkdmVydGlzZW1lbnQgaWYgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBudWxsXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIHRydWUpO1xuXHRcdFx0fSBlbHNlIGlmIChvU2VsZWN0ZWRDb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCBwcm9taXNlcyB0byByZXRyaWV2ZSBzaW5nbGV0b24gb3Igbm9ybWFsIHByb3BlcnR5IHZhbHVlIGFzeW5jaHJvbm91c2x5XG5cdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMucHVzaChDb21tb25VdGlscy5yZXF1ZXN0UHJvcGVydHkob1NlbGVjdGVkQ29udGV4dCwgc0FjdGlvbiwgc1Byb3BlcnR5LCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhUmVxdWVzdFByb21pc2VzO1xuXHR9XG59O1xuZXhwb3J0IGRlZmF1bHQgQWN0aW9uUnVudGltZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7RUF5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0EsK0JBQStCQSxDQUFDQyxvQkFBMEMsRUFBRUMsTUFBYyxFQUFFQyxjQUF1QixFQUFRO0lBQ25JRixvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSxjQUFjLEVBQUUsRUFBRSxDQUFDO0lBQzVFRCxvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSxpQkFBaUIsRUFBRSxFQUFFLENBQUM7SUFDL0UsSUFBSUMsY0FBYyxFQUFFO01BQ25CRixvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDLGtCQUFrQkYsTUFBTSx5QkFBeUIsRUFBRSxLQUFLLENBQUM7SUFDM0YsQ0FBQyxNQUFNO01BQ05ELG9CQUFv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
368
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbml0aWFsaXplVGFibGVBY3Rpb25Qcm9wZXJ0aWVzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJhY3Rpb24iLCJmb3JDb250ZXh0TWVudSIsInNldFByb3BlcnR5IiwiaGFuZGxlTm9TZWxlY3RlZENvbnRleHRzIiwicHJvbWlzZXMiLCJiRW5hYmxlZCIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJwdXNoIiwiQ29tbW9uVXRpbHMiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJ0aGVuIiwiaGFuZGxlU2VsZWN0ZWRDb250ZXh0cyIsInJlcXVlc3RQcm9taXNlcyIsImhhbmRsZVRhYmxlQ29udGV4dHMiLCJzZWxlY3RlZENvbnRleHRzIiwicHJvcGVydHkiLCJsZW5ndGgiLCJBY3Rpb25SdW50aW1lIiwiaXNSZXF1aXJlZEZpZWxkRW1wdHkiLCJwYXJhbWV0ZXJJbmZvIiwiZmllbGRJZCIsImZpZWxkIiwiZ2V0SWQiLCJhbGxNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJyZWxldmFudE1lc3NhZ2VzIiwiZmlsdGVyIiwibXNnIiwiZ2V0Q29udHJvbElkcyIsInNvbWUiLCJjb250cm9sSWQiLCJpbmNsdWRlcyIsImlzTXVsdGlWYWx1ZSIsIml0ZW1zIiwiZ2V0SXRlbXMiLCJ1bmRlZmluZWQiLCJBcnJheSIsImlzQXJyYXkiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlciIsIm1lc3NhZ2VQYXJhbWV0ZXJzIiwibWVzc2FnZXMiLCJmb3JFYWNoIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZ2V0QmluZGluZyIsIm1hbmFnZU1lc3NhZ2VPbk11bHRpVmFsdWVGaWVsZCIsIm1lc3NhZ2UiLCJNZXNzYWdlIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInBlcnNpc3RlbnQiLCJ0YXJnZXQiLCJnZXRSZXNvbHZlZFBhdGgiLCJjaGFuZ2VIYW5kbGVyIiwicmVtb3ZlTWVzc2FnZXMiLCJkZXRhY2hDaGFuZ2UiLCJhdHRhY2hDaGFuZ2UiLCJhZGRNZXNzYWdlcyIsInNldFZhbHVlU3RhdGUiLCJzZXRWYWx1ZVN0YXRlVGV4dCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwibWFwIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZ2V0UmVxdWlyZWQiLCJlbXB0eVJlcXVpcmVkRmllbGRzIiwiZ2V0VGV4dCIsImdldFBhcmVudCIsImdldEFnZ3JlZ2F0aW9uIiwiZmlyc3RJbnZhbGlkUGFyYW1ldGVyIiwiZmluZCIsImdldFZpc2libGUiLCJoYXNFcnJvciIsImdldFZhbHVlU3RhdGUiLCJzZXRWaXNpYmxlIiwiZm9jdXMiLCJzZXRBY3Rpb25FbmFibGVtZW50Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImFTZWxlY3RlZENvbnRleHRzIiwic0NvbnRyb2wiLCJhcmd1bWVudHMiLCJhUHJvbWlzZXMiLCJzQWN0aW9uIiwiYVJlcXVlc3RQcm9taXNlcyIsInNQcm9wZXJ0eSIsInNlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImdldE9iamVjdCIsIl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUiLCJnZXRQcm9wZXJ0eSIsImFsbCIsInJlc3VsdHMiLCJmbGF0Iiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJvVmlldyIsIm9MaXN0QmluZGluZyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGEiLCJvQ29udHJvbHMiLCJjb250cm9scyIsInNLZXkiLCJvVGFibGUiLCJieUlkIiwiaXNBIiwib1Jvd0JpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwidGFibGVBUEkiLCJnZXRCaW5kaW5nQ29udGV4dCIsIkpTT04iLCJwYXJzZSIsInRhYmxlRGVmaW5pdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJ1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQiLCJpVmlld0xldmVsIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJpc0VkaXRhYmxlIiwiZ2V0SXNFZGl0YWJsZSIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic0VudGl0eVNldCIsImdldFJvb3RFbnRpdHlTZXRQYXRoIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRDb250ZXh0IiwiZ2V0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJDb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwiZ2V0RGlhZ25vc3RpY3MiLCJtZXJnZSIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwidXBkYXRlSGlkZGVuIiwiYlVwZGF0ZUhpZGRlbiIsImlzRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJVSSIsIlVwZGF0ZUhpZGRlbiIsInZhbHVlT2YiLCJpc1VwZGF0ZUhpZGRlbiIsInNFZGl0RW5hYmxlQmluZGluZyIsImdldEVkaXRCdXR0b25FbmFibGVkIiwiZHJhZnRSb290UGF0aCIsImdldERyYWZ0Um9vdFBhdGgiLCJzU3RpY2t5Um9vdFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsInNQYXRoIiwib1Jvb3RDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJzSGlkZGVuRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwiZXF1YWwiLCJnZXRIaWRkZW5FeHByZXNzaW9uIiwidXBkYXRlRWRpdE1vZGVsQ29udGV4dCIsInNCaW5kaW5nRXhwcmVzc2lvbiIsIm9IaWRkZW5FbGVtZW50IiwiQW55RWxlbWVudCIsImFueVRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFkZERlcGVuZGVudCIsIiQkZ3JvdXBJZCIsIm9FdmVudCIsIm9OZXdWYWx1ZSIsImdldFNvdXJjZSIsImdldEV4dGVybmFsVmFsdWUiLCJvU2VsZWN0ZWRDb250ZXh0Iiwic0VuYWJsZW1lbnRGaWVsZE5hbWUiLCJiQWN0aW9uRW5hYmxlZCIsImJFbmFibGVkRm9yQ29udGV4dE1lbnUiLCJhQXBwbGljYWJsZUZvckNvbnRleHRNZW51IiwiYU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudSIsInNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgiLCJvVHJhbnNmb3JtZWRCaW5kaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJvQmluZGluZ0V4cHJlc3Npb24iLCJjb25zdGFudCIsInBhdGgiLCJzUmVzdWx0Iiwic2V0RHluYW1pY0FjdGlvbkNvbnRleHRzIiwicmVxdWVzdFByb3BlcnR5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJBY3Rpb25SdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uUGFyYW1ldGVyIGFzIEVkbUFjdGlvblBhcmFtZXRlciwgUHJpbWl0aXZlVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGNvbnN0YW50LCBlcXVhbCwgdHJhbnNmb3JtUmVjdXJzaXZlbHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IF9SZXF1ZXN0ZWRQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIExhYmVsIGZyb20gXCJzYXAvbS9MYWJlbFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgRmlsZVVwbG9hZGVyIGZyb20gXCJzYXAvdWkvdW5pZmllZC9GaWxlVXBsb2FkZXJcIjtcbmltcG9ydCBBbnlFbGVtZW50IGZyb20gXCIuL2NvbnRyb2xzL0FueUVsZW1lbnRcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgZ2V0RWRpdEJ1dHRvbkVuYWJsZWQsIGdldEhpZGRlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL29iamVjdFBhZ2UvSGVhZGVyQW5kRm9vdGVyQWN0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblBhcmFtZXRlckluZm8gPSB7XG5cdHBhcmFtZXRlcj86IEVkbUFjdGlvblBhcmFtZXRlcjtcblx0ZmllbGQ6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmlsZVVwbG9hZGVyO1xuXHRpc011bHRpVmFsdWU6IGJvb2xlYW47XG5cdHZhbHVlPzogc3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0dmFsaWRhdGlvblByb21pc2U/OiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT47XG5cdGhhc0Vycm9yOiBib29sZWFuO1xuXHRwcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgdGFibGUgYWN0aW9uIGluIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0LlxuICogQHBhcmFtIGludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHdoZXJlIHRoZSBhY3Rpb24gcHJvcGVydGllcyBhcmUgc2V0LlxuICogQHBhcmFtIGFjdGlvbiBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIGZvciB3aGljaCBwcm9wZXJ0aWVzIGFyZSBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBpcyBmb3IgYSBjb250ZXh0IG1lbnUuXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVUYWJsZUFjdGlvblByb3BlcnRpZXMoaW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBhY3Rpb246IHN0cmluZywgZm9yQ29udGV4dE1lbnU6IGJvb2xlYW4pOiB2b2lkIHtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufS9hQXBwbGljYWJsZWAsIFtdKTtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufS9hTm90QXBwbGljYWJsZWAsIFtdKTtcblx0aWYgKGZvckNvbnRleHRNZW51KSB7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufS9iRW5hYmxlZEZvckNvbnRleHRNZW51YCwgZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke2FjdGlvbn0vYkVuYWJsZWRgLCBmYWxzZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBjYXNlIHdoZW4gbm8gY29udGV4dHMgYXJlIHNlbGVjdGVkIGZvciBhbiBhY3Rpb24uXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgd2hlcmUgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzIGFyZSBzZXQuXG4gKiBAcGFyYW0gYWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gZm9yIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaXRpYWxpemVkLlxuICogQHBhcmFtIHByb21pc2VzIEFuIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGFmdGVyIHNldHRpbmcgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudS4gSWYgZmFsc2UsIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhci5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlTm9TZWxlY3RlZENvbnRleHRzKFxuXHRpbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdGFjdGlvbjogc3RyaW5nLFxuXHRwcm9taXNlczogUHJvbWlzZTx2b2lkW10+W10sXG5cdGZvckNvbnRleHRNZW51OiBib29sZWFuXG4pOiB2b2lkIHtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7YWN0aW9ufWAsIHtcblx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0YUFwcGxpY2FibGU6IFtdLFxuXHRcdGFOb3RBcHBsaWNhYmxlOiBbXVxuXHR9KTtcblx0cHJvbWlzZXMucHVzaChDb21tb25VdGlscy5zZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUoaW50ZXJuYWxNb2RlbENvbnRleHQsIFtdLCBmb3JDb250ZXh0TWVudSkudGhlbigoKSA9PiBbXSkpO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBjb250ZXh0cyBhcmUgc2VsZWN0ZWQgZm9yIGFuIGFjdGlvbi5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsQ29udGV4dCBUaGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB3aGVyZSB0aGUgYWN0aW9uIHByb3BlcnRpZXMgYXJlIHNldC5cbiAqIEBwYXJhbSByZXF1ZXN0UHJvbWlzZXMgQW4gYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gcHJvbWlzZXNcdEFuIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGFmdGVyIHNldHRpbmcgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudS4gSWYgZmFsc2UsIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhci5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlU2VsZWN0ZWRDb250ZXh0cyhcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRyZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRwcm9taXNlczogUHJvbWlzZTx2b2lkW10+W10sXG5cdGZvckNvbnRleHRNZW51OiBib29sZWFuXG4pOiB2b2lkIHtcblx0cHJvbWlzZXMucHVzaChDb21tb25VdGlscy5zZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUoaW50ZXJuYWxNb2RlbENvbnRleHQsIHJlcXVlc3RQcm9taXNlcywgZm9yQ29udGV4dE1lbnUpLnRoZW4oKCkgPT4gW10pKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBhY3Rpb24gZW5hYmxlbWVudCBmb3IgdGFibGUgY29udGV4dHMuXG4gKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0cyAgU2VsZWN0ZWQgY29udGV4dHMgZm9yIHRoZSBhY3Rpb24uXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbENvbnRleHQgXHRJbnRlcm5hbCBtb2RlbCBjb250ZXh0IHdoZXJlIHRoZSBhY3Rpb24gcHJvcGVydGllcyBhcmUgc2V0LlxuICogQHBhcmFtIGFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb24gZm9yIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaXRpYWxpemVkLlxuICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHRvIGJlIGNoZWNrZWQgZm9yIHRoZSBhY3Rpb24uXG4gKiBAcGFyYW0gcmVxdWVzdFByb21pc2VzIFByb21pc2VzIHRvIGJlIHJlc29sdmVkIGFmdGVyIHNldHRpbmcgdGhlIGFjdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IFRydWUgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUsIGZhbHNlIGlmIGl0IGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXIuXG4gKiBAcGFyYW0gcHJvbWlzZXMgUOKAmnJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYWZ0ZXIgc2V0dGluZyB0aGUgYWN0aW9uIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVRhYmxlQ29udGV4dHMoXG5cdHNlbGVjdGVkQ29udGV4dHM6IENvbnRleHRbXSxcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRhY3Rpb246IHN0cmluZyxcblx0cHJvcGVydHk6IHN0cmluZyxcblx0cmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW4sXG5cdHByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXVxuKTogdm9pZCB7XG5cdGlmICghc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRoYW5kbGVOb1NlbGVjdGVkQ29udGV4dHMoaW50ZXJuYWxNb2RlbENvbnRleHQsIGFjdGlvbiwgcHJvbWlzZXMsIGZvckNvbnRleHRNZW51KTtcblx0fSBlbHNlIGlmIChzZWxlY3RlZENvbnRleHRzLmxlbmd0aCAmJiB0eXBlb2YgcHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRoYW5kbGVTZWxlY3RlZENvbnRleHRzKGludGVybmFsTW9kZWxDb250ZXh0LCByZXF1ZXN0UHJvbWlzZXMsIHByb21pc2VzLCBmb3JDb250ZXh0TWVudSk7XG5cdH1cbn1cblxuY29uc3QgQWN0aW9uUnVudGltZSA9IHtcblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBmaWVsZCBpcyBlbXB0eS5cblx0ICogQHBhcmFtIHBhcmFtZXRlckluZm8gSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRpc1JlcXVpcmVkRmllbGRFbXB0eTogZnVuY3Rpb24gKHBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm8pOiBib29sZWFuIHtcblx0XHRjb25zdCBmaWVsZElkID0gcGFyYW1ldGVySW5mby5maWVsZC5nZXRJZCgpO1xuXHRcdGNvbnN0IGFsbE1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRjb25zdCByZWxldmFudE1lc3NhZ2VzID0gYWxsTWVzc2FnZXMuZmlsdGVyKChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRtc2cuZ2V0Q29udHJvbElkcygpLnNvbWUoKGNvbnRyb2xJZDogc3RyaW5nKSA9PiBjb250cm9sSWQuaW5jbHVkZXMoZmllbGRJZCkpXG5cdFx0KTtcblx0XHRpZiAocmVsZXZhbnRNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0Y29uc3QgaXRlbXMgPSAocGFyYW1ldGVySW5mby5maWVsZCBhcyBNdWx0aVZhbHVlRmllbGQpLmdldEl0ZW1zKCk7XG5cdFx0XHRyZXR1cm4gaXRlbXMgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheShpdGVtcykgJiYgaXRlbXMubGVuZ3RoID09PSAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9IChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEFycmF5ID0gQXJyYXkuaXNBcnJheSgocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKSk7XG5cdFx0XHRpZiAoaXNGaWVsZEFycmF5KSB7XG5cdFx0XHRcdC8vIG9ubHkgZmlyc3QgdmFsdWUgY2hlY2sgaXMgZW5vdWdoIGFzIHRoZSBmaWVsZCB2YWx1ZSBjb21lcyBvbiBbMF0gcmVzdCBvZiB0aGUgYXJyYXkgaW5jbHVkZXMgY3VycmVuY3kgYW5kIGN1cnJlbmN5IGNvZGVcblx0XHRcdFx0Ly8gYm90aCBvZiB3aGljaCBjYW4gb3IgY2Fubm90IGJlIG51bGwsIHNvIHdlIHNoYWxsIGNoZWNrIG9ubHkgdGhlIGZpZWxkIHZhbHVlXG5cdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlWzBdID09PSBudWxsIHx8IGZpZWxkVmFsdWVbMF0gPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gXCJcIjtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBBZGRzIGVycm9yIG1lc3NhZ2VzIGZvciBhbiBhY3Rpb24gcGFyYW1ldGVyIGZpZWxkIHRvIHRoZSBtZXNzYWdlIG1hbmFnZXIuXG5cdCAqIEBwYXJhbSBtZXNzYWdlUGFyYW1ldGVycyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyIGFuZCBtZXNzYWdlcyByZWZlcnJpbmcgdG8gdGhpcyBwYXJhbWV0ZXJcblx0ICovXG5cdF9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAobWVzc2FnZVBhcmFtZXRlcnM6IHsgYWN0aW9uUGFyYW1ldGVySW5mbzogQWN0aW9uUGFyYW1ldGVySW5mbzsgbWVzc2FnZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcblx0XHRtZXNzYWdlUGFyYW1ldGVycy5mb3JFYWNoKChtZXNzYWdlUGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRjb25zdCBiaW5kaW5nID0gbWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldEJpbmRpbmcoXG5cdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdCk7XG5cdFx0XHRpZiAobWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5tYW5hZ2VNZXNzYWdlT25NdWx0aVZhbHVlRmllbGQobWVzc2FnZVBhcmFtZXRlcik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2VQYXJhbWV0ZXIubWVzc2FnZSxcblx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdHByb2Nlc3NvcjogYmluZGluZz8uZ2V0TW9kZWwoKSA/PyB1bmRlZmluZWQsIC8vIGdldE1vZGVsKCk6IG51bGwgfCBNb2RlbCB+fj4gcHJvY2Vzc29yPzogTWVzc2FnZVByb2Nlc3NvclxuXHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHR0YXJnZXQ6IGJpbmRpbmc/LmdldFJlc29sdmVkUGF0aCgpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXR0YWNoIGNoYW5nZSBoYW5kbGVyIHRvIHZhbGlkYXRlIHZhbHVlIGFuZCByZW1vdmUgbWVzc2FnZSBpZiBmaWVsZCBpcyBub3QgZW1wdHlcblx0XHRcdGlmIChiaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGZpZWxkIGlzIG5vIGxvbmdlciBlbXB0eSB1c2luZyB0aGUgZXh0cmFjdGVkIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHRcdFx0XHRpZiAoIUFjdGlvblJ1bnRpbWUuaXNSZXF1aXJlZEZpZWxkRW1wdHkobWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvKSkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBtZXNzYWdlXG5cdFx0XHRcdFx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoW21lc3NhZ2VdKTtcblx0XHRcdFx0XHRcdC8vIERldGFjaCB0aGUgY2hhbmdlIGhhbmRsZXJcblx0XHRcdFx0XHRcdGJpbmRpbmcuZGV0YWNoQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Ly8gVGhlcmUgbWlnaHQgYmUgc2NlYW5yaW9zIGxpa2UgdmFsdWUgaGVscCBvdXQgcGFyYW1ldGVycyB3aGVyZSB0aGUgZmllbGQgaXMgbm90IGV4cGxpY2l0bHkgY2hhbmdlZCBpbnN0ZWFkIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMgZHVlIHRvIHNldFByb3BlcnR5LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCBmaWVsZCBjaGFuZ2UgaXMgbm90IGNhbGxlZCBhbmQgaXMgbm90IGEgcmVsaWFibGUgZXZlbnQgdG8gdmFsaWRhdGUgdGhlIGZpZWxkIHZhbHVlIGFnYWluLlxuXHRcdFx0XHQvLyBTbyB3ZSB1c2UgdmFsdWUvaXRlbXMgYmluZGluZyBjaGFuZ2UgdG8gcmUtdmFsaWRhdGUgdGhlIHByb3BlcnR5IHZhbHVlIHRvIHJlbW92ZSB0aGUgbWVzc2FnZXMuXG5cdFx0XHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXMucHVzaChtZXNzYWdlKTtcblx0XHR9KTtcblxuXHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhtZXNzYWdlcyk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBtZXNzYWdlIHN0YXRlIG9uIG11bHRpIHZhbHVlIGZpZWxkcy5cblx0ICogQHBhcmFtIG1lc3NhZ2VQYXJhbWV0ZXJcblx0ICogQHBhcmFtIG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mb1xuXHQgKiBAcGFyYW0gbWVzc2FnZVBhcmFtZXRlci5tZXNzYWdlXG5cdCAqL1xuXHRtYW5hZ2VNZXNzYWdlT25NdWx0aVZhbHVlRmllbGQ6IGZ1bmN0aW9uIChtZXNzYWdlUGFyYW1ldGVyOiB7IGFjdGlvblBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm87IG1lc3NhZ2U6IHN0cmluZyB9KTogdm9pZCB7XG5cdFx0Y29uc3QgYmluZGluZyA9IG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0bWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLnNldFZhbHVlU3RhdGUoXCJFcnJvclwiKTtcblx0XHRtZXNzYWdlUGFyYW1ldGVyLmFjdGlvblBhcmFtZXRlckluZm8uZmllbGQuc2V0VmFsdWVTdGF0ZVRleHQobWVzc2FnZVBhcmFtZXRlci5tZXNzYWdlKTtcblx0XHRpZiAoYmluZGluZykge1xuXHRcdFx0Y29uc3QgY2hhbmdlSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGZpZWxkIGlzIG5vIGxvbmdlciBlbXB0eSB1c2luZyB0aGUgZXh0cmFjdGVkIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHRcdFx0aWYgKCFBY3Rpb25SdW50aW1lLmlzUmVxdWlyZWRGaWVsZEVtcHR5KG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mbykpIHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIEVSUk9SIHN0YXRlXG5cdFx0XHRcdFx0bWVzc2FnZVBhcmFtZXRlci5hY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLnNldFZhbHVlU3RhdGUoXCJOb25lXCIpO1xuXHRcdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5zZXRWYWx1ZVN0YXRlVGV4dChcIlwiKTtcblx0XHRcdFx0XHQvLyBEZXRhY2ggdGhlIGNoYW5nZSBoYW5kbGVyXG5cdFx0XHRcdFx0YmluZGluZy5kZXRhY2hDaGFuZ2UoY2hhbmdlSGFuZGxlcik7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgYWN0aW9uIHBhcmFtZXRlcnMgY29udGFpbiBkYXRhIGFuZCBjaGVja3MgZm9yIGFsbCBhY3Rpb24gcGFyYW1ldGVycyBpZiB0aGVcblx0ICogY29udGFpbmVkIGRhdGEgaXMgdmFsaWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25QYXJhbWV0ZXJJbmZvcyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIHJlc3VsdCBjYW4gYmUgdHJ1ZSBvciBmYWxzZVxuXHQgKi9cblx0dmFsaWRhdGVQcm9wZXJ0aWVzOiBhc3luYyBmdW5jdGlvbiAoYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXSwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcblx0XHRcdGFjdGlvblBhcmFtZXRlckluZm9zLm1hcChcblx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pOiBQcm9taXNlPHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT4gfCB1bmRlZmluZWQgPT4gYWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZVxuXHRcdFx0KVxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1aXJlZFBhcmFtZXRlckluZm9zID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmlsdGVyKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdChwYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkKS5nZXRSZXF1aXJlZCAmJlxuXHRcdFx0XHQocGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCkuZ2V0UmVxdWlyZWQoKVxuXHRcdCk7XG5cblx0XHRjb25zdCBlbXB0eVJlcXVpcmVkRmllbGRzID0gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvcy5maWx0ZXIodGhpcy5pc1JlcXVpcmVkRmllbGRFbXB0eSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdGVtcHR5UmVxdWlyZWRGaWVsZHMubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiAoe1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX01JU1NJTkdfTUFOREFUT1JZX01TR1wiLCBbXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRQYXJlbnQoKT8uZ2V0QWdncmVnYXRpb24oXCJsYWJlbFwiKSBhcyBMYWJlbCkuZ2V0VGV4dCgpXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0fSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvKiBDaGVjayB2YWx1ZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyAqL1xuXHRcdGNvbnN0IGZpcnN0SW52YWxpZFBhcmFtZXRlciA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHQocGFyYW1ldGVySW5mbykgPT5cblx0XHRcdFx0cGFyYW1ldGVySW5mby5maWVsZC5nZXRWaXNpYmxlKCkgJiZcblx0XHRcdFx0KHBhcmFtZXRlckluZm8uaGFzRXJyb3IgfHwgcGFyYW1ldGVySW5mby5maWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFwiRXJyb3JcIiB8fCBlbXB0eVJlcXVpcmVkRmllbGRzLmluY2x1ZGVzKHBhcmFtZXRlckluZm8pKVxuXHRcdCk7XG5cdFx0aWYgKGZpcnN0SW52YWxpZFBhcmFtZXRlcikge1xuXHRcdFx0Zmlyc3RJbnZhbGlkUGFyYW1ldGVyLmZpZWxkLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRmaXJzdEludmFsaWRQYXJhbWV0ZXIuZmllbGQuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3Rpb24gZW5hYmxlbWVudC5cblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBPYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBtb2RlbFxuXHQgKiBAcGFyYW0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCBNYXAgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIGF2YWlsYWJpbGl0eSBvZiBhY3Rpb25zXG5cdCAqIEBwYXJhbSBhU2VsZWN0ZWRDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHNlbGVjdGVkIGNvbnRleHRzIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gc0NvbnRyb2wgQ29udHJvbCBuYW1lXG5cdCAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUuIElmIGZhbHNlLCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXJcblx0ICogQHJldHVybnMgVGhlIGFjdGlvbiBlbmFibGVtZW50IHByb21pc2VzXG5cdCAqL1xuXHRzZXRBY3Rpb25FbmFibGVtZW50OiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRcdGFTZWxlY3RlZENvbnRleHRzOiBDb250ZXh0W10sXG5cdFx0c0NvbnRyb2w6IHN0cmluZyxcblx0XHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZFtdPiB7XG5cdFx0Y29uc3QgYVByb21pc2VzOiBQcm9taXNlPHZvaWRbXT5bXSA9IFtdO1xuXHRcdGZvciAoY29uc3Qgc0FjdGlvbiBpbiBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwKSB7XG5cdFx0XHRsZXQgYVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10gPSBbXTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzQWN0aW9uLCBmYWxzZSk7XG5cdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHRpbml0aWFsaXplVGFibGVBY3Rpb25Qcm9wZXJ0aWVzKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgc0FjdGlvbiwgZm9yQ29udGV4dE1lbnUpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcFtzQWN0aW9uXTtcblx0XHRcdGZvciAoY29uc3Qgc2VsZWN0ZWRDb250ZXh0IG9mIGFTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdGlmIChzZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdFx0aWYgKHNDb250cm9sID09PSBcImNoYXJ0XCIpIHtcblx0XHRcdFx0XHRcdGlmICgoc1Byb3BlcnR5ID09PSBudWxsICYmICEhb0NvbnRleHREYXRhW2AjJHtzQWN0aW9ufWBdKSB8fCBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMgPSB0aGlzLl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUoXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMsXG5cdFx0XHRcdFx0XHRcdGZvckNvbnRleHRNZW51XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHRoYW5kbGVUYWJsZUNvbnRleHRzKFxuXHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdHNQcm9wZXJ0eSxcblx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzLFxuXHRcdFx0XHRcdGZvckNvbnRleHRNZW51LFxuXHRcdFx0XHRcdGFQcm9taXNlc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyB0cmlnZ2VyIGFuIGV4cGxpY2l0IHJlZnJlc2ggb2YgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXBkYXRlXG5cdFx0XHQvLyBhbHNvIHRoZSBjb250ZXh0cyBpbiBjYXNlIG9mIGN1c3RvbSBhY3Rpb25zXG5cdFx0XHRjb25zdCBzZWxlY3RlZENvbnRleHRzID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBzZWxlY3RlZENvbnRleHRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVByb21pc2VzKS50aGVuKChyZXN1bHRzKSA9PiByZXN1bHRzLmZsYXQoKSk7XG5cdH0sXG5cdHNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoOiBmdW5jdGlvbiAoXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3Qgb0NvbnRyb2xzID0gKG9JbnRlcm5hbE1vZGVsQ29udGV4dERhdGE/LmNvbnRyb2xzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB7IGNvbnRyb2xJZD86IHN0cmluZyB9Pjtcblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbnRyb2xzKSB7XG5cdFx0XHRpZiAob0NvbnRyb2xzW3NLZXldICYmIG9Db250cm9sc1tzS2V5XS5jb250cm9sSWQpIHtcblx0XHRcdFx0Y29uc3Qgb1RhYmxlID0gb1ZpZXcuYnlJZChzS2V5KTtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nID09IG9MaXN0QmluZGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKHRhYmxlQVBJLnRhYmxlRGVmaW5pdGlvbi5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KTtcblx0XHRpZiAoKGlWaWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEgJiYgaXNFZGl0YWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IE1vZGVsSGVscGVyLmdldFJvb3RFbnRpdHlTZXRQYXRoKHNNZXRhUGF0aCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0Py5nZXRDb250ZXh0KG9Db250ZXh0Py5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgY29udmVydGVyQ29udGV4dCA9IENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRcdFx0c0VudGl0eVNldCxcblx0XHRcdFx0bWV0YUNvbnRleHQsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdFx0bWVyZ2Vcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0bGV0IHVwZGF0ZUhpZGRlbjtcblx0XHRcdC8vRmluZCB0aGUgVXBkYXRlIEhpZGRlbiBvZiB0aGUgcm9vdCBlbnRpdHkgc2V0IGFuZCBiaW5kIHRoZSBwcm9wZXJ0eSB0byBBbnlFbGVtZW50LCBhbnkgY2hhbmdlcyBpbiB0aGUgcGF0aCBvZiB0aGUgcm9vdCBVcGRhdGVIaWRkZW4gd2lsbCBiZSB1cGRhdGVkIHZpYSB0aGUgcHJvcGVydHksIGludGVybmFsIG1vZGVsIGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcHJvcGVydHlcblx0XHRcdGNvbnN0IGJVcGRhdGVIaWRkZW4gPSBpc0VudGl0eVNldChlbnRpdHlTZXQpICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRpZiAoYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR1cGRhdGVIaWRkZW4gPSBNb2RlbEhlbHBlci5pc1VwZGF0ZUhpZGRlbihlbnRpdHlTZXQsIGVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly9GaW5kIHRoZSBvcGVyYXRpb24gYXZhaWxhYmxlIHByb3BlcnR5IG9mIHRoZSByb290IGVkaXQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2ggdGhlIHByb3BlcnR5IHVzaW5nIEFueUVsZW1lbnRcblx0XHRcdGNvbnN0IHNFZGl0RW5hYmxlQmluZGluZyA9IGdldEVkaXRCdXR0b25FbmFibGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBkcmFmdFJvb3RQYXRoIHx8IHNTdGlja3lSb290UGF0aDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250ZXh0ID0gb1ZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGlmICh1cGRhdGVIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IHNIaWRkZW5FeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCB1cGRhdGVIaWRkZW4pLCBmYWxzZSkpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzSGlkZGVuRXhwcmVzc2lvbiwgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdFZpc2libGVcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc0VkaXRFbmFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVFZGl0TW9kZWxDb250ZXh0KHNFZGl0RW5hYmxlQmluZGluZywgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdEVuYWJsZWRcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0TW9kZWxDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0c0JpbmRpbmdFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b1Jvb3RDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHNCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb0hpZGRlbkVsZW1lbnQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IHNCaW5kaW5nRXhwcmVzc2lvbiB9KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9IaWRkZW5FbGVtZW50KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LmdldEJpbmRpbmcoXCJhbnlUZXh0XCIpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvSGlkZGVuRWxlbWVudFxuXHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHQ/LmJpbmRDb250ZXh0KG9Sb290Q29udGV4dC5nZXRQYXRoKCksIG9Sb290Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSlcblx0XHRcdFx0Py5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50Py5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKT8uYXR0YWNoQ2hhbmdlKChvRXZlbnQ6IEV2ZW50PHt9LCBQcm9wZXJ0eUJpbmRpbmc+KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9OZXdWYWx1ZSA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzUHJvcGVydHksIG9OZXdWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZTogZnVuY3Rpb24gKFxuXHRcdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdFx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSB7XG5cdFx0Ly8gUmV0cmlldmUgcHJldmlvdXNseSBjaGVja2VkIGNvbnRleHRzIGluIGNhc2Ugb2YgIWZvckNvbnRleHRNZW51XG5cdFx0Y29uc3Qgc0VuYWJsZW1lbnRGaWVsZE5hbWUgPSBmb3JDb250ZXh0TWVudSA/IFwiYkVuYWJsZWRGb3JDb250ZXh0TWVudVwiIDogXCJiRW5hYmxlZFwiLFxuXHRcdFx0YUFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApIHx8IFtdLFxuXHRcdFx0YU5vdEFwcGxpY2FibGU6IFtDb250ZXh0IHwgdW5kZWZpbmVkXSA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hTm90QXBwbGljYWJsZWApIHx8IFtdO1xuXHRcdGxldCBiQWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWApIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFmb3JDb250ZXh0TWVudSkge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlOiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0XHQvLyBEbyBub3QgY2hhbmdlIGVuYWJsZWQsIGFBcHBsaWNhYmxlIGFuZCBhTm90QXBwbGljYWJsZSBwcm9wZXJ0eSBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSBjYWxjdWxhdGlvblxuXHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNvbnRleHQgbWVudSwgb25seSB0aGUgY2xpY2tlZCBjb250ZXh0IGdvZXMgaW50byB0aGUgcHJvY2Vzc2luZyAtIG90aGVyIHNlbGVjdGVkIGNvbnRleHRzIG11c3QgYmUga2VwdCBpbiB0aGUgbW9kZWxcblx0XHRcdFx0YkVuYWJsZWQ6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZGApLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSxcblx0XHRcdFx0YkVuYWJsZWRGb3JDb250ZXh0TWVudTogZmFsc2UsXG5cdFx0XHRcdGFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnU6IFtdLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIE5vdGUgdGhhdCBub24gZHluYW1pYyBhY3Rpb25zIGFyZSBub3QgcHJvY2Vzc2VkIGhlcmUuIFRoZXkgYXJlIGVuYWJsZWQgYmVjYXVzZVxuXHRcdC8vIG9uZSBvciBtb3JlIGFyZSBzZWxlY3RlZCBhbmQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb25kaXRpb24gaW4gdGhlIHRlbXBsYXRpbmdcblx0XHQvLyBpcyB0aGVuIHVuZGVmaW5lZCBhbmQgdGh1cyB0aGUgYnV0dG9uIHRha2VzIHRoZSBkZWZhdWx0IGVuYWJsaW5nLCB3aGljaCBpcyB0cnVlIVxuXHRcdGNvbnN0IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGggPSBgJHtvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9keW5hbWljQWN0aW9ucy8ke3NBY3Rpb259LyR7c0VuYWJsZW1lbnRGaWVsZE5hbWV9YDtcblxuXHRcdGlmICh0eXBlb2Ygc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiICYmIHNQcm9wZXJ0eSAhPT0gbnVsbCAmJiBzUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG9TZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdFx0Y29uc3Qgb1RyYW5zZm9ybWVkQmluZGluZyA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdHNQcm9wZXJ0eSxcblx0XHRcdFx0XHRcIlBhdGhJbk1vZGVsXCIsXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuXHRcdFx0XHRcdGZ1bmN0aW9uIChvQmluZGluZ0V4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0RGF0YSA/IGNvbnN0YW50KG9Db250ZXh0RGF0YVtvQmluZGluZ0V4cHJlc3Npb24ucGF0aF0pIDogY29uc3RhbnQoZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzUmVzdWx0ID0gY29tcGlsZUV4cHJlc3Npb24ob1RyYW5zZm9ybWVkQmluZGluZyk7XG5cdFx0XHRcdGJBY3Rpb25FbmFibGVkID0gYkFjdGlvbkVuYWJsZWQgfHwgc1Jlc3VsdCA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIGJBY3Rpb25FbmFibGVkKTtcblx0XHRcdFx0KHNSZXN1bHQgPT09IFwidHJ1ZVwiID8gYUFwcGxpY2FibGUgOiBhTm90QXBwbGljYWJsZSkucHVzaChvU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdENvbW1vblV0aWxzLnNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNBY3Rpb24sIGFBcHBsaWNhYmxlLCBhTm90QXBwbGljYWJsZSwgZm9yQ29udGV4dE1lbnUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdGlmIChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHtcblx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TZWxlY3RlZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHByb21pc2VzIHRvIHJldHJpZXZlIHNpbmdsZXRvbiBvciBub3JtYWwgcHJvcGVydHkgdmFsdWUgYXN5bmNocm9ub3VzbHlcblx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnJlcXVlc3RQcm9wZXJ0eShvU2VsZWN0ZWRDb250ZXh0LCBzQWN0aW9uLCBzUHJvcGVydHksIHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFSZXF1ZXN0UHJvbWlzZXM7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25SdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztFQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQSwrQkFBK0JBLENBQUNDLG9CQUEwQyxFQUFFQyxNQUFjLEVBQUVDLGNBQXVCLEVBQVE7SUFDbklGLG9CQUFvQixDQUFDRyxXQUFXLENBQUMsa0JBQWtCRixNQUFNLGNBQWMsRUFBRSxFQUFFLENBQUM7SUFDNUVELG9CQUFvQixDQUFDRyxXQUFXLENBQUMsa0JBQWtCRixNQUFNLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztJQUMvRSxJQUFJ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
@@ -119,25 +119,101 @@ function handleTableContexts(
119
119
  }
120
120
 
121
121
  const ActionRuntime = {
122
+ /**
123
+ * Checks if a required parameter field is empty.
124
+ * @param parameterInfo Information identifying an action parameter
125
+ * @returns True if the field is empty, false otherwise
126
+ */
127
+ isRequiredFieldEmpty: function (parameterInfo: ActionParameterInfo): boolean {
128
+ const fieldId = parameterInfo.field.getId();
129
+ const allMessages = Messaging.getMessageModel().getData();
130
+ const relevantMessages = allMessages.filter((msg: Message) =>
131
+ msg.getControlIds().some((controlId: string) => controlId.includes(fieldId))
132
+ );
133
+ if (relevantMessages.length > 0) {
134
+ return false;
135
+ } else if (parameterInfo.isMultiValue) {
136
+ const items = (parameterInfo.field as MultiValueField).getItems();
137
+ return items === undefined || (Array.isArray(items) && items.length === 0);
138
+ } else {
139
+ const fieldValue = (parameterInfo.field as Field).getValue();
140
+ const isFieldArray = Array.isArray((parameterInfo.field as Field).getValue());
141
+ if (isFieldArray) {
142
+ // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
143
+ // both of which can or cannot be null, so we shall check only the field value
144
+ return fieldValue[0] === null || fieldValue[0] === "";
145
+ }
146
+ return fieldValue === undefined || fieldValue === null || fieldValue === "";
147
+ }
148
+ },
122
149
  /**
123
150
  * Adds error messages for an action parameter field to the message manager.
124
151
  * @param messageParameters Information identifying an action parameter and messages referring to this parameter
125
152
  */
126
153
  _addMessageForActionParameter: function (messageParameters: { actionParameterInfo: ActionParameterInfo; message: string }[]): void {
127
- Messaging.addMessages(
128
- messageParameters.map((messageParameter) => {
129
- const binding = messageParameter.actionParameterInfo.field.getBinding(
130
- messageParameter.actionParameterInfo.isMultiValue ? "items" : "value"
131
- );
132
- return new Message({
133
- message: messageParameter.message,
134
- type: MessageType.Error,
135
- processor: binding?.getModel() ?? undefined, // getModel(): null | Model ~~> processor?: MessageProcessor
136
- persistent: true,
137
- target: binding?.getResolvedPath()
138
- });
139
- })
140
- );
154
+ const messages: Message[] = [];
155
+ messageParameters.forEach((messageParameter) => {
156
+ const binding = messageParameter.actionParameterInfo.field.getBinding(
157
+ messageParameter.actionParameterInfo.isMultiValue ? "items" : "value"
158
+ );
159
+ if (messageParameter.actionParameterInfo.isMultiValue) {
160
+ return this.manageMessageOnMultiValueField(messageParameter);
161
+ }
162
+
163
+ const message = new Message({
164
+ message: messageParameter.message,
165
+ type: MessageType.Error,
166
+ processor: binding?.getModel() ?? undefined, // getModel(): null | Model ~~> processor?: MessageProcessor
167
+ persistent: true,
168
+ target: binding?.getResolvedPath()
169
+ });
170
+
171
+ // Attach change handler to validate value and remove message if field is not empty
172
+ if (binding) {
173
+ const changeHandler = (): void => {
174
+ // Check if the field is no longer empty using the extracted validation function
175
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
176
+ // Remove the message
177
+ Messaging.removeMessages([message]);
178
+ // Detach the change handler
179
+ binding.detachChange(changeHandler);
180
+ }
181
+ };
182
+ // There might be sceanrios like value help out parameters where the field is not explicitly changed instead property value changes due to setProperty.
183
+ // In such cases, field change is not called and is not a reliable event to validate the field value again.
184
+ // So we use value/items binding change to re-validate the property value to remove the messages.
185
+ binding.attachChange(changeHandler);
186
+ }
187
+ messages.push(message);
188
+ });
189
+
190
+ Messaging.addMessages(messages);
191
+ },
192
+ /**
193
+ * Manages the message state on multi value fields.
194
+ * @param messageParameter
195
+ * @param messageParameter.actionParameterInfo
196
+ * @param messageParameter.message
197
+ */
198
+ manageMessageOnMultiValueField: function (messageParameter: { actionParameterInfo: ActionParameterInfo; message: string }): void {
199
+ const binding = messageParameter.actionParameterInfo.field.getBinding("items");
200
+ messageParameter.actionParameterInfo.field.setValueState("Error");
201
+ messageParameter.actionParameterInfo.field.setValueStateText(messageParameter.message);
202
+ if (binding) {
203
+ const changeHandler = (): void => {
204
+ // Check if the field is no longer empty using the extracted validation function
205
+ if (!ActionRuntime.isRequiredFieldEmpty(messageParameter.actionParameterInfo)) {
206
+ // Remove the ERROR state
207
+ messageParameter.actionParameterInfo.field.setValueState("None");
208
+ messageParameter.actionParameterInfo.field.setValueStateText("");
209
+ // Detach the change handler
210
+ binding.detachChange(changeHandler);
211
+ }
212
+ };
213
+
214
+ binding.attachChange(changeHandler);
215
+ }
216
+ return;
141
217
  },
142
218
 
143
219
  /**
@@ -160,27 +236,7 @@ const ActionRuntime = {
160
236
  (parameterInfo.field as Field | MultiValueField).getRequired()
161
237
  );
162
238
 
163
- const allMessages = Messaging.getMessageModel().getData();
164
- const emptyRequiredFields = requiredParameterInfos.filter((requiredParameterInfo) => {
165
- const fieldId = requiredParameterInfo.field.getId();
166
- const relevantMessages = allMessages.filter((msg: Message) =>
167
- msg.getControlIds().some((controlId: string) => controlId.includes(fieldId))
168
- );
169
- if (relevantMessages.length > 0) {
170
- return false;
171
- } else if (requiredParameterInfo.isMultiValue) {
172
- return requiredParameterInfo.value === undefined || !requiredParameterInfo.value.length;
173
- } else {
174
- const fieldValue = (requiredParameterInfo.field as Field).getValue();
175
- const isFieldArray = Array.isArray((requiredParameterInfo.field as Field).getValue());
176
- if (isFieldArray) {
177
- // only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
178
- // both of which can or cannot be null, so we shall check only the field value
179
- return fieldValue[0] === null || fieldValue[0] === "";
180
- }
181
- return fieldValue === undefined || fieldValue === null || fieldValue === "";
182
- }
183
- });
239
+ const emptyRequiredFields = requiredParameterInfos.filter(this.isRequiredFieldEmpty);
184
240
  /* Message for missing mandatory value of the action parameter */
185
241
  if (emptyRequiredFields.length) {
186
242
  this._addMessageForActionParameter(