@sapui5/sap.fe.core 1.100.0 → 1.102.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 +4 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AppComponent.js +23 -30
- package/src/sap/fe/core/AppComponent.ts +35 -40
- package/src/sap/fe/core/AppStateHandler.js +8 -8
- package/src/sap/fe/core/AppStateHandler.ts +11 -11
- package/src/sap/fe/core/BaseController.js +9 -9
- package/src/sap/fe/core/BaseController.ts +3 -4
- package/src/sap/fe/core/CommonUtils.js +122 -101
- package/src/sap/fe/core/CommonUtils.ts +239 -193
- package/src/sap/fe/core/ExtensionAPI.js +12 -13
- package/src/sap/fe/core/ExtensionAPI.ts +21 -31
- package/src/sap/fe/core/PageController.js +19 -13
- package/src/sap/fe/core/PageController.ts +40 -34
- package/src/sap/fe/core/TemplateComponent.js +198 -123
- package/src/sap/fe/core/TemplateComponent.ts +109 -121
- package/src/sap/fe/core/TemplateModel.js +7 -9
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
- package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
- package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
- package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
- package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +34 -16
- package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
- package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
- package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
- package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +50 -16
- package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
- package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
- package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
- package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
- package/src/sap/fe/core/controls/FileWrapper.js +360 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
- package/src/sap/fe/core/controls/FilterBar.js +154 -119
- package/src/sap/fe/core/controls/FilterBar.ts +128 -123
- package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
- package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
- package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
- package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
- package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
- package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
- package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
- package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
- package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
- package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
- package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
- package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
- package/src/sap/fe/core/fpm/Component.js +46 -17
- package/src/sap/fe/core/fpm/Component.ts +11 -16
- package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
- package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
- package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
- package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
- package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
- package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
- package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
- package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
- package/src/sap/fe/core/library.js +13 -5
- package/src/sap/fe/core/library.ts +26 -17
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
- package/src/sap/fe/core/messagebundle.properties +135 -180
- package/src/sap/fe/core/messagebundle_ar.properties +31 -64
- package/src/sap/fe/core/messagebundle_bg.properties +31 -64
- package/src/sap/fe/core/messagebundle_ca.properties +31 -64
- package/src/sap/fe/core/messagebundle_cs.properties +31 -64
- package/src/sap/fe/core/messagebundle_cy.properties +32 -65
- package/src/sap/fe/core/messagebundle_da.properties +31 -64
- package/src/sap/fe/core/messagebundle_de.properties +29 -62
- package/src/sap/fe/core/messagebundle_el.properties +32 -65
- package/src/sap/fe/core/messagebundle_en.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
- package/src/sap/fe/core/messagebundle_es.properties +31 -64
- package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
- package/src/sap/fe/core/messagebundle_et.properties +31 -64
- package/src/sap/fe/core/messagebundle_fi.properties +29 -62
- package/src/sap/fe/core/messagebundle_fr.properties +36 -69
- package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
- package/src/sap/fe/core/messagebundle_hi.properties +29 -62
- package/src/sap/fe/core/messagebundle_hr.properties +32 -65
- package/src/sap/fe/core/messagebundle_hu.properties +30 -63
- package/src/sap/fe/core/messagebundle_id.properties +32 -65
- package/src/sap/fe/core/messagebundle_it.properties +31 -64
- package/src/sap/fe/core/messagebundle_iw.properties +31 -64
- package/src/sap/fe/core/messagebundle_ja.properties +29 -62
- package/src/sap/fe/core/messagebundle_kk.properties +31 -64
- package/src/sap/fe/core/messagebundle_ko.properties +31 -64
- package/src/sap/fe/core/messagebundle_lt.properties +31 -64
- package/src/sap/fe/core/messagebundle_lv.properties +32 -65
- package/src/sap/fe/core/messagebundle_ms.properties +31 -64
- package/src/sap/fe/core/messagebundle_nl.properties +31 -64
- package/src/sap/fe/core/messagebundle_no.properties +31 -64
- package/src/sap/fe/core/messagebundle_pl.properties +34 -67
- package/src/sap/fe/core/messagebundle_pt.properties +32 -65
- package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
- package/src/sap/fe/core/messagebundle_ro.properties +33 -66
- package/src/sap/fe/core/messagebundle_ru.properties +33 -66
- package/src/sap/fe/core/messagebundle_sh.properties +31 -64
- package/src/sap/fe/core/messagebundle_sk.properties +31 -64
- package/src/sap/fe/core/messagebundle_sl.properties +29 -62
- package/src/sap/fe/core/messagebundle_sv.properties +30 -63
- package/src/sap/fe/core/messagebundle_th.properties +31 -64
- package/src/sap/fe/core/messagebundle_tr.properties +31 -64
- package/src/sap/fe/core/messagebundle_uk.properties +32 -65
- package/src/sap/fe/core/messagebundle_vi.properties +31 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
- package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
- package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
- package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
- package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +0 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
- package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
- package/src/sap/fe/core/templating/FilterHelper.js +4 -4
- package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
- package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
- package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
- package/src/sap/fe/core/templating/UIFormatters.js +133 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +8 -7
- package/src/sap/fe/core/AnnotationHelper.js +0 -312
- package/src/sap/fe/core/AnnotationHelper.ts +0 -315
- package/src/sap/fe/core/RouterProxy.js +0 -926
- package/src/sap/fe/core/TransactionHelper.js +0 -1562
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
- package/src/sap/fe/core/actions/draft.js +0 -523
- package/src/sap/fe/core/actions/messageHandling.js +0 -567
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
|
@@ -0,0 +1,780 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler", "sap/fe/core/helpers/EditState", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text", "sap/ui/core/Core"], function (Log, CommonUtils, ActivitySync, messageHandling, DataLossOrDraftDiscardHandler, EditState, Button, Dialog, MessageBox, Text, Core) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
function _catch(body, recover) {
|
|
9
|
+
try {
|
|
10
|
+
var result = body();
|
|
11
|
+
} catch (e) {
|
|
12
|
+
return recover(e);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (result && result.then) {
|
|
16
|
+
return result.then(void 0, recover);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Creates a draft document from an existing document.
|
|
24
|
+
*
|
|
25
|
+
* The function supports several hooks as there is a certain coreography defined.
|
|
26
|
+
*
|
|
27
|
+
* @function
|
|
28
|
+
* @name sap.fe.core.actions.draft#createDraftFromActiveDocument
|
|
29
|
+
* @memberof sap.fe.core.actions.draft
|
|
30
|
+
* @static
|
|
31
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
32
|
+
* @param {AppComponent} oAppComponent The AppComponent
|
|
33
|
+
* @param {object} mParameters The parameters
|
|
34
|
+
* @param {boolean} [mParameters.oView] The view
|
|
35
|
+
* @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
|
|
36
|
+
* @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
|
|
37
|
+
* @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
|
|
38
|
+
* @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
|
|
39
|
+
* @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
40
|
+
* @private
|
|
41
|
+
* @ui5-restricted
|
|
42
|
+
*/
|
|
43
|
+
var createDraftFromActiveDocument = function (oContext, oAppComponent, mParameters) {
|
|
44
|
+
try {
|
|
45
|
+
var _exit2 = false;
|
|
46
|
+
|
|
47
|
+
//default true
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
|
|
51
|
+
*
|
|
52
|
+
* @param {*} bOverwrite Overwrite the change or not
|
|
53
|
+
* @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
|
|
54
|
+
*/
|
|
55
|
+
function overwriteOnDemand(bOverwrite) {
|
|
56
|
+
if (bOverwrite) {
|
|
57
|
+
//Overwrite existing changes
|
|
58
|
+
var oModel = oContext.getModel();
|
|
59
|
+
var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
60
|
+
var oResourceBundle;
|
|
61
|
+
return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
|
|
62
|
+
oResourceBundle = _oResourceBundle;
|
|
63
|
+
return draftDataContext.requestObject();
|
|
64
|
+
}).then(function (draftAdminData) {
|
|
65
|
+
if (draftAdminData) {
|
|
66
|
+
// remove all unbound transition messages as we show a special dialog
|
|
67
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
68
|
+
var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
|
|
69
|
+
var sEntitySet = mParameters.oView.getViewData().entitySet;
|
|
70
|
+
|
|
71
|
+
if (sInfo) {
|
|
72
|
+
var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
|
|
73
|
+
MessageBox.error(sLockedByUserMsg);
|
|
74
|
+
throw new Error(sLockedByUserMsg);
|
|
75
|
+
} else {
|
|
76
|
+
sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
|
|
77
|
+
var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
|
|
78
|
+
return showMessageBox(sUnsavedChangesMsg).then(function () {
|
|
79
|
+
return executeDraftEditAction(oContext, false);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function showMessageBox(sUnsavedChangesMsg) {
|
|
90
|
+
return new Promise(function (resolve, reject) {
|
|
91
|
+
var oDialog = new Dialog({
|
|
92
|
+
title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
|
|
93
|
+
state: "Warning",
|
|
94
|
+
content: new Text({
|
|
95
|
+
text: sUnsavedChangesMsg
|
|
96
|
+
}),
|
|
97
|
+
beginButton: new Button({
|
|
98
|
+
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
|
|
99
|
+
type: "Emphasized",
|
|
100
|
+
press: function () {
|
|
101
|
+
oDialog.close();
|
|
102
|
+
resolve(true);
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
endButton: new Button({
|
|
106
|
+
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
107
|
+
press: function () {
|
|
108
|
+
oDialog.close();
|
|
109
|
+
reject("Draft creation aborted for document: " + oContext.getPath());
|
|
110
|
+
}
|
|
111
|
+
}),
|
|
112
|
+
afterClose: function () {
|
|
113
|
+
oDialog.destroy();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
oDialog.addStyleClass("sapUiContentPadding");
|
|
117
|
+
oDialog.open();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var mParam = mParameters || {},
|
|
122
|
+
localI18nRef = Core.getLibraryResourceBundle("sap.fe.core"),
|
|
123
|
+
bRunPreserveChangesFlow = typeof mParam.bPreserveChanges === "undefined" || typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges;
|
|
124
|
+
|
|
125
|
+
if (!oContext) {
|
|
126
|
+
return Promise.reject(new Error("Binding context to active document is required"));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
|
|
130
|
+
|
|
131
|
+
if (!bExecute) {
|
|
132
|
+
throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var openingSiblingContext = false;
|
|
136
|
+
return Promise.resolve(_catch(function () {
|
|
137
|
+
function _temp2(_result) {
|
|
138
|
+
if (_exit2) return _result;
|
|
139
|
+
|
|
140
|
+
if (openingSiblingContext) {
|
|
141
|
+
return oDraftContext;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
oDraftContext = oDraftContext && mParam.fnAfterCreateDraftFromActiveDocument ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext) : oDraftContext;
|
|
145
|
+
return function () {
|
|
146
|
+
if (oDraftContext) {
|
|
147
|
+
var _oSideEffects$trigger;
|
|
148
|
+
|
|
149
|
+
var sEditActionName = getActionName(oDraftContext, draftOperations.EDIT);
|
|
150
|
+
var oSideEffects = oAppComponent.getSideEffectsService().getODataActionSideEffects(sEditActionName, oDraftContext);
|
|
151
|
+
|
|
152
|
+
if (oSideEffects !== null && oSideEffects !== void 0 && (_oSideEffects$trigger = oSideEffects.triggerActions) !== null && _oSideEffects$trigger !== void 0 && _oSideEffects$trigger.length) {
|
|
153
|
+
return Promise.resolve(oAppComponent.getSideEffectsService().requestSideEffectsForODataAction(oSideEffects, oDraftContext)).then(function () {
|
|
154
|
+
return oDraftContext;
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
return oDraftContext;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
var oDraftContext = null;
|
|
164
|
+
|
|
165
|
+
var _temp = _catch(function () {
|
|
166
|
+
return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
|
|
167
|
+
oDraftContext = _draft$executeDraftEd;
|
|
168
|
+
});
|
|
169
|
+
}, function (oResponse) {
|
|
170
|
+
return function () {
|
|
171
|
+
if (bRunPreserveChangesFlow && oResponse.status === 409) {
|
|
172
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
173
|
+
return function () {
|
|
174
|
+
if (ActivitySync.isCollaborationEnabled(mParameters.oView)) {
|
|
175
|
+
return Promise.resolve(draft.computeSiblingInformation(oContext, oContext)).then(function (siblingInfo) {
|
|
176
|
+
var siblingContext = mParameters.oView.getController()._routing._createBindingContext(siblingInfo === null || siblingInfo === void 0 ? void 0 : siblingInfo.targetContext.getPath(), oContext.getModel());
|
|
177
|
+
|
|
178
|
+
openingSiblingContext = true;
|
|
179
|
+
_exit2 = true;
|
|
180
|
+
return siblingContext;
|
|
181
|
+
});
|
|
182
|
+
} else {
|
|
183
|
+
return Promise.resolve(overwriteOnDemand(mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true)).then(function (_overwriteOnDemand) {
|
|
184
|
+
oDraftContext = _overwriteOnDemand;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}();
|
|
188
|
+
} else {
|
|
189
|
+
if (!(oResponse && oResponse.canceled)) {
|
|
190
|
+
throw new Error(oResponse);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
|
|
197
|
+
}, function (exc) {
|
|
198
|
+
return Promise.reject(exc);
|
|
199
|
+
}));
|
|
200
|
+
} catch (e) {
|
|
201
|
+
return Promise.reject(e);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Creates an active document from a draft document.
|
|
206
|
+
*
|
|
207
|
+
* The function supports several hooks as there is a certain choreography defined.
|
|
208
|
+
*
|
|
209
|
+
* @function
|
|
210
|
+
* @name sap.fe.core.actions.draft#activateDocument
|
|
211
|
+
* @memberof sap.fe.core.actions.draft
|
|
212
|
+
* @static
|
|
213
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
214
|
+
* @param {object} oAppComponent The AppComponent
|
|
215
|
+
* @param {object} mParameters The parameters
|
|
216
|
+
* @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
|
|
217
|
+
* @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
|
|
218
|
+
* @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
219
|
+
* @private
|
|
220
|
+
* @ui5-restricted
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
|
|
226
|
+
* between the object page and the subobject page.
|
|
227
|
+
*
|
|
228
|
+
* @param {object} rootCurrentContext The context for the root of the draft
|
|
229
|
+
* @param {object} rightmostCurrentContext The context of the subobject page
|
|
230
|
+
* @returns {Promise} returns the siblingInformation object
|
|
231
|
+
*/
|
|
232
|
+
var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
|
|
233
|
+
try {
|
|
234
|
+
if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
|
|
235
|
+
// Wrong usage !!
|
|
236
|
+
Log.error("Cannot compute rightmost sibling context");
|
|
237
|
+
throw new Error("Cannot compute rightmost sibling context");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
var model = rootCurrentContext.getModel();
|
|
241
|
+
return Promise.resolve(_catch(function () {
|
|
242
|
+
// //////////////////////////////////////////////////////////////////
|
|
243
|
+
// 1. Find all segments between the root object and the sub-object
|
|
244
|
+
// Example: for root = /Param(aa)/Entity(bb) and rightMost = /Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)
|
|
245
|
+
// ---> ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
|
|
246
|
+
// Find all segments in the rightmost path
|
|
247
|
+
var additionalPath = rightmostCurrentContext.getPath().replace(rootCurrentContext.getPath(), "");
|
|
248
|
+
var segments = additionalPath ? additionalPath.substring(1).split("/") : []; // First segment is always the full path of the root object, which can contain '/' in case of a parametrized entity
|
|
249
|
+
|
|
250
|
+
segments.unshift(rootCurrentContext.getPath().substring(1)); // //////////////////////////////////////////////////////////////////
|
|
251
|
+
// 2. Request canonical paths of the sibling entity for eah segment
|
|
252
|
+
// Example: for ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
|
|
253
|
+
// --> request canonical paths for "Param(aa)/Entity(bb)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)/SiblingEntity"
|
|
254
|
+
|
|
255
|
+
var oldPaths = [];
|
|
256
|
+
var newPaths = [];
|
|
257
|
+
var currentPath = "";
|
|
258
|
+
var canonicalPathPromises = segments.map(function (segment) {
|
|
259
|
+
currentPath += "/".concat(segment);
|
|
260
|
+
oldPaths.unshift(currentPath);
|
|
261
|
+
var siblingContext = model.bindContext(currentPath + "/SiblingEntity").getBoundContext();
|
|
262
|
+
return siblingContext.requestCanonicalPath();
|
|
263
|
+
}); // //////////////////////////////////////////////////////////////////
|
|
264
|
+
// 3. Reconstruct the full paths from canonical paths (for path mapping)
|
|
265
|
+
// Example: for canonical paths "/Param(aa)/Entity(bb-sibling)", "/Entity2(cc-sibling)", "/Entity3(dd-sibling)"
|
|
266
|
+
// --> ["Param(aa)/Entity(bb-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)/_SubNav(dd-sibling)"]
|
|
267
|
+
|
|
268
|
+
return Promise.resolve(Promise.all(canonicalPathPromises)).then(function (_Promise$all) {
|
|
269
|
+
var canonicalPaths = _Promise$all;
|
|
270
|
+
var siblingPath = "";
|
|
271
|
+
canonicalPaths.forEach(function (canonicalPath, index) {
|
|
272
|
+
if (index !== 0) {
|
|
273
|
+
var navigation = segments[index].replace(/\(.*$/, ""); // Keep only navigation name from the segment, i.e. aaa(xxx) --> aaa
|
|
274
|
+
|
|
275
|
+
var keys = canonicalPath.replace(/.*\(/, "("); // Keep only the keys fmro the canonical path, i.e. aaa(xxx) --> (xxx)
|
|
276
|
+
|
|
277
|
+
siblingPath += "/".concat(navigation).concat(keys);
|
|
278
|
+
} else {
|
|
279
|
+
siblingPath = canonicalPath; // To manage parametrized entities
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
newPaths.unshift(siblingPath);
|
|
283
|
+
});
|
|
284
|
+
return {
|
|
285
|
+
targetContext: model.bindContext(siblingPath).getBoundContext(),
|
|
286
|
+
// Create the rightmost sibling context from its path
|
|
287
|
+
pathMapping: oldPaths.map(function (oldPath, index) {
|
|
288
|
+
return {
|
|
289
|
+
oldPath: oldPath,
|
|
290
|
+
newPath: newPaths[index]
|
|
291
|
+
};
|
|
292
|
+
})
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
}, function () {
|
|
296
|
+
// A canonical path couldn't be resolved (because a sibling doesn't exist)
|
|
297
|
+
return undefined;
|
|
298
|
+
}));
|
|
299
|
+
} catch (e) {
|
|
300
|
+
return Promise.reject(e);
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Interface for callbacks used in the functions
|
|
306
|
+
*
|
|
307
|
+
*
|
|
308
|
+
* @author SAP SE
|
|
309
|
+
* @since 1.54.0
|
|
310
|
+
* @interface
|
|
311
|
+
* @name sap.fe.core.actions.draft.ICallback
|
|
312
|
+
* @private
|
|
313
|
+
*/
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Callback to approve or reject the creation of a draft
|
|
317
|
+
* @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
|
|
318
|
+
* @function
|
|
319
|
+
* @static
|
|
320
|
+
* @abstract
|
|
321
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
322
|
+
* @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
|
|
323
|
+
*
|
|
324
|
+
* @private
|
|
325
|
+
*/
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Callback after a draft was successully created
|
|
329
|
+
* @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
|
|
330
|
+
* @function
|
|
331
|
+
* @static
|
|
332
|
+
* @abstract
|
|
333
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
|
|
334
|
+
* @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
|
|
335
|
+
* @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
|
|
336
|
+
*
|
|
337
|
+
* @private
|
|
338
|
+
*/
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Callback to approve or reject overwriting an unsaved draft of another user
|
|
342
|
+
* @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
|
|
343
|
+
* @function
|
|
344
|
+
* @public
|
|
345
|
+
* @static
|
|
346
|
+
* @abstract
|
|
347
|
+
*
|
|
348
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
349
|
+
* @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
|
|
350
|
+
*
|
|
351
|
+
* @ui5-restricted
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
/* Constants for draft operations */
|
|
355
|
+
var draftOperations = {
|
|
356
|
+
EDIT: "EditAction",
|
|
357
|
+
ACTIVATION: "ActivationAction",
|
|
358
|
+
DISCARD: "DiscardAction",
|
|
359
|
+
PREPARE: "PreparationAction"
|
|
360
|
+
};
|
|
361
|
+
/* Enum for navigation types */
|
|
362
|
+
|
|
363
|
+
var NavigationType;
|
|
364
|
+
/**
|
|
365
|
+
* Static functions for the draft programming model
|
|
366
|
+
*
|
|
367
|
+
* @namespace
|
|
368
|
+
* @alias sap.fe.core.actions.draft
|
|
369
|
+
* @private
|
|
370
|
+
* @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
|
|
371
|
+
* @since 1.54.0
|
|
372
|
+
*/
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Determines action name for a draft operation.
|
|
376
|
+
*
|
|
377
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
378
|
+
* @param {string} sOperation The operation name
|
|
379
|
+
* @returns {string} The name of the draft operation
|
|
380
|
+
*/
|
|
381
|
+
|
|
382
|
+
(function (NavigationType) {
|
|
383
|
+
NavigationType["BackNavigation"] = "BackNavigation";
|
|
384
|
+
NavigationType["ForwardNavigation"] = "ForwardNavigation";
|
|
385
|
+
})(NavigationType || (NavigationType = {}));
|
|
386
|
+
|
|
387
|
+
function getActionName(oContext, sOperation) {
|
|
388
|
+
var oModel = oContext.getModel(),
|
|
389
|
+
oMetaModel = oModel.getMetaModel(),
|
|
390
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
391
|
+
return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Creates an operation context binding for the given context and operation.
|
|
395
|
+
*
|
|
396
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
397
|
+
* @param {string} sOperation The operation (action or function import)
|
|
398
|
+
* @param oOptions Options to create the operation context
|
|
399
|
+
* @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
|
|
400
|
+
*/
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
function createOperation(oContext, sOperation, oOptions) {
|
|
404
|
+
var sOperationName = getActionName(oContext, sOperation);
|
|
405
|
+
return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Check if optional draft prepare action exists.
|
|
409
|
+
*
|
|
410
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
411
|
+
* @returns {boolean} True if a a prepare action exists
|
|
412
|
+
*/
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
function hasPrepareAction(oContext) {
|
|
416
|
+
return !!getActionName(oContext, draftOperations.PREPARE);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Creates a new draft from an active document.
|
|
420
|
+
*
|
|
421
|
+
* @function
|
|
422
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
423
|
+
* @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
424
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
425
|
+
* @private
|
|
426
|
+
* @ui5-restricted
|
|
427
|
+
*/
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
function executeDraftEditAction(oContext, bPreserveChanges) {
|
|
431
|
+
if (oContext.getProperty("IsActiveEntity")) {
|
|
432
|
+
var oOptions = {
|
|
433
|
+
$$inheritExpandSelect: true
|
|
434
|
+
};
|
|
435
|
+
var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
|
|
436
|
+
oOperation.setParameter("PreserveChanges", bPreserveChanges);
|
|
437
|
+
var sGroupId = "direct";
|
|
438
|
+
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
439
|
+
var sActionName = localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"); //If the context is coming from a list binding we pass the flag true to replace the context by the active one
|
|
440
|
+
|
|
441
|
+
var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")).then(function (oDraftDocumentContext) {
|
|
442
|
+
return oDraftDocumentContext;
|
|
443
|
+
});
|
|
444
|
+
oOperation.getModel().submitBatch(sGroupId);
|
|
445
|
+
return oEditPromise;
|
|
446
|
+
} else {
|
|
447
|
+
throw new Error("You cannot edit this draft document");
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
452
|
+
*
|
|
453
|
+
* @function
|
|
454
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
455
|
+
* @param {object} oAppComponent The AppComponent
|
|
456
|
+
* @param {string} [sGroupId] The optional batch group in which the operation is to be executed
|
|
457
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
458
|
+
* @private
|
|
459
|
+
* @ui5-restricted
|
|
460
|
+
*/
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
|
|
464
|
+
var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
|
|
465
|
+
// activate in one $batch the activate action is called with iF-Match=*
|
|
466
|
+
|
|
467
|
+
var bIgnoreEtag = bHasPrepareAction;
|
|
468
|
+
|
|
469
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
470
|
+
var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
|
|
471
|
+
$$inheritExpandSelect: true
|
|
472
|
+
});
|
|
473
|
+
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
474
|
+
var sActionName = localI18nRef.getText("C_OP_OBJECT_PAGE_SAVE");
|
|
475
|
+
return oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")) //3rd parameter<------
|
|
476
|
+
.then(function (oActiveDocumentContext) {
|
|
477
|
+
return oActiveDocumentContext;
|
|
478
|
+
}).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
|
|
479
|
+
function () {
|
|
480
|
+
if (bHasPrepareAction) {
|
|
481
|
+
var _sActionName = getActionName(oContext, draftOperations.PREPARE),
|
|
482
|
+
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
483
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(_sActionName, oContext),
|
|
484
|
+
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
485
|
+
|
|
486
|
+
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
487
|
+
oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
|
|
488
|
+
Log.error("Error while requesting side effects", oError);
|
|
489
|
+
});
|
|
490
|
+
} else {
|
|
491
|
+
requestMessages(oContext, oSideEffectsService).catch(function (oError) {
|
|
492
|
+
Log.error("Error while requesting messages", oError);
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return Promise.reject();
|
|
498
|
+
});
|
|
499
|
+
} else {
|
|
500
|
+
throw new Error("The activation action cannot be executed on an active document");
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Execute a preparation action.
|
|
505
|
+
*
|
|
506
|
+
* @function
|
|
507
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
508
|
+
* @param {string} groupId The optional batch group in which we want to execute the operation
|
|
509
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
510
|
+
* @private
|
|
511
|
+
* @ui5-restricted
|
|
512
|
+
*/
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
function executeDraftPreparationAction(oContext, groupId) {
|
|
516
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
517
|
+
var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
|
|
518
|
+
|
|
519
|
+
oOperation.setParameter("SideEffectsQualifier", "");
|
|
520
|
+
var sGroupId = groupId || oOperation.getGroupId();
|
|
521
|
+
return oOperation.execute(sGroupId).then(function () {
|
|
522
|
+
return oOperation;
|
|
523
|
+
}).catch(function (oError) {
|
|
524
|
+
Log.error("Error while executing the operation", oError);
|
|
525
|
+
});
|
|
526
|
+
} else {
|
|
527
|
+
throw new Error("The preparation action cannot be executed on an active document");
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Determines the message path for a context.
|
|
532
|
+
*
|
|
533
|
+
* @function
|
|
534
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
|
|
535
|
+
* @returns {string} Message path, empty if not annotated
|
|
536
|
+
* @private
|
|
537
|
+
* @ui5-restricted
|
|
538
|
+
*/
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
function getMessagesPath(oContext) {
|
|
542
|
+
var oModel = oContext.getModel(),
|
|
543
|
+
oMetaModel = oModel.getMetaModel(),
|
|
544
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
545
|
+
return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Requests the messages if annotated for a given context.
|
|
549
|
+
*
|
|
550
|
+
* @function
|
|
551
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
|
|
552
|
+
* @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
|
|
553
|
+
* @returns {Promise} Promise which is resolved once messages were requested
|
|
554
|
+
* @private
|
|
555
|
+
* @ui5-restricted
|
|
556
|
+
*/
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
function requestMessages(oContext, oSideEffectsService) {
|
|
560
|
+
var sMessagesPath = getMessagesPath(oContext);
|
|
561
|
+
|
|
562
|
+
if (sMessagesPath) {
|
|
563
|
+
return oSideEffectsService.requestSideEffects([{
|
|
564
|
+
$PropertyPath: sMessagesPath
|
|
565
|
+
}], oContext);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
return Promise.resolve();
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Executes discard of a draft function using HTTP Post.
|
|
572
|
+
*
|
|
573
|
+
* @function
|
|
574
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
575
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
576
|
+
* @private
|
|
577
|
+
* @ui5-restricted
|
|
578
|
+
*/
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
function executeDraftDiscardAction(oContext) {
|
|
582
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
583
|
+
var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
|
|
584
|
+
var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
|
|
585
|
+
var sGroupId = "direct";
|
|
586
|
+
var sActionName = localI18nRef.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON"); // as the discard action doesnt' send the active version in the response we do not use the replace in cache
|
|
587
|
+
|
|
588
|
+
var oDiscardPromise = oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), false);
|
|
589
|
+
oContext.getModel().submitBatch(sGroupId);
|
|
590
|
+
return oDiscardPromise;
|
|
591
|
+
} else {
|
|
592
|
+
throw new Error("The discard action cannot be executed on an active document");
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
function activateDocument(oContext, oAppComponent, mParameters) {
|
|
597
|
+
var mParam = mParameters || {};
|
|
598
|
+
|
|
599
|
+
if (!oContext) {
|
|
600
|
+
return Promise.reject(new Error("Binding context to draft document is required"));
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
|
|
604
|
+
if (!bExecute) {
|
|
605
|
+
return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
if (!hasPrepareAction(oContext)) {
|
|
609
|
+
return executeDraftActivationAction(oContext, oAppComponent);
|
|
610
|
+
}
|
|
611
|
+
/* activation requires preparation */
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
|
|
615
|
+
|
|
616
|
+
var oPreparePromise = executeDraftPreparationAction(oContext, sBatchGroup);
|
|
617
|
+
oContext.getModel().submitBatch(sBatchGroup);
|
|
618
|
+
var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
|
|
619
|
+
return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
|
|
620
|
+
return values[1];
|
|
621
|
+
}).catch(function (exc) {
|
|
622
|
+
return Promise.reject(exc);
|
|
623
|
+
});
|
|
624
|
+
}).then(function (oActiveDocumentContext) {
|
|
625
|
+
return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
|
|
626
|
+
}).catch(function (exc) {
|
|
627
|
+
return Promise.reject(exc);
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
|
|
632
|
+
* and Active Instance uses DELETE always.
|
|
633
|
+
*
|
|
634
|
+
* @function
|
|
635
|
+
* @name sap.fe.core.actions.draft#deleteDraft
|
|
636
|
+
* @memberof sap.fe.core.actions.draft
|
|
637
|
+
* @static
|
|
638
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
|
|
639
|
+
* @private
|
|
640
|
+
* @returns {Promise}
|
|
641
|
+
* @ui5-restricted
|
|
642
|
+
*/
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
function deleteDraft(oContext) {
|
|
646
|
+
var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
|
|
647
|
+
bIsActiveEntity = oContext.getObject().IsActiveEntity;
|
|
648
|
+
|
|
649
|
+
if (bIsActiveEntity || !bIsActiveEntity && !sDiscardAction) {
|
|
650
|
+
//Use Delete in case of active entity and no discard action available for draft
|
|
651
|
+
if (oContext.hasPendingChanges()) {
|
|
652
|
+
return oContext.getBinding().resetChanges().then(function () {
|
|
653
|
+
return oContext.delete();
|
|
654
|
+
}).catch(function (error) {
|
|
655
|
+
return Promise.reject(error);
|
|
656
|
+
});
|
|
657
|
+
} else {
|
|
658
|
+
return oContext.delete();
|
|
659
|
+
}
|
|
660
|
+
} else {
|
|
661
|
+
//Use Discard Post Action if it is a draft entity and discard action exists
|
|
662
|
+
return executeDraftDiscardAction(oContext);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* @param fnProcessFunction
|
|
667
|
+
* @param fnCancelFunction
|
|
668
|
+
* @param oContext
|
|
669
|
+
* @param oController
|
|
670
|
+
* @param bSkipBindingToView
|
|
671
|
+
* @param navigationType
|
|
672
|
+
*/
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
|
|
676
|
+
var navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
|
|
677
|
+
var oModel = oContext.getModel();
|
|
678
|
+
var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
679
|
+
var collaborationConnected = ActivitySync.isConnected(oController.getView());
|
|
680
|
+
var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
|
|
681
|
+
ActivitySync.disconnect(oController.getView());
|
|
682
|
+
|
|
683
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
684
|
+
args[_key] = arguments[_key];
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
fnProcessFunction.apply.apply(fnProcessFunction, [null].concat(args));
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
if (oContext && oContext.getObject() && (!oContext.getObject().DraftAdministrativeData || oContext.getObject().IsActiveEntity === true)) {
|
|
691
|
+
fnProcessFunction();
|
|
692
|
+
} else {
|
|
693
|
+
draftDataContext.requestObject().then(function (draftAdminData) {
|
|
694
|
+
if (draftAdminData) {
|
|
695
|
+
if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
|
|
696
|
+
// The application is running in FCL mode so in this case we fall back to
|
|
697
|
+
// the old logic since the dirty state handling is not properly working
|
|
698
|
+
// for FCL.
|
|
699
|
+
if (!(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime)) {
|
|
700
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
701
|
+
} else {
|
|
702
|
+
processFunctionForDrafts();
|
|
703
|
+
}
|
|
704
|
+
} else {
|
|
705
|
+
if (!oContext.getObject().HasActiveEntity) {
|
|
706
|
+
// There is no active entity so we are editing either newly created data or
|
|
707
|
+
// a draft which has never been saved to active version
|
|
708
|
+
// Since we want to react differently in the two situations, we have to check the
|
|
709
|
+
// dirty state
|
|
710
|
+
if (EditState.isEditStateDirty()) {
|
|
711
|
+
// In this case data is being newly created and then we always want to
|
|
712
|
+
// show the dataloss dialog on navigation
|
|
713
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
714
|
+
} else {
|
|
715
|
+
// We are editing a draft which has been created earlier but never saved to active
|
|
716
|
+
// version and since the edit state is not dirty, there have been no user changes
|
|
717
|
+
// so in this case we want to silently navigate and do nothing
|
|
718
|
+
processFunctionForDrafts();
|
|
719
|
+
}
|
|
720
|
+
} else {
|
|
721
|
+
// We are editing a draft for an existing active entity
|
|
722
|
+
if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
723
|
+
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
724
|
+
// never saved before, hence we're currently editing a newly created draft for
|
|
725
|
+
// an existing active entity for the first time.
|
|
726
|
+
// Also there have so far been no changes made to the draft and in this
|
|
727
|
+
// case we want to silently navigate and delete the draft in case of a back
|
|
728
|
+
// navigation but in case of a forward navigation we want to silently keep it!
|
|
729
|
+
if (navigationType === NavigationType.BackNavigation) {
|
|
730
|
+
var mParameters = {
|
|
731
|
+
skipDiscardPopover: true
|
|
732
|
+
};
|
|
733
|
+
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
734
|
+
processFunctionForDrafts();
|
|
735
|
+
}).catch(function (error) {
|
|
736
|
+
Log.error("Error while canceling the document", error);
|
|
737
|
+
});
|
|
738
|
+
} else {
|
|
739
|
+
// In case of a forward navigation we silently keep the draft and only
|
|
740
|
+
// execute the followup function.
|
|
741
|
+
processFunctionForDrafts();
|
|
742
|
+
}
|
|
743
|
+
} else {
|
|
744
|
+
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
745
|
+
// an existing draft and need to distinguish depending on if any changes
|
|
746
|
+
// have been made in the current editing session or not
|
|
747
|
+
if (EditState.isEditStateDirty()) {
|
|
748
|
+
// Changes have been made in the current editing session so we want
|
|
749
|
+
// to show the dataloss dialog and let the user decide
|
|
750
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
751
|
+
} else {
|
|
752
|
+
// The user started editing the existing draft but did not make any changes
|
|
753
|
+
// in the current editing session, so in this case we do not want
|
|
754
|
+
// to show the dataloss dialog but just keep the draft
|
|
755
|
+
processFunctionForDrafts();
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
} else {
|
|
761
|
+
fnProcessFunction();
|
|
762
|
+
}
|
|
763
|
+
}).catch(function (oError) {
|
|
764
|
+
Log.error("Cannot retrieve draftDataContext information", oError);
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
var draft = {
|
|
770
|
+
createDraftFromActiveDocument: createDraftFromActiveDocument,
|
|
771
|
+
activateDocument: activateDocument,
|
|
772
|
+
deleteDraft: deleteDraft,
|
|
773
|
+
executeDraftEditAction: executeDraftEditAction,
|
|
774
|
+
computeSiblingInformation: computeSiblingInformation,
|
|
775
|
+
processDataLossOrDraftDiscardConfirmation: processDataLossOrDraftDiscardConfirmation,
|
|
776
|
+
NavigationType: NavigationType
|
|
777
|
+
};
|
|
778
|
+
return draft;
|
|
779
|
+
}, false);
|
|
780
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsIl9yb3V0aW5nIiwiX2NyZWF0ZUJpbmRpbmdDb250ZXh0IiwidGFyZ2V0Q29udGV4dCIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJjYW5jZWxlZCIsImV4YyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwic3RhcnRzV2l0aCIsIkxvZyIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhbGwiLCJjYW5vbmljYWxQYXRocyIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInVuZGVmaW5lZCIsIkFDVElWQVRJT04iLCJESVNDQVJEIiwiUFJFUEFSRSIsIk5hdmlnYXRpb25UeXBlIiwic09wZXJhdGlvbiIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIm9PcGVyYXRpb24iLCJzZXRQYXJhbWV0ZXIiLCJzR3JvdXBJZCIsInNBY3Rpb25OYW1lIiwib0VkaXRQcm9taXNlIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJnZXRCaW5kaW5nIiwiaXNBIiwib0RyYWZ0RG9jdW1lbnRDb250ZXh0Iiwic3VibWl0QmF0Y2giLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJjYXRjaCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJyZXF1ZXN0TWVzc2FnZXMiLCJleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbiIsImdyb3VwSWQiLCJnZXRHcm91cElkIiwiZ2V0TWVzc2FnZXNQYXRoIiwic01lc3NhZ2VzUGF0aCIsIiRQcm9wZXJ0eVBhdGgiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50Iiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJvQWN0aXZhdGVQcm9taXNlIiwidmFsdWVzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJkZWxldGVEcmFmdCIsInNEaXNjYXJkQWN0aW9uIiwiYklzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJuYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiY29sbGFib3JhdGlvbkNvbm5lY3RlZCIsImlzQ29ubmVjdGVkIiwiZ2V0VmlldyIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImdldEFwcENvbXBvbmVudCIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciIsInBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdCIsIkhhc0FjdGl2ZUVudGl0eSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBZ2pCTyxrQkFBZ0JBLElBQWhCLEVBQXNC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QUExRDtBQUNBLE9BN0ZGO0FBOEZBO0FBQ0Q7O0FBRUQsTUFBTW5GLEtBQUssR0FBRztBQUNiL0UsSUFBQUEsNkJBQTZCLEVBQUVBLDZCQURsQjtBQUViNkssSUFBQUEsZ0JBQWdCLEVBQUVBLGdCQUZMO0FBR2JPLElBQUFBLFdBQVcsRUFBRUEsV0FIQTtBQUliaEosSUFBQUEsc0JBQXNCLEVBQUVBLHNCQUpYO0FBS2JnRCxJQUFBQSx5QkFBeUIsRUFBRUEseUJBTGQ7QUFNYnVHLElBQUFBLHlDQUF5QyxFQUFFQSx5Q0FOOUI7QUFPYjVELElBQUFBLGNBQWMsRUFBRUE7QUFQSCxHQUFkO1NBVWVoRCxLIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7KGJvb2xlYW58UHJvbWlzZSl9IEFwcHJvdmFsIG9mIGRyYWZ0IGNyZWF0aW9uIFt0cnVlfGZhbHNlXSBvciBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYm9vbGVhbiB2YWx1ZVxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5hZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZFxuICogQGZ1bmN0aW9uXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbi8qIENvbnN0YW50cyBmb3IgZHJhZnQgb3BlcmF0aW9ucyAqL1xuY29uc3QgZHJhZnRPcGVyYXRpb25zID0ge1xuXHRFRElUOiBcIkVkaXRBY3Rpb25cIixcblx0QUNUSVZBVElPTjogXCJBY3RpdmF0aW9uQWN0aW9uXCIsXG5cdERJU0NBUkQ6IFwiRGlzY2FyZEFjdGlvblwiLFxuXHRQUkVQQVJFOiBcIlByZXBhcmF0aW9uQWN0aW9uXCJcbn07XG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgYWN0aW9uIG5hbWUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9cIiArIHNPcGVyYXRpb24pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ30gVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogYW55LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc09wZXJhdGlvbk5hbWUgKyBcIiguLi4pXCIsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIG1lc3NhZ2UgKGh0dHAgc3RhdHVzIDQwOSkgaXMgc2VuZCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbikge1xuXHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcHRpb25zID0geyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfTtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCwgb09wdGlvbnMpO1xuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiUHJlc2VydmVDaGFuZ2VzXCIsIGJQcmVzZXJ2ZUNoYW5nZXMpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpO1xuXHRcdC8vSWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRjb25zdCBvRWRpdFByb21pc2UgPSBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EcmFmdERvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnREb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblx0XHRvT3BlcmF0aW9uLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdHJldHVybiBvRWRpdFByb21pc2U7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBlZGl0IHRoaXMgZHJhZnQgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQ+fSBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0OiBhbnksIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgc0dyb3VwSWQ/OiBzdHJpbmcpIHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblxuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04sIHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH0pO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRiSWdub3JlRXRhZyxcblx0XHRcdFx0c0dyb3VwSWQgPyBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpIC8vM3JkIHBhcmFtZXRlcjwtLS0tLS1cblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHQvL2lmIEFDVElWQVRFIGFjdGlvbiBmYWlscyB0aGVuIHdlIHJlcXVlc3QgZWl0aGVyIHRoZSBzaWRlRWZmZWN0cyBhZ2FpbnN0IFBSRVBBUkUgYWN0aW9uIChpZiBhbm5vdGF0ZWQpIG9yIHRoZSBtZXNzYWdlcyBhcyBmYWxsYmFjazpcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKSB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIG1lc3NhZ2UgcGF0aCBmb3IgYSBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIHBhdGggc2hhbGwgYmUgZGV0ZXJtaW5lZFxuICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZSBwYXRoLCBlbXB0eSBpZiBub3QgYW5ub3RhdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcbn1cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQ6IGFueSwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKSB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkUHJvcGVydHlQYXRoOiBzTWVzc2FnZXNQYXRoIH1dIGFzIGFueSwgb0NvbnRleHQpO1xuXHR9XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpO1xuXHRcdC8vIGFzIHRoZSBkaXNjYXJkIGFjdGlvbiBkb2VzbnQnIHNlbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIHRoZSByZXNwb25zZSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlIGluIGNhY2hlXG5cdFx0Y29uc3Qgb0Rpc2NhcmRQcm9taXNlID0gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0XG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFoIHNlZ21lbnRcblx0XHQvLyBFeGFtcGxlOiBmb3IgW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cdFx0Ly8gLS0+IHJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIGZvciBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZCkvU2libGluZ0VudGl0eVwiXG5cdFx0Y29uc3Qgb2xkUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgbmV3UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IGN1cnJlbnRQYXRoID0gXCJcIjtcblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoY3VycmVudFBhdGggKyBcIi9TaWJsaW5nRW50aXR5XCIpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmbXJvIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoKS5nZXRCb3VuZENvbnRleHQoKSBhcyBDb250ZXh0LCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtBcHBDb21wb25lbnR9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZH0gW21QYXJhbWV0ZXJzLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRdIENhbGxiYWNrIGZvciBkZWNpZGluZyBvbiBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGNoYW5nZSBieSBhbm90aGVyIHVzZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB7QGxpbmsgc2FwLmZlLmNvcmUuYWN0aW9ucyNleGVjdXRlRHJhZnRFZGl0QWN0aW9ufVxuXHQgKi9cblx0ZnVuY3Rpb24gb3ZlcndyaXRlT25EZW1hbmQoYk92ZXJ3cml0ZTogYW55KSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9XQVJOSU5HXCIpLFxuXHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdFx0fSksXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXHRsZXQgb3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBudWxsID0gbnVsbDtcblx0XHR0cnkge1xuXHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KTtcblx0XHR9IGNhdGNoIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0Ly9Pbmx5IGNhbGwgYmFjayBpZiBlcnJvciA0MDlcblx0XHRcdGlmIChiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyAmJiBvUmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0KTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXG5cdGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcblx0b0NvbnRleHQ6IGFueSxcblx0b0NvbnRyb2xsZXI6IGFueSxcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbikge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbyB3ZSBhcmUgZWRpdGluZyBlaXRoZXIgbmV3bHkgY3JlYXRlZCBkYXRhIG9yXG5cdFx0XHRcdFx0XHRcdC8vIGEgZHJhZnQgd2hpY2ggaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gYWN0aXZlIHZlcnNpb25cblx0XHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHRcdC8vIGRpcnR5IHN0YXRlXG5cdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdFx0XHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdFx0XHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdE5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnQ7XG4iXX0=
|