@sapui5/sap.fe.core 1.121.2 → 1.123.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 (241) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +2 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +1 -2
  5. package/src/sap/fe/core/CommonUtils.js +14 -171
  6. package/src/sap/fe/core/CommonUtils.ts +15 -221
  7. package/src/sap/fe/core/PageController.js +13 -1
  8. package/src/sap/fe/core/PageController.ts +16 -0
  9. package/src/sap/fe/core/TemplateComponent.js +6 -1
  10. package/src/sap/fe/core/TemplateComponent.ts +8 -0
  11. package/src/sap/fe/core/UIProvider.js +23 -0
  12. package/src/sap/fe/core/UIProvider.ts +38 -0
  13. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
  14. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
  15. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
  16. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
  17. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
  18. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
  21. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
  23. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
  24. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
  25. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
  26. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
  29. package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
  30. package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
  47. package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
  48. package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
  49. package/src/sap/fe/core/controllerextensions/Share.js +7 -7
  50. package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
  55. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
  56. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
  65. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
  66. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
  67. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
  68. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
  69. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
  70. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
  73. package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
  74. package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
  77. package/src/sap/fe/core/converters/ConverterContext.js +17 -9
  78. package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
  79. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
  85. package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
  86. package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
  87. package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
  88. package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
  89. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
  90. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
  91. package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
  92. package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
  93. package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
  94. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
  95. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
  96. package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
  97. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
  98. package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
  99. package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
  100. package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
  101. package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
  102. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
  103. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
  104. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
  105. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
  106. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
  107. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
  108. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  109. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
  110. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  111. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
  112. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
  113. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
  114. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
  115. package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
  116. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
  117. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
  118. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  119. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
  120. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  121. package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
  122. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
  123. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
  124. package/src/sap/fe/core/converters/helpers/Key.js +2 -2
  125. package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
  126. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  127. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
  128. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
  129. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
  130. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  131. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
  132. package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
  133. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
  134. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
  135. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
  136. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  137. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
  138. package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
  139. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
  141. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
  142. package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
  143. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  144. package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
  145. package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
  146. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
  147. package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
  148. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
  149. package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
  150. package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
  151. package/src/sap/fe/core/fpm/manifest.json +1 -1
  152. package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
  153. package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
  154. package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
  155. package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
  156. package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
  157. package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
  158. package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
  159. package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
  160. package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
  161. package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
  162. package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
  163. package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
  164. package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
  165. package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
  166. package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
  167. package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
  168. package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
  169. package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
  170. package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
  171. package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
  172. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
  173. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
  174. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  175. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
  176. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
  177. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
  178. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
  180. package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
  181. package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
  182. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
  183. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
  184. package/src/sap/fe/core/library.js +1 -1
  185. package/src/sap/fe/core/messagebundle.properties +5 -2
  186. package/src/sap/fe/core/messagebundle_da.properties +1 -1
  187. package/src/sap/fe/core/messagebundle_en.properties +267 -2
  188. package/src/sap/fe/core/messagebundle_sl.properties +1 -1
  189. package/src/sap/fe/core/operationsHelper.js +2 -1
  190. package/src/sap/fe/core/operationsHelper.ts +1 -0
  191. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
  192. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
  193. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  194. package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
  195. package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
  196. package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
  197. package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
  198. package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
  199. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
  200. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
  201. package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
  202. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
  203. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
  204. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
  205. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  206. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
  207. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  208. package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
  209. package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
  210. package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
  211. package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
  212. package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
  213. package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
  214. package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
  215. package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
  216. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  217. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
  218. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  219. package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
  220. package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
  221. package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
  222. package/src/sap/fe/core/templating/FilterHelper.js +13 -10
  223. package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
  224. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  225. package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
  226. package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
  227. package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
  228. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  229. package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
  230. package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
  231. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
  232. package/src/sap/fe/core/templating/UIFormatters.js +23 -22
  233. package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
  234. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  235. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
  236. package/src/sap/fe/core/type/EDM.js +1 -1
  237. package/src/sap/fe/core/type/EDM.ts +2 -2
  238. package/src/sap/fe/core/type/Email.js +1 -1
  239. package/src/sap/fe/core/type/Email.ts +1 -1
  240. package/src/sap/fe/core/type/FiscalDate.js +2 -2
  241. package/src/sap/fe/core/type/FiscalDate.ts +2 -2
@@ -324,12 +324,19 @@ class EditFlow extends BaseControllerExtension {
324
324
  const viewBindingContext = this.getView().getBindingContext() as Context;
325
325
  if (listBinding.isRoot()) {
326
326
  // keep promise chain pending until refresh of listbinding is completed
327
- result = new Promise<void>((resolve) => {
328
- listBinding.attachEventOnce("dataReceived", function () {
329
- resolve();
327
+ if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
328
+ // We use a side-effect refresh for a TreeTable, to preserve expansion states
329
+ result = this.getAppComponent()
330
+ .getSideEffectsService()
331
+ .requestSideEffects([{ $NavigationPropertyPath: "" }], listBinding.getHeaderContext()!);
332
+ } else {
333
+ result = new Promise<void>((resolve) => {
334
+ listBinding.attachEventOnce("dataReceived", function () {
335
+ resolve();
336
+ });
330
337
  });
331
- });
332
- listBinding.refresh();
338
+ listBinding.refresh();
339
+ }
333
340
  } else if (parameters.requestSideEffects) {
334
341
  this.requestSideEffectsOnDelete(listBinding, viewBindingContext);
335
342
  }
@@ -346,6 +353,18 @@ class EditFlow extends BaseControllerExtension {
346
353
  // Notify consumers of which contexts were deleted
347
354
  await this.base.editFlow.onAfterDelete({ contexts: contextsToDelete });
348
355
 
356
+ if (parentControl.isA<Table>("sap.ui.mdc.Table")) {
357
+ const tableAPI = parentControl.getParent() as TableAPI;
358
+ const inactiveContextsToDelete = contextsToDelete.filter((context) => context.isInactive());
359
+ if (
360
+ tableAPI?.tableDefinition?.control?.creationMode === CreationMode.InlineCreationRows &&
361
+ inactiveContextsToDelete.length > 0
362
+ ) {
363
+ tableAPI.removeEmptyRowsMessages(inactiveContextsToDelete);
364
+ await tableAPI.setUpEmptyRows(parentControl, false);
365
+ }
366
+ }
367
+
349
368
  this._sendActivity(Activity.Delete, contextsToDelete);
350
369
 
351
370
  return await result;
@@ -610,12 +629,18 @@ class EditFlow extends BaseControllerExtension {
610
629
  this._setStickySessionInternalProperties(programmingModel, model);
611
630
  await this.base.editFlow.onAfterCreate({ context: newDocumentContext });
612
631
  this.setEditMode(EditMode.Editable); // The createMode flag will be set in computeEditMode
613
- if (!listBinding.isRelative() && programmingModel === ProgrammingModel.Sticky) {
614
- // Workaround to tell the OP that we've created a new object from the LR
615
- const metaContext = model.getMetaModel().getMetaContext(listBinding.getPath());
616
- const entitySet = getInvolvedDataModelObjects(metaContext).startingEntitySet as EntitySet;
617
- const newAction = entitySet?.annotations.Session?.StickySessionSupported?.NewAction;
618
- this.getInternalModel().setProperty("/lastInvokedAction", newAction);
632
+ if (!listBinding.isRelative()) {
633
+ if (programmingModel === ProgrammingModel.Sticky) {
634
+ // Workaround to tell the OP that we've created a new object from the LR
635
+ const metaContext = model.getMetaModel().getMetaContext(listBinding.getPath());
636
+ const entitySet = getInvolvedDataModelObjects(metaContext).startingEntitySet as EntitySet;
637
+ const newAction = entitySet?.annotations.Session?.StickySessionSupported?.NewAction;
638
+ this.getInternalModel().setProperty("/lastInvokedAction", newAction);
639
+ } else if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
640
+ // Creating a new item in a hierarchy from the ListReport (since the listBinding is not relative)
641
+ // --> we want to force the user to either save or discard the draft before leaving the OP
642
+ this.forceDraftSaveOrDiscard(true);
643
+ }
619
644
  }
620
645
  if (newDocumentContext) {
621
646
  this.setDocumentModifiedOnCreate(listBinding);
@@ -771,8 +796,17 @@ class EditFlow extends BaseControllerExtension {
771
796
  if (table?.isA<Table>("sap.ui.mdc.Table")) {
772
797
  table.getRowBinding().attachEventOnce("change", async () => {
773
798
  const newContext = await creation;
774
- const contextIndex = listBinding.getAllCurrentContexts().indexOf(newContext);
799
+ const allCurrentContexts = listBinding.getAllCurrentContexts();
800
+ const contextIndex = allCurrentContexts.indexOf(newContext);
775
801
  table?.focusRow(contextIndex, true);
802
+ if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
803
+ // In case of a tree table, we also scroll to keep the parent visible
804
+ const parentContext = newContext.getParent();
805
+ const parentIndex = parentContext ? allCurrentContexts.indexOf(parentContext) : undefined;
806
+ if (parentIndex !== undefined && parentIndex >= 0) {
807
+ table?.scrollToIndex(parentIndex);
808
+ }
809
+ }
776
810
  });
777
811
  }
778
812
 
@@ -853,20 +887,31 @@ class EditFlow extends BaseControllerExtension {
853
887
  const routingListener = this.getInternalRouting();
854
888
  BusyLocker.lock(lockObject);
855
889
 
856
- const creation = this.getTransactionHelper().createDocument(
857
- listBinding,
858
- {
859
- ...parameters,
860
- ...{
861
- parentControl: this.getView(),
862
- beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
863
- skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
890
+ const creation = this.getTransactionHelper()
891
+ .createDocument(
892
+ listBinding,
893
+ {
894
+ ...parameters,
895
+ ...{
896
+ parentControl: this.getView(),
897
+ beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
898
+ skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
899
+ }
900
+ },
901
+ this.getAppComponent(),
902
+ this.getMessageHandler(),
903
+ false
904
+ )
905
+ .then((newDocumentContext) => {
906
+ if (this._isFclEnabled() && newDocumentContext && newDocumentContext.getBinding() !== listBinding) {
907
+ // In FCL case, if the new context has been created with an action (not with the standard POST create), we need to refresh
908
+ // the original listBinding so that it contains the newly created object (this is done automatically by the listBinding for standard create)
909
+ listBinding.refresh();
864
910
  }
865
- },
866
- this.getAppComponent(),
867
- this.getMessageHandler(),
868
- false
869
- );
911
+
912
+ return newDocumentContext;
913
+ });
914
+
870
915
  // Don't do this if the invocation comes from a deferred creation or if Save is pressed directly after filling the CreationRow
871
916
  if (parameters.bFromDeferred !== true && !parameters.skipSideEffects) {
872
917
  this.handleSideEffects(listBinding, creation);
@@ -1228,27 +1273,6 @@ class EditFlow extends BaseControllerExtension {
1228
1273
  }
1229
1274
  }
1230
1275
 
1231
- /**
1232
- * This function can be used to intercept the 'Save' action. You can execute custom coding in this function.
1233
- * The framework waits for the returned promise to be resolved before continuing the 'Save' action.
1234
- * If you reject the promise, the 'Save' action is stopped and the user stays in edit mode.
1235
- *
1236
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
1237
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1238
- *
1239
- * @param _mParameters Object containing the parameters passed to onBeforeSave
1240
- * @param _mParameters.context Page context that is going to be saved.
1241
- * @returns A promise to be returned by the overridden method. If resolved, the 'Save' action is triggered. If rejected, the 'Save' action is not triggered and the user stays in edit mode.
1242
- * @public
1243
- * @since 1.90.0
1244
- */
1245
- @publicExtension()
1246
- @extensible(OverrideExecution.After)
1247
- async onBeforeSave(_mParameters?: { context?: Context }): Promise<void> {
1248
- // to be overridden
1249
- return Promise.resolve();
1250
- }
1251
-
1252
1276
  /**
1253
1277
  * This function can be used to intercept the 'Create' action. You can execute custom coding in this function.
1254
1278
  * The framework waits for the returned promise to be resolved before continuing the 'Create' action.
@@ -1292,6 +1316,28 @@ class EditFlow extends BaseControllerExtension {
1292
1316
  return Promise.resolve();
1293
1317
  }
1294
1318
 
1319
+ /**
1320
+ * This function can be used to intercept the 'Save' action. You can execute custom coding in this function.
1321
+ * The framework waits for the returned promise to be resolved before continuing the 'Save' action.
1322
+ * If you reject the promise, the 'Save' action is stopped and the user stays in edit mode.
1323
+ *
1324
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
1325
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1326
+ *
1327
+ * @param _mParameters Object containing the parameters passed to onBeforeSave
1328
+ * @param _mParameters.context Page context that is going to be saved.
1329
+ * @returns A promise to be returned by the overridden method. If resolved, the 'Save' action is triggered. If rejected, the 'Save' action is not triggered and the user stays in edit mode.
1330
+ * @public
1331
+ * @since 1.90.0
1332
+ */
1333
+ @publicExtension()
1334
+ @extensible("AfterAsync")
1335
+ @hookable("after", true)
1336
+ async onBeforeSave(_mParameters?: { context?: Context }): Promise<void> {
1337
+ // to be overridden
1338
+ return Promise.resolve();
1339
+ }
1340
+
1295
1341
  /**
1296
1342
  * This function can be used to intercept the 'Discard' action. You can execute custom coding in this function.
1297
1343
  * The framework waits for the returned promise to be resolved before continuing the 'Discard' action.
@@ -1525,6 +1571,17 @@ class EditFlow extends BaseControllerExtension {
1525
1571
  if (activeDocumentContext !== oContext) {
1526
1572
  let contextToNavigate = activeDocumentContext;
1527
1573
  siblingInfo = siblingInfo ?? this._createSiblingInfo(oContext, activeDocumentContext);
1574
+
1575
+ if (sProgrammingModel === ProgrammingModel.Draft) {
1576
+ // When saving, the semantic keys may have changed.
1577
+ // In this case, we also need to manage the semantic URL change in the history
1578
+ const previousSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
1579
+ const newSemanticPath = SemanticKeyHelper.getSemanticPath(activeDocumentContext, true);
1580
+ if (previousSemanticPath && newSemanticPath && previousSemanticPath !== newSemanticPath) {
1581
+ siblingInfo.pathMapping.push({ oldPath: previousSemanticPath, newPath: newSemanticPath });
1582
+ }
1583
+ }
1584
+
1528
1585
  this._updatePathsInHistory(siblingInfo.pathMapping);
1529
1586
  if (oRootViewController.isFclEnabled()) {
1530
1587
  if (siblingInfo.targetContext.getPath() !== activeDocumentContext.getPath()) {
@@ -2025,6 +2082,7 @@ class EditFlow extends BaseControllerExtension {
2025
2082
  defaultValuesExtensionFunction?: string;
2026
2083
  enableAutoScroll?: boolean;
2027
2084
  isBound?: boolean;
2085
+ ignoreETag?: boolean;
2028
2086
  } = { ...mInParameters, parentControl: this.base.getView() } || { parentControl: this.base.getView() };
2029
2087
 
2030
2088
  mParameters.isNavigable = mParameters.requiresNavigation || mParameters.isNavigable;
@@ -2060,6 +2118,9 @@ class EditFlow extends BaseControllerExtension {
2060
2118
  mParameters.internalModelContext = oView.getBindingContext("internal") as InternalModelContext | null;
2061
2119
  }
2062
2120
 
2121
+ // if sticky session is enabled we trigger actions without eTag
2122
+ mParameters.ignoreETag = mParameters.internalModelContext?.getProperty("/sessionOn");
2123
+
2063
2124
  if (sActionName && sActionName.includes("(")) {
2064
2125
  // get entity type of action overload and remove it from the action path
2065
2126
  // Example sActionName = "<ActionName>(Collection(<OverloadEntityType>))"
@@ -2308,18 +2369,20 @@ class EditFlow extends BaseControllerExtension {
2308
2369
  * @param oEvent The event sent by the binding
2309
2370
  */
2310
2371
  handlePatchSent(oEvent: ODataContextBinding$PatchSentEvent): void {
2311
- // In collaborative draft, disable ETag check for PATCH requests
2312
- const isInCollaborativeDraft = this.base.collaborativeDraft.isConnected();
2313
- if (isInCollaborativeDraft) {
2372
+ // In collaborative draft or sticky session, disable ETag check for PATCH requests
2373
+ const internalContext = this.getView()?.getBindingContext("internal") as InternalModelContext;
2374
+ const ignoreETag = this.base.collaborativeDraft.isConnected() || internalContext.getProperty("/sessionOn");
2375
+
2376
+ if (ignoreETag) {
2314
2377
  ((oEvent.getSource() as Binding).getModel() as ODataModel).setIgnoreETag(true);
2315
2378
  }
2316
- if (!(this.getView()?.getBindingContext("internal") as InternalModelContext)?.getProperty("skipPatchHandlers")) {
2379
+ if (!internalContext?.getProperty("skipPatchHandlers")) {
2317
2380
  const sourceBinding = oEvent.getSource() as unknown as ODataListBinding; // FIXME: UI5 type says this should be an ODataContextBinding
2318
2381
  // Create a promise that will be resolved or rejected when the path is completed
2319
2382
  const oPatchPromise = new Promise<void>((resolve, reject) => {
2320
2383
  oEvent.getSource().attachEventOnce("patchCompleted", (patchCompletedEvent: UI5Event<{ success: boolean }>) => {
2321
2384
  // Re-enable ETag checks
2322
- if (isInCollaborativeDraft) {
2385
+ if (ignoreETag) {
2323
2386
  ((oEvent.getSource() as Binding).getModel() as ODataModel).setIgnoreETag(false);
2324
2387
  }
2325
2388
 
@@ -2468,6 +2531,10 @@ class EditFlow extends BaseControllerExtension {
2468
2531
  draftsWithNonDeletableActive?: Context[];
2469
2532
  }
2470
2533
  ): Promise<void> {
2534
+ if (parameters.selectedContexts) {
2535
+ // as selected contexts may include inactive context we need to compute this parameter again to ensure delete helper works properly
2536
+ parameters.numberOfSelectedContexts = parameters.selectedContexts.length;
2537
+ }
2471
2538
  const resourceModel = this._getResourceModel();
2472
2539
  const transactionHelper = this.getTransactionHelper();
2473
2540
 
@@ -2612,6 +2679,9 @@ class EditFlow extends BaseControllerExtension {
2612
2679
 
2613
2680
  if (editMode) {
2614
2681
  globalModel.setProperty("/isEditable", editMode === "Editable", undefined, true);
2682
+ if (editMode !== "Editable") {
2683
+ this.forceDraftSaveOrDiscard(false);
2684
+ }
2615
2685
  }
2616
2686
 
2617
2687
  if (isCreation !== undefined) {
@@ -2621,6 +2691,23 @@ class EditFlow extends BaseControllerExtension {
2621
2691
  }
2622
2692
  }
2623
2693
 
2694
+ /**
2695
+ * Sets the flag to force Save or Discard when leaving a draft.
2696
+ * @param forced
2697
+ */
2698
+ private forceDraftSaveOrDiscard(forced: boolean): void {
2699
+ this.getGlobalUIModel().setProperty("/forceDraftSaveOrDiscard", forced, undefined, true);
2700
+ }
2701
+
2702
+ /**
2703
+ * Checks if we should force the user to Save or Discard when leaving a draft, or if keeping the draft is allowed.
2704
+ *
2705
+ * @returns True if keeping the draft is not allowed
2706
+ */
2707
+ shallForceDraftSaveOrDiscard(): boolean {
2708
+ return this.getGlobalUIModel().getProperty("/forceDraftSaveOrDiscard") === true;
2709
+ }
2710
+
2624
2711
  /**
2625
2712
  * Checks if an action corresponds to a create action for a sticky session.
2626
2713
  *
@@ -3199,28 +3286,38 @@ class EditFlow extends BaseControllerExtension {
3199
3286
  });
3200
3287
  if (!bReturnedContextIsSame) {
3201
3288
  return new Promise<boolean>((resolve) => {
3289
+ const appComponent = this.getAppComponent();
3202
3290
  if (oBinding.isRoot()) {
3203
- oBinding.attachEventOnce("dataReceived", function () {
3204
- resolve(!bReturnedContextIsSame);
3205
- });
3206
- oBinding.refresh();
3291
+ if (this.getTransactionHelper().isListBindingHierarchical(oBinding)) {
3292
+ // We use a side-effect refresh for a TreeTable, to preserve expansion states
3293
+ appComponent
3294
+ .getSideEffectsService()
3295
+ .requestSideEffects([{ $NavigationPropertyPath: "" }], oBinding.getHeaderContext()!)
3296
+ .then(() => {
3297
+ resolve(true);
3298
+ return;
3299
+ })
3300
+ .catch((e: unknown) => {
3301
+ Log.error("Error while refreshing the table", e as string);
3302
+ resolve(true);
3303
+ });
3304
+ } else {
3305
+ oBinding.attachEventOnce("dataReceived", function () {
3306
+ resolve(true);
3307
+ });
3308
+ oBinding.refresh();
3309
+ }
3207
3310
  } else {
3208
- const oAppComponent = this.getAppComponent();
3209
- oAppComponent
3311
+ appComponent
3210
3312
  .getSideEffectsService()
3211
3313
  .requestSideEffects([{ $NavigationPropertyPath: oBinding.getPath() }], oBinding.getContext())
3212
- .then(
3213
- function () {
3214
- resolve(!bReturnedContextIsSame);
3215
- return;
3216
- },
3217
- function () {
3218
- Log.error("Error while refreshing the table");
3219
- resolve(!bReturnedContextIsSame);
3220
- }
3221
- )
3222
- .catch(function (e: unknown) {
3314
+ .then(() => {
3315
+ resolve(true);
3316
+ return;
3317
+ })
3318
+ .catch((e: unknown) => {
3223
3319
  Log.error("Error while refreshing the table", e as string);
3320
+ resolve(true);
3224
3321
  });
3225
3322
  }
3226
3323
  });
@@ -14,9 +14,11 @@ sap.ui.define([], function () {
14
14
  * Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
15
15
  *
16
16
  * @param execution
17
+ * @param asyncExecution
17
18
  * @returns A method decorator
18
19
  */
19
20
  function hookable(execution) {
21
+ let asyncExecution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
20
22
  return function (target, propertyKey, descriptor) {
21
23
  const indexableTarget = target;
22
24
  const handlers = [];
@@ -30,19 +32,35 @@ sap.ui.define([], function () {
30
32
  }
31
33
  };
32
34
  const oldValue = descriptor.value;
33
- descriptor.value = function () {
34
- let returnValue;
35
- if (execution === "after") {
36
- returnValue = oldValue(...arguments);
37
- }
38
- for (const handler of handlers) {
39
- handler(...arguments);
40
- }
41
- if (execution === "before") {
42
- returnValue = oldValue(...arguments);
43
- }
44
- return returnValue;
45
- };
35
+ if (asyncExecution) {
36
+ descriptor.value = async function () {
37
+ let returnValue;
38
+ if (execution === "after") {
39
+ returnValue = await oldValue(...arguments);
40
+ }
41
+ for (const handler of handlers) {
42
+ await handler(...arguments);
43
+ }
44
+ if (execution === "before") {
45
+ returnValue = await oldValue(...arguments);
46
+ }
47
+ return returnValue;
48
+ };
49
+ } else {
50
+ descriptor.value = function () {
51
+ let returnValue;
52
+ if (execution === "after") {
53
+ returnValue = oldValue(...arguments);
54
+ }
55
+ for (const handler of handlers) {
56
+ handler(...arguments);
57
+ }
58
+ if (execution === "before") {
59
+ returnValue = oldValue(...arguments);
60
+ }
61
+ return returnValue;
62
+ };
63
+ }
46
64
  };
47
65
  }
48
66
 
@@ -122,4 +140,4 @@ sap.ui.define([], function () {
122
140
  _exports.xmlViewPreprocessor = xmlViewPreprocessor;
123
141
  return _exports;
124
142
  }, false);
125
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJoYW5kbGVycyIsInRvU3RyaW5nIiwiZm4iLCJwdXNoIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiaGFuZGxlciIsImlzQWxyZWFkeVJlZ2lzdGVyZWQiLCJleGlzdGluZ1JlZ2lzdHJhdGlvbnMiLCJuZXdSZWdpc3RyYXRpb24iLCJmaW5kIiwiciIsIm5hbWUiLCJtZXRob2QiLCJ0YXJnZXRNZXRob2QiLCJjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlciIsIlN0cmluZyIsImNvbnN0cnVjdG9yIiwiaW5pdENvbnRyb2xsZXJFeHRlbnNpb25Ib29rSGFuZGxlcnMiLCJjb250cm9sbGVyIiwiaW5kZXhhYmxlQ29udHJvbGxlciIsInJlZ2lzdGVyZWRIYW5kbGVyIiwiaGFuZGxlckZ1bmN0aW9uIiwiYmluZCIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwieG1sVmlld1ByZXByb2Nlc3NvciIsInNvdXJjZSIsIl9jYWxsZXIiLCJfc2V0dGluZ3MiLCJzb3VyY2VWaWV3IiwiZ2V0Q29udHJvbGxlciIsIm1hY3JvQVBJQ2hpbGQiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJzIiwiaXNBIiwibWFuYWdlZE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSG9va1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuXG4vKipcbiAqIFRoaXMgdHlwZSBpcyB0byBiZSBleHRlbmRlZCB3aXRoIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbnMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgaG9va2FibGUuXG4gKi9cbnR5cGUgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucyA9IHtcblx0ZWRpdEZsb3c6IHtcblx0XHRvbkFmdGVyU2F2ZTogdHJ1ZTtcblx0fTtcblx0Y29sbGFib3JhdGlvbk1hbmFnZXI6IHtcblx0XHRjb2xsZWN0QXZhaWxhYmxlQ2FyZHM6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleGVjdXRpb25cbiAqIEByZXR1cm5zIEEgbWV0aG9kIGRlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va2FibGUoZXhlY3V0aW9uOiBcImJlZm9yZVwiIHwgXCJhZnRlclwiKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHVua25vd24sIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyBGdW5jdGlvbk1hcDtcblxuXHRcdGNvbnN0IGhhbmRsZXJzOiBGdW5jdGlvbltdID0gW107XG5cblx0XHRpbmRleGFibGVUYXJnZXRbYGF0dGFjaCR7cHJvcGVydHlLZXkudG9TdHJpbmcoKX1gXSA9IGZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGhhbmRsZXJzLnB1c2goZm4pO1xuXHRcdH07XG5cdFx0aW5kZXhhYmxlVGFyZ2V0W2BkZXRhY2gke3Byb3BlcnR5S2V5LnRvU3RyaW5nKCl9YF0gPSBmdW5jdGlvbiAoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoZm4pO1xuXHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBvbGRWYWx1ZSA9IGRlc2NyaXB0b3IudmFsdWU7XG5cdFx0ZGVzY3JpcHRvci52YWx1ZSA9ICguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duID0+IHtcblx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiYWZ0ZXJcIikge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG9sZFZhbHVlKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0XHRcdGhhbmRsZXIoLi4uYXJncyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcImJlZm9yZVwiKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlID0gb2xkVmFsdWUoLi4uYXJncyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0fTtcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5ld1JlZ2lzdHJhdGlvbiBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHNvbWUgZXhpc3RpbmdSZWdpc3RyYXRpb25zIGJ5IGNvbXBhcmluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmdSZWdpc3RyYXRpb25zXG4gKiBAcGFyYW0gbmV3UmVnaXN0cmF0aW9uXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNoZWNrXG4gKi9cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlZ2lzdGVyZWQoZXhpc3RpbmdSZWdpc3RyYXRpb25zOiBIYW5kbGVyUmVnaXN0cmF0aW9uW10sIG5ld1JlZ2lzdHJhdGlvbjogSGFuZGxlclJlZ2lzdHJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFleGlzdGluZ1JlZ2lzdHJhdGlvbnMuZmluZChcblx0XHQocikgPT4gci5uYW1lID09PSBuZXdSZWdpc3RyYXRpb24ubmFtZSAmJiByLm1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLm1ldGhvZCAmJiByLnRhcmdldE1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLnRhcmdldE1ldGhvZFxuXHQpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG1ldGhvZCBhcyBjb250cm9sbGVyIGV4dGVuc2lvbiBob29rIGhhbmRsZXIuXG4gKlxuICogQ3VycmVudGx5LCBvbmx5IG1ldGhvZHMgb2YgcnVudGltZSBidWlsZGluZyBibG9ja3MgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBuZXdSZWdpc3RyYXRpb24gPSB7IG5hbWUsIG1ldGhvZDogU3RyaW5nKG1ldGhvZCksIHRhcmdldE1ldGhvZDogcHJvcGVydHlLZXkgfTtcblx0XHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBjbGFzcyB0byBpbml0aWFsaXplIHRoZSBoYW5kbGVycyBmb3JcbiAqIEBwYXJhbSB0YXJnZXQuY29uc3RydWN0b3JcbiAqIEBwYXJhbSBjb250cm9sbGVyIFBhZ2VDb250cm9sbGVyIGluc3RhbmNlIHRvIGdldCB0aGUgY29udHJvbGxlciBleHRlbnNpb25zIGluc3RhbmNlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdGNvbnN0IGluZGV4ID0gcmVnaXN0ZXJlZEluc3RhbmNlcy5pbmRleE9mKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRjb25zdCBpbmRleGFibGVDb250cm9sbGVyID0gY29udHJvbGxlciBhcyB1bmtub3duIGFzIERlZXBGdW5jdGlvbk1hcDtcblx0XHRjb25zdCBpbmRleGFibGVUYXJnZXQgPSB0YXJnZXQgYXMgdW5rbm93biBhcyBGdW5jdGlvbk1hcDtcblxuXHRcdGZvciAoY29uc3QgcmVnaXN0ZXJlZEhhbmRsZXIgb2YgcmVnaXN0ZXJlZEhhbmRsZXJzW2luZGV4XSkge1xuXHRcdFx0Y29uc3QgaGFuZGxlckZ1bmN0aW9uID0gaW5kZXhhYmxlVGFyZ2V0W3JlZ2lzdGVyZWRIYW5kbGVyLnRhcmdldE1ldGhvZF0uYmluZCh0YXJnZXQpO1xuXG5cdFx0XHRpbmRleGFibGVDb250cm9sbGVyW3JlZ2lzdGVyZWRIYW5kbGVyLm5hbWVdW2BhdHRhY2gke1N0cmluZyhyZWdpc3RlcmVkSGFuZGxlci5tZXRob2QpfWBdKGhhbmRsZXJGdW5jdGlvbik7XG5cdFx0XHRjb250cm9sbGVyLmdldFZpZXcoKS5hdHRhY2hCZWZvcmVFeGl0KCgpID0+IHtcblx0XHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSGFuZGxlci5uYW1lXVtgZGV0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhhbmRsZXIubWV0aG9kKX1gXShoYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB4bWxWaWV3UHJlcHJvY2Vzc29yKHNvdXJjZTogb2JqZWN0LCBfY2FsbGVyPzogdW5rbm93biwgX3NldHRpbmdzPzogb2JqZWN0KTogdm9pZCB7XG5cdGNvbnN0IHNvdXJjZVZpZXcgPSBzb3VyY2UgYXMgWE1MVmlldztcblx0Y29uc3QgY29udHJvbGxlciA9IHNvdXJjZVZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyIHwgdW5kZWZpbmVkO1xuXHRpZiAoY29udHJvbGxlcikge1xuXHRcdGNvbnN0IG1hY3JvQVBJQ2hpbGQgPSBzb3VyY2VWaWV3LmZpbmRBZ2dyZWdhdGVkT2JqZWN0cyh0cnVlLCAocykgPT4gcy5pc0EoXCJzYXAuZmUubWFjcm9zLk1hY3JvQVBJXCIpKTtcblx0XHRmb3IgKGNvbnN0IG1hbmFnZWRPYmplY3Qgb2YgbWFjcm9BUElDaGlsZCkge1xuXHRcdFx0aW5pdENvbnRyb2xsZXJFeHRlbnNpb25Ib29rSGFuZGxlcnMobWFuYWdlZE9iamVjdCwgY29udHJvbGxlcik7XG5cdFx0fVxuXHR9XG59XG4iXSwibWFw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
143
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJhc3luY0V4ZWN1dGlvbiIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsImluZGV4YWJsZVRhcmdldCIsImhhbmRsZXJzIiwidG9TdHJpbmciLCJmbiIsInB1c2giLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJvbGRWYWx1ZSIsInZhbHVlIiwicmV0dXJuVmFsdWUiLCJoYW5kbGVyIiwiaXNBbHJlYWR5UmVnaXN0ZXJlZCIsImV4aXN0aW5nUmVnaXN0cmF0aW9ucyIsIm5ld1JlZ2lzdHJhdGlvbiIsImZpbmQiLCJyIiwibmFtZSIsIm1ldGhvZCIsInRhcmdldE1ldGhvZCIsImNvbnRyb2xsZXJFeHRlbnNpb25IYW5kbGVyIiwiU3RyaW5nIiwiY29uc3RydWN0b3IiLCJpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyIsImNvbnRyb2xsZXIiLCJpbmRleGFibGVDb250cm9sbGVyIiwicmVnaXN0ZXJlZEhhbmRsZXIiLCJoYW5kbGVyRnVuY3Rpb24iLCJiaW5kIiwiZ2V0VmlldyIsImF0dGFjaEJlZm9yZUV4aXQiLCJ4bWxWaWV3UHJlcHJvY2Vzc29yIiwic291cmNlIiwiX2NhbGxlciIsIl9zZXR0aW5ncyIsInNvdXJjZVZpZXciLCJnZXRDb250cm9sbGVyIiwibWFjcm9BUElDaGlsZCIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsInMiLCJpc0EiLCJtYW5hZ2VkT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJIb29rU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFhNTFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9YTUxWaWV3XCI7XG5cbi8qKlxuICogVGhpcyB0eXBlIGlzIHRvIGJlIGV4dGVuZGVkIHdpdGggYWxsIGNvbnRyb2xsZXIgZXh0ZW5zaW9ucyBhbmQgbWV0aG9kcyB0aGF0IGFyZSBob29rYWJsZS5cbiAqL1xudHlwZSBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zID0ge1xuXHRlZGl0Rmxvdzoge1xuXHRcdG9uQWZ0ZXJTYXZlOiB0cnVlO1xuXHRcdG9uQmVmb3JlU2F2ZTogdHJ1ZTtcblx0fTtcblx0Y29sbGFib3JhdGlvbk1hbmFnZXI6IHtcblx0XHRjb2xsZWN0QXZhaWxhYmxlQ2FyZHM6IHRydWU7XG5cdH07XG5cdHBhZ2luYXRvcjoge1xuXHRcdGluaXRpYWxpemU6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleGVjdXRpb25cbiAqIEBwYXJhbSBhc3luY0V4ZWN1dGlvblxuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rYWJsZShleGVjdXRpb246IFwiYmVmb3JlXCIgfCBcImFmdGVyXCIsIGFzeW5jRXhlY3V0aW9uID0gZmFsc2UpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogdW5rbm93biwgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgaW5kZXhhYmxlVGFyZ2V0ID0gdGFyZ2V0IGFzIEZ1bmN0aW9uTWFwO1xuXG5cdFx0Y29uc3QgaGFuZGxlcnM6IEZ1bmN0aW9uW10gPSBbXTtcblxuXHRcdGluZGV4YWJsZVRhcmdldFtgYXR0YWNoJHtwcm9wZXJ0eUtleS50b1N0cmluZygpfWBdID0gZnVuY3Rpb24gKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0aGFuZGxlcnMucHVzaChmbik7XG5cdFx0fTtcblx0XHRpbmRleGFibGVUYXJnZXRbYGRldGFjaCR7cHJvcGVydHlLZXkudG9TdHJpbmcoKX1gXSA9IGZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihmbik7XG5cdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IG9sZFZhbHVlID0gZGVzY3JpcHRvci52YWx1ZTtcblx0XHRpZiAoYXN5bmNFeGVjdXRpb24pIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG5cdFx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJhZnRlclwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBhd2FpdCBvbGRWYWx1ZSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiYmVmb3JlXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IGF3YWl0IG9sZFZhbHVlKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSAoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJhZnRlclwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBvbGRWYWx1ZSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRoYW5kbGVyKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiYmVmb3JlXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG9sZFZhbHVlKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmV3UmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gc29tZSBleGlzdGluZ1JlZ2lzdHJhdGlvbnMgYnkgY29tcGFyaW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ1JlZ2lzdHJhdGlvbnNcbiAqIEBwYXJhbSBuZXdSZWdpc3RyYXRpb25cbiAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNBbHJlYWR5UmVnaXN0ZXJlZChleGlzdGluZ1JlZ2lzdHJhdGlvbnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXSwgbmV3UmVnaXN0cmF0aW9uOiBIYW5kbGVyUmVnaXN0cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWV4aXN0aW5nUmVnaXN0cmF0aW9ucy5maW5kKFxuXHRcdChyKSA9PiByLm5hbWUgPT09IG5ld1JlZ2lzdHJhdGlvbi5uYW1lICYmIHIubWV0aG9kID09PSBuZXdSZWdpc3RyYXRpb24ubWV0aG9kICYmIHIudGFyZ2V0TWV0aG9kID09PSBuZXdSZWdpc3RyYXRpb24udGFyZ2V0TWV0aG9kXG5cdCk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgbWV0aG9kIGFzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGhvb2sgaGFuZGxlci5cbiAqXG4gKiBDdXJyZW50bHksIG9ubHkgbWV0aG9kcyBvZiBydW50aW1lIGJ1aWxkaW5nIGJsb2NrcyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSBuYW1lIENvbnRyb2xsZXIgZXh0ZW5zaW9uIHRvIGhvb2sgaW50b1xuICogQHBhcmFtIG1ldGhvZCBNZXRob2QgdG8gaG9vayBpbnRvXG4gKiBAcmV0dXJucyBBIG1ldGhvZCBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJFeHRlbnNpb25IYW5kbGVyPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4oXG5cdG5hbWU6IENFeHROYW1lLFxuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogeyBjb25zdHJ1Y3RvcjogRnVuY3Rpb24gfSwgcHJvcGVydHlLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IG5ld1JlZ2lzdHJhdGlvbiA9IHsgbmFtZSwgbWV0aG9kOiBTdHJpbmcobWV0aG9kKSwgdGFyZ2V0TWV0aG9kOiBwcm9wZXJ0eUtleSB9O1xuXHRcdGNvbnN0IGluZGV4ID0gcmVnaXN0ZXJlZEluc3RhbmNlcy5pbmRleE9mKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cblx0XHQvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgZXhhY3QgaGFuZGxlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgaGFuZGxlcnMgYXJlIHJlZ2lzdGVyZWQgc3RhdGljYWxseSAob24gdGhlIGNvbnN0cnVjdG9yKVxuXHRcdGlmIChpbmRleCAhPT0gLTEgJiYgIWlzQWxyZWFkeVJlZ2lzdGVyZWQocmVnaXN0ZXJlZEhhbmRsZXJzW2luZGV4XSwgbmV3UmVnaXN0cmF0aW9uKSkge1xuXHRcdFx0cmVnaXN0ZXJlZEhhbmRsZXJzW2luZGV4XS5wdXNoKG5ld1JlZ2lzdHJhdGlvbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlZ2lzdGVyZWRJbnN0YW5jZXMucHVzaCh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdFx0cmVnaXN0ZXJlZEhhbmRsZXJzLnB1c2goW25ld1JlZ2lzdHJhdGlvbl0pO1xuXHRcdH1cblx0fSBhcyBNZXRob2REZWNvcmF0b3I7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYWxsIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGhhbmRsZXJzIGZvclxuICogQHBhcmFtIHRhcmdldC5jb25zdHJ1Y3RvclxuICogQHBhcmFtIGNvbnRyb2xsZXIgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gZ2V0IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbnMgaW5zdGFuY2VzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKHRhcmdldDogeyBjb25zdHJ1Y3RvcjogRnVuY3Rpb24gfSwgY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0Y29uc3QgaW5kZXggPSByZWdpc3RlcmVkSW5zdGFuY2VzLmluZGV4T2YodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdGNvbnN0IGluZGV4YWJsZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIHVua25vd24gYXMgRGVlcEZ1bmN0aW9uTWFwO1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyB1bmtub3duIGFzIEZ1bmN0aW9uTWFwO1xuXG5cdFx0Zm9yIChjb25zdCByZWdpc3RlcmVkSGFuZGxlciBvZiByZWdpc3RlcmVkSGFuZGxlcnNbaW5kZXhdKSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyRnVuY3Rpb24gPSBpbmRleGFibGVUYXJnZXRbcmVnaXN0ZXJlZEhhbmRsZXIudGFyZ2V0TWV0aG9kXS5iaW5kKHRhcmdldCk7XG5cblx0XHRcdGluZGV4YWJsZUNvbnRyb2xsZXJbcmVnaXN0ZXJlZEhhbmRsZXIubmFtZV1bYGF0dGFjaCR7U3RyaW5nKHJlZ2lzdGVyZWRIYW5kbGVyLm1ldGhvZCl9YF0oaGFuZGxlckZ1bmN0aW9uKTtcblx0XHRcdGNvbnRyb2xsZXIuZ2V0VmlldygpLmF0dGFjaEJlZm9yZUV4aXQoKCkgPT4ge1xuXHRcdFx0XHRpbmRleGFibGVDb250cm9sbGVyW3JlZ2lzdGVyZWRIYW5kbGVyLm5hbWVdW2BkZXRhY2gke1N0cmluZyhyZWdpc3RlcmVkSGFuZGxlci5tZXRob2QpfWBdKGhhbmRsZXJGdW5jdGlvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHhtbFZpZXdQcmVwcm9jZXNzb3Ioc291cmNlOiBvYmplY3QsIF9jYWxsZXI/OiB1bmtub3duLCBfc2V0dGluZ3M/OiBvYmplY3QpOiB2b2lkIHtcblx0Y29uc3Qgc291cmNlVmlldyA9IHNvdXJjZSBhcyBYTUxWaWV3O1xuXHRjb25zdCBjb250cm9sbGVyID0gc291cmNlVmlldy5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG5cdGlmIChjb250cm9sbGVyKSB7XG5cdFx0Y29uc3QgbWFjcm9BUElDaGlsZCA9IHNvdXJjZVZpZXcuZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChzKSA9PiBzLmlzQShcInNhcC5mZS5tYWNyb3MuTWFjcm9BUElcIikpO1xuXHRcdGZvciAoY29uc3QgbWFuYWdlZE9iamVjdCBvZiBtYWNyb0FQSUNoaWxkKSB7XG5cdFx0XHRpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyhtYW5hZ2VkT2JqZWN0LCBjb250cm9sbGVyKTtcblx0XHR9XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUFpQ0E7RUFDQSxNQUFNQSxtQkFBK0IsR0FBRyxFQUFFO0VBQzFDLE1BQU1DLGtCQUEyQyxHQUFHLEVBQUU7O0VBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsUUFBUSxDQUFDQyxTQUE2QixFQUEyQztJQUFBLElBQXpDQyxjQUFjLHVFQUFHLEtBQUs7SUFDN0UsT0FBTyxVQUFVQyxNQUFlLEVBQUVDLFdBQTRCLEVBQUVDLFVBQThCLEVBQUU7TUFDL0Ys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
@@ -7,10 +7,14 @@ import type XMLView from "sap/ui/core/mvc/XMLView";
7
7
  type HookableControllerExtensions = {
8
8
  editFlow: {
9
9
  onAfterSave: true;
10
+ onBeforeSave: true;
10
11
  };
11
12
  collaborationManager: {
12
13
  collectAvailableCards: true;
13
14
  };
15
+ paginator: {
16
+ initialize: true;
17
+ };
14
18
  };
15
19
 
16
20
  type HandlerConfiguration<CExtName extends keyof HookableControllerExtensions> = {
@@ -35,9 +39,10 @@ const registeredHandlers: HandlerRegistration[][] = [];
35
39
  * Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
36
40
  *
37
41
  * @param execution
42
+ * @param asyncExecution
38
43
  * @returns A method decorator
39
44
  */
40
- export function hookable(execution: "before" | "after"): MethodDecorator {
45
+ export function hookable(execution: "before" | "after", asyncExecution = false): MethodDecorator {
41
46
  return function (target: unknown, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
42
47
  const indexableTarget = target as FunctionMap;
43
48
 
@@ -54,19 +59,35 @@ export function hookable(execution: "before" | "after"): MethodDecorator {
54
59
  };
55
60
 
56
61
  const oldValue = descriptor.value;
57
- descriptor.value = (...args: unknown[]): unknown => {
58
- let returnValue: unknown;
59
- if (execution === "after") {
60
- returnValue = oldValue(...args);
61
- }
62
- for (const handler of handlers) {
63
- handler(...args);
64
- }
65
- if (execution === "before") {
66
- returnValue = oldValue(...args);
67
- }
68
- return returnValue;
69
- };
62
+ if (asyncExecution) {
63
+ descriptor.value = async (...args: unknown[]): Promise<unknown> => {
64
+ let returnValue: unknown;
65
+ if (execution === "after") {
66
+ returnValue = await oldValue(...args);
67
+ }
68
+ for (const handler of handlers) {
69
+ await handler(...args);
70
+ }
71
+ if (execution === "before") {
72
+ returnValue = await oldValue(...args);
73
+ }
74
+ return returnValue;
75
+ };
76
+ } else {
77
+ descriptor.value = (...args: unknown[]): unknown => {
78
+ let returnValue: unknown;
79
+ if (execution === "after") {
80
+ returnValue = oldValue(...args);
81
+ }
82
+ for (const handler of handlers) {
83
+ handler(...args);
84
+ }
85
+ if (execution === "before") {
86
+ returnValue = oldValue(...args);
87
+ }
88
+ return returnValue;
89
+ };
90
+ }
70
91
  };
71
92
  }
72
93
 
@@ -5,8 +5,7 @@
5
5
  sap.ui.define(["sap/fe/core/helpers/ClassSupport", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution"], function (ClassSupport, ControllerExtension, OverrideExecution) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _class, _class2;
9
- var _exports = {};
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _class, _class2;
10
9
  var publicExtension = ClassSupport.publicExtension;
11
10
  var finalExtension = ClassSupport.finalExtension;
12
11
  var extensible = ClassSupport.extensible;
@@ -14,7 +13,6 @@ sap.ui.define(["sap/fe/core/helpers/ClassSupport", "sap/ui/core/mvc/ControllerEx
14
13
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
15
14
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
16
15
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
17
- let ContextStrategy;
18
16
  /**
19
17
  * Controller extension providing hooks for intent-based navigation
20
18
  *
@@ -22,22 +20,12 @@ sap.ui.define(["sap/fe/core/helpers/ClassSupport", "sap/ui/core/mvc/ControllerEx
22
20
  * @public
23
21
  * @since 1.86.0
24
22
  */
25
- (function (ContextStrategy) {
26
- ContextStrategy["Default"] = "default";
27
- ContextStrategy["Initiator"] = "initiator";
28
- })(ContextStrategy || (ContextStrategy = {}));
29
- _exports.ContextStrategy = ContextStrategy;
30
- let IntentBasedNavigation = (_dec = defineUI5Class("sap.fe.core.controllerextensions.IntentBasedNavigation"), _dec2 = publicExtension(), _dec3 = extensible(OverrideExecution.After), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
23
+ let IntentBasedNavigation = (_dec = defineUI5Class("sap.fe.core.controllerextensions.IntentBasedNavigation"), _dec2 = publicExtension(), _dec3 = extensible(OverrideExecution.After), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
31
24
  _inheritsLoose(IntentBasedNavigation, _ControllerExtension);
32
25
  function IntentBasedNavigation() {
33
26
  return _ControllerExtension.apply(this, arguments) || this;
34
27
  }
35
28
  var _proto = IntentBasedNavigation.prototype;
36
- _proto.adaptContextPreparationStrategy = function adaptContextPreparationStrategy(_oNavigationInfo) {
37
- // to be overriden by the application
38
- return ContextStrategy.Default;
39
- }
40
-
41
29
  /**
42
30
  * Provides a hook to customize the {@link sap.fe.navigation.SelectionVariant} related to the intent-based navigation.
43
31
  *
@@ -47,7 +35,7 @@ sap.ui.define(["sap/fe/core/helpers/ClassSupport", "sap/ui/core/mvc/ControllerEx
47
35
  * @param _oNavigationInfo.action Action related to the intent
48
36
  * @public
49
37
  * @since 1.86.0
50
- */;
38
+ */
51
39
  _proto.adaptNavigationContext = function adaptNavigationContext(_oSelectionVariant, _oNavigationInfo) {
52
40
  // to be overriden by the application
53
41
  }
@@ -73,7 +61,7 @@ sap.ui.define(["sap/fe/core/helpers/ClassSupport", "sap/ui/core/mvc/ControllerEx
73
61
  (_this$base2 = this.base) === null || _this$base2 === void 0 ? void 0 : _this$base2._intentBasedNavigation.navigateOutbound(sOutbound, mNavigationParameters);
74
62
  };
75
63
  return IntentBasedNavigation;
76
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "adaptContextPreparationStrategy", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptContextPreparationStrategy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptNavigationContext", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptNavigationContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateOutbound", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateOutbound"), _class2.prototype)), _class2)) || _class);
64
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "adaptNavigationContext", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptNavigationContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateOutbound", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateOutbound"), _class2.prototype)), _class2)) || _class);
77
65
  return IntentBasedNavigation;
78
66
  }, false);
79
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb250ZXh0U3RyYXRlZ3kiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJhZGFwdENvbnRleHRQcmVwYXJhdGlvblN0cmF0ZWd5IiwiX29OYXZpZ2F0aW9uSW5mbyIsIkRlZmF1bHQiLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX29TZWxlY3Rpb25WYXJpYW50IiwibmF2aWdhdGVPdXRib3VuZCIsInNPdXRib3VuZCIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImJhc2UiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzZXRQcm9wZXJ0eSIsInBhZ2UiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuXG5leHBvcnQgZW51bSBDb250ZXh0U3RyYXRlZ3kge1xuXHREZWZhdWx0ID0gXCJkZWZhdWx0XCIsXG5cdEluaXRpYXRvciA9IFwiaW5pdGlhdG9yXCJcbn1cblxuLyoqXG4gKiBDb250cm9sbGVyIGV4dGVuc2lvbiBwcm92aWRpbmcgaG9va3MgZm9yIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODYuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcbmNsYXNzIEludGVudEJhc2VkTmF2aWdhdGlvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhZGFwdENvbnRleHRQcmVwYXJhdGlvblN0cmF0ZWd5KF9vTmF2aWdhdGlvbkluZm86IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZzsgYWN0aW9uOiBzdHJpbmcgfSk6IENvbnRleHRTdHJhdGVneSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuIGJ5IHRoZSBhcHBsaWNhdGlvblxuXHRcdHJldHVybiBDb250ZXh0U3RyYXRlZ3kuRGVmYXVsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyBhIGhvb2sgdG8gY3VzdG9taXplIHRoZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gcmVsYXRlZCB0byB0aGUgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBfb1NlbGVjdGlvblZhcmlhbnQgU2VsZWN0aW9uVmFyaWFudCBwcm92aWRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG5cdCAqIEBwYXJhbSBfb05hdmlnYXRpb25JbmZvIE9iamVjdCBjb250YWluaW5nIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uLXJlbGF0ZWQgaW5mb1xuXHQgKiBAcGFyYW0gX29OYXZpZ2F0aW9uSW5mby5zZW1hbnRpY09iamVjdCBTZW1hbnRpYyBvYmplY3QgcmVsYXRlZCB0byB0aGUgaW50ZW50XG5cdCAqIEBwYXJhbSBfb05hdmlnYXRpb25JbmZvLmFjdGlvbiBBY3Rpb24gcmVsYXRlZCB0byB0aGUgaW50ZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuODYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhZGFwdE5hdmlnYXRpb25Db250ZXh0KF9vU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgX29OYXZpZ2F0aW9uSW5mbzogeyBzZW1hbnRpY09iamVjdDogc3RyaW5nOyBhY3Rpb246IHN0cmluZyB9KTogdm9pZCB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuIGJ5IHRoZSBhcHBsaWNhdGlvblxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhbiBpbnRlbnQgZGVmaW5lZCBieSBhbiBvdXRib3VuZCBkZWZpbml0aW9uIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQHBhcmFtIHNPdXRib3VuZCBJZGVudGlmaWVyIHRvIGxvY2F0ZSB0aGUgb3V0Ym91bmQgZGVmaW5pdGlvbiBpbiB0aGUgbWFuaWZlc3QuXG5cdCAqIFRoaXMgcHJvdmlkZXMgdGhlIHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGZvciB0aGUgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24uXG5cdCAqIEFkZGl0aW9uYWxseSwgdGhlIG91dGJvdW5kIGRlZmluaXRpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBwYXJhbWV0ZXJzIGZvciBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi5cblx0ICogU2VlIHtAbGluayB0b3BpYzpiZTBjZjQwZjYxMTg0YjM1OGI1ZmFlZGFlYzk4YjJkYSBEZXNjcmlwdG9yIGZvciBBcHBsaWNhdGlvbnMsIENvbXBvbmVudHMsIGFuZCBMaWJyYXJpZXN9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzIE9wdGlvbmFsIG1hcCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudC5cblx0ICogSWYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4gdGhlIG91dGJvdW5kIGRlZmluaXRpb24gb2YgdGhlIG1hbmlmZXN0IGFyZSBpZ25vcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjg2LjBcblx0ICovXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZU91dGJvdW5kKHNPdXRib3VuZDogc3RyaW5nLCBtTmF2aWdhdGlvblBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuYmFzZT8uZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IHBhZ2U6IGZhbHNlIH0pO1xuXHRcdHRoaXMuYmFzZT8uX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZU91dGJvdW5kKHNPdXRib3VuZCwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7TUFPWUEsZUFBZTtFQUszQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BLFdBTFlBLGVBQWU7SUFBZkEsZUFBZTtJQUFmQSxlQUFlO0VBQUEsR0FBZkEsZUFBZSxLQUFmQSxlQUFlO0VBQUE7RUFBQSxJQWFyQkMscUJBQXFCLFdBRDFCQyxjQUFjLENBQUMsd0RBQXdELENBQUMsVUFJdkVDLGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBZ0JuQ0gsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFpQm5DQyxjQUFjLEVBQUUsVUFDaEJKLGVBQWUsRUFBRTtJQUFBO0lBQUE7TUFBQTtJQUFBO0lBQUE7SUFBQSxPQWxDbEJLLCtCQUErQixHQUYvQix5Q0FFZ0NDLGdCQUE0RCxFQUFtQjtNQUM5RztNQUNBLE9BQU9ULGVBQWUsQ0FBQ1UsT0FBTztJQUMvQjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVRDO0lBQUEsT0FZQUMsc0JBQXNCLEdBRnRCLGdDQUV1QkMsa0JBQW9DLEVBQUVILGdCQUE0RCxFQUFRO01BQ2hJO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQSxPQWNBSSxnQkFBZ0IsR0FGaEIsMEJBRWlCQyxTQUFpQixFQUFFQyxxQkFBK0MsRUFBUTtNQUFBO01BQzFGLE1BQU1DLHFCQUFxQixpQkFBRyxJQUFJLENBQUNDLElBQUksK0NBQVQsV0FBV0MsT0FBTyxFQUFFLENBQUNDLGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7TUFDeEdILHFCQUFxQixDQUFDSSxXQUFXLENBQUMsMkJBQTJCLEVBQUU7UUFBRUMsSUFBSSxFQUFFO01BQU0sQ0FBQyxDQUFDO01BQy9FLG1CQUFJLENBQUNKLElBQUksZ0RBQVQsWUFBV0ssc0JBQXNCLENBQUNULGdCQUFnQixDQUFDQyxTQUFTLEVBQUVDLHFCQUFxQixDQUFDO0lBQ3JGLENBQUM7SUFBQTtFQUFBLEVBNUNrQ1EsbUJBQW1CO0VBQUEsT0ErQ3hDdEIscUJBQXFCO0FBQUEifQ==
67
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX29TZWxlY3Rpb25WYXJpYW50IiwiX29OYXZpZ2F0aW9uSW5mbyIsIm5hdmlnYXRlT3V0Ym91bmQiLCJzT3V0Ym91bmQiLCJtTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJiYXNlIiwiZ2V0VmlldyIsImdldEJpbmRpbmdDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJwYWdlIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVudEJhc2VkTmF2aWdhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcblxuLyoqXG4gKiBDb250cm9sbGVyIGV4dGVuc2lvbiBwcm92aWRpbmcgaG9va3MgZm9yIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODYuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcbmNsYXNzIEludGVudEJhc2VkTmF2aWdhdGlvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgaG9vayB0byBjdXN0b21pemUgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSByZWxhdGVkIHRvIHRoZSBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIF9vU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb25WYXJpYW50IHByb3ZpZGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cblx0ICogQHBhcmFtIF9vTmF2aWdhdGlvbkluZm8gT2JqZWN0IGNvbnRhaW5pbmcgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24tcmVsYXRlZCBpbmZvXG5cdCAqIEBwYXJhbSBfb05hdmlnYXRpb25JbmZvLnNlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCByZWxhdGVkIHRvIHRoZSBpbnRlbnRcblx0ICogQHBhcmFtIF9vTmF2aWdhdGlvbkluZm8uYWN0aW9uIEFjdGlvbiByZWxhdGVkIHRvIHRoZSBpbnRlbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS44Ni4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFkYXB0TmF2aWdhdGlvbkNvbnRleHQoX29TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCBfb05hdmlnYXRpb25JbmZvOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW4gYnkgdGhlIGFwcGxpY2F0aW9uXG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGFuIGludGVudCBkZWZpbmVkIGJ5IGFuIG91dGJvdW5kIGRlZmluaXRpb24gaW4gdGhlIG1hbmlmZXN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc091dGJvdW5kIElkZW50aWZpZXIgdG8gbG9jYXRlIHRoZSBvdXRib3VuZCBkZWZpbml0aW9uIGluIHRoZSBtYW5pZmVzdC5cblx0ICogVGhpcyBwcm92aWRlcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIHRoZSBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi5cblx0ICogQWRkaXRpb25hbGx5LCB0aGUgb3V0Ym91bmQgZGVmaW5pdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHBhcmFtZXRlcnMgZm9yIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uLlxuXHQgKiBTZWUge0BsaW5rIHRvcGljOmJlMGNmNDBmNjExODRiMzU4YjVmYWVkYWVjOThiMmRhIERlc2NyaXB0b3IgZm9yIEFwcGxpY2F0aW9ucywgQ29tcG9uZW50cywgYW5kIExpYnJhcmllc30gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgT3B0aW9uYWwgbWFwIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50LlxuXHQgKiBJZiBtTmF2aWdhdGlvblBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCBpbiB0aGUgb3V0Ym91bmQgZGVmaW5pdGlvbiBvZiB0aGUgbWFuaWZlc3QgYXJlIGlnbm9yZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuODYuMFxuXHQgKi9cblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kOiBzdHJpbmcsIG1OYXZpZ2F0aW9uUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5iYXNlPy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgcGFnZTogZmFsc2UgfSk7XG5cdFx0dGhpcy5iYXNlPy5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVudEJhc2VkTmF2aWdhdGlvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0VBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQVFNQSxxQkFBcUIsV0FEMUJDLGNBQWMsQ0FBQyx3REFBd0QsQ0FBQyxVQWN2RUMsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFpQm5DQyxjQUFjLEVBQUUsVUFDaEJKLGVBQWUsRUFBRTtJQUFBO0lBQUE7TUFBQTtJQUFBO0lBQUE7SUE3QmxCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBVEMsT0FZQUssc0JBQXNCLEdBRnRCLGdDQUV1QkMsa0JBQW9DLEVBQUVDLGdCQUE0RCxFQUFRO01BQ2hJO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQSxPQWNBQyxnQkFBZ0IsR0FGaEIsMEJBRWlCQyxTQUFpQixFQUFFQyxxQkFBK0MsRUFBUTtNQUFBO01BQzFGLE1BQU1DLHFCQUFxQixpQkFBRyxJQUFJLENBQUNDLElBQUksK0NBQVQsV0FBV0MsT0FBTyxFQUFFLENBQUNDLGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7TUFDeEdILHFCQUFxQixDQUFDSSxXQUFXLENBQUMsMkJBQTJCLEVBQUU7UUFBRUMsSUFBSSxFQUFFO01BQU0sQ0FBQyxDQUFDO01BQy9FLG1CQUFJLENBQUNKLElBQUksZ0RBQVQsWUFBV0ssc0JBQXNCLENBQUNULGdCQUFnQixDQUFDQyxTQUFTLEVBQUVDLHFCQUFxQixDQUFDO0lBQ3JGLENBQUM7SUFBQTtFQUFBLEVBckNrQ1EsbUJBQW1CO0VBQUEsT0F3Q3hDcEIscUJBQXFCO0FBQUEifQ==