@sapui5/sap.fe.core 1.99.0 → 1.100.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -14,647 +14,627 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
14
14
 
15
15
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
16
 
17
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
18
-
19
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
20
-
21
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
22
-
23
17
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
24
18
 
25
19
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
26
20
 
27
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
28
-
29
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
30
-
31
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
32
-
33
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
34
-
35
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
36
-
37
21
  var SideEffectsService = /*#__PURE__*/function (_Service) {
38
22
  _inherits(SideEffectsService, _Service);
39
23
 
40
- var _super = _createSuper(SideEffectsService);
41
-
42
24
  function SideEffectsService() {
43
- _classCallCheck(this, SideEffectsService);
44
-
45
- return _super.apply(this, arguments);
25
+ return _Service.apply(this, arguments) || this;
46
26
  }
47
27
 
48
28
  _exports.SideEffectsService = SideEffectsService;
29
+ var _proto = SideEffectsService.prototype;
30
+
31
+ // !: means that we know it will be assigned before usage
32
+ _proto.init = function init() {
33
+ this._oSideEffectsType = {
34
+ oData: {
35
+ entities: {},
36
+ actions: {}
37
+ },
38
+ control: {}
39
+ };
40
+ this._bInitialized = false;
41
+ this.initPromise = Promise.resolve(this);
42
+ }
43
+ /**
44
+ * Adds a SideEffects control
45
+ * SideEffects definition is added by a control to keep data up to date
46
+ * These SideEffects get limited scope compared with SideEffects coming from an OData service:
47
+ * - Only one SideEffects definition can be defined for the combination entity type - control Id
48
+ * - Only SideEffects source properties are recognized and used to trigger SideEffects
49
+ *
50
+ * Ensure the sourceControlId matches the associated SAPUI5 control ID.
51
+ *
52
+ * @private
53
+ * @ui5-restricted
54
+ * @param {string} sEntityType Name of the entity type
55
+ * @param {object} oSideEffect SideEffects definition
56
+ */
57
+ ;
58
+
59
+ _proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffect) {
60
+ if (oSideEffect.sourceControlId) {
61
+ var oControlSideEffect = _objectSpread(_objectSpread({}, oSideEffect), {}, {
62
+ fullyQualifiedName: sEntityType + "/SideEffectsForControl/" + oSideEffect.sourceControlId
63
+ });
49
64
 
50
- _createClass(SideEffectsService, [{
51
- key: "init",
52
- value: // !: means that we know it will be assigned before usage
53
- function init() {
54
- this._oSideEffectsType = {
55
- oData: {
56
- entities: {},
57
- actions: {}
58
- },
59
- control: {}
60
- };
61
- this._bInitialized = false;
62
- this.initPromise = Promise.resolve(this);
65
+ var mEntityControlSideEffects = this._oSideEffectsType.control[sEntityType] || {};
66
+ mEntityControlSideEffects[oControlSideEffect.sourceControlId] = oControlSideEffect;
67
+ this._oSideEffectsType.control[sEntityType] = mEntityControlSideEffects;
63
68
  }
64
- /**
65
- * Adds a SideEffects control
66
- * SideEffects definition is added by a control to keep data up to date
67
- * These SideEffects get limited scope compared with SideEffects coming from an OData service:
68
- * - Only one SideEffects definition can be defined for the combination entity type - control Id
69
- * - Only SideEffects source properties are recognized and used to trigger SideEffects
70
- *
71
- * Ensure the sourceControlId matches the associated SAPUI5 control ID.
72
- *
73
- * @private
74
- * @ui5-restricted
75
- * @param {string} sEntityType Name of the entity type
76
- * @param {object} oSideEffect SideEffects definition
77
- */
78
-
79
- }, {
80
- key: "addControlSideEffects",
81
- value: function addControlSideEffects(sEntityType, oSideEffect) {
82
- if (oSideEffect.sourceControlId) {
83
- var oControlSideEffect = _objectSpread(_objectSpread({}, oSideEffect), {}, {
84
- fullyQualifiedName: sEntityType + "/SideEffectsForControl/" + oSideEffect.sourceControlId
85
- });
86
-
87
- var mEntityControlSideEffects = this._oSideEffectsType.control[sEntityType] || {};
88
- mEntityControlSideEffects[oControlSideEffect.sourceControlId] = oControlSideEffect;
89
- this._oSideEffectsType.control[sEntityType] = mEntityControlSideEffects;
69
+ }
70
+ /**
71
+ * Executes SideEffects action.
72
+ *
73
+ * @private
74
+ * @ui5-restricted
75
+ * @param {string} sTriggerAction Name of the action
76
+ * @param {object} oContext Context
77
+ * @param {string} sGroupId The group ID to be used for the request
78
+ * @returns {Promise} A promise that is resolved without data or with a return value context when the action call succeeded
79
+ */
80
+ ;
81
+
82
+ _proto.executeAction = function executeAction(sTriggerAction, oContext, sGroupId) {
83
+ var oTriggerAction = oContext.getModel().bindContext(sTriggerAction + "(...)", oContext);
84
+ return oTriggerAction.execute(sGroupId || oContext.getBinding().getUpdateGroupId());
85
+ }
86
+ /**
87
+ * Gets converted OData metaModel.
88
+ *
89
+ * @private
90
+ * @ui5-restricted
91
+ * @returns {object} Converted OData metaModel
92
+ */
93
+ ;
94
+
95
+ _proto.getConvertedMetaModel = function getConvertedMetaModel() {
96
+ var oContext = this.getContext();
97
+ var oComponent = oContext.scopeObject;
98
+ var oMetaModel = oComponent.getModel().getMetaModel();
99
+ return convertTypes(oMetaModel, this._oCapabilities);
100
+ }
101
+ /**
102
+ * Gets the entity type of a context.
103
+ *
104
+ * @function
105
+ * @name getEntityTypeFromContext
106
+ * @param {object} oContext Context
107
+ * @returns {string | undefined } Entity Type
108
+ */
109
+ ;
110
+
111
+ _proto.getEntityTypeFromContext = function getEntityTypeFromContext(oContext) {
112
+ var oMetaModel = oContext.getModel().getMetaModel(),
113
+ sMetaPath = oMetaModel.getMetaPath(oContext.getPath()),
114
+ sEntityType = oMetaModel.getObject(sMetaPath)["$Type"];
115
+ return sEntityType;
116
+ }
117
+ /**
118
+ * Gets the SideEffects that come from an OData service.
119
+ *
120
+ * @private
121
+ * @ui5-restricted
122
+ * @param {string} sEntityTypeName Name of the entity type
123
+ * @returns {object} SideEffects dictionary
124
+ */
125
+ ;
126
+
127
+ _proto.getODataEntitySideEffects = function getODataEntitySideEffects(sEntityTypeName) {
128
+ return this._oSideEffectsType.oData.entities[sEntityTypeName] || {};
129
+ }
130
+ /**
131
+ * Gets the SideEffects that come from an OData service.
132
+ *
133
+ * @private
134
+ * @ui5-restricted
135
+ * @param {string} sActionName Name of the action
136
+ * @param {object} oContext Context
137
+ * @returns {object} SideEffects definition
138
+ */
139
+ ;
140
+
141
+ _proto.getODataActionSideEffects = function getODataActionSideEffects(sActionName, oContext) {
142
+ if (oContext) {
143
+ var sEntityType = this.getEntityTypeFromContext(oContext);
144
+
145
+ if (sEntityType) {
146
+ var _this$_oSideEffectsTy;
147
+
148
+ return (_this$_oSideEffectsTy = this._oSideEffectsType.oData.actions[sEntityType]) === null || _this$_oSideEffectsTy === void 0 ? void 0 : _this$_oSideEffectsTy[sActionName];
90
149
  }
91
150
  }
92
- /**
93
- * Executes SideEffects action.
94
- *
95
- * @private
96
- * @ui5-restricted
97
- * @param {string} sTriggerAction Name of the action
98
- * @param {object} oContext Context
99
- * @param {string} sGroupId The group ID to be used for the request
100
- */
101
-
102
- }, {
103
- key: "executeAction",
104
- value: function executeAction(sTriggerAction, oContext, sGroupId) {
105
- var oTriggerAction = oContext.getModel().bindContext(sTriggerAction + "(...)", oContext);
106
- oTriggerAction.execute(sGroupId || oContext.getBinding().getUpdateGroupId());
107
- }
108
- /**
109
- * Gets converted OData metaModel.
110
- *
111
- * @private
112
- * @ui5-restricted
113
- * @returns {object} Converted OData metaModel
114
- */
115
-
116
- }, {
117
- key: "getConvertedMetaModel",
118
- value: function getConvertedMetaModel() {
119
- var oContext = this.getContext();
120
- var oComponent = oContext.scopeObject;
121
- var oMetaModel = oComponent.getModel().getMetaModel();
122
- return convertTypes(oMetaModel, this._oCapabilities);
123
- }
124
- /**
125
- * Gets the entity type of a context.
126
- *
127
- * @function
128
- * @name getEntityTypeFromContext
129
- * @param {object} oContext Context
130
- * @returns {string | undefined } Entity Type
131
- */
132
-
133
- }, {
134
- key: "getEntityTypeFromContext",
135
- value: function getEntityTypeFromContext(oContext) {
136
- var oMetaModel = oContext.getModel().getMetaModel(),
137
- sMetaPath = oMetaModel.getMetaPath(oContext.getPath()),
138
- sEntityType = oMetaModel.getObject(sMetaPath)["$Type"];
139
- return sEntityType;
140
- }
141
- /**
142
- * Gets the SideEffects that come from an OData service.
143
- *
144
- * @private
145
- * @ui5-restricted
146
- * @param {string} sEntityTypeName Name of the entity type
147
- * @returns {object} SideEffects dictionary
148
- */
149
151
 
150
- }, {
151
- key: "getODataEntitySideEffects",
152
- value: function getODataEntitySideEffects(sEntityTypeName) {
153
- return this._oSideEffectsType.oData.entities[sEntityTypeName] || {};
152
+ return undefined;
153
+ }
154
+ /**
155
+ * Generates the dictionary for the SideEffects.
156
+ *
157
+ * @private
158
+ * @ui5-restricted
159
+ * @param oCapabilities The current capabilities
160
+ */
161
+ ;
162
+
163
+ _proto.initializeSideEffects = function initializeSideEffects(oCapabilities) {
164
+ var _this = this;
165
+
166
+ this._oCapabilities = oCapabilities;
167
+
168
+ if (!this._bInitialized) {
169
+ var oConvertedMetaModel = this.getConvertedMetaModel();
170
+ oConvertedMetaModel.entityTypes.forEach(function (entityType) {
171
+ _this._oSideEffectsType.oData.entities[entityType.fullyQualifiedName] = _this._retrieveODataEntitySideEffects(entityType);
172
+ _this._oSideEffectsType.oData.actions[entityType.fullyQualifiedName] = _this._retrieveODataActionsSideEffects(entityType); // only bound actions are analyzed since unbound ones don't get SideEffects
173
+ });
174
+ this._bInitialized = true;
154
175
  }
155
- /**
156
- * Gets the SideEffects that come from an OData service.
157
- *
158
- * @private
159
- * @ui5-restricted
160
- * @param {string} sActionName Name of the action
161
- * @param {object} oContext Context
162
- * @returns {object} SideEffects definition
163
- */
164
-
165
- }, {
166
- key: "getODataActionSideEffects",
167
- value: function getODataActionSideEffects(sActionName, oContext) {
168
- if (oContext) {
169
- var sEntityType = this.getEntityTypeFromContext(oContext);
170
-
171
- if (sEntityType) {
172
- var _this$_oSideEffectsTy;
173
-
174
- return (_this$_oSideEffectsTy = this._oSideEffectsType.oData.actions[sEntityType]) === null || _this$_oSideEffectsTy === void 0 ? void 0 : _this$_oSideEffectsTy[sActionName];
175
- }
176
+ }
177
+ /**
178
+ * Removes all SideEffects related to a control.
179
+ *
180
+ * @private
181
+ * @ui5-restricted
182
+ * @param {string} sControlId Control Id
183
+ */
184
+ ;
185
+
186
+ _proto.removeControlSideEffects = function removeControlSideEffects(sControlId) {
187
+ var _this2 = this;
188
+
189
+ Object.keys(this._oSideEffectsType.control).forEach(function (sEntityType) {
190
+ if (_this2._oSideEffectsType.control[sEntityType][sControlId]) {
191
+ delete _this2._oSideEffectsType.control[sEntityType][sControlId];
176
192
  }
177
-
178
- return undefined;
179
- }
193
+ });
194
+ }
195
+ /**
196
+ * Request SideEffects on a specific context.
197
+ *
198
+ * @function
199
+ * @name requestSideEffects
200
+ * @param {Array} aPathExpressions Targets of SideEffects to be executed
201
+ * @param {object} oContext Context where SideEffects need to be executed
202
+ * @param {string} sGroupId The group ID to be used for the request
203
+ * @returns {Promise} Promise on SideEffects request
204
+ */
205
+ ;
206
+
207
+ _proto.requestSideEffects = function requestSideEffects(aPathExpressions, oContext, sGroupId) {
208
+ this._logRequest(aPathExpressions, oContext);
209
+
210
+ var oPromise;
180
211
  /**
181
- * Generates the dictionary for the SideEffects.
182
- *
183
- * @private
184
- * @ui5-restricted
185
- * @param oCapabilities The current capabilities
212
+ * Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
213
+ * to avoid breaking the promise chain.
186
214
  */
187
215
 
188
- }, {
189
- key: "initializeSideEffects",
190
- value: function initializeSideEffects(oCapabilities) {
191
- var _this = this;
216
+ try {
217
+ oPromise = oContext.requestSideEffects(aPathExpressions, sGroupId);
218
+ } catch (e) {
219
+ oPromise = Promise.reject(e);
220
+ }
192
221
 
193
- this._oCapabilities = oCapabilities;
222
+ return oPromise;
223
+ };
194
224
 
195
- if (!this._bInitialized) {
196
- var oConvertedMetaModel = this.getConvertedMetaModel();
197
- oConvertedMetaModel.entityTypes.forEach(function (entityType) {
198
- _this._oSideEffectsType.oData.entities[entityType.fullyQualifiedName] = _this._retrieveODataEntitySideEffects(entityType);
199
- _this._oSideEffectsType.oData.actions[entityType.fullyQualifiedName] = _this._retrieveODataActionsSideEffects(entityType); // only bound actions are analyzed since unbound ones don't get SideEffects
200
- });
201
- this._bInitialized = true;
202
- }
203
- }
204
- /**
205
- * Removes all SideEffects related to a control.
206
- *
207
- * @private
208
- * @ui5-restricted
209
- * @param {string} sControlId Control Id
210
- */
225
+ _proto.requestSideEffectsForODataAction = function requestSideEffectsForODataAction(sideEffects, oContext) {
226
+ var _sideEffects$triggerA,
227
+ _this3 = this,
228
+ _sideEffects$pathExpr;
211
229
 
212
- }, {
213
- key: "removeControlSideEffects",
214
- value: function removeControlSideEffects(sControlId) {
215
- var _this2 = this;
230
+ var aPromises;
216
231
 
217
- Object.keys(this._oSideEffectsType.control).forEach(function (sEntityType) {
218
- if (_this2._oSideEffectsType.control[sEntityType][sControlId]) {
219
- delete _this2._oSideEffectsType.control[sEntityType][sControlId];
220
- }
232
+ if ((_sideEffects$triggerA = sideEffects.triggerActions) !== null && _sideEffects$triggerA !== void 0 && _sideEffects$triggerA.length) {
233
+ aPromises = sideEffects.triggerActions.map(function (sTriggerActionName) {
234
+ return _this3.executeAction(sTriggerActionName, oContext);
221
235
  });
236
+ } else {
237
+ aPromises = [];
222
238
  }
223
- /**
224
- * Request SideEffects on a specific context.
225
- *
226
- * @function
227
- * @name requestSideEffects
228
- * @param {Array} aPathExpressions Targets of SideEffects to be executed
229
- * @param {object} oContext Context where SideEffects need to be executed
230
- * @param {string} sGroupId The group ID to be used for the request
231
- * @returns {Promise} Promise on SideEffects request
232
- */
233
-
234
- }, {
235
- key: "requestSideEffects",
236
- value: function requestSideEffects(aPathExpressions, oContext, sGroupId) {
237
- this._logRequest(aPathExpressions, oContext);
238
-
239
- var oPromise;
240
- /**
241
- * Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
242
- * to avoid breaking the promise chain.
243
- */
244
239
 
245
- try {
246
- oPromise = oContext.requestSideEffects(aPathExpressions, sGroupId);
247
- } catch (e) {
248
- oPromise = Promise.reject(e);
249
- }
250
-
251
- return oPromise;
240
+ if ((_sideEffects$pathExpr = sideEffects.pathExpressions) !== null && _sideEffects$pathExpr !== void 0 && _sideEffects$pathExpr.length) {
241
+ aPromises.push(this.requestSideEffects(sideEffects.pathExpressions, oContext));
252
242
  }
253
- /**
254
- * Request SideEffects for a navigation property on a specific context.
255
- *
256
- * @function
257
- * @name requestSideEffectsForNavigationProperty
258
- * @param {string} sNavigationProperty Navigation property
259
- * @param {object} oContext Context where SideEffects need to be executed
260
- * @returns {object} SideEffects request on SAPUI5 context
261
- */
262
-
263
- }, {
264
- key: "requestSideEffectsForNavigationProperty",
265
- value: function requestSideEffectsForNavigationProperty(sNavigationProperty, oContext) {
266
- var _this3 = this;
267
-
268
- var sBaseEntityType = this.getEntityTypeFromContext(oContext);
269
243
 
270
- if (sBaseEntityType) {
271
- var sNavigationPath = sNavigationProperty + "/";
272
- var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
273
- var aTargets = [];
274
- Object.keys(aSideEffects).filter( // Keep relevant SideEffects
275
- function (sAnnotationName) {
276
- var oSideEffects = aSideEffects[sAnnotationName];
277
- return (oSideEffects.SourceProperties || []).some(function (oPropertyPath) {
278
- var sPropertyPath = oPropertyPath.value;
279
- return sPropertyPath.startsWith(sNavigationPath) && sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1;
280
- }) || (oSideEffects.SourceEntities || []).some(function (oNavigationPropertyPath) {
281
- return oNavigationPropertyPath.value === sNavigationProperty;
282
- });
283
- }).forEach(function (sAnnotationName) {
284
- var oSideEffects = aSideEffects[sAnnotationName];
244
+ return aPromises.length ? Promise.all(aPromises) : Promise.resolve();
245
+ }
246
+ /**
247
+ * Request SideEffects for a navigation property on a specific context.
248
+ *
249
+ * @function
250
+ * @name requestSideEffectsForNavigationProperty
251
+ * @param {string} sNavigationProperty Navigation property
252
+ * @param {object} oContext Context where SideEffects need to be executed
253
+ * @returns {object} SideEffects request on SAPUI5 context
254
+ */
255
+ ;
256
+
257
+ _proto.requestSideEffectsForNavigationProperty = function requestSideEffectsForNavigationProperty(sNavigationProperty, oContext) {
258
+ var _this4 = this;
259
+
260
+ var sBaseEntityType = this.getEntityTypeFromContext(oContext);
261
+
262
+ if (sBaseEntityType) {
263
+ var sNavigationPath = sNavigationProperty + "/";
264
+ var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
265
+ var aTargets = [];
266
+ Object.keys(aSideEffects).filter( // Keep relevant SideEffects
267
+ function (sAnnotationName) {
268
+ var oSideEffects = aSideEffects[sAnnotationName];
269
+ return (oSideEffects.SourceProperties || []).some(function (oPropertyPath) {
270
+ var sPropertyPath = oPropertyPath.value;
271
+ return sPropertyPath.startsWith(sNavigationPath) && sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1;
272
+ }) || (oSideEffects.SourceEntities || []).some(function (oNavigationPropertyPath) {
273
+ return oNavigationPropertyPath.value === sNavigationProperty;
274
+ });
275
+ }).forEach(function (sAnnotationName) {
276
+ var oSideEffects = aSideEffects[sAnnotationName];
285
277
 
286
- if (oSideEffects.TriggerAction) {
287
- _this3.executeAction(oSideEffects.TriggerAction, oContext);
288
- }
278
+ if (oSideEffects.TriggerAction) {
279
+ _this4.executeAction(oSideEffects.TriggerAction, oContext);
280
+ }
289
281
 
290
- (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []).forEach(function (mTarget) {
291
- return aTargets.push(mTarget);
292
- });
293
- }); // Remove duplicate properties
282
+ (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []).forEach(function (mTarget) {
283
+ return aTargets.push(mTarget);
284
+ });
285
+ }); // Remove duplicate properties
294
286
 
295
- aTargets = this._removeDuplicateTargets(aTargets);
287
+ aTargets = this._removeDuplicateTargets(aTargets);
296
288
 
297
- if (aTargets.length > 0) {
298
- return this.requestSideEffects(aTargets, oContext).catch(function (oError) {
299
- return Log.error("SideEffects - Error while processing SideEffects for Navigation Property " + sNavigationProperty, oError);
300
- });
301
- }
289
+ if (aTargets.length > 0) {
290
+ return this.requestSideEffects(aTargets, oContext).catch(function (oError) {
291
+ return Log.error("SideEffects - Error while processing SideEffects for Navigation Property " + sNavigationProperty, oError);
292
+ });
302
293
  }
303
-
304
- return Promise.resolve();
305
294
  }
306
- /**
307
- * Gets the SideEffects that come from controls.
308
- *
309
- * @private
310
- * @ui5-restricted
311
- * @param {string} sEntityTypeName Entity type Name
312
- * @returns {object} SideEffects dictionary
313
- */
314
295
 
315
- }, {
316
- key: "getControlEntitySideEffects",
317
- value: function getControlEntitySideEffects(sEntityTypeName) {
318
- return this._oSideEffectsType.control[sEntityTypeName] || {};
319
- }
320
- /**
321
- * Adds the text properties required for SideEffects
322
- * If a property has an associated text then this text needs to be added as targetProperties or targetEntities.
323
- *
324
- * @private
325
- * @ui5-restricted
326
- * @param {object} oSideEffect SideEffects definition
327
- * @param {object} mEntityType Entity type
328
- * @returns {object} SideEffects definition with added text properties
329
- */
330
-
331
- }, {
332
- key: "_addRequiredTextProperties",
333
- value: function _addRequiredTextProperties(oSideEffect, mEntityType) {
334
- var aInitialProperties = oSideEffect.TargetProperties || [],
335
- aEntitiesRequested = (oSideEffect.TargetEntities || []).map(function (navigation) {
336
- return navigation.$NavigationPropertyPath;
337
- });
338
- var aDerivedProperties = [];
339
- aInitialProperties.forEach(function (sPropertyPath) {
340
- var bIsStarProperty = sPropertyPath.endsWith("*"),
341
- // Can be '*' or '.../navProp/*'
342
- sNavigationPropertyPath = sPropertyPath.substring(0, sPropertyPath.lastIndexOf("/")),
343
- sRelativePath = sNavigationPropertyPath ? sNavigationPropertyPath + "/" : "",
344
- mTarget = mEntityType.resolvePath(sNavigationPropertyPath) || mEntityType;
345
-
346
- if (mTarget) {
347
- var _targetType;
348
-
349
- // mTarget can be an entity type, navigationProperty or or a complexType
350
- var aTargetEntityProperties = mTarget.entityProperties || ((_targetType = mTarget.targetType) === null || _targetType === void 0 ? void 0 : _targetType.properties) || mTarget.targetType.entityProperties;
351
-
352
- if (aTargetEntityProperties) {
353
- if (bIsStarProperty) {
354
- // Add all required properties behind the *
355
- aEntitiesRequested.push(sNavigationPropertyPath);
356
- aDerivedProperties = aDerivedProperties.concat(aTargetEntityProperties.map(function (mProperty) {
357
- return {
358
- navigationPath: sRelativePath,
359
- property: mProperty
360
- };
361
- }));
362
- } else {
363
- aDerivedProperties.push({
364
- property: aTargetEntityProperties.find(function (mProperty) {
365
- return mProperty.name === sPropertyPath.split("/").pop();
366
- }),
367
- navigationPath: sRelativePath
368
- });
369
- }
296
+ return Promise.resolve();
297
+ }
298
+ /**
299
+ * Gets the SideEffects that come from controls.
300
+ *
301
+ * @private
302
+ * @ui5-restricted
303
+ * @param {string} sEntityTypeName Entity type Name
304
+ * @returns {object} SideEffects dictionary
305
+ */
306
+ ;
307
+
308
+ _proto.getControlEntitySideEffects = function getControlEntitySideEffects(sEntityTypeName) {
309
+ return this._oSideEffectsType.control[sEntityTypeName] || {};
310
+ }
311
+ /**
312
+ * Adds the text properties required for SideEffects
313
+ * If a property has an associated text then this text needs to be added as targetProperties or targetEntities.
314
+ *
315
+ * @private
316
+ * @ui5-restricted
317
+ * @param {object} oSideEffect SideEffects definition
318
+ * @param {object} mEntityType Entity type
319
+ * @returns {object} SideEffects definition with added text properties
320
+ */
321
+ ;
322
+
323
+ _proto._addRequiredTextProperties = function _addRequiredTextProperties(oSideEffect, mEntityType) {
324
+ var aInitialProperties = oSideEffect.TargetProperties || [],
325
+ aEntitiesRequested = (oSideEffect.TargetEntities || []).map(function (navigation) {
326
+ return navigation.$NavigationPropertyPath;
327
+ });
328
+ var aDerivedProperties = [];
329
+ aInitialProperties.forEach(function (sPropertyPath) {
330
+ var bIsStarProperty = sPropertyPath.endsWith("*"),
331
+ // Can be '*' or '.../navProp/*'
332
+ sNavigationPropertyPath = sPropertyPath.substring(0, sPropertyPath.lastIndexOf("/")),
333
+ sRelativePath = sNavigationPropertyPath ? sNavigationPropertyPath + "/" : "",
334
+ mTarget = mEntityType.resolvePath(sNavigationPropertyPath) || mEntityType;
335
+
336
+ if (mTarget) {
337
+ var _targetType;
338
+
339
+ // mTarget can be an entity type, navigationProperty or or a complexType
340
+ var aTargetEntityProperties = mTarget.entityProperties || ((_targetType = mTarget.targetType) === null || _targetType === void 0 ? void 0 : _targetType.properties) || mTarget.targetType.entityProperties;
341
+
342
+ if (aTargetEntityProperties) {
343
+ if (bIsStarProperty) {
344
+ // Add all required properties behind the *
345
+ aEntitiesRequested.push(sNavigationPropertyPath);
346
+ aDerivedProperties = aDerivedProperties.concat(aTargetEntityProperties.map(function (mProperty) {
347
+ return {
348
+ navigationPath: sRelativePath,
349
+ property: mProperty
350
+ };
351
+ }));
370
352
  } else {
371
- Log.info("SideEffects - The entity type associated to property path " + sPropertyPath + " cannot be resolved");
353
+ aDerivedProperties.push({
354
+ property: aTargetEntityProperties.find(function (mProperty) {
355
+ return mProperty.name === sPropertyPath.split("/").pop();
356
+ }),
357
+ navigationPath: sRelativePath
358
+ });
372
359
  }
373
360
  } else {
374
- Log.info("SideEffects - The property path " + sPropertyPath + " cannot be resolved");
375
- }
376
- });
377
- aDerivedProperties.forEach(function (mPropertyInfo) {
378
- if (mPropertyInfo.property) {
379
- var _mPropertyInfo$proper, _mPropertyInfo$proper2, _mPropertyInfo$proper3;
380
-
381
- var sTargetTextPath = (_mPropertyInfo$proper = mPropertyInfo.property.annotations) === null || _mPropertyInfo$proper === void 0 ? void 0 : (_mPropertyInfo$proper2 = _mPropertyInfo$proper.Common) === null || _mPropertyInfo$proper2 === void 0 ? void 0 : (_mPropertyInfo$proper3 = _mPropertyInfo$proper2.Text) === null || _mPropertyInfo$proper3 === void 0 ? void 0 : _mPropertyInfo$proper3.path,
382
- sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath,
383
- sTargetCollectionPath = sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"));
384
- /**
385
- * The property Text must be added only if the property is
386
- * - not part of a star property (.i.e '*' or 'navigation/*') or a targeted Entity
387
- * - not include into the initial targeted properties of SideEffects
388
- * Indeed in the two listed cases, the property containing text will be/is requested by initial SideEffects configuration.
389
- */
390
-
391
- if (sTargetTextPath && aEntitiesRequested.indexOf(sTargetCollectionPath) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
392
- var _mEntityType$resolveP;
393
-
394
- // The Text association is added as TargetEntities if it's contained on a different entitySet and not a complexType
395
- // Otherwise it's added as targetProperties
396
- if (sTargetTextPath.lastIndexOf("/") > -1 && ((_mEntityType$resolveP = mEntityType.resolvePath(sTargetCollectionPath)) === null || _mEntityType$resolveP === void 0 ? void 0 : _mEntityType$resolveP._type) === "NavigationProperty") {
397
- oSideEffect.TargetEntities.push({
398
- $NavigationPropertyPath: sTargetCollectionPath
399
- });
400
- aEntitiesRequested.push(sTargetCollectionPath);
401
- } else {
402
- oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
403
- }
404
- }
361
+ Log.info("SideEffects - The entity type associated to property path " + sPropertyPath + " cannot be resolved");
405
362
  }
406
- });
407
- return oSideEffect;
408
- }
409
- /**
410
- * Converts SideEffects to expected format
411
- * - Converts SideEffects targets to expected format
412
- * - Removes binding parameter from SideEffects targets properties
413
- * - Adds the text properties
414
- * - Replaces TargetProperties having reference to Source Properties for a SideEffects.
415
- *
416
- * @private
417
- * @ui5-restricted
418
- * @param {object} oSideEffects SideEffects definition
419
- * @param {object} mEntityType Entity type
420
- * @param {string} sBindingParameter Name of the binding parameter
421
- * @returns {object} SideEffects definition
422
- */
423
-
424
- }, {
425
- key: "_convertSideEffects",
426
- value: function _convertSideEffects(oSideEffects, mEntityType, sBindingParameter) {
427
- var oTempSideEffects = this._removeBindingParameter(this._convertTargetsFormat(oSideEffects), sBindingParameter);
428
-
429
- return this._addRequiredTextProperties(oTempSideEffects, mEntityType);
430
- }
431
- /**
432
- * Converts SideEffects targets (TargetEntities and TargetProperties) to expected format
433
- * - TargetProperties as array of string
434
- * - TargetEntities as array of object with property $NavigationPropertyPath.
435
- *
436
- * @private
437
- * @ui5-restricted
438
- * @param {object} oSideEffects SideEffects definition
439
- * @returns {object} Converted SideEffects
440
- */
441
-
442
- }, {
443
- key: "_convertTargetsFormat",
444
- value: function _convertTargetsFormat(oSideEffects) {
445
- var TargetProperties = (oSideEffects.TargetProperties || []).reduce(function (aTargetProperties, vTarget) {
446
- var sTarget = typeof vTarget === "string" && vTarget || vTarget.type === "PropertyPath" && vTarget.value;
447
-
448
- if (sTarget) {
449
- aTargetProperties.push(sTarget);
450
- } else {
451
- Log.error("SideEffects - Error while processing TargetProperties for SideEffects" + oSideEffects.fullyQualifiedName);
452
- }
453
-
454
- return aTargetProperties;
455
- }, []),
456
- TargetEntities = (oSideEffects.TargetEntities || []).map(function (mTargetEntity) {
363
+ } else {
364
+ Log.info("SideEffects - The property path " + sPropertyPath + " cannot be resolved");
365
+ }
366
+ });
367
+ aDerivedProperties.forEach(function (mPropertyInfo) {
368
+ if (mPropertyInfo.property) {
369
+ var _mPropertyInfo$proper, _mPropertyInfo$proper2, _mPropertyInfo$proper3;
370
+
371
+ var sTargetTextPath = (_mPropertyInfo$proper = mPropertyInfo.property.annotations) === null || _mPropertyInfo$proper === void 0 ? void 0 : (_mPropertyInfo$proper2 = _mPropertyInfo$proper.Common) === null || _mPropertyInfo$proper2 === void 0 ? void 0 : (_mPropertyInfo$proper3 = _mPropertyInfo$proper2.Text) === null || _mPropertyInfo$proper3 === void 0 ? void 0 : _mPropertyInfo$proper3.path,
372
+ sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath,
373
+ sTargetCollectionPath = sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"));
457
374
  /**
458
- * SideEffects that comes from SAP FE get TargetEntities with $NavigationPropertyPath whereas
459
- * ones coming from the converted OData model gets a NavigationPropertyPath format
460
- *
375
+ * The property Text must be added only if the property is
376
+ * - not part of a star property (.i.e '*' or 'navigation/*') or a targeted Entity
377
+ * - not include into the initial targeted properties of SideEffects
378
+ * Indeed in the two listed cases, the property containing text will be/is requested by initial SideEffects configuration.
461
379
  */
462
- return {
463
- "$NavigationPropertyPath": mTargetEntity.$NavigationPropertyPath || mTargetEntity.value || ""
464
- };
465
- });
466
- return _objectSpread(_objectSpread({}, oSideEffects), {
467
- TargetProperties: TargetProperties,
468
- TargetEntities: TargetEntities
469
- });
470
- }
471
- /**
472
- * Gets SideEffects related to an entity type or action that come from an OData Service
473
- * Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action
474
- * and to convert these SideEffects with expected format.
475
- *
476
- * @private
477
- * @ui5-restricted
478
- * @param {object} oSource Entity type or action
479
- * @returns {object} Array of SideEffects
480
- */
481
-
482
- }, {
483
- key: "_getSideEffectsFromSource",
484
- value: function _getSideEffectsFromSource(oSource) {
485
- var _this4 = this;
486
-
487
- var aSideEffects = [];
488
- var authorizedTypes = ["EntityType", "Action"];
489
-
490
- if (oSource._type && authorizedTypes.indexOf(oSource._type) > -1) {
491
- var mEntityType = oSource._type === "EntityType" ? oSource : oSource.sourceEntityType;
492
-
493
- if (mEntityType) {
494
- var _oSource$annotations;
495
-
496
- var mCommonAnnotation = ((_oSource$annotations = oSource.annotations) === null || _oSource$annotations === void 0 ? void 0 : _oSource$annotations.Common) || {};
497
- var mBindingParameter = (oSource.parameters || []).find(function (mParameter) {
498
- return mParameter.type === mEntityType.fullyQualifiedName;
499
- });
500
- var sBindingParameter = mBindingParameter ? mBindingParameter.fullyQualifiedName.split("/")[1] : "";
501
- Object.keys(mCommonAnnotation).filter(function (sAnnotationName) {
502
- return mCommonAnnotation[sAnnotationName].$Type === "com.sap.vocabularies.Common.v1.SideEffectsType";
503
- }).forEach(function (sAnnotationName) {
504
- aSideEffects.push(_this4._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType, sBindingParameter));
505
- });
506
- }
507
- }
508
380
 
509
- return aSideEffects;
510
- }
511
- /**
512
- * Logs SideEffects request.
513
- *
514
- * @private
515
- * @ui5-restricted
516
- * @param {Array} aPathExpressions SideEffects targets
517
- * @param {object} oContext Context
518
- */
381
+ if (sTargetTextPath && aEntitiesRequested.indexOf(sTargetCollectionPath) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
382
+ var _mEntityType$resolveP;
519
383
 
520
- }, {
521
- key: "_logRequest",
522
- value: function _logRequest(aPathExpressions, oContext) {
523
- var sTargetPaths = aPathExpressions.reduce(function (sPaths, mTarget) {
524
- return sPaths + "\n\t\t" + (mTarget.$NavigationPropertyPath || mTarget || "");
525
- }, "");
526
- Log.debug("SideEffects - Request:\n\tContext path : " + oContext.getPath() + "\n\tProperty paths :" + sTargetPaths);
527
- }
528
- /**
529
- * Removes name of binding parameter on SideEffects targets.
530
- *
531
- * @private
532
- * @ui5-restricted
533
- * @param {object} oSideEffects SideEffects definition
534
- * @param {string} sBindingParameterName Name of binding parameter
535
- * @returns {object} SideEffects definition
536
- */
537
-
538
- }, {
539
- key: "_removeBindingParameter",
540
- value: function _removeBindingParameter(oSideEffects, sBindingParameterName) {
541
- if (sBindingParameterName) {
542
- var aTargets = ["TargetProperties", "TargetEntities"];
543
- aTargets.forEach(function (sTarget) {
544
- var mTarget = oSideEffects[sTarget];
545
-
546
- if (mTarget) {
547
- mTarget = mTarget.map(function (mProperty) {
548
- var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
549
-
550
- var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
551
- return bNavigationPropertyPath ? {
552
- $NavigationPropertyPath: sValue
553
- } : sValue;
384
+ // The Text association is added as TargetEntities if it's contained on a different entitySet and not a complexType
385
+ // Otherwise it's added as targetProperties
386
+ if (sTargetTextPath.lastIndexOf("/") > -1 && ((_mEntityType$resolveP = mEntityType.resolvePath(sTargetCollectionPath)) === null || _mEntityType$resolveP === void 0 ? void 0 : _mEntityType$resolveP._type) === "NavigationProperty") {
387
+ oSideEffect.TargetEntities.push({
388
+ $NavigationPropertyPath: sTargetCollectionPath
554
389
  });
390
+ aEntitiesRequested.push(sTargetCollectionPath);
391
+ } else {
392
+ oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
555
393
  }
394
+ }
395
+ }
396
+ });
397
+ return oSideEffect;
398
+ }
399
+ /**
400
+ * Converts SideEffects to expected format
401
+ * - Converts SideEffects targets to expected format
402
+ * - Removes binding parameter from SideEffects targets properties
403
+ * - Adds the text properties
404
+ * - Replaces TargetProperties having reference to Source Properties for a SideEffects.
405
+ *
406
+ * @private
407
+ * @ui5-restricted
408
+ * @param {object} oSideEffects SideEffects definition
409
+ * @param {object} mEntityType Entity type
410
+ * @param {string} sBindingParameter Name of the binding parameter
411
+ * @returns {object} SideEffects definition
412
+ */
413
+ ;
414
+
415
+ _proto._convertSideEffects = function _convertSideEffects(oSideEffects, mEntityType, sBindingParameter) {
416
+ var oTempSideEffects = this._removeBindingParameter(this._convertTargetsFormat(oSideEffects), sBindingParameter);
417
+
418
+ return this._addRequiredTextProperties(oTempSideEffects, mEntityType);
419
+ }
420
+ /**
421
+ * Converts SideEffects targets (TargetEntities and TargetProperties) to expected format
422
+ * - TargetProperties as array of string
423
+ * - TargetEntities as array of object with property $NavigationPropertyPath.
424
+ *
425
+ * @private
426
+ * @ui5-restricted
427
+ * @param {object} oSideEffects SideEffects definition
428
+ * @returns {object} Converted SideEffects
429
+ */
430
+ ;
431
+
432
+ _proto._convertTargetsFormat = function _convertTargetsFormat(oSideEffects) {
433
+ var TargetProperties = (oSideEffects.TargetProperties || []).reduce(function (aTargetProperties, vTarget) {
434
+ var sTarget = typeof vTarget === "string" && vTarget || vTarget.type === "PropertyPath" && vTarget.value;
435
+
436
+ if (sTarget) {
437
+ aTargetProperties.push(sTarget);
438
+ } else {
439
+ Log.error("SideEffects - Error while processing TargetProperties for SideEffects" + oSideEffects.fullyQualifiedName);
440
+ }
556
441
 
557
- oSideEffects[sTarget] = mTarget;
442
+ return aTargetProperties;
443
+ }, []),
444
+ TargetEntities = (oSideEffects.TargetEntities || []).map(function (mTargetEntity) {
445
+ /**
446
+ * SideEffects that comes from SAP FE get TargetEntities with $NavigationPropertyPath whereas
447
+ * ones coming from the converted OData model gets a NavigationPropertyPath format
448
+ *
449
+ */
450
+ return {
451
+ "$NavigationPropertyPath": mTargetEntity.$NavigationPropertyPath || mTargetEntity.value || ""
452
+ };
453
+ });
454
+ return _objectSpread(_objectSpread({}, oSideEffects), {
455
+ TargetProperties: TargetProperties,
456
+ TargetEntities: TargetEntities
457
+ });
458
+ }
459
+ /**
460
+ * Gets SideEffects related to an entity type or action that come from an OData Service
461
+ * Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action
462
+ * and to convert these SideEffects with expected format.
463
+ *
464
+ * @private
465
+ * @ui5-restricted
466
+ * @param {object} oSource Entity type or action
467
+ * @returns {object} Array of SideEffects
468
+ */
469
+ ;
470
+
471
+ _proto._getSideEffectsFromSource = function _getSideEffectsFromSource(oSource) {
472
+ var _this5 = this;
473
+
474
+ var aSideEffects = [];
475
+ var authorizedTypes = ["EntityType", "Action"];
476
+
477
+ if (oSource._type && authorizedTypes.indexOf(oSource._type) > -1) {
478
+ var mEntityType = oSource._type === "EntityType" ? oSource : oSource.sourceEntityType;
479
+
480
+ if (mEntityType) {
481
+ var _oSource$annotations;
482
+
483
+ var mCommonAnnotation = ((_oSource$annotations = oSource.annotations) === null || _oSource$annotations === void 0 ? void 0 : _oSource$annotations.Common) || {};
484
+ var mBindingParameter = (oSource.parameters || []).find(function (mParameter) {
485
+ return mParameter.type === mEntityType.fullyQualifiedName;
486
+ });
487
+ var sBindingParameter = mBindingParameter ? mBindingParameter.fullyQualifiedName.split("/")[1] : "";
488
+ Object.keys(mCommonAnnotation).filter(function (sAnnotationName) {
489
+ return mCommonAnnotation[sAnnotationName].$Type === "com.sap.vocabularies.Common.v1.SideEffectsType";
490
+ }).forEach(function (sAnnotationName) {
491
+ aSideEffects.push(_this5._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType, sBindingParameter));
558
492
  });
559
493
  }
560
-
561
- return oSideEffects;
562
494
  }
563
- /**
564
- * Remove duplicates in SideEffects targets.
565
- *
566
- * @private
567
- * @ui5-restricted
568
- * @param {Array} aTargets SideEffects targets
569
- * @returns {Array} SideEffects targets without duplicates
570
- */
571
495
 
572
- }, {
573
- key: "_removeDuplicateTargets",
574
- value: function _removeDuplicateTargets(aTargets) {
575
- return aTargets.filter(function (mTarget, iIndex, aTargets) {
576
- return aTargets.findIndex(function (mSearchTarget) {
577
- return mSearchTarget === mTarget || // PropertyPath
578
- mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
579
- ;
580
- }) === iIndex;
581
- });
582
- }
583
- /**
584
- * Gets SideEffects action type that come from an OData Service
585
- * Internal routine to get, from converted oData metaModel, SideEffects on actions
586
- * related to a specific entity type and to convert these SideEffects with
587
- * expected format.
588
- *
589
- * @private
590
- * @ui5-restricted
591
- * @param {object} mEntityType Entity type
592
- * @returns {object} Entity type SideEffects dictionary
593
- */
496
+ return aSideEffects;
497
+ }
498
+ /**
499
+ * Logs SideEffects request.
500
+ *
501
+ * @private
502
+ * @ui5-restricted
503
+ * @param {Array} aPathExpressions SideEffects targets
504
+ * @param {object} oContext Context
505
+ */
506
+ ;
507
+
508
+ _proto._logRequest = function _logRequest(aPathExpressions, oContext) {
509
+ var sTargetPaths = aPathExpressions.reduce(function (sPaths, mTarget) {
510
+ return sPaths + "\n\t\t" + (mTarget.$NavigationPropertyPath || mTarget || "");
511
+ }, "");
512
+ Log.debug("SideEffects - Request:\n\tContext path : " + oContext.getPath() + "\n\tProperty paths :" + sTargetPaths);
513
+ }
514
+ /**
515
+ * Removes name of binding parameter on SideEffects targets.
516
+ *
517
+ * @private
518
+ * @ui5-restricted
519
+ * @param {object} oSideEffects SideEffects definition
520
+ * @param {string} sBindingParameterName Name of binding parameter
521
+ * @returns {object} SideEffects definition
522
+ */
523
+ ;
524
+
525
+ _proto._removeBindingParameter = function _removeBindingParameter(oSideEffects, sBindingParameterName) {
526
+ if (sBindingParameterName) {
527
+ var aTargets = ["TargetProperties", "TargetEntities"];
528
+ aTargets.forEach(function (sTarget) {
529
+ var mTarget = oSideEffects[sTarget];
594
530
 
595
- }, {
596
- key: "_retrieveODataActionsSideEffects",
597
- value: function _retrieveODataActionsSideEffects(mEntityType) {
598
- var _this5 = this;
531
+ if (mTarget) {
532
+ mTarget = mTarget.map(function (mProperty) {
533
+ var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
599
534
 
600
- var oSideEffects = {};
601
- var aActions = mEntityType.actions;
535
+ var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
536
+ return bNavigationPropertyPath ? {
537
+ $NavigationPropertyPath: sValue
538
+ } : sValue;
539
+ });
540
+ }
602
541
 
603
- if (aActions) {
604
- Object.keys(aActions).forEach(function (sActionName) {
605
- var oAction = mEntityType.actions[sActionName];
606
- var triggerActions = [];
607
- var pathExpressions = [];
608
- var aTargets = [];
542
+ oSideEffects[sTarget] = mTarget;
543
+ });
544
+ }
609
545
 
610
- _this5._getSideEffectsFromSource(oAction).forEach(function (oSideEffect) {
611
- var sTriggerAction = oSideEffect.TriggerAction;
612
- aTargets = aTargets.concat(oSideEffect.TargetEntities || []).concat(oSideEffect.TargetProperties || []);
546
+ return oSideEffects;
547
+ }
548
+ /**
549
+ * Remove duplicates in SideEffects targets.
550
+ *
551
+ * @private
552
+ * @ui5-restricted
553
+ * @param {Array} aTargets SideEffects targets
554
+ * @returns {Array} SideEffects targets without duplicates
555
+ */
556
+ ;
557
+
558
+ _proto._removeDuplicateTargets = function _removeDuplicateTargets(aTargets) {
559
+ return aTargets.filter(function (mTarget, iIndex, aTargets) {
560
+ return aTargets.findIndex(function (mSearchTarget) {
561
+ return mSearchTarget === mTarget || // PropertyPath
562
+ mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
563
+ ;
564
+ }) === iIndex;
565
+ });
566
+ }
567
+ /**
568
+ * Gets SideEffects action type that come from an OData Service
569
+ * Internal routine to get, from converted oData metaModel, SideEffects on actions
570
+ * related to a specific entity type and to convert these SideEffects with
571
+ * expected format.
572
+ *
573
+ * @private
574
+ * @ui5-restricted
575
+ * @param {object} mEntityType Entity type
576
+ * @returns {object} Entity type SideEffects dictionary
577
+ */
578
+ ;
579
+
580
+ _proto._retrieveODataActionsSideEffects = function _retrieveODataActionsSideEffects(mEntityType) {
581
+ var _this6 = this;
582
+
583
+ var oSideEffects = {};
584
+ var aActions = mEntityType.actions;
585
+
586
+ if (aActions) {
587
+ Object.keys(aActions).forEach(function (sActionName) {
588
+ var oAction = mEntityType.actions[sActionName];
589
+ var triggerActions = [];
590
+ var pathExpressions = [];
591
+ var aTargets = [];
613
592
 
614
- if (sTriggerAction && triggerActions.indexOf(sTriggerAction) === -1) {
615
- triggerActions.push(sTriggerAction);
616
- }
617
- });
593
+ _this6._getSideEffectsFromSource(oAction).forEach(function (oSideEffect) {
594
+ var sTriggerAction = oSideEffect.TriggerAction;
595
+ aTargets = aTargets.concat(oSideEffect.TargetEntities || []).concat(oSideEffect.TargetProperties || []);
618
596
 
619
- pathExpressions = _this5._removeDuplicateTargets(aTargets);
620
- oSideEffects[sActionName] = {
621
- pathExpressions: pathExpressions,
622
- triggerActions: triggerActions
623
- };
597
+ if (sTriggerAction && triggerActions.indexOf(sTriggerAction) === -1) {
598
+ triggerActions.push(sTriggerAction);
599
+ }
624
600
  });
625
- }
626
-
627
- return oSideEffects;
628
- }
629
- /**
630
- * Gets SideEffects entity type that come from an OData Service
631
- * Internal routine to get, from converted oData metaModel, SideEffects
632
- * related to a specific entity type and to convert these SideEffects with
633
- * expected format.
634
- *
635
- * @private
636
- * @ui5-restricted
637
- * @param {object} mEntityType Entity type
638
- * @returns {object} Entity type SideEffects dictionary
639
- */
640
-
641
- }, {
642
- key: "_retrieveODataEntitySideEffects",
643
- value: function _retrieveODataEntitySideEffects(mEntityType) {
644
- var oEntitySideEffects = {};
645
601
 
646
- this._getSideEffectsFromSource(mEntityType).forEach(function (oSideEffects) {
647
- oEntitySideEffects[oSideEffects.fullyQualifiedName] = oSideEffects;
602
+ pathExpressions = _this6._removeDuplicateTargets(aTargets);
603
+ oSideEffects[sActionName] = {
604
+ pathExpressions: pathExpressions,
605
+ triggerActions: triggerActions
606
+ };
648
607
  });
649
-
650
- return oEntitySideEffects;
651
- }
652
- }, {
653
- key: "getInterface",
654
- value: function getInterface() {
655
- return this;
656
608
  }
657
- }]);
609
+
610
+ return oSideEffects;
611
+ }
612
+ /**
613
+ * Gets SideEffects entity type that come from an OData Service
614
+ * Internal routine to get, from converted oData metaModel, SideEffects
615
+ * related to a specific entity type and to convert these SideEffects with
616
+ * expected format.
617
+ *
618
+ * @private
619
+ * @ui5-restricted
620
+ * @param {object} mEntityType Entity type
621
+ * @returns {object} Entity type SideEffects dictionary
622
+ */
623
+ ;
624
+
625
+ _proto._retrieveODataEntitySideEffects = function _retrieveODataEntitySideEffects(mEntityType) {
626
+ var oEntitySideEffects = {};
627
+
628
+ this._getSideEffectsFromSource(mEntityType).forEach(function (oSideEffects) {
629
+ oEntitySideEffects[oSideEffects.fullyQualifiedName] = oSideEffects;
630
+ });
631
+
632
+ return oEntitySideEffects;
633
+ };
634
+
635
+ _proto.getInterface = function getInterface() {
636
+ return this;
637
+ };
658
638
 
659
639
  return SideEffectsService;
660
640
  }(Service);
@@ -664,25 +644,20 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
664
644
  var SideEffectsServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
665
645
  _inherits(SideEffectsServiceFactory, _ServiceFactory);
666
646
 
667
- var _super2 = _createSuper(SideEffectsServiceFactory);
668
-
669
647
  function SideEffectsServiceFactory() {
670
- _classCallCheck(this, SideEffectsServiceFactory);
671
-
672
- return _super2.apply(this, arguments);
648
+ return _ServiceFactory.apply(this, arguments) || this;
673
649
  }
674
650
 
675
- _createClass(SideEffectsServiceFactory, [{
676
- key: "createInstance",
677
- value: function createInstance(oServiceContext) {
678
- var SideEffectsServiceService = new SideEffectsService(oServiceContext);
679
- return SideEffectsServiceService.initPromise;
680
- }
681
- }]);
651
+ var _proto2 = SideEffectsServiceFactory.prototype;
652
+
653
+ _proto2.createInstance = function createInstance(oServiceContext) {
654
+ var SideEffectsServiceService = new SideEffectsService(oServiceContext);
655
+ return SideEffectsServiceService.initPromise;
656
+ };
682
657
 
683
658
  return SideEffectsServiceFactory;
684
659
  }(ServiceFactory);
685
660
 
686
661
  return SideEffectsServiceFactory;
687
662
  }, false);
688
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwic05hdmlnYXRpb25QYXRoIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsImJJc1N0YXJQcm9wZXJ0eSIsImVuZHNXaXRoIiwic05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNSZWxhdGl2ZVBhdGgiLCJyZXNvbHZlUGF0aCIsImFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwibVByb3BlcnR5IiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0eSIsImZpbmQiLCJuYW1lIiwic3BsaXQiLCJwb3AiLCJpbmZvIiwibVByb3BlcnR5SW5mbyIsInNUYXJnZXRUZXh0UGF0aCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiVGV4dCIsInBhdGgiLCJzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSIsInNUYXJnZXRDb2xsZWN0aW9uUGF0aCIsIl90eXBlIiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJvVGVtcFNpZGVFZmZlY3RzIiwiX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJfY29udmVydFRhcmdldHNGb3JtYXQiLCJfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIm9Tb3VyY2UiLCJhdXRob3JpemVkVHlwZXMiLCJzb3VyY2VFbnRpdHlUeXBlIiwibUNvbW1vbkFubm90YXRpb24iLCJtQmluZGluZ1BhcmFtZXRlciIsInBhcmFtZXRlcnMiLCJtUGFyYW1ldGVyIiwiJFR5cGUiLCJfY29udmVydFNpZGVFZmZlY3RzIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJ0cmlnZ2VyQWN0aW9ucyIsInBhdGhFeHByZXNzaW9ucyIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMEVhQSxrQjs7Ozs7Ozs7Ozs7Ozs7O2FBS1o7QUFDQSxzQkFBTztBQUNOLGFBQUtDLGlCQUFMLEdBQXlCO0FBQ3hC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QztBQUNBOzs7O0lBSnNDNkosYzs7U0FPekJILHlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCB7IENvbXBsZXhUeXBlLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblR5cGVzLCBRdWFsaWZpZWROYW1lIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHsgQWN0aW9uLCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuXG50eXBlIFNpZGVFZmZlY3RzU2V0dGluZ3MgPSB7fTtcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdCRQcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xudHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSB8IHN0cmluZztcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW107XG59O1xuXG50eXBlIEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufSAmIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZTtcblxudHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBRdWFsaWZpZWROYW1lW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdFNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0U291cmNlUHJvcGVydGllcz86IFByb3BlcnR5UGF0aFtdO1xuXHRTb3VyY2VFbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0VHJpZ2dlckFjdGlvbj86IFF1YWxpZmllZE5hbWU7XG59O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1R5cGUgPSBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHwgT0RhdGFTaWRlRWZmZWN0c1R5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0FjdGlvbkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBFeHRyYWN0b3JQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnR5OiBQcm9wZXJ0eTtcblx0bmF2aWdhdGlvblBhdGg/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRfb1NpZGVFZmZlY3RzVHlwZSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cdF9vQ2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cdF9iSW5pdGlhbGl6ZWQhOiBib29sZWFuO1xuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAob1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLm9TaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNFbnRpdHlUeXBlICsgXCIvU2lkZUVmZmVjdHNGb3JDb250cm9sL1wiICsgb1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1RyaWdnZXJBY3Rpb246IGFueSA9IG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1RyaWdnZXJBY3Rpb24gKyBcIiguLi4pXCIsIG9Db250ZXh0KTtcblx0XHRvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eSArIFwiL1wiO1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShvUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5UGF0aC52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKHNOYXZpZ2F0aW9uUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGgucmVwbGFjZShzTmF2aWdhdGlvblBhdGgsIFwiXCIpLmluZGV4T2YoXCIvXCIpID09PSAtMVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKG1UYXJnZXQgPT4gYVRhcmdldHMucHVzaChtVGFyZ2V0KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzXG5cdFx0XHRhVGFyZ2V0cyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0aWYgKGFUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dCkuY2F0Y2gob0Vycm9yID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5IFwiICsgc05hdmlnYXRpb25Qcm9wZXJ0eSwgb0Vycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcyBvciB0YXJnZXRFbnRpdGllcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGFJbml0aWFsUHJvcGVydGllczogc3RyaW5nW10gPSBvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGgsXG5cdFx0XHRcdFx0c1RhcmdldENvbGxlY3Rpb25QYXRoID0gc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGFyZ2V0Q29sbGVjdGlvblBhdGgpID09PSAtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIFRleHQgYXNzb2NpYXRpb24gaXMgYWRkZWQgYXMgVGFyZ2V0RW50aXRpZXMgaWYgaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IGFuZCBub3QgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgJiZcblx0XHRcdFx0XHRcdG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcy5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNUYXJnZXRDb2xsZWN0aW9uUGF0aCB9KTtcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0bUVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gdGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXIpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiLz9cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
663
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdCIsIl9vU2lkZUVmZmVjdHNUeXBlIiwib0RhdGEiLCJlbnRpdGllcyIsImFjdGlvbnMiLCJjb250cm9sIiwiX2JJbml0aWFsaXplZCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJzRW50aXR5VHlwZSIsIm9TaWRlRWZmZWN0Iiwic291cmNlQ29udHJvbElkIiwib0NvbnRyb2xTaWRlRWZmZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJzVHJpZ2dlckFjdGlvbiIsIm9Db250ZXh0Iiwic0dyb3VwSWQiLCJvVHJpZ2dlckFjdGlvbiIsImdldE1vZGVsIiwiYmluZENvbnRleHQiLCJleGVjdXRlIiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsIl9vQ2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInNFbnRpdHlUeXBlTmFtZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJzQWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsIm9DYXBhYmlsaXRpZXMiLCJvQ29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwiZW50aXR5VHlwZSIsIl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsInNDb250cm9sSWQiLCJPYmplY3QiLCJrZXlzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiYVBhdGhFeHByZXNzaW9ucyIsIl9sb2dSZXF1ZXN0Iiwib1Byb21pc2UiLCJlIiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJzaWRlRWZmZWN0cyIsImFQcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwibGVuZ3RoIiwibWFwIiwic1RyaWdnZXJBY3Rpb25OYW1lIiwicGF0aEV4cHJlc3Npb25zIiwicHVzaCIsImFsbCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQmFzZUVudGl0eVR5cGUiLCJzTmF2aWdhdGlvblBhdGgiLCJhU2lkZUVmZmVjdHMiLCJhVGFyZ2V0cyIsImZpbHRlciIsInNBbm5vdGF0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsIlNvdXJjZVByb3BlcnRpZXMiLCJzb21lIiwib1Byb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiaW5kZXhPZiIsIlNvdXJjZUVudGl0aWVzIiwib05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJUcmlnZ2VyQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsIl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwibUVudGl0eVR5cGUiLCJhSW5pdGlhbFByb3BlcnRpZXMiLCJhRW50aXRpZXNSZXF1ZXN0ZWQiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhRGVyaXZlZFByb3BlcnRpZXMiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzVGFyZ2V0Q29sbGVjdGlvblBhdGgiLCJfdHlwZSIsIl9jb252ZXJ0U2lkZUVmZmVjdHMiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9UZW1wU2lkZUVmZmVjdHMiLCJfcmVtb3ZlQmluZGluZ1BhcmFtZXRlciIsIl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdCIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvU291cmNlIiwiYXV0aG9yaXplZFR5cGVzIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztNQTBFYUEsa0I7Ozs7Ozs7Ozs7QUFLWjtXQUNBQyxJLEdBQUEsZ0JBQU87QUFDTixXQUFLQyxpQkFBTCxHQUF5QjtBQUN4QkMsUUFBQUEsS0FBSyxFQUFFO0FBQ05DLFVBQUFBLFFBQVEsRUFBRSxFQURKO0FBRU5DLFVBQUFBLE9BQU8sRUFBRTtBQUZILFNBRGlCO0FBS3hCQyxRQUFBQSxPQUFPLEVBQUU7QUFMZSxPQUF6QjtBQU9BLFdBQUtDLGFBQUwsR0FBcUIsS0FBckI7QUFDQSxXQUFLQyxXQUFMLEdBQW1CQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBbkI7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNRQyxxQixHQUFQLCtCQUE2QkMsV0FBN0IsRUFBa0RDLFdBQWxELEVBQXlIO0FBQ3hILFVBQUlBLFdBQVcsQ0FBQ0MsZUFBaEIsRUFBaUM7QUFDaEMsWUFBTUMsa0JBQTBDLG1DQUM1Q0YsV0FENEM7QUFFL0NHLFVBQUFBLGtCQUFrQixFQUFFSixXQUFXLEdBQUcseUJBQWQsR0FBMENDLFdBQVcsQ0FBQ0M7QUFGM0IsVUFBaEQ7O0FBSUEsWUFBTUcseUJBQXlCLEdBQUcsS0FBS2YsaUJBQUwsQ0FBdUJJLE9BQXZCLENBQStCTSxXQUEvQixLQUErQyxFQUFqRjtBQUNBSyxRQUFBQSx5QkFBeUIsQ0FBQ0Ysa0JBQWtCLENBQUNELGVBQXBCLENBQXpCLEdBQWdFQyxrQkFBaEU7QUFDQSxhQUFLYixp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SUFBUDtBQUNBLEs7OztJQTdpQnNDQyxPOzs7O01BZ2pCbENDLHlCOzs7Ozs7Ozs7WUFDTEMsYyxHQUFBLHdCQUFlQyxlQUFmLEVBQW1GO0FBQ2xGLFVBQU1DLHlCQUF5QixHQUFHLElBQUlqTCxrQkFBSixDQUF1QmdMLGVBQXZCLENBQWxDO0FBQ0EsYUFBT0MseUJBQXlCLENBQUN6SyxXQUFqQztBQUNBLEs7OztJQUpzQzBLLGM7O1NBT3pCSix5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21wbGV4VHlwZSwgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcywgUXVhbGlmaWVkTmFtZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9Db21tb25cIjtcbmltcG9ydCB7IEFjdGlvbiwgTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlID0ge1xuXHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHQkUHJvcGVydHlQYXRoPzogc3RyaW5nO1xufTtcbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgfCBzdHJpbmc7XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdO1xuXHR0cmlnZ2VyQWN0aW9ucz86IFF1YWxpZmllZE5hbWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0U291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBCYXNlU2lkZUVmZmVjdHNUeXBlICYge1xuXHRTb3VyY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cdFNvdXJjZUVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRUcmlnZ2VyQWN0aW9uPzogUXVhbGlmaWVkTmFtZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzQWN0aW9uRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIEV4dHJhY3RvclByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydHk6IFByb3BlcnR5O1xuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdF9vU2lkZUVmZmVjdHNUeXBlITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblx0X29DYXBhYmlsaXRpZXMhOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB8IHVuZGVmaW5lZDtcblx0X2JJbml0aWFsaXplZCE6IGJvb2xlYW47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCkge1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IGZhbHNlO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2xcblx0ICogU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBpcyBhZGRlZCBieSBhIGNvbnRyb2wgdG8ga2VlcCBkYXRhIHVwIHRvIGRhdGVcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgZ2V0IGxpbWl0ZWQgc2NvcGUgY29tcGFyZWQgd2l0aCBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlOlxuXHQgKiAtIE9ubHkgb25lIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBjb21iaW5hdGlvbiBlbnRpdHkgdHlwZSAtIGNvbnRyb2wgSWRcblx0ICogLSBPbmx5IFNpZGVFZmZlY3RzIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkIGFuZCB1c2VkIHRvIHRyaWdnZXIgU2lkZUVmZmVjdHNcblx0ICpcblx0ICogRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4ub1NpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogc0VudGl0eVR5cGUgKyBcIi9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvXCIgKyBvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSB8fCB7fTtcblx0XHRcdG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbb0NvbnRyb2xTaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZF0gPSBvQ29udHJvbFNpZGVFZmZlY3Q7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdID0gbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cztcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgU2lkZUVmZmVjdHMgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUcmlnZ2VyQWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRob3V0IGRhdGEgb3Igd2l0aCBhIHJldHVybiB2YWx1ZSBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBjYWxsIHN1Y2NlZWRlZFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvVHJpZ2dlckFjdGlvbjogYW55ID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzVHJpZ2dlckFjdGlvbiArIFwiKC4uLilcIiwgb0NvbnRleHQpO1xuXHRcdHJldHVybiBvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24oc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBhUHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGFQcm9taXNlcyA9IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zLm1hcCgoc1RyaWdnZXJBY3Rpb25OYW1lOiBTdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbk5hbWUgYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YVByb21pc2VzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhUHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIG9Db250ZXh0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFQcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChhUHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eSArIFwiL1wiO1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShvUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5UGF0aC52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKHNOYXZpZ2F0aW9uUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGgucmVwbGFjZShzTmF2aWdhdGlvblBhdGgsIFwiXCIpLmluZGV4T2YoXCIvXCIpID09PSAtMVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKG1UYXJnZXQgPT4gYVRhcmdldHMucHVzaChtVGFyZ2V0KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzXG5cdFx0XHRhVGFyZ2V0cyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0aWYgKGFUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dCkuY2F0Y2gob0Vycm9yID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5IFwiICsgc05hdmlnYXRpb25Qcm9wZXJ0eSwgb0Vycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcyBvciB0YXJnZXRFbnRpdGllcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGFJbml0aWFsUHJvcGVydGllczogc3RyaW5nW10gPSBvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGgsXG5cdFx0XHRcdFx0c1RhcmdldENvbGxlY3Rpb25QYXRoID0gc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGFyZ2V0Q29sbGVjdGlvblBhdGgpID09PSAtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIFRleHQgYXNzb2NpYXRpb24gaXMgYWRkZWQgYXMgVGFyZ2V0RW50aXRpZXMgaWYgaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IGFuZCBub3QgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgJiZcblx0XHRcdFx0XHRcdG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcy5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNUYXJnZXRDb2xsZWN0aW9uUGF0aCB9KTtcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0bUVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gdGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXIpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiLz9cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=