@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.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +1 -2
- package/src/sap/fe/core/CommonUtils.js +14 -171
- package/src/sap/fe/core/CommonUtils.ts +15 -221
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +16 -0
- package/src/sap/fe/core/TemplateComponent.js +6 -1
- package/src/sap/fe/core/TemplateComponent.ts +8 -0
- package/src/sap/fe/core/UIProvider.js +23 -0
- package/src/sap/fe/core/UIProvider.ts +38 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
- package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
- package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
- package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
- package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
- package/src/sap/fe/core/controllerextensions/Share.js +7 -7
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
- package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
- package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
- package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
- package/src/sap/fe/core/converters/ConverterContext.js +17 -9
- package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
- package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
- package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
- package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
- package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
- package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
- package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
- package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
- package/src/sap/fe/core/converters/helpers/Key.js +2 -2
- package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
- package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
- package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
- package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
- package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
- package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
- package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
- package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
- package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
- package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
- package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
- package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
- package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
- package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
- package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
- package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
- package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
- package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
- package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +5 -2
- package/src/sap/fe/core/messagebundle_da.properties +1 -1
- package/src/sap/fe/core/messagebundle_en.properties +267 -2
- package/src/sap/fe/core/messagebundle_sl.properties +1 -1
- package/src/sap/fe/core/operationsHelper.js +2 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
- package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
- package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
- package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
- package/src/sap/fe/core/templating/FilterHelper.js +13 -10
- package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
- package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
- package/src/sap/fe/core/templating/UIFormatters.js +23 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/EDM.ts +2 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- 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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
|
|
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()
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
|
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()
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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
|
-
|
|
867
|
-
|
|
868
|
-
|
|
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
|
|
2313
|
-
|
|
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 (!
|
|
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 (
|
|
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
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
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
|
-
|
|
3209
|
-
oAppComponent
|
|
3311
|
+
appComponent
|
|
3210
3312
|
.getSideEffectsService()
|
|
3211
3313
|
.requestSideEffects([{ $NavigationPropertyPath: oBinding.getPath() }], oBinding.getContext())
|
|
3212
|
-
.then(
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
handler
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
handler
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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,
|
|
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 (
|
|
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, "
|
|
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,
|
|
67
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX29TZWxlY3Rpb25WYXJpYW50IiwiX29OYXZpZ2F0aW9uSW5mbyIsIm5hdmlnYXRlT3V0Ym91bmQiLCJzT3V0Ym91bmQiLCJtTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJiYXNlIiwiZ2V0VmlldyIsImdldEJpbmRpbmdDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJwYWdlIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVudEJhc2VkTmF2aWdhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcblxuLyoqXG4gKiBDb250cm9sbGVyIGV4dGVuc2lvbiBwcm92aWRpbmcgaG9va3MgZm9yIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODYuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcbmNsYXNzIEludGVudEJhc2VkTmF2aWdhdGlvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgaG9vayB0byBjdXN0b21pemUgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSByZWxhdGVkIHRvIHRoZSBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIF9vU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb25WYXJpYW50IHByb3ZpZGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cblx0ICogQHBhcmFtIF9vTmF2aWdhdGlvbkluZm8gT2JqZWN0IGNvbnRhaW5pbmcgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24tcmVsYXRlZCBpbmZvXG5cdCAqIEBwYXJhbSBfb05hdmlnYXRpb25JbmZvLnNlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCByZWxhdGVkIHRvIHRoZSBpbnRlbnRcblx0ICogQHBhcmFtIF9vTmF2aWdhdGlvbkluZm8uYWN0aW9uIEFjdGlvbiByZWxhdGVkIHRvIHRoZSBpbnRlbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS44Ni4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFkYXB0TmF2aWdhdGlvbkNvbnRleHQoX29TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCBfb05hdmlnYXRpb25JbmZvOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW4gYnkgdGhlIGFwcGxpY2F0aW9uXG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGFuIGludGVudCBkZWZpbmVkIGJ5IGFuIG91dGJvdW5kIGRlZmluaXRpb24gaW4gdGhlIG1hbmlmZXN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc091dGJvdW5kIElkZW50aWZpZXIgdG8gbG9jYXRlIHRoZSBvdXRib3VuZCBkZWZpbml0aW9uIGluIHRoZSBtYW5pZmVzdC5cblx0ICogVGhpcyBwcm92aWRlcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIHRoZSBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi5cblx0ICogQWRkaXRpb25hbGx5LCB0aGUgb3V0Ym91bmQgZGVmaW5pdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHBhcmFtZXRlcnMgZm9yIGludGVudC1iYXNlZCBuYXZpZ2F0aW9uLlxuXHQgKiBTZWUge0BsaW5rIHRvcGljOmJlMGNmNDBmNjExODRiMzU4YjVmYWVkYWVjOThiMmRhIERlc2NyaXB0b3IgZm9yIEFwcGxpY2F0aW9ucywgQ29tcG9uZW50cywgYW5kIExpYnJhcmllc30gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgT3B0aW9uYWwgbWFwIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50LlxuXHQgKiBJZiBtTmF2aWdhdGlvblBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCBpbiB0aGUgb3V0Ym91bmQgZGVmaW5pdGlvbiBvZiB0aGUgbWFuaWZlc3QgYXJlIGlnbm9yZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuODYuMFxuXHQgKi9cblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kOiBzdHJpbmcsIG1OYXZpZ2F0aW9uUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5iYXNlPy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgcGFnZTogZmFsc2UgfSk7XG5cdFx0dGhpcy5iYXNlPy5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVudEJhc2VkTmF2aWdhdGlvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7O0VBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQVFNQSxxQkFBcUIsV0FEMUJDLGNBQWMsQ0FBQyx3REFBd0QsQ0FBQyxVQWN2RUMsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFpQm5DQyxjQUFjLEVBQUUsVUFDaEJKLGVBQWUsRUFBRTtJQUFBO0lBQUE7TUFBQTtJQUFBO0lBQUE7SUE3QmxCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBVEMsT0FZQUssc0JBQXNCLEdBRnRCLGdDQUV1QkMsa0JBQW9DLEVBQUVDLGdCQUE0RCxFQUFRO01BQ2hJO0lBQUE7O0lBR0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQSxPQWNBQyxnQkFBZ0IsR0FGaEIsMEJBRWlCQyxTQUFpQixFQUFFQyxxQkFBK0MsRUFBUTtNQUFBO01BQzFGLE1BQU1DLHFCQUFxQixpQkFBRyxJQUFJLENBQUNDLElBQUksK0NBQVQsV0FBV0MsT0FBTyxFQUFFLENBQUNDLGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7TUFDeEdILHFCQUFxQixDQUFDSSxXQUFXLENBQUMsMkJBQTJCLEVBQUU7UUFBRUMsSUFBSSxFQUFFO01BQU0sQ0FBQyxDQUFDO01BQy9FLG1CQUFJLENBQUNKLElBQUksZ0RBQVQsWUFBV0ssc0JBQXNCLENBQUNULGdCQUFnQixDQUFDQyxTQUFTLEVBQUVDLHFCQUFxQixDQUFDO0lBQ3JGLENBQUM7SUFBQTtFQUFBLEVBckNrQ1EsbUJBQW1CO0VBQUEsT0F3Q3hDcEIscUJBQXFCO0FBQUEifQ==
|