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