@sapui5/sap.fe.core 1.102.3 → 1.105.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -16,7 +16,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
16
16
|
|
|
17
17
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
18
18
|
|
|
19
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf
|
|
19
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
20
20
|
|
|
21
21
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
22
22
|
|
|
@@ -65,7 +65,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
65
65
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
66
66
|
// @ts-ignore
|
|
67
67
|
delete this._oAppComponent;
|
|
68
|
-
|
|
68
|
+
|
|
69
|
+
if (this._oContainer) {
|
|
70
|
+
this._oContainer.removeEventDelegate(this._fnContainerDelegate);
|
|
71
|
+
}
|
|
69
72
|
};
|
|
70
73
|
|
|
71
74
|
_proto.waitFor = function waitFor(oPromise) {
|
|
@@ -93,7 +96,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
93
96
|
if (!this._bAfterBindingAlreadyApplied) {
|
|
94
97
|
this._bAfterBindingAlreadyApplied = true;
|
|
95
98
|
var aBoundElements = [];
|
|
96
|
-
var
|
|
99
|
+
var aMDCTables = [];
|
|
100
|
+
var aNotBoundMDCCharts = [];
|
|
97
101
|
var iRequested = 0;
|
|
98
102
|
var iReceived = 0;
|
|
99
103
|
|
|
@@ -130,8 +134,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
130
134
|
}
|
|
131
135
|
};
|
|
132
136
|
|
|
137
|
+
var fnAttachDataEvents = function (event, oData) {
|
|
138
|
+
var binding = oData.binding ? oData.binding : oData.table.getRowBinding();
|
|
139
|
+
|
|
140
|
+
if (binding) {
|
|
141
|
+
binding.attachDataRequested(fnRequested);
|
|
142
|
+
binding.attachDataReceived(function (dataReceivedEvent) {
|
|
143
|
+
fnReceived(dataReceivedEvent);
|
|
144
|
+
_this3._bSeachTriggered = oData.isSeachTriggered ? !oData.isSeachTriggered : _this3._bSeachTriggered;
|
|
145
|
+
});
|
|
146
|
+
aBoundElements.push(binding);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
133
150
|
var fnSearch = function (oEvent) {
|
|
134
|
-
var
|
|
151
|
+
var aMDCTableLinkedToFilterBar = aMDCTables.filter(function (oElem) {
|
|
152
|
+
if (oEvent.getSource().sId === oElem.getFilter() && oElem.getVisible() && !oElem.getParent().getProperty("bindingSuspended")) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return false;
|
|
157
|
+
});
|
|
158
|
+
var aMDCCharts = aNotBoundMDCCharts.filter(function (oElem) {
|
|
135
159
|
if (oEvent.getSource().sId === oElem.getFilter() && oElem.getVisible()) {
|
|
136
160
|
return true;
|
|
137
161
|
}
|
|
@@ -139,31 +163,44 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
139
163
|
return false;
|
|
140
164
|
});
|
|
141
165
|
|
|
142
|
-
if (
|
|
166
|
+
if (aMDCTableLinkedToFilterBar.length > 0 || aMDCCharts.length > 0) {
|
|
143
167
|
_this3._bSeachTriggered = true;
|
|
144
168
|
}
|
|
145
169
|
|
|
146
|
-
|
|
170
|
+
aMDCTableLinkedToFilterBar.forEach(function (oMDCTable) {
|
|
147
171
|
var oRowBinding = oMDCTable.getRowBinding();
|
|
148
172
|
|
|
149
|
-
var fnAttachDataEvents = function () {
|
|
150
|
-
oRowBinding.attachDataRequested(fnRequested);
|
|
151
|
-
oRowBinding.attachDataReceived(function (oEvent) {
|
|
152
|
-
fnReceived(oEvent);
|
|
153
|
-
_this3._bSeachTriggered = false;
|
|
154
|
-
});
|
|
155
|
-
aBoundElements.push(oRowBinding);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
173
|
if (oRowBinding) {
|
|
159
|
-
fnAttachDataEvents(
|
|
174
|
+
fnAttachDataEvents(null, {
|
|
175
|
+
table: oMDCTable,
|
|
176
|
+
isSeachTriggered: true
|
|
177
|
+
});
|
|
160
178
|
} else {
|
|
161
|
-
oMDCTable.attachEventOnce("bindingUpdated",
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}, null);
|
|
179
|
+
oMDCTable.attachEventOnce("bindingUpdated", {
|
|
180
|
+
table: oMDCTable,
|
|
181
|
+
isSeachTriggered: true
|
|
182
|
+
}, fnAttachDataEvents, null);
|
|
165
183
|
}
|
|
166
184
|
});
|
|
185
|
+
aMDCCharts.forEach(function (oMDCChart) {
|
|
186
|
+
oMDCChart.innerChartBoundPromise.then(function () {
|
|
187
|
+
var oBinding = oMDCChart.getControlDelegate().getInnerChart(oMDCChart).getBinding("data");
|
|
188
|
+
|
|
189
|
+
if (oBinding) {
|
|
190
|
+
fnAttachDataEvents(null, {
|
|
191
|
+
binding: oBinding,
|
|
192
|
+
isSeachTriggered: true
|
|
193
|
+
});
|
|
194
|
+
} else {
|
|
195
|
+
oMDCChart.attachEventOnce("bindingUpdated", {
|
|
196
|
+
binding: oBinding,
|
|
197
|
+
isSeachTriggered: true
|
|
198
|
+
}, fnAttachDataEvents, null);
|
|
199
|
+
}
|
|
200
|
+
}).catch(function (oError) {
|
|
201
|
+
Log.error("Cannot find a inner bound chart", oError);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
167
204
|
};
|
|
168
205
|
|
|
169
206
|
if (this.isContextExpected() && oBindingContext === undefined) {
|
|
@@ -179,6 +216,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
179
216
|
oElement.detachEvent("dataRequested", fnRequested);
|
|
180
217
|
oElement.detachEvent("dataReceived", fnReceived);
|
|
181
218
|
oElement.detachEvent("search", fnSearch);
|
|
219
|
+
oElement.detachEvent("bindingUpdated", fnAttachDataEvents);
|
|
182
220
|
});
|
|
183
221
|
_this3._bAfterBindingAlreadyApplied = false;
|
|
184
222
|
aBoundElements = [];
|
|
@@ -192,6 +230,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
192
230
|
}
|
|
193
231
|
|
|
194
232
|
var aTableInitializedPromises = [];
|
|
233
|
+
var aChartInitializedPromises = [];
|
|
195
234
|
|
|
196
235
|
this._oView.findAggregatedObjects(true, function (oElement) {
|
|
197
236
|
var oObjectBinding = oElement.getObjectBinding();
|
|
@@ -222,18 +261,38 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
222
261
|
_this3.bTablesLoaded = false; // access binding only after table is bound
|
|
223
262
|
|
|
224
263
|
aTableInitializedPromises.push(oElement.initialized().then(function () {
|
|
264
|
+
aMDCTables.push(oElement);
|
|
225
265
|
var oRowBinding = oElement.getRowBinding();
|
|
226
266
|
|
|
227
267
|
if (oRowBinding) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
268
|
+
fnAttachDataEvents(null, {
|
|
269
|
+
table: oElement
|
|
270
|
+
});
|
|
231
271
|
} else {
|
|
232
|
-
|
|
272
|
+
oElement.attachEventOnce("bindingUpdated", {
|
|
273
|
+
table: oElement
|
|
274
|
+
}, fnAttachDataEvents);
|
|
233
275
|
}
|
|
234
276
|
}).catch(function (oError) {
|
|
235
277
|
Log.error("Cannot find a bound table", oError);
|
|
236
278
|
}));
|
|
279
|
+
} else if (oElement.isA("sap.ui.mdc.Chart")) {
|
|
280
|
+
_this3.bChartsLoaded = false; // access binding only after table is bound
|
|
281
|
+
|
|
282
|
+
aChartInitializedPromises.push(oElement.initialized().then(function () {
|
|
283
|
+
var oInnerChart = oElement.getControlDelegate().getInnerChart(oElement);
|
|
284
|
+
var oBinding = oInnerChart && oInnerChart.getBinding("data");
|
|
285
|
+
|
|
286
|
+
if (oBinding) {
|
|
287
|
+
oBinding.attachDataRequested(fnRequested);
|
|
288
|
+
oBinding.attachDataReceived(fnReceived);
|
|
289
|
+
aBoundElements.push(oBinding);
|
|
290
|
+
} else {
|
|
291
|
+
aNotBoundMDCCharts.push(oElement);
|
|
292
|
+
}
|
|
293
|
+
}).catch(function (oError) {
|
|
294
|
+
Log.error("Cannot find a bound chart", oError);
|
|
295
|
+
}));
|
|
237
296
|
} else if (oElement.isA("sap.fe.core.controls.FilterBar")) {
|
|
238
297
|
oElement.attachEvent("search", fnSearch);
|
|
239
298
|
aBoundElements.push(oElement);
|
|
@@ -252,6 +311,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
252
311
|
_this3.checkPageReadyDebounced();
|
|
253
312
|
});
|
|
254
313
|
}
|
|
314
|
+
|
|
315
|
+
if (aChartInitializedPromises.length > 0) {
|
|
316
|
+
Promise.all(aChartInitializedPromises).then(function () {
|
|
317
|
+
_this3.bChartsLoaded = true;
|
|
318
|
+
|
|
319
|
+
_this3.checkPageReadyDebounced();
|
|
320
|
+
}).catch(function (oError) {
|
|
321
|
+
Log.info("There was an error with one or multiple charts", oError);
|
|
322
|
+
_this3.bChartsLoaded = true;
|
|
323
|
+
|
|
324
|
+
_this3.checkPageReadyDebounced();
|
|
325
|
+
});
|
|
326
|
+
}
|
|
255
327
|
}
|
|
256
328
|
};
|
|
257
329
|
|
|
@@ -355,7 +427,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
355
427
|
}
|
|
356
428
|
};
|
|
357
429
|
|
|
358
|
-
if (this.bShown && this.bDataReceived !== false && this.bTablesLoaded !== false && (!this.isContextExpected() || this.bHasContext) // Either no context is expected or there is one
|
|
430
|
+
if (this.bShown && this.bDataReceived !== false && this.bTablesLoaded !== false && this.bChartsLoaded !== false && (!this.isContextExpected() || this.bHasContext) // Either no context is expected or there is one
|
|
359
431
|
) {
|
|
360
432
|
if (this.bDataReceived === true && !bFromNav && !this._bWaitingForRefresh && Core.getUIDirty()) {
|
|
361
433
|
// If we requested data we get notified as soon as the data arrived, so before the next rendering tick
|
|
@@ -381,4 +453,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/services/TemplatedViewServiceFactory
|
|
|
381
453
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitFor", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "waitFor"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isPageReady", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "isPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitPageReady", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "waitPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEventOnce", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEventOnce"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEvent", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "detachEvent", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "detachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isContextExpected", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "isContextExpected"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "checkPageReadyDebounced", [_dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "checkPageReadyDebounced"), _class2.prototype)), _class2)) || _class);
|
|
382
454
|
return PageReadyControllerExtension;
|
|
383
455
|
}, false);
|
|
384
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwicHJpdmF0ZUV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJvbkluaXQiLCJfbmJXYWl0cyIsIl9iU2VhY2hUcmlnZ2VyZWQiLCJfb0V2ZW50UHJvdmlkZXIiLCJFdmVudFByb3ZpZGVyIiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29QYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJhdHRhY2hDb250YWluZXJEZWZpbmVkIiwib0V2ZW50IiwicmVnaXN0ZXJDb250YWluZXIiLCJnZXRQYXJhbWV0ZXIiLCJvUm9vdENvbnRyb2xDb250cm9sbGVyIiwiZ2V0Um9vdENvbnRyb2wiLCJnZXRDb250cm9sbGVyIiwib1BsYWNlaG9sZGVyIiwiZ2V0UGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkIiwiYXR0YWNoRXZlbnQiLCJnZXRQbGFjZWhvbGRlckRlYnVnU3RhdHMiLCJpUGFnZVJlYWR5RXZlbnRUaW1lc3RhbXAiLCJEYXRlIiwibm93IiwiaUhlcm9lc0JhdGNoUmVjZWl2ZWRFdmVudFRpbWVzdGFtcCIsIm9uRXhpdCIsIl9vQ29udGFpbmVyIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9mbkNvbnRhaW5lckRlbGVnYXRlIiwid2FpdEZvciIsIm9Qcm9taXNlIiwiZmluYWxseSIsInNldFRpbWVvdXQiLCJjYXRjaCIsIm9uUm91dGVNYXRjaGVkIiwiX2JJc1BhZ2VSZWFkeSIsIm9uUm91dGVNYXRjaGVkRmluaXNoZWQiLCJjaGVja1BhZ2VSZWFkeURlYm91bmNlZCIsIm9uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCIsImFCb3VuZEVsZW1lbnRzIiwiYU5vdEJvdW5kTURDVGFibGVzIiwiaVJlcXVlc3RlZCIsImlSZWNlaXZlZCIsImZuUmVxdWVzdGVkIiwiZ2V0U291cmNlIiwiZGV0YWNoRGF0YVJlcXVlc3RlZCIsImJEYXRhUmVjZWl2ZWQiLCJmblJlY2VpdmVkIiwic0dyb3VwSWQiLCJmaXJlRXZlbnQiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJmblNlYXJjaCIsImFNRENUYWJsZXMiLCJmaWx0ZXIiLCJvRWxlbSIsInNJZCIsImdldEZpbHRlciIsImdldFZpc2libGUiLCJsZW5ndGgiLCJmb3JFYWNoIiwib01EQ1RhYmxlIiwib1Jvd0JpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiZm5BdHRhY2hEYXRhRXZlbnRzIiwiYXR0YWNoRGF0YVJlcXVlc3RlZCIsImF0dGFjaERhdGFSZWNlaXZlZCIsInB1c2giLCJhdHRhY2hFdmVudE9uY2UiLCJpc0NvbnRleHRFeHBlY3RlZCIsInVuZGVmaW5lZCIsImJIYXNDb250ZXh0Iiwib0VsZW1lbnQiLCJkZXRhY2hFdmVudCIsIm1haW5PYmplY3RCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJvT2JqZWN0QmluZGluZyIsImdldE9iamVjdEJpbmRpbmciLCJhQmluZGluZ0tleXMiLCJPYmplY3QiLCJrZXlzIiwibUJpbmRpbmdJbmZvcyIsInNQcm9wZXJ0eU5hbWUiLCJvTGlzdEJpbmRpbmciLCJiaW5kaW5nIiwiaXNBIiwiYlRhYmxlc0xvYWRlZCIsImluaXRpYWxpemVkIiwidGhlbiIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiUHJvbWlzZSIsImFsbCIsImluZm8iLCJpc1BhZ2VSZWFkeSIsIndhaXRQYWdlUmVhZHkiLCJyZXNvbHZlIiwic0V2ZW50SWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJvQ29udGFpbmVyIiwib25CZWZvcmVTaG93IiwiYlNob3duIiwib25CZWZvcmVIaWRlIiwib25BZnRlclNob3ciLCJfY2hlY2tQYWdlUmVhZHkiLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5VGltZXIiLCJjbGVhclRpbWVvdXQiLCJiRnJvbU5hdiIsImZuVUlVcGRhdGVkIiwiQ29yZSIsImdldFVJRGlydHkiLCJfYldhaXRpbmdGb3JSZWZyZXNoIiwiY2hlY2tVSVVwZGF0ZWQiLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQWVNQSw0QixXQURMQyxjQUFjLENBQUMsNENBQUQsQyxVQW1CYkMsY0FBYyxFLFVBcUNkQSxjQUFjLEUsVUFRZEMsZUFBZSxFLFVBQ2ZDLGNBQWMsRSxVQVdkRixjQUFjLENBQUMsVUFBRCxDLFVBSWRBLGNBQWMsQ0FBQyxVQUFELEMsVUFLZEEsY0FBYyxDQUFDLFVBQUQsQyxVQStKZEMsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQUtkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBa0JkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBS2RELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FLZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQXdCZEMsZ0JBQWdCLEUsV0FDaEJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLE9BQW5CLEMsV0FLVkwsZUFBZSxFOzs7Ozs7Ozs7V0FwU1RNLE0sR0FEUCxrQkFDZ0I7QUFBQTs7QUFDZixXQUFLQyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsV0FBS0MsZ0JBQUwsR0FBd0IsS0FBeEI7QUFDQSxXQUFLQyxlQUFMLEdBQXVCLEtBQUtBLGVBQUwsR0FBdUIsS0FBS0EsZUFBNUIsR0FB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QXVYNUJ4SSw0QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1RlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IEV2ZW50UHJvdmlkZXIgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50UHJvdmlkZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCIuLi9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHJpdmF0ZUV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlBhZ2VSZWFkeVwiKVxuY2xhc3MgUGFnZVJlYWR5Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vRXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogYW55O1xuXHRwcml2YXRlIF9vQ29udGFpbmVyITogYW55O1xuXHRwcml2YXRlIF9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQhOiBib29sZWFuO1xuXHRwcml2YXRlIF9mbkNvbnRhaW5lckRlbGVnYXRlOiBhbnk7XG5cdHByaXZhdGUgX25iV2FpdHMhOiBudW1iZXI7XG5cdHByaXZhdGUgX2JTZWFjaFRyaWdnZXJlZCE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JJc1BhZ2VSZWFkeSE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JXYWl0aW5nRm9yUmVmcmVzaCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYlNob3duITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiSGFzQ29udGV4dCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkRhdGFSZWNlaXZlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBiVGFibGVzTG9hZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHBhZ2VSZWFkeVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCkge1xuXHRcdHRoaXMuX25iV2FpdHMgPSAwO1xuXHRcdHRoaXMuX2JTZWFjaFRyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdHRoaXMuX29FdmVudFByb3ZpZGVyID0gdGhpcy5fb0V2ZW50UHJvdmlkZXIgPyB0aGlzLl9vRXZlbnRQcm92aWRlciA6IG5ldyBFdmVudFByb3ZpZGVyKCk7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KTtcblxuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5hdHRhY2hDb250YWluZXJEZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5hdHRhY2hDb250YWluZXJEZWZpbmVkKChvRXZlbnQ6IEV2ZW50KSA9PiB0aGlzLnJlZ2lzdGVyQ29udGFpbmVyKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250YWluZXJcIikpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5yZWdpc3RlckNvbnRhaW5lcih0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1Jvb3RDb250cm9sQ29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCkgYXMgVmlldykuZ2V0Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRjb25zdCBvUGxhY2Vob2xkZXIgPSBvUm9vdENvbnRyb2xDb250cm9sbGVyLmdldFBsYWNlaG9sZGVyICYmIG9Sb290Q29udHJvbENvbnRyb2xsZXIuZ2V0UGxhY2Vob2xkZXIoKTtcblx0XHRpZiAob1BsYWNlaG9sZGVyPy5pc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRvUGxhY2Vob2xkZXIuZ2V0UGxhY2Vob2xkZXJEZWJ1Z1N0YXRzKCkuaVBhZ2VSZWFkeUV2ZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpc1xuXHRcdFx0KTtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0b1BsYWNlaG9sZGVyLmdldFBsYWNlaG9sZGVyRGVidWdTdGF0cygpLmlIZXJvZXNCYXRjaFJlY2VpdmVkRXZlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgd2FpdEZvcihvUHJvbWlzZTogYW55KSB7XG5cdFx0dGhpcy5fbmJXYWl0cysrO1xuXHRcdG9Qcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX25iV2FpdHMtLTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG51bGwpO1xuXHR9XG5cdEBtZXRob2RPdmVycmlkZShcIl9yb3V0aW5nXCIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IGZhbHNlO1xuXHR9XG5cdEBtZXRob2RPdmVycmlkZShcIl9yb3V0aW5nXCIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0dGhpcy5jaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpO1xuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0aWYgKCF0aGlzLl9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQpIHtcblx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IHRydWU7XG5cdFx0XHRsZXQgYUJvdW5kRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBhTm90Qm91bmRNRENUYWJsZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgaVJlcXVlc3RlZCA9IDA7XG5cdFx0XHRsZXQgaVJlY2VpdmVkID0gMDtcblx0XHRcdGNvbnN0IGZuUmVxdWVzdGVkID0gKG9FdmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0KG9FdmVudC5nZXRTb3VyY2UoKSBhcyBhbnkpLmRldGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRpUmVxdWVzdGVkKys7XG5cdFx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCA9IGZhbHNlO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuUmVjZWl2ZWQgPSAob0V2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0XHRzd2l0Y2ggKChvRXZlbnQuZ2V0U291cmNlKCkgYXMgYW55KS5zR3JvdXBJZCkge1xuXHRcdFx0XHRcdGNhc2UgXCIkYXV0by5Xb3JrZXJzXCI6XG5cdFx0XHRcdFx0XHR0aGlzLl9vRXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJ3b3JrZXJzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCIkYXV0by5IZXJvZXNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcImhlcm9lc0JhdGNoUmVjZWl2ZWRcIik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR9XG5cdFx0XHRcdChvRXZlbnQuZ2V0U291cmNlKCkgYXMgYW55KS5kZXRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdGlSZWNlaXZlZCsrO1xuXHRcdFx0XHRpZiAoaVJlY2VpdmVkID49IGlSZXF1ZXN0ZWQgJiYgaVJlcXVlc3RlZCAhPT0gMCkge1xuXHRcdFx0XHRcdGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0XHRcdGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblNlYXJjaCA9IChvRXZlbnQ6IEV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFNRENUYWJsZXMgPSBhTm90Qm91bmRNRENUYWJsZXMuZmlsdGVyKChvRWxlbSkgPT4ge1xuXHRcdFx0XHRcdGlmICgob0V2ZW50LmdldFNvdXJjZSgpIGFzIGFueSkuc0lkID09PSBvRWxlbS5nZXRGaWx0ZXIoKSAmJiBvRWxlbS5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoYU1EQ1RhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhTURDVGFibGVzLmZvckVhY2goKG9NRENUYWJsZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZCgob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0Zm5SZWNlaXZlZChvRXZlbnQpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGZuQXR0YWNoRGF0YUV2ZW50cygpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvTURDVGFibGUuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFx0XHRcImJpbmRpbmdVcGRhdGVkXCIsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRvUm93QmluZGluZyA9IG9NRENUYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG51bGxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHR0aGlzLl9vVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9FbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb09iamVjdEJpbmRpbmcgPSBvRWxlbWVudC5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvT2JqZWN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBvYmplY3QgYmluZGluZyAobW9zdGx5IHVzZWQgb24gb2JqZWN0IHBhZ2VzKVxuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9PYmplY3RCaW5kaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBhQmluZGluZ0tleXMgPSBPYmplY3Qua2V5cyhvRWxlbWVudC5tQmluZGluZ0luZm9zKTtcblx0XHRcdFx0XHRpZiAoYUJpbmRpbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFCaW5kaW5nS2V5cy5mb3JFYWNoKChzUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9FbGVtZW50Lm1CaW5kaW5nSW5mb3Nbc1Byb3BlcnR5TmFtZV0uYmluZGluZztcblx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gYWxsIGxpc3QgYmluZGluZywgZ29vZCBmb3IgYmFzaWMgdGFibGVzLCBwcm9ibGVtYXRpYyBmb3IgTURDLCBzZWUgYWJvdmVcblx0XHRcdFx0XHRcdFx0aWYgKG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBUaGlzIGlzIGRpcnR5IGJ1dCBNREMgVGFibGUgaGFzIGEgd2VpcmQgbG9hZGluZyBsaWZlY3ljbGVcblx0XHRcdFx0aWYgKG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHR0aGlzLmJUYWJsZXNMb2FkZWQgPSBmYWxzZTtcblx0XHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFx0YVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0b0VsZW1lbnRcblx0XHRcdFx0XHRcdFx0LmluaXRpYWxpemVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW1lbnQuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9Sb3dCaW5kaW5nKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YU5vdEJvdW5kTURDVGFibGVzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbHRlckJhclwiKSkge1xuXHRcdFx0XHRcdG9FbGVtZW50LmF0dGFjaEV2ZW50KFwic2VhcmNoXCIsIGZuU2VhcmNoKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcIlRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIG9uZSBvciBtdWx0aXBsZSB0YWJsZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGlzUGFnZVJlYWR5KCkge1xuXHRcdHJldHVybiB0aGlzLl9iSXNQYWdlUmVhZHk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIHdhaXRQYWdlUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZShzRXZlbnRJZDogc3RyaW5nLCBvRGF0YTogYW55LCBmbkZ1bmN0aW9uPzogRnVuY3Rpb24sIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiBhcyBGdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGF0dGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IEZ1bmN0aW9uLCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoc0V2ZW50SWQsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgZGV0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgZm5GdW5jdGlvbjogRnVuY3Rpb24pIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KHNFdmVudElkLCBmbkZ1bmN0aW9uKTtcblx0fVxuXHRwcml2YXRlIHJlZ2lzdGVyQ29udGFpbmVyKG9Db250YWluZXI6IE1hbmFnZWRPYmplY3QpIHtcblx0XHR0aGlzLl9vQ29udGFpbmVyID0gb0NvbnRhaW5lcjtcblx0XHR0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlID0ge1xuXHRcdFx0b25CZWZvcmVTaG93OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYlNob3duID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdG9uQmVmb3JlSGlkZTogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkFmdGVyU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGhpcy5fb0NvbnRhaW5lci5hZGRFdmVudERlbGVnYXRlKHRoaXMuX2ZuQ29udGFpbmVyRGVsZWdhdGUpO1xuXHR9XG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRwdWJsaWMgaXNDb250ZXh0RXhwZWN0ZWQoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdHB1YmxpYyBjaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpIHtcblx0XHRpZiAodGhpcy5wYWdlUmVhZHlUaW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMucGFnZVJlYWR5VGltZXIpO1xuXHRcdH1cblx0XHR0aGlzLnBhZ2VSZWFkeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdH0sIDIwMCk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrUGFnZVJlYWR5KGJGcm9tTmF2OiBib29sZWFuID0gZmFsc2UpIHtcblx0XHRjb25zdCBmblVJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdC8vIFdhaXQgdW50aWwgdGhlIFVJIGlzIG5vIGxvbmdlciBkaXJ0eVxuXHRcdFx0aWYgKCFDb3JlLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQoQ29yZSBhcyBDb3JlRXgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KCk7XG5cdFx0XHRcdH0sIDIwKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gSW4gY2FzZSBVSVVwZGF0ZSBkb2VzIG5vdCBnZXQgY2FsbGVkLCBjaGVjayBpZiBVSSBpcyBub3QgZGlydHkgYW5kIHRoZW4gY2FsbCBfY2hlY2tQYWdlUmVhZHlcblx0XHRjb25zdCBjaGVja1VJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdGlmIChDb3JlLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdChDb3JlIGFzIENvcmVFeCkuZGV0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmJTaG93biAmJlxuXHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkICE9PSBmYWxzZSAmJlxuXHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkICE9PSBmYWxzZSAmJlxuXHRcdFx0KCF0aGlzLmlzQ29udGV4dEV4cGVjdGVkKCkgfHwgdGhpcy5iSGFzQ29udGV4dCkgLy8gRWl0aGVyIG5vIGNvbnRleHQgaXMgZXhwZWN0ZWQgb3IgdGhlcmUgaXMgb25lXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5iRGF0YVJlY2VpdmVkID09PSB0cnVlICYmICFiRnJvbU5hdiAmJiAhdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoICYmIENvcmUuZ2V0VUlEaXJ0eSgpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHJlcXVlc3RlZCBkYXRhIHdlIGdldCBub3RpZmllZCBhcyBzb29uIGFzIHRoZSBkYXRhIGFycml2ZWQsIHNvIGJlZm9yZSB0aGUgbmV4dCByZW5kZXJpbmcgdGlja1xuXHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IHRydWU7XG5cdFx0XHRcdChDb3JlIGFzIENvcmVFeCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgQ29yZS5nZXRVSURpcnR5KCkpIHx8XG5cdFx0XHRcdHRoaXMuX25iV2FpdHMgIT09IDAgfHxcblx0XHRcdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUoKSA+IDAgfHxcblx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0KENvcmUgYXMgQ29yZUV4KS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
|
|
456
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwicHJpdmF0ZUV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJvbkluaXQiLCJfbmJXYWl0cyIsIl9iU2VhY2hUcmlnZ2VyZWQiLCJfb0V2ZW50UHJvdmlkZXIiLCJFdmVudFByb3ZpZGVyIiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29QYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJhdHRhY2hDb250YWluZXJEZWZpbmVkIiwib0V2ZW50IiwicmVnaXN0ZXJDb250YWluZXIiLCJnZXRQYXJhbWV0ZXIiLCJvUm9vdENvbnRyb2xDb250cm9sbGVyIiwiZ2V0Um9vdENvbnRyb2wiLCJnZXRDb250cm9sbGVyIiwib1BsYWNlaG9sZGVyIiwiZ2V0UGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkIiwiYXR0YWNoRXZlbnQiLCJnZXRQbGFjZWhvbGRlckRlYnVnU3RhdHMiLCJpUGFnZVJlYWR5RXZlbnRUaW1lc3RhbXAiLCJEYXRlIiwibm93IiwiaUhlcm9lc0JhdGNoUmVjZWl2ZWRFdmVudFRpbWVzdGFtcCIsIm9uRXhpdCIsIl9vQ29udGFpbmVyIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9mbkNvbnRhaW5lckRlbGVnYXRlIiwid2FpdEZvciIsIm9Qcm9taXNlIiwiZmluYWxseSIsInNldFRpbWVvdXQiLCJjYXRjaCIsIm9uUm91dGVNYXRjaGVkIiwiX2JJc1BhZ2VSZWFkeSIsIm9uUm91dGVNYXRjaGVkRmluaXNoZWQiLCJjaGVja1BhZ2VSZWFkeURlYm91bmNlZCIsIm9uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCIsImFCb3VuZEVsZW1lbnRzIiwiYU1EQ1RhYmxlcyIsImFOb3RCb3VuZE1EQ0NoYXJ0cyIsImlSZXF1ZXN0ZWQiLCJpUmVjZWl2ZWQiLCJmblJlcXVlc3RlZCIsImdldFNvdXJjZSIsImRldGFjaERhdGFSZXF1ZXN0ZWQiLCJiRGF0YVJlY2VpdmVkIiwiZm5SZWNlaXZlZCIsInNHcm91cElkIiwiZmlyZUV2ZW50IiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiZm5BdHRhY2hEYXRhRXZlbnRzIiwiZXZlbnQiLCJvRGF0YSIsImJpbmRpbmciLCJ0YWJsZSIsImdldFJvd0JpbmRpbmciLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwiZGF0YVJlY2VpdmVkRXZlbnQiLCJpc1NlYWNoVHJpZ2dlcmVkIiwicHVzaCIsImZuU2VhcmNoIiwiYU1EQ1RhYmxlTGlua2VkVG9GaWx0ZXJCYXIiLCJmaWx0ZXIiLCJvRWxlbSIsInNJZCIsImdldEZpbHRlciIsImdldFZpc2libGUiLCJnZXRQYXJlbnQiLCJnZXRQcm9wZXJ0eSIsImFNRENDaGFydHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwib01EQ1RhYmxlIiwib1Jvd0JpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJvTURDQ2hhcnQiLCJpbm5lckNoYXJ0Qm91bmRQcm9taXNlIiwidGhlbiIsIm9CaW5kaW5nIiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZ2V0SW5uZXJDaGFydCIsImdldEJpbmRpbmciLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImlzQ29udGV4dEV4cGVjdGVkIiwidW5kZWZpbmVkIiwiYkhhc0NvbnRleHQiLCJvRWxlbWVudCIsImRldGFjaEV2ZW50IiwibWFpbk9iamVjdEJpbmRpbmciLCJhVGFibGVJbml0aWFsaXplZFByb21pc2VzIiwiYUNoYXJ0SW5pdGlhbGl6ZWRQcm9taXNlcyIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9PYmplY3RCaW5kaW5nIiwiZ2V0T2JqZWN0QmluZGluZyIsImFCaW5kaW5nS2V5cyIsIk9iamVjdCIsImtleXMiLCJtQmluZGluZ0luZm9zIiwic1Byb3BlcnR5TmFtZSIsIm9MaXN0QmluZGluZyIsImlzQSIsImJUYWJsZXNMb2FkZWQiLCJpbml0aWFsaXplZCIsImJDaGFydHNMb2FkZWQiLCJvSW5uZXJDaGFydCIsIlByb21pc2UiLCJhbGwiLCJpbmZvIiwiaXNQYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwicmVzb2x2ZSIsInNFdmVudElkIiwiZm5GdW5jdGlvbiIsIm9MaXN0ZW5lciIsIm9Db250YWluZXIiLCJvbkJlZm9yZVNob3ciLCJiU2hvd24iLCJvbkJlZm9yZUhpZGUiLCJvbkFmdGVyU2hvdyIsIl9jaGVja1BhZ2VSZWFkeSIsImFkZEV2ZW50RGVsZWdhdGUiLCJwYWdlUmVhZHlUaW1lciIsImNsZWFyVGltZW91dCIsImJGcm9tTmF2IiwiZm5VSVVwZGF0ZWQiLCJDb3JlIiwiZ2V0VUlEaXJ0eSIsIl9iV2FpdGluZ0ZvclJlZnJlc2giLCJjaGVja1VJVXBkYXRlZCIsIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSIsImdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJQYWdlUmVhZHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBFdmVudFByb3ZpZGVyIGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFByb3ZpZGVyXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCIuLi9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHJpdmF0ZUV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlBhZ2VSZWFkeVwiKVxuY2xhc3MgUGFnZVJlYWR5Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vRXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogYW55O1xuXHRwcml2YXRlIF9vQ29udGFpbmVyITogYW55O1xuXHRwcml2YXRlIF9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQhOiBib29sZWFuO1xuXHRwcml2YXRlIF9mbkNvbnRhaW5lckRlbGVnYXRlOiBhbnk7XG5cdHByaXZhdGUgX25iV2FpdHMhOiBudW1iZXI7XG5cdHByaXZhdGUgX2JTZWFjaFRyaWdnZXJlZCE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JJc1BhZ2VSZWFkeSE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JXYWl0aW5nRm9yUmVmcmVzaCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYlNob3duITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiSGFzQ29udGV4dCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkRhdGFSZWNlaXZlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBiVGFibGVzTG9hZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGJDaGFydHNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcGFnZVJlYWR5VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fbmJXYWl0cyA9IDA7XG5cdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkID0gZmFsc2U7XG5cdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIgPSB0aGlzLl9vRXZlbnRQcm92aWRlciA/IHRoaXMuX29FdmVudFByb3ZpZGVyIDogbmV3IEV2ZW50UHJvdmlkZXIoKTtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpO1xuXG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmF0dGFjaENvbnRhaW5lckRlZmluZWQpIHtcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmF0dGFjaENvbnRhaW5lckRlZmluZWQoKG9FdmVudDogRXZlbnQpID0+IHRoaXMucmVnaXN0ZXJDb250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRhaW5lclwiKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnJlZ2lzdGVyQ29udGFpbmVyKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRjb25zdCBvUm9vdENvbnRyb2xDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSBhcyBWaWV3KS5nZXRDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9QbGFjZWhvbGRlciA9IG9Sb290Q29udHJvbENvbnRyb2xsZXIuZ2V0UGxhY2Vob2xkZXIgJiYgb1Jvb3RDb250cm9sQ29udHJvbGxlci5nZXRQbGFjZWhvbGRlcigpO1xuXHRcdGlmIChvUGxhY2Vob2xkZXI/LmlzUGxhY2Vob2xkZXJEZWJ1Z0VuYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5hdHRhY2hFdmVudChcblx0XHRcdFx0XCJwYWdlUmVhZHlcIixcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdG9QbGFjZWhvbGRlci5nZXRQbGFjZWhvbGRlckRlYnVnU3RhdHMoKS5pUGFnZVJlYWR5RXZlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5hdHRhY2hFdmVudChcblx0XHRcdFx0XCJoZXJvZXNCYXRjaFJlY2VpdmVkXCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRvUGxhY2Vob2xkZXIuZ2V0UGxhY2Vob2xkZXJEZWJ1Z1N0YXRzKCkuaUhlcm9lc0JhdGNoUmVjZWl2ZWRFdmVudFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXNcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0cHVibGljIG9uRXhpdCgpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGRlbGV0ZSB0aGlzLl9vQXBwQ29tcG9uZW50O1xuXHRcdGlmICh0aGlzLl9vQ29udGFpbmVyKSB7XG5cdFx0XHR0aGlzLl9vQ29udGFpbmVyLnJlbW92ZUV2ZW50RGVsZWdhdGUodGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QG1ldGhvZE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QG1ldGhvZE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIXRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCkge1xuXHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gdHJ1ZTtcblx0XHRcdGxldCBhQm91bmRFbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFNRENUYWJsZXM6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBhTm90Qm91bmRNRENDaGFydHM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgaVJlcXVlc3RlZCA9IDA7XG5cdFx0XHRsZXQgaVJlY2VpdmVkID0gMDtcblx0XHRcdGNvbnN0IGZuUmVxdWVzdGVkID0gKG9FdmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0KG9FdmVudC5nZXRTb3VyY2UoKSBhcyBhbnkpLmRldGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRpUmVxdWVzdGVkKys7XG5cdFx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCA9IGZhbHNlO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuUmVjZWl2ZWQgPSAob0V2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0XHRzd2l0Y2ggKChvRXZlbnQuZ2V0U291cmNlKCkgYXMgYW55KS5zR3JvdXBJZCkge1xuXHRcdFx0XHRcdGNhc2UgXCIkYXV0by5Xb3JrZXJzXCI6XG5cdFx0XHRcdFx0XHR0aGlzLl9vRXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJ3b3JrZXJzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCIkYXV0by5IZXJvZXNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcImhlcm9lc0JhdGNoUmVjZWl2ZWRcIik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR9XG5cdFx0XHRcdChvRXZlbnQuZ2V0U291cmNlKCkgYXMgYW55KS5kZXRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdGlSZWNlaXZlZCsrO1xuXHRcdFx0XHRpZiAoaVJlY2VpdmVkID49IGlSZXF1ZXN0ZWQgJiYgaVJlcXVlc3RlZCAhPT0gMCkge1xuXHRcdFx0XHRcdGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0XHRcdGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoZXZlbnQ6IEV2ZW50IHwgbnVsbCwgb0RhdGE6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gb0RhdGEuYmluZGluZyA/IG9EYXRhLmJpbmRpbmcgOiBvRGF0YS50YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChiaW5kaW5nKSB7XG5cdFx0XHRcdFx0YmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRiaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZCgoZGF0YVJlY2VpdmVkRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Zm5SZWNlaXZlZChkYXRhUmVjZWl2ZWRFdmVudCk7XG5cdFx0XHRcdFx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSBvRGF0YS5pc1NlYWNoVHJpZ2dlcmVkID8gIW9EYXRhLmlzU2VhY2hUcmlnZ2VyZWQgOiB0aGlzLl9iU2VhY2hUcmlnZ2VyZWQ7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChiaW5kaW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgZm5TZWFyY2ggPSAob0V2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0XHRjb25zdCBhTURDVGFibGVMaW5rZWRUb0ZpbHRlckJhciA9IGFNRENUYWJsZXMuZmlsdGVyKChvRWxlbSkgPT4ge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdChvRXZlbnQuZ2V0U291cmNlKCkgYXMgYW55KS5zSWQgPT09IG9FbGVtLmdldEZpbHRlcigpICYmXG5cdFx0XHRcdFx0XHRvRWxlbS5nZXRWaXNpYmxlKCkgJiZcblx0XHRcdFx0XHRcdCFvRWxlbS5nZXRQYXJlbnQoKS5nZXRQcm9wZXJ0eShcImJpbmRpbmdTdXNwZW5kZWRcIilcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBhTURDQ2hhcnRzID0gYU5vdEJvdW5kTURDQ2hhcnRzLmZpbHRlcigob0VsZW0pID0+IHtcblx0XHRcdFx0XHRpZiAoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBhbnkpLnNJZCA9PT0gb0VsZW0uZ2V0RmlsdGVyKCkgJiYgb0VsZW0uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGFNRENUYWJsZUxpbmtlZFRvRmlsdGVyQmFyLmxlbmd0aCA+IDAgfHwgYU1EQ0NoYXJ0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhTURDVGFibGVMaW5rZWRUb0ZpbHRlckJhci5mb3JFYWNoKChvTURDVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGZuQXR0YWNoRGF0YUV2ZW50cyhudWxsLCB7IHRhYmxlOiBvTURDVGFibGUsIGlzU2VhY2hUcmlnZ2VyZWQ6IHRydWUgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9NRENUYWJsZS5hdHRhY2hFdmVudE9uY2UoXCJiaW5kaW5nVXBkYXRlZFwiLCB7IHRhYmxlOiBvTURDVGFibGUsIGlzU2VhY2hUcmlnZ2VyZWQ6IHRydWUgfSwgZm5BdHRhY2hEYXRhRXZlbnRzLCBudWxsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhTURDQ2hhcnRzLmZvckVhY2goKG9NRENDaGFydDogYW55KSA9PiB7XG5cdFx0XHRcdFx0b01EQ0NoYXJ0LmlubmVyQ2hhcnRCb3VuZFByb21pc2Vcblx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvTURDQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkuZ2V0SW5uZXJDaGFydChvTURDQ2hhcnQpLmdldEJpbmRpbmcoXCJkYXRhXCIpO1xuXHRcdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMobnVsbCwgeyBiaW5kaW5nOiBvQmluZGluZywgaXNTZWFjaFRyaWdnZXJlZDogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvTURDQ2hhcnQuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJiaW5kaW5nVXBkYXRlZFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0eyBiaW5kaW5nOiBvQmluZGluZywgaXNTZWFjaFRyaWdnZXJlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBpbm5lciBib3VuZCBjaGFydFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJiaW5kaW5nVXBkYXRlZFwiLCBmbkF0dGFjaERhdGFFdmVudHMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHRjb25zdCBhQ2hhcnRJbml0aWFsaXplZFByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXHRcdFx0dGhpcy5fb1ZpZXcuZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChvRWxlbWVudDogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9PYmplY3RCaW5kaW5nID0gb0VsZW1lbnQuZ2V0T2JqZWN0QmluZGluZygpO1xuXHRcdFx0XHRpZiAob09iamVjdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBSZWdpc3RlciBvbiBhbGwgb2JqZWN0IGJpbmRpbmcgKG1vc3RseSB1c2VkIG9uIG9iamVjdCBwYWdlcylcblx0XHRcdFx0XHRvT2JqZWN0QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRvT2JqZWN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvT2JqZWN0QmluZGluZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgYUJpbmRpbmdLZXlzID0gT2JqZWN0LmtleXMob0VsZW1lbnQubUJpbmRpbmdJbmZvcyk7XG5cdFx0XHRcdFx0aWYgKGFCaW5kaW5nS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRhQmluZGluZ0tleXMuZm9yRWFjaCgoc1Byb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvRWxlbWVudC5tQmluZGluZ0luZm9zW3NQcm9wZXJ0eU5hbWVdLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBsaXN0IGJpbmRpbmcsIGdvb2QgZm9yIGJhc2ljIHRhYmxlcywgcHJvYmxlbWF0aWMgZm9yIE1EQywgc2VlIGFib3ZlXG5cdFx0XHRcdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhpcyBpcyBkaXJ0eSBidXQgTURDIFRhYmxlIGhhcyBhIHdlaXJkIGxvYWRpbmcgbGlmZWN5Y2xlXG5cdFx0XHRcdGlmIChvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRcdGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdG9FbGVtZW50XG5cdFx0XHRcdFx0XHRcdC5pbml0aWFsaXplZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRhTURDVGFibGVzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW1lbnQuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKG51bGwsIHsgdGFibGU6IG9FbGVtZW50IH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRWxlbWVudC5hdHRhY2hFdmVudE9uY2UoXCJiaW5kaW5nVXBkYXRlZFwiLCB7IHRhYmxlOiBvRWxlbWVudCB9LCBmbkF0dGFjaERhdGFFdmVudHMpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRcdFx0XHR0aGlzLmJDaGFydHNMb2FkZWQgPSBmYWxzZTtcblx0XHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFx0YUNoYXJ0SW5pdGlhbGl6ZWRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0b0VsZW1lbnRcblx0XHRcdFx0XHRcdFx0LmluaXRpYWxpemVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Jbm5lckNoYXJ0ID0gb0VsZW1lbnQuZ2V0Q29udHJvbERlbGVnYXRlKCkuZ2V0SW5uZXJDaGFydChvRWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvSW5uZXJDaGFydCAmJiBvSW5uZXJDaGFydC5nZXRCaW5kaW5nKFwiZGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvQmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFOb3RCb3VuZE1EQ0NoYXJ0cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCBmaW5kIGEgYm91bmQgY2hhcnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIGlmIChvRWxlbWVudC5pc0EoXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWx0ZXJCYXJcIikpIHtcblx0XHRcdFx0XHRvRWxlbWVudC5hdHRhY2hFdmVudChcInNlYXJjaFwiLCBmblNlYXJjaCk7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRQcm9taXNlLmFsbChhVGFibGVJbml0aWFsaXplZFByb21pc2VzKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKG9FcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCBvbmUgb3IgbXVsdGlwbGUgdGFibGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYUNoYXJ0SW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFDaGFydEluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iQ2hhcnRzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcIlRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIG9uZSBvciBtdWx0aXBsZSBjaGFydHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYkNoYXJ0c0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBpc1BhZ2VSZWFkeSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYklzUGFnZVJlYWR5O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyB3YWl0UGFnZVJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuaXNQYWdlUmVhZHkoKSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmF0dGFjaEV2ZW50T25jZShcblx0XHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dGhpc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBhdHRhY2hFdmVudE9uY2Uoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbj86IEZ1bmN0aW9uLCBvTGlzdGVuZXI/OiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50T25jZShzRXZlbnRJZCwgb0RhdGEsIGZuRnVuY3Rpb24gYXMgRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBhdHRhY2hFdmVudChzRXZlbnRJZDogc3RyaW5nLCBvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBGdW5jdGlvbiwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGRldGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIGZuRnVuY3Rpb246IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChzRXZlbnRJZCwgZm5GdW5jdGlvbik7XG5cdH1cblx0cHJpdmF0ZSByZWdpc3RlckNvbnRhaW5lcihvQ29udGFpbmVyOiBNYW5hZ2VkT2JqZWN0KSB7XG5cdFx0dGhpcy5fb0NvbnRhaW5lciA9IG9Db250YWluZXI7XG5cdFx0dGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkJlZm9yZUhpZGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0b25BZnRlclNob3c6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSh0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuX29Db250YWluZXIuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0cHVibGljIGlzQ29udGV4dEV4cGVjdGVkKCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRwdWJsaWMgY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKSB7XG5cdFx0aWYgKHRoaXMucGFnZVJlYWR5VGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnBhZ2VSZWFkeVRpbWVyKTtcblx0XHR9XG5cdFx0dGhpcy5wYWdlUmVhZHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHVibGljIF9jaGVja1BhZ2VSZWFkeShiRnJvbU5hdjogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgZm5VSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHQvLyBXYWl0IHVudGlsIHRoZSBVSSBpcyBubyBsb25nZXIgZGlydHlcblx0XHRcdGlmICghQ29yZS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0KENvcmUgYXMgQ29yZUV4KS5kZXRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0XHR9LCAyMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEluIGNhc2UgVUlVcGRhdGUgZG9lcyBub3QgZ2V0IGNhbGxlZCwgY2hlY2sgaWYgVUkgaXMgbm90IGRpcnR5IGFuZCB0aGVuIGNhbGwgX2NoZWNrUGFnZVJlYWR5XG5cdFx0Y29uc3QgY2hlY2tVSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoQ29yZS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHQoQ29yZSBhcyBDb3JlRXgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5iU2hvd24gJiZcblx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYkNoYXJ0c0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdCghdGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpIHx8IHRoaXMuYkhhc0NvbnRleHQpIC8vIEVpdGhlciBubyBjb250ZXh0IGlzIGV4cGVjdGVkIG9yIHRoZXJlIGlzIG9uZVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuYkRhdGFSZWNlaXZlZCA9PT0gdHJ1ZSAmJiAhYkZyb21OYXYgJiYgIXRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCAmJiBDb3JlLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQvLyBJZiB3ZSByZXF1ZXN0ZWQgZGF0YSB3ZSBnZXQgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBhcnJpdmVkLCBzbyBiZWZvcmUgdGhlIG5leHQgcmVuZGVyaW5nIHRpY2tcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0XHQoQ29yZSBhcyBDb3JlRXgpLmF0dGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdCghdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoICYmIENvcmUuZ2V0VUlEaXJ0eSgpKSB8fFxuXHRcdFx0XHR0aGlzLl9uYldhaXRzICE9PSAwIHx8XG5cdFx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5nZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCkgPiAwIHx8XG5cdFx0XHRcdHRoaXMuX2JTZWFjaFRyaWdnZXJlZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IHRydWU7XG5cdFx0XHRcdChDb3JlIGFzIENvcmVFeCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdC8vIEluIHRoZSBjYXNlIHdlJ3JlIG5vdCB3YWl0aW5nIGZvciBhbnkgZGF0YSAobmF2aWdhdGluZyBiYWNrIHRvIGEgcGFnZSB3ZSBhbHJlYWR5IGhhdmUgbG9hZGVkKVxuXHRcdFx0XHQvLyBqdXN0IHdhaXQgZm9yIGEgZnJhbWUgdG8gZmlyZSB0aGUgZXZlbnQuXG5cdFx0XHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcInBhZ2VSZWFkeVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFnZVJlYWR5Q29udHJvbGxlckV4dGVuc2lvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQWlCTUEsNEIsV0FETEMsY0FBYyxDQUFDLDRDQUFELEMsVUFvQmJDLGNBQWMsRSxVQXFDZEEsY0FBYyxFLFVBVWRDLGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFXZEYsY0FBYyxDQUFD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
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import Log from "sap/base/Log";
|
|
2
|
-
import AppComponent from "sap/fe/core/AppComponent";
|
|
2
|
+
import type AppComponent from "sap/fe/core/AppComponent";
|
|
3
3
|
import TemplatedViewServiceFactory from "sap/fe/core/services/TemplatedViewServiceFactory";
|
|
4
|
-
import Event from "sap/ui/base/Event";
|
|
4
|
+
import type Event from "sap/ui/base/Event";
|
|
5
5
|
import EventProvider from "sap/ui/base/EventProvider";
|
|
6
|
-
import ManagedObject from "sap/ui/base/ManagedObject";
|
|
6
|
+
import type ManagedObject from "sap/ui/base/ManagedObject";
|
|
7
7
|
import Component from "sap/ui/core/Component";
|
|
8
8
|
import Core from "sap/ui/core/Core";
|
|
9
9
|
import ControllerExtension from "sap/ui/core/mvc/ControllerExtension";
|
|
10
10
|
import OverrideExecution from "sap/ui/core/mvc/OverrideExecution";
|
|
11
|
-
import View from "sap/ui/core/mvc/View";
|
|
12
|
-
import Context from "sap/ui/model/Context";
|
|
13
|
-
import { CoreEx } from "types/extension_types";
|
|
11
|
+
import type View from "sap/ui/core/mvc/View";
|
|
12
|
+
import type Context from "sap/ui/model/Context";
|
|
13
|
+
import type { CoreEx } from "types/extension_types";
|
|
14
14
|
import CommonUtils from "../CommonUtils";
|
|
15
15
|
import { defineUI5Class, extensible, finalExtension, methodOverride, privateExtension, publicExtension } from "../helpers/ClassSupport";
|
|
16
16
|
|
|
@@ -31,6 +31,7 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
31
31
|
private bHasContext!: boolean;
|
|
32
32
|
private bDataReceived: boolean | undefined;
|
|
33
33
|
private bTablesLoaded: boolean | undefined;
|
|
34
|
+
private bChartsLoaded: boolean | undefined;
|
|
34
35
|
private pageReadyTimer: NodeJS.Timeout | undefined;
|
|
35
36
|
|
|
36
37
|
@methodOverride()
|
|
@@ -75,7 +76,9 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
75
76
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
76
77
|
// @ts-ignore
|
|
77
78
|
delete this._oAppComponent;
|
|
78
|
-
|
|
79
|
+
if (this._oContainer) {
|
|
80
|
+
this._oContainer.removeEventDelegate(this._fnContainerDelegate);
|
|
81
|
+
}
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
@publicExtension()
|
|
@@ -104,7 +107,8 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
104
107
|
if (!this._bAfterBindingAlreadyApplied) {
|
|
105
108
|
this._bAfterBindingAlreadyApplied = true;
|
|
106
109
|
let aBoundElements: any[] = [];
|
|
107
|
-
const
|
|
110
|
+
const aMDCTables: any[] = [];
|
|
111
|
+
const aNotBoundMDCCharts: any[] = [];
|
|
108
112
|
let iRequested = 0;
|
|
109
113
|
let iReceived = 0;
|
|
110
114
|
const fnRequested = (oEvent: Event) => {
|
|
@@ -131,40 +135,65 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
131
135
|
this.checkPageReadyDebounced();
|
|
132
136
|
}
|
|
133
137
|
};
|
|
138
|
+
const fnAttachDataEvents = (event: Event | null, oData: any) => {
|
|
139
|
+
const binding = oData.binding ? oData.binding : oData.table.getRowBinding();
|
|
140
|
+
if (binding) {
|
|
141
|
+
binding.attachDataRequested(fnRequested);
|
|
142
|
+
binding.attachDataReceived((dataReceivedEvent: any) => {
|
|
143
|
+
fnReceived(dataReceivedEvent);
|
|
144
|
+
this._bSeachTriggered = oData.isSeachTriggered ? !oData.isSeachTriggered : this._bSeachTriggered;
|
|
145
|
+
});
|
|
146
|
+
aBoundElements.push(binding);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
134
150
|
const fnSearch = (oEvent: Event) => {
|
|
135
|
-
const
|
|
151
|
+
const aMDCTableLinkedToFilterBar = aMDCTables.filter((oElem) => {
|
|
152
|
+
if (
|
|
153
|
+
(oEvent.getSource() as any).sId === oElem.getFilter() &&
|
|
154
|
+
oElem.getVisible() &&
|
|
155
|
+
!oElem.getParent().getProperty("bindingSuspended")
|
|
156
|
+
) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
});
|
|
161
|
+
const aMDCCharts = aNotBoundMDCCharts.filter((oElem) => {
|
|
136
162
|
if ((oEvent.getSource() as any).sId === oElem.getFilter() && oElem.getVisible()) {
|
|
137
163
|
return true;
|
|
138
164
|
}
|
|
139
165
|
return false;
|
|
140
166
|
});
|
|
141
|
-
if (
|
|
167
|
+
if (aMDCTableLinkedToFilterBar.length > 0 || aMDCCharts.length > 0) {
|
|
142
168
|
this._bSeachTriggered = true;
|
|
143
169
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const fnAttachDataEvents = () => {
|
|
147
|
-
oRowBinding.attachDataRequested(fnRequested);
|
|
148
|
-
oRowBinding.attachDataReceived((oEvent: any) => {
|
|
149
|
-
fnReceived(oEvent);
|
|
150
|
-
this._bSeachTriggered = false;
|
|
151
|
-
});
|
|
152
|
-
aBoundElements.push(oRowBinding);
|
|
153
|
-
};
|
|
170
|
+
aMDCTableLinkedToFilterBar.forEach((oMDCTable: any) => {
|
|
171
|
+
const oRowBinding = oMDCTable.getRowBinding();
|
|
154
172
|
if (oRowBinding) {
|
|
155
|
-
fnAttachDataEvents();
|
|
173
|
+
fnAttachDataEvents(null, { table: oMDCTable, isSeachTriggered: true });
|
|
156
174
|
} else {
|
|
157
|
-
oMDCTable.attachEventOnce(
|
|
158
|
-
"bindingUpdated",
|
|
159
|
-
null,
|
|
160
|
-
() => {
|
|
161
|
-
oRowBinding = oMDCTable.getRowBinding();
|
|
162
|
-
fnAttachDataEvents();
|
|
163
|
-
},
|
|
164
|
-
null
|
|
165
|
-
);
|
|
175
|
+
oMDCTable.attachEventOnce("bindingUpdated", { table: oMDCTable, isSeachTriggered: true }, fnAttachDataEvents, null);
|
|
166
176
|
}
|
|
167
177
|
});
|
|
178
|
+
aMDCCharts.forEach((oMDCChart: any) => {
|
|
179
|
+
oMDCChart.innerChartBoundPromise
|
|
180
|
+
.then(() => {
|
|
181
|
+
const oBinding = oMDCChart.getControlDelegate().getInnerChart(oMDCChart).getBinding("data");
|
|
182
|
+
if (oBinding) {
|
|
183
|
+
fnAttachDataEvents(null, { binding: oBinding, isSeachTriggered: true });
|
|
184
|
+
} else {
|
|
185
|
+
oMDCChart.attachEventOnce(
|
|
186
|
+
"bindingUpdated",
|
|
187
|
+
{ binding: oBinding, isSeachTriggered: true },
|
|
188
|
+
fnAttachDataEvents,
|
|
189
|
+
null
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
})
|
|
193
|
+
.catch(function (oError: Error) {
|
|
194
|
+
Log.error("Cannot find a inner bound chart", oError as any);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
168
197
|
};
|
|
169
198
|
if (this.isContextExpected() && oBindingContext === undefined) {
|
|
170
199
|
// Force to mention we are expecting data
|
|
@@ -182,6 +211,7 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
182
211
|
oElement.detachEvent("dataRequested", fnRequested);
|
|
183
212
|
oElement.detachEvent("dataReceived", fnReceived);
|
|
184
213
|
oElement.detachEvent("search", fnSearch);
|
|
214
|
+
oElement.detachEvent("bindingUpdated", fnAttachDataEvents);
|
|
185
215
|
});
|
|
186
216
|
this._bAfterBindingAlreadyApplied = false;
|
|
187
217
|
aBoundElements = [];
|
|
@@ -196,6 +226,7 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
196
226
|
}
|
|
197
227
|
|
|
198
228
|
const aTableInitializedPromises: Promise<any>[] = [];
|
|
229
|
+
const aChartInitializedPromises: Promise<any>[] = [];
|
|
199
230
|
this._oView.findAggregatedObjects(true, (oElement: any) => {
|
|
200
231
|
const oObjectBinding = oElement.getObjectBinding();
|
|
201
232
|
if (oObjectBinding) {
|
|
@@ -225,19 +256,39 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
225
256
|
oElement
|
|
226
257
|
.initialized()
|
|
227
258
|
.then(() => {
|
|
259
|
+
aMDCTables.push(oElement);
|
|
228
260
|
const oRowBinding = oElement.getRowBinding();
|
|
229
261
|
if (oRowBinding) {
|
|
230
|
-
|
|
231
|
-
oRowBinding.attachDataReceived(fnReceived);
|
|
232
|
-
aBoundElements.push(oRowBinding);
|
|
262
|
+
fnAttachDataEvents(null, { table: oElement });
|
|
233
263
|
} else {
|
|
234
|
-
|
|
264
|
+
oElement.attachEventOnce("bindingUpdated", { table: oElement }, fnAttachDataEvents);
|
|
235
265
|
}
|
|
236
266
|
})
|
|
237
267
|
.catch(function (oError: Error) {
|
|
238
268
|
Log.error("Cannot find a bound table", oError as any);
|
|
239
269
|
})
|
|
240
270
|
);
|
|
271
|
+
} else if (oElement.isA("sap.ui.mdc.Chart")) {
|
|
272
|
+
this.bChartsLoaded = false;
|
|
273
|
+
// access binding only after table is bound
|
|
274
|
+
aChartInitializedPromises.push(
|
|
275
|
+
oElement
|
|
276
|
+
.initialized()
|
|
277
|
+
.then(() => {
|
|
278
|
+
const oInnerChart = oElement.getControlDelegate().getInnerChart(oElement);
|
|
279
|
+
const oBinding = oInnerChart && oInnerChart.getBinding("data");
|
|
280
|
+
if (oBinding) {
|
|
281
|
+
oBinding.attachDataRequested(fnRequested);
|
|
282
|
+
oBinding.attachDataReceived(fnReceived);
|
|
283
|
+
aBoundElements.push(oBinding);
|
|
284
|
+
} else {
|
|
285
|
+
aNotBoundMDCCharts.push(oElement);
|
|
286
|
+
}
|
|
287
|
+
})
|
|
288
|
+
.catch(function (oError: Error) {
|
|
289
|
+
Log.error("Cannot find a bound chart", oError as any);
|
|
290
|
+
})
|
|
291
|
+
);
|
|
241
292
|
} else if (oElement.isA("sap.fe.core.controls.FilterBar")) {
|
|
242
293
|
oElement.attachEvent("search", fnSearch);
|
|
243
294
|
aBoundElements.push(oElement);
|
|
@@ -255,6 +306,18 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
255
306
|
this.checkPageReadyDebounced();
|
|
256
307
|
});
|
|
257
308
|
}
|
|
309
|
+
if (aChartInitializedPromises.length > 0) {
|
|
310
|
+
Promise.all(aChartInitializedPromises)
|
|
311
|
+
.then(() => {
|
|
312
|
+
this.bChartsLoaded = true;
|
|
313
|
+
this.checkPageReadyDebounced();
|
|
314
|
+
})
|
|
315
|
+
.catch((oError) => {
|
|
316
|
+
Log.info("There was an error with one or multiple charts", oError);
|
|
317
|
+
this.bChartsLoaded = true;
|
|
318
|
+
this.checkPageReadyDebounced();
|
|
319
|
+
});
|
|
320
|
+
}
|
|
258
321
|
}
|
|
259
322
|
}
|
|
260
323
|
|
|
@@ -363,6 +426,7 @@ class PageReadyControllerExtension extends ControllerExtension {
|
|
|
363
426
|
this.bShown &&
|
|
364
427
|
this.bDataReceived !== false &&
|
|
365
428
|
this.bTablesLoaded !== false &&
|
|
429
|
+
this.bChartsLoaded !== false &&
|
|
366
430
|
(!this.isContextExpected() || this.bHasContext) // Either no context is expected or there is one
|
|
367
431
|
) {
|
|
368
432
|
if (this.bDataReceived === true && !bFromNav && !this._bWaitingForRefresh && Core.getUIDirty()) {
|