@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
|
@@ -227,4 +227,4 @@ sap.ui.define([], function () {
|
|
|
227
227
|
_exports.prepareId = prepareId;
|
|
228
228
|
return _exports;
|
|
229
229
|
}, false);
|
|
230
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2V0U3RhYmxlSWRQYXJ0RnJvbUlCTiIsImRhdGFGaWVsZCIsImlkUGFydHMiLCJTZW1hbnRpY09iamVjdCIsInZhbHVlT2YiLCJBY3Rpb24iLCJSZXF1aXJlc0NvbnRleHQiLCJwdXNoIiwiZmlsdGVyIiwiaWQiLCJqb2luIiwiX2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZSIsInZhbHVlIiwiVmFsdWUiLCJwYXRoIiwiQXBwbHkiLCJGdW5jdGlvbiIsIm1hcCIsImFwcCIsIiRQYXRoIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsInJlcGxhY2UiLCJfZ2V0U3RhYmxlSWRQYXJ0RnJvbVVybE9yUGF0aCIsInVybCIsIlVybCIsIl9pc1ZhbGlkIiwidGVzdCIsIl9yZW1vdmVOYW1lc3BhY2VzIiwiY3JlYXRlSWRGb3JBbm5vdGF0aW9uIiwiYW5ub3RhdGlvbiIsImlkUHJlcGFyYXRpb24iLCIkVHlwZSIsIklEIiwiVGFyZ2V0IiwiTGFiZWwiLCJnZXRTdGFibGVJZFBhcnRGcm9tRGF0YUZpZWxkIiwidG9TdHJpbmciLCJwcmVwYXJlSWQiLCJnZW5lcmF0ZSIsInN0YWJsZUlkUGFydHMiLCJpZHMiLCJlbGVtZW50IiwidGFyZ2V0T2JqZWN0IiwicmVzdWx0IiwiaWdub3JlRm9yQ29tcGF0aWJpbGl0eSIsInR5cGUiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsIkVycm9yIiwic2xpY2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlN0YWJsZUlkSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFdpdGhBY3Rpb24sXG5cdERhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aCxcblx0RGF0YUZpZWxkV2l0aFVybCxcblx0RmFjZXRUeXBlcyxcblx0RmllbGRHcm91cFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXplZElkQW5ub3RhdGlvbnNUeXBlID0gRmFjZXRUeXBlcyB8IEZpZWxkR3JvdXAgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgSUQgZnJvbSBhbiBJQk4uXG4gKlxuICogVGhlIElEIGNvbnRhaW5zIHRoZSB2YWx1ZSwgdGhlIHBvdGVudGlhbCBhY3Rpb24gYW5kIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgSUJOIGFubm90YXRpb25cbiAqIEByZXR1cm5zIFRoZSBJRFxuICovXG5jb25zdCBfZ2V0U3RhYmxlSWRQYXJ0RnJvbUlCTiA9IChkYXRhRmllbGQ6IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pID0+IHtcblx0Y29uc3QgaWRQYXJ0cyA9IFtkYXRhRmllbGQuU2VtYW50aWNPYmplY3QudmFsdWVPZigpLCBkYXRhRmllbGQuQWN0aW9uPy52YWx1ZU9mKCldO1xuXHRpZiAoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pLlJlcXVpcmVzQ29udGV4dCkge1xuXHRcdGlkUGFydHMucHVzaChcIlJlcXVpcmVzQ29udGV4dFwiKTtcblx0fVxuXHRyZXR1cm4gaWRQYXJ0cy5maWx0ZXIoKGlkKSA9PiBpZCkuam9pbihcIjo6XCIpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIElEIHBhcnQgcmVsYXRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIERhdGFGaWVsZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGRcbiAqIEByZXR1cm5zIFN0cmluZyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGQgdmFsdWVcbiAqL1xuY29uc3QgX2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZSA9IChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGQgfCBEYXRhRmllbGRXaXRoQWN0aW9uIHwgRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZFdpdGhVcmwgfCBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcbik6IHN0cmluZyA9PiB7XG5cdGNvbnN0IHZhbHVlID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRpZiAodmFsdWUucGF0aCkge1xuXHRcdHJldHVybiB2YWx1ZS5wYXRoIGFzIHN0cmluZztcblx0fSBlbHNlIGlmICh2YWx1ZS5BcHBseSAmJiB2YWx1ZS5GdW5jdGlvbiA9PT0gXCJvZGF0YS5jb25jYXRcIikge1xuXHRcdHJldHVybiB2YWx1ZS5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0cmV0dXJuIHJlcGxhY2VTcGVjaWFsQ2hhcnModmFsdWUucmVwbGFjZSgvIC9nLCBcIl9cIikpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIElEIHBhcnQgcmVsYXRlZCB0byB0aGUgdmFsdWUgb3IgdXJsIG9mIHRoZSBEYXRhRmllbGRXaXRoVXJsLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZFdpdGhVcmxcbiAqIEByZXR1cm5zIFN0cmluZyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGRXaXRoVXJsIHZhbHVlIG9yIHVybFxuICovXG5jb25zdCBfZ2V0U3RhYmxlSWRQYXJ0RnJvbVVybE9yUGF0aCA9IChkYXRhRmllbGQ6IERhdGFGaWVsZFdpdGhVcmwpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCB2YWx1ZSA9IGRhdGFGaWVsZC5WYWx1ZTtcblx0aWYgKHZhbHVlPy5wYXRoKSB7XG5cdFx0cmV0dXJuIHZhbHVlLnBhdGggYXMgc3RyaW5nO1xuXHR9IGVsc2UgaWYgKHZhbHVlPy5BcHBseSAmJiB2YWx1ZS5GdW5jdGlvbiA9PT0gXCJvZGF0YS5jb25jYXRcIikge1xuXHRcdHJldHVybiB2YWx1ZS5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0Y29uc3QgdXJsOiBhbnkgPSBkYXRhRmllbGQuVXJsO1xuXHRpZiAodXJsPy5wYXRoKSB7XG5cdFx0cmV0dXJuIHVybC5wYXRoO1xuXHR9IGVsc2UgaWYgKHVybD8uQXBwbHkgJiYgdXJsLkZ1bmN0aW9uID09PSBcIm9kYXRhLmNvbmNhdFwiKSB7XG5cdFx0cmV0dXJuIHVybC5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0cmV0dXJuIHJlcGxhY2VTcGVjaWFsQ2hhcnModmFsdWU/LnJlcGxhY2UoLyAvZywgXCJfXCIpKTtcbn07XG5cbi8qKlxuICogQ29weSBmb3IgdGhlIENvcmUuaXNWYWxpZCBmdW5jdGlvbiB0byBiZSBpbmRlcGVuZGVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgU3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyB2YWxpZCBvciBub3RcbiAqL1xuY29uc3QgX2lzVmFsaWQgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRyZXR1cm4gL14oW0EtWmEtel9dWy1BLVphLXowLTlfLjpdKikkLy50ZXN0KHZhbHVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgYW5ub3RhdGlvbiBuYW1lc3BhY2VzLlxuICpcbiAqIEBwYXJhbSBpZCBTdHJpbmcgdG8gbWFuaXB1bGF0ZVxuICogQHJldHVybnMgU3RyaW5nIHdpdGhvdXQgdGhlIGFubm90YXRpb24gbmFtZXNwYWNlc1xuICovXG5jb25zdCBfcmVtb3ZlTmFtZXNwYWNlcyA9IChpZDogc3RyaW5nKSA9PiB7XG5cdGlkID0gaWQucmVwbGFjZShcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlwiLCBcIlwiKTtcblx0aWQgPSBpZC5yZXBsYWNlKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5cIiwgXCJcIik7XG5cdHJldHVybiBpZDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBJRCBmcm9tIGFuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSBpZFByZXBhcmF0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgSUQgbmVlZHMgdG8gYmUgcHJlcGFyZWQgZm9yIGZpbmFsIHVzYWdlXG4gKiBAcmV0dXJucyBUaGUgSURcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUlkRm9yQW5ub3RhdGlvbiA9IChhbm5vdGF0aW9uOiBBdXRob3JpemVkSWRBbm5vdGF0aW9uc1R5cGUsIGlkUHJlcGFyYXRpb24gPSB0cnVlKSA9PiB7XG5cdGxldCBpZDtcblx0c3dpdGNoIChhbm5vdGF0aW9uLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5SZWZlcmVuY2VGYWNldDpcblx0XHRcdGlkID0gYW5ub3RhdGlvbi5JRCA/PyBhbm5vdGF0aW9uLlRhcmdldC52YWx1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuQ29sbGVjdGlvbkZhY2V0OlxuXHRcdFx0aWQgPSBhbm5vdGF0aW9uLklEID8/IFwidW5kZWZpbmVkXCI7IC8vIENvbGxlY3Rpb25GYWNldCB3aXRob3V0IElkIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IGRvZXNuJ3QgbmVjZXNzYXJ5IGZhaWwgcmlnaHQgbm93XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0aWQgPSBhbm5vdGF0aW9uLkxhYmVsO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlkID0gZ2V0U3RhYmxlSWRQYXJ0RnJvbURhdGFGaWVsZChhbm5vdGF0aW9uIGFzIERhdGFGaWVsZEFic3RyYWN0VHlwZXMpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWQgPSBpZD8udG9TdHJpbmcoKTtcblx0cmV0dXJuIGlkICYmIGlkUHJlcGFyYXRpb24gPyBwcmVwYXJlSWQoaWQpIDogaWQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHN0YWJsZSBJRCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiAqXG4gKiBQYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCBpbiB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBwcm92aWRlZCBhbmQgYXJlIHNlcGFyYXRlZCBieSAnOjonLlxuICogR2VuZXJhdGUoWydTdGFibGUnLCAnSWQnXSkgd291bGQgcmVzdWx0IGluICdTdGFibGU6OklkJyBhcyB0aGUgc3RhYmxlIElELlxuICogQ3VycmVudGx5IHN1cHBvcnRlZCBhbm5vdGF0aW9ucyBhcmUgRmFjZXRzLCBGaWVsZEdyb3VwIGFuZCBhbGwga2luZHMgb2YgRGF0YUZpZWxkLlxuICpcbiAqIEBwYXJhbSBzdGFibGVJZFBhcnRzIEFycmF5IG9mIHN0cmluZ3MsIHVuZGVmaW5lZCwgZGF0YU1vZGVsT2JqZWN0UGF0aCBvciBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgU3RhYmxlIElEIGNvbnN0cnVjdGVkIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlID0gKHN0YWJsZUlkUGFydHM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZCB8IERhdGFNb2RlbE9iamVjdFBhdGggfCBBdXRob3JpemVkSWRBbm5vdGF0aW9uc1R5cGU+KSA9PiB7XG5cdGNvbnN0IGlkczogKHN0cmluZyB8IHVuZGVmaW5lZClbXSA9IHN0YWJsZUlkUGFydHMubWFwKChlbGVtZW50KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8ICFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm4gZWxlbWVudDtcblx0XHR9XG5cdFx0cmV0dXJuIGNyZWF0ZUlkRm9yQW5ub3RhdGlvbigoZWxlbWVudCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoKS50YXJnZXRPYmplY3QgfHwgZWxlbWVudCwgZmFsc2UpO1xuXHR9KTtcblx0Y29uc3QgcmVzdWx0ID0gaWRzLmZpbHRlcigoaWQpID0+IGlkKS5qb2luKFwiOjpcIik7XG5cdHJldHVybiBwcmVwYXJlSWQocmVzdWx0KTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBJRCBmcm9tIGEgRGF0YUZpZWxkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZFxuICogQHBhcmFtIGlnbm9yZUZvckNvbXBhdGliaWxpdHkgSWdub3JlIGEgcGFydCBvZiB0aGUgSUQgb24gdGhlIERhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aCB0byBiZSBhbGlnbmVkIHdpdGggcHJldmlvdXMgdmVyc2lvbnNcbiAqIEByZXR1cm5zIFRoZSBJRFxuICovXG5leHBvcnQgY29uc3QgZ2V0U3RhYmxlSWRQYXJ0RnJvbURhdGFGaWVsZCA9IChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGlnbm9yZUZvckNvbXBhdGliaWxpdHkgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG5cdGxldCBpZCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRGb3JBY3Rpb246OiR7ZGF0YUZpZWxkLkFjdGlvbn1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246OiR7X2dldFN0YWJsZUlkUGFydEZyb21JQk4oZGF0YUZpZWxkKX1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0aWQgPSBgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjo6JHtkYXRhRmllbGQuVGFyZ2V0LnZhbHVlfWA7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoQWN0aW9uOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVmFsdWUoZGF0YUZpZWxkKX06OiR7ZGF0YUZpZWxkLkFjdGlvbn1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGQ6OiR7X2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZShkYXRhRmllbGQpfWA7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVmFsdWUoZGF0YUZpZWxkKX06OiR7X2dldFN0YWJsZUlkUGFydEZyb21JQk4oZGF0YUZpZWxkKX1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6OiR7X2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZShkYXRhRmllbGQpfWA7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC50eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIiAmJiAhaWdub3JlRm9yQ29tcGF0aWJpbGl0eSkge1xuXHRcdFx0XHRpZCA9IGAke2lkfTo6JHtkYXRhRmllbGQuVGFyZ2V0LnZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoVXJsOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVXJsT3JQYXRoKGRhdGFGaWVsZCl9YDtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gaWQgPyBwcmVwYXJlSWQoaWQpIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIG9yIHJlcGxhY2VzIHdpdGggXCI6OlwiIHNvbWUgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogU3BlY2lhbCBjaGFyYWN0ZXJzIChALCAvLCAjKSBhcmUgcmVwbGFjZWQgYnkgJzo6JyBpZiB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdGFibGUgSUQgYW5kIHJlbW92ZWQgYWx0b2dldGhlciBpZiB0aGV5IGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC5cbiAqXG4gKiBAcGFyYW0gaWQgU3RyaW5nIHRvIG1hbmlwdWxhdGVcbiAqIEByZXR1cm5zIFN0cmluZyB3aXRob3V0IHRoZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VTcGVjaWFsQ2hhcnMgPSAoaWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdGlmIChpZC5pbmNsdWRlcyhcIiBcIikpIHtcblx0XHR0aHJvdyBFcnJvcihgJHtpZH0gLSBTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIElEIHBhcnRzLmApO1xuXHR9XG5cdGlkID0gaWRcblx0XHQucmVwbGFjZSgvXlxcL3xeQHxeI3xeXFwqLywgXCJcIikgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuXHRcdC5yZXBsYWNlKC9cXC8kfEAkfCMkfFxcKiQvLCBcIlwiKSAvLyByZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nXG5cdFx0LnJlcGxhY2UoL1xcL3xAfFxcKHxcXCl8I3xcXCovZywgXCI6OlwiKTsgLy8gcmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0aCA6OlxuXG5cdC8vIFJlcGxhY2UgZG91YmxlIG9jY3VycmVuY2VzIG9mIHRoZSBzZXBhcmF0b3Igd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3Jcblx0d2hpbGUgKGlkLmluY2x1ZGVzKFwiOjo6OlwiKSkge1xuXHRcdGlkID0gaWQucmVwbGFjZShcIjo6OjpcIiwgXCI6OlwiKTtcblx0fVxuXG5cdC8vIElmIHRoZXJlIGlzIGEgOjogYXQgdGhlIGVuZCBvZiB0aGUgSUQgcmVtb3ZlIGl0XG5cdGlmIChpZC5zbGljZSgtMikgPT0gXCI6OlwiKSB7XG5cdFx0aWQgPSBpZC5zbGljZSgwLCAtMik7XG5cdH1cblxuXHRyZXR1cm4gaWQ7XG59O1xuXG4vKipcbiAqIFByZXBhcmVzIHRoZSBJRC5cbiAqXG4gKiBSZW1vdmVzIG5hbWVzcGFjZXMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGlzIElELlxuICpcbiAqIEBwYXJhbSBpZCBUaGUgSURcbiAqIEByZXR1cm5zIFRoZSBJRCBvciB0aHJvd3MgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVJZCA9IGZ1bmN0aW9uIChpZDogc3RyaW5nKSB7XG5cdGlkID0gcmVwbGFjZVNwZWNpYWxDaGFycyhfcmVtb3ZlTmFtZXNwYWNlcyhpZCkpO1xuXHRpZiAoX2lzVmFsaWQoaWQpKSB7XG5cdFx0cmV0dXJuIGlkO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IEVycm9yKGAke2lkfSAtIFN0YWJsZSBJZCBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24uYCk7XG5cdH1cbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx1QkFBdUIsR0FBSUMsU0FBaUYsSUFBSztJQUFBO0lBQ3RILE1BQU1DLE9BQU8sR0FBRyxDQUFDRCxTQUFTLENBQUNFLGNBQWMsQ0FBQ0MsT0FBTyxFQUFFLHVCQUFFSCxTQUFTLENBQUNJLE1BQU0sc0RBQWhCLGtCQUFrQkQsT0FBTyxFQUFFLENBQUM7SUFDakYsSUFBS0gsU0FBUyxDQUF1Q0ssZUFBZSxFQUFFO01BQ3JFSixPQUFPLENBQUNLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQztJQUNBLE9BQU9MLE9BQU8sQ0FBQ00sTUFBTSxDQUFFQyxFQUFFLElBQUtBLEVBQUUsQ0FBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQzdDLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUMseUJBQXlCLEdBQzlCVixTQUFnSSxJQUNwSDtJQUNaLE1BQU1XLEtBQUssR0FBR1gsU0FBUyxDQUFDWSxLQUFLO0lBQzdCLElBQUlELEtBQUssQ0FBQ0UsSUFBSSxFQUFFO01BQ2YsT0FBT0YsS0FBSyxDQUFDRSxJQUFJO0lBQ2xCLENBQUMsTUFBTSxJQUFJRixLQUFLLENBQUNHLEtBQUssSUFBSUgsS0FBSyxDQUFDSSxRQUFRLEtBQUssY0FBYyxFQUFFO01BQzVELE9BQU9KLEtBQUssQ0FBQ0csS0FBSyxDQUFDRSxHQUFHLENBQUVDLEdBQVEsSUFBS0EsR0FBRyxDQUFDQyxLQUEyQixDQUFDLENBQUNULElBQUks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
|
|
230
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2V0U3RhYmxlSWRQYXJ0RnJvbUlCTiIsImRhdGFGaWVsZCIsImlkUGFydHMiLCJTZW1hbnRpY09iamVjdCIsInZhbHVlT2YiLCJBY3Rpb24iLCJSZXF1aXJlc0NvbnRleHQiLCJwdXNoIiwiZmlsdGVyIiwiaWQiLCJqb2luIiwiX2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZSIsInZhbHVlIiwiVmFsdWUiLCJwYXRoIiwiQXBwbHkiLCJGdW5jdGlvbiIsIm1hcCIsImFwcCIsIiRQYXRoIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsInJlcGxhY2UiLCJfZ2V0U3RhYmxlSWRQYXJ0RnJvbVVybE9yUGF0aCIsInVybCIsIlVybCIsIl9pc1ZhbGlkIiwidGVzdCIsIl9yZW1vdmVOYW1lc3BhY2VzIiwiY3JlYXRlSWRGb3JBbm5vdGF0aW9uIiwiYW5ub3RhdGlvbiIsImlkUHJlcGFyYXRpb24iLCIkVHlwZSIsIklEIiwiVGFyZ2V0IiwiTGFiZWwiLCJnZXRTdGFibGVJZFBhcnRGcm9tRGF0YUZpZWxkIiwidG9TdHJpbmciLCJwcmVwYXJlSWQiLCJnZW5lcmF0ZSIsInN0YWJsZUlkUGFydHMiLCJpZHMiLCJlbGVtZW50IiwidGFyZ2V0T2JqZWN0IiwicmVzdWx0IiwiaWdub3JlRm9yQ29tcGF0aWJpbGl0eSIsInR5cGUiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsIkVycm9yIiwic2xpY2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlN0YWJsZUlkSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFdpdGhBY3Rpb24sXG5cdERhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aCxcblx0RGF0YUZpZWxkV2l0aFVybCxcblx0RmFjZXRUeXBlcyxcblx0RmllbGRHcm91cFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXplZElkQW5ub3RhdGlvbnNUeXBlID0gRmFjZXRUeXBlcyB8IEZpZWxkR3JvdXAgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgSUQgZnJvbSBhbiBJQk4uXG4gKlxuICogVGhlIElEIGNvbnRhaW5zIHRoZSB2YWx1ZSwgdGhlIHBvdGVudGlhbCBhY3Rpb24gYW5kIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgSUJOIGFubm90YXRpb25cbiAqIEByZXR1cm5zIFRoZSBJRFxuICovXG5jb25zdCBfZ2V0U3RhYmxlSWRQYXJ0RnJvbUlCTiA9IChkYXRhRmllbGQ6IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pID0+IHtcblx0Y29uc3QgaWRQYXJ0cyA9IFtkYXRhRmllbGQuU2VtYW50aWNPYmplY3QudmFsdWVPZigpLCBkYXRhRmllbGQuQWN0aW9uPy52YWx1ZU9mKCldO1xuXHRpZiAoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pLlJlcXVpcmVzQ29udGV4dCkge1xuXHRcdGlkUGFydHMucHVzaChcIlJlcXVpcmVzQ29udGV4dFwiKTtcblx0fVxuXHRyZXR1cm4gaWRQYXJ0cy5maWx0ZXIoKGlkKSA9PiBpZCkuam9pbihcIjo6XCIpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIElEIHBhcnQgcmVsYXRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIERhdGFGaWVsZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGRcbiAqIEByZXR1cm5zIFN0cmluZyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGQgdmFsdWVcbiAqL1xuY29uc3QgX2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZSA9IChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGQgfCBEYXRhRmllbGRXaXRoQWN0aW9uIHwgRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZFdpdGhVcmwgfCBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcbik6IHN0cmluZyA9PiB7XG5cdGNvbnN0IHZhbHVlID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRpZiAodmFsdWUucGF0aCkge1xuXHRcdHJldHVybiB2YWx1ZS5wYXRoIGFzIHN0cmluZztcblx0fSBlbHNlIGlmICh2YWx1ZS5BcHBseSAmJiB2YWx1ZS5GdW5jdGlvbiA9PT0gXCJvZGF0YS5jb25jYXRcIikge1xuXHRcdHJldHVybiB2YWx1ZS5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0cmV0dXJuIHJlcGxhY2VTcGVjaWFsQ2hhcnModmFsdWUucmVwbGFjZSgvIC9nLCBcIl9cIikpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIElEIHBhcnQgcmVsYXRlZCB0byB0aGUgdmFsdWUgb3IgdXJsIG9mIHRoZSBEYXRhRmllbGRXaXRoVXJsLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZFdpdGhVcmxcbiAqIEByZXR1cm5zIFN0cmluZyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGRXaXRoVXJsIHZhbHVlIG9yIHVybFxuICovXG5jb25zdCBfZ2V0U3RhYmxlSWRQYXJ0RnJvbVVybE9yUGF0aCA9IChkYXRhRmllbGQ6IERhdGFGaWVsZFdpdGhVcmwpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCB2YWx1ZSA9IGRhdGFGaWVsZC5WYWx1ZTtcblx0aWYgKHZhbHVlPy5wYXRoKSB7XG5cdFx0cmV0dXJuIHZhbHVlLnBhdGggYXMgc3RyaW5nO1xuXHR9IGVsc2UgaWYgKHZhbHVlPy5BcHBseSAmJiB2YWx1ZS5GdW5jdGlvbiA9PT0gXCJvZGF0YS5jb25jYXRcIikge1xuXHRcdHJldHVybiB2YWx1ZS5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0Y29uc3QgdXJsOiBhbnkgPSBkYXRhRmllbGQuVXJsO1xuXHRpZiAodXJsPy5wYXRoKSB7XG5cdFx0cmV0dXJuIHVybC5wYXRoO1xuXHR9IGVsc2UgaWYgKHVybD8uQXBwbHkgJiYgdXJsLkZ1bmN0aW9uID09PSBcIm9kYXRhLmNvbmNhdFwiKSB7XG5cdFx0cmV0dXJuIHVybC5BcHBseS5tYXAoKGFwcDogYW55KSA9PiBhcHAuJFBhdGggYXMgc3RyaW5nIHwgdW5kZWZpbmVkKS5qb2luKFwiOjpcIik7XG5cdH1cblx0cmV0dXJuIHJlcGxhY2VTcGVjaWFsQ2hhcnModmFsdWU/LnJlcGxhY2UoLyAvZywgXCJfXCIpKTtcbn07XG5cbi8qKlxuICogQ29weSBmb3IgdGhlIENvcmUuaXNWYWxpZCBmdW5jdGlvbiB0byBiZSBpbmRlcGVuZGVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgU3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyB2YWxpZCBvciBub3RcbiAqL1xuY29uc3QgX2lzVmFsaWQgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRyZXR1cm4gL14oW0EtWmEtel9dWy1BLVphLXowLTlfLjpdKikkLy50ZXN0KHZhbHVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgYW5ub3RhdGlvbiBuYW1lc3BhY2VzLlxuICpcbiAqIEBwYXJhbSBpZCBTdHJpbmcgdG8gbWFuaXB1bGF0ZVxuICogQHJldHVybnMgU3RyaW5nIHdpdGhvdXQgdGhlIGFubm90YXRpb24gbmFtZXNwYWNlc1xuICovXG5jb25zdCBfcmVtb3ZlTmFtZXNwYWNlcyA9IChpZDogc3RyaW5nKSA9PiB7XG5cdGlkID0gaWQucmVwbGFjZShcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlwiLCBcIlwiKTtcblx0aWQgPSBpZC5yZXBsYWNlKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5cIiwgXCJcIik7XG5cdHJldHVybiBpZDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBJRCBmcm9tIGFuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSBpZFByZXBhcmF0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgSUQgbmVlZHMgdG8gYmUgcHJlcGFyZWQgZm9yIGZpbmFsIHVzYWdlXG4gKiBAcmV0dXJucyBUaGUgSURcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUlkRm9yQW5ub3RhdGlvbiA9IChhbm5vdGF0aW9uOiBBdXRob3JpemVkSWRBbm5vdGF0aW9uc1R5cGUsIGlkUHJlcGFyYXRpb24gPSB0cnVlKSA9PiB7XG5cdGxldCBpZDtcblx0c3dpdGNoIChhbm5vdGF0aW9uLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5SZWZlcmVuY2VGYWNldDpcblx0XHRcdGlkID0gYW5ub3RhdGlvbi5JRCA/PyBhbm5vdGF0aW9uLlRhcmdldC52YWx1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuQ29sbGVjdGlvbkZhY2V0OlxuXHRcdFx0aWQgPSBhbm5vdGF0aW9uLklEID8/IFwidW5kZWZpbmVkXCI7IC8vIENvbGxlY3Rpb25GYWNldCB3aXRob3V0IElkIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IGRvZXNuJ3QgbmVjZXNzYXJ5IGZhaWwgcmlnaHQgbm93XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0aWQgPSBhbm5vdGF0aW9uLkxhYmVsO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlkID0gZ2V0U3RhYmxlSWRQYXJ0RnJvbURhdGFGaWVsZChhbm5vdGF0aW9uIGFzIERhdGFGaWVsZEFic3RyYWN0VHlwZXMpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWQgPSBpZD8udG9TdHJpbmcoKTtcblx0cmV0dXJuIGlkICYmIGlkUHJlcGFyYXRpb24gPyBwcmVwYXJlSWQoaWQpIDogaWQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHN0YWJsZSBJRCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiAqXG4gKiBQYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCBpbiB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBwcm92aWRlZCBhbmQgYXJlIHNlcGFyYXRlZCBieSAnOjonLlxuICogR2VuZXJhdGUoWydTdGFibGUnLCAnSWQnXSkgd291bGQgcmVzdWx0IGluICdTdGFibGU6OklkJyBhcyB0aGUgc3RhYmxlIElELlxuICogQ3VycmVudGx5IHN1cHBvcnRlZCBhbm5vdGF0aW9ucyBhcmUgRmFjZXRzLCBGaWVsZEdyb3VwIGFuZCBhbGwga2luZHMgb2YgRGF0YUZpZWxkLlxuICpcbiAqIEBwYXJhbSBzdGFibGVJZFBhcnRzIEFycmF5IG9mIHN0cmluZ3MsIHVuZGVmaW5lZCwgZGF0YU1vZGVsT2JqZWN0UGF0aCBvciBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgU3RhYmxlIElEIGNvbnN0cnVjdGVkIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlID0gKFxuXHRzdGFibGVJZFBhcnRzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQgfCBEYXRhTW9kZWxPYmplY3RQYXRoPEF1dGhvcml6ZWRJZEFubm90YXRpb25zVHlwZT4gfCBBdXRob3JpemVkSWRBbm5vdGF0aW9uc1R5cGU+XG4pOiBzdHJpbmcgPT4ge1xuXHRjb25zdCBpZHM6IChzdHJpbmcgfCB1bmRlZmluZWQpW10gPSBzdGFibGVJZFBhcnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIiB8fCAhZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdFx0fVxuXHRcdHJldHVybiBjcmVhdGVJZEZvckFubm90YXRpb24oXG5cdFx0XHQoZWxlbWVudCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEF1dGhvcml6ZWRJZEFubm90YXRpb25zVHlwZT4pLnRhcmdldE9iamVjdCB8fCAoZWxlbWVudCBhcyBBdXRob3JpemVkSWRBbm5vdGF0aW9uc1R5cGUpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHR9KTtcblx0Y29uc3QgcmVzdWx0ID0gaWRzLmZpbHRlcigoaWQpID0+IGlkKS5qb2luKFwiOjpcIik7XG5cdHJldHVybiBwcmVwYXJlSWQocmVzdWx0KTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBJRCBmcm9tIGEgRGF0YUZpZWxkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZFxuICogQHBhcmFtIGlnbm9yZUZvckNvbXBhdGliaWxpdHkgSWdub3JlIGEgcGFydCBvZiB0aGUgSUQgb24gdGhlIERhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aCB0byBiZSBhbGlnbmVkIHdpdGggcHJldmlvdXMgdmVyc2lvbnNcbiAqIEByZXR1cm5zIFRoZSBJRFxuICovXG5leHBvcnQgY29uc3QgZ2V0U3RhYmxlSWRQYXJ0RnJvbURhdGFGaWVsZCA9IChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGlnbm9yZUZvckNvbXBhdGliaWxpdHkgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG5cdGxldCBpZCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRGb3JBY3Rpb246OiR7ZGF0YUZpZWxkLkFjdGlvbn1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246OiR7X2dldFN0YWJsZUlkUGFydEZyb21JQk4oZGF0YUZpZWxkKX1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0aWQgPSBgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjo6JHtkYXRhRmllbGQuVGFyZ2V0LnZhbHVlfWA7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoQWN0aW9uOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVmFsdWUoZGF0YUZpZWxkKX06OiR7ZGF0YUZpZWxkLkFjdGlvbn1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGQ6OiR7X2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZShkYXRhRmllbGQpfWA7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVmFsdWUoZGF0YUZpZWxkKX06OiR7X2dldFN0YWJsZUlkUGFydEZyb21JQk4oZGF0YUZpZWxkKX1gO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6OiR7X2dldFN0YWJsZUlkUGFydEZyb21WYWx1ZShkYXRhRmllbGQpfWA7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC50eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIiAmJiAhaWdub3JlRm9yQ29tcGF0aWJpbGl0eSkge1xuXHRcdFx0XHRpZCA9IGAke2lkfTo6JHtkYXRhRmllbGQuVGFyZ2V0LnZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRpZCA9IGBEYXRhRmllbGRXaXRoVXJsOjoke19nZXRTdGFibGVJZFBhcnRGcm9tVXJsT3JQYXRoKGRhdGFGaWVsZCl9YDtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gaWQgPyBwcmVwYXJlSWQoaWQpIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIG9yIHJlcGxhY2VzIHdpdGggXCI6OlwiIHNvbWUgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogU3BlY2lhbCBjaGFyYWN0ZXJzIChALCAvLCAjKSBhcmUgcmVwbGFjZWQgYnkgJzo6JyBpZiB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdGFibGUgSUQgYW5kIHJlbW92ZWQgYWx0b2dldGhlciBpZiB0aGV5IGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC5cbiAqXG4gKiBAcGFyYW0gaWQgU3RyaW5nIHRvIG1hbmlwdWxhdGVcbiAqIEByZXR1cm5zIFN0cmluZyB3aXRob3V0IHRoZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VTcGVjaWFsQ2hhcnMgPSAoaWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdGlmIChpZC5pbmNsdWRlcyhcIiBcIikpIHtcblx0XHR0aHJvdyBFcnJvcihgJHtpZH0gLSBTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIElEIHBhcnRzLmApO1xuXHR9XG5cdGlkID0gaWRcblx0XHQucmVwbGFjZSgvXlxcL3xeQHxeI3xeXFwqLywgXCJcIikgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuXHRcdC5yZXBsYWNlKC9cXC8kfEAkfCMkfFxcKiQvLCBcIlwiKSAvLyByZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nXG5cdFx0LnJlcGxhY2UoL1xcL3xAfFxcKHxcXCl8I3xcXCovZywgXCI6OlwiKTsgLy8gcmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0aCA6OlxuXG5cdC8vIFJlcGxhY2UgZG91YmxlIG9jY3VycmVuY2VzIG9mIHRoZSBzZXBhcmF0b3Igd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3Jcblx0d2hpbGUgKGlkLmluY2x1ZGVzKFwiOjo6OlwiKSkge1xuXHRcdGlkID0gaWQucmVwbGFjZShcIjo6OjpcIiwgXCI6OlwiKTtcblx0fVxuXG5cdC8vIElmIHRoZXJlIGlzIGEgOjogYXQgdGhlIGVuZCBvZiB0aGUgSUQgcmVtb3ZlIGl0XG5cdGlmIChpZC5zbGljZSgtMikgPT0gXCI6OlwiKSB7XG5cdFx0aWQgPSBpZC5zbGljZSgwLCAtMik7XG5cdH1cblxuXHRyZXR1cm4gaWQ7XG59O1xuXG4vKipcbiAqIFByZXBhcmVzIHRoZSBJRC5cbiAqXG4gKiBSZW1vdmVzIG5hbWVzcGFjZXMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGlzIElELlxuICpcbiAqIEBwYXJhbSBpZCBUaGUgSURcbiAqIEByZXR1cm5zIFRoZSBJRCBvciB0aHJvd3MgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVJZCA9IGZ1bmN0aW9uIChpZDogc3RyaW5nKSB7XG5cdGlkID0gcmVwbGFjZVNwZWNpYWxDaGFycyhfcmVtb3ZlTmFtZXNwYWNlcyhpZCkpO1xuXHRpZiAoX2lzVmFsaWQoaWQpKSB7XG5cdFx0cmV0dXJuIGlkO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IEVycm9yKGAke2lkfSAtIFN0YWJsZSBJZCBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24uYCk7XG5cdH1cbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx1QkFBdUIsR0FBSUMsU0FBaUYsSUFBSztJQUFBO0lBQ3RILE1BQU1DLE9BQU8sR0FBRyxDQUFDRCxTQUFTLENBQUNFLGNBQWMsQ0FBQ0MsT0FBTyxFQUFFLHVCQUFFSCxTQUFTLENBQUNJLE1BQU0sc0RBQWhCLGtCQUFrQkQsT0FBTyxFQUFFLENBQUM7SUFDakYsSUFBS0gsU0FBUyxDQUF1Q0ssZUFBZSxFQUFFO01BQ3JFSixPQUFPLENBQUNLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQztJQUNBLE9BQU9MLE9BQU8sQ0FBQ00sTUFBTSxDQUFFQyxFQUFFLElBQUtBLEVBQUUsQ0FBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQzdDLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUMseUJBQXlCLEdBQzlCVixTQUFnSSxJQUNwSDtJQUNaLE1BQU1XLEtBQUssR0FBR1gsU0FBUyxDQUFDWSxLQUFLO0lBQzdCLElBQUlELEtBQUssQ0FBQ0UsSUFBSSxFQUFFO01BQ2YsT0FBT0YsS0FBSyxDQUFDRSxJQUFJO0lBQ2xCLENBQUMsTUFBTSxJQUFJRixLQUFLLENBQUNHLEtBQUss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
|
|
@@ -129,12 +129,17 @@ export const createIdForAnnotation = (annotation: AuthorizedIdAnnotationsType, i
|
|
|
129
129
|
* @param stableIdParts Array of strings, undefined, dataModelObjectPath or annotations
|
|
130
130
|
* @returns Stable ID constructed from the provided parameters
|
|
131
131
|
*/
|
|
132
|
-
export const generate = (
|
|
132
|
+
export const generate = (
|
|
133
|
+
stableIdParts: Array<string | undefined | DataModelObjectPath<AuthorizedIdAnnotationsType> | AuthorizedIdAnnotationsType>
|
|
134
|
+
): string => {
|
|
133
135
|
const ids: (string | undefined)[] = stableIdParts.map((element) => {
|
|
134
136
|
if (typeof element === "string" || !element) {
|
|
135
137
|
return element;
|
|
136
138
|
}
|
|
137
|
-
return createIdForAnnotation(
|
|
139
|
+
return createIdForAnnotation(
|
|
140
|
+
(element as DataModelObjectPath<AuthorizedIdAnnotationsType>).targetObject || (element as AuthorizedIdAnnotationsType),
|
|
141
|
+
false
|
|
142
|
+
);
|
|
138
143
|
});
|
|
139
144
|
const result = ids.filter((id) => id).join("::");
|
|
140
145
|
return prepareId(result);
|
|
@@ -62,7 +62,20 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "../templating/UIFor
|
|
|
62
62
|
internalModel.setProperty("/ignoredContextPaths", ignoredContextPaths);
|
|
63
63
|
},
|
|
64
64
|
/**
|
|
65
|
-
* This function
|
|
65
|
+
* This function checks if there are recommendation roles for context entity type.
|
|
66
|
+
*
|
|
67
|
+
* @param contextInfo Contains context and contextIdentifier
|
|
68
|
+
* @param recommendationsRegistry Registry which holds the recommendation roles for all entity types
|
|
69
|
+
* @returns Boolean value based on whether recommendation role exists for entityType annotation or not
|
|
70
|
+
*/
|
|
71
|
+
checkIfRecommendationRoleExistsForContext: (contextInfo, recommendationsRegistry) => {
|
|
72
|
+
var _contextInfo$context$;
|
|
73
|
+
const dataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(contextInfo === null || contextInfo === void 0 ? void 0 : contextInfo.context.getPath(), contextInfo === null || contextInfo === void 0 ? void 0 : (_contextInfo$context$ = contextInfo.context.getModel()) === null || _contextInfo$context$ === void 0 ? void 0 : _contextInfo$context$.getMetaModel());
|
|
74
|
+
const entityType = dataModelObject === null || dataModelObject === void 0 ? void 0 : dataModelObject.targetEntityType.name;
|
|
75
|
+
return Object.keys(recommendationsRegistry.roles).includes(entityType);
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* This function updates recommendation data with keys of all contexts. This must be shown in the Accept Recommendations Dialog based on the use case.
|
|
66
79
|
*
|
|
67
80
|
* @param recommendationsData
|
|
68
81
|
* @param recommendationContexts
|
|
@@ -180,8 +193,8 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "../templating/UIFor
|
|
|
180
193
|
var _context$getModel3;
|
|
181
194
|
const displayMode = standardRecommendationHelper.getDisplayModeForTargetPath(key, context === null || context === void 0 ? void 0 : (_context$getModel3 = context.getModel()) === null || _context$getModel3 === void 0 ? void 0 : _context$getModel3.getMetaModel());
|
|
182
195
|
if (displayMode && displayMode !== "Value") {
|
|
183
|
-
var _property$targetObjec, _property$targetObjec2, _property$targetObjec3, _property$targetObjec4;
|
|
184
|
-
const text = property === null || property === void 0 ? void 0 : (_property$targetObjec = property.targetObject) === null || _property$targetObjec === void 0 ? void 0 : (_property$targetObjec2 = _property$targetObjec.annotations) === null || _property$targetObjec2 === void 0 ? void 0 : (_property$targetObjec3 = _property$targetObjec2.Common) === null || _property$targetObjec3 === void 0 ? void 0 : (_property$targetObjec4 = _property$
|
|
196
|
+
var _property$targetObjec, _property$targetObjec2, _property$targetObjec3, _property$targetObjec4, _property$targetObjec5, _property$targetObjec6, _property$targetObjec7;
|
|
197
|
+
const text = isPathAnnotationExpression(property === null || property === void 0 ? void 0 : (_property$targetObjec = property.targetObject) === null || _property$targetObjec === void 0 ? void 0 : (_property$targetObjec2 = _property$targetObjec.annotations) === null || _property$targetObjec2 === void 0 ? void 0 : (_property$targetObjec3 = _property$targetObjec2.Common) === null || _property$targetObjec3 === void 0 ? void 0 : _property$targetObjec3.Text) && (property === null || property === void 0 ? void 0 : (_property$targetObjec4 = property.targetObject) === null || _property$targetObjec4 === void 0 ? void 0 : (_property$targetObjec5 = _property$targetObjec4.annotations) === null || _property$targetObjec5 === void 0 ? void 0 : (_property$targetObjec6 = _property$targetObjec5.Common) === null || _property$targetObjec6 === void 0 ? void 0 : (_property$targetObjec7 = _property$targetObjec6.Text) === null || _property$targetObjec7 === void 0 ? void 0 : _property$targetObjec7.path);
|
|
185
198
|
return text ? !(context !== null && context !== void 0 && context.getProperty(text)) : true;
|
|
186
199
|
}
|
|
187
200
|
return true;
|
|
@@ -208,10 +221,15 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "../templating/UIFor
|
|
|
208
221
|
});
|
|
209
222
|
},
|
|
210
223
|
resetRecommendations: function (internalModel) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
224
|
+
// we have version key maintained only for standard solution of recommendations
|
|
225
|
+
//and only if this is standard implementation, we should reset recommendations
|
|
226
|
+
const recommendationsDataInModel = internalModel.getProperty("/recommendationsData");
|
|
227
|
+
if (recommendationsDataInModel && recommendationsDataInModel.hasOwnProperty("version")) {
|
|
228
|
+
internalModel.setProperty("/recommendationsData", {});
|
|
229
|
+
internalModel === null || internalModel === void 0 ? void 0 : internalModel.setProperty("/fetchedContextPaths", []);
|
|
230
|
+
internalModel === null || internalModel === void 0 ? void 0 : internalModel.setProperty("/ignoredContextPaths", []);
|
|
231
|
+
internalModel.refresh(true);
|
|
232
|
+
}
|
|
215
233
|
},
|
|
216
234
|
getCurrentRootContext: function () {
|
|
217
235
|
return rootContext;
|
|
@@ -288,53 +306,9 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "../templating/UIFor
|
|
|
288
306
|
}
|
|
289
307
|
}
|
|
290
308
|
return value ?? context.getProperty(key);
|
|
291
|
-
},
|
|
292
|
-
/**
|
|
293
|
-
* This function will create the prefix string having entity Name and semantickeys, which will be used to show in Accept recommendations dialog.
|
|
294
|
-
*
|
|
295
|
-
* @param contextPathFromKey ContextPath of the field.
|
|
296
|
-
* @param matchingContext The context from model data matching the given context.
|
|
297
|
-
* @param recommData
|
|
298
|
-
* @param recommContexts
|
|
299
|
-
* @returns The prefix generated string.
|
|
300
|
-
*/
|
|
301
|
-
getPrefix(contextPathFromKey, matchingContext, recommData, recommContexts) {
|
|
302
|
-
var _matchingContext$cont, _matchingContext$cont2;
|
|
303
|
-
const metaModel = (_matchingContext$cont = matchingContext.context) === null || _matchingContext$cont === void 0 ? void 0 : (_matchingContext$cont2 = _matchingContext$cont.getModel()) === null || _matchingContext$cont2 === void 0 ? void 0 : _matchingContext$cont2.getMetaModel();
|
|
304
|
-
const context = matchingContext.context;
|
|
305
|
-
let prefix = "";
|
|
306
|
-
const metaPath = metaModel === null || metaModel === void 0 ? void 0 : metaModel.getMetaPath(contextPathFromKey);
|
|
307
|
-
const pathArray = metaPath.split("/");
|
|
308
|
-
pathArray.pop();
|
|
309
|
-
const parentMetaPath = pathArray.join("/");
|
|
310
|
-
const keysData = recommData["keys"];
|
|
311
|
-
const values = [];
|
|
312
|
-
if (keysData) {
|
|
313
|
-
const keys = keysData[parentMetaPath];
|
|
314
|
-
if (keys) {
|
|
315
|
-
var _dataModelObject$targ5, _dataModelObject$targ6, _dataModelObject$targ7, _dataModelObject$targ8;
|
|
316
|
-
const dataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(parentMetaPath, context === null || context === void 0 ? void 0 : context.getModel().getMetaModel());
|
|
317
|
-
const typeName = dataModelObject === null || dataModelObject === void 0 ? void 0 : (_dataModelObject$targ5 = dataModelObject.targetEntityType) === null || _dataModelObject$targ5 === void 0 ? void 0 : (_dataModelObject$targ6 = _dataModelObject$targ5.annotations) === null || _dataModelObject$targ6 === void 0 ? void 0 : (_dataModelObject$targ7 = _dataModelObject$targ6.UI) === null || _dataModelObject$targ7 === void 0 ? void 0 : (_dataModelObject$targ8 = _dataModelObject$targ7.HeaderInfo) === null || _dataModelObject$targ8 === void 0 ? void 0 : _dataModelObject$targ8.TypeName;
|
|
318
|
-
const parentContext = recommContexts.filter(contextInfo => {
|
|
319
|
-
var _matchingContext$cont3, _matchingContext$cont4, _matchingContext$cont5;
|
|
320
|
-
const parentContextPath = matchingContext === null || matchingContext === void 0 ? void 0 : (_matchingContext$cont3 = matchingContext.context) === null || _matchingContext$cont3 === void 0 ? void 0 : (_matchingContext$cont4 = _matchingContext$cont3.getBinding()) === null || _matchingContext$cont4 === void 0 ? void 0 : (_matchingContext$cont5 = _matchingContext$cont4.getContext()) === null || _matchingContext$cont5 === void 0 ? void 0 : _matchingContext$cont5.getPath();
|
|
321
|
-
return parentContextPath === contextInfo.context.getPath();
|
|
322
|
-
});
|
|
323
|
-
if (parentContext.length) {
|
|
324
|
-
const contextData = parentContext[0].context.getObject();
|
|
325
|
-
// calculate keys from parent context data based on semantic keys
|
|
326
|
-
keys.forEach(key => {
|
|
327
|
-
const value = contextData[key];
|
|
328
|
-
values.push(`${value}`);
|
|
329
|
-
});
|
|
330
|
-
prefix = `${typeName}(${values})`;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
return prefix;
|
|
335
309
|
}
|
|
336
310
|
};
|
|
337
311
|
_exports.standardRecommendationHelper = standardRecommendationHelper;
|
|
338
312
|
return _exports;
|
|
339
313
|
}, false);
|
|
340
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb290Q29udGV4dCIsInN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIiLCJzdG9yZVJlY29tbWVuZGF0aW9ucyIsInJlY29tbWVuZGF0aW9ucyIsImludGVybmFsTW9kZWwiLCJyZWNvbW1lbmRhdGlvbnNDb250ZXh0cyIsInJlY29tbWVuZGF0aW9uc0RhdGEiLCJnZXRQcm9wZXJ0eSIsImNsZWFyUmVjb21tZW5kYXRpb25zRGF0YUZyb21Nb2RlbEZvckdpdmVuQ29udGV4dHMiLCJlbmhhbmNlUmVjb21tZW5kYXRpb25Nb2RlbCIsInVwZGF0ZUZldGNoZWRDb250ZXh0UGF0aHMiLCJ1cGRhdGVDb250ZXh0c0tleXNJbk1vZGVsIiwic2V0UHJvcGVydHkiLCJyZWZyZXNoIiwiaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyIsImNvbnRleHRzIiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsInJlY29tbWVuZGF0aW9uRGF0YSIsImlnbm9yZWRDb250ZXh0UGF0aHMiLCJmb3JFYWNoIiwiY29udGV4dCIsImlnbm9yZWRDb250ZXh0UGF0aCIsImdldFBhdGgiLCJwdXNoIiwiZmlsdGVyIiwiY29udGV4dEluZm8iLCJzdGFydHNXaXRoIiwiT2JqZWN0Iiwia2V5cyIsImRhdGEiLCJjbGVhcklnbm9yZWRDb250ZXh0cyIsImNvbnRleHRQYXRoIiwiaGFzT3duUHJvcGVydHkiLCJrZXlzRGF0YSIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0Iiwic2VtYW50aWNLZXlzRm9yR2l2ZW5NZXRhUGF0aCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwiaSIsInZhbHVlIiwidGFyZ2V0IiwiaWR4IiwibGFzdEluZGV4T2YiLCJmaW5kIiwic3Vic3RyaW5nIiwicmVjb21tZW5kYXRpb24iLCJBSVJlY29tbWVuZGVkRmllbGRQYXRoIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJpc1BsYWNlaG9sZGVyVmFsdWVGb3VuZCIsIl9BSUFsdHZSZWNtZGRGbGRWYWxzIiwiYWx0ZXJuYXRpdmVSZWNvbW1lbmRhdGlvbiIsInJlY29tbWVuZGF0aW9uVmFsdWUiLCJBSVJlY29tbWVuZGVkRmllbGRWYWx1ZSIsInByb2JhYmlsaXR5IiwiQUlSZWNvbW1lbmRlZEZpZWxkU2NvcmVWYWx1ZSIsInVuZGVmaW5lZCIsInRleHQiLCJBSVJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbiIsImFkZGl0aW9uYWxWYWx1ZXMiLCJnZXRTdGFuZGFyZFJlY29tbWVuZGF0aW9ucyIsImJpbmRpbmdDb250ZXh0IiwicHJvcGVydHlQYXRoIiwiZnVsbFBhdGgiLCJnZXREaXNwbGF5TW9kZUZvclRhcmdldFBhdGgiLCJ0YXJnZXRQYXRoIiwiaW52b2x2ZWREYXRhTW9kZWxPYmplY3QiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHNGb3JUYXJnZXRQYXRoIiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsImlzUmVjb21tZW5kYXRpb25GaWVsZE51bGwiLCJrZXkiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsIlRleHQiLCJwYXRoIiwiZmV0Y2hlZENvbnRleHRQYXRocyIsImluY2x1ZGVzIiwiZ2V0Q29udGV4dHNXaXRoTm9SZWNvbW1lbmRhdGlvbnMiLCJjb250ZXh0c0luZm8iLCJyZXNldFJlY29tbWVuZGF0aW9ucyIsImdldEN1cnJlbnRSb290Q29udGV4dCIsInNldEN1cnJlbnRSb290Q29udGV4dCIsImFkZENvbnRleHRJZGVudGlmaWVyVGV4dCIsInBhcmFtcyIsInZpZXdQYXRoIiwiaW5kZXgiLCJpZGVudGlmaWVyVmFsdWVzIiwiY29udGV4dElkZW50aWZpZXIiLCJpZFBhdGgiLCJjb250ZXh0VGV4dCIsImdldFRleHRGb3JLZXkiLCJjb250ZXh0SWRlbnRpZmllclRleHQiLCJnZXRFbnRpdHlOYW1lIiwiZGF0YU1vZGVsT2JqZWN0IiwidHlwZU5hbWUiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsImNvbXBpbGVFeHByZXNzaW9uIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwia2V5UGF0aCIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uIiwiJHRhcmdldCIsImV2YWx1YXRlRXhwcmVzc2lvbiIsImdldE9iamVjdCIsImdldFByZWZpeCIsImNvbnRleHRQYXRoRnJvbUtleSIsIm1hdGNoaW5nQ29udGV4dCIsInJlY29tbURhdGEiLCJyZWNvbW1Db250ZXh0cyIsInByZWZpeCIsInBhdGhBcnJheSIsInNwbGl0IiwicG9wIiwicGFyZW50TWV0YVBhdGgiLCJqb2luIiwidmFsdWVzIiwicGFyZW50Q29udGV4dCIsInBhcmVudENvbnRleHRQYXRoIiwiZ2V0QmluZGluZyIsImdldENvbnRleHQiLCJsZW5ndGgiLCJjb250ZXh0RGF0YSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBBY2NlcHRBbGxQYXJhbXMgfSBmcm9tIFwiLi4vY29udHJvbGxlcmV4dGVuc2lvbnMvUmVjb21tZW5kYXRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCIuL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIH0gZnJvbSBcIi4vQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGV2YWx1YXRlRXhwcmVzc2lvbiB9IGZyb20gXCIuL0JpbmRpbmdUb29sa2l0RXZhbHVhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFJlY29tbWVuZGF0aW9uVmFsdWVUeXBlIH0gZnJvbSBcIi4vUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24gfSBmcm9tIFwiLi9UeXBlR3VhcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZSA9IHtcblx0QUlSZWNvbW1lbmRlZEZpZWxkUGF0aD86IHN0cmluZztcblx0QUlSZWNvbW1lbmRlZEZpZWxkVmFsdWU/OiBzdHJpbmc7XG5cdEFJUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRfQUlBbHR2UmVjbWRkRmxkVmFscz86IEFsdGVybmF0aXZlUmVjb21tZW5kYXRpb25SZXNwb25zZVR5cGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGF0aW9uQ29udGV4dHNJbmZvID0ge1xuXHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblx0Y29udGV4dElkZW50aWZpZXI/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEFsdGVybmF0aXZlUmVjb21tZW5kYXRpb25SZXNwb25zZVR5cGUgPSB7XG5cdEFJUmVjb21tZW5kZWRGaWVsZFZhbHVlOiBzdHJpbmc7XG5cdEFJUmVjb21tZW5kZWRGaWVsZFNjb3JlVmFsdWU/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUgPSB7XG5cdHZhbHVlPzogc3RyaW5nO1xuXHR0ZXh0Pzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsVmFsdWVzPzogUmVjb21tZW5kYXRpb25WYWx1ZVR5cGVbXTtcbn07XG5cbnR5cGUgU3RhbmRhcmRCYXNlUmVjb21tZW5kYXRpb24gPSB7XG5cdHZlcnNpb24/OiBudW1iZXI7XG5cdGtleXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG59O1xuXG5leHBvcnQgdHlwZSBCYXNlRHluYW1pY1JlY29tbWVuZGF0aW9uID0gUmVjb3JkPHN0cmluZywgU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlPjtcblxuZXhwb3J0IHR5cGUgUmVjb21tZW5kYXRpb25JbmZvID0gU3RhbmRhcmRCYXNlUmVjb21tZW5kYXRpb24gJiBCYXNlRHluYW1pY1JlY29tbWVuZGF0aW9uO1xuXG5sZXQgcm9vdENvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xuXG5leHBvcnQgY29uc3Qgc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciA9IHtcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIGFuZCBzZXQgdGhlIHJlY29tbWVuZGF0aW9ucyBhY2NvcmRpbmcgdG8gZGF0YSByZWNlaXZlZCBmcm9tIGJhY2tlbmQuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnMgVGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSBiYWNrZW5kXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBpbnRlcm5hbCBqc29uIG1vZGVsXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNDb250ZXh0cyBUaGUgY29udGV4dHMgZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9ucyBhcmUgYmVpbmcgZmV0Y2hlZFxuXHQgKi9cblx0c3RvcmVSZWNvbW1lbmRhdGlvbnM6IChcblx0XHRyZWNvbW1lbmRhdGlvbnM6IFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZVtdLFxuXHRcdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZWNvbW1lbmRhdGlvbnNDb250ZXh0czogT0RhdGFWNENvbnRleHRbXVxuXHQpOiB2b2lkID0+IHtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbnNEYXRhID0gKGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiKSBhcyBSZWNvbW1lbmRhdGlvbkluZm8pIHx8IHt9O1xuXHRcdHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuY2xlYXJSZWNvbW1lbmRhdGlvbnNEYXRhRnJvbU1vZGVsRm9yR2l2ZW5Db250ZXh0cyhyZWNvbW1lbmRhdGlvbnNEYXRhLCByZWNvbW1lbmRhdGlvbnNDb250ZXh0cyk7XG5cdFx0c3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci5lbmhhbmNlUmVjb21tZW5kYXRpb25Nb2RlbChyZWNvbW1lbmRhdGlvbnMsIHJlY29tbWVuZGF0aW9uc0RhdGEpO1xuXHRcdHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIudXBkYXRlRmV0Y2hlZENvbnRleHRQYXRocyhyZWNvbW1lbmRhdGlvbnNDb250ZXh0cywgaW50ZXJuYWxNb2RlbCk7XG5cdFx0c3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci51cGRhdGVDb250ZXh0c0tleXNJbk1vZGVsKHJlY29tbWVuZGF0aW9uc0RhdGEsIHJlY29tbWVuZGF0aW9uc0NvbnRleHRzKTtcblx0XHQvL1NldHRpbmcgdGhlIHZlcnNpb24gdG8gMi4wIHRvIHNlZ3JlZ2F0ZSB0aGUgcHJvY2Vzc2luZ1xuXHRcdHJlY29tbWVuZGF0aW9uc0RhdGFbXCJ2ZXJzaW9uXCJdID0gMi4wO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCByZWNvbW1lbmRhdGlvbnNEYXRhKTtcblx0XHRpbnRlcm5hbE1vZGVsLnJlZnJlc2godHJ1ZSk7XG5cdH0sXG5cblx0aWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0czogKGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkID0+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25Db250ZXh0czogUmVjb21tZW5kYXRpb25Db250ZXh0c0luZm9bXSA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25Db250ZXh0c1wiKSB8fCBbXTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkRhdGEgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIik7XG5cdFx0Y29uc3QgaWdub3JlZENvbnRleHRQYXRocyA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvaWdub3JlZENvbnRleHRQYXRoc1wiKSB8fCBbXTtcblx0XHRjb250ZXh0cy5mb3JFYWNoKChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgaWdub3JlZENvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRpZ25vcmVkQ29udGV4dFBhdGhzLnB1c2goaWdub3JlZENvbnRleHRQYXRoKTtcblx0XHRcdC8vIGRlbGV0ZSByZWNvbW1lbmRhdGlvbiBkYXRhIGZvciBhIGNvbnRleHQgb3IgaXRzIGNoaWxkcmVuIGZpbHRlciByZWNvbW1lbmRhdGlvbkNvbnRleHRzIHdoaWNoIGRvIG5vdCBtYXRjaFxuXHRcdFx0Ly8gYSBwYXRoLiBUaGlzIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcmVjb21tZW5kYXRpb25zIGNvbnRleHRzIHRvIGJlIGtlcHQgaW4gbW9kZWxcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29udGV4dHMgPSByZWNvbW1lbmRhdGlvbkNvbnRleHRzLmZpbHRlcigoY29udGV4dEluZm86IFJlY29tbWVuZGF0aW9uQ29udGV4dHNJbmZvKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhY29udGV4dEluZm8/LmNvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoaWdub3JlZENvbnRleHRQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25EYXRhKS5mb3JFYWNoKChkYXRhKSA9PiB7XG5cdFx0XHRcdGlmIChkYXRhLnN0YXJ0c1dpdGgoaWdub3JlZENvbnRleHRQYXRoKSkge1xuXHRcdFx0XHRcdGRlbGV0ZSByZWNvbW1lbmRhdGlvbkRhdGFbZGF0YV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCByZWNvbW1lbmRhdGlvbkRhdGEpO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25Db250ZXh0c1wiLCByZWNvbW1lbmRhdGlvbkNvbnRleHRzKTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIiwgaWdub3JlZENvbnRleHRQYXRocyk7XG5cdH0sXG5cblx0Y2xlYXJJZ25vcmVkQ29udGV4dHM6IChpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRsZXQgaWdub3JlZENvbnRleHRQYXRocyA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvaWdub3JlZENvbnRleHRQYXRoc1wiKSB8fCBbXTtcblx0XHRpZ25vcmVkQ29udGV4dFBhdGhzID0gaWdub3JlZENvbnRleHRQYXRocy5maWx0ZXIoKGlnbm9yZWRDb250ZXh0UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIWlnbm9yZWRDb250ZXh0UGF0aC5zdGFydHNXaXRoKGNvbnRleHRQYXRoKTtcblx0XHR9KTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIiwgaWdub3JlZENvbnRleHRQYXRocyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgcmVjb21tZW5kYXRpb24gZGF0YSB0byBoYXZlIGtleXMgb2YgYWxsIGNvbnRleHRzLiBUaGlzIGlzIGZ1cnRoZXIgbmVlZGVkIHRvIGJlIHNob3duIGluIEFjY2VwdCBSZWNvbW1lbmRhdGlvbnMgRGlhbG9nIGJhc2VkIG9uIHVzZWNhc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNEYXRhXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkNvbnRleHRzXG5cdCAqL1xuXHR1cGRhdGVDb250ZXh0c0tleXNJbk1vZGVsOiAocmVjb21tZW5kYXRpb25zRGF0YTogUmVjb21tZW5kYXRpb25JbmZvLCByZWNvbW1lbmRhdGlvbkNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogdm9pZCA9PiB7XG5cdFx0aWYgKCFyZWNvbW1lbmRhdGlvbnNEYXRhLmhhc093blByb3BlcnR5KFwia2V5c1wiKSkge1xuXHRcdFx0cmVjb21tZW5kYXRpb25zRGF0YVtcImtleXNcIl0gPSB7fTtcblx0XHR9XG5cdFx0Y29uc3Qga2V5c0RhdGEgPSByZWNvbW1lbmRhdGlvbnNEYXRhW1wia2V5c1wiXTtcblx0XHRyZWNvbW1lbmRhdGlvbkNvbnRleHRzLmZvckVhY2goKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dD8uZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGRhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG1ldGFQYXRoKSk7XG5cdFx0XHRjb25zdCBzZW1hbnRpY0tleXNGb3JHaXZlbk1ldGFQYXRoID0gZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleTtcblx0XHRcdGlmIChzZW1hbnRpY0tleXNGb3JHaXZlbk1ldGFQYXRoKSB7XG5cdFx0XHRcdGlmIChrZXlzRGF0YSAmJiAha2V5c0RhdGEuaGFzT3duUHJvcGVydHkobWV0YVBhdGgpICYmIHNlbWFudGljS2V5c0ZvckdpdmVuTWV0YVBhdGgpIHtcblx0XHRcdFx0XHRrZXlzRGF0YVttZXRhUGF0aF0gPSBzZW1hbnRpY0tleXNGb3JHaXZlbk1ldGFQYXRoLm1hcCgoaSkgPT4gaS52YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIG9sZCByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25zRGF0YSBUaGUgcmVjb21tZW5kYXRpb24gZGF0YSB3aGljaCBpcyBzdG9yZWRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uc0NvbnRleHRzIFRoZSBjb250ZXh0cyBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb25zIGFyZSBiZWluZyBmZXRjaGVkXG5cdCAqL1xuXHRjbGVhclJlY29tbWVuZGF0aW9uc0RhdGFGcm9tTW9kZWxGb3JHaXZlbkNvbnRleHRzOiAoXG5cdFx0cmVjb21tZW5kYXRpb25zRGF0YTogUmVjb21tZW5kYXRpb25JbmZvLFxuXHRcdHJlY29tbWVuZGF0aW9uc0NvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXVxuXHQpOiB2b2lkID0+IHtcblx0XHRpZiAocmVjb21tZW5kYXRpb25zQ29udGV4dHMpIHtcblx0XHRcdE9iamVjdC5rZXlzKHJlY29tbWVuZGF0aW9uc0RhdGEpLmZvckVhY2goKHRhcmdldCkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0YXJnZXQubGFzdEluZGV4T2YoXCIpXCIpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25zQ29udGV4dHMuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0UGF0aCgpID09PSB0YXJnZXQuc3Vic3RyaW5nKDAsIGlkeCArIDEpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGRlbGV0ZSByZWNvbW1lbmRhdGlvbnNEYXRhW3RhcmdldF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIGVuaGFuY2UgdGhlIHJlY29tbWVuZGF0aW9ucyBhY2NvcmRpbmcgdG8gZGF0YSByZWNlaXZlZCBmcm9tIGJhY2tlbmQuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnMgVGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSBiYWNrZW5kXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNEYXRhIFRoZSBleGlzdGluZyByZWNvbW1lbmRhdGlvbiBNb2RlbFxuXHQgKi9cblx0ZW5oYW5jZVJlY29tbWVuZGF0aW9uTW9kZWw6IChcblx0XHRyZWNvbW1lbmRhdGlvbnM6IEFycmF5PFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZT4sXG5cdFx0cmVjb21tZW5kYXRpb25zRGF0YTogUmVjb3JkPHN0cmluZywgb2JqZWN0PlxuXHQpOiB2b2lkID0+IHtcblx0XHRyZWNvbW1lbmRhdGlvbnM/LmZvckVhY2goKHJlY29tbWVuZGF0aW9uOiBTdGFuZGFyZFJlY29tbWVuZGF0aW9uUmVzcG9uc2UpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IHJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZFBhdGg7XG5cdFx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRcdC8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHJlY29tbWVuZGF0aW9ucyBzZW50IGZyb20gYmFja2VuZFxuXHRcdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblZhbHVlczogUmVjb21tZW5kYXRpb25WYWx1ZVR5cGVbXSA9IFtdO1xuXHRcdFx0XHRsZXQgaXNQbGFjZWhvbGRlclZhbHVlRm91bmQgPSBmYWxzZTtcblxuXHRcdFx0XHQvLyBzZXQgdGhlIG90aGVyIGFsdGVybmF0aXZlcyBhcyByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0cmVjb21tZW5kYXRpb24uX0FJQWx0dlJlY21kZEZsZFZhbHM/LmZvckVhY2goKGFsdGVybmF0aXZlUmVjb21tZW5kYXRpb246IEFsdGVybmF0aXZlUmVjb21tZW5kYXRpb25SZXNwb25zZVR5cGUpID0+IHtcblx0XHRcdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblZhbHVlOiBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZSA9IHtcblx0XHRcdFx0XHRcdHZhbHVlOiBhbHRlcm5hdGl2ZVJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZFZhbHVlLFxuXHRcdFx0XHRcdFx0cHJvYmFiaWxpdHk6IGFsdGVybmF0aXZlUmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkU2NvcmVWYWx1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZFZhbHVlID09PSBhbHRlcm5hdGl2ZVJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRpc1BsYWNlaG9sZGVyVmFsdWVGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXMucHVzaChyZWNvbW1lbmRhdGlvblZhbHVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uc0RhdGFbdGFyZ2V0XSA9IHtcblx0XHRcdFx0XHR2YWx1ZTogaXNQbGFjZWhvbGRlclZhbHVlRm91bmQgPyByZWNvbW1lbmRhdGlvbi5BSVJlY29tbWVuZGVkRmllbGRWYWx1ZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR0ZXh0OiBpc1BsYWNlaG9sZGVyVmFsdWVGb3VuZCA/IHJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXM6IHJlY29tbWVuZGF0aW9uVmFsdWVzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWNvbW1lbmRhdGlvbnMgZnJvbSBzdGFuZGFyZCByZWNvbW1lbmRhdGlvbnMgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nIENvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aCBvZiB0aGUgZmllbGRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uRGF0YSBPYmplY3QgY29udGFpbmluZyByZWNvbW1lbmRhdGlvbnNcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gZGF0YSBmb3IgdGhlIGZpZWxkXG5cdCAqL1xuXHRnZXRTdGFuZGFyZFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKFxuXHRcdGJpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdHJlY29tbWVuZGF0aW9uRGF0YTogUmVjb21tZW5kYXRpb25JbmZvXG5cdCk6IFN0YW5kYXJkUmVjb21tZW5kYXRpb25EYXRhVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGJpbmRpbmdDb250ZXh0ICYmIHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHByb3BlcnR5UGF0aDtcblx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbkRhdGFbZnVsbFBhdGhdIHx8IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBGZXRjaGVzIHRoZSBkaXNwbGF5IG1vZGUgZm9yIGEgZ2l2ZW4gdGFyZ2V0IHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIERpc3BsYXkgbW9kZSBmb3IgdGFyZ2V0IHBhdGhcblx0ICovXG5cdGdldERpc3BsYXlNb2RlRm9yVGFyZ2V0UGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcsIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGludm9sdmVkRGF0YU1vZGVsT2JqZWN0ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgodGFyZ2V0UGF0aCwgbWV0YU1vZGVsKTtcblx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGludm9sdmVkRGF0YU1vZGVsT2JqZWN0ICYmIGdldERpc3BsYXlNb2RlKGludm9sdmVkRGF0YU1vZGVsT2JqZWN0KTtcblx0XHRyZXR1cm4gZGlzcGxheU1vZGUgPyBkaXNwbGF5TW9kZSA6IFwiRGVzY3JpcHRpb25WYWx1ZVwiO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3aGljaCBpbmZvcm1zIHdoZXRoZXIgYSByZWNvbW1lbmRhdGlvbiBmaWVsZCBpcyBudWxsIG9yIG5vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICogQHBhcmFtIGtleVxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoXG5cdCAqIEByZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2hldGhlciBhIHJlY29tbWVuZGF0aW9uIGZpZWxkIGlzIG51bGwgb3Igbm90XG5cdCAqL1xuXG5cdGlzUmVjb21tZW5kYXRpb25GaWVsZE51bGwoY29udGV4dDogT0RhdGFWNENvbnRleHQsIGtleTogc3RyaW5nLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgoa2V5LCBjb250ZXh0LmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpKTtcblx0XHRpZiAoIWNvbnRleHQ/LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCkpIHtcblx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci5nZXREaXNwbGF5TW9kZUZvclRhcmdldFBhdGgoa2V5LCBjb250ZXh0Py5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoZGlzcGxheU1vZGUgJiYgZGlzcGxheU1vZGUgIT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRjb25zdCB0ZXh0ID0gcHJvcGVydHk/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8ucGF0aDtcblx0XHRcdFx0cmV0dXJuIHRleHQgPyAhY29udGV4dD8uZ2V0UHJvcGVydHkodGV4dCkgOiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHR1cGRhdGVGZXRjaGVkQ29udGV4dFBhdGhzOiBmdW5jdGlvbiAoY29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGNvbnN0IGZldGNoZWRDb250ZXh0UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29udGV4dHM/LmZvckVhY2goKGNvbnRleHQpID0+IHtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gY29udGV4dD8uZ2V0UGF0aCgpO1xuXHRcdFx0aWYgKGNvbnRleHRQYXRoICYmICFmZXRjaGVkQ29udGV4dFBhdGhzLmluY2x1ZGVzKGNvbnRleHRQYXRoKSkge1xuXHRcdFx0XHRmZXRjaGVkQ29udGV4dFBhdGhzLnB1c2goY29udGV4dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvZmV0Y2hlZENvbnRleHRQYXRoc1wiLCBmZXRjaGVkQ29udGV4dFBhdGhzKTtcblx0XHRpbnRlcm5hbE1vZGVsLnJlZnJlc2goKTtcblx0fSxcblxuXHRnZXRDb250ZXh0c1dpdGhOb1JlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKFxuXHRcdGNvbnRleHRzSW5mbzogUmVjb21tZW5kYXRpb25Db250ZXh0c0luZm9bXSxcblx0XHRpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWxcblx0KTogUmVjb21tZW5kYXRpb25Db250ZXh0c0luZm9bXSB7XG5cdFx0Y29uc3QgZmV0Y2hlZENvbnRleHRQYXRocyA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvZmV0Y2hlZENvbnRleHRQYXRoc1wiKSB8fCBbXTtcblx0XHRjb25zdCBpZ25vcmVkQ29udGV4dFBhdGhzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9pZ25vcmVkQ29udGV4dFBhdGhzXCIpIHx8IFtdO1xuXHRcdHJldHVybiBjb250ZXh0c0luZm8uZmlsdGVyKChjb250ZXh0SW5mbykgPT4ge1xuXHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0SW5mbz8uY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRyZXR1cm4gIWZldGNoZWRDb250ZXh0UGF0aHMuaW5jbHVkZXMoY29udGV4dFBhdGgpICYmICFpZ25vcmVkQ29udGV4dFBhdGhzLmluY2x1ZGVzKGNvbnRleHRQYXRoKTtcblx0XHR9KTtcblx0fSxcblxuXHRyZXNldFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCB7fSk7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvZmV0Y2hlZENvbnRleHRQYXRoc1wiLCBbXSk7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvaWdub3JlZENvbnRleHRQYXRoc1wiLCBbXSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5yZWZyZXNoKHRydWUpO1xuXHR9LFxuXG5cdGdldEN1cnJlbnRSb290Q29udGV4dDogZnVuY3Rpb24gKCk6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gcm9vdENvbnRleHQ7XG5cdH0sXG5cblx0c2V0Q3VycmVudFJvb3RDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dDogT0RhdGFWNENvbnRleHQpOiB2b2lkIHtcblx0XHRyb290Q29udGV4dCA9IGNvbnRleHQ7XG5cdH0sXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB0ZXh0IG9mIENvbnRleHRJZGVudGlmaWVyIGVsc2Ugd2lsbCBhZGQgaXRzIHZhbHVlIHRvIHRoZSBhY2NlcHRBbGxQYXJhbXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbXNcblx0ICogQHBhcmFtIHZpZXdQYXRoIENvbnRleHQgUGF0aCBvZiB2aWV3XG5cdCAqL1xuXHRhZGRDb250ZXh0SWRlbnRpZmllclRleHQocGFyYW1zOiBBY2NlcHRBbGxQYXJhbXMsIHZpZXdQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlY29tbWVuZGF0aW9uRGF0YSBvZiBwYXJhbXM/LnJlY29tbWVuZGF0aW9uRGF0YSB8fCBbXSkge1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGNvbnN0IGlkZW50aWZpZXJWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHQvLyBmb3IgcmVjb21tZW5kYXRpb24gZmllbGRzIHdoaWNoIGFyZSBkaXJlY3RseSBvbiBwYWdlLCB3ZSBkbyBub3Qgd2FudCB0byBzaG93IGlkZW50aWZpZXIgdmFsdWVzXG5cdFx0XHQvLyBzbyB3ZSBleGNsdWRlIHRoYXQgY2FsY3VsYXRpb25cblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dD8uZ2V0UGF0aCgpICE9PSB2aWV3UGF0aCkge1xuXHRcdFx0XHRpZiAocmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyICYmIHJlY29tbWVuZGF0aW9uRGF0YS5jb250ZXh0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyLmZvckVhY2goKGNvbnRleHRJZGVudGlmaWVyKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpZFBhdGggPSBgJHtyZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dD8uZ2V0UGF0aCgpfSkvJHtjb250ZXh0SWRlbnRpZmllcn1gO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dFRleHQgPSB0aGlzLmdldFRleHRGb3JLZXkocmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHQgYXMgT0RhdGFWNENvbnRleHQsIGlkUGF0aCwgY29udGV4dElkZW50aWZpZXIpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbnRleHRUZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGlkZW50aWZpZXJWYWx1ZXMucHVzaChpbmRleCA9PT0gMCA/IGAke2NvbnRleHRUZXh0fWAgOiBgICR7Y29udGV4dFRleHR9YCk7XG5cdFx0XHRcdFx0XHRcdGluZGV4ID0gaW5kZXggKyAxO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dElkZW50aWZpZXJUZXh0ID0gaWRlbnRpZmllclZhbHVlcztcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBGZXRjaGVzIHRhYmxlIG5hbWUgYmFzZWQgb24gdGhlIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRhYmxlIG5hbWVcblx0ICovXG5cblx0Z2V0RW50aXR5TmFtZShjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aChcblx0XHRcdGNvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKVxuXHRcdCk7XG5cdFx0Y29uc3QgdHlwZU5hbWUgPSBkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWU7XG5cdFx0cmV0dXJuIHR5cGVOYW1lICYmIGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0eXBlTmFtZSkpO1xuXHR9LFxuXHQvKipcblx0ICogRmV0Y2hlcyBUZXh0IGZvciBrZXkgaWYgaXQgZXhpc3RzIGVsc2Ugd2lsbCByZXR1cm4gaXRzIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKiBAcGFyYW0ga2V5UGF0aFxuXHQgKiBAcGFyYW0ga2V5XG5cdCAqIEByZXR1cm5zIFRleHQgb3IgVmFsdWUgZm9yIGEga2V5XG5cdCAqL1xuXG5cdGdldFRleHRGb3JLZXkoY29udGV4dDogT0RhdGFWNENvbnRleHQsIGtleVBhdGg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCB2YWx1ZSA9IFwiXCI7XG5cdFx0Y29uc3QgaW52b2x2ZWREYXRhTW9kZWxPYmplY3Q6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aChcblx0XHRcdGtleVBhdGgsXG5cdFx0XHRjb250ZXh0Py5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKVxuXHRcdCk7XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gaW52b2x2ZWREYXRhTW9kZWxPYmplY3Q/LnRhcmdldE9iamVjdDtcblx0XHRjb25zdCBwcm9wZXJ0eSA9XG5cdFx0XHQoKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldE9iamVjdCkgfHwgaXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uKHRhcmdldE9iamVjdCkpICYmIHRhcmdldE9iamVjdC4kdGFyZ2V0KSB8fFxuXHRcdFx0KHRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eSk7XG5cdFx0Y29uc3QgdGV4dCA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCk7XG5cdFx0aWYgKHRleHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhbHVlID0gZXZhbHVhdGVFeHByZXNzaW9uKHRleHQsIHsgXCJcIjogY29udGV4dC5nZXRPYmplY3QoKSB9KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA/IHZhbHVlIDogY29udGV4dC5nZXRQcm9wZXJ0eShrZXkpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHZhbHVlID0gY29udGV4dC5nZXRQcm9wZXJ0eShrZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWUgPz8gY29udGV4dC5nZXRQcm9wZXJ0eShrZXkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIHRoZSBwcmVmaXggc3RyaW5nIGhhdmluZyBlbnRpdHkgTmFtZSBhbmQgc2VtYW50aWNrZXlzLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc2hvdyBpbiBBY2NlcHQgcmVjb21tZW5kYXRpb25zIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoRnJvbUtleSBDb250ZXh0UGF0aCBvZiB0aGUgZmllbGQuXG5cdCAqIEBwYXJhbSBtYXRjaGluZ0NvbnRleHQgVGhlIGNvbnRleHQgZnJvbSBtb2RlbCBkYXRhIG1hdGNoaW5nIHRoZSBnaXZlbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gcmVjb21tRGF0YVxuXHQgKiBAcGFyYW0gcmVjb21tQ29udGV4dHNcblx0ICogQHJldHVybnMgVGhlIHByZWZpeCBnZW5lcmF0ZWQgc3RyaW5nLlxuXHQgKi9cblx0Z2V0UHJlZml4KFxuXHRcdGNvbnRleHRQYXRoRnJvbUtleTogc3RyaW5nLFxuXHRcdG1hdGNoaW5nQ29udGV4dDogUmVjb21tZW5kYXRpb25Db250ZXh0c0luZm8sXG5cdFx0cmVjb21tRGF0YTogUmVjb21tZW5kYXRpb25JbmZvLFxuXHRcdHJlY29tbUNvbnRleHRzOiBSZWNvbW1lbmRhdGlvbkNvbnRleHRzSW5mb1tdXG5cdCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbWF0Y2hpbmdDb250ZXh0LmNvbnRleHQ/LmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGNvbnRleHQgPSBtYXRjaGluZ0NvbnRleHQuY29udGV4dDtcblx0XHRsZXQgcHJlZml4ID0gXCJcIjtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbD8uZ2V0TWV0YVBhdGgoY29udGV4dFBhdGhGcm9tS2V5KTtcblx0XHRjb25zdCBwYXRoQXJyYXkgPSBtZXRhUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0cGF0aEFycmF5LnBvcCgpO1xuXHRcdGNvbnN0IHBhcmVudE1ldGFQYXRoID0gcGF0aEFycmF5LmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IGtleXNEYXRhID0gcmVjb21tRGF0YVtcImtleXNcIl07XG5cdFx0Y29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChrZXlzRGF0YSkge1xuXHRcdFx0Y29uc3Qga2V5cyA9IGtleXNEYXRhW3BhcmVudE1ldGFQYXRoXTtcblx0XHRcdGlmIChrZXlzKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHNGb3JUYXJnZXRQYXRoKFxuXHRcdFx0XHRcdHBhcmVudE1ldGFQYXRoLFxuXHRcdFx0XHRcdGNvbnRleHQ/LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgdHlwZU5hbWUgPSBkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWU7XG5cblx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IHJlY29tbUNvbnRleHRzLmZpbHRlcigoY29udGV4dEluZm86IFJlY29tbWVuZGF0aW9uQ29udGV4dHNJbmZvKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dFBhdGggPSBtYXRjaGluZ0NvbnRleHQ/LmNvbnRleHQ/LmdldEJpbmRpbmcoKT8uZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcmVudENvbnRleHRQYXRoID09PSBjb250ZXh0SW5mby5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChwYXJlbnRDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHREYXRhID0gcGFyZW50Q29udGV4dFswXS5jb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdC8vIGNhbGN1bGF0ZSBrZXlzIGZyb20gcGFyZW50IGNvbnRleHQgZGF0YSBiYXNlZCBvbiBzZW1hbnRpYyBrZXlzXG5cdFx0XHRcdFx0a2V5cy5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gY29udGV4dERhdGFba2V5XTtcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGAke3ZhbHVlfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHByZWZpeCA9IGAke3R5cGVOYW1lfSgke3ZhbHVlc30pYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlZml4O1xuXHR9XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztFQStDQSxJQUFJQSxXQUEyQjtFQUV4QixNQUFNQyw0QkFBNEIsR0FBRztJQUMzQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxvQkFBb0IsRUFBRSxDQUNyQkMsZUFBaUQsRUFDakRDLGFBQXdCLEVBQ3hCQyx1QkFBeUMsS0FDL0I7TUFDVixNQUFNQyxtQkFBbUIsR0FBSUYsYUFBYSxDQUFDRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsSUFBMkIsQ0FBQyxDQUFDO01BQzNHTiw0QkFBNEIsQ0FBQ08saURBQWlELENBQUNGLG1CQUFtQixFQUFFRCx1QkFBdUIsQ0FBQztNQUM1SEosNEJBQTRCLENBQUNRLDBCQUEwQixDQUFDTixlQUFlLEVBQUVHLG1CQUFtQixDQUFDO01BQzdGTCw0QkFBNEIsQ0FBQ1MseUJBQXlCLENBQUNMLHVCQUF1QixFQUFFRCxhQUFhLENBQUM7TUFDOUZILDRCQUE0QixDQUFDVSx5QkFBeUIsQ0FBQ0wsbUJBQW1CLEVBQUVELHVCQUF1QixDQUFDO01BQ3BHO01BQ0FDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7TUFDcENGLGFBQWEsQ0FBQ1EsV0FBVyxDQUFDLHNCQUFzQixFQUFFTixtQkFBbUIsQ0FBQztNQUN0RUYsYUFBYSxDQUFDUyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFREMsK0JB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
|
|
314
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb290Q29udGV4dCIsInN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIiLCJzdG9yZVJlY29tbWVuZGF0aW9ucyIsInJlY29tbWVuZGF0aW9ucyIsImludGVybmFsTW9kZWwiLCJyZWNvbW1lbmRhdGlvbnNDb250ZXh0cyIsInJlY29tbWVuZGF0aW9uc0RhdGEiLCJnZXRQcm9wZXJ0eSIsImNsZWFyUmVjb21tZW5kYXRpb25zRGF0YUZyb21Nb2RlbEZvckdpdmVuQ29udGV4dHMiLCJlbmhhbmNlUmVjb21tZW5kYXRpb25Nb2RlbCIsInVwZGF0ZUZldGNoZWRDb250ZXh0UGF0aHMiLCJ1cGRhdGVDb250ZXh0c0tleXNJbk1vZGVsIiwic2V0UHJvcGVydHkiLCJyZWZyZXNoIiwiaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyIsImNvbnRleHRzIiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsInJlY29tbWVuZGF0aW9uRGF0YSIsImlnbm9yZWRDb250ZXh0UGF0aHMiLCJmb3JFYWNoIiwiY29udGV4dCIsImlnbm9yZWRDb250ZXh0UGF0aCIsImdldFBhdGgiLCJwdXNoIiwiZmlsdGVyIiwiY29udGV4dEluZm8iLCJzdGFydHNXaXRoIiwiT2JqZWN0Iiwia2V5cyIsImRhdGEiLCJjbGVhcklnbm9yZWRDb250ZXh0cyIsImNvbnRleHRQYXRoIiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uUm9sZUV4aXN0c0ZvckNvbnRleHQiLCJyZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSIsImRhdGFNb2RlbE9iamVjdCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImVudGl0eVR5cGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwibmFtZSIsInJvbGVzIiwiaW5jbHVkZXMiLCJoYXNPd25Qcm9wZXJ0eSIsImtleXNEYXRhIiwibWV0YU1vZGVsIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImRhdGFNb2RlbCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0Iiwic2VtYW50aWNLZXlzRm9yR2l2ZW5NZXRhUGF0aCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiU2VtYW50aWNLZXkiLCJtYXAiLCJpIiwidmFsdWUiLCJ0YXJnZXQiLCJpZHgiLCJsYXN0SW5kZXhPZiIsImZpbmQiLCJzdWJzdHJpbmciLCJyZWNvbW1lbmRhdGlvbiIsIkFJUmVjb21tZW5kZWRGaWVsZFBhdGgiLCJyZWNvbW1lbmRhdGlvblZhbHVlcyIsImlzUGxhY2Vob2xkZXJWYWx1ZUZvdW5kIiwiX0FJQWx0dlJlY21kZEZsZFZhbHMiLCJhbHRlcm5hdGl2ZVJlY29tbWVuZGF0aW9uIiwicmVjb21tZW5kYXRpb25WYWx1ZSIsIkFJUmVjb21tZW5kZWRGaWVsZFZhbHVlIiwicHJvYmFiaWxpdHkiLCJBSVJlY29tbWVuZGVkRmllbGRTY29yZVZhbHVlIiwidW5kZWZpbmVkIiwidGV4dCIsIkFJUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uIiwiYWRkaXRpb25hbFZhbHVlcyIsImdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zIiwiYmluZGluZ0NvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJmdWxsUGF0aCIsImdldERpc3BsYXlNb2RlRm9yVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJpbnZvbHZlZERhdGFNb2RlbE9iamVjdCIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJpc1JlY29tbWVuZGF0aW9uRmllbGROdWxsIiwia2V5IiwicHJvcGVydHkiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInRhcmdldE9iamVjdCIsIlRleHQiLCJwYXRoIiwiZmV0Y2hlZENvbnRleHRQYXRocyIsImdldENvbnRleHRzV2l0aE5vUmVjb21tZW5kYXRpb25zIiwiY29udGV4dHNJbmZvIiwicmVzZXRSZWNvbW1lbmRhdGlvbnMiLCJyZWNvbW1lbmRhdGlvbnNEYXRhSW5Nb2RlbCIsImdldEN1cnJlbnRSb290Q29udGV4dCIsInNldEN1cnJlbnRSb290Q29udGV4dCIsImFkZENvbnRleHRJZGVudGlmaWVyVGV4dCIsInBhcmFtcyIsInZpZXdQYXRoIiwiaW5kZXgiLCJpZGVudGlmaWVyVmFsdWVzIiwiY29udGV4dElkZW50aWZpZXIiLCJpZFBhdGgiLCJjb250ZXh0VGV4dCIsImdldFRleHRGb3JLZXkiLCJjb250ZXh0SWRlbnRpZmllclRleHQiLCJnZXRFbnRpdHlOYW1lIiwidHlwZU5hbWUiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsImNvbXBpbGVFeHByZXNzaW9uIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwia2V5UGF0aCIsImlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbiIsIiR0YXJnZXQiLCJldmFsdWF0ZUV4cHJlc3Npb24iLCJnZXRPYmplY3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBBY2NlcHRBbGxQYXJhbXMgfSBmcm9tIFwiLi4vY29udHJvbGxlcmV4dGVuc2lvbnMvUmVjb21tZW5kYXRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCIuL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIH0gZnJvbSBcIi4vQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGV2YWx1YXRlRXhwcmVzc2lvbiB9IGZyb20gXCIuL0JpbmRpbmdUb29sa2l0RXZhbHVhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFJlY29tbWVuZGF0aW9uVmFsdWVUeXBlIH0gZnJvbSBcIi4vUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24gfSBmcm9tIFwiLi9UeXBlR3VhcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZSA9IHtcblx0QUlSZWNvbW1lbmRlZEZpZWxkUGF0aD86IHN0cmluZztcblx0QUlSZWNvbW1lbmRlZEZpZWxkVmFsdWU/OiBzdHJpbmc7XG5cdEFJUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRfQUlBbHR2UmVjbWRkRmxkVmFscz86IEFsdGVybmF0aXZlUmVjb21tZW5kYXRpb25SZXNwb25zZVR5cGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGF0aW9uQ29udGV4dHNJbmZvID0ge1xuXHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblx0Y29udGV4dElkZW50aWZpZXI/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEFsdGVybmF0aXZlUmVjb21tZW5kYXRpb25SZXNwb25zZVR5cGUgPSB7XG5cdEFJUmVjb21tZW5kZWRGaWVsZFZhbHVlOiBzdHJpbmc7XG5cdEFJUmVjb21tZW5kZWRGaWVsZFNjb3JlVmFsdWU/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUgPSB7XG5cdHZhbHVlPzogc3RyaW5nO1xuXHR0ZXh0Pzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsVmFsdWVzPzogUmVjb21tZW5kYXRpb25WYWx1ZVR5cGVbXTtcbn07XG5cbnR5cGUgU3RhbmRhcmRCYXNlUmVjb21tZW5kYXRpb24gPSB7XG5cdHZlcnNpb24/OiBudW1iZXI7XG5cdGtleXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG59O1xuXG5leHBvcnQgdHlwZSBCYXNlRHluYW1pY1JlY29tbWVuZGF0aW9uID0gUmVjb3JkPHN0cmluZywgU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlPjtcblxuZXhwb3J0IHR5cGUgUmVjb21tZW5kYXRpb25JbmZvID0gU3RhbmRhcmRCYXNlUmVjb21tZW5kYXRpb24gJiBCYXNlRHluYW1pY1JlY29tbWVuZGF0aW9uO1xuXG5sZXQgcm9vdENvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xuXG5leHBvcnQgY29uc3Qgc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciA9IHtcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIGFuZCBzZXQgdGhlIHJlY29tbWVuZGF0aW9ucyBhY2NvcmRpbmcgdG8gZGF0YSByZWNlaXZlZCBmcm9tIGJhY2tlbmQuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnMgVGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSBiYWNrZW5kXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBpbnRlcm5hbCBqc29uIG1vZGVsXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNDb250ZXh0cyBUaGUgY29udGV4dHMgZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9ucyBhcmUgYmVpbmcgZmV0Y2hlZFxuXHQgKi9cblx0c3RvcmVSZWNvbW1lbmRhdGlvbnM6IChcblx0XHRyZWNvbW1lbmRhdGlvbnM6IFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZVtdLFxuXHRcdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZWNvbW1lbmRhdGlvbnNDb250ZXh0czogT0RhdGFWNENvbnRleHRbXVxuXHQpOiB2b2lkID0+IHtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbnNEYXRhID0gKGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiKSBhcyBSZWNvbW1lbmRhdGlvbkluZm8pIHx8IHt9O1xuXHRcdHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuY2xlYXJSZWNvbW1lbmRhdGlvbnNEYXRhRnJvbU1vZGVsRm9yR2l2ZW5Db250ZXh0cyhyZWNvbW1lbmRhdGlvbnNEYXRhLCByZWNvbW1lbmRhdGlvbnNDb250ZXh0cyk7XG5cdFx0c3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci5lbmhhbmNlUmVjb21tZW5kYXRpb25Nb2RlbChyZWNvbW1lbmRhdGlvbnMsIHJlY29tbWVuZGF0aW9uc0RhdGEpO1xuXHRcdHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIudXBkYXRlRmV0Y2hlZENvbnRleHRQYXRocyhyZWNvbW1lbmRhdGlvbnNDb250ZXh0cywgaW50ZXJuYWxNb2RlbCk7XG5cdFx0c3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci51cGRhdGVDb250ZXh0c0tleXNJbk1vZGVsKHJlY29tbWVuZGF0aW9uc0RhdGEsIHJlY29tbWVuZGF0aW9uc0NvbnRleHRzKTtcblx0XHQvL1NldHRpbmcgdGhlIHZlcnNpb24gdG8gMi4wIHRvIHNlZ3JlZ2F0ZSB0aGUgcHJvY2Vzc2luZ1xuXHRcdHJlY29tbWVuZGF0aW9uc0RhdGFbXCJ2ZXJzaW9uXCJdID0gMi4wO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCByZWNvbW1lbmRhdGlvbnNEYXRhKTtcblx0XHRpbnRlcm5hbE1vZGVsLnJlZnJlc2godHJ1ZSk7XG5cdH0sXG5cblx0aWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0czogKGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkID0+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25Db250ZXh0czogUmVjb21tZW5kYXRpb25Db250ZXh0c0luZm9bXSA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25Db250ZXh0c1wiKSB8fCBbXTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkRhdGEgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIik7XG5cdFx0Y29uc3QgaWdub3JlZENvbnRleHRQYXRocyA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvaWdub3JlZENvbnRleHRQYXRoc1wiKSB8fCBbXTtcblx0XHRjb250ZXh0cy5mb3JFYWNoKChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgaWdub3JlZENvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRpZ25vcmVkQ29udGV4dFBhdGhzLnB1c2goaWdub3JlZENvbnRleHRQYXRoKTtcblx0XHRcdC8vIGRlbGV0ZSByZWNvbW1lbmRhdGlvbiBkYXRhIGZvciBhIGNvbnRleHQgb3IgaXRzIGNoaWxkcmVuIGZpbHRlciByZWNvbW1lbmRhdGlvbkNvbnRleHRzIHdoaWNoIGRvIG5vdCBtYXRjaFxuXHRcdFx0Ly8gYSBwYXRoLiBUaGlzIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcmVjb21tZW5kYXRpb25zIGNvbnRleHRzIHRvIGJlIGtlcHQgaW4gbW9kZWxcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29udGV4dHMgPSByZWNvbW1lbmRhdGlvbkNvbnRleHRzLmZpbHRlcigoY29udGV4dEluZm86IFJlY29tbWVuZGF0aW9uQ29udGV4dHNJbmZvKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhY29udGV4dEluZm8/LmNvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoaWdub3JlZENvbnRleHRQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25EYXRhKS5mb3JFYWNoKChkYXRhKSA9PiB7XG5cdFx0XHRcdGlmIChkYXRhLnN0YXJ0c1dpdGgoaWdub3JlZENvbnRleHRQYXRoKSkge1xuXHRcdFx0XHRcdGRlbGV0ZSByZWNvbW1lbmRhdGlvbkRhdGFbZGF0YV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCByZWNvbW1lbmRhdGlvbkRhdGEpO1xuXHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25Db250ZXh0c1wiLCByZWNvbW1lbmRhdGlvbkNvbnRleHRzKTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIiwgaWdub3JlZENvbnRleHRQYXRocyk7XG5cdH0sXG5cblx0Y2xlYXJJZ25vcmVkQ29udGV4dHM6IChpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRsZXQgaWdub3JlZENvbnRleHRQYXRocyA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvaWdub3JlZENvbnRleHRQYXRoc1wiKSB8fCBbXTtcblx0XHRpZ25vcmVkQ29udGV4dFBhdGhzID0gaWdub3JlZENvbnRleHRQYXRocy5maWx0ZXIoKGlnbm9yZWRDb250ZXh0UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIWlnbm9yZWRDb250ZXh0UGF0aC5zdGFydHNXaXRoKGNvbnRleHRQYXRoKTtcblx0XHR9KTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIiwgaWdub3JlZENvbnRleHRQYXRocyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlIGFyZSByZWNvbW1lbmRhdGlvbiByb2xlcyBmb3IgY29udGV4dCBlbnRpdHkgdHlwZS5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRJbmZvIENvbnRhaW5zIGNvbnRleHQgYW5kIGNvbnRleHRJZGVudGlmaWVyXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSBSZWdpc3RyeSB3aGljaCBob2xkcyB0aGUgcmVjb21tZW5kYXRpb24gcm9sZXMgZm9yIGFsbCBlbnRpdHkgdHlwZXNcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHJlY29tbWVuZGF0aW9uIHJvbGUgZXhpc3RzIGZvciBlbnRpdHlUeXBlIGFubm90YXRpb24gb3Igbm90XG5cdCAqL1xuXHRjaGVja0lmUmVjb21tZW5kYXRpb25Sb2xlRXhpc3RzRm9yQ29udGV4dDogKFxuXHRcdGNvbnRleHRJbmZvOiBSZWNvbW1lbmRhdGlvbkNvbnRleHRzSW5mbyxcblx0XHRyZWNvbW1lbmRhdGlvbnNSZWdpc3RyeTogUmVjb21tZW5kYXRpb25zUmVnaXN0cnlcblx0KTogYm9vbGVhbiA9PiB7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgoXG5cdFx0XHRjb250ZXh0SW5mbz8uY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRjb250ZXh0SW5mbz8uY29udGV4dC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKVxuXHRcdCk7XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5VHlwZS5uYW1lIGFzIHN0cmluZztcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25zUmVnaXN0cnkucm9sZXMpLmluY2x1ZGVzKGVudGl0eVR5cGUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgcmVjb21tZW5kYXRpb24gZGF0YSB3aXRoIGtleXMgb2YgYWxsIGNvbnRleHRzLiBUaGlzIG11c3QgYmUgc2hvd24gaW4gdGhlIEFjY2VwdCBSZWNvbW1lbmRhdGlvbnMgRGlhbG9nIGJhc2VkIG9uIHRoZSB1c2UgY2FzZS5cblx0ICpcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uc0RhdGFcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uQ29udGV4dHNcblx0ICovXG5cdHVwZGF0ZUNvbnRleHRzS2V5c0luTW9kZWw6IChyZWNvbW1lbmRhdGlvbnNEYXRhOiBSZWNvbW1lbmRhdGlvbkluZm8sIHJlY29tbWVuZGF0aW9uQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10pOiB2b2lkID0+IHtcblx0XHRpZiAoIXJlY29tbWVuZGF0aW9uc0RhdGEuaGFzT3duUHJvcGVydHkoXCJrZXlzXCIpKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbnNEYXRhW1wia2V5c1wiXSA9IHt9O1xuXHRcdH1cblx0XHRjb25zdCBrZXlzRGF0YSA9IHJlY29tbWVuZGF0aW9uc0RhdGFbXCJrZXlzXCJdO1xuXHRcdHJlY29tbWVuZGF0aW9uQ29udGV4dHMuZm9yRWFjaCgoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0Py5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobWV0YVBhdGgpKTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5c0ZvckdpdmVuTWV0YVBhdGggPSBkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5O1xuXHRcdFx0aWYgKHNlbWFudGljS2V5c0ZvckdpdmVuTWV0YVBhdGgpIHtcblx0XHRcdFx0aWYgKGtleXNEYXRhICYmICFrZXlzRGF0YS5oYXNPd25Qcm9wZXJ0eShtZXRhUGF0aCkgJiYgc2VtYW50aWNLZXlzRm9yR2l2ZW5NZXRhUGF0aCkge1xuXHRcdFx0XHRcdGtleXNEYXRhW21ldGFQYXRoXSA9IHNlbWFudGljS2V5c0ZvckdpdmVuTWV0YVBhdGgubWFwKChpKSA9PiBpLnZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgb2xkIHJlY29tbWVuZGF0aW9ucyBmb3IgdGhlIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbnNEYXRhIFRoZSByZWNvbW1lbmRhdGlvbiBkYXRhIHdoaWNoIGlzIHN0b3JlZFxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25zQ29udGV4dHMgVGhlIGNvbnRleHRzIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbnMgYXJlIGJlaW5nIGZldGNoZWRcblx0ICovXG5cdGNsZWFyUmVjb21tZW5kYXRpb25zRGF0YUZyb21Nb2RlbEZvckdpdmVuQ29udGV4dHM6IChcblx0XHRyZWNvbW1lbmRhdGlvbnNEYXRhOiBSZWNvbW1lbmRhdGlvbkluZm8sXG5cdFx0cmVjb21tZW5kYXRpb25zQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdXG5cdCk6IHZvaWQgPT4ge1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbnNDb250ZXh0cykge1xuXHRcdFx0T2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25zRGF0YSkuZm9yRWFjaCgodGFyZ2V0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IHRhcmdldC5sYXN0SW5kZXhPZihcIilcIik7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbnNDb250ZXh0cy5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRQYXRoKCkgPT09IHRhcmdldC5zdWJzdHJpbmcoMCwgaWR4ICsgMSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHJlY29tbWVuZGF0aW9uc0RhdGFbdGFyZ2V0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5oYW5jZSB0aGUgcmVjb21tZW5kYXRpb25zIGFjY29yZGluZyB0byBkYXRhIHJlY2VpdmVkIGZyb20gYmFja2VuZC5cblx0ICpcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9ucyBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIGJhY2tlbmRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uc0RhdGEgVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9uIE1vZGVsXG5cdCAqL1xuXHRlbmhhbmNlUmVjb21tZW5kYXRpb25Nb2RlbDogKFxuXHRcdHJlY29tbWVuZGF0aW9uczogQXJyYXk8U3RhbmRhcmRSZWNvbW1lbmRhdGlvblJlc3BvbnNlPixcblx0XHRyZWNvbW1lbmRhdGlvbnNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+XG5cdCk6IHZvaWQgPT4ge1xuXHRcdHJlY29tbWVuZGF0aW9ucz8uZm9yRWFjaCgocmVjb21tZW5kYXRpb246IFN0YW5kYXJkUmVjb21tZW5kYXRpb25SZXNwb25zZSkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gcmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkUGF0aDtcblx0XHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdFx0Ly8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVjb21tZW5kYXRpb25zIHNlbnQgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzOiBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZVtdID0gW107XG5cdFx0XHRcdGxldCBpc1BsYWNlaG9sZGVyVmFsdWVGb3VuZCA9IGZhbHNlO1xuXG5cdFx0XHRcdC8vIHNldCB0aGUgb3RoZXIgYWx0ZXJuYXRpdmVzIGFzIHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRyZWNvbW1lbmRhdGlvbi5fQUlBbHR2UmVjbWRkRmxkVmFscz8uZm9yRWFjaCgoYWx0ZXJuYXRpdmVSZWNvbW1lbmRhdGlvbjogQWx0ZXJuYXRpdmVSZWNvbW1lbmRhdGlvblJlc3BvbnNlVHlwZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWU6IFJlY29tbWVuZGF0aW9uVmFsdWVUeXBlID0ge1xuXHRcdFx0XHRcdFx0dmFsdWU6IGFsdGVybmF0aXZlUmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogYWx0ZXJuYXRpdmVSZWNvbW1lbmRhdGlvbi5BSVJlY29tbWVuZGVkRmllbGRTY29yZVZhbHVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAocmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkVmFsdWUgPT09IGFsdGVybmF0aXZlUmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdGlzUGxhY2Vob2xkZXJWYWx1ZUZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlcy5wdXNoKHJlY29tbWVuZGF0aW9uVmFsdWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmVjb21tZW5kYXRpb25zRGF0YVt0YXJnZXRdID0ge1xuXHRcdFx0XHRcdHZhbHVlOiBpc1BsYWNlaG9sZGVyVmFsdWVGb3VuZCA/IHJlY29tbWVuZGF0aW9uLkFJUmVjb21tZW5kZWRGaWVsZFZhbHVlIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdHRleHQ6IGlzUGxhY2Vob2xkZXJWYWx1ZUZvdW5kID8gcmVjb21tZW5kYXRpb24uQUlSZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb24gOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlczogcmVjb21tZW5kYXRpb25WYWx1ZXNcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlY29tbWVuZGF0aW9ucyBmcm9tIHN0YW5kYXJkIHJlY29tbWVuZGF0aW9ucyBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgQ29udGV4dCBvZiB0aGUgZmllbGRcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoIG9mIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25EYXRhIE9iamVjdCBjb250YWluaW5nIHJlY29tbWVuZGF0aW9uc1xuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBkYXRhIGZvciB0aGUgZmllbGRcblx0ICovXG5cdGdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhOiBSZWNvbW1lbmRhdGlvbkluZm9cblx0KTogU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoYmluZGluZ0NvbnRleHQgJiYgcHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSArIFwiL1wiICsgcHJvcGVydHlQYXRoO1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uRGF0YVtmdWxsUGF0aF0gfHwgdW5kZWZpbmVkO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIGRpc3BsYXkgbW9kZSBmb3IgYSBnaXZlbiB0YXJnZXQgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFBhdGhcblx0ICogQHBhcmFtIG1vZGVsXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgRGlzcGxheSBtb2RlIGZvciB0YXJnZXQgcGF0aFxuXHQgKi9cblx0Z2V0RGlzcGxheU1vZGVGb3JUYXJnZXRQYXRoKHRhcmdldFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaW52b2x2ZWREYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aDxQcm9wZXJ0eT4odGFyZ2V0UGF0aCwgbWV0YU1vZGVsKTtcblx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGludm9sdmVkRGF0YU1vZGVsT2JqZWN0ICYmIGdldERpc3BsYXlNb2RlKGludm9sdmVkRGF0YU1vZGVsT2JqZWN0KTtcblx0XHRyZXR1cm4gZGlzcGxheU1vZGUgPyBkaXNwbGF5TW9kZSA6IFwiRGVzY3JpcHRpb25WYWx1ZVwiO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3aGljaCBpbmZvcm1zIHdoZXRoZXIgYSByZWNvbW1lbmRhdGlvbiBmaWVsZCBpcyBudWxsIG9yIG5vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICogQHBhcmFtIGtleVxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoXG5cdCAqIEByZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2hldGhlciBhIHJlY29tbWVuZGF0aW9uIGZpZWxkIGlzIG51bGwgb3Igbm90XG5cdCAqL1xuXG5cdGlzUmVjb21tZW5kYXRpb25GaWVsZE51bGwoY29udGV4dDogT0RhdGFWNENvbnRleHQsIGtleTogc3RyaW5nLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGg8UHJvcGVydHk+KGtleSwgY29udGV4dC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0aWYgKCFjb250ZXh0Py5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0RGlzcGxheU1vZGVGb3JUYXJnZXRQYXRoKGtleSwgY29udGV4dD8uZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKGRpc3BsYXlNb2RlICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRcdFx0Y29uc3QgdGV4dCA9XG5cdFx0XHRcdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHk/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCkgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eT8udGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5wYXRoO1xuXHRcdFx0XHRyZXR1cm4gdGV4dCA/ICFjb250ZXh0Py5nZXRQcm9wZXJ0eSh0ZXh0KSA6IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdHVwZGF0ZUZldGNoZWRDb250ZXh0UGF0aHM6IGZ1bmN0aW9uIChjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0Y29uc3QgZmV0Y2hlZENvbnRleHRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb250ZXh0cz8uZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgY29udGV4dFBhdGggPSBjb250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0XHRpZiAoY29udGV4dFBhdGggJiYgIWZldGNoZWRDb250ZXh0UGF0aHMuaW5jbHVkZXMoY29udGV4dFBhdGgpKSB7XG5cdFx0XHRcdGZldGNoZWRDb250ZXh0UGF0aHMucHVzaChjb250ZXh0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpbnRlcm5hbE1vZGVsPy5zZXRQcm9wZXJ0eShcIi9mZXRjaGVkQ29udGV4dFBhdGhzXCIsIGZldGNoZWRDb250ZXh0UGF0aHMpO1xuXHRcdGludGVybmFsTW9kZWwucmVmcmVzaCgpO1xuXHR9LFxuXG5cdGdldENvbnRleHRzV2l0aE5vUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dHNJbmZvOiBSZWNvbW1lbmRhdGlvbkNvbnRleHRzSW5mb1tdLFxuXHRcdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbFxuXHQpOiBSZWNvbW1lbmRhdGlvbkNvbnRleHRzSW5mb1tdIHtcblx0XHRjb25zdCBmZXRjaGVkQ29udGV4dFBhdGhzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9mZXRjaGVkQ29udGV4dFBhdGhzXCIpIHx8IFtdO1xuXHRcdGNvbnN0IGlnbm9yZWRDb250ZXh0UGF0aHMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIikgfHwgW107XG5cdFx0cmV0dXJuIGNvbnRleHRzSW5mby5maWx0ZXIoKGNvbnRleHRJbmZvKSA9PiB7XG5cdFx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRleHRJbmZvPy5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdHJldHVybiAhZmV0Y2hlZENvbnRleHRQYXRocy5pbmNsdWRlcyhjb250ZXh0UGF0aCkgJiYgIWlnbm9yZWRDb250ZXh0UGF0aHMuaW5jbHVkZXMoY29udGV4dFBhdGgpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlc2V0UmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0Ly8gd2UgaGF2ZSB2ZXJzaW9uIGtleSBtYWludGFpbmVkIG9ubHkgZm9yIHN0YW5kYXJkIHNvbHV0aW9uIG9mIHJlY29tbWVuZGF0aW9uc1xuXHRcdC8vYW5kIG9ubHkgaWYgdGhpcyBpcyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiwgd2Ugc2hvdWxkIHJlc2V0IHJlY29tbWVuZGF0aW9uc1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uc0RhdGFJbk1vZGVsID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWNvbW1lbmRhdGlvbnNEYXRhXCIpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbnNEYXRhSW5Nb2RlbCAmJiByZWNvbW1lbmRhdGlvbnNEYXRhSW5Nb2RlbC5oYXNPd25Qcm9wZXJ0eShcInZlcnNpb25cIikpIHtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiLCB7fSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsPy5zZXRQcm9wZXJ0eShcIi9mZXRjaGVkQ29udGV4dFBhdGhzXCIsIFtdKTtcblx0XHRcdGludGVybmFsTW9kZWw/LnNldFByb3BlcnR5KFwiL2lnbm9yZWRDb250ZXh0UGF0aHNcIiwgW10pO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5yZWZyZXNoKHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHRnZXRDdXJyZW50Um9vdENvbnRleHQ6IGZ1bmN0aW9uICgpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHJvb3RDb250ZXh0O1xuXHR9LFxuXG5cdHNldEN1cnJlbnRSb290Q29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0cm9vdENvbnRleHQgPSBjb250ZXh0O1xuXHR9LFxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBvZiBDb250ZXh0SWRlbnRpZmllciBlbHNlIHdpbGwgYWRkIGl0cyB2YWx1ZSB0byB0aGUgYWNjZXB0QWxsUGFyYW1zLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1zXG5cdCAqIEBwYXJhbSB2aWV3UGF0aCBDb250ZXh0IFBhdGggb2Ygdmlld1xuXHQgKi9cblx0YWRkQ29udGV4dElkZW50aWZpZXJUZXh0KHBhcmFtczogQWNjZXB0QWxsUGFyYW1zLCB2aWV3UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCByZWNvbW1lbmRhdGlvbkRhdGEgb2YgcGFyYW1zPy5yZWNvbW1lbmRhdGlvbkRhdGEgfHwgW10pIHtcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRjb25zdCBpZGVudGlmaWVyVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0Ly8gZm9yIHJlY29tbWVuZGF0aW9uIGZpZWxkcyB3aGljaCBhcmUgZGlyZWN0bHkgb24gcGFnZSwgd2UgZG8gbm90IHdhbnQgdG8gc2hvdyBpZGVudGlmaWVyIHZhbHVlc1xuXHRcdFx0Ly8gc28gd2UgZXhjbHVkZSB0aGF0IGNhbGN1bGF0aW9uXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHQ/LmdldFBhdGgoKSAhPT0gdmlld1BhdGgpIHtcblx0XHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uRGF0YS5jb250ZXh0SWRlbnRpZmllciAmJiByZWNvbW1lbmRhdGlvbkRhdGEuY29udGV4dCkge1xuXHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YS5jb250ZXh0SWRlbnRpZmllci5mb3JFYWNoKChjb250ZXh0SWRlbnRpZmllcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgaWRQYXRoID0gYCR7cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHQ/LmdldFBhdGgoKX0pLyR7Y29udGV4dElkZW50aWZpZXJ9YDtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHRUZXh0ID0gdGhpcy5nZXRUZXh0Rm9yS2V5KHJlY29tbWVuZGF0aW9uRGF0YS5jb250ZXh0IGFzIE9EYXRhVjRDb250ZXh0LCBpZFBhdGgsIGNvbnRleHRJZGVudGlmaWVyKTtcblx0XHRcdFx0XHRcdGlmIChjb250ZXh0VGV4dCkge1xuXHRcdFx0XHRcdFx0XHRpZGVudGlmaWVyVmFsdWVzLnB1c2goaW5kZXggPT09IDAgPyBgJHtjb250ZXh0VGV4dH1gIDogYCAke2NvbnRleHRUZXh0fWApO1xuXHRcdFx0XHRcdFx0XHRpbmRleCA9IGluZGV4ICsgMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmVjb21tZW5kYXRpb25EYXRhLmNvbnRleHRJZGVudGlmaWVyVGV4dCA9IGlkZW50aWZpZXJWYWx1ZXM7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRmV0Y2hlcyB0YWJsZSBuYW1lIGJhc2VkIG9uIHRoZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKiBAcmV0dXJucyBUYWJsZSBuYW1lXG5cdCAqL1xuXG5cdGdldEVudGl0eU5hbWUoY29udGV4dDogT0RhdGFWNENvbnRleHQpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0c0ZvclRhcmdldFBhdGgoXG5cdFx0XHRjb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKClcblx0XHQpO1xuXHRcdGNvbnN0IHR5cGVOYW1lID0gZGF0YU1vZGVsT2JqZWN0Py50YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lO1xuXHRcdHJldHVybiB0eXBlTmFtZSAmJiBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odHlwZU5hbWUpKTtcblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgVGV4dCBmb3Iga2V5IGlmIGl0IGV4aXN0cyBlbHNlIHdpbGwgcmV0dXJuIGl0cyB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICogQHBhcmFtIGtleVBhdGhcblx0ICogQHBhcmFtIGtleVxuXHQgKiBAcmV0dXJucyBUZXh0IG9yIFZhbHVlIGZvciBhIGtleVxuXHQgKi9cblxuXHRnZXRUZXh0Rm9yS2V5KGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBrZXlQYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgdmFsdWUgPSBcIlwiO1xuXHRcdGNvbnN0IGludm9sdmVkRGF0YU1vZGVsT2JqZWN0OiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PiB8IHVuZGVmaW5lZCA9XG5cdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzRm9yVGFyZ2V0UGF0aDxQcm9wZXJ0eT4oa2V5UGF0aCwgY29udGV4dD8uZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdGNvbnN0IHRhcmdldE9iamVjdCA9IGludm9sdmVkRGF0YU1vZGVsT2JqZWN0Py50YXJnZXRPYmplY3Q7XG5cdFx0Y29uc3QgcHJvcGVydHkgPVxuXHRcdFx0KChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3QpIHx8IGlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbih0YXJnZXRPYmplY3QpKSAmJiB0YXJnZXRPYmplY3QuJHRhcmdldCkgfHxcblx0XHRcdCh0YXJnZXRPYmplY3QgYXMgUHJvcGVydHkpO1xuXHRcdGNvbnN0IHRleHQgPSBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpO1xuXHRcdGlmICh0ZXh0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YWx1ZSA9IGV2YWx1YXRlRXhwcmVzc2lvbih0ZXh0LCB7IFwiXCI6IGNvbnRleHQuZ2V0T2JqZWN0KCkgfSk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6IGNvbnRleHQuZ2V0UHJvcGVydHkoa2V5KTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHR2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoa2V5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlID8/IGNvbnRleHQuZ2V0UHJvcGVydHkoa2V5KTtcblx0fVxufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7RUFnREEsSUFBSUEsV0FBMkI7RUFFeEIsTUFBTUMsNEJBQTRCLEdBQUc7SUFDM0M7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0Msb0JBQW9CLEVBQUUsQ0FDckJDLGVBQWlELEVBQ2pEQyxhQUF3QixFQUN4QkMsdUJBQXlDLEtBQy9CO01BQ1YsTUFBTUMsbUJBQW1CLEdBQUlGLGFBQWEsQ0FBQ0csV0FBVyxDQUFDLHNCQUFzQixDQUFDLElBQTJCLENBQUMsQ0FBQztNQUMzR04sNEJBQTRCLENBQUNPLGlEQUFpRCxDQUFDRixtQkFBbUIsRUFBRUQsdUJBQXVCLENBQUM7TUFDNUhKLDRCQUE0QixDQUFDUSwwQkFBMEIsQ0FBQ04sZUFBZSxFQUFFRyxtQkFBbUIsQ0FBQztNQUM3RkwsNEJBQTRCLENBQUNTLHlCQUF5QixDQUFDTCx1QkFBdUIsRUFBRUQsYUFBYSxDQUFDO01BQzlGSCw0QkFBNEIsQ0FBQ1Us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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Property } from "@sap-ux/vocabularies-types";
|
|
2
2
|
import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
|
|
3
|
+
import type { RecommendationsRegistry } from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
3
4
|
import type Context from "sap/ui/model/Context";
|
|
4
5
|
import type JSONModel from "sap/ui/model/json/JSONModel";
|
|
5
6
|
import type ODataV4Context from "sap/ui/model/odata/v4/Context";
|
|
@@ -103,7 +104,26 @@ export const standardRecommendationHelper = {
|
|
|
103
104
|
},
|
|
104
105
|
|
|
105
106
|
/**
|
|
106
|
-
* This function
|
|
107
|
+
* This function checks if there are recommendation roles for context entity type.
|
|
108
|
+
*
|
|
109
|
+
* @param contextInfo Contains context and contextIdentifier
|
|
110
|
+
* @param recommendationsRegistry Registry which holds the recommendation roles for all entity types
|
|
111
|
+
* @returns Boolean value based on whether recommendation role exists for entityType annotation or not
|
|
112
|
+
*/
|
|
113
|
+
checkIfRecommendationRoleExistsForContext: (
|
|
114
|
+
contextInfo: RecommendationContextsInfo,
|
|
115
|
+
recommendationsRegistry: RecommendationsRegistry
|
|
116
|
+
): boolean => {
|
|
117
|
+
const dataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(
|
|
118
|
+
contextInfo?.context.getPath(),
|
|
119
|
+
contextInfo?.context.getModel()?.getMetaModel()
|
|
120
|
+
);
|
|
121
|
+
const entityType = dataModelObject?.targetEntityType.name as string;
|
|
122
|
+
return Object.keys(recommendationsRegistry.roles).includes(entityType);
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* This function updates recommendation data with keys of all contexts. This must be shown in the Accept Recommendations Dialog based on the use case.
|
|
107
127
|
*
|
|
108
128
|
* @param recommendationsData
|
|
109
129
|
* @param recommendationContexts
|
|
@@ -215,7 +235,7 @@ export const standardRecommendationHelper = {
|
|
|
215
235
|
* @returns Display mode for target path
|
|
216
236
|
*/
|
|
217
237
|
getDisplayModeForTargetPath(targetPath: string, metaModel: ODataMetaModel): string {
|
|
218
|
-
const involvedDataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(targetPath, metaModel);
|
|
238
|
+
const involvedDataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath<Property>(targetPath, metaModel);
|
|
219
239
|
const displayMode = involvedDataModelObject && getDisplayMode(involvedDataModelObject);
|
|
220
240
|
return displayMode ? displayMode : "DescriptionValue";
|
|
221
241
|
},
|
|
@@ -230,11 +250,13 @@ export const standardRecommendationHelper = {
|
|
|
230
250
|
*/
|
|
231
251
|
|
|
232
252
|
isRecommendationFieldNull(context: ODataV4Context, key: string, propertyPath: string): boolean {
|
|
233
|
-
const property = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(key, context.getModel()?.getMetaModel());
|
|
253
|
+
const property = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath<Property>(key, context.getModel()?.getMetaModel());
|
|
234
254
|
if (!context?.getProperty(propertyPath)) {
|
|
235
255
|
const displayMode = standardRecommendationHelper.getDisplayModeForTargetPath(key, context?.getModel()?.getMetaModel());
|
|
236
256
|
if (displayMode && displayMode !== "Value") {
|
|
237
|
-
const text =
|
|
257
|
+
const text =
|
|
258
|
+
isPathAnnotationExpression(property?.targetObject?.annotations?.Common?.Text) &&
|
|
259
|
+
property?.targetObject?.annotations?.Common?.Text?.path;
|
|
238
260
|
return text ? !context?.getProperty(text) : true;
|
|
239
261
|
}
|
|
240
262
|
return true;
|
|
@@ -268,10 +290,15 @@ export const standardRecommendationHelper = {
|
|
|
268
290
|
},
|
|
269
291
|
|
|
270
292
|
resetRecommendations: function (internalModel: JSONModel): void {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
internalModel
|
|
274
|
-
|
|
293
|
+
// we have version key maintained only for standard solution of recommendations
|
|
294
|
+
//and only if this is standard implementation, we should reset recommendations
|
|
295
|
+
const recommendationsDataInModel = internalModel.getProperty("/recommendationsData");
|
|
296
|
+
if (recommendationsDataInModel && recommendationsDataInModel.hasOwnProperty("version")) {
|
|
297
|
+
internalModel.setProperty("/recommendationsData", {});
|
|
298
|
+
internalModel?.setProperty("/fetchedContextPaths", []);
|
|
299
|
+
internalModel?.setProperty("/ignoredContextPaths", []);
|
|
300
|
+
internalModel.refresh(true);
|
|
301
|
+
}
|
|
275
302
|
},
|
|
276
303
|
|
|
277
304
|
getCurrentRootContext: function (): ODataV4Context | undefined {
|
|
@@ -334,10 +361,8 @@ export const standardRecommendationHelper = {
|
|
|
334
361
|
|
|
335
362
|
getTextForKey(context: ODataV4Context, keyPath: string, key: string): string {
|
|
336
363
|
let value = "";
|
|
337
|
-
const involvedDataModelObject: DataModelObjectPath | undefined =
|
|
338
|
-
keyPath,
|
|
339
|
-
context?.getModel()?.getMetaModel()
|
|
340
|
-
);
|
|
364
|
+
const involvedDataModelObject: DataModelObjectPath<Property> | undefined =
|
|
365
|
+
MetaModelConverter.getInvolvedDataModelObjectsForTargetPath<Property>(keyPath, context?.getModel()?.getMetaModel());
|
|
341
366
|
const targetObject = involvedDataModelObject?.targetObject;
|
|
342
367
|
const property =
|
|
343
368
|
((isPathAnnotationExpression(targetObject) || isPropertyPathExpression(targetObject)) && targetObject.$target) ||
|
|
@@ -352,56 +377,5 @@ export const standardRecommendationHelper = {
|
|
|
352
377
|
}
|
|
353
378
|
}
|
|
354
379
|
return value ?? context.getProperty(key);
|
|
355
|
-
},
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* This function will create the prefix string having entity Name and semantickeys, which will be used to show in Accept recommendations dialog.
|
|
359
|
-
*
|
|
360
|
-
* @param contextPathFromKey ContextPath of the field.
|
|
361
|
-
* @param matchingContext The context from model data matching the given context.
|
|
362
|
-
* @param recommData
|
|
363
|
-
* @param recommContexts
|
|
364
|
-
* @returns The prefix generated string.
|
|
365
|
-
*/
|
|
366
|
-
getPrefix(
|
|
367
|
-
contextPathFromKey: string,
|
|
368
|
-
matchingContext: RecommendationContextsInfo,
|
|
369
|
-
recommData: RecommendationInfo,
|
|
370
|
-
recommContexts: RecommendationContextsInfo[]
|
|
371
|
-
): string {
|
|
372
|
-
const metaModel = matchingContext.context?.getModel()?.getMetaModel();
|
|
373
|
-
const context = matchingContext.context;
|
|
374
|
-
let prefix = "";
|
|
375
|
-
const metaPath = metaModel?.getMetaPath(contextPathFromKey);
|
|
376
|
-
const pathArray = metaPath.split("/");
|
|
377
|
-
pathArray.pop();
|
|
378
|
-
const parentMetaPath = pathArray.join("/");
|
|
379
|
-
const keysData = recommData["keys"];
|
|
380
|
-
const values: string[] = [];
|
|
381
|
-
if (keysData) {
|
|
382
|
-
const keys = keysData[parentMetaPath];
|
|
383
|
-
if (keys) {
|
|
384
|
-
const dataModelObject = MetaModelConverter.getInvolvedDataModelObjectsForTargetPath(
|
|
385
|
-
parentMetaPath,
|
|
386
|
-
context?.getModel().getMetaModel()
|
|
387
|
-
);
|
|
388
|
-
const typeName = dataModelObject?.targetEntityType?.annotations?.UI?.HeaderInfo?.TypeName;
|
|
389
|
-
|
|
390
|
-
const parentContext = recommContexts.filter((contextInfo: RecommendationContextsInfo) => {
|
|
391
|
-
const parentContextPath = matchingContext?.context?.getBinding()?.getContext()?.getPath();
|
|
392
|
-
return parentContextPath === contextInfo.context.getPath();
|
|
393
|
-
});
|
|
394
|
-
if (parentContext.length) {
|
|
395
|
-
const contextData = parentContext[0].context.getObject();
|
|
396
|
-
// calculate keys from parent context data based on semantic keys
|
|
397
|
-
keys.forEach((key) => {
|
|
398
|
-
const value = contextData[key];
|
|
399
|
-
values.push(`${value}`);
|
|
400
|
-
});
|
|
401
|
-
prefix = `${typeName}(${values})`;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
return prefix;
|
|
406
380
|
}
|
|
407
381
|
};
|