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