@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,988 +2,964 @@
|
|
|
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/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/actions/messageHandling", "sap/fe/core/BusyLocker", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/AppStartupHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/ui/base/BindingParser", "sap/ui/base/EventProvider", "sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/model/odata/v4/ODataUtils"], function (Log, messageHandling, BusyLocker, Placeholder, AppStartupHelper, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, BindingParser, EventProvider, Service, ServiceFactory, ODataUtils) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
var _exports = {};
|
|
11
|
+
var event = ClassSupport.event;
|
|
12
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
11
13
|
|
|
12
|
-
function
|
|
14
|
+
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
13
15
|
|
|
14
|
-
function
|
|
16
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
17
|
+
|
|
18
|
+
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
15
19
|
|
|
16
20
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
17
21
|
|
|
18
|
-
function
|
|
22
|
+
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
19
23
|
|
|
20
|
-
function
|
|
24
|
+
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
var RoutingServiceEventing = (_dec = defineUI5Class("sap.fe.core.services.RoutingServiceEventing"), _dec2 = event(), _dec3 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_EventProvider) {
|
|
27
|
+
_inheritsLoose(RoutingServiceEventing, _EventProvider);
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
function RoutingServiceEventing() {
|
|
30
|
+
var _this;
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
33
|
+
args[_key] = arguments[_key];
|
|
34
|
+
}
|
|
27
35
|
|
|
28
|
-
|
|
36
|
+
_this = _EventProvider.call.apply(_EventProvider, [this].concat(args)) || this;
|
|
29
37
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
38
|
+
_initializerDefineProperty(_this, "routeMatched", _descriptor, _assertThisInitialized(_this));
|
|
39
|
+
|
|
40
|
+
_initializerDefineProperty(_this, "afterRouteMatched", _descriptor2, _assertThisInitialized(_this));
|
|
41
|
+
|
|
42
|
+
return _this;
|
|
36
43
|
}
|
|
37
|
-
});
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
return RoutingServiceEventing;
|
|
46
|
+
}(EventProvider), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "routeMatched", [_dec2], {
|
|
47
|
+
configurable: true,
|
|
48
|
+
enumerable: true,
|
|
49
|
+
writable: true,
|
|
50
|
+
initializer: null
|
|
51
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "afterRouteMatched", [_dec3], {
|
|
52
|
+
configurable: true,
|
|
53
|
+
enumerable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
initializer: null
|
|
56
|
+
})), _class2)) || _class);
|
|
41
57
|
|
|
42
|
-
|
|
58
|
+
var RoutingService = /*#__PURE__*/function (_Service) {
|
|
59
|
+
_inheritsLoose(RoutingService, _Service);
|
|
43
60
|
|
|
44
61
|
function RoutingService() {
|
|
45
|
-
var
|
|
46
|
-
|
|
47
|
-
_classCallCheck(this, RoutingService);
|
|
62
|
+
var _this2;
|
|
48
63
|
|
|
49
|
-
for (var
|
|
50
|
-
args[
|
|
64
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
65
|
+
args[_key2] = arguments[_key2];
|
|
51
66
|
}
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
_this2 = _Service.call.apply(_Service, [this].concat(args)) || this;
|
|
69
|
+
_this2.navigationInfoQueue = [];
|
|
70
|
+
return _this2;
|
|
71
|
+
}
|
|
54
72
|
|
|
55
|
-
|
|
73
|
+
_exports.RoutingService = RoutingService;
|
|
74
|
+
var _proto = RoutingService.prototype;
|
|
56
75
|
|
|
57
|
-
|
|
58
|
-
|
|
76
|
+
_proto.init = function init() {
|
|
77
|
+
var oContext = this.getContext();
|
|
59
78
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
this.oRouter = this.oAppComponent.getRouter();
|
|
70
|
-
this.oRouterProxy = this.oAppComponent.getRouterProxy();
|
|
71
|
-
this.eventProvider = new RoutingServiceEventing();
|
|
72
|
-
var oRoutingConfig = this.oAppComponent.getManifestEntry("/sap.ui5/routing");
|
|
73
|
-
var oRootViewConfig = this.oAppComponent.getManifestEntry("/sap.ui5/rootView");
|
|
74
|
-
|
|
75
|
-
this._parseRoutingConfiguration(oRoutingConfig, oRootViewConfig);
|
|
76
|
-
|
|
77
|
-
var oAppConfig = this.oAppComponent.getManifestEntry("/sap.app");
|
|
78
|
-
this.outbounds = oAppConfig && oAppConfig.crossNavigation && oAppConfig.crossNavigation.outbounds;
|
|
79
|
-
}
|
|
79
|
+
if (oContext.scopeType === "component") {
|
|
80
|
+
this.oAppComponent = oContext.scopeObject;
|
|
81
|
+
this.oModel = this.oAppComponent.getModel();
|
|
82
|
+
this.oMetaModel = this.oModel.getMetaModel();
|
|
83
|
+
this.oRouter = this.oAppComponent.getRouter();
|
|
84
|
+
this.oRouterProxy = this.oAppComponent.getRouterProxy();
|
|
85
|
+
this.eventProvider = new RoutingServiceEventing();
|
|
86
|
+
var oRoutingConfig = this.oAppComponent.getManifestEntry("/sap.ui5/routing");
|
|
87
|
+
var oRootViewConfig = this.oAppComponent.getManifestEntry("/sap.ui5/rootView");
|
|
80
88
|
|
|
81
|
-
this.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
value: function beforeExit() {
|
|
86
|
-
this.oRouter.detachRouteMatched(this._fnOnRouteMatched, this);
|
|
87
|
-
this.eventProvider.fireEvent("routeMatched", {});
|
|
88
|
-
}
|
|
89
|
-
}, {
|
|
90
|
-
key: "exit",
|
|
91
|
-
value: function exit() {
|
|
92
|
-
this.eventProvider.destroy();
|
|
89
|
+
this._parseRoutingConfiguration(oRoutingConfig, oRootViewConfig);
|
|
90
|
+
|
|
91
|
+
var oAppConfig = this.oAppComponent.getManifestEntry("/sap.app");
|
|
92
|
+
this.outbounds = oAppConfig && oAppConfig.crossNavigation && oAppConfig.crossNavigation.outbounds;
|
|
93
93
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Parse a manifest routing configuration for internal usage.
|
|
96
|
-
*
|
|
97
|
-
* @param {object} oRoutingConfig The routing configuration from the manifest
|
|
98
|
-
* @param {object} oRootViewConfig The root view configuration from the manifest
|
|
99
|
-
* @private
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
}, {
|
|
103
|
-
key: "_parseRoutingConfiguration",
|
|
104
|
-
value: function _parseRoutingConfiguration(oRoutingConfig, oRootViewConfig) {
|
|
105
|
-
var _this2 = this;
|
|
106
|
-
|
|
107
|
-
var isFCL = oRootViewConfig && oRootViewConfig.viewName === "sap.fe.templates.RootContainer.view.Fcl"; // Information of targets
|
|
108
|
-
|
|
109
|
-
this._mTargets = {};
|
|
110
|
-
Object.keys(oRoutingConfig.targets).forEach(function (sTargetName) {
|
|
111
|
-
_this2._mTargets[sTargetName] = Object.assign({
|
|
112
|
-
targetName: sTargetName
|
|
113
|
-
}, oRoutingConfig.targets[sTargetName]); // View level for FCL cases is calculated from the target pattern
|
|
114
|
-
|
|
115
|
-
if (_this2._mTargets[sTargetName].contextPattern !== undefined) {
|
|
116
|
-
_this2._mTargets[sTargetName].viewLevel = _this2._getViewLevelFromPattern(_this2._mTargets[sTargetName].contextPattern, 0);
|
|
117
|
-
}
|
|
118
|
-
}); // Information of routes
|
|
119
94
|
|
|
120
|
-
|
|
95
|
+
this.initPromise = Promise.resolve(this);
|
|
96
|
+
};
|
|
121
97
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
sRoutePattern = oRouteManifestInfo.pattern; // Check route pattern: all patterns need to end with ':?query:', that we use for parameters
|
|
98
|
+
_proto.beforeExit = function beforeExit() {
|
|
99
|
+
this.oRouter.detachRouteMatched(this._fnOnRouteMatched, this);
|
|
100
|
+
this.eventProvider.fireEvent("routeMatched", {});
|
|
101
|
+
};
|
|
127
102
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
103
|
+
_proto.exit = function exit() {
|
|
104
|
+
this.eventProvider.destroy();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse a manifest routing configuration for internal usage.
|
|
108
|
+
*
|
|
109
|
+
* @param {object} oRoutingConfig The routing configuration from the manifest
|
|
110
|
+
* @param {object} oRootViewConfig The root view configuration from the manifest
|
|
111
|
+
* @private
|
|
112
|
+
*/
|
|
113
|
+
;
|
|
114
|
+
|
|
115
|
+
_proto._parseRoutingConfiguration = function _parseRoutingConfiguration(oRoutingConfig, oRootViewConfig) {
|
|
116
|
+
var _this3 = this;
|
|
117
|
+
|
|
118
|
+
var isFCL = oRootViewConfig && oRootViewConfig.viewName === "sap.fe.templates.RootContainer.view.Fcl"; // Information of targets
|
|
119
|
+
|
|
120
|
+
this._mTargets = {};
|
|
121
|
+
Object.keys(oRoutingConfig.targets).forEach(function (sTargetName) {
|
|
122
|
+
_this3._mTargets[sTargetName] = Object.assign({
|
|
123
|
+
targetName: sTargetName
|
|
124
|
+
}, oRoutingConfig.targets[sTargetName]); // View level for FCL cases is calculated from the target pattern
|
|
125
|
+
|
|
126
|
+
if (_this3._mTargets[sTargetName].contextPattern !== undefined) {
|
|
127
|
+
_this3._mTargets[sTargetName].viewLevel = _this3._getViewLevelFromPattern(_this3._mTargets[sTargetName].contextPattern, 0);
|
|
128
|
+
}
|
|
129
|
+
}); // Information of routes
|
|
131
130
|
|
|
132
|
-
|
|
131
|
+
this._mRoutes = {};
|
|
133
132
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}; // Add the parent targets in the list of targets for the route
|
|
133
|
+
for (var sRouteKey in oRoutingConfig.routes) {
|
|
134
|
+
var oRouteManifestInfo = oRoutingConfig.routes[sRouteKey],
|
|
135
|
+
aRouteTargets = Array.isArray(oRouteManifestInfo.target) ? oRouteManifestInfo.target : [oRouteManifestInfo.target],
|
|
136
|
+
sRouteName = Array.isArray(oRoutingConfig.routes) ? oRouteManifestInfo.name : sRouteKey,
|
|
137
|
+
sRoutePattern = oRouteManifestInfo.pattern; // Check route pattern: all patterns need to end with ':?query:', that we use for parameters
|
|
140
138
|
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
if (sRoutePattern.length < 8 || sRoutePattern.indexOf(":?query:") !== sRoutePattern.length - 8) {
|
|
140
|
+
Log.warning("Pattern for route " + sRouteName + " doesn't end with ':?query:' : " + sRoutePattern);
|
|
141
|
+
}
|
|
143
142
|
|
|
144
|
-
|
|
145
|
-
aRouteTargets.push(sParentTargetName);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
143
|
+
var iRouteLevel = this._getViewLevelFromPattern(sRoutePattern, 0);
|
|
148
144
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
} // FCL level for non-FCL cases is equal to -1
|
|
145
|
+
this._mRoutes[sRouteName] = {
|
|
146
|
+
name: sRouteName,
|
|
147
|
+
pattern: sRoutePattern,
|
|
148
|
+
targets: aRouteTargets,
|
|
149
|
+
routeLevel: iRouteLevel
|
|
150
|
+
}; // Add the parent targets in the list of targets for the route
|
|
156
151
|
|
|
152
|
+
for (var i = 0; i < aRouteTargets.length; i++) {
|
|
153
|
+
var sParentTargetName = this._mTargets[aRouteTargets[i]].parent;
|
|
157
154
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
// We're in the case where there's only 1 target for the route, and it's not in the first column
|
|
161
|
-
// --> this is a fullscreen column after all columns in the FCL have been used
|
|
162
|
-
this._mTargets[aRouteTargets[0]].FCLLevel = 3;
|
|
163
|
-
} else {
|
|
164
|
-
// Other FCL cases
|
|
165
|
-
aRouteTargets.forEach(function (sTargetName) {
|
|
166
|
-
switch (_this2._mTargets[sTargetName].controlAggregation) {
|
|
167
|
-
case "beginColumnPages":
|
|
168
|
-
_this2._mTargets[sTargetName].FCLLevel = 0;
|
|
169
|
-
break;
|
|
170
|
-
|
|
171
|
-
case "midColumnPages":
|
|
172
|
-
_this2._mTargets[sTargetName].FCLLevel = 1;
|
|
173
|
-
break;
|
|
174
|
-
|
|
175
|
-
default:
|
|
176
|
-
_this2._mTargets[sTargetName].FCLLevel = 2;
|
|
177
|
-
}
|
|
178
|
-
});
|
|
155
|
+
if (sParentTargetName) {
|
|
156
|
+
aRouteTargets.push(sParentTargetName);
|
|
179
157
|
}
|
|
180
|
-
}
|
|
158
|
+
}
|
|
181
159
|
|
|
160
|
+
if (!isFCL) {
|
|
161
|
+
// View level for non-FCL cases is calculated from the route pattern
|
|
162
|
+
if (this._mTargets[aRouteTargets[0]].viewLevel === undefined || this._mTargets[aRouteTargets[0]].viewLevel < iRouteLevel) {
|
|
163
|
+
// There are cases when different routes point to the same target. We take the
|
|
164
|
+
// largest viewLevel in that case.
|
|
165
|
+
this._mTargets[aRouteTargets[0]].viewLevel = iRouteLevel;
|
|
166
|
+
} // FCL level for non-FCL cases is equal to -1
|
|
182
167
|
|
|
183
|
-
Object.keys(this._mTargets).forEach(function (sTargetName) {
|
|
184
|
-
while (_this2._mTargets[sTargetName].parent) {
|
|
185
|
-
var _sParentTargetName = _this2._mTargets[sTargetName].parent;
|
|
186
|
-
_this2._mTargets[_sParentTargetName].viewLevel = _this2._mTargets[_sParentTargetName].viewLevel || _this2._mTargets[sTargetName].viewLevel;
|
|
187
|
-
_this2._mTargets[_sParentTargetName].contextPattern = _this2._mTargets[_sParentTargetName].contextPattern || _this2._mTargets[sTargetName].contextPattern;
|
|
188
|
-
_this2._mTargets[_sParentTargetName].FCLLevel = _this2._mTargets[_sParentTargetName].FCLLevel || _this2._mTargets[sTargetName].FCLLevel;
|
|
189
|
-
_this2._mTargets[_sParentTargetName].controlAggregation = _this2._mTargets[_sParentTargetName].controlAggregation || _this2._mTargets[sTargetName].controlAggregation;
|
|
190
|
-
sTargetName = _sParentTargetName;
|
|
191
|
-
}
|
|
192
|
-
}); // Determine the root entity for the app
|
|
193
168
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
169
|
+
this._mTargets[aRouteTargets[0]].FCLLevel = -1;
|
|
170
|
+
} else if (aRouteTargets.length === 1 && this._mTargets[aRouteTargets[0]].controlAggregation !== "beginColumnPages") {
|
|
171
|
+
// We're in the case where there's only 1 target for the route, and it's not in the first column
|
|
172
|
+
// --> this is a fullscreen column after all columns in the FCL have been used
|
|
173
|
+
this._mTargets[aRouteTargets[0]].FCLLevel = 3;
|
|
174
|
+
} else {
|
|
175
|
+
// Other FCL cases
|
|
176
|
+
aRouteTargets.forEach(function (sTargetName) {
|
|
177
|
+
switch (_this3._mTargets[sTargetName].controlAggregation) {
|
|
178
|
+
case "beginColumnPages":
|
|
179
|
+
_this3._mTargets[sTargetName].FCLLevel = 0;
|
|
180
|
+
break;
|
|
181
|
+
|
|
182
|
+
case "midColumnPages":
|
|
183
|
+
_this3._mTargets[sTargetName].FCLLevel = 1;
|
|
184
|
+
break;
|
|
185
|
+
|
|
186
|
+
default:
|
|
187
|
+
_this3._mTargets[sTargetName].FCLLevel = 2;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
} // Propagate viewLevel, contextPattern, FCLLevel and controlAggregation to parent targets
|
|
197
192
|
|
|
198
|
-
for (var sName in this._mRoutes) {
|
|
199
|
-
var iLevel = this._mRoutes[sName].routeLevel;
|
|
200
193
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
194
|
+
Object.keys(this._mTargets).forEach(function (sTargetName) {
|
|
195
|
+
while (_this3._mTargets[sTargetName].parent) {
|
|
196
|
+
var _sParentTargetName = _this3._mTargets[sTargetName].parent;
|
|
197
|
+
_this3._mTargets[_sParentTargetName].viewLevel = _this3._mTargets[_sParentTargetName].viewLevel || _this3._mTargets[sTargetName].viewLevel;
|
|
198
|
+
_this3._mTargets[_sParentTargetName].contextPattern = _this3._mTargets[_sParentTargetName].contextPattern || _this3._mTargets[sTargetName].contextPattern;
|
|
199
|
+
_this3._mTargets[_sParentTargetName].FCLLevel = _this3._mTargets[_sParentTargetName].FCLLevel || _this3._mTargets[sTargetName].FCLLevel;
|
|
200
|
+
_this3._mTargets[_sParentTargetName].controlAggregation = _this3._mTargets[_sParentTargetName].controlAggregation || _this3._mTargets[sTargetName].controlAggregation;
|
|
201
|
+
sTargetName = _sParentTargetName;
|
|
206
202
|
}
|
|
203
|
+
}); // Determine the root entity for the app
|
|
204
|
+
|
|
205
|
+
var aLevel0RouteNames = [];
|
|
206
|
+
var aLevel1RouteNames = [];
|
|
207
|
+
var sDefaultRouteName;
|
|
207
208
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
209
|
+
for (var sName in this._mRoutes) {
|
|
210
|
+
var iLevel = this._mRoutes[sName].routeLevel;
|
|
211
|
+
|
|
212
|
+
if (iLevel === 0) {
|
|
213
|
+
aLevel0RouteNames.push(sName);
|
|
214
|
+
} else if (iLevel === 1) {
|
|
215
|
+
aLevel1RouteNames.push(sName);
|
|
212
216
|
}
|
|
217
|
+
}
|
|
213
218
|
|
|
214
|
-
|
|
215
|
-
|
|
219
|
+
if (aLevel0RouteNames.length === 1) {
|
|
220
|
+
sDefaultRouteName = aLevel0RouteNames[0];
|
|
221
|
+
} else if (aLevel1RouteNames.length === 1) {
|
|
222
|
+
sDefaultRouteName = aLevel1RouteNames[0];
|
|
223
|
+
}
|
|
216
224
|
|
|
217
|
-
|
|
225
|
+
if (sDefaultRouteName) {
|
|
226
|
+
var sDefaultTargetName = this._mRoutes[sDefaultRouteName].targets.slice(-1)[0];
|
|
218
227
|
|
|
219
|
-
|
|
220
|
-
var oSettings = this._mTargets[sDefaultTargetName].options.settings;
|
|
221
|
-
this.sContextPath = oSettings.contextPath || "/" + oSettings.entitySet;
|
|
222
|
-
}
|
|
228
|
+
this.sContextPath = "";
|
|
223
229
|
|
|
224
|
-
|
|
225
|
-
|
|
230
|
+
if (this._mTargets[sDefaultTargetName].options && this._mTargets[sDefaultTargetName].options.settings) {
|
|
231
|
+
var oSettings = this._mTargets[sDefaultTargetName].options.settings;
|
|
232
|
+
this.sContextPath = oSettings.contextPath || "/" + oSettings.entitySet;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!this.sContextPath) {
|
|
236
|
+
Log.warning("Cannot determine default contextPath: contextPath or entitySet missing in default target: " + sDefaultTargetName);
|
|
237
|
+
}
|
|
238
|
+
} else {
|
|
239
|
+
Log.warning("Cannot determine default contextPath: no default route found.");
|
|
240
|
+
} // We need to establish the correct path to the different pages, including the navigation properties
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
Object.keys(this._mTargets).map(function (sTargetKey) {
|
|
244
|
+
return _this3._mTargets[sTargetKey];
|
|
245
|
+
}).sort(function (a, b) {
|
|
246
|
+
return a.viewLevel < b.viewLevel ? -1 : 1;
|
|
247
|
+
}).forEach(function (target) {
|
|
248
|
+
// After sorting the targets per level we can then go through their navigation object and update the paths accordingly.
|
|
249
|
+
if (target.options) {
|
|
250
|
+
var settings = target.options.settings;
|
|
251
|
+
var sContextPath = settings.contextPath || (settings.entitySet ? "/" + settings.entitySet : "");
|
|
252
|
+
|
|
253
|
+
if (!settings.fullContextPath && sContextPath) {
|
|
254
|
+
settings.fullContextPath = sContextPath + "/";
|
|
226
255
|
}
|
|
227
|
-
} else {
|
|
228
|
-
Log.warning("Cannot determine default contextPath: no default route found.");
|
|
229
|
-
} // We need to establish the correct path to the different pages, including the navigation properties
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
Object.keys(this._mTargets).map(function (sTargetKey) {
|
|
233
|
-
return _this2._mTargets[sTargetKey];
|
|
234
|
-
}).sort(function (a, b) {
|
|
235
|
-
return a.viewLevel < b.viewLevel ? -1 : 1;
|
|
236
|
-
}).forEach(function (target) {
|
|
237
|
-
// After sorting the targets per level we can then go through their navigation object and update the paths accordingly.
|
|
238
|
-
if (target.options) {
|
|
239
|
-
var settings = target.options.settings;
|
|
240
|
-
var sContextPath = settings.contextPath || (settings.entitySet ? "/" + settings.entitySet : "");
|
|
241
|
-
|
|
242
|
-
if (!settings.fullContextPath && sContextPath) {
|
|
243
|
-
settings.fullContextPath = sContextPath + "/";
|
|
244
|
-
}
|
|
245
256
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
257
|
+
Object.keys(settings.navigation || {}).forEach(function (sNavName) {
|
|
258
|
+
// Check if it's a navigation property
|
|
259
|
+
var targetRoute = _this3._mRoutes[settings.navigation[sNavName].detail.route];
|
|
260
|
+
|
|
261
|
+
if (targetRoute && targetRoute.targets) {
|
|
262
|
+
targetRoute.targets.forEach(function (sTargetName) {
|
|
263
|
+
if (_this3._mTargets[sTargetName].options && _this3._mTargets[sTargetName].options.settings && !_this3._mTargets[sTargetName].options.settings.fullContextPath) {
|
|
264
|
+
if (target.viewLevel === 0) {
|
|
265
|
+
_this3._mTargets[sTargetName].options.settings.fullContextPath = (sNavName.startsWith("/") ? "" : "/") + sNavName + "/";
|
|
266
|
+
} else {
|
|
267
|
+
_this3._mTargets[sTargetName].options.settings.fullContextPath = settings.fullContextPath + sNavName + "/";
|
|
258
268
|
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Calculates a view level from a pattern by counting the number of segments.
|
|
267
|
-
*
|
|
268
|
-
* @param {string} sPattern The pattern
|
|
269
|
-
* @param {number} viewLevel The current level of view
|
|
270
|
-
* @returns {number} The level
|
|
271
|
-
*/
|
|
272
|
-
|
|
273
|
-
}, {
|
|
274
|
-
key: "_getViewLevelFromPattern",
|
|
275
|
-
value: function _getViewLevelFromPattern(sPattern, viewLevel) {
|
|
276
|
-
sPattern = sPattern.replace(":?query:", "");
|
|
277
|
-
var regex = new RegExp("/[^/]*$");
|
|
278
|
-
|
|
279
|
-
if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
|
|
280
|
-
sPattern = "/" + sPattern;
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
});
|
|
281
273
|
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Calculates a view level from a pattern by counting the number of segments.
|
|
278
|
+
*
|
|
279
|
+
* @param {string} sPattern The pattern
|
|
280
|
+
* @param {number} viewLevel The current level of view
|
|
281
|
+
* @returns {number} The level
|
|
282
|
+
*/
|
|
283
|
+
;
|
|
282
284
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
+
_proto._getViewLevelFromPattern = function _getViewLevelFromPattern(sPattern, viewLevel) {
|
|
286
|
+
sPattern = sPattern.replace(":?query:", "");
|
|
287
|
+
var regex = new RegExp("/[^/]*$");
|
|
285
288
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
289
|
+
if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
|
|
290
|
+
sPattern = "/" + sPattern;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (sPattern.length) {
|
|
294
|
+
sPattern = sPattern.replace(regex, "");
|
|
295
|
+
|
|
296
|
+
if (this.oRouter.match(sPattern) || sPattern === "") {
|
|
297
|
+
return this._getViewLevelFromPattern(sPattern, ++viewLevel);
|
|
291
298
|
} else {
|
|
292
|
-
return viewLevel;
|
|
299
|
+
return this._getViewLevelFromPattern(sPattern, viewLevel);
|
|
293
300
|
}
|
|
301
|
+
} else {
|
|
302
|
+
return viewLevel;
|
|
294
303
|
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
_proto._getRouteInformation = function _getRouteInformation(sRouteName) {
|
|
307
|
+
return this._mRoutes[sRouteName];
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
_proto._getTargetInformation = function _getTargetInformation(sTargetName) {
|
|
311
|
+
return this._mTargets[sTargetName];
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
_proto._getComponentId = function _getComponentId(sOwnerId, sComponentId) {
|
|
315
|
+
if (sComponentId.indexOf(sOwnerId + "---") === 0) {
|
|
316
|
+
return sComponentId.substr(sOwnerId.length + 3);
|
|
304
317
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
318
|
+
|
|
319
|
+
return sComponentId;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get target information for a given component.
|
|
323
|
+
*
|
|
324
|
+
* @param {object} oComponentInstance Instance of the component
|
|
325
|
+
* @returns {object} The configuration for the target
|
|
326
|
+
*/
|
|
327
|
+
;
|
|
328
|
+
|
|
329
|
+
_proto.getTargetInformationFor = function getTargetInformationFor(oComponentInstance) {
|
|
330
|
+
var _this4 = this;
|
|
331
|
+
|
|
332
|
+
var sTargetComponentId = this._getComponentId(oComponentInstance._sOwnerId, oComponentInstance.getId());
|
|
333
|
+
|
|
334
|
+
var sCorrectTargetName = null;
|
|
335
|
+
Object.keys(this._mTargets).forEach(function (sTargetName) {
|
|
336
|
+
if (_this4._mTargets[sTargetName].id === sTargetComponentId || _this4._mTargets[sTargetName].viewId === sTargetComponentId) {
|
|
337
|
+
sCorrectTargetName = sTargetName;
|
|
310
338
|
}
|
|
339
|
+
});
|
|
340
|
+
return this._getTargetInformation(sCorrectTargetName);
|
|
341
|
+
};
|
|
311
342
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
* Get target information for a given component.
|
|
316
|
-
*
|
|
317
|
-
* @param {object} oComponentInstance Instance of the component
|
|
318
|
-
* @returns {object} The configuration for the target
|
|
319
|
-
*/
|
|
320
|
-
|
|
321
|
-
}, {
|
|
322
|
-
key: "getTargetInformationFor",
|
|
323
|
-
value: function getTargetInformationFor(oComponentInstance) {
|
|
324
|
-
var _this3 = this;
|
|
325
|
-
|
|
326
|
-
var sTargetComponentId = this._getComponentId(oComponentInstance._sOwnerId, oComponentInstance.getId());
|
|
327
|
-
|
|
328
|
-
var sCorrectTargetName = null;
|
|
329
|
-
Object.keys(this._mTargets).forEach(function (sTargetName) {
|
|
330
|
-
if (_this3._mTargets[sTargetName].id === sTargetComponentId || _this3._mTargets[sTargetName].viewId === sTargetComponentId) {
|
|
331
|
-
sCorrectTargetName = sTargetName;
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
return this._getTargetInformation(sCorrectTargetName);
|
|
335
|
-
}
|
|
336
|
-
}, {
|
|
337
|
-
key: "getLastSemanticMapping",
|
|
338
|
-
value: function getLastSemanticMapping() {
|
|
339
|
-
return this.oLastSemanticMapping;
|
|
340
|
-
}
|
|
341
|
-
}, {
|
|
342
|
-
key: "setLastSemanticMapping",
|
|
343
|
-
value: function setLastSemanticMapping(oMapping) {
|
|
344
|
-
this.oLastSemanticMapping = oMapping;
|
|
345
|
-
}
|
|
346
|
-
}, {
|
|
347
|
-
key: "navigateTo",
|
|
348
|
-
value: function navigateTo(oContext, sRouteName, mParameterMapping, bPreserveHistory) {
|
|
349
|
-
var _this4 = this;
|
|
343
|
+
_proto.getLastSemanticMapping = function getLastSemanticMapping() {
|
|
344
|
+
return this.oLastSemanticMapping;
|
|
345
|
+
};
|
|
350
346
|
|
|
351
|
-
|
|
347
|
+
_proto.setLastSemanticMapping = function setLastSemanticMapping(oMapping) {
|
|
348
|
+
this.oLastSemanticMapping = oMapping;
|
|
349
|
+
};
|
|
352
350
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
}
|
|
351
|
+
_proto.navigateTo = function navigateTo(oContext, sRouteName, mParameterMapping, bPreserveHistory) {
|
|
352
|
+
var _this5 = this;
|
|
356
353
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
return _this4.oRouter.getURL(sRouteName, mParameters);
|
|
363
|
-
});
|
|
364
|
-
}
|
|
354
|
+
var sTargetURLPromise, bIsStickyMode;
|
|
355
|
+
|
|
356
|
+
if (oContext.getModel() && oContext.getModel().getMetaModel) {
|
|
357
|
+
bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
|
|
358
|
+
}
|
|
365
359
|
|
|
366
|
-
|
|
367
|
-
|
|
360
|
+
if (!mParameterMapping) {
|
|
361
|
+
// if there is no parameter mapping define this mean we rely entirely on the binding context path
|
|
362
|
+
sTargetURLPromise = Promise.resolve(SemanticKeyHelper.getSemanticPath(oContext));
|
|
363
|
+
} else {
|
|
364
|
+
sTargetURLPromise = this.prepareParameters(mParameterMapping, sRouteName, oContext).then(function (mParameters) {
|
|
365
|
+
return _this5.oRouter.getURL(sRouteName, mParameters);
|
|
368
366
|
});
|
|
369
367
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
return {
|
|
411
|
-
key: sParameterKey,
|
|
412
|
-
value: value
|
|
413
|
-
};
|
|
368
|
+
|
|
369
|
+
return sTargetURLPromise.then(function (sTargetURL) {
|
|
370
|
+
_this5.oRouterProxy.navToHash(sTargetURL, bPreserveHistory, false, false, !bIsStickyMode);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Method to return a map of routing target parameters where the binding syntax is resolved to the current model.
|
|
375
|
+
*
|
|
376
|
+
* @param {object} mParameters Parameters map in the format [k: string] : ComplexBindingSyntax
|
|
377
|
+
* @param {string} sTargetRoute Name of the target route
|
|
378
|
+
* @param {object} oContext The instance of the binding context
|
|
379
|
+
* @returns {Promise} A promise which resolves to the routing target parameters
|
|
380
|
+
*/
|
|
381
|
+
;
|
|
382
|
+
|
|
383
|
+
_proto.prepareParameters = function prepareParameters(mParameters, sTargetRoute, oContext) {
|
|
384
|
+
var _this6 = this;
|
|
385
|
+
|
|
386
|
+
var oParametersPromise;
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
var sContextPath = oContext.getPath();
|
|
390
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
391
|
+
var aContextPathParts = sContextPath.split("/");
|
|
392
|
+
var aAllResolvedParameterPromises = Object.keys(mParameters).map(function (sParameterKey) {
|
|
393
|
+
var sParameterMappingExpression = mParameters[sParameterKey]; // We assume the defined parameters will be compatible with a binding expression
|
|
394
|
+
|
|
395
|
+
var oParsedExpression = BindingParser.complexParser(sParameterMappingExpression);
|
|
396
|
+
var aParts = oParsedExpression.parts || [oParsedExpression];
|
|
397
|
+
var aResolvedParameterPromises = aParts.map(function (oPathPart) {
|
|
398
|
+
var aRelativeParts = oPathPart.path.split("../"); // We go up the current context path as many times as necessary
|
|
399
|
+
|
|
400
|
+
var aLocalParts = aContextPathParts.slice(0, aContextPathParts.length - aRelativeParts.length + 1);
|
|
401
|
+
aLocalParts.push(aRelativeParts[aRelativeParts.length - 1]);
|
|
402
|
+
var sPropertyPath = aLocalParts.join("/");
|
|
403
|
+
var oMetaContext = oMetaModel.getMetaContext(sPropertyPath);
|
|
404
|
+
return oContext.requestProperty(sPropertyPath).then(function (oValue) {
|
|
405
|
+
var oPropertyInfo = oMetaContext.getObject();
|
|
406
|
+
var sEdmType = oPropertyInfo.$Type;
|
|
407
|
+
return ODataUtils.formatLiteral(oValue, sEdmType);
|
|
414
408
|
});
|
|
415
409
|
});
|
|
416
|
-
|
|
417
|
-
var
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
410
|
+
return Promise.all(aResolvedParameterPromises).then(function (aResolvedParameters) {
|
|
411
|
+
var value = oParsedExpression.formatter ? oParsedExpression.formatter.apply(_this6, aResolvedParameters) : aResolvedParameters.join("");
|
|
412
|
+
return {
|
|
413
|
+
key: sParameterKey,
|
|
414
|
+
value: value
|
|
415
|
+
};
|
|
422
416
|
});
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
this.eventProvider.fireEvent("afterRouteMatched", mParameters);
|
|
435
|
-
EditState.cleanProcessedEditState(); // Reset UI state when all bindings have been refreshed
|
|
417
|
+
});
|
|
418
|
+
oParametersPromise = Promise.all(aAllResolvedParameterPromises).then(function (aAllResolvedParameters) {
|
|
419
|
+
var oParameters = {};
|
|
420
|
+
aAllResolvedParameters.forEach(function (oResolvedParameter) {
|
|
421
|
+
oParameters[oResolvedParameter.key] = oResolvedParameter.value;
|
|
422
|
+
});
|
|
423
|
+
return oParameters;
|
|
424
|
+
});
|
|
425
|
+
} catch (oError) {
|
|
426
|
+
Log.error("Could not parse the parameters for the navigation to route " + sTargetRoute);
|
|
427
|
+
oParametersPromise = Promise.resolve(undefined);
|
|
436
428
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
429
|
+
|
|
430
|
+
return oParametersPromise;
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
_proto._fireRouteMatchEvents = function _fireRouteMatchEvents(mParameters) {
|
|
434
|
+
this.eventProvider.fireEvent("routeMatched", mParameters);
|
|
435
|
+
this.eventProvider.fireEvent("afterRouteMatched", mParameters);
|
|
436
|
+
EditState.cleanProcessedEditState(); // Reset UI state when all bindings have been refreshed
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Navigates to a context.
|
|
440
|
+
*
|
|
441
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The Context to be navigated to
|
|
442
|
+
* @param {object} [mParameters] Optional, map containing the following attributes:
|
|
443
|
+
* @param {boolean} [mParameters.checkNoHashChange] Navigate to the context without changing the URL
|
|
444
|
+
* @param {Promise} [mParameters.asyncContext] The context is created async, navigate to (...) and
|
|
445
|
+
* wait for Promise to be resolved and then navigate into the context
|
|
446
|
+
* @param {boolean} [mParameters.bDeferredContext] The context shall be created deferred at the target page
|
|
447
|
+
* @param {boolean} [mParameters.editable] The target page shall be immediately in the edit mode to avoid flickering
|
|
448
|
+
* @param {boolean} [mParameters.bPersistOPScroll] The bPersistOPScroll will be used for scrolling to first tab
|
|
449
|
+
* @param {number} [mParameters.updateFCLLevel] `+1` if we add a column in FCL, `-1` to remove a column, 0 to stay on the same column
|
|
450
|
+
* @param {boolean} [mParameters.noPreservationCache] Do navigation without taking into account the preserved cache mechanism
|
|
451
|
+
* @param {boolean} [mParameters.bRecreateContext] Force re-creation of the context instead of using the one passed as parameter
|
|
452
|
+
* @param {boolean} [mParameters.bForceFocus] Forces focus selection after navigation
|
|
453
|
+
* @param {object} [oViewData] View data
|
|
454
|
+
* @param {object} [oCurrentTargetInfo] The target information from which the navigation is triggered
|
|
455
|
+
* @returns {Promise} Promise which is resolved once the navigation is triggered
|
|
456
|
+
*
|
|
457
|
+
* @ui5-restricted
|
|
458
|
+
* @final
|
|
459
|
+
*/
|
|
460
|
+
;
|
|
461
|
+
|
|
462
|
+
_proto.navigateToContext = function navigateToContext(oContext, mParameters, oViewData, oCurrentTargetInfo) {
|
|
463
|
+
var _this7 = this;
|
|
464
|
+
|
|
465
|
+
var sTargetRoute = "",
|
|
466
|
+
oRouteParametersPromise,
|
|
467
|
+
bIsStickyMode = false;
|
|
468
|
+
|
|
469
|
+
if (oContext.getModel() && oContext.getModel().getMetaModel) {
|
|
470
|
+
bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
|
|
471
|
+
} // Manage parameter mapping
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
if (mParameters && mParameters.targetPath && oViewData && oViewData.navigation) {
|
|
475
|
+
var oRouteDetail = oViewData.navigation[mParameters.targetPath].detail;
|
|
476
|
+
sTargetRoute = oRouteDetail.route;
|
|
477
|
+
|
|
478
|
+
if (oRouteDetail.parameters) {
|
|
479
|
+
oRouteParametersPromise = this.prepareParameters(oRouteDetail.parameters, sTargetRoute, oContext);
|
|
481
480
|
}
|
|
481
|
+
}
|
|
482
482
|
|
|
483
|
-
|
|
484
|
-
|
|
483
|
+
var sTargetPath = this._getPathFromContext(oContext, mParameters); // If the path is empty, we're supposed to navigate to the first page of the app
|
|
484
|
+
// Check if we need to exit from the app instead
|
|
485
485
|
|
|
486
486
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
487
|
+
if (sTargetPath.length === 0 && this.bExitOnNavigateBackToRoot) {
|
|
488
|
+
return Promise.resolve(this.oRouterProxy.exitFromApp());
|
|
489
|
+
} // If the context is deferred or async, we add (...) to the path
|
|
490
490
|
|
|
491
491
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
492
|
+
if (mParameters !== null && mParameters !== void 0 && mParameters.asyncContext || mParameters !== null && mParameters !== void 0 && mParameters.bDeferredContext) {
|
|
493
|
+
sTargetPath += "(...)";
|
|
494
|
+
} // Add layout parameter if needed
|
|
495
495
|
|
|
496
496
|
|
|
497
|
-
|
|
497
|
+
var sLayout = this._calculateLayout(sTargetPath, mParameters);
|
|
498
498
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
499
|
+
if (sLayout) {
|
|
500
|
+
sTargetPath += "?layout=" + sLayout;
|
|
501
|
+
} // Navigation parameters for later usage
|
|
502
502
|
|
|
503
503
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
504
|
+
var oNavigationInfo = {
|
|
505
|
+
oAsyncContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.asyncContext,
|
|
506
|
+
bDeferredContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDeferredContext,
|
|
507
|
+
bTargetEditable: mParameters === null || mParameters === void 0 ? void 0 : mParameters.editable,
|
|
508
|
+
bPersistOPScroll: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bPersistOPScroll,
|
|
509
|
+
useContext: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.updateFCLLevel) === -1 || mParameters !== null && mParameters !== void 0 && mParameters.bRecreateContext ? undefined : oContext,
|
|
510
|
+
bDraftNavigation: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDraftNavigation,
|
|
511
|
+
bShowPlaceholder: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder) !== undefined ? mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder : true,
|
|
512
|
+
bNavigateToSiblingEntity: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bNavigateToSiblingEntity
|
|
513
|
+
};
|
|
513
514
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
515
|
+
if (mParameters !== null && mParameters !== void 0 && mParameters.checkNoHashChange) {
|
|
516
|
+
// Check if the new hash is different from the current one
|
|
517
|
+
var sCurrentHashNoAppState = this.oRouterProxy.getHash().replace(/[&?]{1}sap-iapp-state=[A-Z0-9]+/, "");
|
|
517
518
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
519
|
+
if (sTargetPath === sCurrentHashNoAppState) {
|
|
520
|
+
// The hash doesn't change, but we fire the routeMatch event to trigger page refresh / binding
|
|
521
|
+
var mEventParameters = this.oRouter.getRouteInfoByHash(this.oRouterProxy.getHash());
|
|
521
522
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
523
|
+
if (mEventParameters) {
|
|
524
|
+
mEventParameters.navigationInfo = oNavigationInfo;
|
|
525
|
+
mEventParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
|
|
526
|
+
mEventParameters.routePattern = this.sCurrentRoutePattern;
|
|
527
|
+
mEventParameters.views = this.aCurrentViews;
|
|
528
|
+
}
|
|
528
529
|
|
|
529
|
-
|
|
530
|
+
this.oRouterProxy.setFocusForced(!!mParameters.bForceFocus);
|
|
530
531
|
|
|
531
|
-
|
|
532
|
+
this._fireRouteMatchEvents(mEventParameters);
|
|
532
533
|
|
|
533
|
-
|
|
534
|
-
}
|
|
534
|
+
return Promise.resolve();
|
|
535
535
|
}
|
|
536
|
+
}
|
|
536
537
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
538
|
+
if (mParameters !== null && mParameters !== void 0 && mParameters.transient && mParameters.editable == true && sTargetPath.indexOf("(...)") === -1) {
|
|
539
|
+
if (sTargetPath.indexOf("?") > -1) {
|
|
540
|
+
sTargetPath += "&i-action=create";
|
|
541
|
+
} else {
|
|
542
|
+
sTargetPath += "?i-action=create";
|
|
543
|
+
}
|
|
544
|
+
} // Clear unbound messages upon navigating from LR to OP
|
|
545
|
+
// This is to ensure stale error messages from LR are not shown to the user after navigation to OP.
|
|
545
546
|
|
|
546
547
|
|
|
547
|
-
|
|
548
|
-
|
|
548
|
+
if (oCurrentTargetInfo && oCurrentTargetInfo.name === "sap.fe.templates.ListReport") {
|
|
549
|
+
var oRouteInfo = this.oRouter.getRouteInfoByHash(sTargetPath);
|
|
549
550
|
|
|
550
|
-
|
|
551
|
-
|
|
551
|
+
if (oRouteInfo) {
|
|
552
|
+
var oRoute = this._getRouteInformation(oRouteInfo.name);
|
|
552
553
|
|
|
553
|
-
|
|
554
|
-
|
|
554
|
+
if (oRoute && oRoute.targets && oRoute.targets.length > 0) {
|
|
555
|
+
var sLastTargetName = oRoute.targets[oRoute.targets.length - 1];
|
|
555
556
|
|
|
556
|
-
|
|
557
|
+
var oTarget = this._getTargetInformation(sLastTargetName);
|
|
557
558
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
}
|
|
559
|
+
if (oTarget && oTarget.name === "sap.fe.templates.ObjectPage") {
|
|
560
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
561
561
|
}
|
|
562
562
|
}
|
|
563
|
-
}
|
|
563
|
+
}
|
|
564
|
+
} // Add the navigation parameters in the queue
|
|
564
565
|
|
|
565
566
|
|
|
566
|
-
|
|
567
|
+
this.navigationInfoQueue.push(oNavigationInfo);
|
|
567
568
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
569
|
+
if (sTargetRoute && oRouteParametersPromise) {
|
|
570
|
+
return oRouteParametersPromise.then(function (oRouteParameters) {
|
|
571
|
+
oRouteParameters.bIsStickyMode = bIsStickyMode;
|
|
571
572
|
|
|
572
|
-
|
|
573
|
+
_this7.oRouter.navTo(sTargetRoute, oRouteParameters);
|
|
573
574
|
|
|
574
|
-
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
return this.oRouterProxy.navToHash(sTargetPath, false, mParameters === null || mParameters === void 0 ? void 0 : mParameters.noPreservationCache, mParameters === null || mParameters === void 0 ? void 0 : mParameters.bForceFocus, !bIsStickyMode).then(function (bNavigated) {
|
|
579
|
-
if (!bNavigated) {
|
|
580
|
-
// The navigation did not happen --> remove the navigation parameters from the queue as they shouldn't be used
|
|
581
|
-
_this6.navigationInfoQueue.pop();
|
|
582
|
-
}
|
|
575
|
+
return Promise.resolve();
|
|
583
576
|
});
|
|
584
577
|
}
|
|
585
|
-
/**
|
|
586
|
-
* Navigates to a route.
|
|
587
|
-
*
|
|
588
|
-
* @function
|
|
589
|
-
* @name sap.fe.core.controllerextensions.Routing#navigateToRoute
|
|
590
|
-
* @memberof sap.fe.core.controllerextensions.Routing
|
|
591
|
-
* @static
|
|
592
|
-
* @param {string} [sTargetRouteName] Name of the target route
|
|
593
|
-
* @param {object} [oRouteParameters] Parameters to be used with route to create the target hash
|
|
594
|
-
* @returns {Promise} Promise that is resolved when the navigation is finalized
|
|
595
|
-
*
|
|
596
|
-
* @ui5-restricted
|
|
597
|
-
* @final
|
|
598
|
-
*/
|
|
599
|
-
|
|
600
|
-
}, {
|
|
601
|
-
key: "navigateToRoute",
|
|
602
|
-
value: function navigateToRoute(sTargetRouteName, oRouteParameters) {
|
|
603
|
-
var sTargetURL = this.oRouter.getURL(sTargetRouteName, oRouteParameters);
|
|
604
|
-
return this.oRouterProxy.navToHash(sTargetURL, undefined, undefined, undefined, !oRouteParameters.bIsStickyMode);
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Checks if one of the current views on the screen is bound to a given context.
|
|
608
|
-
*
|
|
609
|
-
* @param {sap.ui.model.odata.v4.Context} oContext The context
|
|
610
|
-
* @returns {boolean} `true` or `false` if the current state is impacted or not
|
|
611
|
-
*/
|
|
612
|
-
|
|
613
|
-
}, {
|
|
614
|
-
key: "isCurrentStateImpactedBy",
|
|
615
|
-
value: function isCurrentStateImpactedBy(oContext) {
|
|
616
|
-
var sPath = oContext.getPath(); // First, check with the technical path. We have to try it, because for level > 1, we
|
|
617
|
-
// uses technical keys even if Semantic keys are enabled
|
|
618
|
-
|
|
619
|
-
if (this.oRouterProxy.isCurrentStateImpactedBy(sPath)) {
|
|
620
|
-
return true;
|
|
621
|
-
} else if (/^[^\(\)]+\([^\(\)]+\)$/.test(sPath)) {
|
|
622
|
-
// If the current path can be semantic (i.e. is like xxx(yyy))
|
|
623
|
-
// check with the semantic path if we can find it
|
|
624
|
-
var sSemanticPath;
|
|
625
|
-
|
|
626
|
-
if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
|
|
627
|
-
// We have already resolved this semantic path
|
|
628
|
-
sSemanticPath = this.oLastSemanticMapping.semanticPath;
|
|
629
|
-
} else {
|
|
630
|
-
sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext);
|
|
631
|
-
}
|
|
632
578
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
579
|
+
return this.oRouterProxy.navToHash(sTargetPath, false, mParameters === null || mParameters === void 0 ? void 0 : mParameters.noPreservationCache, mParameters === null || mParameters === void 0 ? void 0 : mParameters.bForceFocus, !bIsStickyMode).then(function (bNavigated) {
|
|
580
|
+
if (!bNavigated) {
|
|
581
|
+
// The navigation did not happen --> remove the navigation parameters from the queue as they shouldn't be used
|
|
582
|
+
_this7.navigationInfoQueue.pop();
|
|
636
583
|
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Navigates to a route.
|
|
588
|
+
*
|
|
589
|
+
* @function
|
|
590
|
+
* @name sap.fe.core.controllerextensions.Routing#navigateToRoute
|
|
591
|
+
* @memberof sap.fe.core.controllerextensions.Routing
|
|
592
|
+
* @static
|
|
593
|
+
* @param {string} sTargetRouteName Name of the target route
|
|
594
|
+
* @param {object} [oRouteParameters] Parameters to be used with route to create the target hash
|
|
595
|
+
* @returns {Promise} Promise that is resolved when the navigation is finalized
|
|
596
|
+
*
|
|
597
|
+
* @ui5-restricted
|
|
598
|
+
* @final
|
|
599
|
+
*/
|
|
600
|
+
;
|
|
601
|
+
|
|
602
|
+
_proto.navigateToRoute = function navigateToRoute(sTargetRouteName, oRouteParameters) {
|
|
603
|
+
var sTargetURL = this.oRouter.getURL(sTargetRouteName, oRouteParameters);
|
|
604
|
+
return this.oRouterProxy.navToHash(sTargetURL, undefined, undefined, undefined, !oRouteParameters.bIsStickyMode);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Checks if one of the current views on the screen is bound to a given context.
|
|
608
|
+
*
|
|
609
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context
|
|
610
|
+
* @returns {boolean} `true` or `false` if the current state is impacted or not
|
|
611
|
+
*/
|
|
612
|
+
;
|
|
613
|
+
|
|
614
|
+
_proto.isCurrentStateImpactedBy = function isCurrentStateImpactedBy(oContext) {
|
|
615
|
+
var sPath = oContext.getPath(); // First, check with the technical path. We have to try it, because for level > 1, we
|
|
616
|
+
// uses technical keys even if Semantic keys are enabled
|
|
617
|
+
|
|
618
|
+
if (this.oRouterProxy.isCurrentStateImpactedBy(sPath)) {
|
|
619
|
+
return true;
|
|
620
|
+
} else if (/^[^\(\)]+\([^\(\)]+\)$/.test(sPath)) {
|
|
621
|
+
// If the current path can be semantic (i.e. is like xxx(yyy))
|
|
622
|
+
// check with the semantic path if we can find it
|
|
623
|
+
var sSemanticPath;
|
|
624
|
+
|
|
625
|
+
if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
|
|
626
|
+
// We have already resolved this semantic path
|
|
627
|
+
sSemanticPath = this.oLastSemanticMapping.semanticPath;
|
|
646
628
|
} else {
|
|
647
|
-
|
|
629
|
+
sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext);
|
|
648
630
|
}
|
|
631
|
+
|
|
632
|
+
return sSemanticPath != sPath ? this.oRouterProxy.isCurrentStateImpactedBy(sSemanticPath) : false;
|
|
633
|
+
} else {
|
|
634
|
+
return false;
|
|
649
635
|
}
|
|
650
|
-
}
|
|
651
|
-
key: "_checkContextForSemanticPath",
|
|
652
|
-
value: function _checkContextForSemanticPath(oContext) {
|
|
653
|
-
var sPath = oContext.getPath(); // First, check if this is a level-1 object (path = /aaa(bbb))
|
|
636
|
+
};
|
|
654
637
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
638
|
+
_proto._findPathToNavigate = function _findPathToNavigate(sPath) {
|
|
639
|
+
var regex = new RegExp("/[^/]*$");
|
|
640
|
+
sPath = sPath.replace(regex, "");
|
|
658
641
|
|
|
642
|
+
if (this.oRouter.match(sPath) || sPath === "") {
|
|
643
|
+
return sPath;
|
|
644
|
+
} else {
|
|
645
|
+
return this._findPathToNavigate(sPath);
|
|
646
|
+
}
|
|
647
|
+
};
|
|
659
648
|
|
|
660
|
-
|
|
661
|
-
|
|
649
|
+
_proto._checkContextForSemanticPath = function _checkContextForSemanticPath(oContext) {
|
|
650
|
+
var sPath = oContext.getPath(); // First, check if this is a level-1 object (path = /aaa(bbb))
|
|
662
651
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
652
|
+
if (!/^\/[^\(]+\([^\)]+\)$/.test(sPath)) {
|
|
653
|
+
return false;
|
|
654
|
+
} // Then check if the entity has semantic keys
|
|
666
655
|
|
|
667
656
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
}, {
|
|
671
|
-
key: "_getPathFromContext",
|
|
672
|
-
value: function _getPathFromContext(oContext, mParameters) {
|
|
673
|
-
var sPath;
|
|
657
|
+
var oMetaModel = oContext.getModel().getMetaModel(),
|
|
658
|
+
sEntitySetName = oMetaModel.getMetaContext(oContext.getPath()).getObject("@sapui.name");
|
|
674
659
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
sPath = oContext.getPath();
|
|
679
|
-
}
|
|
660
|
+
if (!SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName)) {
|
|
661
|
+
return false;
|
|
662
|
+
} // Then check the entity is draft-enabled
|
|
680
663
|
|
|
681
|
-
if (mParameters.updateFCLLevel === -1) {
|
|
682
|
-
// When navigating back from a context, we need to remove the last component of the path
|
|
683
|
-
sPath = this._findPathToNavigate(sPath); // Check if we're navigating back to a semantic path that was previously resolved
|
|
684
664
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
}
|
|
688
|
-
} else if (this._checkContextForSemanticPath(oContext)) {
|
|
689
|
-
// We check if we have to use a semantic path
|
|
690
|
-
var sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
|
|
691
|
-
|
|
692
|
-
if (!sSemanticPath) {
|
|
693
|
-
// We were not able to build the semantic path --> Use the technical path and
|
|
694
|
-
// clear the previous mapping, otherwise the old mapping is used in EditFlow#updateDocument
|
|
695
|
-
// and it leads to unwanted page reloads
|
|
696
|
-
this.setLastSemanticMapping(undefined);
|
|
697
|
-
} else if (sSemanticPath !== sPath) {
|
|
698
|
-
// Store the mapping technical <-> semantic path to avoid recalculating it later
|
|
699
|
-
// and use the semantic path instead of the technical one
|
|
700
|
-
this.setLastSemanticMapping({
|
|
701
|
-
technicalPath: sPath,
|
|
702
|
-
semanticPath: sSemanticPath
|
|
703
|
-
});
|
|
704
|
-
sPath = sSemanticPath;
|
|
705
|
-
}
|
|
706
|
-
} // remove extra '/' at the beginning of path
|
|
665
|
+
return ModelHelper.isDraftSupported(oMetaModel, sPath);
|
|
666
|
+
};
|
|
707
667
|
|
|
668
|
+
_proto._getPathFromContext = function _getPathFromContext(oContext, mParameters) {
|
|
669
|
+
var sPath;
|
|
708
670
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
return sPath;
|
|
671
|
+
if (oContext.isA("sap.ui.model.odata.v4.ODataListBinding") && oContext.isRelative()) {
|
|
672
|
+
sPath = oContext.getHeaderContext().getPath();
|
|
673
|
+
} else {
|
|
674
|
+
sPath = oContext.getPath();
|
|
714
675
|
}
|
|
715
|
-
}, {
|
|
716
|
-
key: "_calculateLayout",
|
|
717
|
-
value: function _calculateLayout(sPath, mParameters) {
|
|
718
|
-
var FCLLevel = mParameters.FCLLevel;
|
|
719
676
|
|
|
720
|
-
|
|
721
|
-
|
|
677
|
+
if (mParameters.updateFCLLevel === -1) {
|
|
678
|
+
// When navigating back from a context, we need to remove the last component of the path
|
|
679
|
+
sPath = this._findPathToNavigate(sPath); // Check if we're navigating back to a semantic path that was previously resolved
|
|
722
680
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
return this.oAppComponent.getRootViewController().calculateLayout(FCLLevel, sPath, mParameters.sLayout);
|
|
729
|
-
}
|
|
730
|
-
/**
|
|
731
|
-
* Event handler before a route is matched.
|
|
732
|
-
* Displays a busy indicator.
|
|
733
|
-
*
|
|
734
|
-
*/
|
|
735
|
-
|
|
736
|
-
}, {
|
|
737
|
-
key: "_beforeRouteMatched",
|
|
738
|
-
value: function
|
|
739
|
-
/*oEvent: Event*/
|
|
740
|
-
_beforeRouteMatched() {
|
|
741
|
-
var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
|
|
742
|
-
|
|
743
|
-
if (!bPlaceholderEnabled) {
|
|
744
|
-
var oRootView = this.oAppComponent.getRootControl();
|
|
745
|
-
BusyLocker.lock(oRootView);
|
|
681
|
+
if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
|
|
682
|
+
sPath = this.oLastSemanticMapping.semanticPath;
|
|
746
683
|
}
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
if (BusyLocker.isLocked(oRootView) && !bPlaceholderEnabled) {
|
|
765
|
-
BusyLocker.unlock(oRootView);
|
|
684
|
+
} else if (this._checkContextForSemanticPath(oContext)) {
|
|
685
|
+
// We check if we have to use a semantic path
|
|
686
|
+
var sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
|
|
687
|
+
|
|
688
|
+
if (!sSemanticPath) {
|
|
689
|
+
// We were not able to build the semantic path --> Use the technical path and
|
|
690
|
+
// clear the previous mapping, otherwise the old mapping is used in EditFlow#updateDocument
|
|
691
|
+
// and it leads to unwanted page reloads
|
|
692
|
+
this.setLastSemanticMapping(undefined);
|
|
693
|
+
} else if (sSemanticPath !== sPath) {
|
|
694
|
+
// Store the mapping technical <-> semantic path to avoid recalculating it later
|
|
695
|
+
// and use the semantic path instead of the technical one
|
|
696
|
+
this.setLastSemanticMapping({
|
|
697
|
+
technicalPath: sPath,
|
|
698
|
+
semanticPath: sSemanticPath
|
|
699
|
+
});
|
|
700
|
+
sPath = sSemanticPath;
|
|
766
701
|
}
|
|
702
|
+
} // remove extra '/' at the beginning of path
|
|
767
703
|
|
|
768
|
-
var mParameters = oEvent.getParameters();
|
|
769
|
-
|
|
770
|
-
if (this.navigationInfoQueue.length) {
|
|
771
|
-
mParameters.navigationInfo = this.navigationInfoQueue[0];
|
|
772
|
-
this.navigationInfoQueue = this.navigationInfoQueue.slice(1);
|
|
773
|
-
} else {
|
|
774
|
-
mParameters.navigationInfo = {};
|
|
775
|
-
}
|
|
776
704
|
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
}
|
|
705
|
+
if (sPath[0] === "/") {
|
|
706
|
+
sPath = sPath.substring(1);
|
|
707
|
+
}
|
|
781
708
|
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
this.aCurrentViews = oEvent.getParameter("views");
|
|
785
|
-
mParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
|
|
786
|
-
mParameters.routePattern = this.sCurrentRoutePattern;
|
|
709
|
+
return sPath;
|
|
710
|
+
};
|
|
787
711
|
|
|
788
|
-
|
|
789
|
-
|
|
712
|
+
_proto._calculateLayout = function _calculateLayout(sPath, mParameters) {
|
|
713
|
+
var FCLLevel = mParameters.FCLLevel;
|
|
790
714
|
|
|
715
|
+
if (mParameters.updateFCLLevel) {
|
|
716
|
+
FCLLevel += mParameters.updateFCLLevel;
|
|
791
717
|
|
|
792
|
-
if (
|
|
793
|
-
|
|
794
|
-
_this7.oRouterProxy.resolveRouteMatch();
|
|
795
|
-
}).catch(function (oError) {
|
|
796
|
-
Log.error("Error while restoring history", oError);
|
|
797
|
-
});
|
|
798
|
-
} else {
|
|
799
|
-
this.oRouterProxy.resolveRouteMatch();
|
|
718
|
+
if (FCLLevel < 0) {
|
|
719
|
+
FCLLevel = 0;
|
|
800
720
|
}
|
|
801
721
|
}
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
722
|
+
|
|
723
|
+
return this.oAppComponent.getRootViewController().calculateLayout(FCLLevel, sPath, mParameters.sLayout, mParameters.keepCurrentLayout);
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Event handler before a route is matched.
|
|
727
|
+
* Displays a busy indicator.
|
|
728
|
+
*
|
|
729
|
+
*/
|
|
730
|
+
;
|
|
731
|
+
|
|
732
|
+
_proto._beforeRouteMatched = function
|
|
733
|
+
/*oEvent: Event*/
|
|
734
|
+
_beforeRouteMatched() {
|
|
735
|
+
var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
|
|
736
|
+
|
|
737
|
+
if (!bPlaceholderEnabled) {
|
|
738
|
+
var oRootView = this.oAppComponent.getRootControl();
|
|
739
|
+
BusyLocker.lock(oRootView);
|
|
811
740
|
}
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Event handler when a route is matched.
|
|
744
|
+
* Hides the busy indicator and fires its own 'routematched' event.
|
|
745
|
+
*
|
|
746
|
+
* @param {object} oEvent The event
|
|
747
|
+
*/
|
|
748
|
+
;
|
|
749
|
+
|
|
750
|
+
_proto._onRouteMatched = function _onRouteMatched(oEvent) {
|
|
751
|
+
var _this8 = this;
|
|
752
|
+
|
|
753
|
+
var oAppStateHandler = this.oAppComponent.getAppStateHandler(),
|
|
754
|
+
oRootView = this.oAppComponent.getRootControl();
|
|
755
|
+
var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
|
|
756
|
+
|
|
757
|
+
if (BusyLocker.isLocked(oRootView) && !bPlaceholderEnabled) {
|
|
758
|
+
BusyLocker.unlock(oRootView);
|
|
816
759
|
}
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
760
|
+
|
|
761
|
+
var mParameters = oEvent.getParameters();
|
|
762
|
+
|
|
763
|
+
if (this.navigationInfoQueue.length) {
|
|
764
|
+
mParameters.navigationInfo = this.navigationInfoQueue[0];
|
|
765
|
+
this.navigationInfoQueue = this.navigationInfoQueue.slice(1);
|
|
766
|
+
} else {
|
|
767
|
+
mParameters.navigationInfo = {};
|
|
821
768
|
}
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
var oRouteInfo = oRouter.getRouteInfoByHash(sHash);
|
|
827
|
-
return oAppComponent.getMetadata().getManifestEntry("/sap.ui5/routing/routes").filter(function (oRoute) {
|
|
828
|
-
return oRoute.name === oRouteInfo.name;
|
|
829
|
-
})[0];
|
|
769
|
+
|
|
770
|
+
if (oAppStateHandler.checkIfRouteChangedByIApp()) {
|
|
771
|
+
mParameters.navigationInfo.bReasonIsIappState = true;
|
|
772
|
+
oAppStateHandler.resetRouteChangedByIApp();
|
|
830
773
|
}
|
|
831
|
-
}, {
|
|
832
|
-
key: "getTargetsFromRoute",
|
|
833
|
-
value: function getTargetsFromRoute(oRoute) {
|
|
834
|
-
var _this8 = this;
|
|
835
774
|
|
|
836
|
-
|
|
775
|
+
this.sCurrentRouteName = oEvent.getParameter("name");
|
|
776
|
+
this.sCurrentRoutePattern = mParameters.config.pattern;
|
|
777
|
+
this.aCurrentViews = oEvent.getParameter("views");
|
|
778
|
+
mParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
|
|
779
|
+
mParameters.routePattern = this.sCurrentRoutePattern;
|
|
837
780
|
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
return aTarget;
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
}, {
|
|
849
|
-
key: "initializeRouting",
|
|
850
|
-
value: function initializeRouting() {
|
|
851
|
-
var _this9 = this;
|
|
852
|
-
|
|
853
|
-
// Attach router handlers
|
|
854
|
-
this._fnOnRouteMatched = this._onRouteMatched.bind(this);
|
|
855
|
-
this.oRouter.attachRouteMatched(this._fnOnRouteMatched, this);
|
|
856
|
-
var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
|
|
857
|
-
|
|
858
|
-
if (!bPlaceholderEnabled) {
|
|
859
|
-
this.oRouter.attachBeforeRouteMatched(this._beforeRouteMatched.bind(this));
|
|
860
|
-
} // Reset internal state
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
this.navigationInfoQueue = [];
|
|
864
|
-
EditState.resetEditState();
|
|
865
|
-
this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
|
|
866
|
-
var bIsIappState = this.oRouter.getHashChanger().getHash().indexOf("sap-iapp-state") !== -1;
|
|
867
|
-
var initPromise = this.oAppComponent.getStartupParameters().then(function (oStartupParameters) {
|
|
868
|
-
var bHasStartUpParameters = oStartupParameters !== undefined && Object.keys(oStartupParameters).length !== 0;
|
|
869
|
-
|
|
870
|
-
var sHash = _this9.oRouter.getHashChanger().getHash(); // Manage startup parameters (in case of no iapp-state)
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
if (!bIsIappState && bHasStartUpParameters && !sHash) {
|
|
874
|
-
if (oStartupParameters.preferredMode && oStartupParameters.preferredMode[0].indexOf("create") !== -1) {
|
|
875
|
-
// Create mode
|
|
876
|
-
return _this9._manageCreateStartup(oStartupParameters);
|
|
877
|
-
} else {
|
|
878
|
-
// Deep link
|
|
879
|
-
return _this9._manageDeepLinkStartup(oStartupParameters);
|
|
880
|
-
}
|
|
881
|
-
}
|
|
781
|
+
this._fireRouteMatchEvents(mParameters); // Check if current hash has been set by the routerProxy.navToHash function
|
|
782
|
+
// If not, rebuild history properly (both in the browser and the RouterProxy)
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
if (!history.state || history.state.feLevel === undefined) {
|
|
786
|
+
this.oRouterProxy.restoreHistory().then(function () {
|
|
787
|
+
_this8.oRouterProxy.resolveRouteMatch();
|
|
882
788
|
}).catch(function (oError) {
|
|
883
|
-
Log.error("Error
|
|
789
|
+
Log.error("Error while restoring history", oError);
|
|
884
790
|
});
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
791
|
+
} else {
|
|
792
|
+
this.oRouterProxy.resolveRouteMatch();
|
|
793
|
+
}
|
|
794
|
+
};
|
|
795
|
+
|
|
796
|
+
_proto.attachRouteMatched = function attachRouteMatched(oData, fnFunction, oListener) {
|
|
797
|
+
this.eventProvider.attachEvent("routeMatched", oData, fnFunction, oListener);
|
|
798
|
+
};
|
|
799
|
+
|
|
800
|
+
_proto.detachRouteMatched = function detachRouteMatched(fnFunction, oListener) {
|
|
801
|
+
this.eventProvider.detachEvent("routeMatched", fnFunction, oListener);
|
|
802
|
+
};
|
|
803
|
+
|
|
804
|
+
_proto.attachAfterRouteMatched = function attachAfterRouteMatched(oData, fnFunction, oListener) {
|
|
805
|
+
this.eventProvider.attachEvent("afterRouteMatched", oData, fnFunction, oListener);
|
|
806
|
+
};
|
|
807
|
+
|
|
808
|
+
_proto.detachAfterRouteMatched = function detachAfterRouteMatched(fnFunction, oListener) {
|
|
809
|
+
this.eventProvider.detachEvent("afterRouteMatched", fnFunction, oListener);
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
_proto.getRouteFromHash = function getRouteFromHash(oRouter, oAppComponent) {
|
|
813
|
+
var sHash = oRouter.getHashChanger().hash;
|
|
814
|
+
var oRouteInfo = oRouter.getRouteInfoByHash(sHash);
|
|
815
|
+
return oAppComponent.getMetadata().getManifestEntry("/sap.ui5/routing/routes").filter(function (oRoute) {
|
|
816
|
+
return oRoute.name === oRouteInfo.name;
|
|
817
|
+
})[0];
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
_proto.getTargetsFromRoute = function getTargetsFromRoute(oRoute) {
|
|
821
|
+
var _this9 = this;
|
|
822
|
+
|
|
823
|
+
var oTarget = oRoute.target;
|
|
824
|
+
|
|
825
|
+
if (typeof oTarget === "string") {
|
|
826
|
+
return [this._mTargets[oTarget]];
|
|
827
|
+
} else {
|
|
828
|
+
var aTarget = [];
|
|
829
|
+
oTarget.forEach(function (sTarget) {
|
|
830
|
+
aTarget.push(_this9._mTargets[sTarget]);
|
|
831
|
+
});
|
|
832
|
+
return aTarget;
|
|
891
833
|
}
|
|
892
|
-
}
|
|
893
|
-
key: "_manageCreateStartup",
|
|
894
|
-
value: function _manageCreateStartup(oStartupParameters) {
|
|
895
|
-
var _this10 = this;
|
|
834
|
+
};
|
|
896
835
|
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
_this10.oRouter.getHashChanger().replaceHash(sNewHash);
|
|
836
|
+
_proto.initializeRouting = function initializeRouting() {
|
|
837
|
+
var _this10 = this;
|
|
900
838
|
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
// and use the semantic path instead of the technical one
|
|
920
|
-
_this11.setLastSemanticMapping({
|
|
921
|
-
technicalPath: sTechnicalPath,
|
|
922
|
-
semanticPath: sSemanticPath
|
|
923
|
-
});
|
|
924
|
-
}
|
|
839
|
+
// Attach router handlers
|
|
840
|
+
this._fnOnRouteMatched = this._onRouteMatched.bind(this);
|
|
841
|
+
this.oRouter.attachRouteMatched(this._fnOnRouteMatched, this);
|
|
842
|
+
var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
|
|
843
|
+
|
|
844
|
+
if (!bPlaceholderEnabled) {
|
|
845
|
+
this.oRouter.attachBeforeRouteMatched(this._beforeRouteMatched.bind(this));
|
|
846
|
+
} // Reset internal state
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
this.navigationInfoQueue = [];
|
|
850
|
+
EditState.resetEditState();
|
|
851
|
+
this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
|
|
852
|
+
var bIsIappState = this.oRouter.getHashChanger().getHash().indexOf("sap-iapp-state") !== -1;
|
|
853
|
+
var initPromise = this.oAppComponent.getStartupParameters().then(function (oStartupParameters) {
|
|
854
|
+
var bHasStartUpParameters = oStartupParameters !== undefined && Object.keys(oStartupParameters).length !== 0;
|
|
855
|
+
|
|
856
|
+
var sHash = _this10.oRouter.getHashChanger().getHash(); // Manage startup parameters (in case of no iapp-state)
|
|
925
857
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
858
|
+
|
|
859
|
+
if (!bIsIappState && bHasStartUpParameters && !sHash) {
|
|
860
|
+
if (oStartupParameters.preferredMode && oStartupParameters.preferredMode[0].indexOf("create") !== -1) {
|
|
861
|
+
// Create mode
|
|
862
|
+
return _this10._manageCreateStartup(oStartupParameters);
|
|
863
|
+
} else {
|
|
864
|
+
// Deep link
|
|
865
|
+
return _this10._manageDeepLinkStartup(oStartupParameters);
|
|
929
866
|
}
|
|
867
|
+
}
|
|
868
|
+
}).catch(function (oError) {
|
|
869
|
+
Log.error("Error during routing initialization", oError);
|
|
870
|
+
});
|
|
871
|
+
return initPromise;
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
_proto.getDefaultCreateHash = function getDefaultCreateHash(oStartupParameters) {
|
|
875
|
+
return AppStartupHelper.getDefaultCreateHash(oStartupParameters, this.getContextPath(), this.oRouter);
|
|
876
|
+
};
|
|
877
|
+
|
|
878
|
+
_proto._manageCreateStartup = function _manageCreateStartup(oStartupParameters) {
|
|
879
|
+
var _this11 = this;
|
|
880
|
+
|
|
881
|
+
return AppStartupHelper.getCreateStartupHash(oStartupParameters, this.getContextPath(), this.oRouter, this.oMetaModel).then(function (sNewHash) {
|
|
882
|
+
if (sNewHash) {
|
|
883
|
+
_this11.oRouter.getHashChanger().replaceHash(sNewHash);
|
|
930
884
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
885
|
+
_this11.bExitOnNavigateBackToRoot = true;
|
|
886
|
+
}
|
|
887
|
+
});
|
|
888
|
+
};
|
|
889
|
+
|
|
890
|
+
_proto._manageDeepLinkStartup = function _manageDeepLinkStartup(oStartupParameters) {
|
|
891
|
+
var _this12 = this;
|
|
892
|
+
|
|
893
|
+
return AppStartupHelper.getDeepLinkStartupHash(this.oAppComponent.getManifest()["sap.ui5"].routing, oStartupParameters, this.oModel).then(function (oDeepLink) {
|
|
894
|
+
var sHash;
|
|
895
|
+
|
|
896
|
+
if (oDeepLink.context) {
|
|
897
|
+
var sTechnicalPath = oDeepLink.context.getPath(),
|
|
898
|
+
sSemanticPath = SemanticKeyHelper.getSemanticPath(oDeepLink.context);
|
|
899
|
+
|
|
900
|
+
if (sSemanticPath !== sTechnicalPath) {
|
|
901
|
+
// Store the mapping technical <-> semantic path to avoid recalculating it later
|
|
902
|
+
// and use the semantic path instead of the technical one
|
|
903
|
+
_this12.setLastSemanticMapping({
|
|
904
|
+
technicalPath: sTechnicalPath,
|
|
905
|
+
semanticPath: sSemanticPath
|
|
906
|
+
});
|
|
934
907
|
}
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
908
|
+
|
|
909
|
+
sHash = sSemanticPath.substring(1); // To remove the leading '/'
|
|
910
|
+
} else if (oDeepLink.hash) {
|
|
911
|
+
sHash = oDeepLink.hash;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
if (sHash) {
|
|
915
|
+
//Replace the hash with newly created hash
|
|
916
|
+
_this12.oRouter.getHashChanger().replaceHash(sHash);
|
|
917
|
+
}
|
|
918
|
+
});
|
|
919
|
+
};
|
|
920
|
+
|
|
921
|
+
_proto.getOutbounds = function getOutbounds() {
|
|
922
|
+
return this.outbounds;
|
|
923
|
+
}
|
|
924
|
+
/**
|
|
925
|
+
* Gets the name of the Draft root entity set or the sticky-enabled entity set.
|
|
926
|
+
*
|
|
927
|
+
* @returns {string} The name of the root EntitySet
|
|
928
|
+
*
|
|
929
|
+
* @ui5-restricted
|
|
930
|
+
*/
|
|
931
|
+
;
|
|
932
|
+
|
|
933
|
+
_proto.getContextPath = function getContextPath() {
|
|
934
|
+
return this.sContextPath;
|
|
935
|
+
};
|
|
936
|
+
|
|
937
|
+
_proto.getInterface = function getInterface() {
|
|
938
|
+
return this;
|
|
939
|
+
};
|
|
961
940
|
|
|
962
941
|
return RoutingService;
|
|
963
942
|
}(Service);
|
|
964
943
|
|
|
965
|
-
|
|
966
|
-
_inherits(RoutingServiceFactory, _ServiceFactory);
|
|
944
|
+
_exports.RoutingService = RoutingService;
|
|
967
945
|
|
|
968
|
-
|
|
946
|
+
var RoutingServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
|
|
947
|
+
_inheritsLoose(RoutingServiceFactory, _ServiceFactory);
|
|
969
948
|
|
|
970
949
|
function RoutingServiceFactory() {
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
return _super2.apply(this, arguments);
|
|
950
|
+
return _ServiceFactory.apply(this, arguments) || this;
|
|
974
951
|
}
|
|
975
952
|
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
}]);
|
|
953
|
+
var _proto2 = RoutingServiceFactory.prototype;
|
|
954
|
+
|
|
955
|
+
_proto2.createInstance = function createInstance(oServiceContext) {
|
|
956
|
+
var oRoutingService = new RoutingService(oServiceContext);
|
|
957
|
+
return oRoutingService.initPromise;
|
|
958
|
+
};
|
|
983
959
|
|
|
984
960
|
return RoutingServiceFactory;
|
|
985
961
|
}(ServiceFactory);
|
|
986
962
|
|
|
987
963
|
return RoutingServiceFactory;
|
|
988
964
|
}, false);
|
|
989
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiRXZlbnRQcm92aWRlciIsImV4dGVuZCIsIm1ldGFkYXRhIiwiZXZlbnRzIiwiUm91dGluZ1NlcnZpY2UiLCJvQ29udGV4dCIsImdldENvbnRleHQiLCJzY29wZVR5cGUiLCJvQXBwQ29tcG9uZW50Iiwic2NvcGVPYmplY3QiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJldmVudFByb3ZpZGVyIiwib1JvdXRpbmdDb25maWciLCJnZXRNYW5pZmVzdEVudHJ5Iiwib1Jvb3RWaWV3Q29uZmlnIiwiX3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24iLCJvQXBwQ29uZmlnIiwib3V0Ym91bmRzIiwiY3Jvc3NOYXZpZ2F0aW9uIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIl9mbk9uUm91dGVNYXRjaGVkIiwiZmlyZUV2ZW50IiwiZGVzdHJveSIsImlzRkNMIiwidmlld05hbWUiLCJfbVRhcmdldHMiLCJPYmplY3QiLCJrZXlzIiwidGFyZ2V0cyIsImZvckVhY2giLCJzVGFyZ2V0TmFtZSIsImFzc2lnbiIsInRhcmdldE5hbWUiLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInZpZXdMZXZlbCIsIl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybiIsIl9tUm91dGVzIiwic1JvdXRlS2V5Iiwicm91dGVzIiwib1JvdXRlTWFuaWZlc3RJbmZvIiwiYVJvdXRlVGFyZ2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInNSb3V0ZU5hbWUiLCJuYW1lIiwic1JvdXRlUGF0dGVybiIsInBhdHRlcm4iLCJsZW5ndGgiLCJpbmRleE9mIiwiTG9nIiwid2FybmluZyIsImlSb3V0ZUxldmVsIiwicm91dGVMZXZlbCIsImkiLCJzUGFyZW50VGFyZ2V0TmFtZSIsInBhcmVudCIsInB1c2giLCJGQ0xMZXZlbCIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImFMZXZlbDBSb3V0ZU5hbWVzIiwiYUxldmVsMVJvdXRlTmFtZXMiLCJzRGVmYXVsdFJvdXRlTmFtZSIsInNOYW1lIiwiaUxldmVsIiwic0RlZmF1bHRUYXJnZXROYW1lIiwic2xpY2UiLCJzQ29udGV4dFBhdGgiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJvU2V0dGluZ3MiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1hcCIsInNUYXJnZXRLZXkiLCJzb3J0IiwiYSIsImIiLCJmdWxsQ29udGV4dFBhdGgiLCJuYXZpZ2F0aW9uIiwic05hdk5hbWUiLCJ0YXJnZXRSb3V0ZSIsImRldGFpbCIsInJvdXRlIiwic1BhdHRlcm4iLCJyZXBsYWNlIiwicmVnZXgiLCJSZWdFeHAiLCJtYXRjaCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwib0NvbXBvbmVudEluc3RhbmNlIiwic1RhcmdldENvbXBvbmVudElkIiwiX2dldENvbXBvbmVudElkIiwiX3NPd25lcklkIiwiZ2V0SWQiLCJzQ29ycmVjdFRhcmdldE5hbWUiLCJpZCIsInZpZXdJZCIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwib01hcHBpbmciLCJtUGFyYW1ldGVyTWFwcGluZyIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJzVGFyZ2V0VVJMUHJvbWlzZSIsImJJc1N0aWNreU1vZGUiLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNQYXRoIiwicHJlcGFyZVBhcmFtZXRlcnMiLCJ0aGVuIiwibVBhcmFtZXRlcnMiLCJnZXRVUkwiLCJzVGFyZ2V0VVJMIiwibmF2VG9IYXNoIiwic1RhcmdldFJvdXRlIiwib1BhcmFtZXRlcnNQcm9taXNlIiwiZ2V0UGF0aCIsImFDb250ZXh0UGF0aFBhcnRzIiwic3BsaXQiLCJhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyIsInNQYXJhbWV0ZXJLZXkiLCJzUGFyYW1ldGVyTWFwcGluZ0V4cHJlc3Npb24iLCJvUGFyc2VkRXhwcmVzc2lvbiIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYVBhcnRzIiwicGFydHMiLCJhUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyIsIm9QYXRoUGFydCIsImFSZWxhdGl2ZVBhcnRzIiwicGF0aCIsImFMb2NhbFBhcnRzIiwic1Byb3BlcnR5UGF0aCIsImpvaW4iLCJvTWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInJlcXVlc3RQcm9wZXJ0eSIsIm9WYWx1ZSIsIm9Qcm9wZXJ0eUluZm8iLCJnZXRPYmplY3QiLCJzRWRtVHlwZSIsIiRUeXBlIiwiT0RhdGFVdGlscyIsImZvcm1hdExpdGVyYWwiLCJhbGwiLCJhUmVzb2x2ZWRQYXJhbWV0ZXJzIiwidmFsdWUiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImtleSIsImFBbGxSZXNvbHZlZFBhcmFtZXRlcnMiLCJvUGFyYW1ldGVycyIsIm9SZXNvbHZlZFBhcmFtZXRlciIsIm9FcnJvciIsImVycm9yIiwiRWRpdFN0YXRlIiwiY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUiLCJvVmlld0RhdGEiLCJvQ3VycmVudFRhcmdldEluZm8iLCJvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSIsInRhcmdldFBhdGgiLCJvUm91dGVEZXRhaWwiLCJwYXJhbWV0ZXJzIiwic1RhcmdldFBhdGgiLCJfZ2V0UGF0aEZyb21Db250ZXh0IiwiYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCIsImV4aXRGcm9tQXBwIiwiYXN5bmNDb250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsInNMYXlvdXQiLCJfY2FsY3VsYXRlTGF5b3V0Iiwib05hdmlnYXRpb25JbmZvIiwib0FzeW5jQ29udGV4dCIsImJUYXJnZXRFZGl0YWJsZSIsImVkaXRhYmxlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInVzZUNvbnRleHQiLCJ1cGRhdGVGQ0xMZXZlbCIsImJSZWNyZWF0ZUNvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwiYlNob3dQbGFjZWhvbGRlciIsInNob3dQbGFjZWhvbGRlciIsImNoZWNrTm9IYXNoQ2hhbmdlIiwic0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSIsImdldEhhc2giLCJtRXZlbnRQYXJhbWV0ZXJzIiwiZ2V0Um91dGVJbmZvQnlIYXNoIiwibmF2aWdhdGlvbkluZm8iLCJyb3V0ZUluZm9ybWF0aW9uIiwiX2dldFJvdXRlSW5mb3JtYXRpb24iLCJzQ3VycmVudFJvdXRlTmFtZSIsInJvdXRlUGF0dGVybiIsInNDdXJyZW50Um91dGVQYXR0ZXJuIiwidmlld3MiLCJhQ3VycmVudFZpZXdzIiwic2V0Rm9jdXNGb3JjZWQiLCJiRm9yY2VGb2N1cyIsIl9maXJlUm91dGVNYXRjaEV2ZW50cyIsInRyYW5zaWVudCIsIm9Sb3V0ZUluZm8iLCJvUm91dGUiLCJzTGFzdFRhcmdldE5hbWUiLCJvVGFyZ2V0IiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsIm5hdmlnYXRpb25JbmZvUXVldWUiLCJvUm91dGVQYXJhbWV0ZXJzIiwibmF2VG8iLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYk5hdmlnYXRlZCIsInBvcCIsInNUYXJnZXRSb3V0ZU5hbWUiLCJzUGF0aCIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsInRlc3QiLCJzU2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNlbWFudGljUGF0aCIsIl9maW5kUGF0aFRvTmF2aWdhdGUiLCJzRW50aXR5U2V0TmFtZSIsImdldFNlbWFudGljS2V5cyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0EiLCJpc1JlbGF0aXZlIiwiZ2V0SGVhZGVyQ29udGV4dCIsIl9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgiLCJzZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic3Vic3RyaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY2FsY3VsYXRlTGF5b3V0IiwiYlBsYWNlaG9sZGVyRW5hYmxlZCIsIlBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib0V2ZW50Iiwib0FwcFN0YXRlSGFuZGxlciIsImdldEFwcFN0YXRlSGFuZGxlciIsImlzTG9ja2VkIiwidW5sb2NrIiwiZ2V0UGFyYW1ldGVycyIsImNoZWNrSWZSb3V0ZUNoYW5nZWRCeUlBcHAiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJyZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCIsImdldFBhcmFtZXRlciIsImNvbmZpZyIsImhpc3RvcnkiLCJzdGF0ZSIsImZlTGV2ZWwiLCJyZXN0b3JlSGlzdG9yeSIsInJlc29sdmVSb3V0ZU1hdGNoIiwiY2F0Y2giLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImRldGFjaEV2ZW50Iiwic0hhc2giLCJnZXRIYXNoQ2hhbmdlciIsImhhc2giLCJnZXRNZXRhZGF0YSIsImZpbHRlciIsImFUYXJnZXQiLCJzVGFyZ2V0IiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsIl9iZWZvcmVSb3V0ZU1hdGNoZWQiLCJyZXNldEVkaXRTdGF0ZSIsImJJc0lhcHBTdGF0ZSIsImdldFN0YXJ0dXBQYXJhbWV0ZXJzIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzIiwicHJlZmVycmVkTW9kZSIsIl9tYW5hZ2VDcmVhdGVTdGFydHVwIiwiX21hbmFnZURlZXBMaW5rU3RhcnR1cCIsIkFwcFN0YXJ0dXBIZWxwZXIiLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImdldENvbnRleHRQYXRoIiwiZ2V0Q3JlYXRlU3RhcnR1cEhhc2giLCJzTmV3SGFzaCIsInJlcGxhY2VIYXNoIiwiZ2V0RGVlcExpbmtTdGFydHVwSGFzaCIsImdldE1hbmlmZXN0Iiwicm91dGluZyIsIm9EZWVwTGluayIsImNvbnRleHQiLCJzVGVjaG5pY2FsUGF0aCIsIlNlcnZpY2UiLCJSb3V0aW5nU2VydmljZUZhY3RvcnkiLCJvU2VydmljZUNvbnRleHQiLCJvUm91dGluZ1NlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsTUFBTUEsc0JBQXNCLEdBQUdDLGFBQWEsQ0FBQ0MsTUFBZCxDQUFxQiw2Q0FBckIsRUFBb0U7QUFDbEdDLElBQUFBLFFBQVEsRUFBRTtBQUNUQyxNQUFBQSxNQUFNLEVBQUU7QUFDUCx3QkFBZ0IsRUFEVDtBQUVQLDZCQUFxQjtBQUZkO0FBREM7QUFEd0YsR0FBcEUsQ0FBL0I7O01BUU1DLGM7Ozs7Ozs7Ozs7Ozs7Ozs7NEVBZ0J3QixFOzs7Ozs7O2FBRzdCLGdCQUFPO0FBQ04sWUFBTUMsUUFBUSxHQUFHLEtBQUtDLFVBQUwsRUFBakI7O0FBQ0EsWUFBSUQsUUFBUSxDQUFDRSxTQUFULEtBQXVCLFdBQTNCLEVBQXdDO0FBQ3ZDLGVBQUtDLGFBQUwsR0FBcUJILFFBQVEsQ0FBQ0ksV0FBOUI7QUFDQSxlQUFLQyxNQUFMLEdBQWMsS0FBS0YsYUFBTCxDQUFtQkcsUUFBbkIsRUFBZDtBQUNBLGVBQUtDLFVBQUwsR0FBa0IsS0FBS0YsTUFBTCxDQUFZRyxZQUFaLEVBQWxCO0FBQ0EsZUFBS0MsT0FBTCxHQUFlLEtBQUtOLGFBQUwsQ0FBbUJPLFNBQW5CLEVBQWY7QUFDQSxlQUFLQyxZQUFMLEdBQW9CLEtBQUtSLGFBQUwsQ0FBbUJTLGNBQW5CLEVBQXBCO0FBQ0EsZUFBS0MsYUFBTCxHQUFxQixJQUFLbkIsc0JBQUwsRUFBckI7QUFFQSxjQUFNb0IsY0FBYyxHQUFHLEtBQUtYLGFBQUwsQ0FBbUJZLGdCQUFuQixDQUFvQyxrQkFBcEMs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Q0E7O0FBRUQ0QyxZQUFBQSxLQUFLLEdBQUc1QyxhQUFhLENBQUNZLFNBQWQsQ0FBd0IsQ0FBeEIsQ0FBUixDQVZzQixDQVVjO0FBQ3BDLFdBWEQsTUFXTyxJQUFJNkQsU0FBUyxDQUFDM0IsSUFBZCxFQUFvQjtBQUMxQkYsWUFBQUEsS0FBSyxHQUFHNkIsU0FBUyxDQUFDM0IsSUFBbEI7QUFDQTs7QUFFRCxjQUFJRixLQUFKLEVBQVc7QUFDVjtBQUNDLFlBQUEsT0FBSSxDQUFDblEsT0FBTCxDQUFhb1EsY0FBYixHQUE4QndCLFdBQS9CLENBQW1EekIsS0FBbkQ7QUFDQTtBQUNELFNBekJNLENBQVA7QUEwQkE7OzthQUVELHdCQUFlO0FBQ2QsZUFBTyxLQUFLelAsU0FBWjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQywwQkFBaUI7QUFDaEIsZUFBTyxLQUFLc0QsWUFBWjtBQUNBOzs7YUFDRCx3QkFBb0I7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUF6MUIyQm1PLE87O01BNDFCdkJDLHFCOzs7Ozs7Ozs7Ozs7O2FBQ0wsd0JBQWVDLGVBQWYsRUFBd0U7QUFDdkUsWUFBTUMsZUFBZSxHQUFHLElBQUloVCxjQUFKLENBQW1CK1MsZUFBbkIsQ0FBeEI7QUFDQSxlQUFPQyxlQUFlLENBQUMxUixXQUF2QjtBQUNBOzs7O0lBSmtDMlIsYzs7U0FPckJILHFCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEV2ZW50UHJvdmlkZXIgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50UHJvdmlkZXJcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgUGxhY2Vob2xkZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCBBcHBTdGFydHVwSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0FwcFN0YXJ0dXBIZWxwZXJcIjtcbmltcG9ydCBPRGF0YVV0aWxzIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFVdGlsc1wiO1xuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG50eXBlIFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcbmNvbnN0IFJvdXRpbmdTZXJ2aWNlRXZlbnRpbmcgPSBFdmVudFByb3ZpZGVyLmV4dGVuZChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJvdXRpbmdTZXJ2aWNlRXZlbnRpbmdcIiwge1xuXHRtZXRhZGF0YToge1xuXHRcdGV2ZW50czoge1xuXHRcdFx0XCJyb3V0ZU1hdGNoZWRcIjoge30sXG5cdFx0XHRcImFmdGVyUm91dGVNYXRjaGVkXCI6IHt9XG5cdFx0fVxuXHR9XG59KTtcbmNsYXNzIFJvdXRpbmdTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdG9BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdG9Nb2RlbCE6IE9EYXRhTW9kZWw7XG5cdG9NZXRhTW9kZWwhOiBPRGF0YU1ldGFNb2RlbDtcblx0b1JvdXRlciE6IFJvdXRlcjtcblx0b1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdGV2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0b3V0Ym91bmRzOiBhbnk7XG5cdF9tVGFyZ2V0czogYW55O1xuXHRfbVJvdXRlczogYW55O1xuXHRvTGFzdFNlbWFudGljTWFwcGluZzogYW55O1xuXHRiRXhpdE9uTmF2aWdhdGVCYWNrVG9Sb290PzogYm9vbGVhbjtcblx0c0N1cnJlbnRSb3V0ZU5hbWU/OiBzdHJpbmc7XG5cdHNDdXJyZW50Um91dGVQYXR0ZXJuPzogc3RyaW5nO1xuXHRhQ3VycmVudFZpZXdzPzogYW55W107XG5cdG5hdmlnYXRpb25JbmZvUXVldWU6IGFueVtdID0gW107XG5cdHNDb250ZXh0UGF0aCE6IHN0cmluZztcblx0X2ZuT25Sb3V0ZU1hdGNoZWQhOiBGdW5jdGlvbjtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dC5zY29wZVR5cGUgPT09IFwiY29tcG9uZW50XCIpIHtcblx0XHRcdHRoaXMub0FwcENvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdFx0dGhpcy5vTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRcdHRoaXMub01ldGFNb2RlbCA9IHRoaXMub01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdHRoaXMuZXZlbnRQcm92aWRlciA9IG5ldyAoUm91dGluZ1NlcnZpY2VFdmVudGluZyBhcyBhbnkpKCk7XG5cblx0XHRcdGNvbnN0IG9Sb3V0aW5nQ29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb3V0aW5nXCIpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb290Vmlld1wiKTtcblx0XHRcdHRoaXMuX3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWcsIG9Sb290Vmlld0NvbmZpZyk7XG5cblx0XHRcdGNvbnN0IG9BcHBDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAuYXBwXCIpO1xuXHRcdFx0dGhpcy5vdXRib3VuZHMgPSBvQXBwQ29uZmlnICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uLm91dGJvdW5kcztcblx0XHR9XG5cblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cdGJlZm9yZUV4aXQoKSB7XG5cdFx0dGhpcy5vUm91dGVyLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicm91dGVNYXRjaGVkXCIsIHt9KTtcblx0fVxuXHRleGl0KCkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXN0cm95KCk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgYSBtYW5pZmVzdCByb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIHVzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1JvdXRpbmdDb25maWcgVGhlIHJvdXRpbmcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jvb3RWaWV3Q29uZmlnIFRoZSByb290IHZpZXcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWc6IGFueSwgb1Jvb3RWaWV3Q29uZmlnOiBhbnkpIHtcblx0XHRjb25zdCBpc0ZDTCA9IG9Sb290Vmlld0NvbmZpZyAmJiBvUm9vdFZpZXdDb25maWcudmlld05hbWUgPT09IFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLnZpZXcuRmNsXCI7XG5cblx0XHQvLyBJbmZvcm1hdGlvbiBvZiB0YXJnZXRzXG5cdFx0dGhpcy5fbVRhcmdldHMgPSB7fTtcblx0XHRPYmplY3Qua2V5cyhvUm91dGluZ0NvbmZpZy50YXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0gPSBPYmplY3QuYXNzaWduKHsgdGFyZ2V0TmFtZTogc1RhcmdldE5hbWUgfSwgb1JvdXRpbmdDb25maWcudGFyZ2V0c1tzVGFyZ2V0TmFtZV0pO1xuXG5cdFx0XHQvLyBWaWV3IGxldmVsIGZvciBGQ0wgY2FzZXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSB0YXJnZXQgcGF0dGVyblxuXHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybih0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4sIDApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5mb3JtYXRpb24gb2Ygcm91dGVzXG5cdFx0dGhpcy5fbVJvdXRlcyA9IHt9O1xuXHRcdGZvciAoY29uc3Qgc1JvdXRlS2V5IGluIG9Sb3V0aW5nQ29uZmlnLnJvdXRlcykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlTWFuaWZlc3RJbmZvID0gb1JvdXRpbmdDb25maWcucm91dGVzW3NSb3V0ZUtleV0sXG5cdFx0XHRcdGFSb3V0ZVRhcmdldHMgPSBBcnJheS5pc0FycmF5KG9Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXQpID8gb1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldCA6IFtvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0XSxcblx0XHRcdFx0c1JvdXRlTmFtZSA9IEFycmF5LmlzQXJyYXkob1JvdXRpbmdDb25maWcucm91dGVzKSA/IG9Sb3V0ZU1hbmlmZXN0SW5mby5uYW1lIDogc1JvdXRlS2V5LFxuXHRcdFx0XHRzUm91dGVQYXR0ZXJuID0gb1JvdXRlTWFuaWZlc3RJbmZvLnBhdHRlcm47XG5cblx0XHRcdC8vIENoZWNrIHJvdXRlIHBhdHRlcm46IGFsbCBwYXR0ZXJucyBuZWVkIHRvIGVuZCB3aXRoICc6P3F1ZXJ5OicsIHRoYXQgd2UgdXNlIGZvciBwYXJhbWV0ZXJzXG5cdFx0XHRpZiAoc1JvdXRlUGF0dGVybi5sZW5ndGggPCA4IHx8IHNSb3V0ZVBhdHRlcm4uaW5kZXhPZihcIjo/cXVlcnk6XCIpICE9PSBzUm91dGVQYXR0ZXJuLmxlbmd0aCAtIDgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJQYXR0ZXJuIGZvciByb3V0ZSBcIiArIHNSb3V0ZU5hbWUgKyBcIiBkb2Vzbid0IGVuZCB3aXRoICc6P3F1ZXJ5OicgOiBcIiArIHNSb3V0ZVBhdHRlcm4pO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaVJvdXRlTGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUm91dGVQYXR0ZXJuLCAwKTtcblx0XHRcdHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV0gPSB7XG5cdFx0XHRcdG5hbWU6IHNSb3V0ZU5hbWUsXG5cdFx0XHRcdHBhdHRlcm46IHNSb3V0ZVBhdHRlcm4sXG5cdFx0XHRcdHRhcmdldHM6IGFSb3V0ZVRhcmdldHMsXG5cdFx0XHRcdHJvdXRlTGV2ZWw6IGlSb3V0ZUxldmVsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBBZGQgdGhlIHBhcmVudCB0YXJnZXRzIGluIHRoZSBsaXN0IG9mIHRhcmdldHMgZm9yIHRoZSByb3V0ZVxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUm91dGVUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJlbnRUYXJnZXROYW1lID0gdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1tpXV0ucGFyZW50O1xuXHRcdFx0XHRpZiAoc1BhcmVudFRhcmdldE5hbWUpIHtcblx0XHRcdFx0XHRhUm91dGVUYXJnZXRzLnB1c2goc1BhcmVudFRhcmdldE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNGQ0wpIHtcblx0XHRcdFx0Ly8gVmlldyBsZXZlbCBmb3Igbm9uLUZDTCBjYXNlcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHJvdXRlIHBhdHRlcm5cblx0XHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA8IGlSb3V0ZUxldmVsKSB7XG5cdFx0XHRcdFx0Ly8gVGhlcmUgYXJlIGNhc2VzIHdoZW4gZGlmZmVyZW50IHJvdXRlcyBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuIFdlIHRha2UgdGhlXG5cdFx0XHRcdFx0Ly8gbGFyZ2VzdCB2aWV3TGV2ZWwgaW4gdGhhdCBjYXNlLlxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9IGlSb3V0ZUxldmVsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRkNMIGxldmVsIGZvciBub24tRkNMIGNhc2VzIGlzIGVxdWFsIHRvIC0xXG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLkZDTExldmVsID0gLTE7XG5cdFx0XHR9IGVsc2UgaWYgKGFSb3V0ZVRhcmdldHMubGVuZ3RoID09PSAxICYmIHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLmNvbnRyb2xBZ2dyZWdhdGlvbiAhPT0gXCJiZWdpbkNvbHVtblBhZ2VzXCIpIHtcblx0XHRcdFx0Ly8gV2UncmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUncyBvbmx5IDEgdGFyZ2V0IGZvciB0aGUgcm91dGUsIGFuZCBpdCdzIG5vdCBpbiB0aGUgZmlyc3QgY29sdW1uXG5cdFx0XHRcdC8vIC0tPiB0aGlzIGlzIGEgZnVsbHNjcmVlbiBjb2x1bW4gYWZ0ZXIgYWxsIGNvbHVtbnMgaW4gdGhlIEZDTCBoYXZlIGJlZW4gdXNlZFxuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS5GQ0xMZXZlbCA9IDM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlciBGQ0wgY2FzZXNcblx0XHRcdFx0YVJvdXRlVGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0c3dpdGNoICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYmVnaW5Db2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBcIm1pZENvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDE7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGFnYXRlIHZpZXdMZXZlbCwgY29udGV4dFBhdHRlcm4sIEZDTExldmVsIGFuZCBjb250cm9sQWdncmVnYXRpb24gdG8gcGFyZW50IHRhcmdldHNcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9tVGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0d2hpbGUgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5wYXJlbnQpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudFRhcmdldE5hbWUgPSB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ucGFyZW50O1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWw7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybjtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLkZDTExldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uRkNMTGV2ZWwgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb247XG5cdFx0XHRcdHNUYXJnZXROYW1lID0gc1BhcmVudFRhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIHJvb3QgZW50aXR5IGZvciB0aGUgYXBwXG5cdFx0Y29uc3QgYUxldmVsMFJvdXRlTmFtZXMgPSBbXTtcblx0XHRjb25zdCBhTGV2ZWwxUm91dGVOYW1lcyA9IFtdO1xuXHRcdGxldCBzRGVmYXVsdFJvdXRlTmFtZTtcblxuXHRcdGZvciAoY29uc3Qgc05hbWUgaW4gdGhpcy5fbVJvdXRlcykge1xuXHRcdFx0Y29uc3QgaUxldmVsID0gdGhpcy5fbVJvdXRlc1tzTmFtZV0ucm91dGVMZXZlbDtcblx0XHRcdGlmIChpTGV2ZWwgPT09IDApIHtcblx0XHRcdFx0YUxldmVsMFJvdXRlTmFtZXMucHVzaChzTmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlMZXZlbCA9PT0gMSkge1xuXHRcdFx0XHRhTGV2ZWwxUm91dGVOYW1lcy5wdXNoKHNOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYUxldmVsMFJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDBSb3V0ZU5hbWVzWzBdO1xuXHRcdH0gZWxzZSBpZiAoYUxldmVsMVJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDFSb3V0ZU5hbWVzWzBdO1xuXHRcdH1cblxuXHRcdGlmIChzRGVmYXVsdFJvdXRlTmFtZSkge1xuXHRcdFx0Y29uc3Qgc0RlZmF1bHRUYXJnZXROYW1lID0gdGhpcy5fbVJvdXRlc1tzRGVmYXVsdFJvdXRlTmFtZV0udGFyZ2V0cy5zbGljZSgtMSlbMF07XG5cdFx0XHR0aGlzLnNDb250ZXh0UGF0aCA9IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zICYmIHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncykge1xuXHRcdFx0XHRjb25zdCBvU2V0dGluZ3MgPSB0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdHRoaXMuc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmNvbnRleHRQYXRoIHx8IFwiL1wiICsgb1NldHRpbmdzLmVudGl0eVNldDtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5zQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XCJDYW5ub3QgZGV0ZXJtaW5lIGRlZmF1bHQgY29udGV4dFBhdGg6IGNvbnRleHRQYXRoIG9yIGVudGl0eVNldCBtaXNzaW5nIGluIGRlZmF1bHQgdGFyZ2V0OiBcIiArIHNEZWZhdWx0VGFyZ2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkNhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBjb250ZXh0UGF0aDogbm8gZGVmYXVsdCByb3V0ZSBmb3VuZC5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgbmVlZCB0byBlc3RhYmxpc2ggdGhlIGNvcnJlY3QgcGF0aCB0byB0aGUgZGlmZmVyZW50IHBhZ2VzLCBpbmNsdWRpbmcgdGhlIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKVxuXHRcdFx0Lm1hcCgoc1RhcmdldEtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0S2V5XTtcblx0XHRcdH0pXG5cdFx0XHQuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGEudmlld0xldmVsIDwgYi52aWV3TGV2ZWwgPyAtMSA6IDE7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goKHRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEFmdGVyIHNvcnRpbmcgdGhlIHRhcmdldHMgcGVyIGxldmVsIHdlIGNhbiB0aGVuIGdvIHRocm91Z2ggdGhlaXIgbmF2aWdhdGlvbiBvYmplY3QgYW5kIHVwZGF0ZSB0aGUgcGF0aHMgYWNjb3JkaW5nbHkuXG5cdFx0XHRcdGlmICh0YXJnZXQub3B0aW9ucykge1xuXHRcdFx0XHRcdGNvbnN0IHNldHRpbmdzID0gdGFyZ2V0Lm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gc2V0dGluZ3MuY29udGV4dFBhdGggfHwgKHNldHRpbmdzLmVudGl0eVNldCA/IFwiL1wiICsgc2V0dGluZ3MuZW50aXR5U2V0IDogXCJcIik7XG5cdFx0XHRcdFx0aWYgKCFzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggJiYgc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0XHRzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGggKyBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc2V0dGluZ3MubmF2aWdhdGlvbiB8fCB7fSkuZm9yRWFjaCgoc05hdk5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFJvdXRlID0gdGhpcy5fbVJvdXRlc1tzZXR0aW5ncy5uYXZpZ2F0aW9uW3NOYXZOYW1lXS5kZXRhaWwucm91dGVdO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFJvdXRlICYmIHRhcmdldFJvdXRlLnRhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Um91dGUudGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnZpZXdMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBcIi9cIiArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyBhIHZpZXcgbGV2ZWwgZnJvbSBhIHBhdHRlcm4gYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBzZWdtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXR0ZXJuIFRoZSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3TGV2ZWwgVGhlIGN1cnJlbnQgbGV2ZWwgb2Ygdmlld1xuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICovXG5cdF9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybjogc3RyaW5nLCB2aWV3TGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG5cdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRpZiAoc1BhdHRlcm4gJiYgc1BhdHRlcm5bMF0gIT09IFwiL1wiICYmIHNQYXR0ZXJuWzBdICE9PSBcIj9cIikge1xuXHRcdFx0c1BhdHRlcm4gPSBcIi9cIiArIHNQYXR0ZXJuO1xuXHRcdH1cblx0XHRpZiAoc1BhdHRlcm4ubGVuZ3RoKSB7XG5cdFx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdFx0aWYgKHRoaXMub1JvdXRlci5tYXRjaChzUGF0dGVybikgfHwgc1BhdHRlcm4gPT09IFwiXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNQYXR0ZXJuLCArK3ZpZXdMZXZlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm4sIHZpZXdMZXZlbCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB2aWV3TGV2ZWw7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvdXRlSW5mb3JtYXRpb24oc1JvdXRlTmFtZTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV07XG5cdH1cblxuXHRfZ2V0VGFyZ2V0SW5mb3JtYXRpb24oc1RhcmdldE5hbWU6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV07XG5cdH1cblxuXHRfZ2V0Q29tcG9uZW50SWQoc093bmVySWQ6IGFueSwgc0NvbXBvbmVudElkOiBhbnkpIHtcblx0XHRpZiAoc0NvbXBvbmVudElkLmluZGV4T2Yoc093bmVySWQgKyBcIi0tLVwiKSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHNDb21wb25lbnRJZC5zdWJzdHIoc093bmVySWQubGVuZ3RoICsgMyk7XG5cdFx0fVxuXHRcdHJldHVybiBzQ29tcG9uZW50SWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50SW5zdGFuY2UgSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldFxuXHQgKi9cblx0Z2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudEluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0Q29tcG9uZW50SWQgPSB0aGlzLl9nZXRDb21wb25lbnRJZChvQ29tcG9uZW50SW5zdGFuY2UuX3NPd25lcklkLCBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0SWQoKSk7XG5cdFx0bGV0IHNDb3JyZWN0VGFyZ2V0TmFtZSA9IG51bGw7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uaWQgPT09IHNUYXJnZXRDb21wb25lbnRJZCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0lkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQpIHtcblx0XHRcdFx0c0NvcnJlY3RUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhcmdldEluZm9ybWF0aW9uKHNDb3JyZWN0VGFyZ2V0TmFtZSk7XG5cdH1cblxuXHRnZXRMYXN0U2VtYW50aWNNYXBwaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nO1xuXHR9XG5cblx0c2V0TGFzdFNlbWFudGljTWFwcGluZyhvTWFwcGluZzogYW55KSB7XG5cdFx0dGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyA9IG9NYXBwaW5nO1xuXHR9XG5cblx0bmF2aWdhdGVUbyhvQ29udGV4dDogYW55LCBzUm91dGVOYW1lOiBhbnksIG1QYXJhbWV0ZXJNYXBwaW5nOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSkge1xuXHRcdGxldCBzVGFyZ2V0VVJMUHJvbWlzZSwgYklzU3RpY2t5TW9kZTogYm9vbGVhbjtcblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCkge1xuXHRcdFx0YklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdFx0aWYgKCFtUGFyYW1ldGVyTWFwcGluZykge1xuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIG1hcHBpbmcgZGVmaW5lIHRoaXMgbWVhbiB3ZSByZWx5IGVudGlyZWx5IG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0aFxuXHRcdFx0c1RhcmdldFVSTFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNUYXJnZXRVUkxQcm9taXNlID0gdGhpcy5wcmVwYXJlUGFyYW1ldGVycyhtUGFyYW1ldGVyTWFwcGluZywgc1JvdXRlTmFtZSwgb0NvbnRleHQpLnRoZW4oKG1QYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMub1JvdXRlci5nZXRVUkwoc1JvdXRlTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBzVGFyZ2V0VVJMUHJvbWlzZS50aGVuKChzVGFyZ2V0VVJMOiBhbnkpID0+IHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5Lm5hdlRvSGFzaChzVGFyZ2V0VVJMLCBiUHJlc2VydmVIaXN0b3J5LCBmYWxzZSwgZmFsc2UsICFiSXNTdGlja3lNb2RlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmV0dXJuIGEgbWFwIG9mIHJvdXRpbmcgdGFyZ2V0IHBhcmFtZXRlcnMgd2hlcmUgdGhlIGJpbmRpbmcgc3ludGF4IGlzIHJlc29sdmVkIHRvIHRoZSBjdXJyZW50IG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyBtYXAgaW4gdGhlIGZvcm1hdCBbazogc3RyaW5nXSA6IENvbXBsZXhCaW5kaW5nU3ludGF4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVGFyZ2V0Um91dGUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByb3V0aW5nIHRhcmdldCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRwcmVwYXJlUGFyYW1ldGVycyhtUGFyYW1ldGVyczogYW55LCBzVGFyZ2V0Um91dGU6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRsZXQgb1BhcmFtZXRlcnNQcm9taXNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRjb25zdCBhQ29udGV4dFBhdGhQYXJ0cyA9IHNDb250ZXh0UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRjb25zdCBhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyA9IE9iamVjdC5rZXlzKG1QYXJhbWV0ZXJzKS5tYXAoKHNQYXJhbWV0ZXJLZXk6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzUGFyYW1ldGVyTWFwcGluZ0V4cHJlc3Npb24gPSBtUGFyYW1ldGVyc1tzUGFyYW1ldGVyS2V5XTtcblx0XHRcdFx0Ly8gV2UgYXNzdW1lIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgd2lsbCBiZSBjb21wYXRpYmxlIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb25cblx0XHRcdFx0Y29uc3Qgb1BhcnNlZEV4cHJlc3Npb24gPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc1BhcmFtZXRlck1hcHBpbmdFeHByZXNzaW9uKTtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gb1BhcnNlZEV4cHJlc3Npb24ucGFydHMgfHwgW29QYXJzZWRFeHByZXNzaW9uXTtcblx0XHRcdFx0Y29uc3QgYVJlc29sdmVkUGFyYW1ldGVyUHJvbWlzZXMgPSBhUGFydHMubWFwKGZ1bmN0aW9uKG9QYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgYVJlbGF0aXZlUGFydHMgPSBvUGF0aFBhcnQucGF0aC5zcGxpdChcIi4uL1wiKTtcblx0XHRcdFx0XHQvLyBXZSBnbyB1cCB0aGUgY3VycmVudCBjb250ZXh0IHBhdGggYXMgbWFueSB0aW1lcyBhcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRjb25zdCBhTG9jYWxQYXJ0cyA9IGFDb250ZXh0UGF0aFBhcnRzLnNsaWNlKDAsIGFDb250ZXh0UGF0aFBhcnRzLmxlbmd0aCAtIGFSZWxhdGl2ZVBhcnRzLmxlbmd0aCArIDEpO1xuXHRcdFx0XHRcdGFMb2NhbFBhcnRzLnB1c2goYVJlbGF0aXZlUGFydHNbYVJlbGF0aXZlUGFydHMubGVuZ3RoIC0gMV0pO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGFMb2NhbFBhcnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQoc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShzUHJvcGVydHlQYXRoKS50aGVuKGZ1bmN0aW9uKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHlJbmZvID0gb01ldGFDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VkbVR5cGUgPSBvUHJvcGVydHlJbmZvLiRUeXBlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIE9EYXRhVXRpbHMuZm9ybWF0TGl0ZXJhbChvVmFsdWUsIHNFZG1UeXBlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKChhUmVzb2x2ZWRQYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG9QYXJzZWRFeHByZXNzaW9uLmZvcm1hdHRlclxuXHRcdFx0XHRcdFx0PyBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXIuYXBwbHkodGhpcywgYVJlc29sdmVkUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogYVJlc29sdmVkUGFyYW1ldGVycy5qb2luKFwiXCIpO1xuXHRcdFx0XHRcdHJldHVybiB7IGtleTogc1BhcmFtZXRlcktleSwgdmFsdWU6IHZhbHVlIH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9QYXJhbWV0ZXJzUHJvbWlzZSA9IFByb21pc2UuYWxsKGFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKFxuXHRcdFx0XHRhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJzOiB7IGtleTogYW55OyB2YWx1ZTogYW55IH1bXVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbWV0ZXJzOiBhbnkgPSB7fTtcblx0XHRcdFx0YUFsbFJlc29sdmVkUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uKG9SZXNvbHZlZFBhcmFtZXRlcjogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9KSB7XG5cdFx0XHRcdFx0b1BhcmFtZXRlcnNbb1Jlc29sdmVkUGFyYW1ldGVyLmtleV0gPSBvUmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlcnM7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIG5hdmlnYXRpb24gdG8gcm91dGUgXCIgKyBzVGFyZ2V0Um91dGUpO1xuXHRcdFx0b1BhcmFtZXRlcnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyYW1ldGVyc1Byb21pc2U7XG5cdH1cblxuXHRfZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgbVBhcmFtZXRlcnMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBtUGFyYW1ldGVycyk7XG5cblx0XHRFZGl0U3RhdGUuY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUoKTsgLy8gUmVzZXQgVUkgc3RhdGUgd2hlbiBhbGwgYmluZGluZ3MgaGF2ZSBiZWVuIHJlZnJlc2hlZFxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgbWFwIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZV0gTmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgd2l0aG91dCBjaGFuZ2luZyB0aGUgVVJMXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gW21QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dF0gVGhlIGNvbnRleHQgaXMgY3JlYXRlZCBhc3luYywgbmF2aWdhdGUgdG8gKC4uLikgYW5kXG5cdCAqICAgICAgICAgICAgICAgICAgICB3YWl0IGZvciBQcm9taXNlIHRvIGJlIHJlc29sdmVkIGFuZCB0aGVuIG5hdmlnYXRlIGludG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dF0gVGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBkZWZlcnJlZCBhdCB0aGUgdGFyZ2V0IHBhZ2Vcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuZWRpdGFibGVdIFRoZSB0YXJnZXQgcGFnZSBzaGFsbCBiZSBpbW1lZGlhdGVseSBpbiB0aGUgZWRpdCBtb2RlIHRvIGF2b2lkIGZsaWNrZXJpbmdcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbF0gVGhlIGJQZXJzaXN0T1BTY3JvbGwgd2lsbCBiZSB1c2VkIGZvciBzY3JvbGxpbmcgdG8gZmlyc3QgdGFiXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWxdIGArMWAgaWYgd2UgYWRkIGEgY29sdW1uIGluIEZDTCwgYC0xYCB0byByZW1vdmUgYSBjb2x1bW4sIDAgdG8gc3RheSBvbiB0aGUgc2FtZSBjb2x1bW5cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZV0gRG8gbmF2aWdhdGlvbiB3aXRob3V0IHRha2luZyBpbnRvIGFjY291bnQgdGhlIHByZXNlcnZlZCBjYWNoZSBtZWNoYW5pc21cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlJlY3JlYXRlQ29udGV4dF0gRm9yY2UgcmUtY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXNdIEZvcmNlcyBmb2N1cyBzZWxlY3Rpb24gYWZ0ZXIgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29WaWV3RGF0YV0gVmlldyBkYXRhXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0N1cnJlbnRUYXJnZXRJbmZvXSBUaGUgdGFyZ2V0IGluZm9ybWF0aW9uIGZyb20gd2hpY2ggdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Db250ZXh0KFxuXHRcdG9Db250ZXh0OiBhbnksXG5cdFx0bVBhcmFtZXRlcnM6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0YXN5bmNDb250ZXh0PzogUHJvbWlzZTxhbnk+O1xuXHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGVkaXRhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0cmFuc2llbnQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsPzogbnVtYmVyO1xuXHRcdFx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJSZWNyZWF0ZUNvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0YXJnZXRQYXRoPzogc3RyaW5nO1xuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cdFx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YTogYW55IHwgdW5kZWZpbmVkLFxuXHRcdG9DdXJyZW50VGFyZ2V0SW5mbzogYW55IHwgdW5kZWZpbmVkXG5cdCkge1xuXHRcdGxldCBzVGFyZ2V0Um91dGU6IHN0cmluZyA9IFwiXCIsXG5cdFx0XHRvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSxcblx0XHRcdGJJc1N0aWNreU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpICYmIG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKSB7XG5cdFx0XHRiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0XHQvLyBNYW5hZ2UgcGFyYW1ldGVyIG1hcHBpbmdcblx0XHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMudGFyZ2V0UGF0aCAmJiBvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLm5hdmlnYXRpb24pIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZURldGFpbCA9IG9WaWV3RGF0YS5uYXZpZ2F0aW9uW21QYXJhbWV0ZXJzLnRhcmdldFBhdGhdLmRldGFpbDtcblx0XHRcdHNUYXJnZXRSb3V0ZSA9IG9Sb3V0ZURldGFpbC5yb3V0ZTtcblxuXHRcdFx0aWYgKG9Sb3V0ZURldGFpbC5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlID0gdGhpcy5wcmVwYXJlUGFyYW1ldGVycyhvUm91dGVEZXRhaWwucGFyYW1ldGVycywgc1RhcmdldFJvdXRlLCBvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNUYXJnZXRQYXRoID0gdGhpcy5fZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gSWYgdGhlIHBhdGggaXMgZW1wdHksIHdlJ3JlIHN1cHBvc2VkIHRvIG5hdmlnYXRlIHRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBhcHBcblx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGV4aXQgZnJvbSB0aGUgYXBwIGluc3RlYWRcblx0XHRpZiAoc1RhcmdldFBhdGgubGVuZ3RoID09PSAwICYmIHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5LmV4aXRGcm9tQXBwKCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgZGVmZXJyZWQgb3IgYXN5bmMsIHdlIGFkZCAoLi4uKSB0byB0aGUgcGF0aFxuXHRcdGlmIChtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0IHx8IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiguLi4pXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGxheW91dCBwYXJhbWV0ZXIgaWYgbmVlZGVkXG5cdFx0Y29uc3Qgc0xheW91dCA9IHRoaXMuX2NhbGN1bGF0ZUxheW91dChzVGFyZ2V0UGF0aCwgbVBhcmFtZXRlcnMpO1xuXHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIj9sYXlvdXQ9XCIgKyBzTGF5b3V0O1xuXHRcdH1cblxuXHRcdC8vIE5hdmlnYXRpb24gcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2Vcblx0XHRjb25zdCBvTmF2aWdhdGlvbkluZm8gPSB7XG5cdFx0XHRvQXN5bmNDb250ZXh0OiBtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0LFxuXHRcdFx0YkRlZmVycmVkQ29udGV4dDogbVBhcmFtZXRlcnM/LmJEZWZlcnJlZENvbnRleHQsXG5cdFx0XHRiVGFyZ2V0RWRpdGFibGU6IG1QYXJhbWV0ZXJzPy5lZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzPy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0dXNlQ29udGV4dDogbVBhcmFtZXRlcnM/LnVwZGF0ZUZDTExldmVsID09PSAtMSB8fCBtUGFyYW1ldGVycz8uYlJlY3JlYXRlQ29udGV4dCA/IHVuZGVmaW5lZCA6IG9Db250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogbVBhcmFtZXRlcnM/LmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRiU2hvd1BsYWNlaG9sZGVyOiBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyIDogdHJ1ZVxuXHRcdH07XG5cblx0XHRpZiAobVBhcmFtZXRlcnM/LmNoZWNrTm9IYXNoQ2hhbmdlKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbmV3IGhhc2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2hOb0FwcFN0YXRlID0gdGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpLnJlcGxhY2UoL1smP117MX1zYXAtaWFwcC1zdGF0ZT1bQS1aMC05XSsvLCBcIlwiKTtcblx0XHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gc0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSkge1xuXHRcdFx0XHQvLyBUaGUgaGFzaCBkb2Vzbid0IGNoYW5nZSwgYnV0IHdlIGZpcmUgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgdG8gdHJpZ2dlciBwYWdlIHJlZnJlc2ggLyBiaW5kaW5nXG5cdFx0XHRcdGNvbnN0IG1FdmVudFBhcmFtZXRlcnM6IGFueSA9IHRoaXMub1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2godGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpKTtcblx0XHRcdFx0aWYgKG1FdmVudFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gb05hdmlnYXRpb25JbmZvO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMudmlld3MgPSB0aGlzLmFDdXJyZW50Vmlld3M7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5zZXRGb2N1c0ZvcmNlZCghIW1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzKTtcblxuXHRcdFx0XHR0aGlzLl9maXJlUm91dGVNYXRjaEV2ZW50cyhtRXZlbnRQYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy50cmFuc2llbnQgJiYgbVBhcmFtZXRlcnMuZWRpdGFibGUgPT0gdHJ1ZSAmJiBzVGFyZ2V0UGF0aC5pbmRleE9mKFwiKC4uLilcIikgPT09IC0xKSB7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGguaW5kZXhPZihcIj9cIikgPiAtMSkge1xuXHRcdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiZpLWFjdGlvbj1jcmVhdGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2ktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsZWFyIHVuYm91bmQgbWVzc2FnZXMgdXBvbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1Bcblx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSBzdGFsZSBlcnJvciBtZXNzYWdlcyBmcm9tIExSIGFyZSBub3Qgc2hvd24gdG8gdGhlIHVzZXIgYWZ0ZXIgbmF2aWdhdGlvbiB0byBPUC5cblx0XHRpZiAob0N1cnJlbnRUYXJnZXRJbmZvICYmIG9DdXJyZW50VGFyZ2V0SW5mby5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRjb25zdCBvUm91dGVJbmZvID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzVGFyZ2V0UGF0aCk7XG5cdFx0XHRpZiAob1JvdXRlSW5mbykge1xuXHRcdFx0XHRjb25zdCBvUm91dGUgPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKG9Sb3V0ZUluZm8ubmFtZSk7XG5cdFx0XHRcdGlmIChvUm91dGUgJiYgb1JvdXRlLnRhcmdldHMgJiYgb1JvdXRlLnRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IHNMYXN0VGFyZ2V0TmFtZSA9IG9Sb3V0ZS50YXJnZXRzW29Sb3V0ZS50YXJnZXRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzTGFzdFRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQubmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2VcIikge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgcXVldWVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucHVzaChvTmF2aWdhdGlvbkluZm8pO1xuXG5cdFx0aWYgKHNUYXJnZXRSb3V0ZSAmJiBvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLnRoZW4oKG9Sb3V0ZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUgPSBiSXNTdGlja3lNb2RlO1xuXHRcdFx0XHR0aGlzLm9Sb3V0ZXIubmF2VG8oc1RhcmdldFJvdXRlLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHQubmF2VG9IYXNoKHNUYXJnZXRQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnM/Lm5vUHJlc2VydmF0aW9uQ2FjaGUsIG1QYXJhbWV0ZXJzPy5iRm9yY2VGb2N1cywgIWJJc1N0aWNreU1vZGUpXG5cdFx0XHQudGhlbigoYk5hdmlnYXRlZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICghYk5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdC8vIFRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuIC0tPiByZW1vdmUgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBxdWV1ZSBhcyB0aGV5IHNob3VsZG4ndCBiZSB1c2VkXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmcjbmF2aWdhdGVUb1JvdXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Sb3V0aW5nXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzVGFyZ2V0Um91dGVOYW1lXSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvUm91dGVQYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0bmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWU6IHN0cmluZywgb1JvdXRlUGFyYW1ldGVyczogYW55IHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3Qgc1RhcmdldFVSTCA9IHRoaXMub1JvdXRlci5nZXRVUkwoc1RhcmdldFJvdXRlTmFtZSwgb1JvdXRlUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5Lm5hdlRvSGFzaChzVGFyZ2V0VVJMLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAhb1JvdXRlUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIG9yIGBmYWxzZWAgaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW1wYWN0ZWQgb3Igbm90XG5cdCAqL1xuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIHdpdGggdGhlIHRlY2huaWNhbCBwYXRoLiBXZSBoYXZlIHRvIHRyeSBpdCwgYmVjYXVzZSBmb3IgbGV2ZWwgPiAxLCB3ZVxuXHRcdC8vIHVzZXMgdGVjaG5pY2FsIGtleXMgZXZlbiBpZiBTZW1hbnRpYyBrZXlzIGFyZSBlbmFibGVkXG5cdFx0aWYgKHRoaXMub1JvdXRlclByb3h5LmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzUGF0aCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoL15bXlxcKFxcKV0rXFwoW15cXChcXCldK1xcKSQvLnRlc3Qoc1BhdGgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCBwYXRoIGNhbiBiZSBzZW1hbnRpYyAoaS5lLiBpcyBsaWtlIHh4eCh5eXkpKVxuXHRcdFx0Ly8gY2hlY2sgd2l0aCB0aGUgc2VtYW50aWMgcGF0aCBpZiB3ZSBjYW4gZmluZCBpdFxuXHRcdFx0bGV0IHNTZW1hbnRpY1BhdGg7XG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGhhdmUgYWxyZWFkeSByZXNvbHZlZCB0aGlzIHNlbWFudGljIHBhdGhcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzU2VtYW50aWNQYXRoICE9IHNQYXRoID8gdGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNTZW1hbnRpY1BhdGgpIDogZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoOiBhbnkpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0c1BhdGggPSBzUGF0aC5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcblx0XHRpZiAodGhpcy5vUm91dGVyLm1hdGNoKHNQYXRoKSB8fCBzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblx0XHR9XG5cdH1cblxuXHRfY2hlY2tDb250ZXh0Rm9yU2VtYW50aWNQYXRoKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblxuXHRcdC8vIEZpcnN0LCBjaGVjayBpZiB0aGlzIGlzIGEgbGV2ZWwtMSBvYmplY3QgKHBhdGggPSAvYWFhKGJiYikpXG5cdFx0aWYgKCEvXlxcL1teXFwoXStcXChbXlxcKV0rXFwpJC8udGVzdChzUGF0aCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBUaGVuIGNoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIHNlbWFudGljIGtleXNcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdGlmICghU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgdGhlIGVudGl0eSBpcyBkcmFmdC1lbmFibGVkXG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgc1BhdGgpO1xuXHR9XG5cblx0X2dldFBhdGhGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IHNQYXRoO1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpICYmIG9Db250ZXh0LmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPT09IC0xKSB7XG5cdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgYmFjayBmcm9tIGEgY29udGV4dCwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoXG5cdFx0XHRzUGF0aCA9IHRoaXMuX2ZpbmRQYXRoVG9OYXZpZ2F0ZShzUGF0aCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHdlJ3JlIG5hdmlnYXRpbmcgYmFjayB0byBhIHNlbWFudGljIHBhdGggdGhhdCB3YXMgcHJldmlvdXNseSByZXNvbHZlZFxuXHRcdFx0aWYgKHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcgJiYgdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID09PSBzUGF0aCkge1xuXHRcdFx0XHRzUGF0aCA9IHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcy5fY2hlY2tDb250ZXh0Rm9yU2VtYW50aWNQYXRoKG9Db250ZXh0KSkge1xuXHRcdFx0Ly8gV2UgY2hlY2sgaWYgd2UgaGF2ZSB0byB1c2UgYSBzZW1hbnRpYyBwYXRoXG5cdFx0XHRjb25zdCBzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblxuXHRcdFx0aWYgKCFzU2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIHdlcmUgbm90IGFibGUgdG8gYnVpbGQgdGhlIHNlbWFudGljIHBhdGggLS0+IFVzZSB0aGUgdGVjaG5pY2FsIHBhdGggYW5kXG5cdFx0XHRcdC8vIGNsZWFyIHRoZSBwcmV2aW91cyBtYXBwaW5nLCBvdGhlcndpc2UgdGhlIG9sZCBtYXBwaW5nIGlzIHVzZWQgaW4gRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0XHRcdFx0Ly8gYW5kIGl0IGxlYWRzIHRvIHVud2FudGVkIHBhZ2UgcmVsb2Fkc1xuXHRcdFx0XHR0aGlzLnNldExhc3RTZW1hbnRpY01hcHBpbmcodW5kZWZpbmVkKTtcblx0XHRcdH0gZWxzZSBpZiAoc1NlbWFudGljUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gU3RvcmUgdGhlIG1hcHBpbmcgdGVjaG5pY2FsIDwtPiBzZW1hbnRpYyBwYXRoIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgaXQgbGF0ZXJcblx0XHRcdFx0Ly8gYW5kIHVzZSB0aGUgc2VtYW50aWMgcGF0aCBpbnN0ZWFkIG9mIHRoZSB0ZWNobmljYWwgb25lXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdHNQYXRoID0gc1NlbWFudGljUGF0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgZXh0cmEgJy8nIGF0IHRoZSBiZWdpbm5pbmcgb2YgcGF0aFxuXHRcdGlmIChzUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzUGF0aDtcblx0fVxuXG5cdF9jYWxjdWxhdGVMYXlvdXQoc1BhdGg6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBGQ0xMZXZlbCA9IG1QYXJhbWV0ZXJzLkZDTExldmVsO1xuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCkge1xuXHRcdFx0RkNMTGV2ZWwgKz0gbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWw7XG5cdFx0XHRpZiAoRkNMTGV2ZWwgPCAwKSB7XG5cdFx0XHRcdEZDTExldmVsID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmNhbGN1bGF0ZUxheW91dChGQ0xMZXZlbCwgc1BhdGgsIG1QYXJhbWV0ZXJzLnNMYXlvdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgYmVmb3JlIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogRGlzcGxheXMgYSBidXN5IGluZGljYXRvci5cblx0ICpcblx0ICovXG5cdF9iZWZvcmVSb3V0ZU1hdGNoZWQoLypvRXZlbnQ6IEV2ZW50Ki8pIHtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdGNvbnN0IG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEhpZGVzIHRoZSBidXN5IGluZGljYXRvciBhbmQgZmlyZXMgaXRzIG93biAncm91dGVtYXRjaGVkJyBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBUaGUgZXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlSGFuZGxlciA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRBcHBTdGF0ZUhhbmRsZXIoKSxcblx0XHRcdG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Sb290VmlldykgJiYgIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpO1xuXHRcdGlmICh0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUubGVuZ3RoKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZVswXTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5zbGljZSgxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMubmF2aWdhdGlvbkluZm8gPSB7fTtcblx0XHR9XG5cdFx0aWYgKG9BcHBTdGF0ZUhhbmRsZXIuY2hlY2tJZlJvdXRlQ2hhbmdlZEJ5SUFwcCgpKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mby5iUmVhc29uSXNJYXBwU3RhdGUgPSB0cnVlO1xuXHRcdFx0b0FwcFN0YXRlSGFuZGxlci5yZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmFtZVwiKTtcblx0XHR0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuID0gbVBhcmFtZXRlcnMuY29uZmlnLnBhdHRlcm47XG5cdFx0dGhpcy5hQ3VycmVudFZpZXdzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpO1xuXG5cdFx0bVBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0bVBhcmFtZXRlcnMucm91dGVQYXR0ZXJuID0gdGhpcy5zQ3VycmVudFJvdXRlUGF0dGVybjtcblxuXHRcdHRoaXMuX2ZpcmVSb3V0ZU1hdGNoRXZlbnRzKG1QYXJhbWV0ZXJzKTtcblxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgaGFzaCBoYXMgYmVlbiBzZXQgYnkgdGhlIHJvdXRlclByb3h5Lm5hdlRvSGFzaCBmdW5jdGlvblxuXHRcdC8vIElmIG5vdCwgcmVidWlsZCBoaXN0b3J5IHByb3Blcmx5IChib3RoIGluIHRoZSBicm93c2VyIGFuZCB0aGUgUm91dGVyUHJveHkpXG5cdFx0aWYgKCFoaXN0b3J5LnN0YXRlIHx8IGhpc3Rvcnkuc3RhdGUuZmVMZXZlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eVxuXHRcdFx0XHQucmVzdG9yZUhpc3RvcnkoKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUm91dGVyUHJveHkucmVzb2x2ZVJvdXRlTWF0Y2goKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzdG9yaW5nIGhpc3RvcnlcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5LnJlc29sdmVSb3V0ZU1hdGNoKCk7XG5cdFx0fVxuXHR9XG5cblx0YXR0YWNoUm91dGVNYXRjaGVkKG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0ZGV0YWNoUm91dGVNYXRjaGVkKGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZChvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KFwiYWZ0ZXJSb3V0ZU1hdGNoZWRcIiwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0ZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoZm5GdW5jdGlvbjogYW55LCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChcImFmdGVyUm91dGVNYXRjaGVkXCIsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblxuXHRnZXRSb3V0ZUZyb21IYXNoKG9Sb3V0ZXI6IGFueSwgb0FwcENvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSBvUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuaGFzaDtcblx0XHRjb25zdCBvUm91dGVJbmZvID0gb1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2goc0hhc2gpO1xuXHRcdHJldHVybiBvQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0TWV0YWRhdGEoKVxuXHRcdFx0LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb3V0aW5nL3JvdXRlc1wiKVxuXHRcdFx0LmZpbHRlcihmdW5jdGlvbihvUm91dGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1JvdXRlLm5hbWUgPT09IG9Sb3V0ZUluZm8ubmFtZTtcblx0XHRcdH0pWzBdO1xuXHR9XG5cdGdldFRhcmdldHNGcm9tUm91dGUob1JvdXRlOiBhbnkpIHtcblx0XHRjb25zdCBvVGFyZ2V0ID0gb1JvdXRlLnRhcmdldDtcblx0XHRpZiAodHlwZW9mIG9UYXJnZXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBbdGhpcy5fbVRhcmdldHNbb1RhcmdldF1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0OiBhbnlbXSA9IFtdO1xuXHRcdFx0b1RhcmdldC5mb3JFYWNoKChzVGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0YVRhcmdldC5wdXNoKHRoaXMuX21UYXJnZXRzW3NUYXJnZXRdKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFUYXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0aW5pdGlhbGl6ZVJvdXRpbmcoKSB7XG5cdFx0Ly8gQXR0YWNoIHJvdXRlciBoYW5kbGVyc1xuXHRcdHRoaXMuX2ZuT25Sb3V0ZU1hdGNoZWQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMub1JvdXRlci5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5PblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKCFiUGxhY2Vob2xkZXJFbmFibGVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIuYXR0YWNoQmVmb3JlUm91dGVNYXRjaGVkKHRoaXMuX2JlZm9yZVJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0Ly8gUmVzZXQgaW50ZXJuYWwgc3RhdGVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUgPSBbXTtcblx0XHRFZGl0U3RhdGUucmVzZXRFZGl0U3RhdGUoKTtcblx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSAhdGhpcy5vUm91dGVyLm1hdGNoKFwiXCIpO1xuXG5cdFx0Y29uc3QgYklzSWFwcFN0YXRlID1cblx0XHRcdHRoaXMub1JvdXRlclxuXHRcdFx0XHQuZ2V0SGFzaENoYW5nZXIoKVxuXHRcdFx0XHQuZ2V0SGFzaCgpXG5cdFx0XHRcdC5pbmRleE9mKFwic2FwLWlhcHAtc3RhdGVcIikgIT09IC0xO1xuXHRcdGNvbnN0IGluaXRQcm9taXNlID0gdGhpcy5vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U3RhcnR1cFBhcmFtZXRlcnMoKVxuXHRcdFx0LnRoZW4oKG9TdGFydHVwUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGJIYXNTdGFydFVwUGFyYW1ldGVycyA9IG9TdGFydHVwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKG9TdGFydHVwUGFyYW1ldGVycykubGVuZ3RoICE9PSAwO1xuXHRcdFx0XHRjb25zdCBzSGFzaCA9IHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKTtcblx0XHRcdFx0Ly8gTWFuYWdlIHN0YXJ0dXAgcGFyYW1ldGVycyAoaW4gY2FzZSBvZiBubyBpYXBwLXN0YXRlKVxuXHRcdFx0XHRpZiAoIWJJc0lhcHBTdGF0ZSAmJiBiSGFzU3RhcnRVcFBhcmFtZXRlcnMgJiYgIXNIYXNoKSB7XG5cdFx0XHRcdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdLmluZGV4T2YoXCJjcmVhdGVcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgbW9kZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX21hbmFnZUNyZWF0ZVN0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRGVlcCBsaW5rXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fbWFuYWdlRGVlcExpbmtTdGFydHVwKG9TdGFydHVwUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyByb3V0aW5nIGluaXRpYWxpemF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBpbml0UHJvbWlzZTtcblx0fVxuXG5cdGdldERlZmF1bHRDcmVhdGVIYXNoKG9TdGFydHVwUGFyYW1ldGVyczogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0dGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KClbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9EZWVwTGluay5jb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRpbmdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|
|
965
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJldmVudCIsIkV2ZW50UHJvdmlkZXIiLCJSb3V0aW5nU2VydmljZSIsIm5hdmlnYXRpb25JbmZvUXVldWUiLCJpbml0Iiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwic2NvcGVUeXBlIiwib0FwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiZXZlbnRQcm92aWRlciIsIm9Sb3V0aW5nQ29uZmlnIiwiZ2V0TWFuaWZlc3RFbnRyeSIsIm9Sb290Vmlld0NvbmZpZyIsIl9wYXJzZVJvdXRpbmdDb25maWd1cmF0aW9uIiwib0FwcENvbmZpZyIsIm91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJiZWZvcmVFeGl0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuT25Sb3V0ZU1hdGNoZWQiLCJmaXJlRXZlbnQiLCJleGl0IiwiZGVzdHJveSIsImlzRkNMIiwidmlld05hbWUiLCJfbVRhcmdldHMiLCJPYmplY3QiLCJrZXlzIiwidGFyZ2V0cyIsImZvckVhY2giLCJzVGFyZ2V0TmFtZSIsImFzc2lnbiIsInRhcmdldE5hbWUiLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInZpZXdMZXZlbCIsIl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybiIsIl9tUm91dGVzIiwic1JvdXRlS2V5Iiwicm91dGVzIiwib1JvdXRlTWFuaWZlc3RJbmZvIiwiYVJvdXRlVGFyZ2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInNSb3V0ZU5hbWUiLCJuYW1lIiwic1JvdXRlUGF0dGVybiIsInBhdHRlcm4iLCJsZW5ndGgiLCJpbmRleE9mIiwiTG9nIiwid2FybmluZyIsImlSb3V0ZUxldmVsIiwicm91dGVMZXZlbCIsImkiLCJzUGFyZW50VGFyZ2V0TmFtZSIsInBhcmVudCIsInB1c2giLCJGQ0xMZXZlbCIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImFMZXZlbDBSb3V0ZU5hbWVzIiwiYUxldmVsMVJvdXRlTmFtZXMiLCJzRGVmYXVsdFJvdXRlTmFtZSIsInNOYW1lIiwiaUxldmVsIiwic0RlZmF1bHRUYXJnZXROYW1lIiwic2xpY2UiLCJzQ29udGV4dFBhdGgiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJvU2V0dGluZ3MiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1hcCIsInNUYXJnZXRLZXkiLCJzb3J0IiwiYSIsImIiLCJmdWxsQ29udGV4dFBhdGgiLCJuYXZpZ2F0aW9uIiwic05hdk5hbWUiLCJ0YXJnZXRSb3V0ZSIsImRldGFpbCIsInJvdXRlIiwic3RhcnRzV2l0aCIsInNQYXR0ZXJuIiwicmVwbGFjZSIsInJlZ2V4IiwiUmVnRXhwIiwibWF0Y2giLCJfZ2V0Um91dGVJbmZvcm1hdGlvbiIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIl9nZXRDb21wb25lbnRJZCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvQ29tcG9uZW50SW5zdGFuY2UiLCJzVGFyZ2V0Q29tcG9uZW50SWQiLCJfc093bmVySWQiLCJnZXRJZCIsInNDb3JyZWN0VGFyZ2V0TmFtZSIsImlkIiwidmlld0lkIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9NYXBwaW5nIiwibmF2aWdhdGVUbyIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwiYlByZXNlcnZlSGlzdG9yeSIsInNUYXJnZXRVUkxQcm9taXNlIiwiYklzU3RpY2t5TW9kZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY1BhdGgiLCJwcmVwYXJlUGFyYW1ldGVycyIsInRoZW4iLCJtUGFyYW1ldGVycyIsImdldFVSTCIsInNUYXJnZXRVUkwiLCJuYXZUb0hhc2giLCJzVGFyZ2V0Um91dGUiLCJvUGFyYW1ldGVyc1Byb21pc2UiLCJnZXRQYXRoIiwiYUNvbnRleHRQYXRoUGFydHMiLCJzcGxpdCIsImFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwic1BhcmFtZXRlcktleSIsInNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbiIsIm9QYXJzZWRFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhUGFydHMiLCJwYXJ0cyIsImFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwib1BhdGhQYXJ0IiwiYVJlbGF0aXZlUGFydHMiLCJwYXRoIiwiYUxvY2FsUGFydHMiLCJzUHJvcGVydHlQYXRoIiwiam9pbiIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5Iiwib1ZhbHVlIiwib1Byb3BlcnR5SW5mbyIsImdldE9iamVjdCIsInNFZG1UeXBlIiwiJFR5cGUiLCJPRGF0YVV0aWxzIiwiZm9ybWF0TGl0ZXJhbCIsImFsbCIsImFSZXNvbHZlZFBhcmFtZXRlcnMiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImFwcGx5Iiwia2V5IiwiYUFsbFJlc29sdmVkUGFyYW1ldGVycyIsIm9QYXJhbWV0ZXJzIiwib1Jlc29sdmVkUGFyYW1ldGVyIiwib0Vycm9yIiwiZXJyb3IiLCJfZmlyZVJvdXRlTWF0Y2hFdmVudHMiLCJFZGl0U3RhdGUiLCJjbGVhblByb2Nlc3NlZEVkaXRTdGF0ZSIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib1ZpZXdEYXRhIiwib0N1cnJlbnRUYXJnZXRJbmZvIiwib1JvdXRlUGFyYW1ldGVyc1Byb21pc2UiLCJ0YXJnZXRQYXRoIiwib1JvdXRlRGV0YWlsIiwicGFyYW1ldGVycyIsInNUYXJnZXRQYXRoIiwiX2dldFBhdGhGcm9tQ29udGV4dCIsImJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QiLCJleGl0RnJvbUFwcCIsImFzeW5jQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJzTGF5b3V0IiwiX2NhbGN1bGF0ZUxheW91dCIsIm9OYXZpZ2F0aW9uSW5mbyIsIm9Bc3luY0NvbnRleHQiLCJiVGFyZ2V0RWRpdGFibGUiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1c2VDb250ZXh0IiwidXBkYXRlRkNMTGV2ZWwiLCJiUmVjcmVhdGVDb250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsImJTaG93UGxhY2Vob2xkZXIiLCJzaG93UGxhY2Vob2xkZXIiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJjaGVja05vSGFzaENoYW5nZSIsInNDdXJyZW50SGFzaE5vQXBwU3RhdGUiLCJnZXRIYXNoIiwibUV2ZW50UGFyYW1ldGVycyIsImdldFJvdXRlSW5mb0J5SGFzaCIsIm5hdmlnYXRpb25JbmZvIiwicm91dGVJbmZvcm1hdGlvbiIsInNDdXJyZW50Um91dGVOYW1lIiwicm91dGVQYXR0ZXJuIiwic0N1cnJlbnRSb3V0ZVBhdHRlcm4iLCJ2aWV3cyIsImFDdXJyZW50Vmlld3MiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZUZvY3VzIiwidHJhbnNpZW50Iiwib1JvdXRlSW5mbyIsIm9Sb3V0ZSIsInNMYXN0VGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwib1JvdXRlUGFyYW1ldGVycyIsIm5hdlRvIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJOYXZpZ2F0ZWQiLCJwb3AiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic1BhdGgiLCJ0ZXN0Iiwic1NlbWFudGljUGF0aCIsInRlY2huaWNhbFBhdGgiLCJzZW1hbnRpY1BhdGgiLCJfZmluZFBhdGhUb05hdmlnYXRlIiwiX2NoZWNrQ29udGV4dEZvclNlbWFudGljUGF0aCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNEcmFmdFN1cHBvcnRlZCIsImlzQSIsImlzUmVsYXRpdmUiLCJnZXRIZWFkZXJDb250ZXh0Iiwic3Vic3RyaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY2FsY3VsYXRlTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJfYmVmb3JlUm91dGVNYXRjaGVkIiwiYlBsYWNlaG9sZGVyRW5hYmxlZCIsIlBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX29uUm91dGVNYXRjaGVkIiwib0V2ZW50Iiwib0FwcFN0YXRlSGFuZGxlciIsImdldEFwcFN0YXRlSGFuZGxlciIsImlzTG9ja2VkIiwidW5sb2NrIiwiZ2V0UGFyYW1ldGVycyIsImNoZWNrSWZSb3V0ZUNoYW5nZWRCeUlBcHAiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJyZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCIsImdldFBhcmFtZXRlciIsImNvbmZpZyIsImhpc3RvcnkiLCJzdGF0ZSIsImZlTGV2ZWwiLCJyZXN0b3JlSGlzdG9yeSIsInJlc29sdmVSb3V0ZU1hdGNoIiwiY2F0Y2giLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImRldGFjaEV2ZW50IiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImdldFJvdXRlRnJvbUhhc2giLCJzSGFzaCIsImdldEhhc2hDaGFuZ2VyIiwiaGFzaCIsImdldE1ldGFkYXRhIiwiZmlsdGVyIiwiZ2V0VGFyZ2V0c0Zyb21Sb3V0ZSIsImFUYXJnZXQiLCJzVGFyZ2V0IiwiaW5pdGlhbGl6ZVJvdXRpbmciLCJiaW5kIiwiYXR0YWNoQmVmb3JlUm91dGVNYXRjaGVkIiwicmVzZXRFZGl0U3RhdGUiLCJiSXNJYXBwU3RhdGUiLCJnZXRTdGFydHVwUGFyYW1ldGVycyIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJIYXNTdGFydFVwUGFyYW1ldGVycyIsInByZWZlcnJlZE1vZGUiLCJfbWFuYWdlQ3JlYXRlU3RhcnR1cCIsIl9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAiLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsIkFwcFN0YXJ0dXBIZWxwZXIiLCJnZXRDb250ZXh0UGF0aCIsImdldENyZWF0ZVN0YXJ0dXBIYXNoIiwic05ld0hhc2giLCJyZXBsYWNlSGFzaCIsImdldERlZXBMaW5rU3RhcnR1cEhhc2giLCJnZXRNYW5pZmVzdCIsInJvdXRpbmciLCJvRGVlcExpbmsiLCJjb250ZXh0Iiwic1RlY2huaWNhbFBhdGgiLCJnZXRPdXRib3VuZHMiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiUm91dGluZ1NlcnZpY2VGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJvU2VydmljZUNvbnRleHQiLCJvUm91dGluZ1NlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXNCTUEsc0IsV0FETEMsY0FBYyxDQUFDLDZDQUFELEMsVUFFYkMsS0FBSyxFLFVBRUxBLEtBQUssRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFIOEJDLGE7Ozs7Ozs7Ozs7OztNQVd4QkMsYzs7Ozs7Ozs7Ozs7YUFnQlpDLG1CLEdBQTZCLEU7Ozs7Ozs7V0FHN0JDLEksR0FBQSxnQkFBTztBQUNOLFVBQU1DLFFBQVEsR0FBRyxLQUFLQyxVQUFMLEVBQWpCOztBQUNBLFVBQUlELFFBQVEsQ0FBQ0UsU0FBVCxLQUF1QixXQUEzQixFQUF3QztBQUN2QyxhQUFLQyxhQUFMLEdBQXFCSCxRQUFRLENBQUNJLFdBQTlCO0FBQ0EsYUFBS0MsTUFB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QUFLLEdBQUc0QixTQUFTLENBQUMxQixJQUFsQjtBQUNBOztBQUVELFlBQUlGLEtBQUosRUFBVztBQUNWO0FBQ0MsVUFBQSxPQUFJLENBQUNsUixPQUFMLENBQWFtUixjQUFiLEdBQThCdUIsV0FBL0IsQ0FBbUR4QixLQUFuRDtBQUNBO0FBQ0QsT0F6Qk0sQ0FBUDtBQTBCQSxLOztXQUVEK0IsWSxHQUFBLHdCQUFlO0FBQ2QsYUFBTyxLQUFLdlMsU0FBWjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDNlIsYyxHQUFBLDBCQUFpQjtBQUNoQixhQUFPLEtBQUtyTyxZQUFaO0FBQ0EsSzs7V0FDRGdQLFksR0FBQSx3QkFBb0I7QUFDbkIsYUFBTyxJQUFQO0FBQ0EsSzs7O0lBNzFCa0NDLE87Ozs7TUFnMkI5QkMscUI7Ozs7Ozs7OztZQUNMQyxjLEdBQUEsd0JBQWVDLGVBQWYsRUFBd0U7QUFDdkUsVUFBTUMsZUFBZSxHQUFHLElBQUluVSxjQUFKLENBQW1Ca1UsZUFBbkIsQ0FBeEI7QUFDQSxhQUFPQyxlQUFlLENBQUMzUyxXQUF2QjtBQUNBLEs7OztJQUprQzRTLGM7O1NBT3JCSixxQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvQnVzeUxvY2tlclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IEFwcFN0YXJ0dXBIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQXBwU3RhcnR1cEhlbHBlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvUm91dGVyUHJveHlcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgRXZlbnRQcm92aWRlciBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRQcm92aWRlclwiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFVdGlscyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhVXRpbHNcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xudHlwZSBSb3V0aW5nU2VydmljZVNldHRpbmdzID0ge307XG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5Sb3V0aW5nU2VydmljZUV2ZW50aW5nXCIpXG5jbGFzcyBSb3V0aW5nU2VydmljZUV2ZW50aW5nIGV4dGVuZHMgRXZlbnRQcm92aWRlciB7XG5cdEBldmVudCgpXG5cdHJvdXRlTWF0Y2hlZCE6IEZ1bmN0aW9uO1xuXHRAZXZlbnQoKVxuXHRhZnRlclJvdXRlTWF0Y2hlZCE6IEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBTZW1hbnRpY01hcHBpbmcgPSB7XG5cdHNlbWFudGljUGF0aDogc3RyaW5nO1xuXHR0ZWNobmljYWxQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IGNsYXNzIFJvdXRpbmdTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdG9BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdG9Nb2RlbCE6IE9EYXRhTW9kZWw7XG5cdG9NZXRhTW9kZWwhOiBPRGF0YU1ldGFNb2RlbDtcblx0b1JvdXRlciE6IFJvdXRlcjtcblx0b1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdGV2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0b3V0Ym91bmRzOiBhbnk7XG5cdF9tVGFyZ2V0czogYW55O1xuXHRfbVJvdXRlczogYW55O1xuXHRvTGFzdFNlbWFudGljTWFwcGluZz86IFNlbWFudGljTWFwcGluZztcblx0YkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdD86IGJvb2xlYW47XG5cdHNDdXJyZW50Um91dGVOYW1lPzogc3RyaW5nO1xuXHRzQ3VycmVudFJvdXRlUGF0dGVybj86IHN0cmluZztcblx0YUN1cnJlbnRWaWV3cz86IGFueVtdO1xuXHRuYXZpZ2F0aW9uSW5mb1F1ZXVlOiBhbnlbXSA9IFtdO1xuXHRzQ29udGV4dFBhdGghOiBzdHJpbmc7XG5cdF9mbk9uUm91dGVNYXRjaGVkITogRnVuY3Rpb247XG5cdGluaXQoKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRpZiAob0NvbnRleHQuc2NvcGVUeXBlID09PSBcImNvbXBvbmVudFwiKSB7XG5cdFx0XHR0aGlzLm9BcHBDb21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdDtcblx0XHRcdHRoaXMub01vZGVsID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdHRoaXMub01ldGFNb2RlbCA9IHRoaXMub01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdHRoaXMuZXZlbnRQcm92aWRlciA9IG5ldyAoUm91dGluZ1NlcnZpY2VFdmVudGluZyBhcyBhbnkpKCk7XG5cblx0XHRcdGNvbnN0IG9Sb3V0aW5nQ29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb3V0aW5nXCIpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb290Vmlld1wiKTtcblx0XHRcdHRoaXMuX3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWcsIG9Sb290Vmlld0NvbmZpZyk7XG5cblx0XHRcdGNvbnN0IG9BcHBDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAuYXBwXCIpO1xuXHRcdFx0dGhpcy5vdXRib3VuZHMgPSBvQXBwQ29uZmlnICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uLm91dGJvdW5kcztcblx0XHR9XG5cblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cdGJlZm9yZUV4aXQoKSB7XG5cdFx0dGhpcy5vUm91dGVyLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicm91dGVNYXRjaGVkXCIsIHt9KTtcblx0fVxuXHRleGl0KCkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXN0cm95KCk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgYSBtYW5pZmVzdCByb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIHVzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1JvdXRpbmdDb25maWcgVGhlIHJvdXRpbmcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jvb3RWaWV3Q29uZmlnIFRoZSByb290IHZpZXcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWc6IGFueSwgb1Jvb3RWaWV3Q29uZmlnOiBhbnkpIHtcblx0XHRjb25zdCBpc0ZDTCA9IG9Sb290Vmlld0NvbmZpZyAmJiBvUm9vdFZpZXdDb25maWcudmlld05hbWUgPT09IFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLnZpZXcuRmNsXCI7XG5cblx0XHQvLyBJbmZvcm1hdGlvbiBvZiB0YXJnZXRzXG5cdFx0dGhpcy5fbVRhcmdldHMgPSB7fTtcblx0XHRPYmplY3Qua2V5cyhvUm91dGluZ0NvbmZpZy50YXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0gPSBPYmplY3QuYXNzaWduKHsgdGFyZ2V0TmFtZTogc1RhcmdldE5hbWUgfSwgb1JvdXRpbmdDb25maWcudGFyZ2V0c1tzVGFyZ2V0TmFtZV0pO1xuXG5cdFx0XHQvLyBWaWV3IGxldmVsIGZvciBGQ0wgY2FzZXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSB0YXJnZXQgcGF0dGVyblxuXHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybih0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4sIDApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5mb3JtYXRpb24gb2Ygcm91dGVzXG5cdFx0dGhpcy5fbVJvdXRlcyA9IHt9O1xuXHRcdGZvciAoY29uc3Qgc1JvdXRlS2V5IGluIG9Sb3V0aW5nQ29uZmlnLnJvdXRlcykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlTWFuaWZlc3RJbmZvID0gb1JvdXRpbmdDb25maWcucm91dGVzW3NSb3V0ZUtleV0sXG5cdFx0XHRcdGFSb3V0ZVRhcmdldHMgPSBBcnJheS5pc0FycmF5KG9Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXQpID8gb1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldCA6IFtvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0XSxcblx0XHRcdFx0c1JvdXRlTmFtZSA9IEFycmF5LmlzQXJyYXkob1JvdXRpbmdDb25maWcucm91dGVzKSA/IG9Sb3V0ZU1hbmlmZXN0SW5mby5uYW1lIDogc1JvdXRlS2V5LFxuXHRcdFx0XHRzUm91dGVQYXR0ZXJuID0gb1JvdXRlTWFuaWZlc3RJbmZvLnBhdHRlcm47XG5cblx0XHRcdC8vIENoZWNrIHJvdXRlIHBhdHRlcm46IGFsbCBwYXR0ZXJucyBuZWVkIHRvIGVuZCB3aXRoICc6P3F1ZXJ5OicsIHRoYXQgd2UgdXNlIGZvciBwYXJhbWV0ZXJzXG5cdFx0XHRpZiAoc1JvdXRlUGF0dGVybi5sZW5ndGggPCA4IHx8IHNSb3V0ZVBhdHRlcm4uaW5kZXhPZihcIjo/cXVlcnk6XCIpICE9PSBzUm91dGVQYXR0ZXJuLmxlbmd0aCAtIDgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJQYXR0ZXJuIGZvciByb3V0ZSBcIiArIHNSb3V0ZU5hbWUgKyBcIiBkb2Vzbid0IGVuZCB3aXRoICc6P3F1ZXJ5OicgOiBcIiArIHNSb3V0ZVBhdHRlcm4pO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaVJvdXRlTGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUm91dGVQYXR0ZXJuLCAwKTtcblx0XHRcdHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV0gPSB7XG5cdFx0XHRcdG5hbWU6IHNSb3V0ZU5hbWUsXG5cdFx0XHRcdHBhdHRlcm46IHNSb3V0ZVBhdHRlcm4sXG5cdFx0XHRcdHRhcmdldHM6IGFSb3V0ZVRhcmdldHMsXG5cdFx0XHRcdHJvdXRlTGV2ZWw6IGlSb3V0ZUxldmVsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBBZGQgdGhlIHBhcmVudCB0YXJnZXRzIGluIHRoZSBsaXN0IG9mIHRhcmdldHMgZm9yIHRoZSByb3V0ZVxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUm91dGVUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJlbnRUYXJnZXROYW1lID0gdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1tpXV0ucGFyZW50O1xuXHRcdFx0XHRpZiAoc1BhcmVudFRhcmdldE5hbWUpIHtcblx0XHRcdFx0XHRhUm91dGVUYXJnZXRzLnB1c2goc1BhcmVudFRhcmdldE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNGQ0wpIHtcblx0XHRcdFx0Ly8gVmlldyBsZXZlbCBmb3Igbm9uLUZDTCBjYXNlcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHJvdXRlIHBhdHRlcm5cblx0XHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA8IGlSb3V0ZUxldmVsKSB7XG5cdFx0XHRcdFx0Ly8gVGhlcmUgYXJlIGNhc2VzIHdoZW4gZGlmZmVyZW50IHJvdXRlcyBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuIFdlIHRha2UgdGhlXG5cdFx0XHRcdFx0Ly8gbGFyZ2VzdCB2aWV3TGV2ZWwgaW4gdGhhdCBjYXNlLlxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9IGlSb3V0ZUxldmVsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRkNMIGxldmVsIGZvciBub24tRkNMIGNhc2VzIGlzIGVxdWFsIHRvIC0xXG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLkZDTExldmVsID0gLTE7XG5cdFx0XHR9IGVsc2UgaWYgKGFSb3V0ZVRhcmdldHMubGVuZ3RoID09PSAxICYmIHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLmNvbnRyb2xBZ2dyZWdhdGlvbiAhPT0gXCJiZWdpbkNvbHVtblBhZ2VzXCIpIHtcblx0XHRcdFx0Ly8gV2UncmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUncyBvbmx5IDEgdGFyZ2V0IGZvciB0aGUgcm91dGUsIGFuZCBpdCdzIG5vdCBpbiB0aGUgZmlyc3QgY29sdW1uXG5cdFx0XHRcdC8vIC0tPiB0aGlzIGlzIGEgZnVsbHNjcmVlbiBjb2x1bW4gYWZ0ZXIgYWxsIGNvbHVtbnMgaW4gdGhlIEZDTCBoYXZlIGJlZW4gdXNlZFxuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS5GQ0xMZXZlbCA9IDM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlciBGQ0wgY2FzZXNcblx0XHRcdFx0YVJvdXRlVGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0c3dpdGNoICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYmVnaW5Db2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBcIm1pZENvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDE7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGFnYXRlIHZpZXdMZXZlbCwgY29udGV4dFBhdHRlcm4sIEZDTExldmVsIGFuZCBjb250cm9sQWdncmVnYXRpb24gdG8gcGFyZW50IHRhcmdldHNcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9tVGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0d2hpbGUgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5wYXJlbnQpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudFRhcmdldE5hbWUgPSB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ucGFyZW50O1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWw7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybjtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLkZDTExldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uRkNMTGV2ZWwgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb247XG5cdFx0XHRcdHNUYXJnZXROYW1lID0gc1BhcmVudFRhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIHJvb3QgZW50aXR5IGZvciB0aGUgYXBwXG5cdFx0Y29uc3QgYUxldmVsMFJvdXRlTmFtZXMgPSBbXTtcblx0XHRjb25zdCBhTGV2ZWwxUm91dGVOYW1lcyA9IFtdO1xuXHRcdGxldCBzRGVmYXVsdFJvdXRlTmFtZTtcblxuXHRcdGZvciAoY29uc3Qgc05hbWUgaW4gdGhpcy5fbVJvdXRlcykge1xuXHRcdFx0Y29uc3QgaUxldmVsID0gdGhpcy5fbVJvdXRlc1tzTmFtZV0ucm91dGVMZXZlbDtcblx0XHRcdGlmIChpTGV2ZWwgPT09IDApIHtcblx0XHRcdFx0YUxldmVsMFJvdXRlTmFtZXMucHVzaChzTmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlMZXZlbCA9PT0gMSkge1xuXHRcdFx0XHRhTGV2ZWwxUm91dGVOYW1lcy5wdXNoKHNOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYUxldmVsMFJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDBSb3V0ZU5hbWVzWzBdO1xuXHRcdH0gZWxzZSBpZiAoYUxldmVsMVJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDFSb3V0ZU5hbWVzWzBdO1xuXHRcdH1cblxuXHRcdGlmIChzRGVmYXVsdFJvdXRlTmFtZSkge1xuXHRcdFx0Y29uc3Qgc0RlZmF1bHRUYXJnZXROYW1lID0gdGhpcy5fbVJvdXRlc1tzRGVmYXVsdFJvdXRlTmFtZV0udGFyZ2V0cy5zbGljZSgtMSlbMF07XG5cdFx0XHR0aGlzLnNDb250ZXh0UGF0aCA9IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zICYmIHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncykge1xuXHRcdFx0XHRjb25zdCBvU2V0dGluZ3MgPSB0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdHRoaXMuc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmNvbnRleHRQYXRoIHx8IFwiL1wiICsgb1NldHRpbmdzLmVudGl0eVNldDtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5zQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XCJDYW5ub3QgZGV0ZXJtaW5lIGRlZmF1bHQgY29udGV4dFBhdGg6IGNvbnRleHRQYXRoIG9yIGVudGl0eVNldCBtaXNzaW5nIGluIGRlZmF1bHQgdGFyZ2V0OiBcIiArIHNEZWZhdWx0VGFyZ2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkNhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBjb250ZXh0UGF0aDogbm8gZGVmYXVsdCByb3V0ZSBmb3VuZC5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgbmVlZCB0byBlc3RhYmxpc2ggdGhlIGNvcnJlY3QgcGF0aCB0byB0aGUgZGlmZmVyZW50IHBhZ2VzLCBpbmNsdWRpbmcgdGhlIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKVxuXHRcdFx0Lm1hcCgoc1RhcmdldEtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0S2V5XTtcblx0XHRcdH0pXG5cdFx0XHQuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGEudmlld0xldmVsIDwgYi52aWV3TGV2ZWwgPyAtMSA6IDE7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goKHRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEFmdGVyIHNvcnRpbmcgdGhlIHRhcmdldHMgcGVyIGxldmVsIHdlIGNhbiB0aGVuIGdvIHRocm91Z2ggdGhlaXIgbmF2aWdhdGlvbiBvYmplY3QgYW5kIHVwZGF0ZSB0aGUgcGF0aHMgYWNjb3JkaW5nbHkuXG5cdFx0XHRcdGlmICh0YXJnZXQub3B0aW9ucykge1xuXHRcdFx0XHRcdGNvbnN0IHNldHRpbmdzID0gdGFyZ2V0Lm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gc2V0dGluZ3MuY29udGV4dFBhdGggfHwgKHNldHRpbmdzLmVudGl0eVNldCA/IFwiL1wiICsgc2V0dGluZ3MuZW50aXR5U2V0IDogXCJcIik7XG5cdFx0XHRcdFx0aWYgKCFzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggJiYgc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0XHRzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGggKyBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc2V0dGluZ3MubmF2aWdhdGlvbiB8fCB7fSkuZm9yRWFjaCgoc05hdk5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFJvdXRlID0gdGhpcy5fbVJvdXRlc1tzZXR0aW5ncy5uYXZpZ2F0aW9uW3NOYXZOYW1lXS5kZXRhaWwucm91dGVdO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFJvdXRlICYmIHRhcmdldFJvdXRlLnRhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Um91dGUudGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnZpZXdMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChzTmF2TmFtZS5zdGFydHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBzTmF2TmFtZSArIFwiL1wiO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggKyBzTmF2TmFtZSArIFwiL1wiO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgYSB2aWV3IGxldmVsIGZyb20gYSBwYXR0ZXJuIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0dGVybiBUaGUgcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmlld0xldmVsIFRoZSBjdXJyZW50IGxldmVsIG9mIHZpZXdcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIGxldmVsXG5cdCAqL1xuXHRfZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm46IHN0cmluZywgdmlld0xldmVsOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHNQYXR0ZXJuID0gc1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0aWYgKHNQYXR0ZXJuICYmIHNQYXR0ZXJuWzBdICE9PSBcIi9cIiAmJiBzUGF0dGVyblswXSAhPT0gXCI/XCIpIHtcblx0XHRcdHNQYXR0ZXJuID0gXCIvXCIgKyBzUGF0dGVybjtcblx0XHR9XG5cdFx0aWYgKHNQYXR0ZXJuLmxlbmd0aCkge1xuXHRcdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcblx0XHRcdGlmICh0aGlzLm9Sb3V0ZXIubWF0Y2goc1BhdHRlcm4pIHx8IHNQYXR0ZXJuID09PSBcIlwiKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybiwgKyt2aWV3TGV2ZWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNQYXR0ZXJuLCB2aWV3TGV2ZWwpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdmlld0xldmVsO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb3V0ZUluZm9ybWF0aW9uKHNSb3V0ZU5hbWU6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9tUm91dGVzW3NSb3V0ZU5hbWVdO1xuXHR9XG5cblx0X2dldFRhcmdldEluZm9ybWF0aW9uKHNUYXJnZXROYW1lOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdO1xuXHR9XG5cblx0X2dldENvbXBvbmVudElkKHNPd25lcklkOiBhbnksIHNDb21wb25lbnRJZDogYW55KSB7XG5cdFx0aWYgKHNDb21wb25lbnRJZC5pbmRleE9mKHNPd25lcklkICsgXCItLS1cIikgPT09IDApIHtcblx0XHRcdHJldHVybiBzQ29tcG9uZW50SWQuc3Vic3RyKHNPd25lcklkLmxlbmd0aCArIDMpO1xuXHRcdH1cblx0XHRyZXR1cm4gc0NvbXBvbmVudElkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0YXJnZXQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbXBvbmVudEluc3RhbmNlIEluc3RhbmNlIG9mIHRoZSBjb21wb25lbnRcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXRcblx0ICovXG5cdGdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnRJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgc1RhcmdldENvbXBvbmVudElkID0gdGhpcy5fZ2V0Q29tcG9uZW50SWQob0NvbXBvbmVudEluc3RhbmNlLl9zT3duZXJJZCwgb0NvbXBvbmVudEluc3RhbmNlLmdldElkKCkpO1xuXHRcdGxldCBzQ29ycmVjdFRhcmdldE5hbWUgPSBudWxsO1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmlkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdJZCA9PT0gc1RhcmdldENvbXBvbmVudElkKSB7XG5cdFx0XHRcdHNDb3JyZWN0VGFyZ2V0TmFtZSA9IHNUYXJnZXROYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzQ29ycmVjdFRhcmdldE5hbWUpO1xuXHR9XG5cblx0Z2V0TGFzdFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nO1xuXHR9XG5cblx0c2V0TGFzdFNlbWFudGljTWFwcGluZyhvTWFwcGluZz86IFNlbWFudGljTWFwcGluZykge1xuXHRcdHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcgPSBvTWFwcGluZztcblx0fVxuXG5cdG5hdmlnYXRlVG8ob0NvbnRleHQ6IGFueSwgc1JvdXRlTmFtZTogYW55LCBtUGFyYW1ldGVyTWFwcGluZzogYW55LCBiUHJlc2VydmVIaXN0b3J5OiBhbnkpIHtcblx0XHRsZXQgc1RhcmdldFVSTFByb21pc2UsIGJJc1N0aWNreU1vZGU6IGJvb2xlYW47XG5cdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkgJiYgb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwpIHtcblx0XHRcdGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHRcdGlmICghbVBhcmFtZXRlck1hcHBpbmcpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciBtYXBwaW5nIGRlZmluZSB0aGlzIG1lYW4gd2UgcmVseSBlbnRpcmVseSBvbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdGhcblx0XHRcdHNUYXJnZXRVUkxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFyZ2V0VVJMUHJvbWlzZSA9IHRoaXMucHJlcGFyZVBhcmFtZXRlcnMobVBhcmFtZXRlck1hcHBpbmcsIHNSb3V0ZU5hbWUsIG9Db250ZXh0KS50aGVuKChtUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLm9Sb3V0ZXIuZ2V0VVJMKHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gc1RhcmdldFVSTFByb21pc2UudGhlbigoc1RhcmdldFVSTDogYW55KSA9PiB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5uYXZUb0hhc2goc1RhcmdldFVSTCwgYlByZXNlcnZlSGlzdG9yeSwgZmFsc2UsIGZhbHNlLCAhYklzU3RpY2t5TW9kZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJldHVybiBhIG1hcCBvZiByb3V0aW5nIHRhcmdldCBwYXJhbWV0ZXJzIHdoZXJlIHRoZSBiaW5kaW5nIHN5bnRheCBpcyByZXNvbHZlZCB0byB0aGUgY3VycmVudCBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgbWFwIGluIHRoZSBmb3JtYXQgW2s6IHN0cmluZ10gOiBDb21wbGV4QmluZGluZ1N5bnRheFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFJvdXRlIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgcm91dGluZyB0YXJnZXQgcGFyYW1ldGVyc1xuXHQgKi9cblx0cHJlcGFyZVBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSwgc1RhcmdldFJvdXRlOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0bGV0IG9QYXJhbWV0ZXJzUHJvbWlzZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Y29uc3QgYUNvbnRleHRQYXRoUGFydHMgPSBzQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgYUFsbFJlc29sdmVkUGFyYW1ldGVyUHJvbWlzZXMgPSBPYmplY3Qua2V5cyhtUGFyYW1ldGVycykubWFwKChzUGFyYW1ldGVyS2V5OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck1hcHBpbmdFeHByZXNzaW9uID0gbVBhcmFtZXRlcnNbc1BhcmFtZXRlcktleV07XG5cdFx0XHRcdC8vIFdlIGFzc3VtZSB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uXG5cdFx0XHRcdGNvbnN0IG9QYXJzZWRFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IG9QYXJzZWRFeHByZXNzaW9uLnBhcnRzIHx8IFtvUGFyc2VkRXhwcmVzc2lvbl07XG5cdFx0XHRcdGNvbnN0IGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzID0gYVBhcnRzLm1hcChmdW5jdGlvbiAob1BhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBhUmVsYXRpdmVQYXJ0cyA9IG9QYXRoUGFydC5wYXRoLnNwbGl0KFwiLi4vXCIpO1xuXHRcdFx0XHRcdC8vIFdlIGdvIHVwIHRoZSBjdXJyZW50IGNvbnRleHQgcGF0aCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdGNvbnN0IGFMb2NhbFBhcnRzID0gYUNvbnRleHRQYXRoUGFydHMuc2xpY2UoMCwgYUNvbnRleHRQYXRoUGFydHMubGVuZ3RoIC0gYVJlbGF0aXZlUGFydHMubGVuZ3RoICsgMSk7XG5cdFx0XHRcdFx0YUxvY2FsUGFydHMucHVzaChhUmVsYXRpdmVQYXJ0c1thUmVsYXRpdmVQYXJ0cy5sZW5ndGggLSAxXSk7XG5cblx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gYUxvY2FsUGFydHMuam9pbihcIi9cIik7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFDb250ZXh0ID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhQ29udGV4dChzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHNQcm9wZXJ0eVBhdGgpLnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHlJbmZvID0gb01ldGFDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VkbVR5cGUgPSBvUHJvcGVydHlJbmZvLiRUeXBlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIE9EYXRhVXRpbHMuZm9ybWF0TGl0ZXJhbChvVmFsdWUsIHNFZG1UeXBlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKChhUmVzb2x2ZWRQYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG9QYXJzZWRFeHByZXNzaW9uLmZvcm1hdHRlclxuXHRcdFx0XHRcdFx0PyBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXIuYXBwbHkodGhpcywgYVJlc29sdmVkUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogYVJlc29sdmVkUGFyYW1ldGVycy5qb2luKFwiXCIpO1xuXHRcdFx0XHRcdHJldHVybiB7IGtleTogc1BhcmFtZXRlcktleSwgdmFsdWU6IHZhbHVlIH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9QYXJhbWV0ZXJzUHJvbWlzZSA9IFByb21pc2UuYWxsKGFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChcblx0XHRcdFx0YUFsbFJlc29sdmVkUGFyYW1ldGVyczogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9W11cblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0XHRcdGFBbGxSZXNvbHZlZFBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc29sdmVkUGFyYW1ldGVyOiB7IGtleTogYW55OyB2YWx1ZTogYW55IH0pIHtcblx0XHRcdFx0XHRvUGFyYW1ldGVyc1tvUmVzb2x2ZWRQYXJhbWV0ZXIua2V5XSA9IG9SZXNvbHZlZFBhcmFtZXRlci52YWx1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUGFyYW1ldGVycztcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ291bGQgbm90IHBhcnNlIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvbiB0byByb3V0ZSBcIiArIHNUYXJnZXRSb3V0ZSk7XG5cdFx0XHRvUGFyYW1ldGVyc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9QYXJhbWV0ZXJzUHJvbWlzZTtcblx0fVxuXG5cdF9maXJlUm91dGVNYXRjaEV2ZW50cyhtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmZpcmVFdmVudChcInJvdXRlTWF0Y2hlZFwiLCBtUGFyYW1ldGVycyk7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmZpcmVFdmVudChcImFmdGVyUm91dGVNYXRjaGVkXCIsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdEVkaXRTdGF0ZS5jbGVhblByb2Nlc3NlZEVkaXRTdGF0ZSgpOyAvLyBSZXNldCBVSSBzdGF0ZSB3aGVuIGFsbCBiaW5kaW5ncyBoYXZlIGJlZW4gcmVmcmVzaGVkXG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBtYXAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlXSBOYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB3aXRob3V0IGNoYW5naW5nIHRoZSBVUkxcblx0ICogQHBhcmFtIHtQcm9taXNlfSBbbVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XSBUaGUgY29udGV4dCBpcyBjcmVhdGVkIGFzeW5jLCBuYXZpZ2F0ZSB0byAoLi4uKSBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIFByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYW5kIHRoZW4gbmF2aWdhdGUgaW50byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0XSBUaGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGRlZmVycmVkIGF0IHRoZSB0YXJnZXQgcGFnZVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5lZGl0YWJsZV0gVGhlIHRhcmdldCBwYWdlIHNoYWxsIGJlIGltbWVkaWF0ZWx5IGluIHRoZSBlZGl0IG1vZGUgdG8gYXZvaWQgZmxpY2tlcmluZ1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsXSBUaGUgYlBlcnNpc3RPUFNjcm9sbCB3aWxsIGJlIHVzZWQgZm9yIHNjcm9sbGluZyB0byBmaXJzdCB0YWJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbF0gYCsxYCBpZiB3ZSBhZGQgYSBjb2x1bW4gaW4gRkNMLCBgLTFgIHRvIHJlbW92ZSBhIGNvbHVtbiwgMCB0byBzdGF5IG9uIHRoZSBzYW1lIGNvbHVtblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5ub1ByZXNlcnZhdGlvbkNhY2hlXSBEbyBuYXZpZ2F0aW9uIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgcHJlc2VydmVkIGNhY2hlIG1lY2hhbmlzbVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iUmVjcmVhdGVDb250ZXh0XSBGb3JjZSByZS1jcmVhdGlvbiBvZiB0aGUgY29udGV4dCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvbmUgcGFzc2VkIGFzIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iRm9yY2VGb2N1c10gRm9yY2VzIGZvY3VzIHNlbGVjdGlvbiBhZnRlciBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3IGRhdGFcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvQ3VycmVudFRhcmdldEluZm9dIFRoZSB0YXJnZXQgaW5mb3JtYXRpb24gZnJvbSB3aGljaCB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0bmF2aWdhdGVUb0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRtUGFyYW1ldGVyczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlPzogYm9vbGVhbjtcblx0XHRcdFx0XHRhc3luY0NvbnRleHQ/OiBQcm9taXNlPGFueT47XG5cdFx0XHRcdFx0YkRlZmVycmVkQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRcdFx0ZWRpdGFibGU/OiBib29sZWFuO1xuXHRcdFx0XHRcdHRyYW5zaWVudD86IGJvb2xlYW47XG5cdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbD86IGJvb2xlYW47XG5cdFx0XHRcdFx0dXBkYXRlRkNMTGV2ZWw/OiBudW1iZXI7XG5cdFx0XHRcdFx0bm9QcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0YlJlY3JlYXRlQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRcdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuO1xuXHRcdFx0XHRcdHRhcmdldFBhdGg/OiBzdHJpbmc7XG5cdFx0XHRcdFx0c2hvd1BsYWNlaG9sZGVyPzogYm9vbGVhbjtcblx0XHRcdFx0XHRiRHJhZnROYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk/OiBib29sZWFuO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZCxcblx0XHRvVmlld0RhdGE6IGFueSB8IHVuZGVmaW5lZCxcblx0XHRvQ3VycmVudFRhcmdldEluZm86IGFueSB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgc1RhcmdldFJvdXRlOiBzdHJpbmcgPSBcIlwiLFxuXHRcdFx0b1JvdXRlUGFyYW1ldGVyc1Byb21pc2UsXG5cdFx0XHRiSXNTdGlja3lNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCkge1xuXHRcdFx0YklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdFx0Ly8gTWFuYWdlIHBhcmFtZXRlciBtYXBwaW5nXG5cdFx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLnRhcmdldFBhdGggJiYgb1ZpZXdEYXRhICYmIG9WaWV3RGF0YS5uYXZpZ2F0aW9uKSB7XG5cdFx0XHRjb25zdCBvUm91dGVEZXRhaWwgPSBvVmlld0RhdGEubmF2aWdhdGlvblttUGFyYW1ldGVycy50YXJnZXRQYXRoXS5kZXRhaWw7XG5cdFx0XHRzVGFyZ2V0Um91dGUgPSBvUm91dGVEZXRhaWwucm91dGU7XG5cblx0XHRcdGlmIChvUm91dGVEZXRhaWwucGFyYW1ldGVycykge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSA9IHRoaXMucHJlcGFyZVBhcmFtZXRlcnMob1JvdXRlRGV0YWlsLnBhcmFtZXRlcnMsIHNUYXJnZXRSb3V0ZSwgb0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzVGFyZ2V0UGF0aCA9IHRoaXMuX2dldFBhdGhGcm9tQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIElmIHRoZSBwYXRoIGlzIGVtcHR5LCB3ZSdyZSBzdXBwb3NlZCB0byBuYXZpZ2F0ZSB0byB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgbmVlZCB0byBleGl0IGZyb20gdGhlIGFwcCBpbnN0ZWFkXG5cdFx0aWYgKHNUYXJnZXRQYXRoLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vUm91dGVyUHJveHkuZXhpdEZyb21BcHAoKSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgZGVmZXJyZWQgb3IgYXN5bmMsIHdlIGFkZCAoLi4uKSB0byB0aGUgcGF0aFxuXHRcdGlmIChtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0IHx8IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiguLi4pXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGxheW91dCBwYXJhbWV0ZXIgaWYgbmVlZGVkXG5cdFx0Y29uc3Qgc0xheW91dCA9IHRoaXMuX2NhbGN1bGF0ZUxheW91dChzVGFyZ2V0UGF0aCwgbVBhcmFtZXRlcnMpO1xuXHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIj9sYXlvdXQ9XCIgKyBzTGF5b3V0O1xuXHRcdH1cblxuXHRcdC8vIE5hdmlnYXRpb24gcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2Vcblx0XHRjb25zdCBvTmF2aWdhdGlvbkluZm8gPSB7XG5cdFx0XHRvQXN5bmNDb250ZXh0OiBtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0LFxuXHRcdFx0YkRlZmVycmVkQ29udGV4dDogbVBhcmFtZXRlcnM/LmJEZWZlcnJlZENvbnRleHQsXG5cdFx0XHRiVGFyZ2V0RWRpdGFibGU6IG1QYXJhbWV0ZXJzPy5lZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzPy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0dXNlQ29udGV4dDogbVBhcmFtZXRlcnM/LnVwZGF0ZUZDTExldmVsID09PSAtMSB8fCBtUGFyYW1ldGVycz8uYlJlY3JlYXRlQ29udGV4dCA/IHVuZGVmaW5lZCA6IG9Db250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogbVBhcmFtZXRlcnM/LmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRiU2hvd1BsYWNlaG9sZGVyOiBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyIDogdHJ1ZSxcblx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogbVBhcmFtZXRlcnM/LmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eVxuXHRcdH07XG5cblx0XHRpZiAobVBhcmFtZXRlcnM/LmNoZWNrTm9IYXNoQ2hhbmdlKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbmV3IGhhc2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2hOb0FwcFN0YXRlID0gdGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpLnJlcGxhY2UoL1smP117MX1zYXAtaWFwcC1zdGF0ZT1bQS1aMC05XSsvLCBcIlwiKTtcblx0XHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gc0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSkge1xuXHRcdFx0XHQvLyBUaGUgaGFzaCBkb2Vzbid0IGNoYW5nZSwgYnV0IHdlIGZpcmUgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgdG8gdHJpZ2dlciBwYWdlIHJlZnJlc2ggLyBiaW5kaW5nXG5cdFx0XHRcdGNvbnN0IG1FdmVudFBhcmFtZXRlcnM6IGFueSA9IHRoaXMub1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2godGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpKTtcblx0XHRcdFx0aWYgKG1FdmVudFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gb05hdmlnYXRpb25JbmZvO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMudmlld3MgPSB0aGlzLmFDdXJyZW50Vmlld3M7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5zZXRGb2N1c0ZvcmNlZCghIW1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzKTtcblxuXHRcdFx0XHR0aGlzLl9maXJlUm91dGVNYXRjaEV2ZW50cyhtRXZlbnRQYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy50cmFuc2llbnQgJiYgbVBhcmFtZXRlcnMuZWRpdGFibGUgPT0gdHJ1ZSAmJiBzVGFyZ2V0UGF0aC5pbmRleE9mKFwiKC4uLilcIikgPT09IC0xKSB7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGguaW5kZXhPZihcIj9cIikgPiAtMSkge1xuXHRcdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiZpLWFjdGlvbj1jcmVhdGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2ktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsZWFyIHVuYm91bmQgbWVzc2FnZXMgdXBvbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1Bcblx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSBzdGFsZSBlcnJvciBtZXNzYWdlcyBmcm9tIExSIGFyZSBub3Qgc2hvd24gdG8gdGhlIHVzZXIgYWZ0ZXIgbmF2aWdhdGlvbiB0byBPUC5cblx0XHRpZiAob0N1cnJlbnRUYXJnZXRJbmZvICYmIG9DdXJyZW50VGFyZ2V0SW5mby5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRjb25zdCBvUm91dGVJbmZvID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzVGFyZ2V0UGF0aCk7XG5cdFx0XHRpZiAob1JvdXRlSW5mbykge1xuXHRcdFx0XHRjb25zdCBvUm91dGUgPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKG9Sb3V0ZUluZm8ubmFtZSk7XG5cdFx0XHRcdGlmIChvUm91dGUgJiYgb1JvdXRlLnRhcmdldHMgJiYgb1JvdXRlLnRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IHNMYXN0VGFyZ2V0TmFtZSA9IG9Sb3V0ZS50YXJnZXRzW29Sb3V0ZS50YXJnZXRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzTGFzdFRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQubmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2VcIikge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgcXVldWVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucHVzaChvTmF2aWdhdGlvbkluZm8pO1xuXG5cdFx0aWYgKHNUYXJnZXRSb3V0ZSAmJiBvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLnRoZW4oKG9Sb3V0ZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUgPSBiSXNTdGlja3lNb2RlO1xuXHRcdFx0XHR0aGlzLm9Sb3V0ZXIubmF2VG8oc1RhcmdldFJvdXRlLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHQubmF2VG9IYXNoKHNUYXJnZXRQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnM/Lm5vUHJlc2VydmF0aW9uQ2FjaGUsIG1QYXJhbWV0ZXJzPy5iRm9yY2VGb2N1cywgIWJJc1N0aWNreU1vZGUpXG5cdFx0XHQudGhlbigoYk5hdmlnYXRlZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICghYk5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdC8vIFRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuIC0tPiByZW1vdmUgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBxdWV1ZSBhcyB0aGV5IHNob3VsZG4ndCBiZSB1c2VkXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmcjbmF2aWdhdGVUb1JvdXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Sb3V0aW5nXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1JvdXRlUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9Sb3V0ZVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0VVJMID0gdGhpcy5vUm91dGVyLmdldFVSTChzVGFyZ2V0Um91dGVOYW1lLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyUHJveHkubmF2VG9IYXNoKHNUYXJnZXRVUkwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICFvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgb3IgYGZhbHNlYCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBpbXBhY3RlZCBvciBub3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHQvLyBGaXJzdCwgY2hlY2sgd2l0aCB0aGUgdGVjaG5pY2FsIHBhdGguIFdlIGhhdmUgdG8gdHJ5IGl0LCBiZWNhdXNlIGZvciBsZXZlbCA+IDEsIHdlXG5cdFx0Ly8gdXNlcyB0ZWNobmljYWwga2V5cyBldmVuIGlmIFNlbWFudGljIGtleXMgYXJlIGVuYWJsZWRcblx0XHRpZiAodGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmICgvXlteXFwoXFwpXStcXChbXlxcKFxcKV0rXFwpJC8udGVzdChzUGF0aCkpIHtcblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHBhdGggY2FuIGJlIHNlbWFudGljIChpLmUuIGlzIGxpa2UgeHh4KHl5eSkpXG5cdFx0XHQvLyBjaGVjayB3aXRoIHRoZSBzZW1hbnRpYyBwYXRoIGlmIHdlIGNhbiBmaW5kIGl0XG5cdFx0XHRsZXQgc1NlbWFudGljUGF0aDtcblx0XHRcdGlmICh0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nICYmIHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9PT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSBhbHJlYWR5IHJlc29sdmVkIHRoaXMgc2VtYW50aWMgcGF0aFxuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNTZW1hbnRpY1BhdGggIT0gc1BhdGggPyB0aGlzLm9Sb3V0ZXJQcm94eS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoc1NlbWFudGljUGF0aCkgOiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdF9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGg6IGFueSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRzUGF0aCA9IHNQYXRoLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdGlmICh0aGlzLm9Sb3V0ZXIubWF0Y2goc1BhdGgpIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGgpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIGlmIHRoaXMgaXMgYSBsZXZlbC0xIG9iamVjdCAocGF0aCA9IC9hYWEoYmJiKSlcblx0XHRpZiAoIS9eXFwvW15cXChdK1xcKFteXFwpXStcXCkkLy50ZXN0KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgc2VtYW50aWMga2V5c1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0aWYgKCFTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGVjayB0aGUgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWRcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBzUGF0aCk7XG5cdH1cblxuXHRfZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRsZXQgc1BhdGg7XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgb0NvbnRleHQuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBiYWNrIGZyb20gYSBjb250ZXh0LCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhcblx0XHRcdHNQYXRoID0gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UncmUgbmF2aWdhdGluZyBiYWNrIHRvIGEgc2VtYW50aWMgcGF0aCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlc29sdmVkXG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdHNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQpKSB7XG5cdFx0XHQvLyBXZSBjaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSBhIHNlbWFudGljIHBhdGhcblx0XHRcdGNvbnN0IHNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXG5cdFx0XHRpZiAoIXNTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0Ly8gV2Ugd2VyZSBub3QgYWJsZSB0byBidWlsZCB0aGUgc2VtYW50aWMgcGF0aCAtLT4gVXNlIHRoZSB0ZWNobmljYWwgcGF0aCBhbmRcblx0XHRcdFx0Ly8gY2xlYXIgdGhlIHByZXZpb3VzIG1hcHBpbmcsIG90aGVyd2lzZSB0aGUgb2xkIG1hcHBpbmcgaXMgdXNlZCBpbiBFZGl0RmxvdyN1cGRhdGVEb2N1bWVudFxuXHRcdFx0XHQvLyBhbmQgaXQgbGVhZHMgdG8gdW53YW50ZWQgcGFnZSByZWxvYWRzXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU2VtYW50aWNQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHQvLyBhbmQgdXNlIHRoZSBzZW1hbnRpYyBwYXRoIGluc3RlYWQgb2YgdGhlIHRlY2huaWNhbCBvbmVcblx0XHRcdFx0dGhpcy5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHsgdGVjaG5pY2FsUGF0aDogc1BhdGgsIHNlbWFudGljUGF0aDogc1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0c1BhdGggPSBzU2VtYW50aWNQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBleHRyYSAnLycgYXQgdGhlIGJlZ2lubmluZyBvZiBwYXRoXG5cdFx0aWYgKHNQYXRoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c1BhdGggPSBzUGF0aC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNQYXRoO1xuXHR9XG5cblx0X2NhbGN1bGF0ZUxheW91dChzUGF0aDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IEZDTExldmVsID0gbVBhcmFtZXRlcnMuRkNMTGV2ZWw7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsKSB7XG5cdFx0XHRGQ0xMZXZlbCArPSBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbDtcblx0XHRcdGlmIChGQ0xMZXZlbCA8IDApIHtcblx0XHRcdFx0RkNMTGV2ZWwgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAodGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueSkuY2FsY3VsYXRlTGF5b3V0KFxuXHRcdFx0RkNMTGV2ZWwsXG5cdFx0XHRzUGF0aCxcblx0XHRcdG1QYXJhbWV0ZXJzLnNMYXlvdXQsXG5cdFx0XHRtUGFyYW1ldGVycy5rZWVwQ3VycmVudExheW91dFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciBiZWZvcmUgYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBEaXNwbGF5cyBhIGJ1c3kgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKi9cblx0X2JlZm9yZVJvdXRlTWF0Y2hlZCgvKm9FdmVudDogRXZlbnQqLykge1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmICghYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogSGlkZXMgdGhlIGJ1c3kgaW5kaWNhdG9yIGFuZCBmaXJlcyBpdHMgb3duICdyb3V0ZW1hdGNoZWQnIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IFRoZSBldmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBvQXBwU3RhdGVIYW5kbGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldEFwcFN0YXRlSGFuZGxlcigpLFxuXHRcdFx0b1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob1Jvb3RWaWV3KSAmJiAhYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdFx0aWYgKHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5sZW5ndGgpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlWzBdO1xuXHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnNsaWNlKDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRpZiAob0FwcFN0YXRlSGFuZGxlci5jaGVja0lmUm91dGVDaGFuZ2VkQnlJQXBwKCkpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvLmJSZWFzb25Jc0lhcHBTdGF0ZSA9IHRydWU7XG5cdFx0XHRvQXBwU3RhdGVIYW5kbGVyLnJlc2V0Um91dGVDaGFuZ2VkQnlJQXBwKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zQ3VycmVudFJvdXRlTmFtZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYW1lXCIpO1xuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZVBhdHRlcm4gPSBtUGFyYW1ldGVycy5jb25maWcucGF0dGVybjtcblx0XHR0aGlzLmFDdXJyZW50Vmlld3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIik7XG5cblx0XHRtUGFyYW1ldGVycy5yb3V0ZUluZm9ybWF0aW9uID0gdGhpcy5fZ2V0Um91dGVJbmZvcm1hdGlvbih0aGlzLnNDdXJyZW50Um91dGVOYW1lKTtcblx0XHRtUGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXG5cdFx0dGhpcy5fZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnMpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY3VycmVudCBoYXNoIGhhcyBiZWVuIHNldCBieSB0aGUgcm91dGVyUHJveHkubmF2VG9IYXNoIGZ1bmN0aW9uXG5cdFx0Ly8gSWYgbm90LCByZWJ1aWxkIGhpc3RvcnkgcHJvcGVybHkgKGJvdGggaW4gdGhlIGJyb3dzZXIgYW5kIHRoZSBSb3V0ZXJQcm94eSlcblx0XHRpZiAoIWhpc3Rvcnkuc3RhdGUgfHwgaGlzdG9yeS5zdGF0ZS5mZUxldmVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHRcdC5yZXN0b3JlSGlzdG9yeSgpXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5yZXNvbHZlUm91dGVNYXRjaCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzdG9yaW5nIGhpc3RvcnlcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5LnJlc29sdmVSb3V0ZU1hdGNoKCk7XG5cdFx0fVxuXHR9XG5cblx0YXR0YWNoUm91dGVNYXRjaGVkKG9EYXRhOiBhbnksIGZuRnVuY3Rpb24/OiBhbnksIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChcInJvdXRlTWF0Y2hlZFwiLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRkZXRhY2hSb3V0ZU1hdGNoZWQoZm5GdW5jdGlvbjogYW55LCBvTGlzdGVuZXI/OiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZChvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChcImFmdGVyUm91dGVNYXRjaGVkXCIsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdGRldGFjaEFmdGVyUm91dGVNYXRjaGVkKGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cblx0Z2V0Um91dGVGcm9tSGFzaChvUm91dGVyOiBhbnksIG9BcHBDb21wb25lbnQ6IGFueSkge1xuXHRcdGNvbnN0IHNIYXNoID0gb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmhhc2g7XG5cdFx0Y29uc3Qgb1JvdXRlSW5mbyA9IG9Sb3V0ZXIuZ2V0Um91dGVJbmZvQnlIYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldE1ldGFkYXRhKClcblx0XHRcdC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC51aTUvcm91dGluZy9yb3V0ZXNcIilcblx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Sb3V0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUm91dGUubmFtZSA9PT0gb1JvdXRlSW5mby5uYW1lO1xuXHRcdFx0fSlbMF07XG5cdH1cblx0Z2V0VGFyZ2V0c0Zyb21Sb3V0ZShvUm91dGU6IGFueSkge1xuXHRcdGNvbnN0IG9UYXJnZXQgPSBvUm91dGUudGFyZ2V0O1xuXHRcdGlmICh0eXBlb2Ygb1RhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmV0dXJuIFt0aGlzLl9tVGFyZ2V0c1tvVGFyZ2V0XV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFUYXJnZXQ6IGFueVtdID0gW107XG5cdFx0XHRvVGFyZ2V0LmZvckVhY2goKHNUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRhVGFyZ2V0LnB1c2godGhpcy5fbVRhcmdldHNbc1RhcmdldF0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYVRhcmdldDtcblx0XHR9XG5cdH1cblxuXHRpbml0aWFsaXplUm91dGluZygpIHtcblx0XHQvLyBBdHRhY2ggcm91dGVyIGhhbmRsZXJzXG5cdFx0dGhpcy5fZm5PblJvdXRlTWF0Y2hlZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlci5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fYmVmb3JlUm91dGVNYXRjaGVkLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHQvLyBSZXNldCBpbnRlcm5hbCBzdGF0ZVxuXHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IFtdO1xuXHRcdEVkaXRTdGF0ZS5yZXNldEVkaXRTdGF0ZSgpO1xuXHRcdHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCA9ICF0aGlzLm9Sb3V0ZXIubWF0Y2goXCJcIik7XG5cblx0XHRjb25zdCBiSXNJYXBwU3RhdGUgPSB0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuaW5kZXhPZihcInNhcC1pYXBwLXN0YXRlXCIpICE9PSAtMTtcblx0XHRjb25zdCBpbml0UHJvbWlzZSA9IHRoaXMub0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFN0YXJ0dXBQYXJhbWV0ZXJzKClcblx0XHRcdC50aGVuKChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBiSGFzU3RhcnRVcFBhcmFtZXRlcnMgPSBvU3RhcnR1cFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhvU3RhcnR1cFBhcmFtZXRlcnMpLmxlbmd0aCAhPT0gMDtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdC8vIE1hbmFnZSBzdGFydHVwIHBhcmFtZXRlcnMgKGluIGNhc2Ugb2Ygbm8gaWFwcC1zdGF0ZSlcblx0XHRcdFx0aWYgKCFiSXNJYXBwU3RhdGUgJiYgYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzICYmICFzSGFzaCkge1xuXHRcdFx0XHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXS5pbmRleE9mKFwiY3JlYXRlXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIG1vZGVcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9tYW5hZ2VDcmVhdGVTdGFydHVwKG9TdGFydHVwUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIERlZXAgbGlua1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX21hbmFnZURlZXBMaW5rU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHJvdXRpbmcgaW5pdGlhbGl6YXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIGluaXRQcm9taXNlO1xuXHR9XG5cblx0Z2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0KHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9EZWVwTGluay5jb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRpbmdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|