@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,1584 @@
|
|
|
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/base/util/UriParameters", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/CheckBox", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, UriParameters, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, FPMHelper, ModelHelper, FELibrary, Button, CheckBox, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var CreationMode = FELibrary.CreationMode;
|
|
9
|
+
var ProgrammingModel = FELibrary.ProgrammingModel;
|
|
10
|
+
var ValueState = coreLibrary.ValueState;
|
|
11
|
+
/* Make sure that the mParameters is not the oEvent */
|
|
12
|
+
|
|
13
|
+
function getParameters(mParameters) {
|
|
14
|
+
if (mParameters && mParameters.getMetadata && mParameters.getMetadata().getName() === "sap.ui.base.Event") {
|
|
15
|
+
mParameters = {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return mParameters || {};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
var TransactionHelper = /*#__PURE__*/function () {
|
|
22
|
+
function TransactionHelper(oAppComponent, oLockObject) {
|
|
23
|
+
this._bIsModified = false;
|
|
24
|
+
this._bCreateMode = false;
|
|
25
|
+
this._bContinueDiscard = false;
|
|
26
|
+
this._oAppComponent = oAppComponent;
|
|
27
|
+
this.oLockObject = oLockObject;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var _proto = TransactionHelper.prototype;
|
|
31
|
+
|
|
32
|
+
_proto.getProgrammingModel = function getProgrammingModel(oContext) {
|
|
33
|
+
if (!this.sProgrammingModel && oContext) {
|
|
34
|
+
var sPath;
|
|
35
|
+
|
|
36
|
+
if (oContext.isA("sap.ui.model.odata.v4.Context")) {
|
|
37
|
+
sPath = oContext.getPath();
|
|
38
|
+
} else {
|
|
39
|
+
sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
|
|
43
|
+
this.sProgrammingModel = ProgrammingModel.Draft;
|
|
44
|
+
} else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
|
|
45
|
+
this.sProgrammingModel = ProgrammingModel.Sticky;
|
|
46
|
+
} else {
|
|
47
|
+
// as the transaction helper is a singleton we don't store the non draft as the user could
|
|
48
|
+
// start with a non draft child page and navigates back to a draft enabled one
|
|
49
|
+
return ProgrammingModel.NonDraft;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return this.sProgrammingModel;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validates a document.
|
|
57
|
+
*
|
|
58
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
59
|
+
* @static
|
|
60
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be validated
|
|
61
|
+
* @param {object} [mParameters] Can contain the following attributes:
|
|
62
|
+
* * @param {object} [mParameters.data] A map of data that should be validated
|
|
63
|
+
* * @param {string} [mParameters.customValidationFunction] A string representing the path to the validation function
|
|
64
|
+
* @param {object} oView Contains the object of the current view
|
|
65
|
+
* @returns {Promise} Promise resolves with result of the custom validation function
|
|
66
|
+
* @ui5-restricted
|
|
67
|
+
* @final
|
|
68
|
+
*/
|
|
69
|
+
;
|
|
70
|
+
|
|
71
|
+
_proto.validateDocument = function validateDocument(oContext, mParameters, oView) {
|
|
72
|
+
var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
|
|
73
|
+
|
|
74
|
+
if (sCustomValidationFunction) {
|
|
75
|
+
var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
|
|
76
|
+
sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
|
|
77
|
+
mData = mParameters.data;
|
|
78
|
+
delete mData["@$ui5.context.isTransient"];
|
|
79
|
+
return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return Promise.resolve([]);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates a new document.
|
|
86
|
+
*
|
|
87
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
88
|
+
* @static
|
|
89
|
+
* @param {sap.ui.model.odata.v4.ODataListBinding} oMainListBinding OData V4 ListBinding object
|
|
90
|
+
* @param {object} [mInParameters] Optional, can contain the following attributes:
|
|
91
|
+
* @param {map} [mInParameters.data] A map of data that should be sent within the POST
|
|
92
|
+
* @param {string} [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
|
|
93
|
+
* @param {map} [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
|
|
94
|
+
* @param {map} [mInParameters.inactive] If set, the context is set as inactive for empty rows
|
|
95
|
+
* @param oResourceBundle
|
|
96
|
+
* @param messageHandler
|
|
97
|
+
* @param bFromCopyPaste
|
|
98
|
+
* @param oView The current view
|
|
99
|
+
* @returns {Promise} Promise resolves with new binding context
|
|
100
|
+
* @ui5-restricted
|
|
101
|
+
* @final
|
|
102
|
+
*/
|
|
103
|
+
;
|
|
104
|
+
|
|
105
|
+
_proto.createDocument = function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler) {
|
|
106
|
+
var bFromCopyPaste = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
107
|
+
var oView = arguments.length > 5 ? arguments[5] : undefined;
|
|
108
|
+
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
110
|
+
var that = this,
|
|
111
|
+
oModel = oMainListBinding.getModel(),
|
|
112
|
+
oMetaModel = oModel.getMetaModel(),
|
|
113
|
+
sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
|
|
114
|
+
sCreateHash = this._getAppComponent().getRouterProxy().getHash(),
|
|
115
|
+
oComponentData = this._getAppComponent().getComponentData(),
|
|
116
|
+
oStartupParameters = oComponentData && oComponentData.startupParameters || {},
|
|
117
|
+
sNewAction = !oMainListBinding.isRelative() ? this._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
|
|
118
|
+
|
|
119
|
+
var oCreationPromise;
|
|
120
|
+
var mBindingParameters = {
|
|
121
|
+
"$$patchWithoutSideEffects": true
|
|
122
|
+
};
|
|
123
|
+
var sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
|
|
124
|
+
var sBusyPath = "/busy";
|
|
125
|
+
var sFunctionName = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") || oMetaModel.getObject(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
|
|
126
|
+
var bFunctionOnNavProp;
|
|
127
|
+
var oNewDocumentContext;
|
|
128
|
+
|
|
129
|
+
if (sFunctionName) {
|
|
130
|
+
if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
|
|
131
|
+
bFunctionOnNavProp = true;
|
|
132
|
+
} else {
|
|
133
|
+
bFunctionOnNavProp = false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (sMessagesPath) {
|
|
138
|
+
mBindingParameters["$select"] = sMessagesPath;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
var mParameters = getParameters(mInParameters);
|
|
142
|
+
|
|
143
|
+
if (!oMainListBinding) {
|
|
144
|
+
return Promise.reject("Binding required for new document creation");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
var sProgrammingModel = this.getProgrammingModel(oMainListBinding);
|
|
148
|
+
|
|
149
|
+
if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
|
|
150
|
+
return Promise.reject("Create document only allowed for draft or sticky session supported services");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (mParameters.busyMode === "Local") {
|
|
154
|
+
// in case of local busy mode we use the list binding name
|
|
155
|
+
// there's no APY yet so we have to use the .sId TODO provide a public method?
|
|
156
|
+
sBusyPath = "/busyLocal/" + oMainListBinding.sId;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
|
|
160
|
+
BusyLocker.lock(this.oLockObject, sBusyPath);
|
|
161
|
+
var oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
|
|
162
|
+
|
|
163
|
+
if (sNewAction) {
|
|
164
|
+
oCreationPromise = this.callAction(sNewAction, {
|
|
165
|
+
contexts: oMainListBinding.getHeaderContext(),
|
|
166
|
+
showActionParameterDialog: true,
|
|
167
|
+
label: this._getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore),
|
|
168
|
+
bindingParameters: mBindingParameters,
|
|
169
|
+
parentControl: mParameters.parentControl,
|
|
170
|
+
bIsCreateAction: true
|
|
171
|
+
}, null, messageHandler);
|
|
172
|
+
} else {
|
|
173
|
+
var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
|
|
174
|
+
var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
|
|
175
|
+
sFunctionName = bFromCopyPaste ? null : sFunctionName;
|
|
176
|
+
var sFunctionPath, oFunctionContext;
|
|
177
|
+
|
|
178
|
+
if (sFunctionName) {
|
|
179
|
+
//bound to the source entity:
|
|
180
|
+
if (bFunctionOnNavProp) {
|
|
181
|
+
sFunctionPath = oMainListBinding.getContext() && oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()) + "/" + sFunctionName;
|
|
182
|
+
oFunctionContext = oMainListBinding.getContext();
|
|
183
|
+
} else {
|
|
184
|
+
sFunctionPath = oMainListBinding.getHeaderContext() && oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()) + "/" + sFunctionName;
|
|
185
|
+
oFunctionContext = oMainListBinding.getHeaderContext();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
|
|
190
|
+
|
|
191
|
+
if (oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound) {
|
|
192
|
+
oCreationPromise = operations.callBoundFunction(sFunctionName, oFunctionContext, oModel);
|
|
193
|
+
} else {
|
|
194
|
+
oCreationPromise = operations.callFunctionImport(sFunctionName, oModel);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
oCreationPromise = oCreationPromise.then(function (oContext) {
|
|
198
|
+
if (oContext) {
|
|
199
|
+
return oContext.getObject();
|
|
200
|
+
} else {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
}).catch(function (oError) {
|
|
204
|
+
Log.error("Error while executing the function " + sFunctionName, oError);
|
|
205
|
+
throw oError;
|
|
206
|
+
}).then(function (oData) {
|
|
207
|
+
mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
|
|
208
|
+
|
|
209
|
+
if (mParameters.data) {
|
|
210
|
+
delete mParameters.data["@odata.context"];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (aNonComputedVisibleKeyFields.length > 0) {
|
|
214
|
+
var oTransientListBinding = oModel.bindList(oMainListBinding.getPath(), oMainListBinding.getContext(), [], [], {
|
|
215
|
+
$$updateGroupId: "submitLater"
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
oTransientListBinding.refreshInternal = function () {
|
|
219
|
+
/* */
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
oNewDocumentContext = oTransientListBinding.create(mParameters.data, true);
|
|
223
|
+
return that._launchDialogWithKeyFields(oMainListBinding, oTransientListBinding, oNewDocumentContext, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler);
|
|
224
|
+
} else {
|
|
225
|
+
var onBeforeCreatePromise;
|
|
226
|
+
|
|
227
|
+
if (mParameters.beforeCreateCallBack) {
|
|
228
|
+
onBeforeCreatePromise = mParameters.beforeCreateCallBack({
|
|
229
|
+
contextPath: oMainListBinding && oMainListBinding.getPath()
|
|
230
|
+
});
|
|
231
|
+
} else {
|
|
232
|
+
onBeforeCreatePromise = Promise.resolve();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return onBeforeCreatePromise.then(function () {
|
|
236
|
+
oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd, mParameters.inactive);
|
|
237
|
+
|
|
238
|
+
if (!mParameters.inactive) {
|
|
239
|
+
return that.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}).catch(function (oError) {
|
|
244
|
+
Log.error("Error while creating the new document", oError);
|
|
245
|
+
throw oError;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return oCreationPromise.then(function (oResult) {
|
|
250
|
+
if (!oMainListBinding.isRelative()) {
|
|
251
|
+
// the create mode shall currently only be set on creating a root document
|
|
252
|
+
that._bCreateMode = true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
oNewDocumentContext = oNewDocumentContext || oResult && oResult.response; // TODO: where does this one coming from???
|
|
256
|
+
|
|
257
|
+
if (oResult && oResult.bConsiderDocumentModified) {
|
|
258
|
+
that.handleDocumentModifications();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return messageHandler.showMessageDialog().then(function () {
|
|
262
|
+
return oNewDocumentContext;
|
|
263
|
+
});
|
|
264
|
+
}).catch(function (oError) {
|
|
265
|
+
return messageHandler.showMessageDialog().then(function () {
|
|
266
|
+
// for instance, on cancel of create dialog, the promise is rejected
|
|
267
|
+
// a return here would restore the promise chain and result in errors while routing
|
|
268
|
+
// solution - reject here as well
|
|
269
|
+
if (oError && oError.bDeleteTransientContext && oNewDocumentContext.isTransient()) {
|
|
270
|
+
// This is a workaround suggested by model as Context.delete results in an error
|
|
271
|
+
// TODO: remove the $direct once model resolves this issue
|
|
272
|
+
// this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
|
|
273
|
+
oNewDocumentContext.delete("$direct");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return Promise.reject(oError);
|
|
277
|
+
});
|
|
278
|
+
}).finally(function () {
|
|
279
|
+
BusyLocker.unlock(that.oLockObject, sBusyPath);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Find the active contexts of the documents, only for the draft roots.
|
|
284
|
+
*
|
|
285
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
286
|
+
* @static
|
|
287
|
+
* @param {sap.ui.model.odata.v4.Context[]} aContexts Contexts Either one context or an array with contexts to be deleted
|
|
288
|
+
* @param bFindActiveContexts
|
|
289
|
+
* @returns {Array} Array of the active contexts
|
|
290
|
+
*/
|
|
291
|
+
;
|
|
292
|
+
|
|
293
|
+
_proto.findActiveDraftRootContexts = function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
|
|
294
|
+
if (!bFindActiveContexts) {
|
|
295
|
+
return Promise.resolve();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
var activeContexts = aContexts.reduce(function (aResult, oContext) {
|
|
299
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
300
|
+
var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
301
|
+
|
|
302
|
+
if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot")) {
|
|
303
|
+
var bIsActiveEntity = oContext.getObject().IsActiveEntity,
|
|
304
|
+
bHasActiveEntity = oContext.getObject().HasActiveEntity;
|
|
305
|
+
|
|
306
|
+
if (!bIsActiveEntity && bHasActiveEntity) {
|
|
307
|
+
var oActiveContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext();
|
|
308
|
+
aResult.push(oActiveContext);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return aResult;
|
|
313
|
+
}, []);
|
|
314
|
+
return Promise.all(activeContexts.map(function (oContext) {
|
|
315
|
+
return oContext.requestCanonicalPath().then(function () {
|
|
316
|
+
return oContext;
|
|
317
|
+
}, function () {
|
|
318
|
+
return;
|
|
319
|
+
});
|
|
320
|
+
}));
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
_proto.afterDeleteProcess = function afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle) {
|
|
324
|
+
var oInternalModelContext = mParameters.internalModelContext;
|
|
325
|
+
|
|
326
|
+
if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
|
|
327
|
+
if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
|
|
328
|
+
//if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
|
|
329
|
+
oInternalModelContext.setProperty("deleteEnabled", true);
|
|
330
|
+
var obj = Object.assign(oInternalModelContext.getObject(), {});
|
|
331
|
+
obj.selectedContexts = obj.selectedContexts.filter(function (element) {
|
|
332
|
+
return obj.deletableContexts.indexOf(element) === -1;
|
|
333
|
+
});
|
|
334
|
+
obj.deletableContexts = [];
|
|
335
|
+
obj.selectedContexts = [];
|
|
336
|
+
obj.numberOfSelectedContexts = obj.selectedContexts.length;
|
|
337
|
+
oInternalModelContext.setProperty("", obj);
|
|
338
|
+
} else {
|
|
339
|
+
oInternalModelContext.setProperty("deleteEnabled", false);
|
|
340
|
+
oInternalModelContext.setProperty("selectedContexts", []);
|
|
341
|
+
oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (aContexts.length === 1) {
|
|
346
|
+
MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
|
|
347
|
+
} else {
|
|
348
|
+
MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Delete one or multiple document(s).
|
|
353
|
+
*
|
|
354
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
355
|
+
* @static
|
|
356
|
+
* @param {sap.ui.model.odata.v4.Context} vContexts Contexts Either one context or an array with contexts to be deleted
|
|
357
|
+
* @param {object} mParameters Optional, can contain the following attributes:
|
|
358
|
+
* @param {string} mParameters.title Title of the object to be deleted
|
|
359
|
+
* @param {string} mParameters.description Description of the object to be deleted
|
|
360
|
+
* @param {integer} mParameters.numberOfSelectedContexts Number of objects selected
|
|
361
|
+
* @param {boolean} mParameters.noDialog To disable the confirmation dialog
|
|
362
|
+
* @param oResourceBundle
|
|
363
|
+
* @param messageHandler
|
|
364
|
+
* @returns {Promise}
|
|
365
|
+
*/
|
|
366
|
+
;
|
|
367
|
+
|
|
368
|
+
_proto.deleteDocument = function deleteDocument(vContexts, mParameters, oResourceBundle, messageHandler) {
|
|
369
|
+
var fnReject,
|
|
370
|
+
fnResolve,
|
|
371
|
+
aDeletableContexts = [],
|
|
372
|
+
isCheckBoxVisible = false,
|
|
373
|
+
isLockedTextVisible = false,
|
|
374
|
+
cannotBeDeletedTextVisible = false,
|
|
375
|
+
isCheckBoxSelected,
|
|
376
|
+
bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
377
|
+
|
|
378
|
+
var that = this,
|
|
379
|
+
oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
|
|
380
|
+
var aParams;
|
|
381
|
+
var oDeleteMessage = {
|
|
382
|
+
title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
|
|
383
|
+
};
|
|
384
|
+
messageHandling.removeBoundTransitionMessages();
|
|
385
|
+
BusyLocker.lock(this.oLockObject);
|
|
386
|
+
|
|
387
|
+
if (!Array.isArray(vContexts)) {
|
|
388
|
+
vContexts = [vContexts];
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
|
|
392
|
+
if (mParameters) {
|
|
393
|
+
if (!mParameters.numberOfSelectedContexts) {
|
|
394
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
395
|
+
for (var i = 0; i < vContexts.length; i++) {
|
|
396
|
+
var oContextData = vContexts[i].getObject();
|
|
397
|
+
|
|
398
|
+
if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
|
|
399
|
+
MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle), {
|
|
400
|
+
title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
|
|
401
|
+
onClose: fnReject
|
|
402
|
+
});
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
mParameters = getParameters(mParameters);
|
|
409
|
+
|
|
410
|
+
if (mParameters.title) {
|
|
411
|
+
if (mParameters.description) {
|
|
412
|
+
aParams = [mParameters.title, mParameters.description];
|
|
413
|
+
} else {
|
|
414
|
+
aParams = [mParameters.title, ""];
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
|
|
418
|
+
} else {
|
|
419
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
aDeletableContexts = vContexts;
|
|
423
|
+
} else {
|
|
424
|
+
oDeleteMessage = {
|
|
425
|
+
title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
|
|
429
|
+
aDeletableContexts = vContexts;
|
|
430
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
|
|
431
|
+
} else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
|
|
432
|
+
//only one unsaved object
|
|
433
|
+
aDeletableContexts = mParameters.unSavedContexts;
|
|
434
|
+
var draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
|
|
435
|
+
var sLastChangedByUser = "";
|
|
436
|
+
|
|
437
|
+
if (draftAdminData) {
|
|
438
|
+
sLastChangedByUser = draftAdminData["LastChangedByUserDescription"] || draftAdminData["LastChangedByUser"] || "";
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
aParams = [sLastChangedByUser];
|
|
442
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
|
|
443
|
+
} else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
|
|
444
|
+
//only multiple unsaved objects
|
|
445
|
+
aDeletableContexts = mParameters.unSavedContexts;
|
|
446
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
|
|
447
|
+
} else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
|
|
448
|
+
//only unsaved, locked ,deletable objects but not non-deletable objects
|
|
449
|
+
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
450
|
+
oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
|
|
451
|
+
} else {
|
|
452
|
+
//if non-deletable objects exists along with any of unsaved ,deletable objects
|
|
453
|
+
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
454
|
+
cannotBeDeletedTextVisible = true;
|
|
455
|
+
oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName);
|
|
456
|
+
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (mParameters.lockedContexts.length == 1) {
|
|
460
|
+
//setting the locked text if locked objects exist
|
|
461
|
+
isLockedTextVisible = true;
|
|
462
|
+
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if (mParameters.lockedContexts.length > 1) {
|
|
466
|
+
//setting the locked text if locked objects exist
|
|
467
|
+
isLockedTextVisible = true;
|
|
468
|
+
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
|
|
472
|
+
if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
|
|
473
|
+
//if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
|
|
474
|
+
isCheckBoxVisible = false;
|
|
475
|
+
aDeletableContexts = mParameters.unSavedContexts;
|
|
476
|
+
|
|
477
|
+
if (mParameters.unSavedContexts.length === 1) {
|
|
478
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
|
|
479
|
+
} else {
|
|
480
|
+
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
|
|
481
|
+
}
|
|
482
|
+
} else {
|
|
483
|
+
if (mParameters.unSavedContexts.length === 1) {
|
|
484
|
+
oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
|
|
485
|
+
} else {
|
|
486
|
+
oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
isCheckBoxVisible = true;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (cannotBeDeletedTextVisible && isLockedTextVisible) {
|
|
494
|
+
//if both locked and non-deletable objects exist along with deletable objects
|
|
495
|
+
if (mParameters.unSavedContexts.length > 1) {
|
|
496
|
+
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
if (mParameters.unSavedContexts.length == 1) {
|
|
500
|
+
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
var oNonDeletableMessageTextControl, oDeleteMessageTextControl;
|
|
507
|
+
var oContent = new VBox({
|
|
508
|
+
items: [oNonDeletableMessageTextControl = new Text({
|
|
509
|
+
text: oDeleteMessage.nonDeletableText,
|
|
510
|
+
visible: isLockedTextVisible || cannotBeDeletedTextVisible
|
|
511
|
+
}), oDeleteMessageTextControl = new Text({
|
|
512
|
+
text: oDeleteMessage.text
|
|
513
|
+
}), new CheckBox({
|
|
514
|
+
text: oDeleteMessage.checkBoxText,
|
|
515
|
+
selected: true,
|
|
516
|
+
select: function (oEvent) {
|
|
517
|
+
var selected = oEvent.getSource().getSelected();
|
|
518
|
+
|
|
519
|
+
if (selected) {
|
|
520
|
+
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
521
|
+
isCheckBoxSelected = true;
|
|
522
|
+
} else {
|
|
523
|
+
aDeletableContexts = vContexts;
|
|
524
|
+
isCheckBoxSelected = false;
|
|
525
|
+
}
|
|
526
|
+
},
|
|
527
|
+
visible: isCheckBoxVisible
|
|
528
|
+
})]
|
|
529
|
+
});
|
|
530
|
+
var sTitle = oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE");
|
|
531
|
+
|
|
532
|
+
var fnConfirm = function () {
|
|
533
|
+
bDialogConfirmed = true;
|
|
534
|
+
BusyLocker.lock(that.oLockObject);
|
|
535
|
+
var aContexts = aDeletableContexts;
|
|
536
|
+
var onBeforeDeletePromise;
|
|
537
|
+
|
|
538
|
+
if (mParameters.beforeDeleteCallBack) {
|
|
539
|
+
onBeforeDeletePromise = mParameters.beforeDeleteCallBack({
|
|
540
|
+
contexts: aContexts
|
|
541
|
+
});
|
|
542
|
+
} else {
|
|
543
|
+
onBeforeDeletePromise = Promise.resolve();
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return onBeforeDeletePromise.then(that.findActiveDraftRootContexts.bind(that, aContexts, mParameters.bFindActiveContexts)).then(function (activeContexts) {
|
|
547
|
+
//make sure to fetch the active contexts before deleting the drafts
|
|
548
|
+
return Promise.all(aContexts.map(function (oContext) {
|
|
549
|
+
//delete the draft
|
|
550
|
+
return draft.deleteDraft(oContext);
|
|
551
|
+
})).catch(function (oError) {
|
|
552
|
+
return messageHandler.showMessages().then(function () {
|
|
553
|
+
// re-throw error to enforce rejecting the general promise
|
|
554
|
+
throw oError;
|
|
555
|
+
});
|
|
556
|
+
}).then(function () {
|
|
557
|
+
var checkBox = {
|
|
558
|
+
"isCheckBoxVisible": isCheckBoxVisible,
|
|
559
|
+
"isCheckBoxSelected": isCheckBoxSelected
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
if (activeContexts && activeContexts.length) {
|
|
563
|
+
return Promise.all(activeContexts.map(function (oContext) {
|
|
564
|
+
return oContext.delete();
|
|
565
|
+
})).then(function () {
|
|
566
|
+
that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
|
|
567
|
+
return messageHandler.showMessageDialog().then(fnResolve);
|
|
568
|
+
});
|
|
569
|
+
} else {
|
|
570
|
+
that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
|
|
571
|
+
return messageHandler.showMessageDialog().then(fnResolve);
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
}).catch(function () {
|
|
575
|
+
fnReject();
|
|
576
|
+
}).finally(function () {
|
|
577
|
+
BusyLocker.unlock(that.oLockObject);
|
|
578
|
+
});
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
var oDialog = new Dialog({
|
|
582
|
+
title: sTitle,
|
|
583
|
+
state: "Warning",
|
|
584
|
+
content: [oContent],
|
|
585
|
+
ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
|
|
586
|
+
beginButton: new Button({
|
|
587
|
+
text: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
|
|
588
|
+
type: "Emphasized",
|
|
589
|
+
press: function () {
|
|
590
|
+
oDialog.close();
|
|
591
|
+
return fnConfirm();
|
|
592
|
+
}
|
|
593
|
+
}),
|
|
594
|
+
endButton: new Button({
|
|
595
|
+
text: CommonUtils.getTranslatedText("C_COMMON_DIALOG_CANCEL", oResourceBundle),
|
|
596
|
+
press: function () {
|
|
597
|
+
oDialog.close();
|
|
598
|
+
}
|
|
599
|
+
}),
|
|
600
|
+
afterClose: function () {
|
|
601
|
+
oDialog.destroy(); // if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
|
|
602
|
+
|
|
603
|
+
if (!bDialogConfirmed) {
|
|
604
|
+
fnReject();
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
if (mParameters.noDialog) {
|
|
610
|
+
return fnConfirm();
|
|
611
|
+
} else {
|
|
612
|
+
oDialog.addStyleClass("sapUiContentPadding");
|
|
613
|
+
oDialog.open();
|
|
614
|
+
}
|
|
615
|
+
}).finally(function () {
|
|
616
|
+
BusyLocker.unlock(that.oLockObject);
|
|
617
|
+
}).catch(function () {
|
|
618
|
+
Log.warning("Couldn't get Programming model");
|
|
619
|
+
fnReject();
|
|
620
|
+
});
|
|
621
|
+
return new Promise(function (resolve, reject) {
|
|
622
|
+
fnReject = reject;
|
|
623
|
+
fnResolve = resolve;
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Edits a document.
|
|
628
|
+
*
|
|
629
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
630
|
+
* @static
|
|
631
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document
|
|
632
|
+
* @param {object} oView Current view
|
|
633
|
+
* @param messageHandler
|
|
634
|
+
* @returns {Promise} Promise resolves with the new draft context in case of draft programming model
|
|
635
|
+
* @ui5-restricted
|
|
636
|
+
* @final
|
|
637
|
+
*/
|
|
638
|
+
;
|
|
639
|
+
|
|
640
|
+
_proto.editDocument = function editDocument(oContext, oView, messageHandler) {
|
|
641
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
642
|
+
var that = this;
|
|
643
|
+
var sProgrammingModel = this.getProgrammingModel(oContext);
|
|
644
|
+
var oEditPromise;
|
|
645
|
+
|
|
646
|
+
if (!oContext) {
|
|
647
|
+
return Promise.reject(new Error("Binding context to active document is required"));
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
this._bIsModified = false;
|
|
651
|
+
BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
|
|
652
|
+
|
|
653
|
+
messageHandler.removeTransitionMessages();
|
|
654
|
+
|
|
655
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
656
|
+
oEditPromise = draft.createDraftFromActiveDocument(oContext, this._getAppComponent(), {
|
|
657
|
+
bPreserveChanges: true,
|
|
658
|
+
oView: oView
|
|
659
|
+
});
|
|
660
|
+
} else if (sProgrammingModel === ProgrammingModel.Sticky) {
|
|
661
|
+
oEditPromise = sticky.editDocumentInStickySession(oContext, this._getAppComponent());
|
|
662
|
+
} else {
|
|
663
|
+
BusyLocker.unlock(that.oLockObject);
|
|
664
|
+
return Promise.reject(new Error("Edit is only allowed for draft or sticky session supported services"));
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
return oEditPromise.then(function (oNewContext) {
|
|
668
|
+
that._bCreateMode = false;
|
|
669
|
+
return messageHandler.showMessageDialog().then(function () {
|
|
670
|
+
return oNewContext;
|
|
671
|
+
});
|
|
672
|
+
}).catch(function (err) {
|
|
673
|
+
return messageHandler.showMessages().then(function () {
|
|
674
|
+
return Promise.reject(err);
|
|
675
|
+
});
|
|
676
|
+
}).finally(function () {
|
|
677
|
+
BusyLocker.unlock(that.oLockObject);
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Cancel 'edit' mode of a document.
|
|
682
|
+
*
|
|
683
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
684
|
+
* @static
|
|
685
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be canceled or deleted
|
|
686
|
+
* @param {object} [mInParameters] Optional, can contain the following attributes:
|
|
687
|
+
* @param {sap.m.Button} mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
|
|
688
|
+
* @param {boolean} mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
|
|
689
|
+
* @param oResourceBundle
|
|
690
|
+
* @param messageHandler
|
|
691
|
+
* @returns {Promise} Promise resolves with ???
|
|
692
|
+
* @ui5-restricted
|
|
693
|
+
* @final
|
|
694
|
+
*/
|
|
695
|
+
;
|
|
696
|
+
|
|
697
|
+
_proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
|
|
698
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
699
|
+
var that = this;
|
|
700
|
+
var sProgrammingModel; //context must always be passed - mandatory parameter
|
|
701
|
+
|
|
702
|
+
if (!oContext) {
|
|
703
|
+
return Promise.reject("No context exists. Pass a meaningful context");
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
BusyLocker.lock(that.oLockObject);
|
|
707
|
+
var mParameters = getParameters(mInParameters);
|
|
708
|
+
var oParamsContext = oContext,
|
|
709
|
+
oCancelButton = mParameters.cancelButton,
|
|
710
|
+
oModel = oParamsContext.getModel();
|
|
711
|
+
var onBeforeCancelPromise, sCanonicalPath;
|
|
712
|
+
return Promise.resolve(this.getProgrammingModel(oContext)).then(function (sPModel) {
|
|
713
|
+
sProgrammingModel = sPModel;
|
|
714
|
+
|
|
715
|
+
if (sPModel === ProgrammingModel.Draft) {
|
|
716
|
+
var draftDataContext = oModel.bindContext(oParamsContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
717
|
+
|
|
718
|
+
if (!that._bIsModified) {
|
|
719
|
+
return draftDataContext.requestObject().then(function (draftAdminData) {
|
|
720
|
+
if (draftAdminData) {
|
|
721
|
+
that._bIsModified = !(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime);
|
|
722
|
+
}
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
}).then(function () {
|
|
727
|
+
if (!mParameters.skipDiscardPopover) {
|
|
728
|
+
return that._showDiscardPopover(oCancelButton, that._bIsModified, oResourceBundle);
|
|
729
|
+
} else {
|
|
730
|
+
return Promise.resolve();
|
|
731
|
+
}
|
|
732
|
+
}).then(function () {
|
|
733
|
+
if (mParameters.beforeCancelCallBack) {
|
|
734
|
+
onBeforeCancelPromise = mParameters.beforeCancelCallBack({
|
|
735
|
+
context: oContext
|
|
736
|
+
});
|
|
737
|
+
} else {
|
|
738
|
+
onBeforeCancelPromise = Promise.resolve();
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
return onBeforeCancelPromise;
|
|
742
|
+
}).then(function () {
|
|
743
|
+
// eslint-disable-next-line default-case
|
|
744
|
+
switch (sProgrammingModel) {
|
|
745
|
+
case ProgrammingModel.Draft:
|
|
746
|
+
return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
|
|
747
|
+
var oDeletePromise;
|
|
748
|
+
|
|
749
|
+
if (!bHasActiveEntity) {
|
|
750
|
+
if (oParamsContext && oParamsContext.hasPendingChanges()) {
|
|
751
|
+
oParamsContext.getBinding().resetChanges();
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
oDeletePromise = draft.deleteDraft(oParamsContext);
|
|
755
|
+
return oDeletePromise;
|
|
756
|
+
} else {
|
|
757
|
+
var oActiveContext = oModel.bindContext(oParamsContext.getPath() + "/SiblingEntity").getBoundContext();
|
|
758
|
+
return oActiveContext.requestCanonicalPath().then(function (sPath) {
|
|
759
|
+
sCanonicalPath = sPath;
|
|
760
|
+
|
|
761
|
+
if (oParamsContext && oParamsContext.hasPendingChanges()) {
|
|
762
|
+
oParamsContext.getBinding().resetChanges();
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
oDeletePromise = draft.deleteDraft(oParamsContext);
|
|
766
|
+
return oDeletePromise;
|
|
767
|
+
}, function () {
|
|
768
|
+
draft.deleteDraft(oParamsContext);
|
|
769
|
+
return;
|
|
770
|
+
}).then(function () {
|
|
771
|
+
//oParamsContext.delete() in the previous promise doesnt return anything upon success.
|
|
772
|
+
if (!sCanonicalPath) {
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
if (oActiveContext.getPath() !== sCanonicalPath) {
|
|
777
|
+
// the active context is using the sibling entity - this path is not accessible anymore as we deleted the draft
|
|
778
|
+
// document - therefore we need to create a new context with the canonical path
|
|
779
|
+
oActiveContext = oModel.bindContext(sCanonicalPath).getBoundContext();
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
return oActiveContext;
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
case ProgrammingModel.Sticky:
|
|
788
|
+
return sticky.discardDocument(oContext).then(function (oContext) {
|
|
789
|
+
if (oContext) {
|
|
790
|
+
if (oContext.hasPendingChanges()) {
|
|
791
|
+
oContext.getBinding().resetChanges();
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
if (!that._bCreateMode) {
|
|
795
|
+
oContext.refresh();
|
|
796
|
+
return oContext;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
return false;
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
default:
|
|
804
|
+
return Promise.reject("Cancel document only allowed for draft or sticky session supported services");
|
|
805
|
+
}
|
|
806
|
+
}).then(function (context) {
|
|
807
|
+
that._bIsModified = false; // remove existing bound transition messages
|
|
808
|
+
|
|
809
|
+
messageHandler.removeTransitionMessages(); // show unbound messages
|
|
810
|
+
|
|
811
|
+
return messageHandler.showMessages().then(function () {
|
|
812
|
+
return context;
|
|
813
|
+
});
|
|
814
|
+
}).catch(function (err) {
|
|
815
|
+
return messageHandler.showMessages().then(function () {
|
|
816
|
+
return Promise.reject(err);
|
|
817
|
+
});
|
|
818
|
+
}).finally(function () {
|
|
819
|
+
BusyLocker.unlock(that.oLockObject);
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Saves the document.
|
|
824
|
+
*
|
|
825
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
826
|
+
* @static
|
|
827
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be saved
|
|
828
|
+
* @param oResourceBundle
|
|
829
|
+
* @param bExecuteSideEffectsOnError
|
|
830
|
+
* @param aBindings
|
|
831
|
+
* @param messageHandler
|
|
832
|
+
* @returns {Promise} Promise resolves with ???
|
|
833
|
+
* @ui5-restricted
|
|
834
|
+
* @final
|
|
835
|
+
*/
|
|
836
|
+
;
|
|
837
|
+
|
|
838
|
+
_proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
|
|
839
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
840
|
+
var that = this;
|
|
841
|
+
var sProgrammingModel = this.getProgrammingModel(oContext);
|
|
842
|
+
var oSavePromise;
|
|
843
|
+
|
|
844
|
+
if (!oContext) {
|
|
845
|
+
return Promise.reject(new Error("Binding context to draft document is required"));
|
|
846
|
+
} // in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
|
|
847
|
+
// is sent to the backend
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
messageHandler.removeTransitionMessages();
|
|
851
|
+
BusyLocker.lock(that.oLockObject);
|
|
852
|
+
|
|
853
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
854
|
+
oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
|
|
855
|
+
} else if (sProgrammingModel === ProgrammingModel.Sticky) {
|
|
856
|
+
var bEnableStrictHandling = UriParameters.fromQuery(window.location.search).get("sap-fe-save-strict-mode") === "true";
|
|
857
|
+
oSavePromise = sticky.activateDocument(oContext, bEnableStrictHandling);
|
|
858
|
+
} else {
|
|
859
|
+
BusyLocker.unlock(that.oLockObject);
|
|
860
|
+
return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
return oSavePromise.then(function (oActiveDocument) {
|
|
864
|
+
var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
|
|
865
|
+
MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
|
|
866
|
+
that._bIsModified = false;
|
|
867
|
+
return messageHandler.showMessageDialog().then(function () {
|
|
868
|
+
return oActiveDocument;
|
|
869
|
+
});
|
|
870
|
+
}).catch(function (err) {
|
|
871
|
+
if (aBindings && aBindings.length > 0) {
|
|
872
|
+
/* The sideEffects are executed only for table items in transient state */
|
|
873
|
+
aBindings.forEach(function (oListBinding) {
|
|
874
|
+
if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
|
|
875
|
+
var oAppComponent = that._getAppComponent();
|
|
876
|
+
|
|
877
|
+
oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
return messageHandler.showMessages().then(function () {
|
|
883
|
+
return Promise.reject(err);
|
|
884
|
+
});
|
|
885
|
+
}).finally(function () {
|
|
886
|
+
BusyLocker.unlock(that.oLockObject);
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Calls a bound or unbound action.
|
|
891
|
+
*
|
|
892
|
+
* @function
|
|
893
|
+
* @static
|
|
894
|
+
* @name sap.fe.core.TransactionHelper.callAction
|
|
895
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
896
|
+
* @param {string} sActionName The name of the action to be called
|
|
897
|
+
* @param {map} [mParameters] Contains the following attributes:
|
|
898
|
+
* @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
|
|
899
|
+
* @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
|
|
900
|
+
* @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
|
|
901
|
+
* @param {string} [mParameters.label] A human-readable label for the action
|
|
902
|
+
* @param {boolean} [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
|
|
903
|
+
* @param {object} oView Contains the object of the current view
|
|
904
|
+
* @param messageHandler
|
|
905
|
+
* @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
|
|
906
|
+
* @ui5-restricted
|
|
907
|
+
* @final
|
|
908
|
+
**/
|
|
909
|
+
;
|
|
910
|
+
|
|
911
|
+
_proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
|
|
912
|
+
mParameters = getParameters(mParameters); // eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
913
|
+
|
|
914
|
+
var that = this;
|
|
915
|
+
var oContext, oModel, oPromise;
|
|
916
|
+
var mBindingParameters = mParameters.bindingParameters;
|
|
917
|
+
|
|
918
|
+
if (!sActionName) {
|
|
919
|
+
return Promise.reject("Provide name of action to be executed");
|
|
920
|
+
} // action imports are not directly obtained from the metaModel by it is present inside the entityContainer
|
|
921
|
+
// and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
|
|
922
|
+
// split() on its name was required
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
var sName = sActionName.split("/")[1];
|
|
926
|
+
sActionName = sName || sActionName;
|
|
927
|
+
oContext = sName ? undefined : mParameters.contexts; //checking whether the context is an array with more than 0 length or not an array(create action)
|
|
928
|
+
|
|
929
|
+
if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
|
|
930
|
+
oContext = Array.isArray(oContext) ? oContext[0] : oContext;
|
|
931
|
+
oModel = oContext.getModel();
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
if (mParameters.model) {
|
|
935
|
+
oModel = mParameters.model;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
if (!oModel) {
|
|
939
|
+
return Promise.reject("Pass a context for a bound action or pass the model for an unbound action");
|
|
940
|
+
} // get the binding parameters $select and $expand for the side effect on this action
|
|
941
|
+
// also gather additional property paths to be requested such as text associations
|
|
942
|
+
|
|
943
|
+
|
|
944
|
+
var oAppComponent = that._getAppComponent();
|
|
945
|
+
|
|
946
|
+
var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
|
|
947
|
+
|
|
948
|
+
if (oContext && oModel) {
|
|
949
|
+
oPromise = new Promise(function (resolve, reject) {
|
|
950
|
+
var oApplicableContextDialog;
|
|
951
|
+
var oController = {
|
|
952
|
+
onClose: function () {
|
|
953
|
+
// User cancels action
|
|
954
|
+
oApplicableContextDialog.close();
|
|
955
|
+
resolve();
|
|
956
|
+
},
|
|
957
|
+
onContinue: function () {
|
|
958
|
+
// Users continues the action with the bound contexts
|
|
959
|
+
oApplicableContextDialog.close();
|
|
960
|
+
resolve(mParameters.applicableContext);
|
|
961
|
+
}
|
|
962
|
+
};
|
|
963
|
+
|
|
964
|
+
var fnOpenAndFillDialog = function () {
|
|
965
|
+
var oDialogContent;
|
|
966
|
+
var nNotApplicable = mParameters.notApplicableContext.length,
|
|
967
|
+
aNotApplicableItems = [];
|
|
968
|
+
|
|
969
|
+
for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
|
|
970
|
+
oDialogContent = mParameters.notApplicableContext[i].getObject();
|
|
971
|
+
aNotApplicableItems.push(oDialogContent);
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
|
|
975
|
+
var oTotals = new JSONModel({
|
|
976
|
+
total: nNotApplicable,
|
|
977
|
+
label: mParameters.label
|
|
978
|
+
});
|
|
979
|
+
oApplicableContextDialog.setModel(oNotApplicableItemsModel, "notApplicable");
|
|
980
|
+
oApplicableContextDialog.setModel(oTotals, "totals");
|
|
981
|
+
oApplicableContextDialog.open();
|
|
982
|
+
};
|
|
983
|
+
|
|
984
|
+
if (mParameters.notApplicableContext && mParameters.notApplicableContext.length >= 1) {
|
|
985
|
+
// Show the contexts that are not applicable and will not therefore be processed
|
|
986
|
+
var sFragmentName = "sap.fe.core.controls.ActionPartial";
|
|
987
|
+
var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
988
|
+
var oMetaModel = oModel.getMetaModel();
|
|
989
|
+
var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
|
|
990
|
+
var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")) + "/";
|
|
991
|
+
var oDialogLabelModel = new JSONModel({
|
|
992
|
+
title: mParameters.label
|
|
993
|
+
});
|
|
994
|
+
Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
|
|
995
|
+
name: sFragmentName
|
|
996
|
+
}, {
|
|
997
|
+
bindingContexts: {
|
|
998
|
+
entityType: oMetaModel.createBindingContext(sEntitySet),
|
|
999
|
+
label: oDialogLabelModel.createBindingContext("/")
|
|
1000
|
+
},
|
|
1001
|
+
models: {
|
|
1002
|
+
entityType: oMetaModel,
|
|
1003
|
+
metaModel: oMetaModel,
|
|
1004
|
+
label: oDialogLabelModel
|
|
1005
|
+
}
|
|
1006
|
+
})).then(function (oFragment) {
|
|
1007
|
+
return Fragment.load({
|
|
1008
|
+
definition: oFragment,
|
|
1009
|
+
controller: oController
|
|
1010
|
+
});
|
|
1011
|
+
}).then(function (oPopover) {
|
|
1012
|
+
oApplicableContextDialog = oPopover;
|
|
1013
|
+
mParameters.parentControl.addDependent(oPopover);
|
|
1014
|
+
fnOpenAndFillDialog();
|
|
1015
|
+
}).catch(reject);
|
|
1016
|
+
} else {
|
|
1017
|
+
resolve(mParameters.contexts);
|
|
1018
|
+
}
|
|
1019
|
+
}).then(function (contextToProcess) {
|
|
1020
|
+
if (contextToProcess) {
|
|
1021
|
+
return operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
|
|
1022
|
+
invocationGrouping: mParameters.invocationGrouping,
|
|
1023
|
+
label: mParameters.label,
|
|
1024
|
+
showActionParameterDialog: true,
|
|
1025
|
+
mBindingParameters: mBindingParameters,
|
|
1026
|
+
entitySetName: mParameters.entitySetName,
|
|
1027
|
+
additionalSideEffect: mSideEffectsParameters,
|
|
1028
|
+
onSubmitted: function () {
|
|
1029
|
+
messageHandler.removeTransitionMessages();
|
|
1030
|
+
BusyLocker.lock(that.oLockObject);
|
|
1031
|
+
},
|
|
1032
|
+
onResponse: function () {
|
|
1033
|
+
BusyLocker.unlock(that.oLockObject);
|
|
1034
|
+
},
|
|
1035
|
+
parentControl: mParameters.parentControl,
|
|
1036
|
+
controlId: mParameters.controlId,
|
|
1037
|
+
internalModelContext: mParameters.internalModelContext,
|
|
1038
|
+
operationAvailableMap: mParameters.operationAvailableMap,
|
|
1039
|
+
bIsCreateAction: mParameters.bIsCreateAction,
|
|
1040
|
+
bGetBoundContext: mParameters.bGetBoundContext,
|
|
1041
|
+
bObjectPage: mParameters.bObjectPage,
|
|
1042
|
+
messageHandler: messageHandler,
|
|
1043
|
+
defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
|
|
1044
|
+
});
|
|
1045
|
+
} else {
|
|
1046
|
+
return null;
|
|
1047
|
+
}
|
|
1048
|
+
});
|
|
1049
|
+
} else {
|
|
1050
|
+
// TODO: confirm if action import needs side effects.
|
|
1051
|
+
oPromise = operations.callActionImport(sActionName, oModel, oAppComponent, {
|
|
1052
|
+
label: mParameters.label,
|
|
1053
|
+
showActionParameterDialog: true,
|
|
1054
|
+
bindingParameters: mBindingParameters,
|
|
1055
|
+
entitySetName: mParameters.entitySetName,
|
|
1056
|
+
onSubmitted: function () {
|
|
1057
|
+
BusyLocker.lock(that.oLockObject);
|
|
1058
|
+
},
|
|
1059
|
+
onResponse: function () {
|
|
1060
|
+
BusyLocker.unlock(that.oLockObject);
|
|
1061
|
+
},
|
|
1062
|
+
parentControl: mParameters.parentControl,
|
|
1063
|
+
internalModelContext: mParameters.internalModelContext,
|
|
1064
|
+
operationAvailableMap: mParameters.operationAvailableMap,
|
|
1065
|
+
messageHandler: messageHandler,
|
|
1066
|
+
bObjectPage: mParameters.bObjectPage
|
|
1067
|
+
});
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
return oPromise.then(function (oResult) {
|
|
1071
|
+
// Succeeded
|
|
1072
|
+
return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
|
|
1073
|
+
return oResult;
|
|
1074
|
+
});
|
|
1075
|
+
}).catch(function (err) {
|
|
1076
|
+
return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
|
|
1077
|
+
return Promise.reject(err);
|
|
1078
|
+
});
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Handles messages for action call.
|
|
1083
|
+
*
|
|
1084
|
+
* @function
|
|
1085
|
+
* @name sap.fe.core.TransactionHelper#_handleActionResponse
|
|
1086
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1087
|
+
* @param messageHandler
|
|
1088
|
+
* @param {object} mParameters Parameters to be considered for the action.
|
|
1089
|
+
* @param {string} sActionName The name of the action to be called
|
|
1090
|
+
* @returns {Promise} Promise after message dialog is opened if required.
|
|
1091
|
+
* @ui5-restricted
|
|
1092
|
+
* @final
|
|
1093
|
+
*/
|
|
1094
|
+
;
|
|
1095
|
+
|
|
1096
|
+
_proto._handleActionResponse = function _handleActionResponse(messageHandler, mParameters, sActionName) {
|
|
1097
|
+
var aTransientMessages = messageHandling.getMessages(true, true);
|
|
1098
|
+
|
|
1099
|
+
if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
|
|
1100
|
+
mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
return messageHandler.showMessages();
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Handles validation errors for the 'discard' action.
|
|
1107
|
+
*
|
|
1108
|
+
* @function
|
|
1109
|
+
* @name sap.fe.core.TransactionHelper#handleValidationError
|
|
1110
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1111
|
+
* @static
|
|
1112
|
+
* @ui5-restricted
|
|
1113
|
+
* @final
|
|
1114
|
+
*/
|
|
1115
|
+
;
|
|
1116
|
+
|
|
1117
|
+
_proto.handleValidationError = function handleValidationError() {
|
|
1118
|
+
var oMessageManager = Core.getMessageManager(),
|
|
1119
|
+
errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
|
|
1120
|
+
// only needs to handle validation messages, technical and persistent errors needs not to be checked here.
|
|
1121
|
+
if (error.validation) {
|
|
1122
|
+
return error;
|
|
1123
|
+
}
|
|
1124
|
+
});
|
|
1125
|
+
oMessageManager.removeMessages(errorToRemove);
|
|
1126
|
+
}
|
|
1127
|
+
/**
|
|
1128
|
+
* Shows a popover if it needs to be shown.
|
|
1129
|
+
* TODO: Popover is shown if user has modified any data.
|
|
1130
|
+
* TODO: Popover is shown if there's a difference from draft admin data.
|
|
1131
|
+
* @static
|
|
1132
|
+
* @name sap.fe.core.TransactionHelper._showDiscardPopover
|
|
1133
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1134
|
+
* @param {sap.ui.core.Control} oCancelButton The control which will open the popover
|
|
1135
|
+
* @param bIsModified
|
|
1136
|
+
* @param oResourceBundle
|
|
1137
|
+
* @returns {Promise} Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
|
|
1138
|
+
* @ui5-restricted
|
|
1139
|
+
* @final
|
|
1140
|
+
*/
|
|
1141
|
+
;
|
|
1142
|
+
|
|
1143
|
+
_proto._showDiscardPopover = function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
|
|
1144
|
+
// TODO: Implement this popover as a fragment as in v2??
|
|
1145
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
1146
|
+
var that = this;
|
|
1147
|
+
that._bContinueDiscard = false; // to be implemented
|
|
1148
|
+
|
|
1149
|
+
return new Promise(function (resolve, reject) {
|
|
1150
|
+
if (!oCancelButton) {
|
|
1151
|
+
reject("Cancel button not found");
|
|
1152
|
+
} //Show popover only when data is changed.
|
|
1153
|
+
|
|
1154
|
+
|
|
1155
|
+
if (bIsModified) {
|
|
1156
|
+
var fnOnAfterDiscard = function () {
|
|
1157
|
+
oCancelButton.setEnabled(true);
|
|
1158
|
+
|
|
1159
|
+
if (that._bContinueDiscard) {
|
|
1160
|
+
resolve();
|
|
1161
|
+
} else {
|
|
1162
|
+
reject("Discard operation was rejected. Document has not been discarded");
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
that._oPopover.detachAfterClose(fnOnAfterDiscard);
|
|
1166
|
+
};
|
|
1167
|
+
|
|
1168
|
+
if (!that._oPopover) {
|
|
1169
|
+
var oText = new Text({
|
|
1170
|
+
//This text is the same as LR v2.
|
|
1171
|
+
//TODO: Display message provided by app developer???
|
|
1172
|
+
text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
|
|
1173
|
+
}),
|
|
1174
|
+
oButton = new Button({
|
|
1175
|
+
text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
|
|
1176
|
+
width: "100%",
|
|
1177
|
+
press: function () {
|
|
1178
|
+
that.handleValidationError();
|
|
1179
|
+
that._bContinueDiscard = true;
|
|
1180
|
+
|
|
1181
|
+
that._oPopover.close();
|
|
1182
|
+
},
|
|
1183
|
+
ariaLabelledBy: oText
|
|
1184
|
+
});
|
|
1185
|
+
that._oPopover = new Popover({
|
|
1186
|
+
showHeader: false,
|
|
1187
|
+
placement: "Top",
|
|
1188
|
+
content: [new VBox({
|
|
1189
|
+
items: [oText, oButton]
|
|
1190
|
+
})],
|
|
1191
|
+
beforeOpen: function () {
|
|
1192
|
+
// make sure to NOT trigger multiple cancel flows
|
|
1193
|
+
oCancelButton.setEnabled(false);
|
|
1194
|
+
|
|
1195
|
+
that._oPopover.setInitialFocus(oButton);
|
|
1196
|
+
}
|
|
1197
|
+
});
|
|
1198
|
+
|
|
1199
|
+
that._oPopover.addStyleClass("sapUiContentPadding");
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
that._oPopover.attachAfterClose(fnOnAfterDiscard);
|
|
1203
|
+
|
|
1204
|
+
that._oPopover.openBy(oCancelButton, false);
|
|
1205
|
+
} else {
|
|
1206
|
+
that.handleValidationError();
|
|
1207
|
+
resolve();
|
|
1208
|
+
}
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Sets the document to modified state on patch event.
|
|
1213
|
+
*
|
|
1214
|
+
* @function
|
|
1215
|
+
* @static
|
|
1216
|
+
* @name sap.fe.core.TransactionHelper.handleDocumentModifications
|
|
1217
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1218
|
+
* @ui5-restricted
|
|
1219
|
+
* @final
|
|
1220
|
+
*/
|
|
1221
|
+
;
|
|
1222
|
+
|
|
1223
|
+
_proto.handleDocumentModifications = function handleDocumentModifications() {
|
|
1224
|
+
this._bIsModified = true;
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Retrieves the owner component.
|
|
1228
|
+
*
|
|
1229
|
+
* @function
|
|
1230
|
+
* @static
|
|
1231
|
+
* @private
|
|
1232
|
+
* @name sap.fe.core.TransactionHelper._getOwnerComponent
|
|
1233
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1234
|
+
* @returns {sap.fe.core.AppComponent} The app component
|
|
1235
|
+
* @ui5-restricted
|
|
1236
|
+
* @final
|
|
1237
|
+
**/
|
|
1238
|
+
;
|
|
1239
|
+
|
|
1240
|
+
_proto._getAppComponent = function _getAppComponent() {
|
|
1241
|
+
return this._oAppComponent;
|
|
1242
|
+
};
|
|
1243
|
+
|
|
1244
|
+
_proto._onFieldChange = function _onFieldChange(oEvent, oCreateButton, messageHandler, fnValidateRequiredProperties) {
|
|
1245
|
+
messageHandler.removeTransitionMessages();
|
|
1246
|
+
var oField = oEvent.getSource();
|
|
1247
|
+
var oFieldPromise = oEvent.getParameter("promise");
|
|
1248
|
+
|
|
1249
|
+
if (oFieldPromise) {
|
|
1250
|
+
return oFieldPromise.then(function (value) {
|
|
1251
|
+
// Setting value of field as '' in case of value help and validating other fields
|
|
1252
|
+
oField.setValue(value);
|
|
1253
|
+
fnValidateRequiredProperties();
|
|
1254
|
+
return oField.getValue();
|
|
1255
|
+
}).catch(function (value) {
|
|
1256
|
+
if (value !== "") {
|
|
1257
|
+
//disabling the continue button in case of invalid value in field
|
|
1258
|
+
oCreateButton.setEnabled(false);
|
|
1259
|
+
} else {
|
|
1260
|
+
// validating all the fields in case of empty value in field
|
|
1261
|
+
oField.setValue(value);
|
|
1262
|
+
fnValidateRequiredProperties();
|
|
1263
|
+
}
|
|
1264
|
+
});
|
|
1265
|
+
}
|
|
1266
|
+
};
|
|
1267
|
+
|
|
1268
|
+
_proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
|
|
1269
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
1270
|
+
var that = this;
|
|
1271
|
+
var oDialog;
|
|
1272
|
+
var oParentControl = mParameters.parentControl,
|
|
1273
|
+
bSuccess = false;
|
|
1274
|
+
return new Promise(function (resolve, reject) {
|
|
1275
|
+
var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
|
|
1276
|
+
|
|
1277
|
+
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
|
|
1278
|
+
oResourceBundle = oParentControl.getController().oResourceBundle,
|
|
1279
|
+
oMetaModel = oModel.getMetaModel(),
|
|
1280
|
+
aImmutableFields = [],
|
|
1281
|
+
oAppComponent = that._getAppComponent(),
|
|
1282
|
+
sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
|
|
1283
|
+
oEntitySetContext = oMetaModel.createBindingContext(sPath),
|
|
1284
|
+
sMetaPath = oMetaModel.getMetaPath(sPath);
|
|
1285
|
+
|
|
1286
|
+
for (var i in mFields) {
|
|
1287
|
+
aImmutableFields.push(oMetaModel.createBindingContext(sMetaPath + "/" + mFields[i]));
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
var oImmutableCtxModel = new JSONModel(aImmutableFields);
|
|
1291
|
+
var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
|
|
1292
|
+
return Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
1293
|
+
name: sFragmentName
|
|
1294
|
+
}, {
|
|
1295
|
+
bindingContexts: {
|
|
1296
|
+
entitySet: oEntitySetContext,
|
|
1297
|
+
fields: oImmutableCtx
|
|
1298
|
+
},
|
|
1299
|
+
models: {
|
|
1300
|
+
entitySet: oEntitySetContext.getModel(),
|
|
1301
|
+
fields: oImmutableCtx.getModel(),
|
|
1302
|
+
metaModel: oMetaModel
|
|
1303
|
+
}
|
|
1304
|
+
})).then(function (oFragment) {
|
|
1305
|
+
var aFormElements = [];
|
|
1306
|
+
var mFieldValueMap = {};
|
|
1307
|
+
var oCreateButton;
|
|
1308
|
+
|
|
1309
|
+
var validateRequiredProperties = function () {
|
|
1310
|
+
return Promise.all(aFormElements.map(function (oFormElement) {
|
|
1311
|
+
return oFormElement.getFields()[0];
|
|
1312
|
+
}).filter(function (oField) {
|
|
1313
|
+
// The continue button should remain disabled in case of error in any field of the create dialog
|
|
1314
|
+
return oField.getRequired() || oField.getValueState() === ValueState.Error && oField.getValue() !== "";
|
|
1315
|
+
}).map(function (oField) {
|
|
1316
|
+
var sFieldId = oField.getId();
|
|
1317
|
+
|
|
1318
|
+
if (sFieldId in mFieldValueMap) {
|
|
1319
|
+
return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
|
|
1320
|
+
return oField.getValueState() === ValueState.Error ? undefined : vValue;
|
|
1321
|
+
}).catch(function () {
|
|
1322
|
+
return undefined;
|
|
1323
|
+
});
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
|
|
1327
|
+
})).then(function (aResults) {
|
|
1328
|
+
return aResults.every(function (vValue) {
|
|
1329
|
+
return vValue !== undefined && vValue !== null && vValue !== "";
|
|
1330
|
+
});
|
|
1331
|
+
}).catch(function () {
|
|
1332
|
+
return false;
|
|
1333
|
+
}).then(function (bEnabled) {
|
|
1334
|
+
oCreateButton.setEnabled(bEnabled);
|
|
1335
|
+
});
|
|
1336
|
+
};
|
|
1337
|
+
|
|
1338
|
+
var oController = {
|
|
1339
|
+
/*
|
|
1340
|
+
fired on focus out from field or on selecting a value from the valuehelp.
|
|
1341
|
+
the create button is enabled when a value is added.
|
|
1342
|
+
liveChange is not fired when value is added from valuehelp.
|
|
1343
|
+
value validation is not done for create button enablement.
|
|
1344
|
+
*/
|
|
1345
|
+
handleChange: function (oEvent) {
|
|
1346
|
+
var sFieldId = oEvent.getParameter("id");
|
|
1347
|
+
mFieldValueMap[sFieldId] = that._onFieldChange(oEvent, oCreateButton, messageHandler, validateRequiredProperties);
|
|
1348
|
+
},
|
|
1349
|
+
|
|
1350
|
+
/*
|
|
1351
|
+
fired on key press. the create button is enabled when a value is added.
|
|
1352
|
+
liveChange is not fired when value is added from valuehelp.
|
|
1353
|
+
value validation is not done for create button enablement.
|
|
1354
|
+
*/
|
|
1355
|
+
handleLiveChange: function (oEvent) {
|
|
1356
|
+
var sFieldId = oEvent.getParameter("id");
|
|
1357
|
+
var vValue = oEvent.getParameter("value");
|
|
1358
|
+
mFieldValueMap[sFieldId] = vValue;
|
|
1359
|
+
validateRequiredProperties();
|
|
1360
|
+
}
|
|
1361
|
+
};
|
|
1362
|
+
return Fragment.load({
|
|
1363
|
+
definition: oFragment,
|
|
1364
|
+
controller: oController
|
|
1365
|
+
}).then(function (oDialogContent) {
|
|
1366
|
+
oDialog = new Dialog({
|
|
1367
|
+
title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
|
|
1368
|
+
content: [oDialogContent],
|
|
1369
|
+
beginButton: {
|
|
1370
|
+
text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
|
|
1371
|
+
type: "Emphasized",
|
|
1372
|
+
press: function (oEvent) {
|
|
1373
|
+
var oCreateButton = oEvent.getSource();
|
|
1374
|
+
oCreateButton.setEnabled(false);
|
|
1375
|
+
BusyLocker.lock(oDialog);
|
|
1376
|
+
mParameters.bIsCreateDialog = true;
|
|
1377
|
+
return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
|
|
1378
|
+
return mFieldValueMap[sKey].then(function (oValue) {
|
|
1379
|
+
var oDialogValue = {};
|
|
1380
|
+
oDialogValue[sKey] = oValue;
|
|
1381
|
+
return oDialogValue;
|
|
1382
|
+
});
|
|
1383
|
+
})).then(function (aValues) {
|
|
1384
|
+
var onBeforeCreatePromise;
|
|
1385
|
+
|
|
1386
|
+
if (mParameters.beforeCreateCallBack) {
|
|
1387
|
+
onBeforeCreatePromise = mParameters.beforeCreateCallBack({
|
|
1388
|
+
contextPath: oListBinding && oListBinding.getPath(),
|
|
1389
|
+
createParameters: aValues
|
|
1390
|
+
});
|
|
1391
|
+
} else {
|
|
1392
|
+
onBeforeCreatePromise = Promise.resolve();
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
return onBeforeCreatePromise;
|
|
1396
|
+
}).then(function () {
|
|
1397
|
+
var oPromise = that.onAfterCreateCompletion(oTransientListBinding, oTransientContext, mParameters);
|
|
1398
|
+
oModel.submitBatch("submitLater");
|
|
1399
|
+
return oPromise;
|
|
1400
|
+
}).then(function (oResponse) {
|
|
1401
|
+
if (!oResponse || oResponse && oResponse.bKeepDialogOpen !== true) {
|
|
1402
|
+
oDialog.setBindingContext(null);
|
|
1403
|
+
oDialog.close();
|
|
1404
|
+
resolve(oResponse);
|
|
1405
|
+
}
|
|
1406
|
+
}).catch(function (oError) {
|
|
1407
|
+
reject(oError);
|
|
1408
|
+
}).finally(function () {
|
|
1409
|
+
BusyLocker.unlock(oDialog);
|
|
1410
|
+
oCreateButton.setEnabled(true);
|
|
1411
|
+
return messageHandler.showMessages();
|
|
1412
|
+
});
|
|
1413
|
+
}
|
|
1414
|
+
},
|
|
1415
|
+
endButton: {
|
|
1416
|
+
text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
|
|
1417
|
+
press: function () {
|
|
1418
|
+
oDialog.close();
|
|
1419
|
+
}
|
|
1420
|
+
},
|
|
1421
|
+
afterClose: function () {
|
|
1422
|
+
var _oDialog$getBindingCo;
|
|
1423
|
+
|
|
1424
|
+
// show footer as per UX guidelines when dialog is not open
|
|
1425
|
+
(_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
|
|
1426
|
+
oDialog.destroy();
|
|
1427
|
+
|
|
1428
|
+
if (!bSuccess) {
|
|
1429
|
+
reject({
|
|
1430
|
+
bDeleteTransientContext: true,
|
|
1431
|
+
navigateBackFromTransientState: true
|
|
1432
|
+
});
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
});
|
|
1436
|
+
aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
|
|
1437
|
+
|
|
1438
|
+
if (oParentControl && oParentControl.addDependent) {
|
|
1439
|
+
// if there is a parent control specified add the dialog as dependent
|
|
1440
|
+
oParentControl.addDependent(oDialog);
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
oCreateButton = oDialog.getBeginButton();
|
|
1444
|
+
oDialog.setBindingContext(oTransientContext);
|
|
1445
|
+
return CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data).then(function () {
|
|
1446
|
+
validateRequiredProperties(); // footer must not be visible when the dialog is open as per UX guidelines
|
|
1447
|
+
|
|
1448
|
+
oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
|
|
1449
|
+
oDialog.open();
|
|
1450
|
+
}).catch(function (oError) {
|
|
1451
|
+
return messageHandler.showMessages().then(function () {
|
|
1452
|
+
return Promise.reject(oError);
|
|
1453
|
+
});
|
|
1454
|
+
});
|
|
1455
|
+
});
|
|
1456
|
+
});
|
|
1457
|
+
});
|
|
1458
|
+
};
|
|
1459
|
+
|
|
1460
|
+
_proto.onAfterCreateCompletion = function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
|
|
1461
|
+
var fnResolve, fnReject;
|
|
1462
|
+
var oPromise = new Promise(function (resolve, reject) {
|
|
1463
|
+
fnResolve = resolve;
|
|
1464
|
+
fnReject = reject;
|
|
1465
|
+
}); // eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
1466
|
+
|
|
1467
|
+
var that = this; // Workaround suggested by OData model v4 colleagues
|
|
1468
|
+
|
|
1469
|
+
var fnCreateCompleted = function (oEvent) {
|
|
1470
|
+
var oContext = oEvent.getParameter("context"),
|
|
1471
|
+
bSuccess = oEvent.getParameter("success");
|
|
1472
|
+
|
|
1473
|
+
if (oContext === oNewDocumentContext) {
|
|
1474
|
+
oListBinding.detachCreateCompleted(fnCreateCompleted, that);
|
|
1475
|
+
|
|
1476
|
+
if (!bSuccess) {
|
|
1477
|
+
var oError = {
|
|
1478
|
+
bDeleteTransientContext: false
|
|
1479
|
+
};
|
|
1480
|
+
|
|
1481
|
+
if (!mParameters.keepTransientContextOnFailed) {
|
|
1482
|
+
// the context is deleted
|
|
1483
|
+
// this is needed to avoid console errors TO be checked with model colleagues
|
|
1484
|
+
oContext.created().then(undefined, function () {
|
|
1485
|
+
Log.trace("transient creation context deleted");
|
|
1486
|
+
}).catch(function (oError) {
|
|
1487
|
+
Log.trace("transient creation context deletion error", oError);
|
|
1488
|
+
});
|
|
1489
|
+
|
|
1490
|
+
if (!mParameters.bIsCreateDialog) {
|
|
1491
|
+
// if current state is transient (...), browser will come back to previous state
|
|
1492
|
+
oError.navigateBackFromTransientState = true;
|
|
1493
|
+
oError.bDeleteTransientContext = true;
|
|
1494
|
+
fnReject(oError);
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
fnResolve({
|
|
1499
|
+
bKeepDialogOpen: true
|
|
1500
|
+
});
|
|
1501
|
+
} else {
|
|
1502
|
+
fnResolve();
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
};
|
|
1506
|
+
|
|
1507
|
+
oListBinding.attachCreateCompleted(fnCreateCompleted, this);
|
|
1508
|
+
return oPromise;
|
|
1509
|
+
}
|
|
1510
|
+
/**
|
|
1511
|
+
* Retrieves the name of the NewAction to be executed.
|
|
1512
|
+
*
|
|
1513
|
+
* @function
|
|
1514
|
+
* @static
|
|
1515
|
+
* @private
|
|
1516
|
+
* @name sap.fe.core.TransactionHelper._getNewAction
|
|
1517
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1518
|
+
* @param {object} oStartupParameters Startup parameters of the application
|
|
1519
|
+
* @param {string} sCreateHash Hash to be checked for action type
|
|
1520
|
+
* @param {object} oMetaModel The MetaModel used to check for NewAction parameter
|
|
1521
|
+
* @param {string} sMetaPath The MetaPath
|
|
1522
|
+
* @returns {string} The name of the action
|
|
1523
|
+
* @ui5-restricted
|
|
1524
|
+
* @final
|
|
1525
|
+
**/
|
|
1526
|
+
;
|
|
1527
|
+
|
|
1528
|
+
_proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
|
|
1529
|
+
var sNewAction;
|
|
1530
|
+
|
|
1531
|
+
if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.indexOf("i-action=createWith") > -1) {
|
|
1532
|
+
var sPreferredMode = oStartupParameters.preferredMode[0];
|
|
1533
|
+
sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
|
|
1534
|
+
} else {
|
|
1535
|
+
sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction") || oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction") : undefined;
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
return sNewAction;
|
|
1539
|
+
}
|
|
1540
|
+
/**
|
|
1541
|
+
* Retrieves the label for the title of a specific create action dialog, e.g. Create Sales Order from Quotation.
|
|
1542
|
+
*
|
|
1543
|
+
* The following priority is applied:
|
|
1544
|
+
* 1. label of line-item annotation.
|
|
1545
|
+
* 2. label annotated in the action.
|
|
1546
|
+
* 3. "Create" as a constant from i18n.
|
|
1547
|
+
*
|
|
1548
|
+
* @function
|
|
1549
|
+
* @static
|
|
1550
|
+
* @private
|
|
1551
|
+
* @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
|
|
1552
|
+
* @memberof sap.fe.core.TransactionHelper
|
|
1553
|
+
* @param {object} oMetaModel The MetaModel used to check for the NewAction parameter
|
|
1554
|
+
* @param {string} sMetaPath The MetaPath
|
|
1555
|
+
* @param {string} sNewAction Contains the name of the action to be executed
|
|
1556
|
+
* @param {object} oResourceBundleCore ResourceBundle to access the default Create label
|
|
1557
|
+
* @returns {string} The label for the Create Action Dialog
|
|
1558
|
+
* @ui5-restricted
|
|
1559
|
+
* @final
|
|
1560
|
+
**/
|
|
1561
|
+
;
|
|
1562
|
+
|
|
1563
|
+
_proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
|
|
1564
|
+
var fnGetLabelFromLineItemAnnotation = function () {
|
|
1565
|
+
if (oMetaModel && oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")) {
|
|
1566
|
+
var iLineItemIndex = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem").findIndex(function (oLineItem) {
|
|
1567
|
+
var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
|
|
1568
|
+
return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
|
|
1569
|
+
});
|
|
1570
|
+
return iLineItemIndex > -1 ? oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")[iLineItemIndex].Label : undefined;
|
|
1571
|
+
} else {
|
|
1572
|
+
return undefined;
|
|
1573
|
+
}
|
|
1574
|
+
};
|
|
1575
|
+
|
|
1576
|
+
return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject(sMetaPath + "/" + sNewAction + "@com.sap.vocabularies.Common.v1.Label") || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
|
|
1577
|
+
};
|
|
1578
|
+
|
|
1579
|
+
return TransactionHelper;
|
|
1580
|
+
}();
|
|
1581
|
+
|
|
1582
|
+
return TransactionHelper;
|
|
1583
|
+
}, false);
|
|
1584
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2Q29udGV4dHMiLCJmblJlamVjdCIsImZuUmVzb2x2ZSIsImFEZWxldGFibGVDb250ZXh0cyIsImlzTG9ja2VkVGV4dFZpc2libGUiLCJjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSIsImJEaWFsb2dDb25maXJtZWQiLCJhUGFyYW1zIiwib0RlbGV0ZU1lc3NhZ2UiLCJ0aXRsZSIsImdldFRleHQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJvQ29udGV4dERhdGEiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJkcmFmdEFkbWluRGF0YSIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImNvbmNhdCIsImxvY2tlZENvbnRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImNoZWNrQm94VGV4dCIsIm9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wiLCJvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sIiwib0NvbnRlbnQiLCJWQm94IiwiaXRlbXMiLCJUZXh0IiwidmlzaWJsZSIsIkNoZWNrQm94Iiwic2VsZWN0ZWQiLCJzZWxlY3QiLCJvRXZlbnQiLCJnZXRTb3VyY2UiLCJnZXRTZWxlY3RlZCIsInNUaXRsZSIsImZuQ29uZmlybSIsIm9uQmVmb3JlRGVsZXRlUHJvbWlzZSIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiYmluZCIsImRyYWZ0IiwiZGVsZXRlRHJhZnQiLCJzaG93TWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJnZXRWaXNpYmxlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIndhcm5pbmciLCJlZGl0RG9jdW1lbnQiLCJvRWRpdFByb21pc2UiLCJFcnJvciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsIm9OZXdDb250ZXh0IiwiZXJyIiwiY2FuY2VsRG9jdW1lbnQiLCJvUGFyYW1zQ29udGV4dCIsIm9DYW5jZWxCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJvbkJlZm9yZUNhbmNlbFByb21pc2UiLCJzQ2Fub25pY2FsUGF0aCIsInNQTW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfc2hvd0Rpc2NhcmRQb3BvdmVyIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjb250ZXh0Iiwib0RlbGV0ZVByb21pc2UiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJvU2F2ZVByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwiVXJpUGFyYW1ldGVycyIsImZyb21RdWVyeSIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiZ2V0Iiwib0FjdGl2ZURvY3VtZW50IiwiYk5ld09iamVjdCIsImZvckVhY2giLCJvTGlzdEJpbmRpbmciLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJvUHJvbWlzZSIsInNOYW1lIiwic3BsaXQiLCJtb2RlbCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwib0FwcGxpY2FibGVDb250ZXh0RGlhbG9nIiwib0NvbnRyb2xsZXIiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHQiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGVDb250ZXh0IiwiYU5vdEFwcGxpY2FibGVJdGVtcyIsIm9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCIsIkpTT05Nb2RlbCIsIm9Ub3RhbHMiLCJ0b3RhbCIsInNldE1vZGVsIiwic0ZyYWdtZW50TmFtZSIsIm9EaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZ2V0Q2Fub25pY2FsUGF0aCIsInNFbnRpdHlTZXQiLCJzdWJzdHIiLCJvRGlhbG9nTGFiZWxNb2RlbCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsIm1vZGVscyIsIm1ldGFNb2RlbCIsIm9GcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib1BvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJjb250ZXh0VG9Qcm9jZXNzIiwiY2FsbEJvdW5kQWN0aW9uIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiR2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJvTWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTWFuYWdlciIsImVycm9yVG9SZW1vdmUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiYklzTW9kaWZpZWQiLCJmbk9uQWZ0ZXJEaXNjYXJkIiwic2V0RW5hYmxlZCIsIl9vUG9wb3ZlciIsImRldGFjaEFmdGVyQ2xvc2UiLCJvVGV4dCIsIm9CdXR0b24iLCJ3aWR0aCIsIlBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiYmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJfb25GaWVsZENoYW5nZSIsIm9DcmVhdGVCdXR0b24iLCJmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0ZpZWxkIiwib0ZpZWxkUHJvbWlzZSIsImdldFBhcmFtZXRlciIsInZhbHVlIiwic2V0VmFsdWUiLCJnZXRWYWx1ZSIsIm9UcmFuc2llbnRDb250ZXh0IiwibUZpZWxkcyIsIm9QYXJlbnRDb250cm9sIiwiYlN1Y2Nlc3MiLCJnZXRDb250cm9sbGVyIiwiYUltbXV0YWJsZUZpZWxkcyIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0ltbXV0YWJsZUN0eE1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImVudGl0eVNldCIsImZpZWxkcyIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImFSZXN1bHRzIiwiZXZlcnkiLCJiRW5hYmxlZCIsImhhbmRsZUNoYW5nZSIsImhhbmRsZUxpdmVDaGFuZ2UiLCJiSXNDcmVhdGVEaWFsb2ciLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwic3VibWl0QmF0Y2giLCJvUmVzcG9uc2UiLCJiS2VlcERpYWxvZ09wZW4iLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiZ2V0QWdncmVnYXRpb24iLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuQ3JlYXRlQ29tcGxldGVkIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsInByZWZlcnJlZE1vZGUiLCJzUHJlZmVycmVkTW9kZSIsImZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uIiwiaUxpbmVJdGVtSW5kZXgiLCJmaW5kSW5kZXgiLCJvTGluZUl0ZW0iLCJhTGluZUl0ZW1BY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQThCQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBbkM7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLFdBQVcsQ0FBQ0QsVUFBL0I7QUFDQTs7QUFDQSxXQUFTRSxhQUFULENBQXVCQyxXQUF2QixFQUF5QztBQUN4QyxRQUFJQSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0MsV0FBM0IsSUFB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bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgVXJpUGFyYW1ldGVycyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9VcmlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIsIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuY29uc3QgVmFsdWVTdGF0ZSA9IGNvcmVMaWJyYXJ5LlZhbHVlU3RhdGU7XG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLnVpLmJhc2UuRXZlbnRcIikge1xuXHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdH1cblx0cmV0dXJuIG1QYXJhbWV0ZXJzIHx8IHt9O1xufVxuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdF9vQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdG9Mb2NrT2JqZWN0OiBhbnk7XG5cdHNQcm9ncmFtbWluZ01vZGVsPzogdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdF9iSXNNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRfYkNyZWF0ZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDb250aW51ZURpc2NhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X29Qb3BvdmVyITogUG9wb3Zlcjtcblx0Y29uc3RydWN0b3Iob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvTG9ja09iamVjdDogYW55KSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IG9BcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5vTG9ja09iamVjdCA9IG9Mb2NrT2JqZWN0O1xuXHR9XG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0aWYgKCF0aGlzLnNQcm9ncmFtbWluZ01vZGVsICYmIG9Db250ZXh0KSB7XG5cdFx0XHRsZXQgc1BhdGg7XG5cdFx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmlzUmVsYXRpdmUoKSA/IG9Db250ZXh0LmdldFJlc29sdmVkUGF0aCgpIDogb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgc1BhdGgpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYXMgdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBpcyBhIHNpbmdsZXRvbiB3ZSBkb24ndCBzdG9yZSB0aGUgbm9uIGRyYWZ0IGFzIHRoZSB1c2VyIGNvdWxkXG5cdFx0XHRcdC8vIHN0YXJ0IHdpdGggYSBub24gZHJhZnQgY2hpbGQgcGFnZSBhbmQgbmF2aWdhdGVzIGJhY2sgdG8gYSBkcmFmdCBlbmFibGVkIG9uZVxuXHRcdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgYXMgdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0dmFsaWRhdGVEb2N1bWVudChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ30gb01haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIHtvYmplY3R9IFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge21hcH0gW21JblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21JblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gYkZyb21Db3B5UGFzdGVcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdG9NYWluTGlzdEJpbmRpbmc6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGRhdGE/OiBhbnk7IGJ1c3lNb2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkOyBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYW55OyBpbmFjdGl2ZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55LFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0b1ZpZXc6IGFueVxuXHQpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdG9Nb2RlbCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSksXG5cdFx0XHRzQ3JlYXRlSGFzaCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0c05ld0FjdGlvbiA9ICFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnMsIHNDcmVhdGVIYXNoLCBvTWV0YU1vZGVsLCBzTWV0YVBhdGgpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGxldCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyczogYW55ID0geyBcIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHNcIjogdHJ1ZSB9O1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCJcblx0XHRcdCk7XG5cdFx0bGV0IGJGdW5jdGlvbk9uTmF2UHJvcDtcblx0XHRsZXQgb05ld0RvY3VtZW50Q29udGV4dDogYW55O1xuXHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIikgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzTWV0YVBhdGgpKSAhPT0gc01ldGFQYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob01haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIikge1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBsb2NhbCBidXN5IG1vZGUgd2UgdXNlIHRoZSBsaXN0IGJpbmRpbmcgbmFtZVxuXHRcdFx0Ly8gdGhlcmUncyBubyBBUFkgeWV0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSAuc0lkIFRPRE8gcHJvdmlkZSBhIHB1YmxpYyBtZXRob2Q/XG5cdFx0XHRzQnVzeVBhdGggPSBcIi9idXN5TG9jYWwvXCIgKyBvTWFpbkxpc3RCaW5kaW5nLnNJZDtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnRleHRzOiBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlIGFzIFJlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gYklzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgb1ZpZXcpXG5cdFx0XHRcdDogW107XG5cdFx0XHRzRnVuY3Rpb25OYW1lID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogc0Z1bmN0aW9uTmFtZTtcblx0XHRcdGxldCBzRnVuY3Rpb25QYXRoLCBvRnVuY3Rpb25Db250ZXh0O1xuXHRcdFx0aWYgKHNGdW5jdGlvbk5hbWUpIHtcblx0XHRcdFx0Ly9ib3VuZCB0byB0aGUgc291cmNlIGVudGl0eTpcblx0XHRcdFx0aWYgKGJGdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpO1xuXHRcdFx0aWYgKG9GdW5jdGlvbiAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KCkgJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpWzBdLiRJc0JvdW5kKSB7XG5cdFx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9GdW5jdGlvbkNvbnRleHQsIG9Nb2RlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uIFwiICsgc0Z1bmN0aW9uTmFtZSwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IG9EYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgb0RhdGEsIG1QYXJhbWV0ZXJzLmRhdGEpIDogbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RyYW5zaWVudExpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8qICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9UcmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUobVBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bGV0IG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NYWluTGlzdEJpbmRpbmcgJiYgb01haW5MaXN0QmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBvbkJlZm9yZUNyZWF0ZVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmNyZWF0ZShcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmICghb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRlIG1vZGUgc2hhbGwgY3VycmVudGx5IG9ubHkgYmUgc2V0IG9uIGNyZWF0aW5nIGEgcm9vdCBkb2N1bWVudFxuXHRcdFx0XHRcdHRoYXQuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dCB8fCAob1Jlc3VsdCAmJiBvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0Ly8gVE9ETzogd2hlcmUgZG9lcyB0aGlzIG9uZSBjb21pbmcgZnJvbT8/P1xuXHRcdFx0XHRpZiAob1Jlc3VsdCAmJiBvUmVzdWx0LmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQpIHtcblx0XHRcdFx0XHR0aGF0LmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIGZvciBpbnN0YW5jZSwgb24gY2FuY2VsIG9mIGNyZWF0ZSBkaWFsb2csIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXG5cdFx0XHRcdFx0Ly8gYSByZXR1cm4gaGVyZSB3b3VsZCByZXN0b3JlIHRoZSBwcm9taXNlIGNoYWluIGFuZCByZXN1bHQgaW4gZXJyb3JzIHdoaWxlIHJvdXRpbmdcblx0XHRcdFx0XHQvLyBzb2x1dGlvbiAtICByZWplY3QgaGVyZSBhcyB3ZWxsXG5cdFx0XHRcdFx0aWYgKG9FcnJvciAmJiBvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgJiYgb05ld0RvY3VtZW50Q29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGFjdGl2ZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzLCBvbmx5IGZvciB0aGUgZHJhZnQgcm9vdHMuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRbXX0gYUNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIGJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiB0aGUgYWN0aXZlIGNvbnRleHRzXG5cdCAqL1xuXHRmaW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMoYUNvbnRleHRzOiBhbnlbXSwgYkZpbmRBY3RpdmVDb250ZXh0czogYW55KSB7XG5cdFx0aWYgKCFiRmluZEFjdGl2ZUNvbnRleHRzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gYUNvbnRleHRzLnJlZHVjZShmdW5jdGlvbiAoYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpKSB7XG5cdFx0XHRcdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5LFxuXHRcdFx0XHRcdGJIYXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdGlmICghYklzQWN0aXZlRW50aXR5ICYmIGJIYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRjb25zdCBvQWN0aXZlQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL1NpYmxpbmdFbnRpdHlcIilcblx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRhUmVzdWx0LnB1c2gob0FjdGl2ZUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLnRoZW4oXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXHRhZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnM6IGFueSwgY2hlY2tCb3g6IGFueSwgYUNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoZWNrQm94LmlzQ2hlY2tCb3hWaXNpYmxlID09PSB0cnVlICYmIGNoZWNrQm94LmlzQ2hlY2tCb3hTZWxlY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly9pZiB1bnNhdmVkIG9iamVjdHMgYXJlIG5vdCBkZWxldGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIGVuYWJsZWQgdG8gdHJ1ZSBhbmQgdXBkYXRlIHRoZSBtb2RlbCBkYXRhIGZvciBuZXh0IGRlbGV0aW9uXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLCB7fSk7XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqLmRlbGV0YWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b2JqLmRlbGV0YWJsZUNvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBvYmouc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0RFTEVURV9UT0FTVF9QTFVSQUxcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB2Q29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdGxldCBmblJlamVjdDogRnVuY3Rpb24sXG5cdFx0XHRmblJlc29sdmU6IEZ1bmN0aW9uLFxuXHRcdFx0YURlbGV0YWJsZUNvbnRleHRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQ6IGJvb2xlYW4sXG5cdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRsZXQgYVBhcmFtcztcblx0XHRsZXQgb0RlbGV0ZU1lc3NhZ2U6IGFueSA9IHtcblx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIilcblx0XHR9O1xuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkodkNvbnRleHRzKSkge1xuXHRcdFx0dkNvbnRleHRzID0gW3ZDb250ZXh0c107XG5cdFx0fVxuXHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodkNvbnRleHRzWzBdKSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzUHJvZ3JhbW1pbmdNb2RlbDogYW55KSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2Q29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSB2Q29udGV4dHNbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IW9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IGZuUmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlID0ge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHZDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhRGVsZXRhYmxlQ29udGV4dHNbMF0uZ2V0T2JqZWN0KClbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXTtcblx0XHRcdFx0XHRcdFx0bGV0IHNMYXN0Q2hhbmdlZEJ5VXNlciA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHNMYXN0Q2hhbmdlZEJ5VXNlciA9XG5cdFx0XHRcdFx0XHRcdFx0XHRkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb25cIl0gfHwgZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlclwiXSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0xhc3RDaGFuZ2VkQnlVc2VyXTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG11bHRpcGxlIHVuc2F2ZWQgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT1cblx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzKSkubGVuZ3RoXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVuc2F2ZWQsIGxvY2tlZCAsZGVsZXRhYmxlIG9iamVjdHMgYnV0IG5vdCBub24tZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly9pZiBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3RzIGFsb25nIHdpdGggYW55IG9mIHVuc2F2ZWQgLGRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0Y2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUl9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCwgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIHx8IGlzTG9ja2VkVGV4dFZpc2libGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvL2lmIG9ubHkgdW5zYXZlZCBhbmQgZWl0aGVyIG9yIGJvdGggb2YgbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgdGhlbiB3ZSBoaWRlIHRoZSBjaGVjayBib3hcblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgJiYgaXNMb2NrZWRUZXh0VmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHQvL2lmIGJvdGggbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgYWxvbmcgd2l0aCBkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTE9DS0VEX0FORF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpLmxlbmd0aCAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRF9BTkRfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGggLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbDtcblx0XHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBuZXcgVkJveCh7XG5cdFx0XHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0XHRcdChvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0xvY2tlZFRleHRWaXNpYmxlIHx8IGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlXG5cdFx0XHRcdFx0XHR9KSksXG5cdFx0XHRcdFx0XHQob0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UudGV4dFxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0NoZWNrQm94VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIik7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0Y29uc3QgYUNvbnRleHRzID0gYURlbGV0YWJsZUNvbnRleHRzO1xuXHRcdFx0XHRcdGxldCBvbkJlZm9yZURlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBhQ29udGV4dHMgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9uQmVmb3JlRGVsZXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVEZWxldGVQcm9taXNlXG5cdFx0XHRcdFx0XHQudGhlbih0aGF0LmZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cy5iaW5kKHRoYXQsIGFDb250ZXh0cywgbVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cykpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvL21ha2Ugc3VyZSB0byBmZXRjaCB0aGUgYWN0aXZlIGNvbnRleHRzIGJlZm9yZSBkZWxldGluZyB0aGUgZHJhZnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hWaXNpYmxlXCI6IGlzQ2hlY2tCb3hWaXNpYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hTZWxlY3RlZFwiOiBpc0NoZWNrQm94U2VsZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ29udGV4dHMgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuYWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzLCBjaGVja0JveCwgYUNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmblJlc29sdmUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IHNUaXRsZSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogW29Db250ZW50XSxcblx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbC5nZXRWaXNpYmxlKClcblx0XHRcdFx0XHRcdD8gW29Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2xdXG5cdFx0XHRcdFx0XHQ6IG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wsXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNvbmZpcm0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0XHRcdGlmICghYkRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJDb3VsZG4ndCBnZXQgUHJvZ3JhbW1pbmcgbW9kZWxcIik7XG5cdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0ZWRpdERvY3VtZW50KG9Db250ZXh0OiBhbnksIG9WaWV3OiBvYmplY3QsIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9FZGl0UHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdFx0fVxuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdC8vIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBlZGl0IGFjdGlvbiB3ZSdsbCBoYXZlIHRvIHJlbW92ZSBhbGwgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0b0VkaXRQcm9taXNlID0gZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7XG5cdFx0XHRcdGJQcmVzZXJ2ZUNoYW5nZXM6IHRydWUsXG5cdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0fSBhcyBhbnkpO1xuXHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRvRWRpdFByb21pc2UgPSBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0VkaXRQcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHR0aGF0Ll9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAubS5CdXR0b259IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0Y2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGNhbmNlbEJ1dHRvbjogYW55OyBza2lwRGlzY2FyZFBvcG92ZXI6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUGFyYW1zQ29udGV4dCA9IG9Db250ZXh0LFxuXHRcdFx0b0NhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbixcblx0XHRcdG9Nb2RlbCA9IG9QYXJhbXNDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bGV0IG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSwgc0Nhbm9uaWNhbFBhdGg6IHN0cmluZztcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc1BNb2RlbDogYW55KSB7XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gc1BNb2RlbDtcblx0XHRcdFx0aWYgKHNQTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9QYXJhbXNDb250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGlmICghdGhhdC5fYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKS50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gIShkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoYXQuX3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uLCB0aGF0Ll9iSXNNb2RpZmllZCwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRcdG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ2FuY2VsUHJvbWlzZTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRcdFx0c3dpdGNoIChzUHJvZ3JhbW1pbmdNb2RlbCkge1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDpcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1zQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oZnVuY3Rpb24gKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghYkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgb0FjdGl2ZUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvU2libGluZ0VudGl0eVwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQ2Fub25pY2FsUGF0aCA9IHNQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9vUGFyYW1zQ29udGV4dC5kZWxldGUoKSBpbiB0aGUgcHJldmlvdXMgcHJvbWlzZSBkb2VzbnQgcmV0dXJuIGFueXRoaW5nIHVwb24gc3VjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpICE9PSBzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBhY3RpdmUgY29udGV4dCBpcyB1c2luZyB0aGUgc2libGluZyBlbnRpdHkgLSB0aGlzIHBhdGggaXMgbm90IGFjY2Vzc2libGUgYW55bW9yZSBhcyB3ZSBkZWxldGVkIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvY3VtZW50IC0gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgY2Fub25pY2FsIHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k6XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCkudGhlbihmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIXRoYXQuX2JDcmVhdGVNb2RlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yXG5cdCAqIEBwYXJhbSBhQmluZGluZ3Ncblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHNhdmVEb2N1bWVudChvQ29udGV4dDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGFueSwgYUJpbmRpbmdzOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9TYXZlUHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7fSk7XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IFVyaVBhcmFtZXRlcnMuZnJvbVF1ZXJ5KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcInNhcC1mZS1zYXZlLXN0cmljdC1tb2RlXCIpID09PSBcInRydWVcIjtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TYXZlUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IGJOZXdPYmplY3QgPVxuXHRcdFx0XHRcdHRoYXQuc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ID8gdGhhdC5fYkNyZWF0ZU1vZGUgOiAhb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRiTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdFx0YUJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKG9MaXN0QmluZGluZzogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uOiBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3IHwgbnVsbCwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9Db250ZXh0LCBvTW9kZWw6IGFueSwgb1Byb21pc2U7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cdFx0c0FjdGlvbk5hbWUgPSBzTmFtZSB8fCBzQWN0aW9uTmFtZTtcblx0XHRvQ29udGV4dCA9IHNOYW1lID8gdW5kZWZpbmVkIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0Ly9jaGVja2luZyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDAgbGVuZ3RoIG9yIG5vdCBhbiBhcnJheShjcmVhdGUgYWN0aW9uKVxuXHRcdGlmIChvQ29udGV4dCAmJiAoKEFycmF5LmlzQXJyYXkob0NvbnRleHQpICYmIG9Db250ZXh0Lmxlbmd0aCkgfHwgIUFycmF5LmlzQXJyYXkob0NvbnRleHQpKSkge1xuXHRcdFx0b0NvbnRleHQgPSBBcnJheS5pc0FycmF5KG9Db250ZXh0KSA/IG9Db250ZXh0WzBdIDogb0NvbnRleHQ7XG5cdFx0XHRvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRcdH1cblx0XHRpZiAoIW9Nb2RlbCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUGFzcyBhIGNvbnRleHQgZm9yIGEgYm91bmQgYWN0aW9uIG9yIHBhc3MgdGhlIG1vZGVsIGZvciBhbiB1bmJvdW5kIGFjdGlvblwiKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHRoZSBiaW5kaW5nIHBhcmFtZXRlcnMgJHNlbGVjdCBhbmQgJGV4cGFuZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9uIHRoaXMgYWN0aW9uXG5cdFx0Ly8gYWxzbyBnYXRoZXIgYWRkaXRpb25hbCBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgc3VjaCBhcyB0ZXh0IGFzc29jaWF0aW9uc1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCkgfHwge307XG5cdFx0aWYgKG9Db250ZXh0ICYmIG9Nb2RlbCkge1xuXHRcdFx0b1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGxldCBvQXBwbGljYWJsZUNvbnRleHREaWFsb2c6IERpYWxvZztcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvbkNvbnRpbnVlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRcdGNvbnN0IG5Ob3RBcHBsaWNhYmxlID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFOb3RBcHBsaWNhYmxlSXRlbXMpO1xuXHRcdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCwgXCJub3RBcHBsaWNhYmxlXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvVG90YWxzLCBcInRvdGFsc1wiKTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQgJiYgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoID49IDEpIHtcblx0XHRcdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkFjdGlvblBhcnRpYWxcIjtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0uZ2V0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBzQ2Fub25pY2FsUGF0aC5zdWJzdHIoMCwgc0Nhbm9uaWNhbFBhdGguaW5kZXhPZihcIihcIikpICsgXCIvXCI7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ0xhYmVsTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1BvcG92ZXI6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0XHRmbk9wZW5BbmRGaWxsRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKGNvbnRleHRUb1Byb2Nlc3M6IGFueSkge1xuXHRcdFx0XHRpZiAoY29udGV4dFRvUHJvY2Vzcykge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2Vzcywgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUT0RPOiBjb25maXJtIGlmIGFjdGlvbiBpbXBvcnQgbmVlZHMgc2lkZSBlZmZlY3RzLlxuXHRcdFx0b1Byb21pc2UgPSBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FwcENvbXBvbmVudCwge1xuXHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdC8vIFN1Y2NlZWRlZFxuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHRoYXQuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIG1lc3NhZ2VzIGZvciBhY3Rpb24gY2FsbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI19oYW5kbGVBY3Rpb25SZXNwb25zZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlcjogYW55LCBtUGFyYW1ldGVyczogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgYVRyYW5zaWVudE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdH1cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnZGlzY2FyZCcgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjaGFuZGxlVmFsaWRhdGlvbkVycm9yXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpIHtcblx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCksXG5cdFx0XHRlcnJvclRvUmVtb3ZlID0gb01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0ZWNobmljYWwgYW5kIHBlcnNpc3RlbnQgZXJyb3JzIG5lZWRzIG5vdCB0byBiZSBjaGVja2VkIGhlcmUuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIGlmIGl0IG5lZWRzIHRvIGJlIHNob3duLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHVzZXIgaGFzIG1vZGlmaWVkIGFueSBkYXRhLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGZyb20gZHJhZnQgYWRtaW4gZGF0YS5cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fc2hvd0Rpc2NhcmRQb3BvdmVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLkNvbnRyb2x9IG9DYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBiSXNNb2RpZmllZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9zaG93RGlzY2FyZFBvcG92ZXIob0NhbmNlbEJ1dHRvbjogYW55LCBiSXNNb2RpZmllZDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHBvcG92ZXIgYXMgYSBmcmFnbWVudCBhcyBpbiB2Mj8/XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IGZhbHNlO1xuXHRcdC8vIHRvIGJlIGltcGxlbWVudGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmICghb0NhbmNlbEJ1dHRvbikge1xuXHRcdFx0XHRyZWplY3QoXCJDYW5jZWwgYnV0dG9uIG5vdCBmb3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vU2hvdyBwb3BvdmVyIG9ubHkgd2hlbiBkYXRhIGlzIGNoYW5nZWQuXG5cdFx0XHRpZiAoYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZm5PbkFmdGVyRGlzY2FyZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRoYXQuX2JDb250aW51ZURpc2NhcmQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRGlzY2FyZCBvcGVyYXRpb24gd2FzIHJlamVjdGVkLiBEb2N1bWVudCBoYXMgbm90IGJlZW4gZGlzY2FyZGVkXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5kZXRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoIXRoYXQuX29Qb3BvdmVyKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHQgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdC8vVGhpcyB0ZXh0IGlzIHRoZSBzYW1lIGFzIExSIHYyLlxuXHRcdFx0XHRcdFx0XHQvL1RPRE86IERpc3BsYXkgbWVzc2FnZSBwcm92aWRlZCBieSBhcHAgZGV2ZWxvcGVyPz8/XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0b0J1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIub3BlbkJ5KG9DYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogU2V0cyB0aGUgZG9jdW1lbnQgdG8gbW9kaWZpZWQgc3RhdGUgb24gcGF0Y2ggZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9uc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCkge1xuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBvd25lciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRPd25lckNvbXBvbmVudFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHJldHVybnMge3NhcC5mZS5jb3JlLkFwcENvbXBvbmVudH0gVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRBcHBDb21wb25lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQ7XG5cdH1cblxuXHRfb25GaWVsZENoYW5nZShvRXZlbnQ6IGFueSwgb0NyZWF0ZUJ1dHRvbjogYW55LCBtZXNzYWdlSGFuZGxlcjogYW55LCBmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzOiBGdW5jdGlvbikge1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG9GaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0aWYgKG9GaWVsZFByb21pc2UpIHtcblx0XHRcdHJldHVybiBvRmllbGRQcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB2YWx1ZSBvZiBmaWVsZCBhcyAnJyBpbiBjYXNlIG9mIHZhbHVlIGhlbHAgYW5kIHZhbGlkYXRpbmcgb3RoZXIgZmllbGRzXG5cdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdC8vZGlzYWJsaW5nIHRoZSBjb250aW51ZSBidXR0b24gaW4gY2FzZSBvZiBpbnZhbGlkIHZhbHVlIGluIGZpZWxkXG5cdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyB2YWxpZGF0aW5nIGFsbCB0aGUgZmllbGRzIGluIGNhc2Ugb2YgZW1wdHkgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50Q29udGV4dDogYW55LFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IGFueSxcblx0XHRtUGFyYW1ldGVyczogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRiU3VjY2VzcyA9IGZhbHNlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzRGlhbG9nXCI7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRzUGF0aCA9IG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNNZXRhUGF0aCArIFwiL1wiICsgbUZpZWxkc1tpXSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eE1vZGVsID0gbmV3IEpTT05Nb2RlbChhSW1tdXRhYmxlRmllbGRzKTtcblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHggPSBvSW1tdXRhYmxlQ3R4TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQ7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdCkudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0XHRcdGNvbnN0IG1GaWVsZFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdFx0bGV0IG9DcmVhdGVCdXR0b246IEJ1dHRvbjtcblx0XHRcdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50c1xuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGNvbnRpbnVlIGJ1dHRvbiBzaG91bGQgcmVtYWluIGRpc2FibGVkIGluIGNhc2Ugb2YgZXJyb3IgaW4gYW55IGZpZWxkIG9mIHRoZSBjcmVhdGUgZGlhbG9nXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpIHx8IChvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yICYmIG9GaWVsZC5nZXRWYWx1ZSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9GaWVsZC5nZXRJZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzRmllbGRJZCBpbiBtRmllbGRWYWx1ZU1hcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlU3RhdGUoKSA9PT0gVmFsdWVTdGF0ZS5FcnJvciA/IHVuZGVmaW5lZCA6IG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhUmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFSZXN1bHRzLmV2ZXJ5KGZ1bmN0aW9uICh2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB2VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2VmFsdWUgIT09IG51bGwgJiYgdlZhbHVlICE9PSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGJFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChiRW5hYmxlZCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0LypcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRmaXJlZCBvbiBmb2N1cyBvdXQgZnJvbSBmaWVsZCBvciBvbiBzZWxlY3RpbmcgYSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gdGhhdC5fb25GaWVsZENoYW5nZShvRXZlbnQsIG9DcmVhdGVCdXR0b24sIG1lc3NhZ2VIYW5kbGVyLCB2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGtleSBwcmVzcy4gdGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlTGl2ZUNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGNvbnN0IHZWYWx1ZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHZWYWx1ZTtcblx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdFx0ZGVmaW5pdGlvbjogb0ZyYWdtZW50LFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IG9Db250cm9sbGVyXG5cdFx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHR0aXRsZTogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGVCdXR0b24gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhtRmllbGRWYWx1ZU1hcCkubWFwKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1GaWVsZFZhbHVlTWFwW3NLZXldLnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ1ZhbHVlOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EaWFsb2dWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKFwic3VibWl0TGF0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvUmVzcG9uc2UgfHwgKG9SZXNwb25zZSAmJiBvUmVzcG9uc2UuYktlZXBEaWFsb2dPcGVuICE9PSB0cnVlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9SZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRlbmRCdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHNob3cgZm9vdGVyIGFzIHBlciBVWCBndWlkZWxpbmVzIHdoZW4gZGlhbG9nIGlzIG5vdCBvcGVuXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdGlmIChvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcyxcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdFx0XHQvLyBmb290ZXIgbXVzdCBub3QgYmUgdmlzaWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbiBhcyBwZXIgVVggZ3VpZGVsaW5lc1xuXHRcdFx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uLCBmblJlamVjdDogRnVuY3Rpb247XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0Zm5SZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Ly8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgT0RhdGEgbW9kZWwgdjQgY29sbGVhZ3Vlc1xuXHRcdGNvbnN0IGZuQ3JlYXRlQ29tcGxldGVkID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpLFxuXHRcdFx0XHRiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSBvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoYXQpO1xuXHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yOiBhbnkgPSB7IGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiBmYWxzZSB9O1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0b0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHRcdFx0XHQudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRpb24gZXJyb3JcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZykge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHRyYW5zaWVudCAoLi4uKSwgYnJvd3NlciB3aWxsIGNvbWUgYmFjayB0byBwcmV2aW91cyBzdGF0ZVxuXHRcdFx0XHRcdFx0XHRvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm5SZXNvbHZlKHsgYktlZXBEaWFsb2dPcGVuOiB0cnVlIH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZuUmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0TmV3QWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIHNDcmVhdGVIYXNoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlV2l0aFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLmluZGV4T2YoXCJjcmVhdGVXaXRoOlwiKSA+IC0xID8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uXCIpIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvblwiKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWxcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGVcblx0KSB7XG5cdFx0Y29uc3QgZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAob01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIikpIHtcblx0XHRcdFx0Y29uc3QgaUxpbmVJdGVtSW5kZXggPSBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIilcblx0XHRcdFx0XHQuZmluZEluZGV4KGZ1bmN0aW9uIChvTGluZUl0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYUxpbmVJdGVtQWN0aW9uID0gb0xpbmVJdGVtLkFjdGlvbiA/IG9MaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFMaW5lSXRlbUFjdGlvbiA/IGFMaW5lSXRlbUFjdGlvblswXSA9PT0gc05ld0FjdGlvbiA6IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaUxpbmVJdGVtSW5kZXggPiAtMVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL1wiICsgc05ld0FjdGlvbiArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2FjdGlvbkhlbHBlcjtcbiJdfQ==
|