@sapui5/sap.fe.core 1.111.1 → 1.112.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-dbg.js +4 -4
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +11 -11
- package/src/sap/fe/core/AppComponent-dbg.js +27 -5
- package/src/sap/fe/core/AppComponent.js +1 -1
- package/src/sap/fe/core/AppComponent.js.map +1 -1
- package/src/sap/fe/core/AppComponent.ts +58 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +10 -1
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +2 -1
- package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
- package/src/sap/fe/core/CommonUtils.js +1 -1
- package/src/sap/fe/core/CommonUtils.js.map +1 -1
- package/src/sap/fe/core/CommonUtils.ts +201 -478
- package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +9 -1
- package/src/sap/fe/core/PageController-dbg.js +26 -31
- package/src/sap/fe/core/PageController.js +1 -1
- package/src/sap/fe/core/PageController.js.map +1 -1
- package/src/sap/fe/core/PageController.ts +17 -3
- package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
- package/src/sap/fe/core/ResourceModel.js +6 -0
- package/src/sap/fe/core/ResourceModel.js.map +1 -0
- package/src/sap/fe/core/ResourceModel.ts +67 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +1 -0
- package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +6 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +290 -362
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
- package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
- package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
- package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
- package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
- package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
- package/src/sap/fe/core/controls/FilterBar.ts +5 -0
- package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
- package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
- package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
- package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
- package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
- package/src/sap/fe/core/fpm/Component.ts +1 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
- package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
- package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
- package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
- package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
- package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
- package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
- package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library-dbg.js +2 -2
- package/src/sap/fe/core/library-preload.js +127 -125
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.ts +7 -0
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/messagebundle.properties +33 -0
- package/src/sap/fe/core/messagebundle_ar.properties +12 -10
- package/src/sap/fe/core/messagebundle_bg.properties +11 -9
- package/src/sap/fe/core/messagebundle_ca.properties +11 -9
- package/src/sap/fe/core/messagebundle_cs.properties +11 -9
- package/src/sap/fe/core/messagebundle_cy.properties +11 -9
- package/src/sap/fe/core/messagebundle_da.properties +11 -9
- package/src/sap/fe/core/messagebundle_de.properties +3 -1
- package/src/sap/fe/core/messagebundle_el.properties +11 -9
- package/src/sap/fe/core/messagebundle_en.properties +3 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
- package/src/sap/fe/core/messagebundle_es.properties +11 -9
- package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
- package/src/sap/fe/core/messagebundle_et.properties +11 -9
- package/src/sap/fe/core/messagebundle_fi.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +11 -9
- package/src/sap/fe/core/messagebundle_hu.properties +11 -9
- package/src/sap/fe/core/messagebundle_id.properties +3 -1
- package/src/sap/fe/core/messagebundle_it.properties +11 -9
- package/src/sap/fe/core/messagebundle_iw.properties +11 -9
- package/src/sap/fe/core/messagebundle_ja.properties +11 -9
- package/src/sap/fe/core/messagebundle_kk.properties +11 -9
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +11 -9
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +12 -10
- package/src/sap/fe/core/messagebundle_nl.properties +12 -10
- package/src/sap/fe/core/messagebundle_no.properties +11 -9
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +11 -9
- package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
- package/src/sap/fe/core/messagebundle_ro.properties +3 -1
- package/src/sap/fe/core/messagebundle_ru.properties +3 -1
- package/src/sap/fe/core/messagebundle_sh.properties +11 -9
- package/src/sap/fe/core/messagebundle_sk.properties +11 -9
- package/src/sap/fe/core/messagebundle_sl.properties +11 -9
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +11 -9
- package/src/sap/fe/core/messagebundle_tr.properties +11 -9
- package/src/sap/fe/core/messagebundle_uk.properties +11 -9
- package/src/sap/fe/core/messagebundle_vi.properties +12 -10
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
- package/src/sap/fe/core/operationsHelper.js +1 -1
- package/src/sap/fe/core/operationsHelper.js.map +1 -1
- package/src/sap/fe/core/operationsHelper.ts +88 -63
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
- package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
- package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -0
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
- package/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
- package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
- package/src/sap/fe/core/type/FiscalDate.ts +2 -1
- package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +3 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -948
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
- package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
- package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
- package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
- package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
- package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
- package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
- package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
- package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
- package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
- package/src/sap/fe/core/controls/FileWrapper.js +0 -6
- package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
- package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
- package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
|
@@ -0,0 +1,905 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, ConfigurableObject, BindingToolkit, TypeGuards, BindingParser, XMLPreprocessor, JSONModel, TraceInfo) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
var isFunctionArray = TypeGuards.isFunctionArray;
|
|
10
|
+
var isContext = TypeGuards.isContext;
|
|
11
|
+
var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
|
|
12
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
13
|
+
var Placement = ConfigurableObject.Placement;
|
|
14
|
+
const LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor";
|
|
15
|
+
const XMLTEMPLATING_NS = "http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1";
|
|
16
|
+
const DOMParserInstance = new DOMParser();
|
|
17
|
+
function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
|
|
18
|
+
const oContext = mContexts[sKey];
|
|
19
|
+
const oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
|
|
20
|
+
if (oContextSettings.required === true && (!oContext || oContextObject === null)) {
|
|
21
|
+
throw new Error(`${sName}: Required metadataContext '${sKey}' is missing`);
|
|
22
|
+
} else if (oContextObject) {
|
|
23
|
+
// If context object has $kind property, $Type should not be checked
|
|
24
|
+
// Therefore remove from context settings
|
|
25
|
+
if (oContextObject.hasOwnProperty("$kind") && oContextObject.$kind !== undefined && oContextSettings.$kind !== undefined) {
|
|
26
|
+
// Check if the $kind is part of the allowed ones
|
|
27
|
+
if (oContextSettings.$kind.indexOf(oContextObject.$kind) === -1) {
|
|
28
|
+
throw new Error(`${sName}: '${sKey}' must be '$kind' '${oContextSettings["$kind"]}' but is '${oContextObject.$kind}': ${oContext.getPath()}`);
|
|
29
|
+
}
|
|
30
|
+
} else if (oContextObject.hasOwnProperty("$Type") && oContextObject.$Type !== undefined && oContextSettings.$Type) {
|
|
31
|
+
// Check only $Type
|
|
32
|
+
if (oContextSettings.$Type.indexOf(oContextObject.$Type) === -1) {
|
|
33
|
+
throw new Error(`${sName}: '${sKey}' must be '$Type' '${oContextSettings["$Type"]}' but is '${oContextObject.$Type}': ${oContext.getPath()}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validateMacroSignature(sName, oMetadata, mContexts, oNode) {
|
|
39
|
+
const aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [],
|
|
40
|
+
aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
|
|
41
|
+
oAttributeNames = {};
|
|
42
|
+
|
|
43
|
+
// collect all attributes to find unchecked properties
|
|
44
|
+
const attributeNames = oNode.getAttributeNames();
|
|
45
|
+
for (const attributeName of attributeNames) {
|
|
46
|
+
oAttributeNames[attributeName] = true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//Check metadataContexts
|
|
50
|
+
aMetadataContextKeys.forEach(function (sKey) {
|
|
51
|
+
const oContextSettings = oMetadata.metadataContexts[sKey];
|
|
52
|
+
validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey);
|
|
53
|
+
delete oAttributeNames[sKey];
|
|
54
|
+
});
|
|
55
|
+
//Check properties
|
|
56
|
+
aProperties.forEach(function (sKey) {
|
|
57
|
+
const oPropertySettings = oMetadata.properties[sKey];
|
|
58
|
+
if (!oNode.hasAttribute(sKey)) {
|
|
59
|
+
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
60
|
+
throw new Error(`${sName}: ` + `Required property '${sKey}' is missing`);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
delete oAttributeNames[sKey];
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Unchecked properties
|
|
68
|
+
Object.keys(oAttributeNames).forEach(function (sKey) {
|
|
69
|
+
// no check for properties which contain a colon ":" (different namespace), e.g. xmlns:trace, trace:macroID, unittest:id
|
|
70
|
+
if (sKey.indexOf(":") < 0 && !sKey.startsWith("xmlns")) {
|
|
71
|
+
Log.warning(`Unchecked parameter: ${sName}: ${sKey}`, undefined, LOGGER_SCOPE);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
_exports.validateMacroSignature = validateMacroSignature;
|
|
76
|
+
const SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
|
|
77
|
+
const SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Transforms the metadata of a building block by adding additional aggregations,
|
|
81
|
+
* and splitting properties into actual properties and metadata contexts.
|
|
82
|
+
*
|
|
83
|
+
* @param buildingBlockMetadata The metadata received from the input
|
|
84
|
+
* @returns The transformed metadata
|
|
85
|
+
*/
|
|
86
|
+
_exports.SAP_UI_MODEL_CONTEXT = SAP_UI_MODEL_CONTEXT;
|
|
87
|
+
function transformMetadata(buildingBlockMetadata) {
|
|
88
|
+
const properties = {};
|
|
89
|
+
const aggregations = {
|
|
90
|
+
dependents: {
|
|
91
|
+
type: SAP_UI_CORE_ELEMENT,
|
|
92
|
+
slot: "dependents"
|
|
93
|
+
},
|
|
94
|
+
customData: {
|
|
95
|
+
type: SAP_UI_CORE_ELEMENT,
|
|
96
|
+
slot: "customData"
|
|
97
|
+
},
|
|
98
|
+
...buildingBlockMetadata.aggregations
|
|
99
|
+
};
|
|
100
|
+
const metadataContexts = {};
|
|
101
|
+
for (const propertyName of Object.keys(buildingBlockMetadata.properties)) {
|
|
102
|
+
const propertyType = buildingBlockMetadata.properties[propertyName].type;
|
|
103
|
+
if (propertyType !== SAP_UI_MODEL_CONTEXT) {
|
|
104
|
+
properties[propertyName] = buildingBlockMetadata.properties[propertyName];
|
|
105
|
+
}
|
|
106
|
+
if ([SAP_UI_MODEL_CONTEXT, "object", "array"].includes(propertyType)) {
|
|
107
|
+
// Explicitly defined contexts, objects, and arrays may come from the metadataContext
|
|
108
|
+
metadataContexts[propertyName] = buildingBlockMetadata.properties[propertyName];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
...buildingBlockMetadata,
|
|
113
|
+
properties,
|
|
114
|
+
metadataContexts,
|
|
115
|
+
aggregations
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Checks the absolute or context paths and returns an appropriate MetaContext.
|
|
121
|
+
*
|
|
122
|
+
* @param oSettings Additional settings
|
|
123
|
+
* @param sAttributeValue The attribute value
|
|
124
|
+
* @returns The meta data context object
|
|
125
|
+
*/
|
|
126
|
+
function _checkAbsoluteAndContextPaths(oSettings, sAttributeValue) {
|
|
127
|
+
let sMetaPath;
|
|
128
|
+
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
129
|
+
// absolute path - we just use this one
|
|
130
|
+
sMetaPath = sAttributeValue;
|
|
131
|
+
} else {
|
|
132
|
+
let sContextPath = oSettings.currentContextPath.getPath();
|
|
133
|
+
if (!sContextPath.endsWith("/")) {
|
|
134
|
+
sContextPath += "/";
|
|
135
|
+
}
|
|
136
|
+
sMetaPath = sContextPath + sAttributeValue;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
model: "metaModel",
|
|
140
|
+
path: sMetaPath
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* This method helps to create the metadata context in case it is not yet available in the store.
|
|
146
|
+
*
|
|
147
|
+
* @param oSettings Additional settings
|
|
148
|
+
* @param sAttributeName The attribute name
|
|
149
|
+
* @param sAttributeValue The attribute value
|
|
150
|
+
* @returns The meta data context object
|
|
151
|
+
*/
|
|
152
|
+
function _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue) {
|
|
153
|
+
let returnContext;
|
|
154
|
+
if (sAttributeValue.startsWith("/uid--") && !oSettings.models.converterContext.getProperty(sAttributeValue)) {
|
|
155
|
+
const data = unstoreObjectValue(sAttributeValue);
|
|
156
|
+
oSettings.models.converterContext.setProperty(sAttributeValue, data);
|
|
157
|
+
returnContext = {
|
|
158
|
+
model: "converterContext",
|
|
159
|
+
path: sAttributeValue
|
|
160
|
+
};
|
|
161
|
+
} else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
|
|
162
|
+
returnContext = _checkAbsoluteAndContextPaths(oSettings, sAttributeValue);
|
|
163
|
+
} else if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
164
|
+
// absolute path - we just use this one
|
|
165
|
+
returnContext = {
|
|
166
|
+
model: "metaModel",
|
|
167
|
+
path: sAttributeValue
|
|
168
|
+
};
|
|
169
|
+
} else {
|
|
170
|
+
returnContext = {
|
|
171
|
+
model: "metaModel",
|
|
172
|
+
path: oSettings.bindingContexts.entitySet ? oSettings.bindingContexts.entitySet.getPath(sAttributeValue) : sAttributeValue
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return returnContext;
|
|
176
|
+
}
|
|
177
|
+
function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, isOpen) {
|
|
178
|
+
let oMetadataContext;
|
|
179
|
+
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
180
|
+
const sAttributeValue = oNode.getAttribute(sAttributeName);
|
|
181
|
+
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
182
|
+
if (!oMetadataContext) {
|
|
183
|
+
oMetadataContext = _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue);
|
|
184
|
+
}
|
|
185
|
+
} else if (oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
186
|
+
oMetadataContext = {
|
|
187
|
+
model: sAttributeName,
|
|
188
|
+
path: ""
|
|
189
|
+
};
|
|
190
|
+
} else if (isOpen) {
|
|
191
|
+
try {
|
|
192
|
+
if (oVisitor.getContext(`${sAttributeName}>`)) {
|
|
193
|
+
oMetadataContext = {
|
|
194
|
+
model: sAttributeName,
|
|
195
|
+
path: ""
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
} catch (e) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return oMetadataContext;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Parse the incoming XML node and try to resolve the properties defined there.
|
|
207
|
+
*
|
|
208
|
+
* @param oMetadata The metadata for the building block
|
|
209
|
+
* @param oNode The XML node to parse
|
|
210
|
+
* @param isPublic Whether the building block is used in a public context or not
|
|
211
|
+
* @param oVisitor The visitor instance
|
|
212
|
+
*/
|
|
213
|
+
async function processProperties(oMetadata, oNode, isPublic, oVisitor) {
|
|
214
|
+
const oDefinitionProperties = oMetadata.properties;
|
|
215
|
+
|
|
216
|
+
// Retrieve properties values
|
|
217
|
+
const aDefinitionPropertiesKeys = Object.keys(oDefinitionProperties);
|
|
218
|
+
const propertyValues = {};
|
|
219
|
+
for (const sKeyValue of aDefinitionPropertiesKeys) {
|
|
220
|
+
if (oDefinitionProperties[sKeyValue].type === "object") {
|
|
221
|
+
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue && deepClone(oDefinitionProperties[sKeyValue].defaultValue); // To avoid values being reused across macros
|
|
222
|
+
} else {
|
|
223
|
+
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
|
|
224
|
+
}
|
|
225
|
+
if (oNode.hasAttribute(sKeyValue) && isPublic && oDefinitionProperties[sKeyValue].isPublic === false) {
|
|
226
|
+
Log.error(`Property ${sKeyValue} was ignored as it is not intended for public usage`);
|
|
227
|
+
} else if (oNode.hasAttribute(sKeyValue)) {
|
|
228
|
+
await oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue));
|
|
229
|
+
let value = oNode.getAttribute(sKeyValue);
|
|
230
|
+
if (value !== undefined && value !== null) {
|
|
231
|
+
if (typeof value === "string" && !value.startsWith("{")) {
|
|
232
|
+
switch (oDefinitionProperties[sKeyValue].type) {
|
|
233
|
+
case "boolean":
|
|
234
|
+
value = value === "true";
|
|
235
|
+
break;
|
|
236
|
+
case "number":
|
|
237
|
+
value = Number(value);
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
value = value === null ? undefined : value;
|
|
242
|
+
propertyValues[sKeyValue] = value;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return propertyValues;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Parse the incoming XML node and try to resolve the binding contexts defined inside.
|
|
251
|
+
*
|
|
252
|
+
* @param oMetadata The metadata for the building block
|
|
253
|
+
* @param oSettings The settings object
|
|
254
|
+
* @param oNode The XML node to parse
|
|
255
|
+
* @param isPublic Whether the building block is used in a public context or not
|
|
256
|
+
* @param oVisitor The visitor instance
|
|
257
|
+
* @param mContexts The contexts to be used
|
|
258
|
+
* @param propertyValues The current property values
|
|
259
|
+
* @returns The processed and missing contexts
|
|
260
|
+
*/
|
|
261
|
+
function processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, propertyValues) {
|
|
262
|
+
oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
|
|
263
|
+
const mMissingContext = {};
|
|
264
|
+
const oDefinitionContexts = oMetadata.metadataContexts;
|
|
265
|
+
const aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
|
|
266
|
+
// Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
|
|
267
|
+
const contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
|
|
268
|
+
if (contextPathIndex !== -1) {
|
|
269
|
+
// If it is defined we extract it and reinsert it in the first position of the array
|
|
270
|
+
const contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
|
|
271
|
+
aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
|
|
272
|
+
}
|
|
273
|
+
for (const sAttributeName of aDefinitionContextsKeys) {
|
|
274
|
+
// If the context was resolved as a property (binding / xml aggregation) then we don't need to resolve it here.
|
|
275
|
+
const propertyValue = propertyValues[sAttributeName];
|
|
276
|
+
if (propertyValue !== undefined && typeof propertyValue === "object" && Object.keys(propertyValue).length > 0) {
|
|
277
|
+
delete oMetadata.metadataContexts[sAttributeName];
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
|
|
281
|
+
const oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen ?? false);
|
|
282
|
+
if (oMetadataContext) {
|
|
283
|
+
oMetadataContext.name = sAttributeName;
|
|
284
|
+
addSingleContext(mContexts, oVisitor, oMetadataContext);
|
|
285
|
+
if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
286
|
+
oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
|
|
287
|
+
}
|
|
288
|
+
if (sAttributeName === "contextPath") {
|
|
289
|
+
oSettings.currentContextPath = mContexts[sAttributeName];
|
|
290
|
+
}
|
|
291
|
+
if (mContexts[sAttributeName] !== undefined) {
|
|
292
|
+
propertyValues[sAttributeName] = mContexts[sAttributeName];
|
|
293
|
+
} else if (typeof propertyValues[sAttributeName] === "string") {
|
|
294
|
+
// If the binding couldn't be resolved consider that there was no value here
|
|
295
|
+
delete oMetadata.metadataContexts[sAttributeName];
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
mMissingContext[sAttributeName] = true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return mMissingContext;
|
|
302
|
+
}
|
|
303
|
+
function parseAggregation(oAggregation, processAggregations) {
|
|
304
|
+
const oOutObjects = {};
|
|
305
|
+
if (oAggregation && oAggregation.children.length > 0) {
|
|
306
|
+
const children = oAggregation.children;
|
|
307
|
+
for (let childIdx = 0; childIdx < children.length; childIdx++) {
|
|
308
|
+
const childDefinition = children[childIdx];
|
|
309
|
+
let childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
|
|
310
|
+
if (childKey) {
|
|
311
|
+
childKey = `InlineXML_${childKey}`;
|
|
312
|
+
childDefinition.setAttribute("key", childKey);
|
|
313
|
+
let aggregationObject = {
|
|
314
|
+
key: childKey,
|
|
315
|
+
position: {
|
|
316
|
+
placement: childDefinition.getAttribute("placement") || Placement.After,
|
|
317
|
+
anchor: childDefinition.getAttribute("anchor") || undefined
|
|
318
|
+
},
|
|
319
|
+
type: "Slot"
|
|
320
|
+
};
|
|
321
|
+
if (processAggregations) {
|
|
322
|
+
aggregationObject = processAggregations(childDefinition, aggregationObject);
|
|
323
|
+
}
|
|
324
|
+
oOutObjects[aggregationObject.key] = aggregationObject;
|
|
325
|
+
} else if (childDefinition.tagName !== "slot") {
|
|
326
|
+
Log.error(`The aggregation ${childDefinition.nodeName} is missing a Key attribute. It is not displayed`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return oOutObjects;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Processes the child nodes of the building block and parses them as either aggregations or object-/array-based values.
|
|
335
|
+
*
|
|
336
|
+
* @param oNode The XML node for which to process the children
|
|
337
|
+
* @param oVisitor The visitor instance
|
|
338
|
+
* @param oMetadata The metadata for the building block
|
|
339
|
+
* @param isPublic Whether the building block is used in a public context or not
|
|
340
|
+
* @param propertyValues The values of already parsed property
|
|
341
|
+
*/
|
|
342
|
+
async function processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues) {
|
|
343
|
+
const oAggregations = {};
|
|
344
|
+
if (oNode.firstElementChild !== null) {
|
|
345
|
+
let oFirstElementChild = oNode.firstElementChild;
|
|
346
|
+
while (oFirstElementChild !== null) {
|
|
347
|
+
if (oFirstElementChild.namespaceURI === XMLTEMPLATING_NS) {
|
|
348
|
+
// In case we encounter a templating tag, run the visitor on it and continue with the resulting child
|
|
349
|
+
const oParent = oFirstElementChild.parentNode;
|
|
350
|
+
if (oParent) {
|
|
351
|
+
const iChildIndex = Array.from(oParent.children).indexOf(oFirstElementChild);
|
|
352
|
+
await oVisitor.visitNode(oFirstElementChild);
|
|
353
|
+
oFirstElementChild = oParent.children[iChildIndex] ? oParent.children[iChildIndex] : null;
|
|
354
|
+
} else {
|
|
355
|
+
// Not sure how this could happen but I also don't want to create infinite loops
|
|
356
|
+
oFirstElementChild = oFirstElementChild.nextElementSibling;
|
|
357
|
+
}
|
|
358
|
+
} else {
|
|
359
|
+
const sChildName = oFirstElementChild.localName;
|
|
360
|
+
let sAggregationName = sChildName;
|
|
361
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
362
|
+
// not a sub aggregation, go back to default Aggregation
|
|
363
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
364
|
+
}
|
|
365
|
+
const aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
366
|
+
if (aggregationDefinition !== undefined && !aggregationDefinition.slot) {
|
|
367
|
+
const parsedAggregation = parseAggregation(oFirstElementChild, aggregationDefinition.processAggregations);
|
|
368
|
+
propertyValues[sAggregationName] = parsedAggregation;
|
|
369
|
+
for (const parsedAggregationKey in parsedAggregation) {
|
|
370
|
+
oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
oFirstElementChild = oFirstElementChild.nextElementSibling;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
oFirstElementChild = oNode.firstElementChild;
|
|
377
|
+
while (oFirstElementChild !== null) {
|
|
378
|
+
const oNextChild = oFirstElementChild.nextElementSibling;
|
|
379
|
+
const sChildName = oFirstElementChild.localName;
|
|
380
|
+
let sAggregationName = sChildName;
|
|
381
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
382
|
+
// not a sub aggregation, go back to default Aggregation
|
|
383
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
384
|
+
}
|
|
385
|
+
if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic === true)) {
|
|
386
|
+
const aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
387
|
+
if (!aggregationDefinition.slot && oFirstElementChild !== null && oFirstElementChild.children.length > 0) {
|
|
388
|
+
await oVisitor.visitNode(oFirstElementChild);
|
|
389
|
+
let childDefinition = oFirstElementChild.firstElementChild;
|
|
390
|
+
while (childDefinition) {
|
|
391
|
+
const nextChild = childDefinition.nextElementSibling;
|
|
392
|
+
if (!aggregationDefinition.hasVirtualNode) {
|
|
393
|
+
const childWrapper = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
|
|
394
|
+
childWrapper.appendChild(childDefinition);
|
|
395
|
+
oAggregations[childDefinition.getAttribute("key")] = childWrapper;
|
|
396
|
+
} else {
|
|
397
|
+
oAggregations[childDefinition.getAttribute("key")] = childDefinition;
|
|
398
|
+
}
|
|
399
|
+
childDefinition.removeAttribute("key");
|
|
400
|
+
childDefinition = nextChild;
|
|
401
|
+
}
|
|
402
|
+
} else if (aggregationDefinition.slot) {
|
|
403
|
+
await oVisitor.visitNode(oFirstElementChild);
|
|
404
|
+
if (sAggregationName !== sChildName) {
|
|
405
|
+
if (!oAggregations[sAggregationName]) {
|
|
406
|
+
const oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
407
|
+
oAggregations[sAggregationName] = oNewChild;
|
|
408
|
+
}
|
|
409
|
+
oAggregations[sAggregationName].appendChild(oFirstElementChild);
|
|
410
|
+
} else {
|
|
411
|
+
oAggregations[sAggregationName] = oFirstElementChild;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
} else if (Object.keys(oMetadata.properties).indexOf(sAggregationName) !== -1) {
|
|
415
|
+
await oVisitor.visitNode(oFirstElementChild);
|
|
416
|
+
if (oMetadata.properties[sAggregationName].type === "object") {
|
|
417
|
+
// Object Type properties
|
|
418
|
+
const aggregationPropertyValues = {};
|
|
419
|
+
const attributeNames = oFirstElementChild.getAttributeNames();
|
|
420
|
+
for (const attributeName of attributeNames) {
|
|
421
|
+
aggregationPropertyValues[attributeName] = oFirstElementChild.getAttribute(attributeName);
|
|
422
|
+
}
|
|
423
|
+
if (oFirstElementChild.children.length) {
|
|
424
|
+
//retrieve one level subObject properties
|
|
425
|
+
for (let childIndex = 0; childIndex < oFirstElementChild.children.length; childIndex++) {
|
|
426
|
+
const subChild = oFirstElementChild.children[childIndex];
|
|
427
|
+
const subObjectKey = subChild.localName;
|
|
428
|
+
const subObject = {};
|
|
429
|
+
const subChildAttributeNames = subChild.getAttributeNames();
|
|
430
|
+
for (const subChildAttributeName of subChildAttributeNames) {
|
|
431
|
+
subObject[subChildAttributeName] = subChild.getAttribute(subChildAttributeName);
|
|
432
|
+
}
|
|
433
|
+
aggregationPropertyValues[subObjectKey] = subObject;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
propertyValues[sAggregationName] = aggregationPropertyValues;
|
|
437
|
+
} else if (oMetadata.properties[sAggregationName].type === "array") {
|
|
438
|
+
if (oFirstElementChild !== null && oFirstElementChild.children.length > 0) {
|
|
439
|
+
const children = oFirstElementChild.children;
|
|
440
|
+
const oOutObjects = [];
|
|
441
|
+
for (let childIdx = 0; childIdx < children.length; childIdx++) {
|
|
442
|
+
const childDefinition = children[childIdx];
|
|
443
|
+
// non keyed child, just add it to the aggregation
|
|
444
|
+
const myChild = {};
|
|
445
|
+
const attributeNames = childDefinition.getAttributeNames();
|
|
446
|
+
for (const attributeName of attributeNames) {
|
|
447
|
+
myChild[attributeName] = childDefinition.getAttribute(attributeName);
|
|
448
|
+
}
|
|
449
|
+
oOutObjects.push(myChild);
|
|
450
|
+
}
|
|
451
|
+
propertyValues[sAggregationName] = oOutObjects;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
oFirstElementChild = oNextChild;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return oAggregations;
|
|
459
|
+
}
|
|
460
|
+
function processSlots(oAggregations, oMetadataAggregations, oNode) {
|
|
461
|
+
let processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
462
|
+
if (Object.keys(oAggregations).length > 0) {
|
|
463
|
+
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
464
|
+
const oAggregationElement = oAggregations[sAggregationName];
|
|
465
|
+
if (oNode !== null && oNode !== undefined && oAggregationElement) {
|
|
466
|
+
// slots can have :: as keys which is not a valid aggregation name therefore replacing them
|
|
467
|
+
const oElementChild = oAggregationElement.firstElementChild;
|
|
468
|
+
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
469
|
+
const sSlotName = oMetadataAggregations[sAggregationName] !== undefined && oMetadataAggregations[sAggregationName].slot || sAggregationName;
|
|
470
|
+
const oTargetElement = oNode.querySelector(`slot[name='${sSlotName}']`);
|
|
471
|
+
if (oTargetElement !== null) {
|
|
472
|
+
const oNewChild = prepareAggregationElement(oNode, sAggregationName, oElementChild);
|
|
473
|
+
oTargetElement.replaceWith(...oNewChild.children); // Somehow TS doesn't like this but the documentation says is should work
|
|
474
|
+
}
|
|
475
|
+
} else if (processCustomData && oElementChild !== null) {
|
|
476
|
+
const oNewChild = prepareAggregationElement(oNode, sAggregationName, oElementChild);
|
|
477
|
+
oNode.appendChild(oNewChild);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
function prepareAggregationElement(oNode, sAggregationName, oElementChild) {
|
|
484
|
+
const oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
|
|
485
|
+
while (oElementChild) {
|
|
486
|
+
const oNextChild = oElementChild.nextElementSibling;
|
|
487
|
+
oNewChild.appendChild(oElementChild);
|
|
488
|
+
oElementChild = oNextChild;
|
|
489
|
+
}
|
|
490
|
+
return oNewChild;
|
|
491
|
+
}
|
|
492
|
+
async function processBuildingBlock(BuildingBlockClass, oNode, oVisitor) {
|
|
493
|
+
let isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
494
|
+
const oMetadata = transformMetadata(BuildingBlockClass.metadata);
|
|
495
|
+
const sFragmentName = oMetadata.fragment || `${oMetadata.namespace}.${oMetadata.xmlTag || oMetadata.name}`;
|
|
496
|
+
const mContexts = {};
|
|
497
|
+
const oSettings = oVisitor.getSettings();
|
|
498
|
+
|
|
499
|
+
// Add an empty converter context if there is none in order to have a place to store object values
|
|
500
|
+
oSettings.models.converterContext ??= new JSONModel();
|
|
501
|
+
|
|
502
|
+
//Inject storage for macros
|
|
503
|
+
if (!oSettings[sFragmentName]) {
|
|
504
|
+
oSettings[sFragmentName] = {};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// First of all we need to visit the attributes to resolve the properties and the metadata contexts
|
|
508
|
+
const propertyValues = await processProperties(oMetadata, oNode, isPublic, oVisitor);
|
|
509
|
+
const initialKeys = Object.keys(propertyValues);
|
|
510
|
+
const mMissingContext = processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, propertyValues);
|
|
511
|
+
try {
|
|
512
|
+
// Aggregation and complex type support
|
|
513
|
+
const oAggregations = await processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues);
|
|
514
|
+
let oControlConfig = {};
|
|
515
|
+
if (oSettings.models.viewData) {
|
|
516
|
+
// Only used in the Field macro and even then maybe not really useful
|
|
517
|
+
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
518
|
+
}
|
|
519
|
+
let processedPropertyValues = propertyValues;
|
|
520
|
+
Object.keys(propertyValues).forEach(propName => {
|
|
521
|
+
var _BuildingBlockClass$m, _oData, _oData$isA;
|
|
522
|
+
let oData = propertyValues[propName];
|
|
523
|
+
//check for additional processing function to validate / overwrite parameters
|
|
524
|
+
const originalDefinition = BuildingBlockClass === null || BuildingBlockClass === void 0 ? void 0 : (_BuildingBlockClass$m = BuildingBlockClass.metadata) === null || _BuildingBlockClass$m === void 0 ? void 0 : _BuildingBlockClass$m.properties[propName];
|
|
525
|
+
if (originalDefinition !== null && originalDefinition !== void 0 && originalDefinition.validate) {
|
|
526
|
+
oData = originalDefinition.validate(oData) || oData;
|
|
527
|
+
}
|
|
528
|
+
if ((_oData = oData) !== null && _oData !== void 0 && (_oData$isA = _oData.isA) !== null && _oData$isA !== void 0 && _oData$isA.call(_oData, SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
|
|
529
|
+
propertyValues[propName] = oData.getObject();
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
propertyValues.isPublic = isPublic;
|
|
533
|
+
const oInstance = new BuildingBlockClass({
|
|
534
|
+
...propertyValues,
|
|
535
|
+
...oAggregations
|
|
536
|
+
}, oControlConfig, oSettings);
|
|
537
|
+
processedPropertyValues = oInstance.getProperties();
|
|
538
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
|
|
539
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
540
|
+
const targetObject = processedPropertyValues[sContextName];
|
|
541
|
+
if (typeof targetObject === "object" && !isContext(targetObject)) {
|
|
542
|
+
const attributeValue = storeObjectValue(targetObject);
|
|
543
|
+
oSettings.models.converterContext.setProperty(attributeValue, targetObject);
|
|
544
|
+
const newContext = oSettings.models.converterContext.createBindingContext(attributeValue);
|
|
545
|
+
unstoreObjectValue(attributeValue);
|
|
546
|
+
mContexts[sContextName] = newContext;
|
|
547
|
+
} else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
|
|
548
|
+
mContexts[sContextName] = targetObject;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
const oAttributesModel = new AttributeModel(oNode, processedPropertyValues, BuildingBlockClass);
|
|
553
|
+
mContexts["this"] = oAttributesModel.createBindingContext("/");
|
|
554
|
+
let oPreviousMacroInfo;
|
|
555
|
+
|
|
556
|
+
// Keep track
|
|
557
|
+
if (TraceInfo.isTraceInfoActive()) {
|
|
558
|
+
const oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
|
|
559
|
+
if (oTraceInfo !== null && oTraceInfo !== void 0 && oTraceInfo.macroInfo) {
|
|
560
|
+
oPreviousMacroInfo = oSettings["_macroInfo"];
|
|
561
|
+
oSettings["_macroInfo"] = oTraceInfo.macroInfo;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
|
|
565
|
+
const oContextVisitor = oVisitor.with(mContexts, oMetadata.isOpen !== undefined ? !oMetadata.isOpen : true);
|
|
566
|
+
const oParent = oNode.parentNode;
|
|
567
|
+
let iChildIndex;
|
|
568
|
+
let oPromise;
|
|
569
|
+
if (oParent) {
|
|
570
|
+
iChildIndex = Array.from(oParent.children).indexOf(oNode);
|
|
571
|
+
if (oMetadata.fragment) {
|
|
572
|
+
oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
|
|
573
|
+
} else {
|
|
574
|
+
const templateString = await oInstance.getTemplate(oNode);
|
|
575
|
+
if (BuildingBlockClass.isRuntime) {
|
|
576
|
+
// For runtime building blocks, we need to attach all objects to the converterContext directly, as the actual rendering takes place at runtime
|
|
577
|
+
for (const storeKey in temporaryObjectStore) {
|
|
578
|
+
const data = unstoreObjectValue(storeKey);
|
|
579
|
+
oSettings.models.converterContext.setProperty(storeKey, data);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
let hasError = "";
|
|
583
|
+
if (templateString) {
|
|
584
|
+
let hasParseError = false;
|
|
585
|
+
let parsedTemplate = parseXMLString(templateString, true);
|
|
586
|
+
// For safety purpose we try to detect trailing text in between XML Tags
|
|
587
|
+
for (const element of parsedTemplate) {
|
|
588
|
+
const iter = document.createNodeIterator(element, NodeFilter.SHOW_TEXT);
|
|
589
|
+
let textnode = iter.nextNode();
|
|
590
|
+
if (element.localName === "parsererror") {
|
|
591
|
+
hasParseError = true;
|
|
592
|
+
}
|
|
593
|
+
while (textnode) {
|
|
594
|
+
if (textnode.textContent && textnode.textContent.trim().length > 0) {
|
|
595
|
+
hasError = textnode.textContent;
|
|
596
|
+
}
|
|
597
|
+
textnode = iter.nextNode();
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
if (hasParseError) {
|
|
601
|
+
// If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
|
|
602
|
+
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
603
|
+
// If an error is found it's returned instead of the normal fragment
|
|
604
|
+
Log.error(`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`);
|
|
605
|
+
parsedTemplate = await processXmlInTrace(async () => {
|
|
606
|
+
var _oInstance$getTemplat;
|
|
607
|
+
const initialTemplate = await ((_oInstance$getTemplat = oInstance.getTemplate) === null || _oInstance$getTemplat === void 0 ? void 0 : _oInstance$getTemplat.call(oInstance, oNode));
|
|
608
|
+
return parseXMLString(initialTemplate ?? "", true);
|
|
609
|
+
});
|
|
610
|
+
} else if (hasError.length > 0) {
|
|
611
|
+
// If there is trailing text we create a standard error and display it.
|
|
612
|
+
Log.error(`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`);
|
|
613
|
+
const oErrorText = createErrorXML([`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`, `Trailing text was found in the XML: ${hasError}`], parsedTemplate.map(template => template.outerHTML).join("\n"));
|
|
614
|
+
parsedTemplate = parseXMLString(oErrorText, true);
|
|
615
|
+
}
|
|
616
|
+
oNode.replaceWith(...parsedTemplate);
|
|
617
|
+
oNode = oParent.children[iChildIndex];
|
|
618
|
+
processSlots(oAggregations, oMetadata.aggregations, oNode, false);
|
|
619
|
+
oPromise = oContextVisitor.visitNode(oNode);
|
|
620
|
+
} else {
|
|
621
|
+
oNode.remove();
|
|
622
|
+
oPromise = Promise.resolve();
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
await oPromise;
|
|
626
|
+
const oMacroElement = oParent.children[iChildIndex];
|
|
627
|
+
processSlots(oAggregations, oMetadata.aggregations, oMacroElement, true);
|
|
628
|
+
if (oMacroElement !== undefined) {
|
|
629
|
+
const oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
630
|
+
oRemainingSlots.forEach(function (oSlotElement) {
|
|
631
|
+
oSlotElement.remove();
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (oPreviousMacroInfo) {
|
|
636
|
+
//restore macro info if available
|
|
637
|
+
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
638
|
+
} else {
|
|
639
|
+
delete oSettings["_macroInfo"];
|
|
640
|
+
}
|
|
641
|
+
} catch (e) {
|
|
642
|
+
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
643
|
+
const traceDetails = {
|
|
644
|
+
initialProperties: {},
|
|
645
|
+
resolvedProperties: {},
|
|
646
|
+
missingContexts: mMissingContext
|
|
647
|
+
};
|
|
648
|
+
for (const propertyName of initialKeys) {
|
|
649
|
+
const propertyValue = propertyValues[propertyName];
|
|
650
|
+
if (isContext(propertyValue)) {
|
|
651
|
+
traceDetails.initialProperties[propertyName] = {
|
|
652
|
+
path: propertyValue.getPath(),
|
|
653
|
+
value: propertyValue.getObject()
|
|
654
|
+
};
|
|
655
|
+
} else {
|
|
656
|
+
traceDetails.initialProperties[propertyName] = propertyValue;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
for (const propertyName in propertyValues) {
|
|
660
|
+
const propertyValue = propertyValues[propertyName];
|
|
661
|
+
if (!initialKeys.includes(propertyName)) {
|
|
662
|
+
if (isContext(propertyValue)) {
|
|
663
|
+
traceDetails.resolvedProperties[propertyName] = {
|
|
664
|
+
path: propertyValue.getPath(),
|
|
665
|
+
value: propertyValue.getObject()
|
|
666
|
+
};
|
|
667
|
+
} else {
|
|
668
|
+
traceDetails.resolvedProperties[propertyName] = propertyValue;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
Log.error(e);
|
|
673
|
+
const oError = createErrorXML([`Error while processing building block ${oMetadata.name}`], oNode.outerHTML, traceDetails, e.stack);
|
|
674
|
+
const oTemplate = parseXMLString(oError, true);
|
|
675
|
+
oNode.replaceWith(...oTemplate);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
function addSingleContext(mContexts, oVisitor, oCtx) {
|
|
679
|
+
const sKey = oCtx.name || oCtx.model || undefined;
|
|
680
|
+
if (mContexts[sKey]) {
|
|
681
|
+
return; // do not add twice
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
try {
|
|
685
|
+
let sContextPath = oCtx.path;
|
|
686
|
+
if (oCtx.model !== null) {
|
|
687
|
+
sContextPath = `${oCtx.model}>${sContextPath}`;
|
|
688
|
+
}
|
|
689
|
+
const mSetting = oVisitor.getSettings();
|
|
690
|
+
if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
|
|
691
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path /*, mSetting.bindingContexts[oCtx.model]*/); // add the context to the visitor
|
|
692
|
+
} else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
|
|
693
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
|
|
694
|
+
} else {
|
|
695
|
+
mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
|
|
696
|
+
}
|
|
697
|
+
} catch (ex) {
|
|
698
|
+
// ignore the context as this can only be the case if the model is not ready,
|
|
699
|
+
// i.e. not a preprocessing model but maybe a model for providing afterwards
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Register a building block definition to be used inside the xml template processor.
|
|
705
|
+
*
|
|
706
|
+
* @param BuildingBlockClass The building block definition
|
|
707
|
+
*/
|
|
708
|
+
function registerBuildingBlock(BuildingBlockClass) {
|
|
709
|
+
XMLPreprocessor.plugIn(async (oNode, oVisitor) => processBuildingBlock(BuildingBlockClass, oNode, oVisitor), BuildingBlockClass.metadata.namespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
|
|
710
|
+
if (BuildingBlockClass.metadata.publicNamespace) {
|
|
711
|
+
XMLPreprocessor.plugIn(async (oNode, oVisitor) => processBuildingBlock(BuildingBlockClass, oNode, oVisitor, true), BuildingBlockClass.metadata.publicNamespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/**
|
|
716
|
+
* UnRegister a building block definition so that it is no longer used inside the xml template processor.
|
|
717
|
+
*
|
|
718
|
+
* @param BuildingBlockClass The building block definition
|
|
719
|
+
*/
|
|
720
|
+
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
721
|
+
function unregisterBuildingBlock(BuildingBlockClass) {
|
|
722
|
+
if (BuildingBlockClass.metadata.namespace !== undefined) {
|
|
723
|
+
XMLPreprocessor.plugIn(null, BuildingBlockClass.metadata.namespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
|
|
724
|
+
}
|
|
725
|
+
if (BuildingBlockClass.metadata.publicNamespace !== undefined) {
|
|
726
|
+
XMLPreprocessor.plugIn(null, BuildingBlockClass.metadata.publicNamespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
_exports.unregisterBuildingBlock = unregisterBuildingBlock;
|
|
730
|
+
function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
|
|
731
|
+
const errorLabels = errorMessages.map(errorMessage => xml`<m:Label text="${escapeXMLAttributeValue(errorMessage)}"/>`);
|
|
732
|
+
let errorStack = "";
|
|
733
|
+
if (stack) {
|
|
734
|
+
const stackFormatted = btoa(`<pre>${stack}</pre>`);
|
|
735
|
+
errorStack = xml`<m:FormattedText htmlText="${`{= BBF.base64Decode('${stackFormatted}') }`}" />`;
|
|
736
|
+
}
|
|
737
|
+
let additionalText = "";
|
|
738
|
+
if (additionalData) {
|
|
739
|
+
additionalText = xml`<m:VBox>
|
|
740
|
+
<m:Label text="Trace Info"/>
|
|
741
|
+
<code:CodeEditor type="json" value="${`{= BBF.base64Decode('${btoa(JSON.stringify(additionalData, null, 4))}') }`}" height="300px" />
|
|
742
|
+
</m:VBox>`;
|
|
743
|
+
}
|
|
744
|
+
return xml`<controls:FormElementWrapper xmlns:controls="sap.fe.core.controls">
|
|
745
|
+
<m:VBox xmlns:m="sap.m" xmlns:code="sap.ui.codeeditor" core:require="{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}">
|
|
746
|
+
${errorLabels}
|
|
747
|
+
${errorStack}
|
|
748
|
+
<grid:CSSGrid gridTemplateRows="fr" gridTemplateColumns="repeat(2,1fr)" gridGap="1rem" xmlns:grid="sap.ui.layout.cssgrid" >
|
|
749
|
+
<m:VBox>
|
|
750
|
+
<m:Label text="How the building block was called"/>
|
|
751
|
+
<code:CodeEditor type="xml" value="${`{= BBF.base64Decode('${btoa(xmlFragment.replaceAll(">", ">"))}') }`}" height="300px" />
|
|
752
|
+
</m:VBox>
|
|
753
|
+
${additionalText}
|
|
754
|
+
</grid:CSSGrid>
|
|
755
|
+
</m:VBox>
|
|
756
|
+
</controls:FormElementWrapper>`;
|
|
757
|
+
}
|
|
758
|
+
const temporaryObjectStore = {};
|
|
759
|
+
|
|
760
|
+
/**
|
|
761
|
+
* Stores an object value in a temporary storage and returns an ID used to retrieve this value at a later point in time.
|
|
762
|
+
*
|
|
763
|
+
* Required as there is functionality like the xml` function, which might take objects as parameters but needs to return a serialized string.
|
|
764
|
+
*
|
|
765
|
+
* @param value Value to store
|
|
766
|
+
* @returns ID to retrieve this value
|
|
767
|
+
*/
|
|
768
|
+
function storeObjectValue(value) {
|
|
769
|
+
const propertyUID = `/uid--${uid()}`;
|
|
770
|
+
temporaryObjectStore[propertyUID] = value;
|
|
771
|
+
return propertyUID;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/**
|
|
775
|
+
* Unstores an object from a temporary store by removing it and returning its object value.
|
|
776
|
+
*
|
|
777
|
+
* @param propertyUID ID to retrieve this value
|
|
778
|
+
* @returns Object value
|
|
779
|
+
*/
|
|
780
|
+
function unstoreObjectValue(propertyUID) {
|
|
781
|
+
const value = temporaryObjectStore[propertyUID];
|
|
782
|
+
delete temporaryObjectStore[propertyUID];
|
|
783
|
+
return value;
|
|
784
|
+
}
|
|
785
|
+
let processNextXmlInTrace = false;
|
|
786
|
+
/**
|
|
787
|
+
* Makes sure that all xml` calls inside the given method are processed in trace mode.
|
|
788
|
+
*
|
|
789
|
+
* @param method The method to execute
|
|
790
|
+
* @returns The return value of the given method
|
|
791
|
+
*/
|
|
792
|
+
const processXmlInTrace = function (method) {
|
|
793
|
+
processNextXmlInTrace = true;
|
|
794
|
+
let returnValue;
|
|
795
|
+
try {
|
|
796
|
+
returnValue = method();
|
|
797
|
+
} finally {
|
|
798
|
+
processNextXmlInTrace = false;
|
|
799
|
+
}
|
|
800
|
+
return returnValue;
|
|
801
|
+
};
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* Parse an XML string and return the associated document.
|
|
805
|
+
*
|
|
806
|
+
* @param xmlString The xml string
|
|
807
|
+
* @param [addDefaultNamespaces] Whether or not default namespaces should be added
|
|
808
|
+
* @returns The XML document.
|
|
809
|
+
*/
|
|
810
|
+
function parseXMLString(xmlString) {
|
|
811
|
+
var _output2, _output3;
|
|
812
|
+
let addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
813
|
+
if (addDefaultNamespaces) {
|
|
814
|
+
xmlString = `<template
|
|
815
|
+
xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
|
|
816
|
+
xmlns:m="sap.m"
|
|
817
|
+
xmlns:macros="sap.fe.macros"
|
|
818
|
+
xmlns:core="sap.ui.core"
|
|
819
|
+
xmlns:mdc="sap.ui.mdc"
|
|
820
|
+
xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1">${xmlString}</template>`;
|
|
821
|
+
}
|
|
822
|
+
const xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
823
|
+
let output = xmlDocument.firstElementChild;
|
|
824
|
+
while (((_output = output) === null || _output === void 0 ? void 0 : _output.localName) === "template") {
|
|
825
|
+
var _output;
|
|
826
|
+
output = output.firstElementChild;
|
|
827
|
+
}
|
|
828
|
+
const children = (_output2 = output) !== null && _output2 !== void 0 && _output2.parentElement ? (_output3 = output) === null || _output3 === void 0 ? void 0 : _output3.parentElement.children : [output];
|
|
829
|
+
return Array.from(children);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Escape an XML attribute value.
|
|
834
|
+
*
|
|
835
|
+
* @param value The attribute value to escape.
|
|
836
|
+
* @returns The escaped string.
|
|
837
|
+
*/
|
|
838
|
+
_exports.parseXMLString = parseXMLString;
|
|
839
|
+
function escapeXMLAttributeValue(value) {
|
|
840
|
+
return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
|
|
841
|
+
}
|
|
842
|
+
_exports.escapeXMLAttributeValue = escapeXMLAttributeValue;
|
|
843
|
+
function renderInTraceMode(outStr) {
|
|
844
|
+
var _xmlResult$;
|
|
845
|
+
const xmlResult = parseXMLString(outStr, true);
|
|
846
|
+
if ((xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.length) > 0 && ((_xmlResult$ = xmlResult[0]) === null || _xmlResult$ === void 0 ? void 0 : _xmlResult$.localName) === "parsererror") {
|
|
847
|
+
const errorMessage = xmlResult[0].innerText || xmlResult[0].innerHTML;
|
|
848
|
+
return createErrorXML([errorMessage.split("\n")[0]], outStr);
|
|
849
|
+
} else {
|
|
850
|
+
return outStr;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Create a string representation of the template literal while handling special object case.
|
|
855
|
+
*
|
|
856
|
+
* @param strings The string parts of the template literal
|
|
857
|
+
* @param values The values part of the template literal
|
|
858
|
+
* @returns The XML string document representing the string that was used.
|
|
859
|
+
*/
|
|
860
|
+
const xml = function (strings) {
|
|
861
|
+
let outStr = "";
|
|
862
|
+
let i;
|
|
863
|
+
for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
864
|
+
values[_key - 1] = arguments[_key];
|
|
865
|
+
}
|
|
866
|
+
for (i = 0; i < values.length; i++) {
|
|
867
|
+
outStr += strings[i];
|
|
868
|
+
|
|
869
|
+
// Handle the different case of object, if it's an array we join them, if it's a binding expression then we compile it.
|
|
870
|
+
const value = values[i];
|
|
871
|
+
if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
872
|
+
outStr += value.flat(5).join("\n").trim();
|
|
873
|
+
} else if (isFunctionArray(value)) {
|
|
874
|
+
outStr += value.map(valuefn => valuefn()).join("\n");
|
|
875
|
+
} else if (isBindingToolkitExpression(value)) {
|
|
876
|
+
const compiledExpression = compileExpression(value);
|
|
877
|
+
outStr += escapeXMLAttributeValue(compiledExpression);
|
|
878
|
+
} else if (typeof value === "undefined") {
|
|
879
|
+
outStr += "{this>undefinedValue}";
|
|
880
|
+
} else if (typeof value === "function") {
|
|
881
|
+
outStr += value();
|
|
882
|
+
} else if (typeof value === "object" && value !== null) {
|
|
883
|
+
if (isContext(value)) {
|
|
884
|
+
outStr += value.getPath();
|
|
885
|
+
} else {
|
|
886
|
+
const propertyUId = storeObjectValue(value);
|
|
887
|
+
outStr += `${propertyUId}`;
|
|
888
|
+
}
|
|
889
|
+
} else if (value && typeof value === "string" && !value.startsWith("<") && !value.startsWith("<")) {
|
|
890
|
+
outStr += escapeXMLAttributeValue(value);
|
|
891
|
+
} else {
|
|
892
|
+
outStr += value;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
outStr += strings[i];
|
|
896
|
+
outStr = outStr.trim();
|
|
897
|
+
if (processNextXmlInTrace) {
|
|
898
|
+
return renderInTraceMode(outStr);
|
|
899
|
+
}
|
|
900
|
+
return outStr;
|
|
901
|
+
};
|
|
902
|
+
_exports.xml = xml;
|
|
903
|
+
return _exports;
|
|
904
|
+
}, false);
|
|
905
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImluZGV4T2YiLCJnZXRQYXRoIiwiJFR5cGUiLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib01ldGFkYXRhIiwib05vZGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsIm1ldGFkYXRhQ29udGV4dHMiLCJPYmplY3QiLCJrZXlzIiwiYVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlTmFtZXMiLCJnZXRBdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWUiLCJmb3JFYWNoIiwib1Byb3BlcnR5U2V0dGluZ3MiLCJoYXNBdHRyaWJ1dGUiLCJzdGFydHNXaXRoIiwiTG9nIiwid2FybmluZyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsInRyYW5zZm9ybU1ldGFkYXRhIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwiYWdncmVnYXRpb25zIiwiZGVwZW5kZW50cyIsInR5cGUiLCJzbG90IiwiY3VzdG9tRGF0YSIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VHlwZSIsImluY2x1ZGVzIiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJvU2V0dGluZ3MiLCJzQXR0cmlidXRlVmFsdWUiLCJzTWV0YVBhdGgiLCJzQ29udGV4dFBhdGgiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0Iiwic0F0dHJpYnV0ZU5hbWUiLCJyZXR1cm5Db250ZXh0IiwibW9kZWxzIiwiY29udmVydGVyQ29udGV4dCIsImdldFByb3BlcnR5IiwiZGF0YSIsInVuc3RvcmVPYmplY3RWYWx1ZSIsInNldFByb3BlcnR5IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsIm9WaXNpdG9yIiwiYkRvTm90UmVzb2x2ZSIsImlzT3BlbiIsIm9NZXRhZGF0YUNvbnRleHQiLCJnZXRBdHRyaWJ1dGUiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImdldENvbnRleHQiLCJlIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJpc1B1YmxpYyIsIm9EZWZpbml0aW9uUHJvcGVydGllcyIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJwcm9wZXJ0eVZhbHVlcyIsInNLZXlWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImRlZXBDbG9uZSIsImVycm9yIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidmFsdWUiLCJOdW1iZXIiLCJwcm9jZXNzQ29udGV4dHMiLCJjb250ZXh0UGF0aCIsIm1NaXNzaW5nQ29udGV4dCIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsImNvbnRleHRQYXRoSW5kZXgiLCJjb250ZXh0UGF0aERlZmluaXRpb24iLCJzcGxpY2UiLCJwcm9wZXJ0eVZhbHVlIiwibGVuZ3RoIiwibmFtZSIsImFkZFNpbmdsZUNvbnRleHQiLCJwYXJzZUFnZ3JlZ2F0aW9uIiwib0FnZ3JlZ2F0aW9uIiwicHJvY2Vzc0FnZ3JlZ2F0aW9ucyIsIm9PdXRPYmplY3RzIiwiY2hpbGRyZW4iLCJjaGlsZElkeCIsImNoaWxkRGVmaW5pdGlvbiIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwiYWdncmVnYXRpb25PYmplY3QiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiYW5jaG9yIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwibmFtZXNwYWNlVVJJIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIkFycmF5IiwiZnJvbSIsInZpc2l0Tm9kZSIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJsb2NhbE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5Iiwib05leHRDaGlsZCIsIm5leHRDaGlsZCIsImhhc1ZpcnR1YWxOb2RlIiwiY2hpbGRXcmFwcGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsImFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXMiLCJjaGlsZEluZGV4Iiwic3ViQ2hpbGQiLCJzdWJPYmplY3RLZXkiLCJzdWJPYmplY3QiLCJzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzIiwic3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIiwibXlDaGlsZCIsInB1c2giLCJwcm9jZXNzU2xvdHMiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudCIsInJlcGxhY2VXaXRoIiwicmVwbGFjZSIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwibWV0YWRhdGEiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJ4bWxUYWciLCJnZXRTZXR0aW5ncyIsIkpTT05Nb2RlbCIsImluaXRpYWxLZXlzIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwicHJvcE5hbWUiLCJvRGF0YSIsIm9yaWdpbmFsRGVmaW5pdGlvbiIsInZhbGlkYXRlIiwiaXNBIiwiZ2V0TW9kZWwiLCJvSW5zdGFuY2UiLCJnZXRQcm9wZXJ0aWVzIiwic0NvbnRleHROYW1lIiwidGFyZ2V0T2JqZWN0IiwiaXNDb250ZXh0IiwiYXR0cmlidXRlVmFsdWUiLCJzdG9yZU9iamVjdFZhbHVlIiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJ0ZW1wbGF0ZVN0cmluZyIsImdldFRlbXBsYXRlIiwiaXNSdW50aW1lIiwic3RvcmVLZXkiLCJ0ZW1wb3JhcnlPYmplY3RTdG9yZSIsImhhc0Vycm9yIiwiaGFzUGFyc2VFcnJvciIsInBhcnNlZFRlbXBsYXRlIiwicGFyc2VYTUxTdHJpbmciLCJlbGVtZW50IiwiaXRlciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwicHJvY2Vzc1htbEluVHJhY2UiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJtYXAiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwicHVibGljTmFtZXNwYWNlIiwidW5yZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwicHJvY2Vzc05leHRYbWxJblRyYWNlIiwibWV0aG9kIiwicmV0dXJuVmFsdWUiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0IiwicGFyZW50RWxlbWVudCIsInJlbmRlckluVHJhY2VNb2RlIiwib3V0U3RyIiwieG1sUmVzdWx0IiwiaW5uZXJUZXh0IiwiaW5uZXJIVE1MIiwic3BsaXQiLCJzdHJpbmdzIiwiaSIsInZhbHVlcyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tCYXNlXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgaXNDb250ZXh0LCBpc0Z1bmN0aW9uQXJyYXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvLCBUcmFjZU1ldGFkYXRhQ29udGV4dCB9IGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmNvbnN0IFhNTFRFTVBMQVRJTkdfTlMgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgJiB7XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIG1ldGEgZGF0YSBjb250ZXh0XG4gKi9cbnR5cGUgTWV0YURhdGFDb250ZXh0ID0ge1xuXHRuYW1lPzogc3RyaW5nO1xuXHRtb2RlbDogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRjdXJyZW50Q29udGV4dFBhdGg6IENvbnRleHQ7XG5cdGlzUHVibGljOiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0bW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gJiB7XG5cdFx0Y29udmVydGVyQ29udGV4dDogSlNPTk1vZGVsO1xuXHRcdHZpZXdEYXRhOiBKU09OTW9kZWw7XG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcInNhcC5mZS5pMThuXCI/OiBSZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgJGtpbmQgaXMgcGFydCBvZiB0aGUgYWxsb3dlZCBvbmVzXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4ka2luZC5pbmRleE9mKG9Db250ZXh0T2JqZWN0LiRraW5kKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0T2JqZWN0LiRUeXBlICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy4kVHlwZSkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJFR5cGUuaW5kZXhPZihvQ29udGV4dE9iamVjdC4kVHlwZSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdG9Ob2RlOiBFbGVtZW50XG4pIHtcblx0Y29uc3QgYU1ldGFkYXRhQ29udGV4dEtleXMgPSAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpKSB8fCBbXSxcblx0XHRhUHJvcGVydGllcyA9IChvTWV0YWRhdGEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykpIHx8IFtdLFxuXHRcdG9BdHRyaWJ1dGVOYW1lczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuXHQvLyBjb2xsZWN0IGFsbCBhdHRyaWJ1dGVzIHRvIGZpbmQgdW5jaGVja2VkIHByb3BlcnRpZXNcblx0Y29uc3QgYXR0cmlidXRlTmFtZXMgPSBvTm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRvQXR0cmlidXRlTmFtZXNbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXHR9XG5cblx0Ly9DaGVjayBtZXRhZGF0YUNvbnRleHRzXG5cdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV07XG5cdFx0aWYgKCFvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkpIHtcblx0XHRcdGlmIChvUHJvcGVydHlTZXR0aW5ncy5yZXF1aXJlZCAmJiAhb1Byb3BlcnR5U2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogYCArIGBSZXF1aXJlZCBwcm9wZXJ0eSAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gVW5jaGVja2VkIHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMob0F0dHJpYnV0ZU5hbWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHQvLyBubyBjaGVjayBmb3IgcHJvcGVydGllcyB3aGljaCBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+ID0ge1xuXHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImRlcGVuZGVudHNcIlxuXHRcdH0sXG5cdFx0Y3VzdG9tRGF0YToge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiY3VzdG9tRGF0YVwiXG5cdFx0fSxcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zXG5cdH07XG5cdGNvbnN0IG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlO1xuXG5cdFx0aWYgKHByb3BlcnR5VHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXG5cdFx0aWYgKFtTQVBfVUlfTU9ERUxfQ09OVEVYVCwgXCJvYmplY3RcIiwgXCJhcnJheVwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpKSB7XG5cdFx0XHQvLyBFeHBsaWNpdGx5IGRlZmluZWQgY29udGV4dHMsIG9iamVjdHMsIGFuZCBhcnJheXMgbWF5IGNvbWUgZnJvbSB0aGUgbWV0YWRhdGFDb250ZXh0XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzW3Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0bWV0YWRhdGFDb250ZXh0cyxcblx0XHRhZ2dyZWdhdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGFic29sdXRlIG9yIGNvbnRleHQgcGF0aHMgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgTWV0YUNvbnRleHQuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRwYXRoOiBzTWV0YVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBoZWxwcyB0byBjcmVhdGUgdGhlIG1ldGFkYXRhIGNvbnRleHQgaW4gY2FzZSBpdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBzQXR0cmlidXRlTmFtZSwgc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbikge1xuXHRjb25zdCBvRGVmaW5pdGlvblByb3BlcnRpZXMgPSBvTWV0YWRhdGEucHJvcGVydGllcztcblxuXHQvLyBSZXRyaWV2ZSBwcm9wZXJ0aWVzIHZhbHVlc1xuXHRjb25zdCBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMob0RlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9XG5cdFx0XHRcdG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSAmJiBkZWVwQ2xvbmUob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHR9XG5cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uaXNQdWJsaWMgPT09IGZhbHNlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVZhbHVlcztcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBiaW5kaW5nIGNvbnRleHRzIGRlZmluZWQgaW5zaWRlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvU2V0dGluZ3MgVGhlIHNldHRpbmdzIG9iamVjdFxuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIG1Db250ZXh0cyBUaGUgY29udGV4dHMgdG8gYmUgdXNlZFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlc1xuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBhbmQgbWlzc2luZyBjb250ZXh0c1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29udGV4dHMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPlxuKSB7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0Y29uc3QgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Ly8gU2luY2UgdGhlIG1ldGFQYXRoIGFuZCBvdGhlciBwcm9wZXJ0eSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHRQYXRoIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29udGV4dFBhdGggZmlyc3Rcblx0Y29uc3QgY29udGV4dFBhdGhJbmRleCA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLmluZGV4T2YoXCJjb250ZXh0UGF0aFwiKTtcblx0aWYgKGNvbnRleHRQYXRoSW5kZXggIT09IC0xKSB7XG5cdFx0Ly8gSWYgaXQgaXMgZGVmaW5lZCB3ZSBleHRyYWN0IGl0IGFuZCByZWluc2VydCBpdCBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGFycmF5XG5cdFx0Y29uc3QgY29udGV4dFBhdGhEZWZpbml0aW9uID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKGNvbnRleHRQYXRoSW5kZXgsIDEpO1xuXHRcdGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNwbGljZSgwLCAwLCBjb250ZXh0UGF0aERlZmluaXRpb25bMF0pO1xuXHR9XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHQvLyBJZiB0aGUgY29udGV4dCB3YXMgcmVzb2x2ZWQgYXMgYSBwcm9wZXJ0eSAoYmluZGluZyAvIHhtbCBhZ2dyZWdhdGlvbikgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJlc29sdmUgaXQgaGVyZS5cblx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZSBhcyBvYmplY3QpLmxlbmd0aCA+IDApIHtcblx0XHRcdGRlbGV0ZSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Y29uc3QgYkRvTm90UmVzb2x2ZSA9IGlzUHVibGljICYmIG9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljID09PSBmYWxzZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpO1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHQgPSBfZ2V0TWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgb05vZGUsIHNBdHRyaWJ1dGVOYW1lLCBvVmlzaXRvciwgYkRvTm90UmVzb2x2ZSwgb01ldGFkYXRhLmlzT3BlbiA/PyBmYWxzZSk7XG5cdFx0aWYgKG9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQubmFtZSA9IHNBdHRyaWJ1dGVOYW1lO1xuXHRcdFx0YWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHMsIG9WaXNpdG9yLCBvTWV0YWRhdGFDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpICYmXG5cdFx0XHRcdCFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvdWxkbid0IGJlIHJlc29sdmVkIGNvbnNpZGVyIHRoYXQgdGhlcmUgd2FzIG5vIHZhbHVlIGhlcmVcblx0XHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtTWlzc2luZ0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0a2V5OiBzdHJpbmc7XG5cdHBvc2l0aW9uOiBQb3NpdGlvbjtcblx0dHlwZTogXCJTbG90XCI7XG59O1xuZnVuY3Rpb24gcGFyc2VBZ2dyZWdhdGlvbihvQWdncmVnYXRpb24/OiBFbGVtZW50LCBwcm9jZXNzQWdncmVnYXRpb25zPzogRnVuY3Rpb24pIHtcblx0Y29uc3Qgb091dE9iamVjdHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4gPSB7fTtcblx0aWYgKG9BZ2dyZWdhdGlvbiAmJiBvQWdncmVnYXRpb24uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXHRcdFx0aWYgKGNoaWxkS2V5KSB7XG5cdFx0XHRcdGNoaWxkS2V5ID0gYElubGluZVhNTF8ke2NoaWxkS2V5fWA7XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGUoXCJrZXlcIiwgY2hpbGRLZXkpO1xuXHRcdFx0XHRsZXQgYWdncmVnYXRpb25PYmplY3Q6IEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0XHRcdFx0XHRrZXk6IGNoaWxkS2V5LFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IChjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwicGxhY2VtZW50XCIpIGFzIFBsYWNlbWVudCkgfHwgUGxhY2VtZW50LkFmdGVyLFxuXHRcdFx0XHRcdFx0YW5jaG9yOiBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiYW5jaG9yXCIpIHx8IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHlwZTogXCJTbG90XCJcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHByb2Nlc3NBZ2dyZWdhdGlvbnMpIHtcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbk9iamVjdCA9IHByb2Nlc3NBZ2dyZWdhdGlvbnMoY2hpbGREZWZpbml0aW9uLCBhZ2dyZWdhdGlvbk9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b091dE9iamVjdHNbYWdncmVnYXRpb25PYmplY3Qua2V5XSA9IGFnZ3JlZ2F0aW9uT2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChjaGlsZERlZmluaXRpb24udGFnTmFtZSAhPT0gXCJzbG90XCIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBUaGUgYWdncmVnYXRpb24gJHtjaGlsZERlZmluaXRpb24ubm9kZU5hbWV9IGlzIG1pc3NpbmcgYSBLZXkgYXR0cmlidXRlLiBJdCBpcyBub3QgZGlzcGxheWVkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIGZvciB3aGljaCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlblxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSB2YWx1ZXMgb2YgYWxyZWFkeSBwYXJzZWQgcHJvcGVydHlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+XG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblxuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQubmFtZXNwYWNlVVJJID09PSBYTUxURU1QTEFUSU5HX05TKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRcdGNvbnN0IG9QYXJlbnQgPSBvRmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdFx0aWYgKG9QYXJlbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdID8gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gOiBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE5vdCBzdXJlIGhvdyB0aGlzIGNvdWxkIGhhcHBlbiBidXQgSSBhbHNvIGRvbid0IHdhbnQgdG8gY3JlYXRlIGluZmluaXRlIGxvb3BzXG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCwgYWdncmVnYXRpb25EZWZpbml0aW9uLnByb2Nlc3NBZ2dyZWdhdGlvbnMpO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gcGFyc2VkQWdncmVnYXRpb247XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbktleSBpbiBwYXJzZWRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdFx0b01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twYXJzZWRBZ2dyZWdhdGlvbktleV0gPSBwYXJzZWRBZ2dyZWdhdGlvbltwYXJzZWRBZ2dyZWdhdGlvbktleV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgb05leHRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5pc1B1YmxpYyA9PT0gdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGxldCBjaGlsZERlZmluaXRpb24gPSBvRmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dENoaWxkID0gY2hpbGREZWZpbml0aW9uLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLmhhc1ZpcnR1YWxOb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGRXcmFwcGVyLmFwcGVuZENoaWxkKGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSFdID0gY2hpbGRXcmFwcGVyO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZERlZmluaXRpb247XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5yZW1vdmVBdHRyaWJ1dGUoXCJrZXlcIik7XG5cdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24gPSBuZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IHNDaGlsZE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uYXBwZW5kQ2hpbGQob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIE9iamVjdCBUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTIgfCBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+PiA9IHt9O1xuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb0ZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzW2F0dHJpYnV0ZU5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vcmV0cmlldmUgb25lIGxldmVsIHN1Yk9iamVjdCBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGg7IGNoaWxkSW5kZXgrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdWJDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbltjaGlsZEluZGV4XTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViT2JqZWN0S2V5ID0gc3ViQ2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdWJPYmplY3Q6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lcyA9IHN1YkNoaWxkLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3Qgc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIG9mIHN1YkNoaWxkQXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRzdWJPYmplY3Rbc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lXSA9IHN1YkNoaWxkLmdldEF0dHJpYnV0ZShzdWJDaGlsZEF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXNbc3ViT2JqZWN0S2V5XSA9IHN1Yk9iamVjdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwiYXJyYXlcIikge1xuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb091dE9iamVjdHM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj5bXSA9IFtdO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZERlZmluaXRpb24gPSBjaGlsZHJlbltjaGlsZElkeF07XG5cdFx0XHRcdFx0XHRcdC8vIG5vbiBrZXllZCBjaGlsZCwganVzdCBhZGQgaXQgdG8gdGhlIGFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG15Q2hpbGQ6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlTmFtZXMgPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0bXlDaGlsZFthdHRyaWJ1dGVOYW1lXSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b091dE9iamVjdHMucHVzaChteUNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gb091dE9iamVjdHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzU2xvdHMoXG5cdG9BZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGEgPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Ly8gc2xvdHMgY2FuIGhhdmUgOjogYXMga2V5cyB3aGljaCBpcyBub3QgYSB2YWxpZCBhZ2dyZWdhdGlvbiBuYW1lIHRoZXJlZm9yZSByZXBsYWNpbmcgdGhlbVxuXHRcdFx0XHRjb25zdCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlLCBzQWdncmVnYXRpb25OYW1lLCBvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBOb2RlW10pKTsgLy8gU29tZWhvdyBUUyBkb2Vzbid0IGxpa2UgdGhpcyBidXQgdGhlIGRvY3VtZW50YXRpb24gc2F5cyBpcyBzaG91bGQgd29ya1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvRWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGU6IEVsZW1lbnQsIHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZywgb0VsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwpIHtcblx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZS5yZXBsYWNlKC86L2dpLCBcIl9cIikpO1xuXHR3aGlsZSAob0VsZW1lbnRDaGlsZCkge1xuXHRcdGNvbnN0IG9OZXh0Q2hpbGQgPSBvRWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0b0VsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG9OZXdDaGlsZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0J1aWxkaW5nQmxvY2soXG5cdEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbikge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgfHwgYCR7b01ldGFkYXRhLm5hbWVzcGFjZX0uJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWA7XG5cblx0Y29uc3QgbUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXG5cdC8vIEFkZCBhbiBlbXB0eSBjb252ZXJ0ZXIgY29udGV4dCBpZiB0aGVyZSBpcyBub25lIGluIG9yZGVyIHRvIGhhdmUgYSBwbGFjZSB0byBzdG9yZSBvYmplY3QgdmFsdWVzXG5cdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dCA/Pz0gbmV3IEpTT05Nb2RlbCgpO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXMgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBhbmQgdGhlIG1ldGFkYXRhIGNvbnRleHRzXG5cdGNvbnN0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yKTtcblx0Y29uc3QgaW5pdGlhbEtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcyk7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dCA9IHByb2Nlc3NDb250ZXh0cyhvTWV0YWRhdGEsIG9TZXR0aW5ncywgb05vZGUsIGlzUHVibGljLCBvVmlzaXRvciwgbUNvbnRleHRzLCBwcm9wZXJ0eVZhbHVlcyk7XG5cblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKG9Ob2RlLCBvVmlzaXRvciwgb01ldGFkYXRhLCBpc1B1YmxpYywgcHJvcGVydHlWYWx1ZXMpO1xuXHRcdGxldCBvQ29udHJvbENvbmZpZyA9IHt9O1xuXG5cdFx0aWYgKG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEpIHtcblx0XHRcdC8vIE9ubHkgdXNlZCBpbiB0aGUgRmllbGQgbWFjcm8gYW5kIGV2ZW4gdGhlbiBtYXliZSBub3QgcmVhbGx5IHVzZWZ1bFxuXHRcdFx0b0NvbnRyb2xDb25maWcgPSBvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhLmdldFByb3BlcnR5KFwiL2NvbnRyb2xDb25maWd1cmF0aW9uXCIpO1xuXHRcdH1cblx0XHRsZXQgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblxuXHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0bGV0IG9EYXRhID0gcHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdIGFzIHVua25vd24gYXMgQ29udGV4dDtcblx0XHRcdC8vY2hlY2sgZm9yIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byB2YWxpZGF0ZSAvIG92ZXJ3cml0ZSBwYXJhbWV0ZXJzXG5cdFx0XHRjb25zdCBvcmlnaW5hbERlZmluaXRpb24gPSBCdWlsZGluZ0Jsb2NrQ2xhc3M/Lm1ldGFkYXRhPy5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblx0XHRcdGlmIChvcmlnaW5hbERlZmluaXRpb24/LnZhbGlkYXRlKSB7XG5cdFx0XHRcdG9EYXRhID0gb3JpZ2luYWxEZWZpbml0aW9uLnZhbGlkYXRlKG9EYXRhKSB8fCBvRGF0YTtcblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YT8uaXNBPy4oU0FQX1VJX01PREVMX0NPTlRFWFQpICYmICFvRGF0YS5nZXRNb2RlbCgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiKSkge1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gPSBvRGF0YS5nZXRPYmplY3QoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRwcm9wZXJ0eVZhbHVlcy5pc1B1YmxpYyA9IGlzUHVibGljO1xuXG5cdFx0Y29uc3Qgb0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyh7IC4uLnByb3BlcnR5VmFsdWVzLCAuLi5vQWdncmVnYXRpb25zIH0sIG9Db250cm9sQ29uZmlnLCBvU2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gb0luc3RhbmNlLmdldFByb3BlcnRpZXMoKTtcblx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0NvbnRleHROYW1lOiBzdHJpbmcpIHtcblx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiICYmICFpc0NvbnRleHQodGFyZ2V0T2JqZWN0KSkge1xuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gc3RvcmVPYmplY3RWYWx1ZSh0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShhdHRyaWJ1dGVWYWx1ZSwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmNyZWF0ZUJpbmRpbmdDb250ZXh0KGF0dHJpYnV0ZVZhbHVlKSE7XG5cdFx0XHRcdFx0dW5zdG9yZU9iamVjdFZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcblx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IG5ld0NvbnRleHQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gS2VlcCB0cmFja1xuXHRcdGlmIChUcmFjZUluZm8uaXNUcmFjZUluZm9BY3RpdmUoKSkge1xuXHRcdFx0Y29uc3Qgb1RyYWNlSW5mbyA9IFRyYWNlSW5mby50cmFjZU1hY3JvQ2FsbHMoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlLCBvVmlzaXRvcik7XG5cdFx0XHRpZiAoKG9UcmFjZUluZm8gYXMgVHJhY2VNZXRhZGF0YUNvbnRleHQpPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IChvVHJhY2VJbmZvIGFzIFRyYWNlTWV0YWRhdGFDb250ZXh0KS5tYWNyb0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0VmlzaXRvciA9IG9WaXNpdG9yLndpdGgobUNvbnRleHRzLCBvTWV0YWRhdGEuaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhb01ldGFkYXRhLmlzT3BlbiA6IHRydWUpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChvTWV0YWRhdGEuZnJhZ21lbnQpIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVTdHJpbmcgPSBhd2FpdCBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKTtcblxuXHRcdFx0XHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdC8vIEZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrcywgd2UgbmVlZCB0byBhdHRhY2ggYWxsIG9iamVjdHMgdG8gdGhlIGNvbnZlcnRlckNvbnRleHQgZGlyZWN0bHksIGFzIHRoZSBhY3R1YWwgcmVuZGVyaW5nIHRha2VzIHBsYWNlIGF0IHJ1bnRpbWVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN0b3JlS2V5IGluIHRlbXBvcmFyeU9iamVjdFN0b3JlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHN0b3JlS2V5KTtcblx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzdG9yZUtleSwgZGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKHRlbXBsYXRlU3RyaW5nKSB7XG5cdFx0XHRcdFx0bGV0IGhhc1BhcnNlRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyh0ZW1wbGF0ZVN0cmluZywgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnNlZFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRcdFx0XHRcdGhhc1BhcnNlRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGhhc1BhcnNlRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmVcblx0XHRcdFx0XHRcdC8vIElmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWApO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBhd2FpdCBwcm9jZXNzWG1sSW5UcmFjZShhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZT8uKG9Ob2RlKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlLm1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm91dGVySFRNTCkuam9pbihcIlxcblwiKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKC4uLnBhcnNlZFRlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHRydWUpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja0Jhc2UpOiB2b2lkIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdCk7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzcywgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFVuUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHNvIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0bnVsbCxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfWB9XCIgLz5gO1xuXHR9XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiAgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxjb250cm9sczpGb3JtRWxlbWVudFdyYXBwZXIgeG1sbnM6Y29udHJvbHM9XCJzYXAuZmUuY29yZS5jb250cm9sc1wiPlxuXHRcdFx0XHRcdDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCIgY29yZTpyZXF1aXJlPVwie0JCRjonc2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzdG9yZVxuICogQHJldHVybnMgSUQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVxuICovXG5mdW5jdGlvbiBzdG9yZU9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYC91aWQtLSR7dWlkKCl9YDtcblx0dGVtcG9yYXJ5T2JqZWN0U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWU7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBVbnN0b3JlcyBhbiBvYmplY3QgZnJvbSBhIHRlbXBvcmFyeSBzdG9yZSBieSByZW1vdmluZyBpdCBhbmQgcmV0dXJuaW5nIGl0cyBvYmplY3QgdmFsdWUuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5VUlEIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqIEByZXR1cm5zIE9iamVjdCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1bnN0b3JlT2JqZWN0VmFsdWUocHJvcGVydHlVSUQ6IHN0cmluZykge1xuXHRjb25zdCB2YWx1ZSA9IHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0ZGVsZXRlIHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG5sZXQgcHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBhbGwgeG1sYCBjYWxscyBpbnNpZGUgdGhlIGdpdmVuIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGluIHRyYWNlIG1vZGUuXG4gKlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIG1ldGhvZFxuICovXG5jb25zdCBwcm9jZXNzWG1sSW5UcmFjZSA9IGZ1bmN0aW9uIChtZXRob2Q6IEZ1bmN0aW9uKSB7XG5cdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IHRydWU7XG5cdGxldCByZXR1cm5WYWx1ZTtcblx0dHJ5IHtcblx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZCgpO1xuXHR9IGZpbmFsbHkge1xuXHRcdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBbYWRkRGVmYXVsdE5hbWVzcGFjZXNdIFdoZXRoZXIgb3Igbm90IGRlZmF1bHQgbmFtZXNwYWNlcyBzaG91bGQgYmUgYWRkZWRcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnRbXSB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1hY3Jvcz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1kYz1cInNhcC51aS5tZGNcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIj4ke3htbFN0cmluZ308L3RlbXBsYXRlPmA7XG5cdH1cblx0Y29uc3QgeG1sRG9jdW1lbnQgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuXHRsZXQgb3V0cHV0ID0geG1sRG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdHdoaWxlIChvdXRwdXQ/LmxvY2FsTmFtZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG5cdFx0b3V0cHV0ID0gb3V0cHV0LmZpcnN0RWxlbWVudENoaWxkO1xuXHR9XG5cdGNvbnN0IGNoaWxkcmVuID0gb3V0cHV0Py5wYXJlbnRFbGVtZW50ID8gb3V0cHV0Py5wYXJlbnRFbGVtZW50LmNoaWxkcmVuIDogW291dHB1dCBhcyBFbGVtZW50XTtcblx0cmV0dXJuIEFycmF5LmZyb20oY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyOiBzdHJpbmcpIHtcblx0Y29uc3QgeG1sUmVzdWx0ID0gcGFyc2VYTUxTdHJpbmcob3V0U3RyLCB0cnVlKTtcblx0aWYgKHhtbFJlc3VsdD8ubGVuZ3RoID4gMCAmJiB4bWxSZXN1bHRbMF0/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHRbMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcblx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG91dFN0cjtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBYTUxQcm9jZXNzb3JUeXBlVmFsdWUgPVxuXHR8IHN0cmluZ1xuXHR8IGJvb2xlYW5cblx0fCBudW1iZXJcblx0fCB1bmRlZmluZWRcblx0fCBudWxsXG5cdHwgb2JqZWN0XG5cdHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0fCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj5cblx0fCBBcnJheTxzdHJpbmc+XG5cdHwgQXJyYXk8RnVuY3Rpb24+XG5cdHwgRnVuY3Rpb25cblx0fCBDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBYTUxQcm9jZXNzb3JUeXBlVmFsdWVbXSkgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0b3V0U3RyICs9IFwie3RoaXM+dW5kZWZpbmVkVmFsdWV9XCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGlmIChpc0NvbnRleHQodmFsdWUpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlT2JqZWN0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIjxcIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRvdXRTdHIgPSBvdXRTdHIudHJpbSgpO1xuXHRpZiAocHJvY2Vzc05leHRYbWxJblRyYWNlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7RUE4QkEsTUFBTUEsWUFBWSxHQUFHLDJEQUEyRDtFQUNoRixNQUFNQyxnQkFBZ0IsR0FBRyxnRUFBZ0U7RUFDekYsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsU0FBUyxFQUFFO0VBNEd6QyxTQUFTQyw0QkFBNEIsQ0FDcENDLEtBQWEsRUFDYkMsU0FBa0MsRUFDbENDLGdCQUF3RCxFQUN4REMsSUFBWSxFQUNYO0lBQ0QsTUFBTUMsUUFBUSxHQUFHSCxTQUFTLENBQUNFLElBQUksQ0FBQztJQUNoQyxNQUFNRSxjQUFjLEdBQUdELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFRSxTQUFTLEVBR3pDO0lBRUQsSUFBSUosZ0JBQWdCLENBQUNLLFFBQVEsS0FBSyxJQUFJLEtBQUssQ0FBQ0gsUUFBUSxJQUFJQyxjQUFjLEtBQUssSUFBSSxDQUFDLEVBQUU7TUFDakYsTUFBTSxJQUFJRyxLQUFLLENBQUUsR0FBRVIsS0FBTSwrQkFBOEJHLElBQUssY0FBYSxDQUFDO0lBQzNFLENBQUMsTUFBTSxJQUFJRSxjQUFjLEVBQUU7TUFDMUI7TUFDQTtNQUNBLElBQUlBLGNBQWMsQ0FBQ0ksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJSixjQUFjLENBQUNLLEtBQUssS0FBS0MsU0FBUyxJQUFJVCxnQkFBZ0IsQ0FBQ1EsS0FBSyxLQUFLQyxTQUFTLEVBQUU7UUFDekg7UUFDQSxJQUFJVCxnQkFBZ0IsQ0FBQ1EsS0FBSyxDQUFDRSxPQUFPLENBQUNQLGNBQWMsQ0FBQ0ssS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFD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
|