@sapui5/sap.fe.core 1.131.0 → 1.133.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +17 -23
- package/src/sap/fe/core/AppComponent.js +74 -36
- package/src/sap/fe/core/AppComponent.ts +70 -3
- package/src/sap/fe/core/AppStateHandler.js +44 -13
- package/src/sap/fe/core/AppStateHandler.ts +38 -0
- package/src/sap/fe/core/BaseController.js +3 -3
- package/src/sap/fe/core/CommonUtils.js +30 -37
- package/src/sap/fe/core/CommonUtils.ts +15 -13
- package/src/sap/fe/core/ExtensionAPI.js +29 -34
- package/src/sap/fe/core/ExtensionAPI.ts +3 -0
- package/src/sap/fe/core/InsightsFormattersExtension.js +2 -2
- package/src/sap/fe/core/PageController.js +40 -31
- package/src/sap/fe/core/PageController.ts +14 -1
- package/src/sap/fe/core/ResourceModel.js +4 -4
- package/src/sap/fe/core/ReuseComponent.js +27 -13
- package/src/sap/fe/core/ReuseComponent.ts +18 -0
- package/src/sap/fe/core/TemplateComponent.js +102 -89
- package/src/sap/fe/core/TemplateComponent.ts +20 -1
- package/src/sap/fe/core/TemplateModel.js +6 -7
- package/src/sap/fe/core/UIProvider.js +1 -1
- package/src/sap/fe/core/UIProvider.ts +2 -9
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +63 -48
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +56 -27
- package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +9 -0
- package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.ts +48 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -6
- package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +32 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +30 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +9 -13
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +2 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +19 -25
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +3 -4
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +20 -24
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +10 -15
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +3 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +296 -246
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -175
- package/src/sap/fe/core/controllerextensions/Feedback.js +10 -11
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -36
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +57 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +42 -50
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +12 -19
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +23 -17
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +15 -21
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Recommendations.js +23 -36
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.js +3 -3
- package/src/sap/fe/core/controllerextensions/Share.js +19 -28
- package/src/sap/fe/core/controllerextensions/SideEffects.js +68 -32
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -6
- package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -5
- package/src/sap/fe/core/controllerextensions/ViewState.js +23 -24
- package/src/sap/fe/core/controllerextensions/ViewState.ts +6 -1
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +13 -10
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +13 -8
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +15 -16
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +3 -4
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +288 -0
- package/src/sap/fe/core/controllerextensions/dialog/{OperationsDialog.block.tsx → OperationsDialog.tsx} +27 -29
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +41 -5
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +61 -8
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +404 -0
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +502 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +35 -43
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +34 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -27
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +27 -15
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +51 -39
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +75 -34
- package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +4 -4
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +88 -427
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +82 -620
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +9 -5
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +116 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +87 -13
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +4 -6
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +5 -7
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +6 -7
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +4 -4
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +58 -20
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -4
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +9 -12
- package/src/sap/fe/core/controls/CommandExecution.js +2 -2
- package/src/sap/fe/core/controls/ComponentLoader.js +20 -21
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +250 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/{DraftDataLossDialog.block.tsx → DraftDataLossDialog.tsx} +31 -19
- package/src/sap/fe/core/controls/FormElementWrapper.js +19 -21
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +114 -0
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +115 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +454 -0
- package/src/sap/fe/core/controls/Recommendations/{ConfirmRecommendationDialog.block.tsx → ConfirmRecommendationDialog.tsx} +5 -9
- package/src/sap/fe/core/converters/ConverterContext.js +17 -18
- package/src/sap/fe/core/converters/ConverterContext.ts +10 -15
- package/src/sap/fe/core/converters/ManifestSettings.js +29 -28
- package/src/sap/fe/core/converters/ManifestSettings.ts +22 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +26 -48
- package/src/sap/fe/core/converters/MetaModelConverter.js +21 -28
- package/src/sap/fe/core/converters/MetaModelConverter.ts +2 -0
- package/src/sap/fe/core/converters/TemplateConverter.js +17 -21
- package/src/sap/fe/core/converters/TemplateConverter.ts +5 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +69 -66
- package/src/sap/fe/core/converters/annotations/DataField.ts +30 -0
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +20 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +178 -43
- package/src/sap/fe/core/converters/controls/Common/Action.ts +202 -19
- package/src/sap/fe/core/converters/controls/Common/Chart.js +47 -22
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +50 -5
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +16 -23
- package/src/sap/fe/core/converters/controls/Common/Form.js +25 -38
- package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -0
- package/src/sap/fe/core/converters/controls/Common/KPI.js +32 -47
- package/src/sap/fe/core/converters/controls/Common/Table.js +464 -506
- package/src/sap/fe/core/converters/controls/Common/Table.ts +335 -219
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +17 -28
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -2
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +66 -90
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +10 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +49 -73
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +6 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +35 -50
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +110 -60
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +137 -41
- package/src/sap/fe/core/converters/helpers/Aggregation.js +19 -30
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +5 -5
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +11 -14
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +14 -21
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +4 -6
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -3
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -52
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -34
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +103 -74
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -39
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +28 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -9
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +61 -52
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +60 -21
- package/src/sap/fe/core/definition/FEDefinition.js +104 -44
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +37 -7
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +42 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -5
- package/src/sap/fe/core/formatters/FiscalFormat.js +24 -24
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -23
- package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -18
- package/src/sap/fe/core/fpm/Component.js +12 -14
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +20 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +22 -13
- package/src/sap/fe/core/helpers/BindingHelper.js +3 -3
- package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +55 -62
- package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -51
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +4 -7
- package/src/sap/fe/core/helpers/FPMHelper.js +4 -7
- package/src/sap/fe/core/helpers/HTTP503Handler.js +2 -1
- package/src/sap/fe/core/helpers/HTTP503Handler.ts +4 -3
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +5 -5
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +6 -6
- package/src/sap/fe/core/helpers/LoaderUtils.js +8 -3
- package/src/sap/fe/core/helpers/LoaderUtils.ts +15 -4
- package/src/sap/fe/core/helpers/MessageStrip.js +3 -4
- package/src/sap/fe/core/helpers/MetaModelFunction.js +26 -40
- package/src/sap/fe/core/helpers/MetaPath.js +9 -7
- package/src/sap/fe/core/helpers/MetaPath.ts +9 -3
- package/src/sap/fe/core/helpers/ModelHelper.js +33 -57
- package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
- package/src/sap/fe/core/helpers/PasteHelper.js +11 -19
- package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.js +3 -4
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +3 -5
- package/src/sap/fe/core/helpers/SizeHelper.js +3 -5
- package/src/sap/fe/core/helpers/StableIdHelper.js +13 -11
- package/src/sap/fe/core/helpers/StableIdHelper.ts +5 -1
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +28 -38
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.js +19 -40
- package/src/sap/fe/core/helpers/TitleHelper.ts +5 -25
- package/src/sap/fe/core/helpers/TypeGuards.js +25 -18
- package/src/sap/fe/core/helpers/TypeGuards.ts +7 -0
- package/src/sap/fe/core/helpers/WebSocket.js +4 -4
- package/src/sap/fe/core/library.js +8 -7
- package/src/sap/fe/core/library.ts +2 -0
- package/src/sap/fe/core/manifestMerger/AddNewPage.js +9 -11
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +14 -25
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +15 -17
- package/src/sap/fe/core/messagebundle.properties +21 -0
- package/src/sap/fe/core/messagebundle_ar.properties +5 -1
- package/src/sap/fe/core/messagebundle_bg.properties +4 -0
- package/src/sap/fe/core/messagebundle_ca.properties +4 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +4 -0
- package/src/sap/fe/core/messagebundle_cs.properties +8 -4
- package/src/sap/fe/core/messagebundle_cy.properties +4 -0
- package/src/sap/fe/core/messagebundle_da.properties +4 -0
- package/src/sap/fe/core/messagebundle_de.properties +4 -0
- package/src/sap/fe/core/messagebundle_el.properties +4 -0
- package/src/sap/fe/core/messagebundle_en.properties +4 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +4 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +249 -231
- package/src/sap/fe/core/messagebundle_es.properties +5 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +4 -0
- package/src/sap/fe/core/messagebundle_et.properties +4 -0
- package/src/sap/fe/core/messagebundle_fi.properties +4 -0
- package/src/sap/fe/core/messagebundle_fr.properties +6 -2
- package/src/sap/fe/core/messagebundle_fr_CA.properties +4 -0
- package/src/sap/fe/core/messagebundle_hi.properties +4 -0
- package/src/sap/fe/core/messagebundle_hr.properties +4 -0
- package/src/sap/fe/core/messagebundle_hu.properties +4 -0
- package/src/sap/fe/core/messagebundle_id.properties +4 -0
- package/src/sap/fe/core/messagebundle_it.properties +4 -0
- package/src/sap/fe/core/messagebundle_iw.properties +4 -0
- package/src/sap/fe/core/messagebundle_ja.properties +4 -0
- package/src/sap/fe/core/messagebundle_kk.properties +4 -0
- package/src/sap/fe/core/messagebundle_ko.properties +4 -0
- package/src/sap/fe/core/messagebundle_lt.properties +4 -0
- package/src/sap/fe/core/messagebundle_lv.properties +4 -0
- package/src/sap/fe/core/messagebundle_mk.properties +4 -0
- package/src/sap/fe/core/messagebundle_ms.properties +4 -0
- package/src/sap/fe/core/messagebundle_nl.properties +4 -0
- package/src/sap/fe/core/messagebundle_no.properties +4 -0
- package/src/sap/fe/core/messagebundle_pl.properties +4 -0
- package/src/sap/fe/core/messagebundle_pt.properties +4 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +4 -0
- package/src/sap/fe/core/messagebundle_ro.properties +4 -0
- package/src/sap/fe/core/messagebundle_ru.properties +4 -0
- package/src/sap/fe/core/messagebundle_sh.properties +4 -0
- package/src/sap/fe/core/messagebundle_sk.properties +4 -0
- package/src/sap/fe/core/messagebundle_sl.properties +4 -0
- package/src/sap/fe/core/messagebundle_sr.properties +4 -0
- package/src/sap/fe/core/messagebundle_sv.properties +4 -0
- package/src/sap/fe/core/messagebundle_th.properties +4 -0
- package/src/sap/fe/core/messagebundle_tr.properties +5 -1
- package/src/sap/fe/core/messagebundle_uk.properties +4 -0
- package/src/sap/fe/core/messagebundle_vi.properties +4 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +4 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +4 -0
- package/src/sap/fe/core/operationsHelper.js +23 -27
- package/src/sap/fe/core/operationsHelper.ts +6 -7
- package/src/sap/fe/core/rootView/Fcl.controller.js +53 -40
- package/src/sap/fe/core/rootView/Fcl.controller.ts +42 -7
- package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -10
- package/src/sap/fe/core/rootView/RootViewBaseController.js +22 -21
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +4 -3
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -0
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +12 -10
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +6 -2
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +8 -13
- package/src/sap/fe/core/services/ContextSharingServiceFactory.js +5 -7
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +31 -8
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +31 -5
- package/src/sap/fe/core/services/InlineEditServiceFactory.js +190 -0
- package/src/sap/fe/core/services/InlineEditServiceFactory.ts +226 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +10 -15
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +76 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +47 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +32 -34
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +75 -60
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +58 -12
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -9
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -18
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +7 -9
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +12 -16
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +4 -7
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +5 -6
- package/src/sap/fe/core/support/CommonHelper.js +2 -3
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/templating/ActionHelper.js +3 -4
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -8
- package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.js +53 -5
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +129 -7
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +33 -56
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
- package/src/sap/fe/core/templating/EntitySetHelper.js +11 -19
- package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
- package/src/sap/fe/core/templating/FieldControlHelper.js +13 -20
- package/src/sap/fe/core/templating/FilterTemplating.js +6 -9
- package/src/sap/fe/core/templating/PropertyHelper.js +33 -63
- package/src/sap/fe/core/templating/PropertyHelper.ts +0 -1
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +13 -21
- package/src/sap/fe/core/templating/UIFormatters.js +57 -78
- package/src/sap/fe/core/templating/UIFormatters.ts +2 -1
- package/src/sap/fe/core/type/Date.js +2 -2
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
- package/src/sap/fe/core/type/EDM.js +3 -5
- package/src/sap/fe/core/type/Email.js +17 -6
- package/src/sap/fe/core/type/Email.ts +23 -4
- package/src/sap/fe/core/type/FiscalDate.js +8 -9
- package/src/sap/fe/core/type/InputMask.js +3 -4
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +0 -299
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -87
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -43
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +0 -251
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +0 -471
|
@@ -52,11 +52,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
52
52
|
* @returns `true` if it is supported
|
|
53
53
|
*/
|
|
54
54
|
isObjectPathDraftSupported: function (dataModelObjectPath) {
|
|
55
|
-
var _dataModelObjectPath$, _dataModelObjectPath$2, _dataModelObjectPath$3, _dataModelObjectPath$4, _dataModelObjectPath$5, _dataModelObjectPath$6, _dataModelObjectPath$7;
|
|
56
55
|
const currentEntitySet = dataModelObjectPath.targetEntitySet;
|
|
57
56
|
const bIsDraftRoot = ModelHelper.isDraftRoot(currentEntitySet);
|
|
58
57
|
const bIsDraftNode = ModelHelper.isDraftNode(currentEntitySet);
|
|
59
|
-
const bIsDraftParentEntityForContainment = isNavigationProperty(dataModelObjectPath.targetObject) &&
|
|
58
|
+
const bIsDraftParentEntityForContainment = isNavigationProperty(dataModelObjectPath.targetObject) && dataModelObjectPath.targetObject?.containsTarget && (dataModelObjectPath.startingEntitySet?.annotations?.Common?.DraftRoot || dataModelObjectPath.startingEntitySet?.annotations?.Common?.DraftNode) ? true : false;
|
|
60
59
|
return bIsDraftRoot || bIsDraftNode || !currentEntitySet && bIsDraftParentEntityForContainment;
|
|
61
60
|
},
|
|
62
61
|
isMetaPathDraftSupported: function (dataModelObjectPath) {
|
|
@@ -74,8 +73,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
74
73
|
*/
|
|
75
74
|
isCollaborationDraftSupported: function (metaObject, templateInterface) {
|
|
76
75
|
if (!ModelHelper.disableCollaborationDraft) {
|
|
77
|
-
|
|
78
|
-
const oMetaModel = (templateInterface === null || templateInterface === void 0 ? void 0 : (_templateInterface$co = templateInterface.context) === null || _templateInterface$co === void 0 ? void 0 : _templateInterface$co.getModel()) || metaObject;
|
|
76
|
+
const oMetaModel = templateInterface?.context?.getModel() || metaObject;
|
|
79
77
|
const oEntityContainer = oMetaModel.getObject("/");
|
|
80
78
|
for (const sEntitySet in oEntityContainer) {
|
|
81
79
|
if (oEntityContainer[sEntitySet].$kind === "EntitySet" && oMetaModel.getObject(`/${sEntitySet}@com.sap.vocabularies.Common.v1.DraftRoot/ShareAction`)) {
|
|
@@ -93,14 +91,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
93
91
|
getDraftRootPath: function (oContext) {
|
|
94
92
|
const oMetaModel = oContext.getModel().getMetaModel();
|
|
95
93
|
const getRootPath = function (sPath, model) {
|
|
96
|
-
var _RegExp$exec;
|
|
97
94
|
let firstIteration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
98
|
-
const sIterationPath = firstIteration ? sPath :
|
|
95
|
+
const sIterationPath = firstIteration ? sPath : new RegExp(/.*(?=\/)/).exec(sPath)?.[0]; // *Regex to get the ancestor
|
|
99
96
|
if (sIterationPath && sIterationPath !== "/") {
|
|
100
|
-
var _mDataModel$targetEnt, _mDataModel$targetEnt2;
|
|
101
97
|
const sEntityPath = oMetaModel.getMetaPath(sIterationPath);
|
|
102
98
|
const mDataModel = MetaModelConverter.getInvolvedDataModelObjects(oMetaModel.getContext(sEntityPath));
|
|
103
|
-
if (
|
|
99
|
+
if (mDataModel.targetEntitySet?.annotations.Common?.DraftRoot) {
|
|
104
100
|
return sIterationPath;
|
|
105
101
|
}
|
|
106
102
|
return getRootPath(sIterationPath, model, false);
|
|
@@ -117,14 +113,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
117
113
|
getStickyRootPath: function (oContext) {
|
|
118
114
|
const oMetaModel = oContext.getModel().getMetaModel();
|
|
119
115
|
const getRootPath = function (sPath, model) {
|
|
120
|
-
var _RegExp$exec2;
|
|
121
116
|
let firstIteration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
122
|
-
const sIterationPath = firstIteration ? sPath :
|
|
117
|
+
const sIterationPath = firstIteration ? sPath : new RegExp(/.*(?=\/)/).exec(sPath)?.[0]; // *Regex to get the ancestor
|
|
123
118
|
if (sIterationPath && sIterationPath !== "/") {
|
|
124
|
-
var _mDataModel$targetEnt3, _mDataModel$targetEnt4, _mDataModel$targetEnt5;
|
|
125
119
|
const sEntityPath = oMetaModel.getMetaPath(sIterationPath);
|
|
126
120
|
const mDataModel = MetaModelConverter.getInvolvedDataModelObjects(oMetaModel.getContext(sEntityPath));
|
|
127
|
-
if (mDataModel.startingEntitySet === mDataModel.targetEntitySet &&
|
|
121
|
+
if (mDataModel.startingEntitySet === mDataModel.targetEntitySet && mDataModel.targetEntitySet?.annotations?.Session?.StickySessionSupported) {
|
|
128
122
|
return sIterationPath;
|
|
129
123
|
}
|
|
130
124
|
return getRootPath(sIterationPath, model, false);
|
|
@@ -369,8 +363,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
369
363
|
*/
|
|
370
364
|
isUpdateHidden: function (entitySet, entityType) {
|
|
371
365
|
if (isEntitySet(entitySet)) {
|
|
372
|
-
|
|
373
|
-
return ((_entitySet$annotation = entitySet.annotations.UI) === null || _entitySet$annotation === void 0 ? void 0 : _entitySet$annotation.UpdateHidden) ?? (entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio = entityType.annotations.UI) === null || _entityType$annotatio === void 0 ? void 0 : _entityType$annotatio.UpdateHidden);
|
|
366
|
+
return entitySet.annotations.UI?.UpdateHidden ?? entityType?.annotations.UI?.UpdateHidden;
|
|
374
367
|
}
|
|
375
368
|
},
|
|
376
369
|
/**
|
|
@@ -379,8 +372,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
379
372
|
* @returns DraftRoot
|
|
380
373
|
*/
|
|
381
374
|
getDraftRoot: function (entitySet) {
|
|
382
|
-
|
|
383
|
-
return isEntitySet(entitySet) ? (_entitySet$annotation2 = entitySet.annotations.Common) === null || _entitySet$annotation2 === void 0 ? void 0 : _entitySet$annotation2.DraftRoot : undefined;
|
|
375
|
+
return isEntitySet(entitySet) ? entitySet.annotations.Common?.DraftRoot : undefined;
|
|
384
376
|
},
|
|
385
377
|
/**
|
|
386
378
|
* Gets the @Common.DraftNode annotation if the argument is an EntitySet.
|
|
@@ -388,8 +380,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
388
380
|
* @returns DraftRoot
|
|
389
381
|
*/
|
|
390
382
|
getDraftNode: function (entitySet) {
|
|
391
|
-
|
|
392
|
-
return isEntitySet(entitySet) ? (_entitySet$annotation3 = entitySet.annotations.Common) === null || _entitySet$annotation3 === void 0 ? void 0 : _entitySet$annotation3.DraftNode : undefined;
|
|
383
|
+
return isEntitySet(entitySet) ? entitySet.annotations.Common?.DraftNode : undefined;
|
|
393
384
|
},
|
|
394
385
|
/**
|
|
395
386
|
* Helper method to get sticky session.
|
|
@@ -397,8 +388,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
397
388
|
* @returns Session StickySessionSupported
|
|
398
389
|
*/
|
|
399
390
|
getStickySession: function (entitySet) {
|
|
400
|
-
|
|
401
|
-
return isEntitySet(entitySet) ? (_entitySet$annotation4 = entitySet.annotations.Session) === null || _entitySet$annotation4 === void 0 ? void 0 : _entitySet$annotation4.StickySessionSupported : undefined;
|
|
391
|
+
return isEntitySet(entitySet) ? entitySet.annotations.Session?.StickySessionSupported : undefined;
|
|
402
392
|
},
|
|
403
393
|
/**
|
|
404
394
|
* Method to get the visibility state of delete button.
|
|
@@ -408,8 +398,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
408
398
|
*/
|
|
409
399
|
getDeleteHidden: function (entitySet, entityType) {
|
|
410
400
|
if (isEntitySet(entitySet)) {
|
|
411
|
-
|
|
412
|
-
return ((_entitySet$annotation5 = entitySet.annotations.UI) === null || _entitySet$annotation5 === void 0 ? void 0 : _entitySet$annotation5.DeleteHidden) ?? ((_entityType$annotatio2 = entityType.annotations.UI) === null || _entityType$annotatio2 === void 0 ? void 0 : _entityType$annotatio2.DeleteHidden);
|
|
401
|
+
return entitySet.annotations.UI?.DeleteHidden ?? entityType.annotations.UI?.DeleteHidden;
|
|
413
402
|
}
|
|
414
403
|
},
|
|
415
404
|
/**
|
|
@@ -424,7 +413,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
424
413
|
if (listBinding === rootBinding) {
|
|
425
414
|
metaPath = metamodel.getMetaPath(listBinding.getPath());
|
|
426
415
|
} else {
|
|
427
|
-
const rootBindingPath = rootBinding
|
|
416
|
+
const rootBindingPath = rootBinding?.getPath();
|
|
428
417
|
const relativePath = listBinding.getPath();
|
|
429
418
|
metaPath = metamodel.getMetaPath(`${rootBindingPath}/${relativePath}`);
|
|
430
419
|
}
|
|
@@ -442,9 +431,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
442
431
|
if (context && context.isTransient() !== true && annotationType === "@Common/ExternalID") {
|
|
443
432
|
const contextObject = context.getObject();
|
|
444
433
|
if (contextObject) {
|
|
445
|
-
var _metaPath$getMetaPath;
|
|
446
434
|
const metaPath = new MetaPath(convertTypes(odataModel.getMetaModel()), odataModel.getMetaModel().getMetaPath(context.getPath()), odataModel.getMetaModel().getMetaPath(context.getPath()));
|
|
447
|
-
const externalIdProperty =
|
|
435
|
+
const externalIdProperty = metaPath.getMetaPathForPath(propertyName)?.getTarget().annotations.Common?.ExternalID;
|
|
448
436
|
if (isPathAnnotationExpression(externalIdProperty)) {
|
|
449
437
|
return context.getObject(externalIdProperty.path);
|
|
450
438
|
} else {
|
|
@@ -468,16 +456,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
468
456
|
};
|
|
469
457
|
const [propertyName, annotationType] = path.split("@$ui5.fe.");
|
|
470
458
|
if (context && annotationType === "@Common/ExternalID") {
|
|
471
|
-
var _metaPath$getMetaPath2;
|
|
472
459
|
context.setProperty(propertyName, value);
|
|
473
460
|
// refreshing ExternalID and text properties (paths need to be determined generically)
|
|
474
461
|
const metaPath = new MetaPath(convertTypes(odataModel.getMetaModel()), odataModel.getMetaModel().getMetaPath(context.getPath()), odataModel.getMetaModel().getMetaPath(context.getPath()));
|
|
475
|
-
const externalIdProperty =
|
|
462
|
+
const externalIdProperty = metaPath.getMetaPathForPath(propertyName)?.getTarget().annotations.Common?.ExternalID;
|
|
476
463
|
if (isPathAnnotationExpression(externalIdProperty)) {
|
|
477
|
-
var _metaPath$getMetaPath3;
|
|
478
464
|
const externalIdPropPath = externalIdProperty.path;
|
|
479
465
|
const propertiesToRequest = [externalIdPropPath.substring(0, externalIdPropPath.lastIndexOf("/"))];
|
|
480
|
-
const textProperty =
|
|
466
|
+
const textProperty = metaPath.getMetaPathForPath(externalIdPropPath)?.getTarget().annotations.Common?.Text;
|
|
481
467
|
if (isPathAnnotationExpression(textProperty)) {
|
|
482
468
|
const textPropPath = textProperty.path;
|
|
483
469
|
if (textPropPath.includes("/")) {
|
|
@@ -506,12 +492,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
506
492
|
};
|
|
507
493
|
function clearAnnotationType(annotationTypes, dataSet) {
|
|
508
494
|
for (const contextPath in dataSet) {
|
|
509
|
-
var _context$isA;
|
|
510
495
|
// we added a context for accepting recommendations eventually.
|
|
511
496
|
// the context is a deeply nested object iterating over it cause the code the break
|
|
512
497
|
// hence we are skipping it here.
|
|
513
|
-
const context = dataSet
|
|
514
|
-
const isContext = context
|
|
498
|
+
const context = dataSet?.[contextPath];
|
|
499
|
+
const isContext = context?.isA?.("sap.ui.model.odata.v4.Context");
|
|
515
500
|
if (typeof context === "object" && !isContext) {
|
|
516
501
|
dataSet[contextPath] = clearAnnotationType(annotationTypes, dataSet[contextPath]);
|
|
517
502
|
if (Object.keys(dataSet[contextPath]).length === 0) {
|
|
@@ -541,8 +526,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
541
526
|
};
|
|
542
527
|
const fnBindProperty = odataModel.bindProperty.bind(odataModel);
|
|
543
528
|
odataModel.bindProperty = function (path, context, parameters) {
|
|
544
|
-
|
|
545
|
-
const recommendationFeatureDisabled = (_appComponent$getEnvi = appComponent.getEnvironmentCapabilities()) === null || _appComponent$getEnvi === void 0 ? void 0 : _appComponent$getEnvi.getCapabilities().DisableInputAssistance;
|
|
529
|
+
const recommendationFeatureDisabled = appComponent.getEnvironmentCapabilities()?.getCapabilities().DisableInputAssistance;
|
|
546
530
|
const recommendationPropertyBinding = ModelHelper.setUpRecommendationLocalModelBinding(this, fnBindProperty, path, context, recommendationFeatureDisabled);
|
|
547
531
|
if (recommendationPropertyBinding) {
|
|
548
532
|
return recommendationPropertyBinding;
|
|
@@ -571,7 +555,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
571
555
|
return model && model === odataModel;
|
|
572
556
|
};
|
|
573
557
|
if (path.includes("@$ui5.fe.virtual.")) {
|
|
574
|
-
var _ghostControl$getBind;
|
|
575
558
|
const expression = MetaModelConverter.getVirtualBindingExpression(path, MetaModelConverter.convertTypes(this.getMetaModel()));
|
|
576
559
|
const ghostControl = new Any({
|
|
577
560
|
any: compileExpression(expression),
|
|
@@ -579,19 +562,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
579
562
|
});
|
|
580
563
|
const fnDestroyPropertyBinding = propBinding.destroy.bind(propBinding);
|
|
581
564
|
propBinding.destroy = () => {
|
|
582
|
-
ghostControl
|
|
565
|
+
ghostControl?.destroy();
|
|
583
566
|
return fnDestroyPropertyBinding();
|
|
584
567
|
};
|
|
585
568
|
const fnSetContext = propBinding.setContext;
|
|
586
569
|
if (fnSetContext) {
|
|
587
570
|
propBinding.setContext = newContext => {
|
|
588
|
-
ghostControl
|
|
571
|
+
ghostControl?.setBindingContext(newContext);
|
|
589
572
|
return fnSetContext.bind(propBinding)(newContext);
|
|
590
573
|
};
|
|
591
574
|
}
|
|
592
575
|
ghostControl.setModel(this);
|
|
593
|
-
const ghostBinding =
|
|
594
|
-
const fnCheckUpdate = ghostBinding
|
|
576
|
+
const ghostBinding = ghostControl.getBindingInfo("any")?.binding;
|
|
577
|
+
const fnCheckUpdate = ghostBinding?.checkUpdate;
|
|
595
578
|
if (fnCheckUpdate) {
|
|
596
579
|
ghostControl.getBindingInfo("any").binding.checkUpdate = () => {
|
|
597
580
|
return fnCheckUpdate.bind(ghostBinding)(true);
|
|
@@ -621,14 +604,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
621
604
|
*/
|
|
622
605
|
fetchTextFromMetaModel(path, converterContext, metaModel) {
|
|
623
606
|
let text = path !== undefined ? path : "";
|
|
624
|
-
if (path
|
|
607
|
+
if (path?.startsWith("{metaModel>")) {
|
|
625
608
|
const metaModelPath = path.substring(11, path.length - 1);
|
|
626
609
|
try {
|
|
627
610
|
if (converterContext) {
|
|
628
|
-
|
|
629
|
-
text = ((_converterContext$get = converterContext.getEntityTypeAnnotation(metaModelPath).annotation) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.toString()) ?? "";
|
|
611
|
+
text = converterContext.getEntityTypeAnnotation(metaModelPath).annotation?.toString() ?? "";
|
|
630
612
|
} else {
|
|
631
|
-
text = metaModel
|
|
613
|
+
text = metaModel?.getObject(metaModelPath);
|
|
632
614
|
}
|
|
633
615
|
} catch (e) {
|
|
634
616
|
Log.info(`Unable to retrieve text from meta model using path ${metaModelPath}`);
|
|
@@ -643,10 +625,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
643
625
|
* @returns Returns the property path, or undefined if no Messages annotation is defined
|
|
644
626
|
*/
|
|
645
627
|
getMessagesPath: function (metaModel, contextPath) {
|
|
646
|
-
var _objectPath$targetEnt;
|
|
647
628
|
const metaContext = metaModel.getMetaContext(contextPath);
|
|
648
629
|
const objectPath = getInvolvedDataModelObjects(metaContext);
|
|
649
|
-
const messages =
|
|
630
|
+
const messages = objectPath.targetEntityType.annotations.Common?.Messages;
|
|
650
631
|
return isPathAnnotationExpression(messages) ? messages.path : undefined;
|
|
651
632
|
},
|
|
652
633
|
/**
|
|
@@ -675,7 +656,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
675
656
|
const fnSetContext = recommendationbinding.setContext;
|
|
676
657
|
if (fnSetContext) {
|
|
677
658
|
recommendationbinding.setContext = newContext => {
|
|
678
|
-
odataPropertyBinding
|
|
659
|
+
odataPropertyBinding?.setContext(newContext);
|
|
679
660
|
return fnSetContext.bind(odataPropertyBinding)(newContext);
|
|
680
661
|
};
|
|
681
662
|
}
|
|
@@ -687,12 +668,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
687
668
|
} = ModelHelper.validateRecommendationBindingPath(context, path);
|
|
688
669
|
if (recommendationComplexProperty && isRecommendedProperty && !recommendationFeatureDisabled) {
|
|
689
670
|
const alreadyBound = odataModel.virtualPropertyBindingRegistry.some(existingBinding => {
|
|
690
|
-
var _existingBinding$getC;
|
|
691
671
|
return (
|
|
692
672
|
// binding exists but the context can be destroyed sometimes because of discard and delete.
|
|
693
673
|
// hence we need to check if context exists or not before deciding if we already have a binding or not.
|
|
694
674
|
// TODO: We might want to clear the property binding when the contex is destroyed.
|
|
695
|
-
context.getPath() ===
|
|
675
|
+
context.getPath() === existingBinding.getContext()?.getPath() && recommendationComplexProperty === existingBinding.getPath()
|
|
696
676
|
);
|
|
697
677
|
});
|
|
698
678
|
if (!alreadyBound) {
|
|
@@ -742,18 +722,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
742
722
|
* @returns Recommendation property path for the entity related to the context and whether the bindingPath is relevant or not based on metadata.
|
|
743
723
|
*/
|
|
744
724
|
validateRecommendationBindingPath: function (context, bindingPath) {
|
|
745
|
-
var _targetEntityType$ann, _targetEntityType$ann2, _targetEntityType$ann3;
|
|
746
725
|
const metaModel = context.getModel().getMetaModel();
|
|
747
726
|
const contextMetaPath = metaModel.getMetaPath(context.getPath());
|
|
748
727
|
const metaContext = metaModel.getMetaContext(contextMetaPath);
|
|
749
728
|
const targetEntityType = getInvolvedDataModelObjects(metaContext).targetEntityType;
|
|
750
|
-
const recommendationComplexProperty = targetEntityType
|
|
729
|
+
const recommendationComplexProperty = targetEntityType?.annotations?.UI?.Recommendations?.path;
|
|
751
730
|
// sample binding - ShippingCondition@$ui5.fe.recommendations.placeholderValue
|
|
752
731
|
const propertyPath = bindingPath.split("@$ui5.fe.recommendations")[0];
|
|
753
732
|
const isRecommendedProperty = targetEntityType.entityProperties.some(entityProperty => {
|
|
754
733
|
if (entityProperty.name === recommendationComplexProperty) {
|
|
755
|
-
|
|
756
|
-
return entityProperty === null || entityProperty === void 0 ? void 0 : (_entityProperty$targe = entityProperty.targetType) === null || _entityProperty$targe === void 0 ? void 0 : _entityProperty$targe.properties.some(property => {
|
|
734
|
+
return entityProperty?.targetType?.properties.some(property => {
|
|
757
735
|
return propertyPath === property.name;
|
|
758
736
|
});
|
|
759
737
|
}
|
|
@@ -809,16 +787,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
809
787
|
getAlternateAndSecondaryKeys: (entityType, entitySet) => {
|
|
810
788
|
const alternateKeys = [];
|
|
811
789
|
const _fetchAlternateKeys = entityTypeOrSet => {
|
|
812
|
-
|
|
813
|
-
entityTypeOrSet === null || entityTypeOrSet === void 0 ? void 0 : (_entityTypeOrSet$anno = entityTypeOrSet.annotations) === null || _entityTypeOrSet$anno === void 0 ? void 0 : (_entityTypeOrSet$anno2 = _entityTypeOrSet$anno.Core) === null || _entityTypeOrSet$anno2 === void 0 ? void 0 : (_entityTypeOrSet$anno3 = _entityTypeOrSet$anno2.AlternateKeys) === null || _entityTypeOrSet$anno3 === void 0 ? void 0 : _entityTypeOrSet$anno3.forEach(alternateKey => {
|
|
790
|
+
entityTypeOrSet?.annotations?.Core?.AlternateKeys?.forEach(alternateKey => {
|
|
814
791
|
alternateKey.Key.forEach(key => {
|
|
815
792
|
alternateKeys.push(key.Name.value);
|
|
816
793
|
});
|
|
817
794
|
});
|
|
818
795
|
};
|
|
819
796
|
const _fetchSecondaryKeys = eT => {
|
|
820
|
-
|
|
821
|
-
eT === null || eT === void 0 ? void 0 : (_eT$annotations = eT.annotations) === null || _eT$annotations === void 0 ? void 0 : (_eT$annotations$Commo = _eT$annotations.Common) === null || _eT$annotations$Commo === void 0 ? void 0 : (_eT$annotations$Commo2 = _eT$annotations$Commo.SecondaryKey) === null || _eT$annotations$Commo2 === void 0 ? void 0 : _eT$annotations$Commo2.forEach(secondaryKey => {
|
|
797
|
+
eT?.annotations?.Common?.SecondaryKey?.forEach(secondaryKey => {
|
|
822
798
|
if (!alternateKeys.includes(secondaryKey.value)) {
|
|
823
799
|
alternateKeys.push(secondaryKey.value);
|
|
824
800
|
}
|
|
@@ -834,4 +810,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
|
|
|
834
810
|
};
|
|
835
811
|
return ModelHelper;
|
|
836
812
|
}, false);
|
|
837
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkIiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkMiIsIl9kYXRhTW9kZWxPYmplY3RQYXRoJDMiLCJfZGF0YU1vZGVsT2JqZWN0UGF0aCQ0IiwiX2RhdGFNb2RlbE9iamVjdFBhdGgkNSIsIl9kYXRhTW9kZWxPYmplY3RQYXRoJDYiLCJfZGF0YU1vZGVsT2JqZWN0UGF0aCQ3IiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJtZXRhT2JqZWN0IiwidGVtcGxhdGVJbnRlcmZhY2UiLCJfdGVtcGxhdGVJbnRlcmZhY2UkY28iLCJvTWV0YU1vZGVsIiwiY29udGV4dCIsImdldE1vZGVsIiwib0VudGl0eUNvbnRhaW5lciIsInNFbnRpdHlTZXQiLCJnZXREcmFmdFJvb3RQYXRoIiwib0NvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRSb290UGF0aCIsInNQYXRoIiwibW9kZWwiLCJfUmVnRXhwJGV4ZWMiLCJmaXJzdEl0ZXJhdGlvbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInNJdGVyYXRpb25QYXRoIiwiUmVnRXhwIiwiZXhlYyIsIl9tRGF0YU1vZGVsJHRhcmdldEVudCIsIl9tRGF0YU1vZGVsJHRhcmdldEVudDIiLCJzRW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwibURhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJfUmVnRXhwJGV4ZWMyIiwiX21EYXRhTW9kZWwkdGFyZ2V0RW50MyIsIl9tRGF0YU1vZGVsJHRhcmdldEVudDQiLCJfbURhdGFNb2RlbCR0YXJnZXRFbnQ1IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJvZGF0YU1ldGFNb2RlbCIsImVudGl0eVNldFBhdGgiLCJzcGxpdCIsImZpbHRlciIsImZpbHRlck91dE5hdlByb3BCaW5kaW5nIiwiam9pbiIsInBhdGhQYXJ0cyIsImluaXRpYWxQYXRoT2JqZWN0IiwiZ3Jvd2luZ1BhdGgiLCJwZW5kaW5nTmF2UHJvcEJpbmRpbmciLCJwYXRoT2JqZWN0IiwicmVkdWNlIiwicGF0aFVuZGVyQ29uc3RydWN0aW9uIiwicGF0aFBhcnQiLCJpZHgiLCJkZWxpbWl0ZXIiLCJ0ZW1wUGF0aCIsIm5hdlByb3BCaW5kaW5ncyIsIm5hdlByb3BCaW5kaW5nVG9DaGVjayIsIk9iamVjdCIsImtleXMiLCJoYXNPd25Qcm9wZXJ0eSIsInJlcGxhY2UiLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvRXZlbnRzIiwiY29udGV4dEJpbmRpbmciLCJhcHBseSIsImZuR2V0Qm91bmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib0JvdW5kQ29udGV4dCIsInNldFByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJwcm9wZXJ0eVBhdGhTcGxpdCIsImkiLCJnZXRQcm9wZXJ0eSIsImVuaGFuY2VVaUpTT05Nb2RlbCIsInVpTW9kZWwiLCJsaWJyYXJ5IiwiZm5TZXRQcm9wZXJ0eSIsImFzeW5jVXBkYXRlIiwiRWRpdE1vZGUiLCJFZGl0YWJsZSIsIkRpc3BsYXkiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsInZpZXdNb2RlbCIsImZuR2V0T2JqZWN0IiwiX2dldE9iamVjdCIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImFGaWx0ZXJGdW5jdGlvbnMiLCJpbmRleE9mIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwib01vZGVsIiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJjb250ZXh0UGF0aCIsInJvb3RFbnRpdHlTZXRQYXRoIiwiYVBhdGhzIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwib1ZpZXciLCJ2TGlzdEJpbmRpbmciLCJzTWV0YVBhdGgiLCJzdGFydHNXaXRoIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzUm9vdENvbnRleHRQYXRoIiwib0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInNSb290QmluZGluZ1BhdGgiLCJzUmVsYXRpdmVQYXRoIiwiZW50aXR5U2V0IiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiaXNTdGlja3kiLCJnZXRTdGlja3lTZXNzaW9uIiwiaXNVcGRhdGVIaWRkZW4iLCJlbnRpdHlUeXBlIiwiaXNFbnRpdHlTZXQiLCJfZW50aXR5U2V0JGFubm90YXRpb24iLCJfZW50aXR5VHlwZSRhbm5vdGF0aW8iLCJVSSIsIlVwZGF0ZUhpZGRlbiIsIl9lbnRpdHlTZXQkYW5ub3RhdGlvbjIiLCJfZW50aXR5U2V0JGFubm90YXRpb24zIiwiX2VudGl0eVNldCRhbm5vdGF0aW9uNCIsImdldERlbGV0ZUhpZGRlbiIsIl9lbnRpdHlTZXQkYW5ub3RhdGlvbjUiLCJfZW50aXR5VHlwZSRhbm5vdGF0aW8yIiwiRGVsZXRlSGlkZGVuIiwiZ2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nIiwibGlzdEJpbmRpbmciLCJtZXRhbW9kZWwiLCJtZXRhUGF0aCIsInJvb3RCaW5kaW5nIiwicm9vdEJpbmRpbmdQYXRoIiwicmVsYXRpdmVQYXRoIiwiZW5oYW5jZU9EYXRhTW9kZWwiLCJvZGF0YU1vZGVsIiwiYXBwQ29tcG9uZW50IiwidmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5IiwiQXJyYXkiLCJmbk1lc3NhZ2UiLCJzZXRNZXNzYWdlcyIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwiQmluZGluZ01vZGUiLCJPbmVXYXkiLCJiYXNlU2V0UHJvcGVydHkiLCJiYXNlR2V0UHJvcGVydHkiLCJwcm9wZXJ0eU5hbWUiLCJhbm5vdGF0aW9uVHlwZSIsImlzVHJhbnNpZW50IiwiY29udGV4dE9iamVjdCIsIl9tZXRhUGF0aCRnZXRNZXRhUGF0aCIsIk1ldGFQYXRoIiwiY29udmVydFR5cGVzIiwiZXh0ZXJuYWxJZFByb3BlcnR5IiwiZ2V0TWV0YVBhdGhGb3JQYXRoIiwiZ2V0VGFyZ2V0IiwiRXh0ZXJuYWxJRCIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiZnVsbFBhdGgiLCJfcmVmcmVzaExvY2FsTW9kZWwiLCJyZWZyZXNoIiwiX21ldGFQYXRoJGdldE1ldGFQYXRoMiIsIl9tZXRhUGF0aCRnZXRNZXRhUGF0aDMiLCJleHRlcm5hbElkUHJvcFBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJ0ZXh0UHJvcGVydHkiLCJUZXh0IiwidGV4dFByb3BQYXRoIiwiaW5jbHVkZXMiLCJwdXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwidGhlbiIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJwYXRoRnJvbVJvb3QiLCJjbGVhckFubm90YXRpb25UeXBlIiwiYW5ub3RhdGlvblR5cGVzIiwiZGF0YVNldCIsIl9jb250ZXh0JGlzQSIsImlzQ29udGV4dCIsImlzQSIsImNhbGwiLCJlbmRzV2l0aCIsIl9sb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwibWVzc2FnZXMiLCJjbGVhbmVkRGF0YSIsImdldERhdGEiLCJzZXREYXRhIiwibWVzc2FnZVRhcmdldCIsImdldFR5cGUiLCJnZXRNZXNzYWdlIiwiZm5CaW5kUHJvcGVydHkiLCJiaW5kUHJvcGVydHkiLCJiaW5kIiwicGFyYW1ldGVycyIsIl9hcHBDb21wb25lbnQkZ2V0RW52aSIsInJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJEaXNhYmxlSW5wdXRBc3Npc3RhbmNlIiwicmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmciLCJpbnRlcm5hbElkQmluZGluZyIsImV4dGVybmFsSWRCaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwicmVxdWVzdFZhbHVlIiwicHJvcEJpbmRpbmciLCJ1cGRhdGVSZXF1aXJlZCIsIl9naG9zdENvbnRyb2wkZ2V0QmluZCIsImV4cHJlc3Npb24iLCJnZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24iLCJnaG9zdENvbnRyb2wiLCJBbnkiLCJhbnkiLCJjb21waWxlRXhwcmVzc2lvbiIsImJpbmRCYWNrUHJvcGVydHkiLCJmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmciLCJkZXN0cm95IiwiZm5TZXRDb250ZXh0Iiwic2V0Q29udGV4dCIsIm5ld0NvbnRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsInNldE1vZGVsIiwiZ2hvc3RCaW5kaW5nIiwiZ2V0QmluZGluZ0luZm8iLCJiaW5kaW5nIiwiZm5DaGVja1VwZGF0ZSIsImNoZWNrVXBkYXRlIiwiZm5EZXN0cm95IiwidnBCaW5kaW5nIiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImNvbnZlcnRlckNvbnRleHQiLCJ0ZXh0IiwibWV0YU1vZGVsUGF0aCIsIl9jb252ZXJ0ZXJDb250ZXh0JGdldCIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiYW5ub3RhdGlvbiIsInRvU3RyaW5nIiwiZSIsImluZm8iLCJnZXRNZXNzYWdlc1BhdGgiLCJfb2JqZWN0UGF0aCR0YXJnZXRFbnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiTWVzc2FnZXMiLCJyZWNvbW1lbmRhdGlvbmJpbmRpbmciLCJzZXRDb250ZXh0T25SZWNvbW1lbmRhdGlvbkJpbmRpbmciLCJvZGF0YVByb3BlcnR5QmluZGluZyIsInJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5IiwiaXNSZWNvbW1lbmRlZFByb3BlcnR5IiwidmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoIiwiYWxyZWFkeUJvdW5kIiwic29tZSIsImV4aXN0aW5nQmluZGluZyIsIl9leGlzdGluZ0JpbmRpbmckZ2V0QyIsInNldFR5cGUiLCJSYXciLCJzZXRCaW5kaW5nTW9kZSIsImV2ZW50IiwicHJvcGVydHlCaW5kaW5nIiwiZ2V0U291cmNlIiwiY3VycmVudENvbnRleHQiLCJjb250ZXh0UmVjb21tZW5kYXRpb25zIiwiZ2V0VmFsdWUiLCJzZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiYmluZGluZ1BhdGgiLCJfdGFyZ2V0RW50aXR5VHlwZSRhbm4iLCJfdGFyZ2V0RW50aXR5VHlwZSRhbm4yIiwiX3RhcmdldEVudGl0eVR5cGUkYW5uMyIsImNvbnRleHRNZXRhUGF0aCIsIlJlY29tbWVuZGF0aW9ucyIsImVudGl0eVByb3BlcnRpZXMiLCJlbnRpdHlQcm9wZXJ0eSIsIm5hbWUiLCJfZW50aXR5UHJvcGVydHkkdGFyZ2UiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsInByb3BlcnR5IiwicmVjb21tZW5kZWRQcm9wZXJ0eSIsInByb3BlcnR5UmVjb21tZW5kYXRpb25zIiwibG9jYWxNb2RlbFBhdGgiLCJ0eXBlQWhlYWRWYWx1ZXMiLCJwcm9wZXJ0eVJlY29tbWVuZGF0aW9uIiwiUmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbiIsInBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCIsInBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCIsIlJlY29tbWVuZGVkRmllbGRWYWx1ZSIsIlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbiIsImdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJhbHRlcm5hdGVLZXlzIiwiX2ZldGNoQWx0ZXJuYXRlS2V5cyIsImVudGl0eVR5cGVPclNldCIsIl9lbnRpdHlUeXBlT3JTZXQkYW5ubyIsIl9lbnRpdHlUeXBlT3JTZXQkYW5ubzIiLCJfZW50aXR5VHlwZU9yU2V0JGFubm8zIiwiQ29yZSIsIkFsdGVybmF0ZUtleXMiLCJmb3JFYWNoIiwiYWx0ZXJuYXRlS2V5IiwiS2V5Iiwia2V5IiwiTmFtZSIsIl9mZXRjaFNlY29uZGFyeUtleXMiLCJlVCIsIl9lVCRhbm5vdGF0aW9ucyIsIl9lVCRhbm5vdGF0aW9ucyRDb21tbyIsIl9lVCRhbm5vdGF0aW9ucyRDb21tbzIiLCJTZWNvbmRhcnlLZXkiLCJzZWNvbmRhcnlLZXkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGF0IHJ1bnRpbWUgdG8gcmV0cmlldmUgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZWwgKi9cbmltcG9ydCB0eXBlIHsgQ29tcGxleFR5cGUsIEVudGl0eVNldCwgRW50aXR5VHlwZSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCwgU2luZ2xldG9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0Tm9kZSwgRHJhZnRSb290IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgQWx0ZXJuYXRlS2V5LCBQcm9wZXJ0eVJlZiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGlja3lTZXNzaW9uU3VwcG9ydGVkIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9TZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZUhpZGRlbiwgVXBkYXRlSGlkZGVuIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBBbnkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvblBhcmFtZXRlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBNZXRhUGF0aCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhUGF0aFwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQsIGlzTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IEJpbmRpbmdNb2RlIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ01vZGVcIjtcbmltcG9ydCB0eXBlIEJhc2VDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFJhdyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3R5cGUvUmF3XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCwgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhTGlzdEJpbmRpbmcgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcblxuLy8gVE9ETzogUmlnaHQgbm93IHJlY29tbWVuZGF0aW9ucyBpcyBub3QgcGFydCBvZiB0aGUgVUkgdm9jYWJ1bGFyeS5cbi8vIGhlbmNlIHdlIGFyZSBhZGRpbmcgaXQgdG8gdGhlIHR5cGUuXG4vLyBvbmNlIHRoaXMgYmVjb21lcyBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5IHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzLlxuZXhwb3J0IHR5cGUgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zID0gRW50aXR5VHlwZUFubm90YXRpb25zX1VJICYge1xuXHRSZWNvbW1lbmRhdGlvbnM/OiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHR9O1xufTtcblxuY29uc3QgTW9kZWxIZWxwZXIgPSB7XG5cdC8vIGdsb2JhbCBzd2l0Y2ggdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBieSBhIHByaXZhdGUgbWFuaWZlc3QgZmxhZ1xuXHQvLyB0aGlzIGFsbG93cyBjdXN0b21lcnMgdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBpbiBjYXNlIHdlIHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBmaXJzdCBkZWxpdmVyeVxuXHQvLyB0aGlzIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IFMvNCByZWxlYXNlXG5cdGRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQ6IGZhbHNlLFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgc3RpY2t5LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50aXR5Q29udGFpbmVyID0gbWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBlbnRpdHlTZXROYW1lIGluIGVudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbnRpdHlDb250YWluZXJbZW50aXR5U2V0TmFtZV0uJGtpbmQgPT09IFwiRW50aXR5U2V0XCIgJiZcblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBPRGF0YU1vZGVsTWV0YU1vZGVsIG9mIHRoZSBjb250ZXh0IGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhdGgpO1xuXHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhQ29udGV4dCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQob2JqZWN0UGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBkcmFmdCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHRcdCgoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHxcblx0XHRcdFx0KGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBmYWxzZTtcblxuXHRcdHJldHVybiBiSXNEcmFmdFJvb3QgfHwgYklzRHJhZnROb2RlIHx8ICghY3VycmVudEVudGl0eVNldCAmJiBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50KTtcblx0fSxcblxuXHRpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBNZXRhUGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLmdldENsb3Nlc3RFbnRpdHlTZXQoKSBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNlcnZpY2UsIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQuXG5cdCAqIEBwYXJhbSBtZXRhT2JqZWN0IE1ldGFPYmplY3QgdG8gYmUgdXNlZCBmb3IgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UgQVBJIHByb3ZpZGVkIGJ5IFVJNSB0ZW1wbGF0aW5nIGlmIHVzZWRcblx0ICogQHBhcmFtIHRlbXBsYXRlSW50ZXJmYWNlLmNvbnRleHQgQ29udGV4dCBvZiB0aGUgdGVtcGxhdGVcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU9iamVjdDogdW5rbm93biwgdGVtcGxhdGVJbnRlcmZhY2U/OiB7IGNvbnRleHQ6IENvbnRleHQgfSk6IGJvb2xlYW4ge1xuXHRcdGlmICghTW9kZWxIZWxwZXIuZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9ICh0ZW1wbGF0ZUludGVyZmFjZT8uY29udGV4dD8uZ2V0TW9kZWwoKSB8fCBtZXRhT2JqZWN0KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0XHRmb3IgKGNvbnN0IHNFbnRpdHlTZXQgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzRW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBEcmFmdFJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZHJhZnRSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRyYWZ0Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0RHJhZnRSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFN0aWNreVJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldFN0aWNreVJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtRGF0YU1vZGVsLnN0YXJ0aW5nRW50aXR5U2V0ID09PSBtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0XHRcdChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRsZXQgcGF0aCA9IHRoaXMuZ2V0UGF0aCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTsgLy8gUmVtb3ZlIHNsYXNoIGlmIGl0IGlzIGF0IHRoZSBlbmRcblx0XHRcdFx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IGAke3BhdGh9LyR7cHJvcGVydHlQYXRoU3BsaXRbaV19YDtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0TW9kZWwoKS5nZXRQcm9wZXJ0eShwYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwYXRoLCB7fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBjb250ZXh0QmluZGluZztcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGhhbmRsZXIgb24gcHJvcGVydHlDaGFuZ2UuXG5cdCAqIFRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiIGlzIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHByb3BlcnR5ICcvaXNFZGl0YWJsZScgd2hlbiB0aGlzIGxhc3Qgb25lIGlzIHNldFxuXHQgKiBpbiBvcmRlciB0byBiZSBjb21wbGlhbnQgd2l0aCBmb3JtZXIgdmVyc2lvbnMgd2hlcmUgYnVpbGRpbmcgYmxvY2tzIHVzZSB0aGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIlxuXHQgKiBAcGFyYW0gdWlNb2RlbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqIEBwYXJhbSBsaWJyYXJ5IENvcmUgbGlicmFyeSBvZiBTQVAgRmlvcmkgZWxlbWVudHNcblx0ICovXG5cblx0ZW5oYW5jZVVpSlNPTk1vZGVsOiBmdW5jdGlvbiAodWlNb2RlbDogSlNPTk1vZGVsLCBsaWJyYXJ5OiB7IEVkaXRNb2RlOiB7IEVkaXRhYmxlOiBzdHJpbmc7IERpc3BsYXk6IHN0cmluZyB9IH0pOiB2b2lkIHtcblx0XHRjb25zdCBmblNldFByb3BlcnR5ID0gdWlNb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHR1aU1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRcdFx0cGF0aDogc3RyaW5nLFxuXHRcdFx0dmFsdWU6IHVua25vd24sXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRcdGFzeW5jVXBkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cdFx0KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAocGF0aCA9PT0gXCIvaXNFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvZWRpdE1vZGVcIiwgdmFsdWUgPyBsaWJyYXJ5LkVkaXRNb2RlLkVkaXRhYmxlIDogbGlicmFyeS5FZGl0TW9kZS5EaXNwbGF5LCBjb250ZXh0LCBhc3luY1VwZGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgdmFsdWUsIGNvbnRleHQsIGFzeW5jVXBkYXRlXSk7XG5cdFx0fTtcblx0fSxcblxuXHRlbmhhbmNlVmlld0pTT05Nb2RlbDogZnVuY3Rpb24gKHZpZXdNb2RlbDogSlNPTk1vZGVsICYgeyBfZ2V0T2JqZWN0OiBGdW5jdGlvbiB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5HZXRPYmplY3QgPSB2aWV3TW9kZWwuX2dldE9iamVjdDtcblx0XHR2aWV3TW9kZWwuX2dldE9iamVjdCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiB1bmtub3duIHtcblx0XHRcdGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoID0gXCIvXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5HZXRPYmplY3QuYXBwbHkodGhpcywgW3NQYXRoLCBvQ29udGV4dF0pO1xuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG5cdCAqL1xuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmU6IGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHVuZGVmaW5lZCB8IGJvb2xlYW4ge1xuXHRcdGlmICghb01ldGFNb2RlbCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgYUZpbHRlckZ1bmN0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL0BPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlckZ1bmN0aW9uc1wiKTtcblx0XHQvLyBHZXQgZmlsdGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGF0IEVudGl0eUNvbnRhaW5lciBhbmQgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiAndG9sb3dlcidcblx0XHRyZXR1cm4gYUZpbHRlckZ1bmN0aW9ucyA/IGFGaWx0ZXJGdW5jdGlvbnMuaW5kZXhPZihcInRvbG93ZXJcIikgPT09IC0xIDogdHJ1ZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBtZXRhcGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqL1xuXHRnZXRNZXRhUGF0aEZvckNvbnRleHQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gb01ldGFNb2RlbCAmJiBzUGF0aCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIE1ldGFQYXRoIHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcm9vdCBlbnRpdHkgc2V0IHBhdGguXG5cdCAqL1xuXHRnZXRSb290RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKGNvbnRleHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCByb290RW50aXR5U2V0UGF0aCA9IFwiXCI7XG5cdFx0Y29uc3QgYVBhdGhzID0gY29udGV4dFBhdGggPyBjb250ZXh0UGF0aC5zcGxpdChcIi9cIikgOiBbXTtcblx0XHRpZiAoYVBhdGhzLmxlbmd0aCA+IDEpIHtcblx0XHRcdHJvb3RFbnRpdHlTZXRQYXRoID0gYVBhdGhzWzFdO1xuXHRcdH1cblx0XHRyZXR1cm4gcm9vdEVudGl0eVNldFBhdGg7XG5cdH0sXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBsaXN0QmluZGluZy5cblx0ICogQHBhcmFtIG9WaWV3IFZpZXcgb2YgdGhlIGNvbnRyb2wgdXNpbmcgbGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBsaXN0YmluZGluZy5cblx0ICovXG5cdGdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBGRVZpZXcsIHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblxuXHRcdGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAodkxpc3RCaW5kaW5nLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdC8vIGFic29sdXRlIHBhdGhcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aCh2TGlzdEJpbmRpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdENvbnRleHRQYXRofS8ke3ZMaXN0QmluZGluZ31gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gd2UgYWxyZWFkeSBnZXQgYSBsaXN0IGJpbmRpbmcgdXNlIHRoaXMgb25lXG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9CaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0XHRpZiAob0JpbmRpbmcgPT09IG9Sb290QmluZGluZykge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0JpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgc1Jvb3RCaW5kaW5nUGF0aCA9IG9Sb290QmluZGluZyEuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgcm9vdFxuXHQgKi9cblx0aXNEcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdFJvb3QoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZS5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCBub2RlXG5cdCAqL1xuXHRpc0RyYWZ0Tm9kZTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldERyYWZ0Tm9kZShlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHN0aWNreSBzZXNzaW9uIHJvb3Rcblx0ICovXG5cdGlzU3RpY2t5OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGlja3lTZXNzaW9uKGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiBlbnRpdHkgaXMgdXBkYXRhYmxlIG9yIG5vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHVwZGF0YWJsZSBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1VwZGF0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogVXBkYXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuID8/IGVudGl0eVR5cGU/LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0aGUgQENvbW1vbi5EcmFmdFJvb3QgYW5ub3RhdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gRW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBEcmFmdFJvb3Rcblx0ICovXG5cdGdldERyYWZ0Um9vdDogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IERyYWZ0Um9vdCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnROb2RlIGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdE5vZGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnROb2RlIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGlja3kgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgU2Vzc2lvbiBTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqL1xuXHRnZXRTdGlja3lTZXNzaW9uOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHlUeXBlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZGVsZXRlIGJ1dHRvbiBpcyBoaWRkZW5cblx0ICovXG5cdGdldERlbGV0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRGVsZXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uRGVsZXRlSGlkZGVuID8/IGVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbjtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG1ldGFwYXRoIGZvciB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIE1ldGFQYXRoXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZVBhdGhGcm9tTGlzdEJpbmRpbmcobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IG1ldGFQYXRoO1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRpZiAobGlzdEJpbmRpbmcgPT09IHJvb3RCaW5kaW5nKSB7XG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByb290QmluZGluZ1BhdGggPSByb290QmluZGluZz8uZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgoYCR7cm9vdEJpbmRpbmdQYXRofS8ke3JlbGF0aXZlUGF0aH1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1ldGFQYXRoO1xuXHR9LFxuXG5cdGVuaGFuY2VPRGF0YU1vZGVsKG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogdm9pZCB7XG5cdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkgPSBuZXcgQXJyYXk8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KCk7XG5cdFx0Y29uc3QgZm5NZXNzYWdlID0gb2RhdGFNb2RlbC5zZXRNZXNzYWdlcztcblx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERlZmF1bHRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdGNvbnN0IGJhc2VTZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5O1xuXHRcdGNvbnN0IGJhc2VHZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5O1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXG5cdFx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dE9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChjb250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdFx0XHRcdD8uRXh0ZXJuYWxJRDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXh0ZXJuYWxJZFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoY29udGV4dCAmJiBhbm5vdGF0aW9uVHlwZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJhc2VHZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgY29udGV4dF0pO1xuXHRcdH07XG5cblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGUpOiBib29sZWFuIHtcblx0XHRcdGxldCBmdWxsUGF0aCA9IHBhdGg7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRmdWxsUGF0aCA9IGNvbnRleHQuZ2V0UGF0aChwYXRoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IF9yZWZyZXNoTG9jYWxNb2RlbCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblx0XHRcdGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdC8vIHJlZnJlc2hpbmcgRXh0ZXJuYWxJRCBhbmQgdGV4dCBwcm9wZXJ0aWVzIChwYXRocyBuZWVkIHRvIGJlIGRldGVybWluZWQgZ2VuZXJpY2FsbHkpXG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKS5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BQYXRoID0gZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtleHRlcm5hbElkUHJvcFBhdGguc3Vic3RyaW5nKDAsIGV4dGVybmFsSWRQcm9wUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSWRQcm9wUGF0aCkuZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0ZXh0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcFBhdGggPSB0ZXh0UHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRcdGlmICh0ZXh0UHJvcFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QucHVzaCh0ZXh0UHJvcFBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMocHJvcGVydGllc1RvUmVxdWVzdClcblx0XHRcdFx0XHRcdC50aGVuKF9yZWZyZXNoTG9jYWxNb2RlbClcblx0XHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IGZ1bGxQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0bGV0IHBhdGhGcm9tUm9vdCA9IFwiXCI7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRwYXRoRnJvbVJvb3QgKz0gXCIvXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEZyb21Sb290ICs9IHByb3BlcnR5UGF0aFNwbGl0W2ldO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QocGF0aEZyb21Sb290KSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aEZyb21Sb290LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBiYXNlU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdFx0ZnVuY3Rpb24gY2xlYXJBbm5vdGF0aW9uVHlwZShhbm5vdGF0aW9uVHlwZXM6IHN0cmluZ1tdLCBkYXRhU2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnRleHRQYXRoIGluIGRhdGFTZXQpIHtcblx0XHRcdFx0Ly8gd2UgYWRkZWQgYSBjb250ZXh0IGZvciBhY2NlcHRpbmcgcmVjb21tZW5kYXRpb25zIGV2ZW50dWFsbHkuXG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGEgZGVlcGx5IG5lc3RlZCBvYmplY3QgaXRlcmF0aW5nIG92ZXIgaXQgY2F1c2UgdGhlIGNvZGUgdGhlIGJyZWFrXG5cdFx0XHRcdC8vIGhlbmNlIHdlIGFyZSBza2lwcGluZyBpdCBoZXJlLlxuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gZGF0YVNldD8uW2NvbnRleHRQYXRoXSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0Y29uc3QgaXNDb250ZXh0ID0gY29udGV4dD8uaXNBPy4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBjb250ZXh0ID09PSBcIm9iamVjdFwiICYmICFpc0NvbnRleHQpIHtcblx0XHRcdFx0XHRkYXRhU2V0W2NvbnRleHRQYXRoXSA9IGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzLCBkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGRhdGFTZXRbY29udGV4dFBhdGhdIGFzIG9iamVjdCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YVNldFtjb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgYW5ub3RhdGlvblR5cGUgb2YgYW5ub3RhdGlvblR5cGVzKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRQYXRoLmVuZHNXaXRoKGFubm90YXRpb25UeXBlKSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRhdGFTZXQ7XG5cdFx0fVxuXHRcdG9kYXRhTW9kZWwuX2xvY2FsQW5ub3RhdGlvbk1vZGVsID0gbG9jYWxBbm5vdGF0aW9uTW9kZWw7XG5cdFx0b2RhdGFNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCA9IGZ1bmN0aW9uICgpOiBKU09OTW9kZWwge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdH07XG5cdFx0b2RhdGFNb2RlbC5zZXRNZXNzYWdlcyA9IGZ1bmN0aW9uIChtZXNzYWdlczogUmVjb3JkPHN0cmluZywgTWVzc2FnZVtdPik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY2xlYW5lZERhdGEgPSBjbGVhckFubm90YXRpb25UeXBlKFtcIkAkdWk1LmZlLm1lc3NhZ2VUeXBlXCIsIFwiQCR1aTUuZmUubWVzc2FnZVRleHRcIl0sIHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmdldERhdGEoKSk7XG5cdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5zZXREYXRhKGNsZWFuZWREYXRhKTtcblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZVRhcmdldCBpbiBtZXNzYWdlcykge1xuXHRcdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShgJHttZXNzYWdlVGFyZ2V0fUAkdWk1LmZlLm1lc3NhZ2VUeXBlYCwgbWVzc2FnZXNbbWVzc2FnZVRhcmdldF1bMF0uZ2V0VHlwZSgpKTtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVGV4dGAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldE1lc3NhZ2UoKSk7XG5cdFx0XHR9XG5cdFx0XHRmbk1lc3NhZ2UuYXBwbHkodGhpcywgW21lc3NhZ2VzXSk7XG5cdFx0fTtcblx0XHRjb25zdCBmbkJpbmRQcm9wZXJ0eSA9IG9kYXRhTW9kZWwuYmluZFByb3BlcnR5LmJpbmQob2RhdGFNb2RlbCk7XG5cdFx0b2RhdGFNb2RlbC5iaW5kUHJvcGVydHkgPSBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgcGFyYW1ldGVycyk6IE9EYXRhUHJvcGVydHlCaW5kaW5nIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkID0gYXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpLkRpc2FibGVJbnB1dEFzc2lzdGFuY2U7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyA9IE1vZGVsSGVscGVyLnNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyhcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0Zm5CaW5kUHJvcGVydHksXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpICYmIGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxJZEJpbmRpbmcgPSBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkucHVzaChpbnRlcm5hbElkQmluZGluZyk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIHVua25vd24gYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmc7XG5cblx0XHRcdFx0aW50ZXJuYWxJZEJpbmRpbmcuYXR0YWNoQ2hhbmdlKCgpID0+IHtcblx0XHRcdFx0XHRleHRlcm5hbElkQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZ1xuXHRcdFx0XHRcdC5yZXF1ZXN0VmFsdWUoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBleHRlcm5hbElkQmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmluY2x1ZGVzKFwiQCR1aTUuZmUuXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdHNldENvbnRleHQ/OiBGdW5jdGlvbjtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguZW5kc1dpdGgoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcEJpbmRpbmcudXBkYXRlUmVxdWlyZWQgPSBmdW5jdGlvbiAobW9kZWw6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBtb2RlbCAmJiBtb2RlbCA9PT0gb2RhdGFNb2RlbDtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS52aXJ0dWFsLlwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGV4cHJlc3Npb24gPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0VmlydHVhbEJpbmRpbmdFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXModGhpcy5nZXRNZXRhTW9kZWwoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0Q29udHJvbCA9IG5ldyBBbnkoeyBhbnk6IGNvbXBpbGVFeHByZXNzaW9uKGV4cHJlc3Npb24pLCBiaW5kQmFja1Byb3BlcnR5OiBwYXRoIH0pO1xuXHRcdFx0XHRcdGNvbnN0IGZuRGVzdHJveVByb3BlcnR5QmluZGluZyA9IHByb3BCaW5kaW5nLmRlc3Ryb3kuYmluZChwcm9wQmluZGluZyk7XG5cdFx0XHRcdFx0cHJvcEJpbmRpbmcuZGVzdHJveSA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdGdob3N0Q29udHJvbD8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuRGVzdHJveVByb3BlcnR5QmluZGluZygpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcHJvcEJpbmRpbmcuc2V0Q29udGV4dDtcblx0XHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRwcm9wQmluZGluZy5zZXRDb250ZXh0ID0gKG5ld0NvbnRleHQ6IENvbnRleHQpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5zZXRCaW5kaW5nQ29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0Q29udGV4dC5iaW5kKHByb3BCaW5kaW5nKShuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldE1vZGVsKHRoaXMpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0QmluZGluZyA9IGdob3N0Q29udHJvbC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKT8uYmluZGluZztcblx0XHRcdFx0XHRjb25zdCBmbkNoZWNrVXBkYXRlID0gZ2hvc3RCaW5kaW5nPy5jaGVja1VwZGF0ZTtcblx0XHRcdFx0XHRpZiAoZm5DaGVja1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpLmJpbmRpbmcuY2hlY2tVcGRhdGUgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNoZWNrVXBkYXRlLmJpbmQoZ2hvc3RCaW5kaW5nKSh0cnVlKTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGdob3N0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5CaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdFx0fTtcblx0XHRjb25zdCBmbkRlc3Ryb3kgPSBvZGF0YU1vZGVsLmRlc3Ryb3kuYmluZChvZGF0YU1vZGVsKTtcblx0XHRvZGF0YU1vZGVsLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRmb3IgKGNvbnN0IHZwQmluZGluZyBvZiBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeSkge1xuXHRcdFx0XHR2cEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIGZuRGVzdHJveS5hcHBseSh0aGlzKTtcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogUmVzb2x2ZXMgYSBtZXRhZGF0YSBiaW5kaW5nIHRvIGl0cyB0ZXh0LCBlaXRoZXIgdXNpbmcgdGhlIGNvbnZlcnRlckNvbnRleHQgb3IgdGhlIG1ldGFNb2RlbCBkaXJlY3RseS5cblx0ICogQHBhcmFtIHBhdGhcblx0ICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcblx0ICogQHBhcmFtIG1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgdGV4dCBpZiBwb3NzaWJsZSwgZWxzZSB0aGUgaW5wdXQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIHdhcyB1bmRlZmluZWRcblx0ICovXG5cdGZldGNoVGV4dEZyb21NZXRhTW9kZWwocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0PzogQ29udmVydGVyQ29udGV4dDx1bmtub3duPiwgbWV0YU1vZGVsPzogTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgdGV4dCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHBhdGggOiBcIlwiO1xuXHRcdGlmIChwYXRoPy5zdGFydHNXaXRoKFwie21ldGFNb2RlbD5cIikpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbFBhdGggPSBwYXRoLnN1YnN0cmluZygxMSwgcGF0aC5sZW5ndGggLSAxKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24obWV0YU1vZGVsUGF0aCkuYW5ub3RhdGlvbj8udG9TdHJpbmcoKSA/PyBcIlwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRleHQgPSBtZXRhTW9kZWw/LmdldE9iamVjdChtZXRhTW9kZWxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRMb2cuaW5mbyhgVW5hYmxlIHRvIHJldHJpZXZlIHRleHQgZnJvbSBtZXRhIG1vZGVsIHVzaW5nIHBhdGggJHttZXRhTW9kZWxQYXRofWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGV4dDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gc3RhdGUgbWVzc2FnZXMuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIG1ldGFtb2RlbFxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGggUGF0aCBmb3IgdGhlIGNvbnRleHQgb24gd2hpY2ggd2Ugd2hhdCB0byByZXRyZWl2ZSB0aGUgbWVzc2FnZSBwYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBubyBNZXNzYWdlcyBhbm5vdGF0aW9uIGlzIGRlZmluZWRcblx0ICovXG5cdGdldE1lc3NhZ2VzUGF0aDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRcdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xuXHR9LFxuXHQvKipcblx0ICogU2V0dXAgcmVjb21tZW5kYXRpb24gbG9jYWwgYmluZGluZyB0byBtYWtlIHJlY29tbWVuZGF0aW9ucyBhY2Nlc3NpYmxlIHZpYSBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICpcblx0ICogUmVjb21tZW5kYXRpb25zIGlzIGEgY29tcGxleCBwcm9wZXJ0eS5cblx0ICogTW9kZWwgZG9lcyBub3QgcHJvdmlkZSBhbiBlYXN5IHdheSB0byBiaW5kIHRvIGNvbXBsZXggcHJvcGVydGllcy4gSXQgaGFzIDIgbWFqb3IgbGltaXRhdGlvbnMuXG5cdCAqXG5cdCAqIEl0IG9ubHkgc3VwcG9ydHMgb25lIHRpbWUgYmluZGluZyB0byBjb21wbGV4IHByb3BlcnRpZXMuIFRoaXMgaXMgbmVlZGVkIHRvIHNob3cgdXBkYXRlZCByZWNvbW1lbmRhdGlvbnMgb24gdGhlIFVJLlxuXHQgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmdzIHRvIHByb3BlcnRpZXMgaW5zaWRlIGEgY29tcGxleCBwcm9wZXJ0eSB3aGljaCBpcyBuZWVkZWQgZm9yIHJlY29tbWVuZGF0aW9ucy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdvcmthcm91bmQgdG8gb3ZlcmNvbWUgdGhlIGFib3ZlIHR3byBzaG9ydCBjb21pbmdzIGFuZFxuXHQgKiB0byBzdXBwb3J0IGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBvZGF0YU1vZGVsIFRoZSBvZGF0YSBtb2RlbCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIGZuQmluZFByb3BlcnR5IE9yaWdpbmFsIGJpbmQgcHJvcGVydHkgb2YgdGhlIG9EYXRhTW9kZWxcblx0ICogQHBhcmFtIHBhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkIEZsYWcgd2hpY2ggdG9nZ2xlcyB0aGUgcmVjb21tZW5kYXRpb24gZmVhdHVyZVxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBwYXRoIGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgdGhlIGJpbmRpbmdQYXRoIGlzIHJlbGV2YW50IG9yIG5vdCBiYXNlZCBvbiBtZXRhZGF0YS5cblx0ICovXG5cdHNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZzogZnVuY3Rpb24gKFxuXHRcdG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0Zm5CaW5kUHJvcGVydHk6IEZ1bmN0aW9uLFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZDogYm9vbGVhblxuXHQpOiBQcm9wZXJ0eUJpbmRpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmIChwYXRoLmluY2x1ZGVzKFwidWk1LmZlLnJlY29tbWVuZGF0aW9uc1wiKSkge1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25iaW5kaW5nID0gb2RhdGFNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0c2V0Q29udGV4dDogRnVuY3Rpb247XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nID0gKG9kYXRhUHJvcGVydHlCaW5kaW5nOiBPRGF0YVByb3BlcnR5QmluZGluZyAmIHsgc2V0Q29udGV4dDogRnVuY3Rpb24gfSk6IHZvaWQgPT4ge1xuXHRcdFx0XHQvL3dlIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGNvbnRleHQgaXMgc2V0IHRvIHRoZSBwcm9wZXJ0eWJpbmRpbmdcblx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQ7XG5cdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcuc2V0Q29udGV4dCA9IChuZXdDb250ZXh0OiBDb250ZXh0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZz8uc2V0Q29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldENvbnRleHQuYmluZChvZGF0YVByb3BlcnR5QmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGlzUmVjb21tZW5kZWRQcm9wZXJ0eSB9ID0gTW9kZWxIZWxwZXIudmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoKFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0cGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgJiYgaXNSZWNvbW1lbmRlZFByb3BlcnR5ICYmICFyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCkge1xuXHRcdFx0XHRcdGNvbnN0IGFscmVhZHlCb3VuZCA9IG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnNvbWUoKGV4aXN0aW5nQmluZGluZykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0Ly8gYmluZGluZyBleGlzdHMgYnV0IHRoZSBjb250ZXh0IGNhbiBiZSBkZXN0cm95ZWQgc29tZXRpbWVzIGJlY2F1c2Ugb2YgZGlzY2FyZCBhbmQgZGVsZXRlLlxuXHRcdFx0XHRcdFx0XHQvLyBoZW5jZSB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNvbnRleHQgZXhpc3RzIG9yIG5vdCBiZWZvcmUgZGVjaWRpbmcgaWYgd2UgYWxyZWFkeSBoYXZlIGEgYmluZGluZyBvciBub3QuXG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IFdlIG1pZ2h0IHdhbnQgdG8gY2xlYXIgdGhlIHByb3BlcnR5IGJpbmRpbmcgd2hlbiB0aGUgY29udGV4IGlzIGRlc3Ryb3llZC5cblx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRQYXRoKCkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSAmJlxuXHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSA9PT0gZXhpc3RpbmdCaW5kaW5nLmdldFBhdGgoKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIWFscmVhZHlCb3VuZCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2RhdGFQcm9wZXJ0eUJpbmRpbmcgPSBmbkJpbmRQcm9wZXJ0eShyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdC8vIEJlY3Vhc2UgcmVjb21tZW5kYXRpb25zIGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgbm90IGEgcHJpbWl0aXZlIHR5cGUgaGVuY2UgdXNlIGEgcmF3IHR5cGUuXG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5zZXRUeXBlKG5ldyBSYXcoKSwgXCJhbnlcIik7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5zZXRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkucHVzaChvZGF0YVByb3BlcnR5QmluZGluZyk7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5hdHRhY2hDaGFuZ2UoKGV2ZW50OiBPRGF0YVByb3BlcnR5QmluZGluZyRDaGFuZ2VFdmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZWZyZXNoIHRoZSBsb2NhbCBhbm5vdGF0aW9uIGJpbmRpbmcgb25jZSByZWNvbW1lbmRhdGlvbiBiaW5kaW5nIGlzIHVwZGF0ZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50Q29udGV4dCA9IGV2ZW50LmdldFNvdXJjZSgpLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dFJlY29tbWVuZGF0aW9ucyA9IHByb3BlcnR5QmluZGluZy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLnNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWwoY29udGV4dFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Ly8gcmV1ZXN0VmFsdWUgd2lsbCBhZGQgdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHRvIHRoZSAkc2VsZWN0XG5cdFx0XHRcdFx0XHQvLyBoZW5jZSB3ZSBkbyBub3QgbmVlZCB0byBhZGQgaXQgdG8gdGhlICRzZWxlY3Qgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGJpbmRpbmcgYXQgdmFyaW91cyBwbGFjZXMgKGZvcm1zLCB0YWJsZSBldGMuKVxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIlJlY29tbWVuZGF0aW9ucyBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRzZXRDb250ZXh0T25SZWNvbW1lbmRhdGlvbkJpbmRpbmcob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYmluZGluZyBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGJpbmRpbmcgaXMgY3JlYXRlZCBzbyB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgYmluZGluZyBjYW4gYmUgY3JlYXRlZC5cblx0XHRcdC8vXG5cdFx0XHQvLyBGb3IgdGhpcyB3ZSBuZWVkIHRvIG92ZXJyaWRlIHVwZGF0ZVJlcXVpcmVkIHNvIHRoYXQgdGhlIGJpbmRpbmcgaXMgdXBkYXRlZCB1bnRpbCBpdCBoYXMgbm90IHJlY2VpdmVkIGEgY29udGV4dFxuXHRcdFx0Ly8gcG9zdCB0aGF0IHdlIGRvIG5vdCBuZWVkIHRoZSBiaW5kaW5nIHRvIGJlIHVwZGF0ZWQuXG5cdFx0XHQvLyBJZiB3ZSByZW1vdmUgdGhlIHVwZGF0ZVJlcXVpcmVkIG92ZXJyaWRlIHRoZW4gcmVjb21tZW5kYXRpb25zIHdvcmsgZmluZSBieSBkdXJpbmcgc2F2ZSBvZiBhIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHdlIGdldCBiaW5kaW5nIHJlbGF0ZWQgaXNzdWVzLlxuXHRcdFx0Ly9cblx0XHRcdC8vIFVwZGF0aW5nIHRoZSBiaW5kaW5nIHRvIHJlY29tbWVuZGF0aW9ucyB3aWxsIGJlIGRvbmUgYnkgc2V0UHJvcGVydHkgb24gdGhlIGxvY2FsQW5ub3RhdGlvbk1vZGVsXG5cdFx0XHQvLyB3aGVuIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBpcyBhY3R1YWxseSB1cGRhdGVkLlxuXHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnVwZGF0ZVJlcXVpcmVkID0gZnVuY3Rpb24gKG1vZGVsOiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpID8gbW9kZWwgJiYgbW9kZWwgPT09IG9kYXRhTW9kZWwgOiBtb2RlbCAmJiB0aGlzLmdldE1vZGVsKCkgPT09IG1vZGVsO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbmJpbmRpbmc7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVmFsaWRhdGVzIGJhc2VkIG9uIG1ldGFkYXRhIHdoZXRoZXIgYSBnaXZlbiBiaW5kaW5nIHNob3VsZCBkZWFsIHdpdGggcmVjb21tZW5kYXRpb25zIG9yIG5vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGF0aCBCaW5kaW5nIHBhdGggZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC5cblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHR2YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGg6IGZ1bmN0aW9uIChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRiaW5kaW5nUGF0aDogc3RyaW5nXG5cdCk6IHsgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDsgaXNSZWNvbW1lbmRlZFByb3BlcnR5OiBib29sZWFuIH0ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBjb250ZXh0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHRNZXRhUGF0aCk7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSA9ICh0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUkgYXMgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zKVxuXHRcdFx0Py5SZWNvbW1lbmRhdGlvbnM/LnBhdGg7XG5cdFx0Ly8gc2FtcGxlIGJpbmRpbmcgLSBTaGlwcGluZ0NvbmRpdGlvbkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYmluZGluZ1BhdGguc3BsaXQoXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIilbMF07XG5cdFx0Y29uc3QgaXNSZWNvbW1lbmRlZFByb3BlcnR5ID0gdGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLnNvbWUoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAoZW50aXR5UHJvcGVydHkubmFtZSA9PT0gcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIChlbnRpdHlQcm9wZXJ0eT8udGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMuc29tZSgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksXG5cdFx0XHRpc1JlY29tbWVuZGVkUHJvcGVydHlcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogVXBkYXRlIHJlY29tbWVuZGF0aW9uIGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGV4dFJlY29tbWVuZGF0aW9ucyBVcGRhdGVkIHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGN1cnJlbnRDb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gd2FzIHVwZGF0ZWQuXG5cdCAqL1xuXHRzZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsOiBmdW5jdGlvbiAoY29udGV4dFJlY29tbWVuZGF0aW9uczogUmVjb21tZW5kYXRpb25zLCBjdXJyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQpOiB2b2lkIHtcblx0XHRpZiAoY29udGV4dFJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0Zm9yIChjb25zdCByZWNvbW1lbmRlZFByb3BlcnR5IGluIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgPSBjb250ZXh0UmVjb21tZW5kYXRpb25zW3JlY29tbWVuZGVkUHJvcGVydHldO1xuXHRcdFx0XHRjb25zdCBsb2NhbE1vZGVsUGF0aCA9IHJlY29tbWVuZGVkUHJvcGVydHk7XG5cdFx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY3VycmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0XHRjb25zdCB0eXBlQWhlYWRWYWx1ZXMgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVJlY29tbWVuZGF0aW9uIG9mIHByb3BlcnR5UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Ly8gc2V0IHBsYWNlaG9sZGVyIGRlc2NyaXB0aW9uIGFuZCB2YWx1ZXNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly9sb2NhbEFubm90YXRpb25Nb2RlbC5cblx0XHRcdFx0XHQvLyBwdXNoIHRvcCAzIHJlY29tbWVuZGF0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dHlwZUFoZWFkVmFsdWVzLnB1c2gocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXByb3BlcnR5UmVjb21tZW5kYXRpb25zIHx8ICFwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkocGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoLCBudWxsLCBjdXJyZW50Q29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCwgXCJcIiwgY3VycmVudENvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dC5nZXRQYXRoKGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMudHlwZUFoZWFkVmFsdWVzXCIpLFxuXHRcdFx0XHRcdHR5cGVBaGVhZFZhbHVlcyxcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShjdXJyZW50Q29udGV4dC5nZXRQYXRoKFwicmVjb21tZW5kYXRpb25Db250ZXh0XCIpLCBjdXJyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgU2Vjb25kYXJ5S2V5cyBmcm9tIGVudGl0eXR5cGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIERhdGFtb2RlbCBvYmplY3Qgb2YgZW50aXR5VHlwZVxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IERhdGFtb2RlbCBvYmplY3Qgb2YgZW50aXR5U2V0XG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsdGVybmF0ZSBrZXlzXG5cdCAqL1xuXHRnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzOiAoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgZW50aXR5U2V0OiBFbnRpdHlTZXQpOiBzdHJpbmdbXSA9PiB7XG5cdFx0Y29uc3QgYWx0ZXJuYXRlS2V5czogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBfZmV0Y2hBbHRlcm5hdGVLZXlzID0gKGVudGl0eVR5cGVPclNldDogRW50aXR5U2V0IHwgRW50aXR5VHlwZSk6IHZvaWQgPT4ge1xuXHRcdFx0ZW50aXR5VHlwZU9yU2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uQWx0ZXJuYXRlS2V5cz8uZm9yRWFjaCgoYWx0ZXJuYXRlS2V5OiBBbHRlcm5hdGVLZXkpID0+IHtcblx0XHRcdFx0YWx0ZXJuYXRlS2V5LktleS5mb3JFYWNoKChrZXk6IFByb3BlcnR5UmVmKSA9PiB7XG5cdFx0XHRcdFx0YWx0ZXJuYXRlS2V5cy5wdXNoKGtleS5OYW1lLnZhbHVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IF9mZXRjaFNlY29uZGFyeUtleXMgPSAoZVQ6IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVUPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZWNvbmRhcnlLZXk/LmZvckVhY2goKHNlY29uZGFyeUtleTogUHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdGlmICghYWx0ZXJuYXRlS2V5cy5pbmNsdWRlcyhzZWNvbmRhcnlLZXkudmFsdWUpKSB7XG5cdFx0XHRcdFx0YWx0ZXJuYXRlS2V5cy5wdXNoKHNlY29uZGFyeUtleS52YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0X2ZldGNoQWx0ZXJuYXRlS2V5cyhlbnRpdHlTZXQpO1xuXHRcdGlmICghYWx0ZXJuYXRlS2V5cy5sZW5ndGgpIHtcblx0XHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5VHlwZSk7XG5cdFx0fVxuXHRcdF9mZXRjaFNlY29uZGFyeUtleXMoZW50aXR5VHlwZSk7XG5cdFx0cmV0dXJuIGFsdGVybmF0ZUtleXM7XG5cdH1cbn07XG5cbnR5cGUgUmVjb21tZW5kYXRpb25zID0gUmVjb3JkPHN0cmluZywgUmVjb21tZW5kYXRpb25EZXRhaWxzW10+O1xudHlwZSBSZWNvbW1lbmRhdGlvbkRldGFpbHMgPSB7XG5cdFJlY29tbWVuZGVkRmllbGRWYWx1ZTogc3RyaW5nO1xuXHRSZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uOiBib29sZWFuO1xuXHRSZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb246IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEludGVybmFsTW9kZWxDb250ZXh0ID0geyBnZXRNb2RlbCgpOiBKU09OTW9kZWwgfSAmIEJhc2VDb250ZXh0ICYge1xuXHRcdHNldFByb3BlcnR5KHNQYXRoOiBzdHJpbmcsIHZWYWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cdH07XG5cbmV4cG9ydCBkZWZhdWx0IE1vZGVsSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0VBQUE7RUFtQ0E7RUFDQTtFQUNBOztFQU9BLE1BQU1BLFdBQVcsR0FBRztJQUNuQjtJQUNBO0lBQ0E7SUFDQUMseUJBQXlCLEVBQUUsS0FBSztJQUNoQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHdCQUF3QixFQUFFLFNBQUFBLENBQVVDLFNBQXlCLEVBQVc7TUFDdkUsTUFBTUMsZUFBZSxHQUFHRCxTQUFTLENBQUNFLFNBQVMsQ0FBQyxHQUFHLENBQUM7TUFDaEQsS0FBSyxNQUFNQyxhQUFhLElBQUlGLGVBQWUsRUFBRTtRQUM1QyxJQUNDQSxlQUFlLENBQUNFLGFBQWEsQ0FBQyxDQUFDQyxLQUFLLEtBQUssV0FBVyxJQUNwREosU0FBUyxDQUFDRSxTQUFTLENBQUMsSUFBSUMsYUFBYSx5REFBeUQsQ0FBQyxFQUM5RjtVQUNELE9BQU8sSUFBSTtRQUNaO01BQ0Q7TUFDQSxPQUFPLEtBQUs7SUFDYixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLGdCQUFnQixFQUFFLFNBQUFBLENBQVVMLFNBQXlCLEVBQUVNLElBQVksRUFBVztNQUM3RSxNQUFNQyxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDRixJQUFJLENBQUM7TUFDbEQsTUFBTUcsVUFBVSxHQUFHQywyQkFBMkIsQ0FBd0JILFdBQVcsQ0FBQztNQUNsRixPQUFPLElBQUksQ0FBQ0ksMEJBQTBCLENBQUNGLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDRSwwQkFBMEIsRUFBRSxTQUFBQSxDQUFV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
|
|
813
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJtZXRhT2JqZWN0IiwidGVtcGxhdGVJbnRlcmZhY2UiLCJvTWV0YU1vZGVsIiwiY29udGV4dCIsImdldE1vZGVsIiwib0VudGl0eUNvbnRhaW5lciIsInNFbnRpdHlTZXQiLCJnZXREcmFmdFJvb3RQYXRoIiwib0NvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRSb290UGF0aCIsInNQYXRoIiwibW9kZWwiLCJmaXJzdEl0ZXJhdGlvbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInNJdGVyYXRpb25QYXRoIiwiUmVnRXhwIiwiZXhlYyIsInNFbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJtRGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZ2V0VGFyZ2V0RW50aXR5U2V0Iiwic0VudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwib2RhdGFNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwic3BsaXQiLCJmaWx0ZXIiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJwYXRoUGFydHMiLCJpbml0aWFsUGF0aE9iamVjdCIsImdyb3dpbmdQYXRoIiwicGVuZGluZ05hdlByb3BCaW5kaW5nIiwicGF0aE9iamVjdCIsInJlZHVjZSIsInBhdGhVbmRlckNvbnN0cnVjdGlvbiIsInBhdGhQYXJ0IiwiaWR4IiwiZGVsaW1pdGVyIiwidGVtcFBhdGgiLCJuYXZQcm9wQmluZGluZ3MiLCJuYXZQcm9wQmluZGluZ1RvQ2hlY2siLCJPYmplY3QiLCJrZXlzIiwiaGFzT3duUHJvcGVydHkiLCJyZXBsYWNlIiwiZ2V0QWN0aW9uUGFyYW1ldGVySXRlbXNNb2RlbFBhdGgiLCJvUGFyYW1ldGVyIiwiJE5hbWUiLCJzUGF0aFBhcnQiLCJlbmhhbmNlSW50ZXJuYWxKU09OTW9kZWwiLCJvSW50ZXJuYWxNb2RlbCIsImZuQmluZENvbnRleHQiLCJiaW5kQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwib0V2ZW50cyIsImNvbnRleHRCaW5kaW5nIiwiYXBwbHkiLCJmbkdldEJvdW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9Cb3VuZENvbnRleHQiLCJzZXRQcm9wZXJ0eSIsInByb3BlcnR5UGF0aCIsInZhbHVlIiwicHJvcGVydHlQYXRoU3BsaXQiLCJpIiwiZ2V0UHJvcGVydHkiLCJlbmhhbmNlVWlKU09OTW9kZWwiLCJ1aU1vZGVsIiwibGlicmFyeSIsImZuU2V0UHJvcGVydHkiLCJhc3luY1VwZGF0ZSIsIkVkaXRNb2RlIiwiRWRpdGFibGUiLCJEaXNwbGF5IiwiZW5oYW5jZVZpZXdKU09OTW9kZWwiLCJ2aWV3TW9kZWwiLCJmbkdldE9iamVjdCIsIl9nZXRPYmplY3QiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJhRmlsdGVyRnVuY3Rpb25zIiwiaW5kZXhPZiIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsIm9Nb2RlbCIsImdldFJvb3RFbnRpdHlTZXRQYXRoIiwiY29udGV4dFBhdGgiLCJyb290RW50aXR5U2V0UGF0aCIsImFQYXRocyIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIm9WaWV3Iiwidkxpc3RCaW5kaW5nIiwic01ldGFQYXRoIiwic3RhcnRzV2l0aCIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic1Jvb3RDb250ZXh0UGF0aCIsIm9CaW5kaW5nIiwib1Jvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzUm9vdEJpbmRpbmdQYXRoIiwic1JlbGF0aXZlUGF0aCIsImVudGl0eVNldCIsImdldERyYWZ0Um9vdCIsImdldERyYWZ0Tm9kZSIsImlzU3RpY2t5IiwiZ2V0U3RpY2t5U2Vzc2lvbiIsImlzVXBkYXRlSGlkZGVuIiwiZW50aXR5VHlwZSIsImlzRW50aXR5U2V0IiwiVUkiLCJVcGRhdGVIaWRkZW4iLCJnZXREZWxldGVIaWRkZW4iLCJEZWxldGVIaWRkZW4iLCJnZXRBYnNvbHV0ZVBhdGhGcm9tTGlzdEJpbmRpbmciLCJsaXN0QmluZGluZyIsIm1ldGFtb2RlbCIsIm1ldGFQYXRoIiwicm9vdEJpbmRpbmciLCJyb290QmluZGluZ1BhdGgiLCJyZWxhdGl2ZVBhdGgiLCJlbmhhbmNlT0RhdGFNb2RlbCIsIm9kYXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJ2aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkiLCJBcnJheSIsImZuTWVzc2FnZSIsInNldE1lc3NhZ2VzIiwibG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJKU09OTW9kZWwiLCJzZXREZWZhdWx0QmluZGluZ01vZGUiLCJCaW5kaW5nTW9kZSIsIk9uZVdheSIsImJhc2VTZXRQcm9wZXJ0eSIsImJhc2VHZXRQcm9wZXJ0eSIsInByb3BlcnR5TmFtZSIsImFubm90YXRpb25UeXBlIiwiaXNUcmFuc2llbnQiLCJjb250ZXh0T2JqZWN0IiwiTWV0YVBhdGgiLCJjb252ZXJ0VHlwZXMiLCJleHRlcm5hbElkUHJvcGVydHkiLCJnZXRNZXRhUGF0aEZvclBhdGgiLCJnZXRUYXJnZXQiLCJFeHRlcm5hbElEIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJmdWxsUGF0aCIsIl9yZWZyZXNoTG9jYWxNb2RlbCIsInJlZnJlc2giLCJleHRlcm5hbElkUHJvcFBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJ0ZXh0UHJvcGVydHkiLCJUZXh0IiwidGV4dFByb3BQYXRoIiwiaW5jbHVkZXMiLCJwdXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwidGhlbiIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJwYXRoRnJvbVJvb3QiLCJjbGVhckFubm90YXRpb25UeXBlIiwiYW5ub3RhdGlvblR5cGVzIiwiZGF0YVNldCIsImlzQ29udGV4dCIsImlzQSIsImVuZHNXaXRoIiwiX2xvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJtZXNzYWdlcyIsImNsZWFuZWREYXRhIiwiZ2V0RGF0YSIsInNldERhdGEiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0VHlwZSIsImdldE1lc3NhZ2UiLCJmbkJpbmRQcm9wZXJ0eSIsImJpbmRQcm9wZXJ0eSIsImJpbmQiLCJwYXJhbWV0ZXJzIiwicmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkRpc2FibGVJbnB1dEFzc2lzdGFuY2UiLCJyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyIsInNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyIsImludGVybmFsSWRCaW5kaW5nIiwiZXh0ZXJuYWxJZEJpbmRpbmciLCJhdHRhY2hDaGFuZ2UiLCJyZXF1ZXN0VmFsdWUiLCJwcm9wQmluZGluZyIsInVwZGF0ZVJlcXVpcmVkIiwiZXhwcmVzc2lvbiIsImdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbiIsImdob3N0Q29udHJvbCIsIkFueSIsImFueSIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZEJhY2tQcm9wZXJ0eSIsImZuRGVzdHJveVByb3BlcnR5QmluZGluZyIsImRlc3Ryb3kiLCJmblNldENvbnRleHQiLCJzZXRDb250ZXh0IiwibmV3Q29udGV4dCIsInNldEJpbmRpbmdDb250ZXh0Iiwic2V0TW9kZWwiLCJnaG9zdEJpbmRpbmciLCJnZXRCaW5kaW5nSW5mbyIsImJpbmRpbmciLCJmbkNoZWNrVXBkYXRlIiwiY2hlY2tVcGRhdGUiLCJmbkRlc3Ryb3kiLCJ2cEJpbmRpbmciLCJmZXRjaFRleHRGcm9tTWV0YU1vZGVsIiwiY29udmVydGVyQ29udGV4dCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsInRhcmdldEVudGl0eVR5cGUiLCJNZXNzYWdlcyIsInJlY29tbWVuZGF0aW9uYmluZGluZyIsInNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyIsIm9kYXRhUHJvcGVydHlCaW5kaW5nIiwicmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkiLCJpc1JlY29tbWVuZGVkUHJvcGVydHkiLCJ2YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgiLCJhbHJlYWR5Qm91bmQiLCJzb21lIiwiZXhpc3RpbmdCaW5kaW5nIiwic2V0VHlwZSIsIlJhdyIsInNldEJpbmRpbmdNb2RlIiwiZXZlbnQiLCJwcm9wZXJ0eUJpbmRpbmciLCJnZXRTb3VyY2UiLCJjdXJyZW50Q29udGV4dCIsImNvbnRleHRSZWNvbW1lbmRhdGlvbnMiLCJnZXRWYWx1ZSIsInNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nUGF0aCIsImNvbnRleHRNZXRhUGF0aCIsIlJlY29tbWVuZGF0aW9ucyIsImVudGl0eVByb3BlcnRpZXMiLCJlbnRpdHlQcm9wZXJ0eSIsIm5hbWUiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsInByb3BlcnR5IiwicmVjb21tZW5kZWRQcm9wZXJ0eSIsInByb3BlcnR5UmVjb21tZW5kYXRpb25zIiwibG9jYWxNb2RlbFBhdGgiLCJ0eXBlQWhlYWRWYWx1ZXMiLCJwcm9wZXJ0eVJlY29tbWVuZGF0aW9uIiwiUmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbiIsInBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCIsInBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCIsIlJlY29tbWVuZGVkRmllbGRWYWx1ZSIsIlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbiIsImdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJhbHRlcm5hdGVLZXlzIiwiX2ZldGNoQWx0ZXJuYXRlS2V5cyIsImVudGl0eVR5cGVPclNldCIsIkNvcmUiLCJBbHRlcm5hdGVLZXlzIiwiZm9yRWFjaCIsImFsdGVybmF0ZUtleSIsIktleSIsImtleSIsIk5hbWUiLCJfZmV0Y2hTZWNvbmRhcnlLZXlzIiwiZVQiLCJTZWNvbmRhcnlLZXkiLCJzZWNvbmRhcnlLZXkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGF0IHJ1bnRpbWUgdG8gcmV0cmlldmUgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZWwgKi9cbmltcG9ydCB0eXBlIHsgQ29tcGxleFR5cGUsIEVudGl0eVNldCwgRW50aXR5VHlwZSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCwgU2luZ2xldG9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0Tm9kZSwgRHJhZnRSb290IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgQWx0ZXJuYXRlS2V5LCBQcm9wZXJ0eVJlZiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGlja3lTZXNzaW9uU3VwcG9ydGVkIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9TZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZUhpZGRlbiwgVXBkYXRlSGlkZGVuIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBBbnkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvblBhcmFtZXRlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBNZXRhUGF0aCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhUGF0aFwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQsIGlzTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IEJpbmRpbmdNb2RlIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ01vZGVcIjtcbmltcG9ydCB0eXBlIEJhc2VDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFJhdyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3R5cGUvUmF3XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCwgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhTGlzdEJpbmRpbmcgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcblxuLy8gVE9ETzogUmlnaHQgbm93IHJlY29tbWVuZGF0aW9ucyBpcyBub3QgcGFydCBvZiB0aGUgVUkgdm9jYWJ1bGFyeS5cbi8vIGhlbmNlIHdlIGFyZSBhZGRpbmcgaXQgdG8gdGhlIHR5cGUuXG4vLyBvbmNlIHRoaXMgYmVjb21lcyBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5IHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzLlxuZXhwb3J0IHR5cGUgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zID0gRW50aXR5VHlwZUFubm90YXRpb25zX1VJICYge1xuXHRSZWNvbW1lbmRhdGlvbnM/OiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHR9O1xufTtcblxuY29uc3QgTW9kZWxIZWxwZXIgPSB7XG5cdC8vIGdsb2JhbCBzd2l0Y2ggdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBieSBhIHByaXZhdGUgbWFuaWZlc3QgZmxhZ1xuXHQvLyB0aGlzIGFsbG93cyBjdXN0b21lcnMgdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBpbiBjYXNlIHdlIHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBmaXJzdCBkZWxpdmVyeVxuXHQvLyB0aGlzIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IFMvNCByZWxlYXNlXG5cdGRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQ6IGZhbHNlLFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgc3RpY2t5LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50aXR5Q29udGFpbmVyID0gbWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBlbnRpdHlTZXROYW1lIGluIGVudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbnRpdHlDb250YWluZXJbZW50aXR5U2V0TmFtZV0uJGtpbmQgPT09IFwiRW50aXR5U2V0XCIgJiZcblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBPRGF0YU1vZGVsTWV0YU1vZGVsIG9mIHRoZSBjb250ZXh0IGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhdGgpO1xuXHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhQ29udGV4dCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQob2JqZWN0UGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBkcmFmdCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHRcdCgoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHxcblx0XHRcdFx0KGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBmYWxzZTtcblxuXHRcdHJldHVybiBiSXNEcmFmdFJvb3QgfHwgYklzRHJhZnROb2RlIHx8ICghY3VycmVudEVudGl0eVNldCAmJiBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50KTtcblx0fSxcblxuXHRpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBNZXRhUGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLmdldENsb3Nlc3RFbnRpdHlTZXQoKSBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNlcnZpY2UsIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQuXG5cdCAqIEBwYXJhbSBtZXRhT2JqZWN0IE1ldGFPYmplY3QgdG8gYmUgdXNlZCBmb3IgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UgQVBJIHByb3ZpZGVkIGJ5IFVJNSB0ZW1wbGF0aW5nIGlmIHVzZWRcblx0ICogQHBhcmFtIHRlbXBsYXRlSW50ZXJmYWNlLmNvbnRleHQgQ29udGV4dCBvZiB0aGUgdGVtcGxhdGVcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIGNvbGxhYm9yYXRpb24gZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU9iamVjdDogdW5rbm93biwgdGVtcGxhdGVJbnRlcmZhY2U/OiB7IGNvbnRleHQ6IENvbnRleHQgfSk6IGJvb2xlYW4ge1xuXHRcdGlmICghTW9kZWxIZWxwZXIuZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9ICh0ZW1wbGF0ZUludGVyZmFjZT8uY29udGV4dD8uZ2V0TW9kZWwoKSB8fCBtZXRhT2JqZWN0KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0XHRmb3IgKGNvbnN0IHNFbnRpdHlTZXQgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzRW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBEcmFmdFJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZHJhZnRSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRyYWZ0Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0RHJhZnRSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFN0aWNreVJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldFN0aWNreVJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtRGF0YU1vZGVsLnN0YXJ0aW5nRW50aXR5U2V0ID09PSBtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0XHRcdChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRsZXQgcGF0aCA9IHRoaXMuZ2V0UGF0aCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTsgLy8gUmVtb3ZlIHNsYXNoIGlmIGl0IGlzIGF0IHRoZSBlbmRcblx0XHRcdFx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IGAke3BhdGh9LyR7cHJvcGVydHlQYXRoU3BsaXRbaV19YDtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0TW9kZWwoKS5nZXRQcm9wZXJ0eShwYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwYXRoLCB7fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBjb250ZXh0QmluZGluZztcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGhhbmRsZXIgb24gcHJvcGVydHlDaGFuZ2UuXG5cdCAqIFRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiIGlzIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHByb3BlcnR5ICcvaXNFZGl0YWJsZScgd2hlbiB0aGlzIGxhc3Qgb25lIGlzIHNldFxuXHQgKiBpbiBvcmRlciB0byBiZSBjb21wbGlhbnQgd2l0aCBmb3JtZXIgdmVyc2lvbnMgd2hlcmUgYnVpbGRpbmcgYmxvY2tzIHVzZSB0aGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIlxuXHQgKiBAcGFyYW0gdWlNb2RlbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqIEBwYXJhbSBsaWJyYXJ5IENvcmUgbGlicmFyeSBvZiBTQVAgRmlvcmkgZWxlbWVudHNcblx0ICovXG5cblx0ZW5oYW5jZVVpSlNPTk1vZGVsOiBmdW5jdGlvbiAodWlNb2RlbDogSlNPTk1vZGVsLCBsaWJyYXJ5OiB7IEVkaXRNb2RlOiB7IEVkaXRhYmxlOiBzdHJpbmc7IERpc3BsYXk6IHN0cmluZyB9IH0pOiB2b2lkIHtcblx0XHRjb25zdCBmblNldFByb3BlcnR5ID0gdWlNb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHR1aU1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRcdFx0cGF0aDogc3RyaW5nLFxuXHRcdFx0dmFsdWU6IHVua25vd24sXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRcdGFzeW5jVXBkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cdFx0KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAocGF0aCA9PT0gXCIvaXNFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvZWRpdE1vZGVcIiwgdmFsdWUgPyBsaWJyYXJ5LkVkaXRNb2RlLkVkaXRhYmxlIDogbGlicmFyeS5FZGl0TW9kZS5EaXNwbGF5LCBjb250ZXh0LCBhc3luY1VwZGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgdmFsdWUsIGNvbnRleHQsIGFzeW5jVXBkYXRlXSk7XG5cdFx0fTtcblx0fSxcblxuXHRlbmhhbmNlVmlld0pTT05Nb2RlbDogZnVuY3Rpb24gKHZpZXdNb2RlbDogSlNPTk1vZGVsICYgeyBfZ2V0T2JqZWN0OiBGdW5jdGlvbiB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5HZXRPYmplY3QgPSB2aWV3TW9kZWwuX2dldE9iamVjdDtcblx0XHR2aWV3TW9kZWwuX2dldE9iamVjdCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiB1bmtub3duIHtcblx0XHRcdGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoID0gXCIvXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5HZXRPYmplY3QuYXBwbHkodGhpcywgW3NQYXRoLCBvQ29udGV4dF0pO1xuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG5cdCAqL1xuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmU6IGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHVuZGVmaW5lZCB8IGJvb2xlYW4ge1xuXHRcdGlmICghb01ldGFNb2RlbCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgYUZpbHRlckZ1bmN0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL0BPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlckZ1bmN0aW9uc1wiKTtcblx0XHQvLyBHZXQgZmlsdGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGF0IEVudGl0eUNvbnRhaW5lciBhbmQgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiAndG9sb3dlcidcblx0XHRyZXR1cm4gYUZpbHRlckZ1bmN0aW9ucyA/IGFGaWx0ZXJGdW5jdGlvbnMuaW5kZXhPZihcInRvbG93ZXJcIikgPT09IC0xIDogdHJ1ZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBtZXRhcGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqL1xuXHRnZXRNZXRhUGF0aEZvckNvbnRleHQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gb01ldGFNb2RlbCAmJiBzUGF0aCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIE1ldGFQYXRoIHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcm9vdCBlbnRpdHkgc2V0IHBhdGguXG5cdCAqL1xuXHRnZXRSb290RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKGNvbnRleHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCByb290RW50aXR5U2V0UGF0aCA9IFwiXCI7XG5cdFx0Y29uc3QgYVBhdGhzID0gY29udGV4dFBhdGggPyBjb250ZXh0UGF0aC5zcGxpdChcIi9cIikgOiBbXTtcblx0XHRpZiAoYVBhdGhzLmxlbmd0aCA+IDEpIHtcblx0XHRcdHJvb3RFbnRpdHlTZXRQYXRoID0gYVBhdGhzWzFdO1xuXHRcdH1cblx0XHRyZXR1cm4gcm9vdEVudGl0eVNldFBhdGg7XG5cdH0sXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBsaXN0QmluZGluZy5cblx0ICogQHBhcmFtIG9WaWV3IFZpZXcgb2YgdGhlIGNvbnRyb2wgdXNpbmcgbGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBsaXN0YmluZGluZy5cblx0ICovXG5cdGdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBGRVZpZXcsIHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblxuXHRcdGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAodkxpc3RCaW5kaW5nLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdC8vIGFic29sdXRlIHBhdGhcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aCh2TGlzdEJpbmRpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdENvbnRleHRQYXRofS8ke3ZMaXN0QmluZGluZ31gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gd2UgYWxyZWFkeSBnZXQgYSBsaXN0IGJpbmRpbmcgdXNlIHRoaXMgb25lXG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9CaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0XHRpZiAob0JpbmRpbmcgPT09IG9Sb290QmluZGluZykge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0JpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgc1Jvb3RCaW5kaW5nUGF0aCA9IG9Sb290QmluZGluZyEuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgcm9vdFxuXHQgKi9cblx0aXNEcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdFJvb3QoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZS5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCBub2RlXG5cdCAqL1xuXHRpc0RyYWZ0Tm9kZTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldERyYWZ0Tm9kZShlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHN0aWNreSBzZXNzaW9uIHJvb3Rcblx0ICovXG5cdGlzU3RpY2t5OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGlja3lTZXNzaW9uKGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiBlbnRpdHkgaXMgdXBkYXRhYmxlIG9yIG5vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHVwZGF0YWJsZSBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1VwZGF0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogVXBkYXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuID8/IGVudGl0eVR5cGU/LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0aGUgQENvbW1vbi5EcmFmdFJvb3QgYW5ub3RhdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gRW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBEcmFmdFJvb3Rcblx0ICovXG5cdGdldERyYWZ0Um9vdDogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IERyYWZ0Um9vdCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnROb2RlIGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdE5vZGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnROb2RlIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGlja3kgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgU2Vzc2lvbiBTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqL1xuXHRnZXRTdGlja3lTZXNzaW9uOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHlUeXBlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZGVsZXRlIGJ1dHRvbiBpcyBoaWRkZW5cblx0ICovXG5cdGdldERlbGV0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRGVsZXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uRGVsZXRlSGlkZGVuID8/IGVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbjtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG1ldGFwYXRoIGZvciB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIE1ldGFQYXRoXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZVBhdGhGcm9tTGlzdEJpbmRpbmcobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IG1ldGFQYXRoO1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRpZiAobGlzdEJpbmRpbmcgPT09IHJvb3RCaW5kaW5nKSB7XG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByb290QmluZGluZ1BhdGggPSByb290QmluZGluZz8uZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgoYCR7cm9vdEJpbmRpbmdQYXRofS8ke3JlbGF0aXZlUGF0aH1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1ldGFQYXRoO1xuXHR9LFxuXG5cdGVuaGFuY2VPRGF0YU1vZGVsKG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogdm9pZCB7XG5cdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkgPSBuZXcgQXJyYXk8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KCk7XG5cdFx0Y29uc3QgZm5NZXNzYWdlID0gb2RhdGFNb2RlbC5zZXRNZXNzYWdlcztcblx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERlZmF1bHRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdGNvbnN0IGJhc2VTZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5O1xuXHRcdGNvbnN0IGJhc2VHZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5O1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXG5cdFx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dE9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChjb250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlOYW1lKT8uZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHRcdFx0XHQ/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4dGVybmFsSWRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0LmdldE9iamVjdChleHRlcm5hbElkUHJvcGVydHkucGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRleHQgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBiYXNlR2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIGNvbnRleHRdKTtcblx0XHR9O1xuXG5cdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocGF0aCwgdmFsdWUsIGNvbnRleHQsIGFzeW5jVXBkYXRlKTogYm9vbGVhbiB7XG5cdFx0XHRsZXQgZnVsbFBhdGggPSBwYXRoO1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0ZnVsbFBhdGggPSBjb250ZXh0LmdldFBhdGgocGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBfcmVmcmVzaExvY2FsTW9kZWwgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IFtwcm9wZXJ0eU5hbWUsIGFubm90YXRpb25UeXBlXSA9IHBhdGguc3BsaXQoXCJAJHVpNS5mZS5cIik7XG5cdFx0XHRpZiAoY29udGV4dCAmJiBhbm5vdGF0aW9uVHlwZSA9PT0gXCJAQ29tbW9uL0V4dGVybmFsSURcIikge1xuXHRcdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuXHRcdFx0XHQvLyByZWZyZXNoaW5nIEV4dGVybmFsSUQgYW5kIHRleHQgcHJvcGVydGllcyAocGF0aHMgbmVlZCB0byBiZSBkZXRlcm1pbmVkIGdlbmVyaWNhbGx5KVxuXHRcdFx0XHRjb25zdCBtZXRhUGF0aCA9IG5ldyBNZXRhUGF0aDxFbnRpdHlTZXQ+KFxuXHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdFx0XHRvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KHByb3BlcnR5TmFtZSk/LmdldFRhcmdldCgpLmFubm90YXRpb25zLkNvbW1vbj8uRXh0ZXJuYWxJRDtcblx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4dGVybmFsSWRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcFBhdGggPSBleHRlcm5hbElkUHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gW2V4dGVybmFsSWRQcm9wUGF0aC5zdWJzdHJpbmcoMCwgZXh0ZXJuYWxJZFByb3BQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSldO1xuXHRcdFx0XHRcdGNvbnN0IHRleHRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4oZXh0ZXJuYWxJZFByb3BQYXRoKT8uZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0ZXh0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcFBhdGggPSB0ZXh0UHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRcdGlmICh0ZXh0UHJvcFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QucHVzaCh0ZXh0UHJvcFBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMocHJvcGVydGllc1RvUmVxdWVzdClcblx0XHRcdFx0XHRcdC50aGVuKF9yZWZyZXNoTG9jYWxNb2RlbClcblx0XHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IGZ1bGxQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0bGV0IHBhdGhGcm9tUm9vdCA9IFwiXCI7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRwYXRoRnJvbVJvb3QgKz0gXCIvXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEZyb21Sb290ICs9IHByb3BlcnR5UGF0aFNwbGl0W2ldO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QocGF0aEZyb21Sb290KSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aEZyb21Sb290LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBiYXNlU2V0UHJvcGVydHkuYXBwbHkodGhpcywgW3BhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZV0pO1xuXHRcdH07XG5cdFx0ZnVuY3Rpb24gY2xlYXJBbm5vdGF0aW9uVHlwZShhbm5vdGF0aW9uVHlwZXM6IHN0cmluZ1tdLCBkYXRhU2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnRleHRQYXRoIGluIGRhdGFTZXQpIHtcblx0XHRcdFx0Ly8gd2UgYWRkZWQgYSBjb250ZXh0IGZvciBhY2NlcHRpbmcgcmVjb21tZW5kYXRpb25zIGV2ZW50dWFsbHkuXG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGEgZGVlcGx5IG5lc3RlZCBvYmplY3QgaXRlcmF0aW5nIG92ZXIgaXQgY2F1c2UgdGhlIGNvZGUgdGhlIGJyZWFrXG5cdFx0XHRcdC8vIGhlbmNlIHdlIGFyZSBza2lwcGluZyBpdCBoZXJlLlxuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gZGF0YVNldD8uW2NvbnRleHRQYXRoXSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0Y29uc3QgaXNDb250ZXh0ID0gY29udGV4dD8uaXNBPy4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBjb250ZXh0ID09PSBcIm9iamVjdFwiICYmICFpc0NvbnRleHQpIHtcblx0XHRcdFx0XHRkYXRhU2V0W2NvbnRleHRQYXRoXSA9IGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzLCBkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGRhdGFTZXRbY29udGV4dFBhdGhdIGFzIG9iamVjdCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YVNldFtjb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgYW5ub3RhdGlvblR5cGUgb2YgYW5ub3RhdGlvblR5cGVzKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRQYXRoLmVuZHNXaXRoKGFubm90YXRpb25UeXBlKSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRhdGFTZXQ7XG5cdFx0fVxuXHRcdG9kYXRhTW9kZWwuX2xvY2FsQW5ub3RhdGlvbk1vZGVsID0gbG9jYWxBbm5vdGF0aW9uTW9kZWw7XG5cdFx0b2RhdGFNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCA9IGZ1bmN0aW9uICgpOiBKU09OTW9kZWwge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdH07XG5cdFx0b2RhdGFNb2RlbC5zZXRNZXNzYWdlcyA9IGZ1bmN0aW9uIChtZXNzYWdlczogUmVjb3JkPHN0cmluZywgTWVzc2FnZVtdPik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY2xlYW5lZERhdGEgPSBjbGVhckFubm90YXRpb25UeXBlKFtcIkAkdWk1LmZlLm1lc3NhZ2VUeXBlXCIsIFwiQCR1aTUuZmUubWVzc2FnZVRleHRcIl0sIHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmdldERhdGEoKSk7XG5cdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5zZXREYXRhKGNsZWFuZWREYXRhKTtcblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZVRhcmdldCBpbiBtZXNzYWdlcykge1xuXHRcdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShgJHttZXNzYWdlVGFyZ2V0fUAkdWk1LmZlLm1lc3NhZ2VUeXBlYCwgbWVzc2FnZXNbbWVzc2FnZVRhcmdldF1bMF0uZ2V0VHlwZSgpKTtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVGV4dGAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldE1lc3NhZ2UoKSk7XG5cdFx0XHR9XG5cdFx0XHRmbk1lc3NhZ2UuYXBwbHkodGhpcywgW21lc3NhZ2VzXSk7XG5cdFx0fTtcblx0XHRjb25zdCBmbkJpbmRQcm9wZXJ0eSA9IG9kYXRhTW9kZWwuYmluZFByb3BlcnR5LmJpbmQob2RhdGFNb2RlbCk7XG5cdFx0b2RhdGFNb2RlbC5iaW5kUHJvcGVydHkgPSBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgcGFyYW1ldGVycyk6IE9EYXRhUHJvcGVydHlCaW5kaW5nIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkID0gYXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpLkRpc2FibGVJbnB1dEFzc2lzdGFuY2U7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyA9IE1vZGVsSGVscGVyLnNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyhcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0Zm5CaW5kUHJvcGVydHksXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpICYmIGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxJZEJpbmRpbmcgPSBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkucHVzaChpbnRlcm5hbElkQmluZGluZyk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIHVua25vd24gYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmc7XG5cblx0XHRcdFx0aW50ZXJuYWxJZEJpbmRpbmcuYXR0YWNoQ2hhbmdlKCgpID0+IHtcblx0XHRcdFx0XHRleHRlcm5hbElkQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZ1xuXHRcdFx0XHRcdC5yZXF1ZXN0VmFsdWUoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBleHRlcm5hbElkQmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmluY2x1ZGVzKFwiQCR1aTUuZmUuXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BCaW5kaW5nID0gdGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuYmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdHNldENvbnRleHQ/OiBGdW5jdGlvbjtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguZW5kc1dpdGgoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcEJpbmRpbmcudXBkYXRlUmVxdWlyZWQgPSBmdW5jdGlvbiAobW9kZWw6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBtb2RlbCAmJiBtb2RlbCA9PT0gb2RhdGFNb2RlbDtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS52aXJ0dWFsLlwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGV4cHJlc3Npb24gPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0VmlydHVhbEJpbmRpbmdFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXModGhpcy5nZXRNZXRhTW9kZWwoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0Q29udHJvbCA9IG5ldyBBbnkoeyBhbnk6IGNvbXBpbGVFeHByZXNzaW9uKGV4cHJlc3Npb24pLCBiaW5kQmFja1Byb3BlcnR5OiBwYXRoIH0pO1xuXHRcdFx0XHRcdGNvbnN0IGZuRGVzdHJveVByb3BlcnR5QmluZGluZyA9IHByb3BCaW5kaW5nLmRlc3Ryb3kuYmluZChwcm9wQmluZGluZyk7XG5cdFx0XHRcdFx0cHJvcEJpbmRpbmcuZGVzdHJveSA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdGdob3N0Q29udHJvbD8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuRGVzdHJveVByb3BlcnR5QmluZGluZygpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcHJvcEJpbmRpbmcuc2V0Q29udGV4dDtcblx0XHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRwcm9wQmluZGluZy5zZXRDb250ZXh0ID0gKG5ld0NvbnRleHQ6IENvbnRleHQpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5zZXRCaW5kaW5nQ29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0Q29udGV4dC5iaW5kKHByb3BCaW5kaW5nKShuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldE1vZGVsKHRoaXMpO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0QmluZGluZyA9IGdob3N0Q29udHJvbC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKT8uYmluZGluZztcblx0XHRcdFx0XHRjb25zdCBmbkNoZWNrVXBkYXRlID0gZ2hvc3RCaW5kaW5nPy5jaGVja1VwZGF0ZTtcblx0XHRcdFx0XHRpZiAoZm5DaGVja1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpLmJpbmRpbmcuY2hlY2tVcGRhdGUgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNoZWNrVXBkYXRlLmJpbmQoZ2hvc3RCaW5kaW5nKSh0cnVlKTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGdob3N0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcEJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5CaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdFx0fTtcblx0XHRjb25zdCBmbkRlc3Ryb3kgPSBvZGF0YU1vZGVsLmRlc3Ryb3kuYmluZChvZGF0YU1vZGVsKTtcblx0XHRvZGF0YU1vZGVsLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRmb3IgKGNvbnN0IHZwQmluZGluZyBvZiBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeSkge1xuXHRcdFx0XHR2cEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIGZuRGVzdHJveS5hcHBseSh0aGlzKTtcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogUmVzb2x2ZXMgYSBtZXRhZGF0YSBiaW5kaW5nIHRvIGl0cyB0ZXh0LCBlaXRoZXIgdXNpbmcgdGhlIGNvbnZlcnRlckNvbnRleHQgb3IgdGhlIG1ldGFNb2RlbCBkaXJlY3RseS5cblx0ICogQHBhcmFtIHBhdGhcblx0ICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcblx0ICogQHBhcmFtIG1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgdGV4dCBpZiBwb3NzaWJsZSwgZWxzZSB0aGUgaW5wdXQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIHdhcyB1bmRlZmluZWRcblx0ICovXG5cdGZldGNoVGV4dEZyb21NZXRhTW9kZWwocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0PzogQ29udmVydGVyQ29udGV4dDx1bmtub3duPiwgbWV0YU1vZGVsPzogTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgdGV4dCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHBhdGggOiBcIlwiO1xuXHRcdGlmIChwYXRoPy5zdGFydHNXaXRoKFwie21ldGFNb2RlbD5cIikpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbFBhdGggPSBwYXRoLnN1YnN0cmluZygxMSwgcGF0aC5sZW5ndGggLSAxKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24obWV0YU1vZGVsUGF0aCkuYW5ub3RhdGlvbj8udG9TdHJpbmcoKSA/PyBcIlwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRleHQgPSBtZXRhTW9kZWw/LmdldE9iamVjdChtZXRhTW9kZWxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRMb2cuaW5mbyhgVW5hYmxlIHRvIHJldHJpZXZlIHRleHQgZnJvbSBtZXRhIG1vZGVsIHVzaW5nIHBhdGggJHttZXRhTW9kZWxQYXRofWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGV4dDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gc3RhdGUgbWVzc2FnZXMuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIG1ldGFtb2RlbFxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGggUGF0aCBmb3IgdGhlIGNvbnRleHQgb24gd2hpY2ggd2Ugd2hhdCB0byByZXRyZWl2ZSB0aGUgbWVzc2FnZSBwYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBubyBNZXNzYWdlcyBhbm5vdGF0aW9uIGlzIGRlZmluZWRcblx0ICovXG5cdGdldE1lc3NhZ2VzUGF0aDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRcdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xuXHR9LFxuXHQvKipcblx0ICogU2V0dXAgcmVjb21tZW5kYXRpb24gbG9jYWwgYmluZGluZyB0byBtYWtlIHJlY29tbWVuZGF0aW9ucyBhY2Nlc3NpYmxlIHZpYSBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICpcblx0ICogUmVjb21tZW5kYXRpb25zIGlzIGEgY29tcGxleCBwcm9wZXJ0eS5cblx0ICogTW9kZWwgZG9lcyBub3QgcHJvdmlkZSBhbiBlYXN5IHdheSB0byBiaW5kIHRvIGNvbXBsZXggcHJvcGVydGllcy4gSXQgaGFzIDIgbWFqb3IgbGltaXRhdGlvbnMuXG5cdCAqXG5cdCAqIEl0IG9ubHkgc3VwcG9ydHMgb25lIHRpbWUgYmluZGluZyB0byBjb21wbGV4IHByb3BlcnRpZXMuIFRoaXMgaXMgbmVlZGVkIHRvIHNob3cgdXBkYXRlZCByZWNvbW1lbmRhdGlvbnMgb24gdGhlIFVJLlxuXHQgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmdzIHRvIHByb3BlcnRpZXMgaW5zaWRlIGEgY29tcGxleCBwcm9wZXJ0eSB3aGljaCBpcyBuZWVkZWQgZm9yIHJlY29tbWVuZGF0aW9ucy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdvcmthcm91bmQgdG8gb3ZlcmNvbWUgdGhlIGFib3ZlIHR3byBzaG9ydCBjb21pbmdzIGFuZFxuXHQgKiB0byBzdXBwb3J0IGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBvZGF0YU1vZGVsIFRoZSBvZGF0YSBtb2RlbCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIGZuQmluZFByb3BlcnR5IE9yaWdpbmFsIGJpbmQgcHJvcGVydHkgb2YgdGhlIG9EYXRhTW9kZWxcblx0ICogQHBhcmFtIHBhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkIEZsYWcgd2hpY2ggdG9nZ2xlcyB0aGUgcmVjb21tZW5kYXRpb24gZmVhdHVyZVxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBwYXRoIGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgdGhlIGJpbmRpbmdQYXRoIGlzIHJlbGV2YW50IG9yIG5vdCBiYXNlZCBvbiBtZXRhZGF0YS5cblx0ICovXG5cdHNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZzogZnVuY3Rpb24gKFxuXHRcdG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0Zm5CaW5kUHJvcGVydHk6IEZ1bmN0aW9uLFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZDogYm9vbGVhblxuXHQpOiBQcm9wZXJ0eUJpbmRpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmIChwYXRoLmluY2x1ZGVzKFwidWk1LmZlLnJlY29tbWVuZGF0aW9uc1wiKSkge1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25iaW5kaW5nID0gb2RhdGFNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0c2V0Q29udGV4dDogRnVuY3Rpb247XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nID0gKG9kYXRhUHJvcGVydHlCaW5kaW5nOiBPRGF0YVByb3BlcnR5QmluZGluZyAmIHsgc2V0Q29udGV4dDogRnVuY3Rpb24gfSk6IHZvaWQgPT4ge1xuXHRcdFx0XHQvL3dlIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGNvbnRleHQgaXMgc2V0IHRvIHRoZSBwcm9wZXJ0eWJpbmRpbmdcblx0XHRcdFx0Y29uc3QgZm5TZXRDb250ZXh0ID0gcmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQ7XG5cdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcuc2V0Q29udGV4dCA9IChuZXdDb250ZXh0OiBDb250ZXh0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZz8uc2V0Q29udGV4dChuZXdDb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldENvbnRleHQuYmluZChvZGF0YVByb3BlcnR5QmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGlzUmVjb21tZW5kZWRQcm9wZXJ0eSB9ID0gTW9kZWxIZWxwZXIudmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoKFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0cGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgJiYgaXNSZWNvbW1lbmRlZFByb3BlcnR5ICYmICFyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCkge1xuXHRcdFx0XHRcdGNvbnN0IGFscmVhZHlCb3VuZCA9IG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnNvbWUoKGV4aXN0aW5nQmluZGluZykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0Ly8gYmluZGluZyBleGlzdHMgYnV0IHRoZSBjb250ZXh0IGNhbiBiZSBkZXN0cm95ZWQgc29tZXRpbWVzIGJlY2F1c2Ugb2YgZGlzY2FyZCBhbmQgZGVsZXRlLlxuXHRcdFx0XHRcdFx0XHQvLyBoZW5jZSB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNvbnRleHQgZXhpc3RzIG9yIG5vdCBiZWZvcmUgZGVjaWRpbmcgaWYgd2UgYWxyZWFkeSBoYXZlIGEgYmluZGluZyBvciBub3QuXG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IFdlIG1pZ2h0IHdhbnQgdG8gY2xlYXIgdGhlIHByb3BlcnR5IGJpbmRpbmcgd2hlbiB0aGUgY29udGV4IGlzIGRlc3Ryb3llZC5cblx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRQYXRoKCkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSAmJlxuXHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSA9PT0gZXhpc3RpbmdCaW5kaW5nLmdldFBhdGgoKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIWFscmVhZHlCb3VuZCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2RhdGFQcm9wZXJ0eUJpbmRpbmcgPSBmbkJpbmRQcm9wZXJ0eShyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdC8vIEJlY3Vhc2UgcmVjb21tZW5kYXRpb25zIGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgbm90IGEgcHJpbWl0aXZlIHR5cGUgaGVuY2UgdXNlIGEgcmF3IHR5cGUuXG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5zZXRUeXBlKG5ldyBSYXcoKSwgXCJhbnlcIik7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5zZXRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkucHVzaChvZGF0YVByb3BlcnR5QmluZGluZyk7XG5cdFx0XHRcdFx0XHRvZGF0YVByb3BlcnR5QmluZGluZy5hdHRhY2hDaGFuZ2UoKGV2ZW50OiBPRGF0YVByb3BlcnR5QmluZGluZyRDaGFuZ2VFdmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZWZyZXNoIHRoZSBsb2NhbCBhbm5vdGF0aW9uIGJpbmRpbmcgb25jZSByZWNvbW1lbmRhdGlvbiBiaW5kaW5nIGlzIHVwZGF0ZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50Q29udGV4dCA9IGV2ZW50LmdldFNvdXJjZSgpLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dFJlY29tbWVuZGF0aW9ucyA9IHByb3BlcnR5QmluZGluZy5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLnNldFJlY29tbWVuZGF0aW9uc09uTG9jYWxBbm5vdGF0aW9uTW9kZWwoY29udGV4dFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Ly8gcmV1ZXN0VmFsdWUgd2lsbCBhZGQgdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHRvIHRoZSAkc2VsZWN0XG5cdFx0XHRcdFx0XHQvLyBoZW5jZSB3ZSBkbyBub3QgbmVlZCB0byBhZGQgaXQgdG8gdGhlICRzZWxlY3Qgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGJpbmRpbmcgYXQgdmFyaW91cyBwbGFjZXMgKGZvcm1zLCB0YWJsZSBldGMuKVxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIlJlY29tbWVuZGF0aW9ucyBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRzZXRDb250ZXh0T25SZWNvbW1lbmRhdGlvbkJpbmRpbmcob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYmluZGluZyBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGJpbmRpbmcgaXMgY3JlYXRlZCBzbyB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgYmluZGluZyBjYW4gYmUgY3JlYXRlZC5cblx0XHRcdC8vXG5cdFx0XHQvLyBGb3IgdGhpcyB3ZSBuZWVkIHRvIG92ZXJyaWRlIHVwZGF0ZVJlcXVpcmVkIHNvIHRoYXQgdGhlIGJpbmRpbmcgaXMgdXBkYXRlZCB1bnRpbCBpdCBoYXMgbm90IHJlY2VpdmVkIGEgY29udGV4dFxuXHRcdFx0Ly8gcG9zdCB0aGF0IHdlIGRvIG5vdCBuZWVkIHRoZSBiaW5kaW5nIHRvIGJlIHVwZGF0ZWQuXG5cdFx0XHQvLyBJZiB3ZSByZW1vdmUgdGhlIHVwZGF0ZVJlcXVpcmVkIG92ZXJyaWRlIHRoZW4gcmVjb21tZW5kYXRpb25zIHdvcmsgZmluZSBieSBkdXJpbmcgc2F2ZSBvZiBhIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHdlIGdldCBiaW5kaW5nIHJlbGF0ZWQgaXNzdWVzLlxuXHRcdFx0Ly9cblx0XHRcdC8vIFVwZGF0aW5nIHRoZSBiaW5kaW5nIHRvIHJlY29tbWVuZGF0aW9ucyB3aWxsIGJlIGRvbmUgYnkgc2V0UHJvcGVydHkgb24gdGhlIGxvY2FsQW5ub3RhdGlvbk1vZGVsXG5cdFx0XHQvLyB3aGVuIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSBpcyBhY3R1YWxseSB1cGRhdGVkLlxuXHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnVwZGF0ZVJlcXVpcmVkID0gZnVuY3Rpb24gKG1vZGVsOiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpID8gbW9kZWwgJiYgbW9kZWwgPT09IG9kYXRhTW9kZWwgOiBtb2RlbCAmJiB0aGlzLmdldE1vZGVsKCkgPT09IG1vZGVsO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvbmJpbmRpbmc7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVmFsaWRhdGVzIGJhc2VkIG9uIG1ldGFkYXRhIHdoZXRoZXIgYSBnaXZlbiBiaW5kaW5nIHNob3VsZCBkZWFsIHdpdGggcmVjb21tZW5kYXRpb25zIG9yIG5vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGF0aCBCaW5kaW5nIHBhdGggZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC5cblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHR2YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGg6IGZ1bmN0aW9uIChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRiaW5kaW5nUGF0aDogc3RyaW5nXG5cdCk6IHsgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDsgaXNSZWNvbW1lbmRlZFByb3BlcnR5OiBib29sZWFuIH0ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBjb250ZXh0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHRNZXRhUGF0aCk7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSA9ICh0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUkgYXMgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zKVxuXHRcdFx0Py5SZWNvbW1lbmRhdGlvbnM/LnBhdGg7XG5cdFx0Ly8gc2FtcGxlIGJpbmRpbmcgLSBTaGlwcGluZ0NvbmRpdGlvbkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYmluZGluZ1BhdGguc3BsaXQoXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIilbMF07XG5cdFx0Y29uc3QgaXNSZWNvbW1lbmRlZFByb3BlcnR5ID0gdGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLnNvbWUoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAoZW50aXR5UHJvcGVydHkubmFtZSA9PT0gcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIChlbnRpdHlQcm9wZXJ0eT8udGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMuc29tZSgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksXG5cdFx0XHRpc1JlY29tbWVuZGVkUHJvcGVydHlcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogVXBkYXRlIHJlY29tbWVuZGF0aW9uIGNsaWVudCBzaWRlIGluc3RhbmNlIGFubm90YXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGV4dFJlY29tbWVuZGF0aW9ucyBVcGRhdGVkIHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGN1cnJlbnRDb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gd2FzIHVwZGF0ZWQuXG5cdCAqL1xuXHRzZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsOiBmdW5jdGlvbiAoY29udGV4dFJlY29tbWVuZGF0aW9uczogUmVjb21tZW5kYXRpb25zLCBjdXJyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQpOiB2b2lkIHtcblx0XHRpZiAoY29udGV4dFJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0Zm9yIChjb25zdCByZWNvbW1lbmRlZFByb3BlcnR5IGluIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgPSBjb250ZXh0UmVjb21tZW5kYXRpb25zW3JlY29tbWVuZGVkUHJvcGVydHldO1xuXHRcdFx0XHRjb25zdCBsb2NhbE1vZGVsUGF0aCA9IHJlY29tbWVuZGVkUHJvcGVydHk7XG5cdFx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY3VycmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0XHRjb25zdCB0eXBlQWhlYWRWYWx1ZXMgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVJlY29tbWVuZGF0aW9uIG9mIHByb3BlcnR5UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Ly8gc2V0IHBsYWNlaG9sZGVyIGRlc2NyaXB0aW9uIGFuZCB2YWx1ZXNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly9sb2NhbEFubm90YXRpb25Nb2RlbC5cblx0XHRcdFx0XHQvLyBwdXNoIHRvcCAzIHJlY29tbWVuZGF0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dHlwZUFoZWFkVmFsdWVzLnB1c2gocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXByb3BlcnR5UmVjb21tZW5kYXRpb25zIHx8ICFwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlclZhbHVlQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlclZhbHVlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkocGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoLCBudWxsLCBjdXJyZW50Q29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCwgXCJcIiwgY3VycmVudENvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dC5nZXRQYXRoKGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMudHlwZUFoZWFkVmFsdWVzXCIpLFxuXHRcdFx0XHRcdHR5cGVBaGVhZFZhbHVlcyxcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShjdXJyZW50Q29udGV4dC5nZXRQYXRoKFwicmVjb21tZW5kYXRpb25Db250ZXh0XCIpLCBjdXJyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgU2Vjb25kYXJ5S2V5cyBmcm9tIGVudGl0eXR5cGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIERhdGFtb2RlbCBvYmplY3Qgb2YgZW50aXR5VHlwZVxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IERhdGFtb2RlbCBvYmplY3Qgb2YgZW50aXR5U2V0XG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsdGVybmF0ZSBrZXlzXG5cdCAqL1xuXHRnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzOiAoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgZW50aXR5U2V0OiBFbnRpdHlTZXQpOiBzdHJpbmdbXSA9PiB7XG5cdFx0Y29uc3QgYWx0ZXJuYXRlS2V5czogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBfZmV0Y2hBbHRlcm5hdGVLZXlzID0gKGVudGl0eVR5cGVPclNldDogRW50aXR5U2V0IHwgRW50aXR5VHlwZSk6IHZvaWQgPT4ge1xuXHRcdFx0ZW50aXR5VHlwZU9yU2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uQWx0ZXJuYXRlS2V5cz8uZm9yRWFjaCgoYWx0ZXJuYXRlS2V5OiBBbHRlcm5hdGVLZXkpID0+IHtcblx0XHRcdFx0YWx0ZXJuYXRlS2V5LktleS5mb3JFYWNoKChrZXk6IFByb3BlcnR5UmVmKSA9PiB7XG5cdFx0XHRcdFx0YWx0ZXJuYXRlS2V5cy5wdXNoKGtleS5OYW1lLnZhbHVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IF9mZXRjaFNlY29uZGFyeUtleXMgPSAoZVQ6IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVUPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZWNvbmRhcnlLZXk/LmZvckVhY2goKHNlY29uZGFyeUtleTogUHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdGlmICghYWx0ZXJuYXRlS2V5cy5pbmNsdWRlcyhzZWNvbmRhcnlLZXkudmFsdWUpKSB7XG5cdFx0XHRcdFx0YWx0ZXJuYXRlS2V5cy5wdXNoKHNlY29uZGFyeUtleS52YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0X2ZldGNoQWx0ZXJuYXRlS2V5cyhlbnRpdHlTZXQpO1xuXHRcdGlmICghYWx0ZXJuYXRlS2V5cy5sZW5ndGgpIHtcblx0XHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5VHlwZSk7XG5cdFx0fVxuXHRcdF9mZXRjaFNlY29uZGFyeUtleXMoZW50aXR5VHlwZSk7XG5cdFx0cmV0dXJuIGFsdGVybmF0ZUtleXM7XG5cdH1cbn07XG5cbnR5cGUgUmVjb21tZW5kYXRpb25zID0gUmVjb3JkPHN0cmluZywgUmVjb21tZW5kYXRpb25EZXRhaWxzW10+O1xudHlwZSBSZWNvbW1lbmRhdGlvbkRldGFpbHMgPSB7XG5cdFJlY29tbWVuZGVkRmllbGRWYWx1ZTogc3RyaW5nO1xuXHRSZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uOiBib29sZWFuO1xuXHRSZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb246IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEludGVybmFsTW9kZWxDb250ZXh0ID0geyBnZXRNb2RlbCgpOiBKU09OTW9kZWwgfSAmIEJhc2VDb250ZXh0ICYge1xuXHRcdHNldFByb3BlcnR5KHNQYXRoOiBzdHJpbmcsIHZWYWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cdH07XG5cbmV4cG9ydCBkZWZhdWx0IE1vZGVsSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0VBQUE7RUFtQ0E7RUFDQTtFQUNBOztFQU9BLE1BQU1BLFdBQVcsR0FBRztJQUNuQjtJQUNBO0lBQ0E7SUFDQUMseUJBQXlCLEVBQUUsS0FBSztJQUNoQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHdCQUF3QixFQUFFLFNBQUFBLENBQVVDLFNBQXlCLEVBQVc7TUFDdkUsTUFBTUMsZUFBZSxHQUFHRCxTQUFTLENBQUNFLFNBQVMsQ0FBQyxHQUFHLENBQUM7TUFDaEQsS0FBSyxNQUFNQyxhQUFhLElBQUlGLGVBQWUsRUFBRTtRQUM1QyxJQUNDQSxlQUFlLENBQUNFLGFBQWEsQ0FBQyxDQUFDQyxLQUFLLEtBQUssV0FBVyxJQUNwREosU0FBUyxDQUFDRSxTQUFTLENBQUMsSUFBSUMsYUFBYSx5REFBeUQsQ0FBQyxFQUM5RjtVQUNELE9BQU8sSUFBSTtRQUNaO01BQ0Q7TUFDQSxPQUFPLEtBQUs7SUFDYixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLGdCQUFnQixFQUFFLFNBQUFBLENBQVVMLFNBQXlCLEVBQUVNLElBQVksRUFBVztNQUM3RSxNQUFNQyxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDRixJQUFJLENBQUM7TUFDbEQsTUFBTUcsVUFBVSxHQUFHQywyQkFBMkIsQ0FBd0JILFdBQVcsQ0FBQztNQUNsRixPQUFPLElBQUksQ0FBQ0ksMEJBQTBCLENBQUNGLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDRSwwQkFBMEIsRUFBRSxTQUFBQSxDQUFVQyxtQkFBaUQsRUFBVztNQUNqRyxNQUFNQyxnQkFBZ0IsR0FBR0QsbUJBQW1CLENBQUNFLGVBQTRCO01BQ3pFLE1BQU1DLFlBQVksR0FBR2xCLFdBQVcsQ0FBQ21CLFdBQVcsQ0FBQ0gsZ0JBQWdCLENBQUM7TUFDOUQsTUFBTUksWUFBWSxHQUFHcEIsV0FBVyxDQUFDcUIsV0FBVyxDQUFDTCxnQkFBZ0IsQ0FBQztNQUM5RCxNQUFNTSxrQ0FBa0MsR0FDdkNDLG9CQUFvQixDQUFDUixtQkFBbUIsQ0FBQ1MsWUFBWSxDQUFDLElBQ3REVCxtQkFBbUIsQ0FBQ1MsWUFBWSxFQUFFQyxjQUFjLEtBQzlDVixtQkFBbUIsQ0FBQ1csaUJBQWlCLEVBQWdCQyxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxJQUNuRmQsbUJBQW1CLENBQUNXLGlCQUFpQixFQUFnQkMsV0FBVyxFQUFFQyxNQUFNLEVBQUVFLFNBQVMsQ0FBQyxHQUNuRixJQUFJLEdBQ0osS0FBSztNQUVULE9BQU9aLFlBQVksSUFBSUUsWUFBWSxJQUFLLENBQUNKLGdCQUFnQixJQUFJTSxrQ0FBbUM7SUFDakcsQ0FBQztJQUVEUyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVaEIsbUJBQXNDLEVBQVc7TUFDcEYsTUFBTUMsZ0JBQWdCLEdBQUdELG1CQUFtQixDQUFDaUIsbUJBQW1CLENBQUMsQ0FBYztNQUMvRSxNQUFNZCxZQUFZLEdBQUdsQixXQUFXLENBQUNtQixXQUFXLENBQUNILGdCQUFnQixDQUFDO01BQzlELE1BQU1JLFlBQVksR0FBR3BCLFdBQVcsQ0FBQ3FCLFdBQVcsQ0FBQ0wsZ0JBQWdCLENBQUM7TUFDOUQsT0FBT0UsWUFBWSxJQUFJRSxZQUFZO0lBQ3BDLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDYSw2QkFBNkIsRUFBRSxTQUFBQSxDQUFVQyxVQUFtQixFQUFFQyxpQkFBd0MsRUFBVztNQUNoSCxJQUFJLENBQUNuQyxXQUFXLENBQUNDLHlCQUF5QixFQUFFO1FBQzNDLE1BQU1tQyxVQUFVLEdBQUlELGlCQUFpQixFQUFFRSxPQUFPLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLElBQUlKLFVBQTZCO1FBQzNGLE1BQU1LLGdCQUFnQixHQUFHSCxVQUFVLENBQUMvQixTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ2xELEtBQUssTUFBTW1DLFVBQVUsSUFBSUQsZ0JBQWdCLEVBQUU7VUFDMUMsSUFDQ0EsZ0JBQWdCLENBQUNDLFVBQVUsQ0FBQyxDQUFDakMsS0FBSyxLQUFLLFdBQVcsSUFDbEQ2QixVQUFVLENBQUMvQixTQUFTLENBQUMsSUFBSW1DLFVBQVUsdURBQXVELENBQUMsRUFDMUY7WUFDRCxPQUFPLElBQUk7VUFDWjtRQUNEO01BQ0Q7TUFDQSxPQUFPLEtBQUs7SUFDYixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVQyxRQUFpQixFQUFzQjtNQUNsRSxNQUFNTixVQUFVLEdBQUdNLFFBQVEsQ0FBQ0osUUFBUSxDQUFDLENBQUMsQ0FBQ0ssWUFBWSxDQUFDLENBQUM7TUFDckQsTUFBTUMsV0FBVyxHQUFHLFNBQUFBLENBQVVDLEtBQWEsRUFBRUMsS0FBaUIsRUFBNkM7UUFBQSxJQUEzQ0MsY0FBYyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO1FBQ3BGLE1BQU1HLGNBQWMsR0FBR0osY0FBYyxHQUFHRixLQUFLLEdBQUcsSUFBSU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDQyxJQUFJLENBQUNSLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSU0sY0FBYyxJQUFJQSxjQUFjLEtBQUssR0FBRyxFQUFFO1VBQzdDLE1BQU1HLFdBQVcsR0FBR2xCLFVBQVUsQ0FBQ21CLFdBQVcsQ0FBQ0osY0FBYyxDQUFDO1VBQzFELE1BQU1LLFVBQVUsR0FBR0Msa0JBQWtCLENBQUM1QywyQkFBMkIsQ0FBQ3VCLFVBQVUsQ0FBQ3NCLFVBQVUsQ0FBQ0osV0FBVyxDQUFDLENBQUM7VUFDckcsSUFBS0UsVUFBVSxDQUFDdkMsZUFBZSxFQUFnQlUsV0FBVyxDQUFDQyxNQUFNLEVBQUVDLFNBQVMsRUFBRTtZQUM3RSxPQUFPc0IsY0FBYztVQUN0QjtVQUNBLE9BQU9QLFdBQVcsQ0FBQ08sY0FBYyxFQUFFTCxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2pEO1FBQ0EsT0FBT0ksU0FBUztNQUNqQixDQUFDO01BQ0QsT0FBT04sV0FBVyxDQUFDRixRQUFRLENBQUNpQixPQUFPLENBQUMsQ0FBQyxFQUFFakIsUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NzQixpQkFBaUIsRUFBRSxTQUFBQSxDQUFVbEIsUUFBaUIsRUFBc0I7TUFDbkUsTUFBTU4sVUFBVSxHQUFHTSxRQUFRLENBQUNKLFFBQVEsQ0FBQyxDQUFDLENBQUNLLFlBQVksQ0FBQyxDQUFDO01BQ3JELE1BQU1DLFdBQVcsR0FBRyxTQUFBQSxDQUFVQyxLQUFhLEVBQUVDLEtBQWlCLEVBQTZDO1FBQUEsSUFBM0NDLGNBQWMsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtRQUNwRixNQUFNRyxjQUFjLEdBQUdKLGNBQWMsR0FBR0YsS0FBSyxHQUFHLElBQUlPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQ0MsSUFBSSxDQUFDUixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUlNLGNBQWMsSUFBSUEsY0FBYyxLQUFLLEdBQUcsRUFBRTtVQUM3QyxNQUFNRyxXQUFXLEdBQUdsQixVQUFVLENBQUNtQixXQUFXLENBQUNKLGNBQWMsQ0FBQztVQUMxRCxNQUFNSyxVQUFVLEdBQUdDLGtCQUFrQixDQUFDNUMsMkJBQTJCLENBQUN1QixVQUFVLENBQUNzQixVQUFVLENBQUNKLFdBQVcsQ0FBQyxDQUFDO1VBQ3JHLElBQ0NFLFVBQVUsQ0FBQzlCLGlCQUFpQixLQUFLOEIsVUFBVSxDQUFDdkMsZUFBZSxJQUMxRHVDLFVBQVUsQ0FBQ3ZDLGVBQWUsRUFBZ0JVLFdBQVcsRUFBRWtDLE9BQU8sRUFBRUMsc0JBQXNCLEVBQ3RGO1lBQ0QsT0FBT1gsY0FBYztVQUN0QjtVQUNBLE9BQU9QLFdBQVcsQ0FBQ08sY0FBYyxFQUFFTCxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2pEO1FBQ0EsT0FBT0ksU0FBUztNQUNqQixDQUFDO01BQ0QsT0FBT04sV0FBVyxDQUFDRixRQUFRLENBQUNpQixPQUFPLENBQUMsQ0FBQyxFQUFFakIsUUFBUSxDQUFDSixRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0N5QixrQkFBa0IsRUFBRSxTQUFBQSxDQUFVckIsUUFBcUIsRUFBVTtNQUM1RCxNQUFNRyxLQUFLLEdBQUdILFFBQVEsQ0FBQ2lCLE9BQU8sQ0FBQyxDQUFDO01BQ2hDLElBQ0NqQixRQUFRLENBQUNyQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVyxJQUMzQ3FDLFFBQVEsQ0FBQ3JDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQ3hDcUMsUUFBUSxDQUFDckMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFFBQVEsRUFDekM7UUFDRCxPQUFPd0MsS0FBSztNQUNiO01BQ0EsTUFBTW1CLGNBQWMsR0FBR2hFLFdBQVcsQ0FBQ2lFLGdCQUFnQixDQUFDcEIsS0FBSyxDQUFDO01BQzFELE9BQU8sSUFBSUgsUUFBUSxDQUFDckMsU0FBUyxDQUFDMkQsY0FBYyxDQUFDLEVBQUU7SUFDaEQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVeEQsSUFBWSxFQUFFeUQsY0FBK0IsRUFBVTtNQUNsRixJQUFJQyxhQUFhLEdBQUcsRUFBRTtNQUN0QixJQUFJLENBQUNELGNBQWMsRUFBRTtRQUNwQjtRQUNBQyxhQUFhLEdBQUcsSUFBSTFELElBQUksQ0FBQzJELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxDQUFDckUsV0FBVyxDQUFDc0UsdUJBQXVCLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUU7TUFDdkgsQ0FBQyxNQUFNO1FBQ047UUFDQSxNQUFNQyxTQUFTLEdBQUcvRCxJQUFJLENBQUMyRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLE1BQU0sQ0FBQ3JFLFdBQVcsQ0FBQ3NFLHVCQUF1QixDQUFDO1FBQzdFLElBQUlFLFNBQVMsQ0FBQ3ZCLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDekIsTUFBTXdCLGlCQUFpQixHQUFHO1lBQ3pCQyxXQUFXLEVBQUUsR0FBRztZQUNoQkMscUJBQXFCLEVBQUU7VUFDeEIsQ0FBQztVQUVELE1BQU1DLFVBQVUsR0FBR0osU0FBUyxDQUFDSyxNQUFNLENBQ2xDLENBQUNDLHFCQUE2RSxFQUFFQyxRQUFnQixFQUFFQyxHQUFXLEtBQUs7WUFDakgsTUFBTUMsU0FBUyxHQUFJLENBQUMsQ0FBQ0QsR0FBRyxJQUFJLDhCQUE4QixJQUFLLEVBQUU7WUFDakUsSUFBSTtjQUFFTixXQUFXO2NBQUVDO1lBQXNCLENBQUMsR0FBR0cscUJBQXFCO1lBQ2xFLE1BQU1JLFFBQVEsR0FBR1IsV0FBVyxHQUFHTyxTQUFTO1lBQ3hDLE1BQU1FLGVBQWUsR0FBR2pCLGNBQWMsQ0FBQzdELFNBQVMsQ0FBQzZFLFFBQVEsQ0FBQztZQUMxRCxNQUFNRSxxQkFBcUIsR0FBR1QscUJBQXFCLEdBQUcsR0FBR0EscUJBQXFCLElBQUlJLFFBQVEsRUFBRSxHQUFHQSxRQUFRO1lBQ3ZHLElBQ0NJLGVBQWUsSUFDZkUsTUFBTSxDQUFDQyxJQUFJLENBQUNILGVBQWUsQ0FBQyxDQUFDbEMsTUFBTSxHQUFHLENBQUMsSUFDdkNrQyxlQUFlLENBQUNJLGNBQWMsQ0FBQ0gscUJBQXFCLENBQUMsRUFDcEQ7Y0FDRFYsV0FBVyxHQUFHUSxRQUFRLEdBQUdFLHFCQUFxQixDQUFDSSxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztjQUNsRWIscUJBQXFCLEdBQUcsRUFBRTtZQUMzQixDQUFDLE1BQU07Y0FDTkEscUJBQXFCLElBQUlBLHFCQUFxQixHQUFHLElBQUlJLFFBQVEsRUFBRSxHQUFHQSxRQUFRO1lBQzNFO1lBQ0EsT0FBTztjQUFFTCxXQUFXO2NBQUVDO1lBQXNCLENBQUM7VUFDOUMsQ0FBQyxFQUNERixpQkFDRCxDQUFDO1VBRUROLGFBQWEsR0FBR1MsVUFBVSxDQUFDRixXQUFXO1FBQ3ZDLENBQUMsTUFBTTtVQUNOUCxhQUFhLEdBQUcsSUFBSUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25DO01BQ0Q7TUFFQSxPQUFPTCxhQUFhO0lBQ3JCLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NzQixnQ0FBZ0MsRUFBRSxTQUFBQSxDQUFVQyxVQUFvQyxFQUFzQjtNQUNyRyxPQUFPQSxVQUFVLElBQUlBLFVBQVUsQ0FBQ0MsS0FBSyxHQUFHLG9CQUFvQkQsVUFBVSxDQUFDQyxLQUFLLElBQUksR0FBR3pDLFNBQVM7SUFDN0YsQ0FBQztJQUVEb0IsdUJBQXVCLEVBQUUsU0FBQUEsQ0FBVXNCLFNBQWlCLEVBQVc7TUFDOUQsT0FBT0EsU0FBUyxLQUFLLEVBQUUsSUFBSUEsU0FBUyxLQUFLLDRCQUE0QjtJQUN0RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7O0lBRUNDLHdCQUF3QixFQUFFLFNBQUFBLENBQVVDLGNBQXlCLEVBQVE7TUFDcEUsTUFBTUMsYUFBYSxHQUFHRCxjQUFjLENBQUNFLFdBQVc7TUFDaERGLGNBQWMsQ0FBQ0UsV0FBVyxHQUFHLFVBQzVCbkQsS0FBYSxFQUNiUixPQUFvQixFQUNwQjRELFdBQStCLEVBQy9CQyxPQUEyQixFQUNWO1FBQ2pCLE1BQU1DLGNBQWMsR0FBR0osYUFBYSxDQUFDSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUN2RCxLQUFLLEVBQUVSLE9BQU8sRUFBRTRELFdBQVcsRUFBRUMsT0FBTyxDQUFDLENBQUM7UUFDeEYsTUFBTUcsaUJBQWlCLEdBQUdGLGNBQWMsQ0FBQ0csZUFBZTtRQUV4REgsY0FBYyxDQUFDRyxlQUFlLEdBQUcsWUFBZ0M7VUFDaEUsTUFBTUMsYUFBYSxHQUFHRixpQkFBaUIsQ0FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQztVQUNuRCxJQUFJRyxhQUFhLEVBQUU7WUFDbEJBLGFBQWEsQ0FBQ0MsV0FBVyxHQUFHLFVBQVVDLFlBQW9CLEVBQUVDLEtBQWMsRUFBUTtjQUNqRixJQUFJLElBQUksQ0FBQ3JHLFNBQVMsQ0FBQyxDQUFDLEtBQUs2QyxTQUFTLEVBQUU7Z0JBQ25DO2dCQUNBLElBQUksQ0FBQ1osUUFBUSxDQUFDLENBQUMsQ0FBQ2tFLFdBQVcsQ0FBQyxJQUFJLENBQUM3QyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2NBQ2hEO2NBQ0EsTUFBTWdELGlCQUFpQixHQUFHRixZQUFZLENBQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDO2NBQ2pELElBQUkzRCxJQUFJLEdBQUcsSUFBSSxDQUFDa0QsT0FBTyxDQUFDLENBQUMsQ0FBQzZCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztjQUM5QztjQUNBLEtBQUssSUFBSW9CLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0QsaUJBQWlCLENBQUMxRCxNQUFNLEdBQUcsQ0FBQyxFQUFFMkQsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3REbkcsSUFBSSxHQUFHLEdBQUdBLElBQUksSUFBSWtHLGlCQUFpQixDQUFDQyxDQUFDLENBQUMsRUFBRTtnQkFDeEMsSUFBSSxJQUFJLENBQUN0RSxRQUFRLENBQUMsQ0FBQyxDQUFDdUUsV0FBVyxDQUFDcEcsSUFBSSxDQUFDLEtBQUt5QyxTQUFTLEVBQUU7a0JBQ3BEO2tCQUNBLElBQUksQ0FBQ1osUUFBUSxDQUFDLENBQUMsQ0FBQ2tFLFdBQVcsQ0FBQy9GLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEM7Y0FDRDtjQUNBLElBQUksQ0FBQzZCLFFBQVEsQ0FBQyxDQUFDLENBQUNrRSxXQUFXLENBQUNDLFlBQVksRUFBRUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUN2RCxDQUFDO1VBQ0Y7VUFDQSxPQUFPSCxhQUFhO1FBQ3JCLENBQUM7UUFDRCxPQUFPSixjQUFjO01BQ3RCLENBQUM7SUFDRixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRUNXLGtCQUFrQixFQUFFLFNBQUFBLENBQVVDLE9BQWtCLEVBQUVDLE9BQTRELEVBQVE7TUFDckgsTUFBTUMsYUFBYSxHQUFHRixPQUFPLENBQUNQLFdBQVc7TUFDekNPLE9BQU8sQ0FBQ1AsV0FBVyxHQUFHLFVBQ3JCL0YsSUFBWSxFQUNaaUcsS0FBYyxFQUNkckUsT0FBZ0MsRUFDaEM2RSxXQUFnQyxFQUN0QjtRQUNWLElBQUl6RyxJQUFJLEtBQUssYUFBYSxFQUFFO1VBQzNCc0csT0FBTyxDQUFDUCxXQUFXLENBQUMsV0FBVyxFQUFFRSxLQUFLLEdBQUdNLE9BQU8sQ0FBQ0csUUFBUSxDQUFDQyxRQUFRLEdBQUdKLE9BQU8sQ0FBQ0csUUFBUSxDQUFDRSxPQUFPLEVBQUVoRixPQUFPLEVBQUU2RSxXQUFXLENBQUM7UUFDckg7UUFDQSxPQUFPRCxhQUFhLENBQUNiLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzNGLElBQUksRUFBRWlHLEtBQUssRUFBRXJFLE9BQU8sRUFBRTZFLFdBQVcsQ0FBQyxDQUFDO01BQ3RFLENBQUM7SUFDRixDQUFDO0lBRURJLG9CQUFvQixFQUFFLFNBQUFBLENBQVVDLFNBQStDLEVBQVE7TUFDdEYsTUFBTUMsV0FBVyxHQUFHRCxTQUFTLENBQUNFLFVBQVU7TUFDeENGLFNBQVMsQ0FBQ0UsVUFBVSxHQUFHLFVBQVU1RSxLQUFhLEVBQUVILFFBQWtCLEVBQVc7UUFDNUUsSUFBSUcsS0FBSyxLQUFLSyxTQUFTLElBQUlMLEtBQUssS0FBSyxFQUFFLEVBQUU7VUFDeENBLEtBQUssR0FBRyxHQUFHO1FBQ1o7UUFDQSxPQUFPMkUsV0FBVyxDQUFDcEIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDdkQsS0FBSyxFQUFFSCxRQUFRLENBQUMsQ0FBQztNQUNsRCxDQUFDO0lBQ0YsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ2dGLHdCQUF3QixFQUFFLFNBQUFBLENBQVV0RixVQUEwQixFQUF1QjtNQUNwRixJQUFJLENBQUNBLFVBQVUsRUFBRTtRQUNoQixPQUFPYyxTQUFTO01BQ2pCO01BQ0EsTUFBTXlFLGdCQUFnQixHQUFHdkYsVUFBVSxDQUFDL0IsU0FBUyxDQUFDLDZDQUE2QyxDQUFDO01BQzVGO01BQ0EsT0FBT3NILGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUk7SUFDNUUsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MscUJBQXFCLEVBQUUsU0FBQUEsQ0FBVW5GLFFBQWlCLEVBQVU7TUFDM0QsTUFBTW9GLE1BQU0sR0FBR3BGLFFBQVEsQ0FBQ0osUUFBUSxDQUFDLENBQUM7UUFDakNGLFVBQVUsR0FBRzBGLE1BQU0sQ0FBQ25GLFlBQVksQ0FBQyxDQUFDO1FBQ2xDRSxLQUFLLEdBQUdILFFBQVEsQ0FBQ2lCLE9BQU8sQ0FBQyxDQUFDO01BQzNCLE9BQU92QixVQUFVLElBQUlTLEtBQUssSUFBSVQsVUFBVSxDQUFDbUIsV0FBVyxDQUFDVixLQUFLLENBQUM7SUFDNUQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ2tGLG9CQUFvQixFQUFFLFNBQUFBLENBQVVDLFdBQW1CLEVBQVU7TUFDNUQsSUFBSUMsaUJBQWlCLEdBQUcsRUFBRTtNQUMxQixNQUFNQyxNQUFNLEdBQUdGLFdBQVcsR0FBR0EsV0FBVyxDQUFDNUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7TUFDeEQsSUFBSThELE1BQU0sQ0FBQ2pGLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEJnRixpQkFBaUIsR0FBR0MsTUFBTSxDQUFDLENBQUMsQ0FBQztNQUM5QjtNQUNBLE9BQU9ELGlCQUFpQjtJQUN6QixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLGlDQUFpQyxFQUFFLFNBQUFBLENBQVVDLEtBQWEsRUFBRUMsWUFBdUMsRUFBVTtNQUM1RyxNQUFNakcsVUFBVSxHQUFHZ0csS0FBSyxDQUFDOUYsUUFBUSxDQUFDLENBQUMsQ0FBQ0ssWUFBWSxDQUFDLENBQUM7TUFDbEQsSUFBSTJGLFNBQVM7TUFFYixJQUFJLE9BQU9ELFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDckMsSUFBSUEsWUFBWSxDQUFDRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDakM7VUFDQUQsU0FBUyxHQUFHbEcsVUFBVSxDQUFDbUIsV0FBVyxDQUFDOEUsWUFBWSxDQUFDO1FBQ2pELENBQUMsTUFBTTtVQUNOO1VBQ0EsTUFBTUcsZUFBZSxHQUFHSixLQUFLLENBQUNLLGlCQUFpQixDQUFDLENBQUM7VUFDakQsTUFBTUMsZ0JBQWdCLEdBQUdGLGVBQWUsQ0FBQzdFLE9BQU8sQ0FBQyxDQUFDO1VBQ2xEMkUsU0FBUyxHQUFHbEcsVUFBVSxDQUFDbUIsV0FBVyxDQUFDLEdBQUdtRixnQkFBZ0IsSUFBSUwsWUFBWSxFQUFFLENBQUM7UUFDMUU7TUFDRCxDQUFDLE1BQU07UUFDTjtRQUNBLE1BQU1NLFFBQVEsR0FBR04sWUFBWTtRQUM3QixNQUFNTyxZQUFZLEdBQUdELFFBQVEsQ0FBQ0UsY0FBYyxDQUFDLENBQUM7UUFDOUMsSUFBSUYsUUFBUSxLQUFLQyxZQUFZLEVBQUU7VUFDOUI7VUFDQU4sU0FBUyxHQUFHbEcsVUFBVSxDQUFDbUIsV0FBVyxDQUFDb0YsUUFBUSxDQUFDaEYsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLE1BQU07VUFDTjtVQUNBLE1BQU1tRixnQkFBZ0IsR0FBR0YsWUFBWSxDQUFFakYsT0FBTyxDQUFDLENBQUM7VUFDaEQsTUFBTW9GLGFBQWEsR0FBR0osUUFBUSxDQUFDaEYsT0FBTyxDQUFDLENBQUM7VUFDeEMyRSxTQUFTLEdBQUdsRyxVQUFVLENBQUNtQixXQUFXLENBQUMsR0FBR3VGLGdCQUFnQixJQUFJQyxhQUFhLEVBQUUsQ0FBQztRQUMzRTtNQUNEO01BQ0EsT0FBT1QsU0FBUztJQUNqQixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDbkgsV0FBVyxFQUFFLFNBQUFBLENBQVU2SCxTQUFzRCxFQUFXO01BQ3ZGLE9BQU8sSUFBSSxDQUFDQyxZQUFZLENBQUNELFNBQVMsQ0FBQyxLQUFLOUYsU0FBUztJQUNsRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDN0IsV0FBVyxFQUFFLFNBQUFBLENBQVUySCxTQUFzRCxFQUFXO01BQ3ZGLE9BQU8sSUFBSSxDQUFDRSxZQUFZLENBQUNGLFNBQVMsQ0FBQyxLQUFLOUYsU0FBUztJQUNsRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDaUcsUUFBUSxFQUFFLFNBQUFBLENBQVVILFNBQTRDLEVBQVc7TUFDMUUsT0FBTyxJQUFJLENBQUNJLGdCQUFnQixDQUFDSixTQUFTLENBQUMsS0FBSzlGLFNBQVM7SUFDdEQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDbUcsY0FBYyxFQUFFLFNBQUFBLENBQVVMLFNBQTRDLEVBQUVNLFVBQXNCLEVBQTRCO01BQ3pILElBQUlDLFdBQVcsQ0FBQ1AsU0FBUyxDQUFDLEVBQUU7UUFDM0IsT0FBT0EsU0FBUyxDQUFDckgsV0FBVyxDQUFDNkgsRUFBRSxFQUFFQyxZQUFZLElBQUlILFVBQVUsRUFBRTNILFdBQVcsQ0FBQzZILEVBQUUsRUFBRUMsWUFBWTtNQUMxRjtJQUNELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NSLFlBQVksRUFBRSxTQUFBQSxDQUFVRCxTQUFzRCxFQUF5QjtNQUN0RyxPQUFPTyxXQUFXLENBQUNQLFNBQVMsQ0FBQyxHQUFHQSxTQUFTLENBQUNySCxXQUFXLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxHQUFHcUIsU0FBUztJQUNwRixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDZ0csWUFBWSxFQUFFLFNBQUFBLENBQVVGLFNBQXNELEVBQXlCO01BQ3RHLE9BQU9PLFdBQVcsQ0FBQ1AsU0FBUyxDQUFDLEdBQUdBLFNBQVMsQ0FBQ3JILFdBQVcsQ0FBQ0MsTUFBTSxFQUFFRSxTQUFTLEdBQUdvQixTQUFTO0lBQ3BGLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NrRyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVSixTQUFzRCxFQUFzQztNQUN2SCxPQUFPTyxXQUFXLENBQUNQLFNBQVMsQ0FBQyxHQUFHQSxTQUFTLENBQUNySCxXQUFXLENBQUNrQyxPQUFPLEVBQUVDLHNCQUFzQixHQUFHWixTQUFTO0lBQ2xHLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3dHLGVBQWUsRUFBRSxTQUFBQSxDQUFVVixTQUE0QyxFQUFFTSxVQUFzQixFQUE0QjtNQUMxSCxJQUFJQyxXQUFXLENBQUNQLFNBQVMsQ0FBQyxFQUFFO1FBQzNCLE9BQU9BLFNBQVMsQ0FBQ3JILFdBQVcsQ0FBQzZILEVBQUUsRUFBRUcsWUFBWSxJQUFJTCxVQUFVLENBQUMzSCxXQUFXLENBQUM2SCxFQUFFLEVBQUVHLFlBQVk7TUFDekY7SUFDRCxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyw4QkFBOEJBLENBQUNDLFdBQTZCLEVBQVU7TUFDckUsTUFBTUMsU0FBUyxHQUFHRCxXQUFXLENBQUN2SCxRQUFRLENBQUMsQ0FBQyxDQUFDSyxZQUFZLENBQUMsQ0FBQztNQUN2RCxJQUFJb0gsUUFBUTtNQUNaLE1BQU1DLFdBQVcsR0FBR0gsV0FBVyxDQUFDaEIsY0FBYyxDQUFDLENBQUM7TUFDaEQsSUFBSWdCLFdBQVcsS0FBS0csV0FBVyxFQUFFO1FBQ2hDRCxRQUFRLEdBQUdELFNBQVMsQ0FBQ3ZHLFdBQVcsQ0FBQ3NHLFdBQVcsQ0FBQ2xHLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDeEQsQ0FBQyxNQUFNO1FBQ04sTUFBTXNHLGVBQWUsR0FBR0QsV0FBVyxFQUFFckcsT0FBTyxDQUFDLENBQUM7UUFDOUMsTUFBTXVHLFlBQVksR0FBR0wsV0FBVyxDQUFDbEcsT0FBTyxDQUFDLENBQUM7UUFDMUNvRyxRQUFRLEdBQUdELFNBQVMsQ0FBQ3ZHLFdBQVcsQ0FBQyxHQUFHMEcsZUFBZSxJQUFJQyxZQUFZLEVBQUUsQ0FBQztNQUN2RTtNQUNBLE9BQU9ILFFBQVE7SUFDaEIsQ0FBQztJQUVESSxpQkFBaUJBLENBQUNDLFVBQXNCLEVBQUVDLFlBQTBCLEVBQVE7TUFDM0VELFVBQVUsQ0FBQ0UsOEJBQThCLEdBQUcsSUFBSUMsS0FBSyxDQUF1QixDQUFDO01BQzdFLE1BQU1DLFNBQVMsR0FBR0osVUFBVSxDQUFDSyxXQUFXO01BQ3hDLE1BQU1DLG9CQUFvQixHQUFHLElBQUlDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM5Q0Qsb0JBQW9CLENBQUNFLHFCQUFxQixDQUFDQyxXQUFXLENBQUNDLE1BQU0sQ0FBQztNQUM5RCxNQUFNQyxlQUFlLEdBQUdMLG9CQUFvQixDQUFDbEUsV0FBVztNQUN4RCxNQUFNd0UsZUFBZSxHQUFHTixvQkFBb0IsQ0FBQzdELFdBQVc7TUFDeEQ2RCxvQkFBb0IsQ0FBQzdELFdBQVcsR0FBRyxVQUFVcEcsSUFBSSxFQUFFNEIsT0FBdUIsRUFBVztRQUNwRixNQUFNLENBQUM0SSxZQUFZLEVBQUVDLGNBQWMsQ0FBQyxHQUFHekssSUFBSSxDQUFDMkQsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUU5RCxJQUFJL0IsT0FBTyxJQUFJQSxPQUFPLENBQUM4SSxXQUFXLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSUQsY0FBYyxLQUFLLG9CQUFvQixFQUFFO1VBQ3pGLE1BQU1FLGFBQWEsR0FBRy9JLE9BQU8sQ0FBQ2hDLFNBQVMsQ0FBQyxDQUFDO1VBQ3pDLElBQUkrSyxhQUFhLEVBQUU7WUFDbEIsTUFBTXJCLFFBQVEsR0FBRyxJQUFJc0IsUUFBUSxDQUM1QkMsWUFBWSxDQUFDbEIsVUFBVSxDQUFDekgsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUN2Q3lILFVBQVUsQ0FBQ3pILFlBQVksQ0FBQyxDQUFDLENBQUNZLFdBQVcsQ0FBQ2xCLE9BQU8sQ0FBQ3NCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDeER5RyxVQUFVLENBQUN6SCxZQUFZLENBQUMsQ0FBQyxDQUFDWSxXQUFXLENBQUNsQixPQUFPLENBQUNzQixPQUFPLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1lBQ0QsTUFBTTRILGtCQUFrQixHQUFHeEIsUUFBUSxDQUFDeUIsa0JBQWtCLENBQVdQLFlBQVksQ0FBQyxFQUFFUSxTQUFTLENBQUMsQ0FBQyxDQUFDOUosV0FBVyxDQUFDQyxNQUFNLEVBQzNHOEosVUFBVTtZQUNiLElBQUlDLDBCQUEwQixDQUFDSixrQkFBa0IsQ0FBQyxFQUFFO2NBQ25ELE9BQU9sSixPQUFPLENBQUNoQyxTQUFTLENBQUNrTCxrQkFBa0IsQ0FBQzlLLElBQUksQ0FBQztZQUNsRCxDQUFDLE1BQU07Y0FDTixPQUFPNEIsT0FBTyxDQUFDaEMsU0FBUyxDQUFDNEssWUFBWSxDQUFDO1lBQ3ZDO1VBQ0QsQ0FBQyxNQUFNO1lBQ04sT0FBTy9ILFNBQVM7VUFDakI7UUFDRCxDQUFDLE1BQU0sSUFBSWIsT0FBTyxJQUFJNkksY0FBYyxLQUFLLGFBQWEsRUFBRTtVQUN2RCxPQUFPN0ksT0FBTyxDQUFDc0IsT0FBTyxDQUFDLENBQUM7UUFDekI7UUFFQSxPQUFPcUgsZUFBZSxDQUFDNUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDM0YsSUFBSSxFQUFFNEIsT0FBTyxDQUFDLENBQUM7TUFDcEQsQ0FBQztNQUVEcUksb0JBQW9CLENBQUNsRSxXQUFXLEdBQUcsVUFBVS9GLElBQUksRUFBRWlHLEtBQUssRUFBRXJFLE9BQU8sRUFBRTZFLFdBQVcsRUFBVztRQUN4RixJQUFJMEUsUUFBUSxHQUFHbkwsSUFBSTtRQUNuQixJQUFJNEIsT0FBTyxFQUFFO1VBQ1p1SixRQUFRLEdBQUd2SixPQUFPLENBQUNzQixPQUFPLENBQUNsRCxJQUFJLENBQUM7UUFDakM7UUFDQSxNQUFNb0wsa0JBQWtCLEdBQUdBLENBQUEsS0FBWTtVQUN0QyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sQ0FBQ2IsWUFBWSxFQUFFQyxjQUFjLENBQUMsR0FBR3pLLElBQUksQ0FBQzJELEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDOUQsSUFBSS9CLE9BQU8sSUFBSTZJLGNBQWMsS0FBSyxvQkFBb0IsRUFBRTtVQUN2RDdJLE9BQU8sQ0FBQ21FLFdBQVcsQ0FBQ3lFLFlBQVksRUFBRXZFLEtBQUssQ0FBQztVQUN4QztVQUNBLE1BQU1xRCxRQUFRLEdBQUcsSUFBSXNCLFFBQVEsQ0FDNUJDLFlBQVksQ0FBQ2xCLFVBQVUsQ0FBQ3pILFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDdkN5SCxVQUFVLENBQUN6SCxZQUFZLENBQUMsQ0FBQyxDQUFDWSxXQUFXLENBQUNsQixPQUFPLENBQUNzQixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQ3hEeUcsVUFBVSxDQUFDekgsWUFBWSxDQUFDLENBQUMsQ0FBQ1ksV0FBVyxDQUFDbEIsT0FBTyxDQUFDc0IsT0FBTyxDQUFDLENBQUMsQ0FDeEQsQ0FBQztVQUNELE1BQU00SCxrQkFBa0IsR0FBR3hCLFFBQVEsQ0FBQ3lCLGtCQUFrQixDQUFXUCxZQUFZLENBQUMsRUFBRVEsU0FBUyxDQUFDLENBQUMsQ0FBQzlKLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFOEosVUFBVTtVQUMxSCxJQUFJQywwQkFBMEIsQ0FBQ0osa0JBQWtCLENBQUMsRUFBRTtZQUNuRCxNQUFNUSxrQkFBa0IsR0FBR1Isa0JBQWtCLENBQUM5SyxJQUFJO1lBQ2xELE1BQU11TCxtQkFBbUIsR0FBRyxDQUFDRCxrQkFBa0IsQ0FBQ0UsU0FBUyxDQUFDLENBQUMsRUFBRUYsa0JBQWtCLENBQUNHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLE1BQU1DLFlBQVksR0FBR3BDLFFBQVEsQ0FBQ3lCLGtCQUFrQixDQUFXTyxrQkFBa0IsQ0FBQyxFQUFFTixTQUFTLENBQUMsQ0FBQyxDQUFDOUosV0FBVyxDQUFDQyxNQUFNLEVBQUV3SyxJQUFJO1lBQ3BILElBQUlULDBCQUEwQixDQUFDUSxZQUFZLENBQUMsRUFBRTtjQUM3QyxNQUFNRSxZQUFZLEdBQUdGLFlBQVksQ0FBQzFMLElBQUk7Y0FDdEMsSUFBSTRMLFlBQVksQ0FBQ0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQk4sbUJBQW1CLENBQUNPLElBQUksQ0FBQ0YsWUFBWSxDQUFDO2NBQ3ZDO1lBQ0Q7WUFDQ2hLLE9BQU8sQ0FDTm1LLGtCQUFrQixDQUFDUixtQkFBbUIsQ0FBQyxDQUN2Q1MsSUFBSSxDQUFDWixrQkFBa0IsQ0FBQyxDQUN4QmEsS0FBSyxDQUFFQyxHQUFHLElBQUs7Y0FDZkMsR0FBRyxDQUFDQyxLQUFLLENBQUNGLEdBQWEsQ0FBQztZQUN6QixDQUFDLENBQUM7VUFDSjtRQUNEO1FBQ0EsTUFBTWhHLGlCQUFpQixHQUFHaUYsUUFBUSxDQUFDeEgsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUM3QztRQUNBLElBQUkwSSxZQUFZLEdBQUcsRUFBRTtRQUNyQixLQUFLLElBQUlsRyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdELGlCQUFpQixDQUFDMUQsTUFBTSxHQUFHLENBQUMsRUFBRTJELENBQUMsRUFBRSxFQUFFO1VBQ3RELElBQUlBLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVmtHLFlBQVksSUFBSSxHQUFHO1VBQ3BCO1VBQ0FBLFlBQVksSUFBSW5HLGlCQUFpQixDQUFDQyxDQUFDLENBQUM7VUFDcEMsSUFBSSxJQUFJLENBQUN2RyxTQUFTLENBQUN5TSxZQUFZLENBQUMsS0FBSzVKLFNBQVMsRUFBRTtZQUMvQztZQUNBLElBQUksQ0FBQ3NELFdBQVcsQ0FBQ3NHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztVQUNuQztRQUNEO1FBQ0EsT0FBTy9CLGVBQWUsQ0FBQzNFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzNGLElBQUksRUFBRWlHLEtBQUssRUFBRXJFLE9BQU8sRUFBRTZFLFdBQVcsQ0FBQyxDQUFDO01BQ3hFLENBQUM7TUFDRCxTQUFTNkYsbUJBQW1CQSxDQUFDQyxlQUF5QixFQUFFQyxPQUFnQyxFQUFVO1FBQ2pHLEtBQUssTUFBTWpGLFdBQVcsSUFBSWlGLE9BQU8sRUFBRTtVQUNsQztVQUNBO1VBQ0E7VUFDQSxNQUFNNUssT0FBTyxHQUFHNEssT0FBTyxHQUFHakYsV0FBVyxDQUFtQjtVQUN4RCxNQUFNa0YsU0FBUyxHQUFHN0ssT0FBTyxFQUFFOEssR0FBRyxHQUFHLCtCQUErQixDQUFDO1VBQ2pFLElBQUksT0FBTzlLLE9BQU8sS0FBSyxRQUFRLElBQUksQ0FBQzZLLFNBQVMsRUFBRTtZQUM5Q0QsT0FBTyxDQUFDakYsV0FBVyxDQUFDLEdBQUcrRSxtQkFBbUIsQ0FBQ0MsZUFBZSxFQUFFQyxPQUFPLENBQUNqRixXQUFXLENBQTRCLENBQUM7WUFDNUcsSUFBSTNDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMkgsT0FBTyxDQUFDakYsV0FBVyxDQUFXLENBQUMsQ0FBQy9FLE1BQU0sS0FBSyxDQUFDLEVBQUU7Y0FDN0QsT0FBT2dLLE9BQU8sQ0FBQ2pGLFdBQVcsQ0FBQztZQUM1QjtVQUNEO1VBQ0EsS0FBSyxNQUFNa0QsY0FBYyxJQUFJOEIsZUFBZSxFQUFFO1lBQzdDLElBQUloRixXQUFXLENBQUNvRixRQUFRLENBQUNsQyxjQUFjLENBQUMsRUFBRTtjQUN6QyxPQUFPK0IsT0FBTyxDQUFDakYsV0FBVyxDQUFDO1lBQzVCO1VBQ0Q7UUFDRDtRQUNBLE9BQU9pRixPQUFPO01BQ2Y7TUFDQTdDLFVBQVUsQ0FBQ2lELHFCQUFxQixHQUFHM0Msb0JBQW9CO01BQ3ZETixVQUFVLENBQUNrRCx1QkFBdUIsR0FBRyxZQUF1QjtRQUMzRCxPQUFPLElBQUksQ0FBQ0QscUJBQXFCO01BQ2xDLENBQUM7TUFDRGpELFVBQVUsQ0FBQ0ssV0FBVyxHQUFHLFVBQVU4QyxRQUFtQyxFQUFRO1FBQzdFLE1BQU1DLFdBQVcsR0FBR1QsbUJBQW1CLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLElBQUksQ0FBQ00scUJBQXFCLENBQUNJLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ0ssT0FBTyxDQUFDRixXQUFXLENBQUM7UUFDL0MsS0FBSyxNQUFNRyxhQUFhLElBQUlKLFFBQVEsRUFBRTtVQUNyQyxJQUFJLENBQUNGLHFCQUFxQixDQUFDN0csV0FBVyxDQUFDLEdBQUdtSCxhQUFhLHNCQUFzQixFQUFFSixRQUFRLENBQUNJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1VBQ3BILElBQUksQ0FBQ1AscUJBQXFCLENBQUM3RyxXQUFXLENBQUMsR0FBR21ILGFBQWEsc0JBQXNCLEVBQUVKLFFBQVEsQ0FBQ0ksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDeEg7UUFDQXJELFNBQVMsQ0FBQ3BFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQ21ILFFBQVEsQ0FBQyxDQUFDO01BQ2xDLENBQUM7TUFDRCxNQUFNTyxjQUFjLEdBQUcxRCxVQUFVLENBQUMyRCxZQUFZLENBQUNDLElBQUksQ0FBQzVELFVBQVUsQ0FBQztNQUMvREEsVUFBVSxDQUFDMkQsWUFBWSxHQUFHLFVBQVV0TixJQUFZLEVBQUU0QixPQUF1QixFQUFFNEwsVUFBVSxFQUF3QjtRQUM1RyxNQUFNQyw2QkFBNkIsR0FBRzdELFlBQVksQ0FBQzhELDBCQUEwQixDQUFDLENBQUMsRUFBRUMsZUFBZSxDQUFDLENBQUMsQ0FBQ0Msc0JBQXNCO1FBQ3pILE1BQU1DLDZCQUE2QixHQUFHdE8sV0FBVyxDQUFDdU8sb0NBQW9DLENBQ3JGLElBQUksRUFDSlQsY0FBYyxFQUNkck4sSUFBSSxFQUNKNEIsT0FBTyxFQUNQNkwsNkJBQ0QsQ0FBQztRQUNELElBQUlJLDZCQUE2QixFQUFFO1VBQ2xDLE9BQU9BLDZCQUE2QjtRQUNyQztRQUNBLElBQUk3TixJQUFJLENBQUMyTSxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSS9LLE9BQU8sRUFBRTtVQUM1RCxNQUFNbU0saUJBQWlCLEdBQUdWLGNBQWMsQ0FBQ3JOLElBQUksRUFBRTRCLE9BQU8sQ0FBQztVQUN2RCtILFVBQVUsQ0FBQ0UsOEJBQThCLENBQUNpQyxJQUFJLENBQUNpQyxpQkFBaUIsQ0FBQztVQUNqRSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJLENBQUNwQixxQkFBcUIsQ0FBQ1UsWUFBWSxDQUFDdE4sSUFBSSxFQUFFNEIsT0FBTyxDQUFvQztVQUVuSG1NLGlCQUFpQixDQUFDRSxZQUFZLENBQUMsTUFBTTtZQUNwQ0QsaUJBQWlCLENBQUMzQyxPQUFPLENBQUMsQ0FBQztVQUM1QixDQUFDLENBQUM7VUFDRjBDLGlCQUFpQixDQUNmRyxZQUFZLENBQUMsQ0FBQyxDQUNkbEMsSUFBSSxDQUFDLE1BQU07WUFDWGdDLGlCQUFpQixDQUFDM0MsT0FBTyxDQUFDLENBQUM7WUFDM0I7VUFDRCxDQUFDLENBQUMsQ0FDRFksS0FBSyxDQUFFQyxHQUFHLElBQUs7WUFDZkMsR0FBRyxDQUFDQyxLQUFLLENBQUNGLEdBQWEsQ0FBQztVQUN6QixDQUFDLENBQUM7VUFDSCxPQUFPOEIsaUJBQWlCO1FBQ3pCO1FBQ0EsSUFBSWhPLElBQUksQ0FBQzZMLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtVQUMvQixNQUFNc0MsV0FBVyxHQUFHLElBQUksQ0FBQ3ZCLHFCQUFxQixDQUFDVSxZQUFZLENBQUN0TixJQUFJLEVBQUU0QixPQUFPLENBRXhFO1VBQ0QsSUFBSTVCLElBQUksQ0FBQzJNLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFO1lBQ2pELE9BQU93QixXQUFXO1VBQ25CO1VBQ0FBLFdBQVcsQ0FBQ0MsY0FBYyxHQUFHLFVBQVUvTCxLQUFhLEVBQVc7WUFDOUQsT0FBT0EsS0FBSyxJQUFJQSxLQUFLLEtBQUtzSCxVQUFVO1VBQ3JDLENBQUM7VUFDRCxJQUFJM0osSUFBSSxDQUFDNkwsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDdkMsTUFBTXdDLFVBQVUsR0FBR3JMLGtCQUFrQixDQUFDc0wsMkJBQTJCLENBQ2hFdE8sSUFBSSxFQUNKZ0Qsa0JBQWtCLENBQUM2SCxZQUFZLENBQUMsSUFBSSxDQUFDM0ksWUFBWSxDQUFDLENBQUMsQ0FDcEQsQ0FBQztZQUNELE1BQU1xTSxZQUFZLEdBQUcsSUFBSUMsR0FBRyxDQUFDO2NBQUVDLEdBQUcsRUFBRUMsaUJBQWlCLENBQUNMLFVBQVUsQ0FBQztjQUFFTSxnQkFBZ0IsRUFBRTNPO1lBQUssQ0FBQyxDQUFDO1lBQzVGLE1BQU00Tyx3QkFBd0IsR0FBR1QsV0FBVyxDQUFDVSxPQUFPLENBQUN0QixJQUFJLENBQUNZLFdBQVcsQ0FBQztZQUN0RUEsV0FBVyxDQUFDVSxPQUFPLEdBQUcsTUFBWTtjQUNqQ04sWUFBWSxFQUFFTSxPQUFPLENBQUMsQ0FBQztjQUN2QixPQUFPRCx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxNQUFNRSxZQUFZLEdBQUdYLFdBQVcsQ0FBQ1ksVUFBVTtZQUMzQyxJQUFJRCxZQUFZLEVBQUU7Y0FDakJYLFdBQVcsQ0FBQ1ksVUFBVSxHQUFJQyxVQUFtQixJQUFXO2dCQUN2RFQsWUFBWSxFQUFFVSxpQkFBaUIsQ0FBQ0QsVUFBVSxDQUFDO2dCQUMzQyxPQUFPRixZQUFZLENBQUN2QixJQUFJLENBQUNZLFdBQVcsQ0FBQyxDQUFDYSxVQUFVLENBQUM7Y0FDbEQsQ0FBQztZQUNGO1lBRUFULFlBQVksQ0FBQ1csUUFBUSxDQUFDLElBQUksQ0FBQztZQUMzQixNQUFNQyxZQUFZLEdBQUdaLFlBQVksQ0FBQ2EsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFQyxPQUFPO1lBQ2hFLE1BQU1DLGFBQWEsR0FBR0gsWUFBWSxFQUFFSSxXQUFXO1lBQy9DLElBQUlELGFBQWEsRUFBRTtjQUNsQmYsWUFBWSxDQUFDYSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUNDLE9BQU8sQ0FBQ0UsV0FBVyxHQUFHLE1BQVk7Z0JBQ3BFLE9BQU9ELGFBQWEsQ0FBQy9CLElBQUksQ0FBQzRCLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztjQUM5QyxDQUFDO1lBQ0Y7WUFDQVosWUFBWSxDQUFDVSxpQkFBaUIsQ0FBQ3JOLE9BQU8sQ0FBQztVQUN4QztVQUNBLE9BQU91TSxXQUFXO1FBQ25CO1FBQ0EsT0FBT2QsY0FBYyxDQUFDck4sSUFBSSxFQUFFNEIsT0FBTyxFQUFFNEwsVUFBVSxDQUFDO01BQ2pELENBQUM7TUFDRCxNQUFNZ0MsU0FBUyxHQUFHN0YsVUFBVSxDQUFDa0YsT0FBTyxDQUFDdEIsSUFBSSxDQUFDNUQsVUFBVSxDQUFDO01BQ3JEQSxVQUFVLENBQUNrRixPQUFPLEdBQUcsWUFBa0I7UUFDdEMsS0FBSyxNQUFNWSxTQUFTLElBQUk5RixVQUFVLENBQUNFLDhCQUE4QixFQUFFO1VBQ2xFNEYsU0FBUyxDQUFDWixPQUFPLENBQUMsQ0FBQztRQUNwQjtRQUNBLElBQUksQ0FBQ2pDLHFCQUFxQixDQUFDaUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsT0FBT1csU0FBUyxDQUFDN0osS0FBSyxDQUFDLElBQUksQ0FBQztNQUM3QixDQUFDO0lBQ0YsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0MrSixzQkFBc0JBLENBQUMxUCxJQUF3QixFQUFFMlAsZ0JBQTRDLEVBQUVqUSxTQUFxQixFQUFVO01BQzdILElBQUlrUSxJQUFJLEdBQUc1UCxJQUFJLEtBQUt5QyxTQUFTLEdBQUd6QyxJQUFJLEdBQUcsRUFBRTtNQUN6QyxJQUFJQSxJQUFJLEVBQUU4SCxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDcEMsTUFBTStILGFBQWEsR0FBRzdQLElBQUksQ0FBQ3dMLFNBQVMsQ0FBQyxFQUFFLEVBQUV4TCxJQUFJLENBQUN3QyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUk7VUFDSCxJQUFJbU4sZ0JBQWdCLEVBQUU7WUFDckJDLElBQUksR0FBR0QsZ0JBQWdCLENBQUNHLHVCQUF1QixDQUFDRCxhQUFhLENBQUMsQ0FBQ0UsVUFBVSxFQUFFQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUU7VUFDNUYsQ0FBQyxNQUFNO1lBQ05KLElBQUksR0FBR2xRLFNBQVMsRUFBRUUsU0FBUyxDQUFDaVEsYUFBYSxDQUFDO1VBQzNDO1FBQ0QsQ0FBQyxDQUFDLE9BQU9JLENBQUMsRUFBRTtVQUNYOUQsR0FBRyxDQUFDK0QsSUFBSSxDQUFDLHNEQUFzREwsYUFBYSxFQUFFLENBQUM7UUFDaEY7TUFDRDtNQUNBLE9BQU9ELElBQUk7SUFDWixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NPLGVBQWUsRUFBRSxTQUFBQSxDQUFVelEsU0FBeUIsRUFBRTZILFdBQW1CLEVBQXNCO01BQzlGLE1BQU10SCxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDcUgsV0FBVyxDQUFDO01BQ3pELE1BQU1wSCxVQUFVLEdBQUdDLDJCQUEyQixDQUFDSCxXQUFXLENBQUM7TUFDM0QsTUFBTTZNLFFBQVEsR0FBRzNNLFVBQVUsQ0FBQ2lRLGdCQUFnQixDQUFDbFAsV0FBVyxDQUFDQyxNQUFNLEVBQUVrUCxRQUFRO01BQ3pFLE9BQU9uRiwwQkFBMEIsQ0FBQzRCLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLENBQUM5TSxJQUFJLEdBQUd5QyxTQUFTO0lBQ3hFLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3FMLG9DQUFvQyxFQUFFLFNBQUFBLENBQ3JDbkUsVUFBc0IsRUFDdEIwRCxjQUF3QixFQUN4QnJOLElBQVksRUFDWjRCLE9BQXVCLEVBQ3ZCNkwsNkJBQXNDLEVBQ1I7TUFDOUIsSUFBSXpOLElBQUksQ0FBQzZMLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1FBQzVDLE1BQU15RSxxQkFBcUIsR0FBRzNHLFVBQVUsQ0FBQ2tELHVCQUF1QixDQUFDLENBQUMsQ0FBQ1MsWUFBWSxDQUFDdE4sSUFBSSxFQUFFNEIsT0FBTyxDQUU1RjtRQUNELE1BQU0yTyxpQ0FBaUMsR0FBSUMsb0JBQXFFLElBQVc7VUFDMUg7VUFDQSxNQUFNMUIsWUFBWSxHQUFHd0IscUJBQXFCLENBQUN2QixVQUFVO1VBQ3JELElBQUlELFlBQVksRUFBRTtZQUNqQndCLHFCQUFxQixDQUFDdkIsVUFBVSxHQUFJQyxVQUFtQixJQUFXO2NBQ2pFd0Isb0JBQW9CLEVBQUV6QixVQUFVLENBQUNDLFVBQVUsQ0FBQztjQUM1QyxPQUFPRixZQUFZLENBQUN2QixJQUFJLENBQUNpRCxvQkFBb0IsQ0FBQyxDQUFDeEIsVUFBVSxDQUFDO1lBQzNELENBQUM7VUFDRjtRQUNELENBQUM7UUFDRCxJQUFJcE4sT0FBTyxFQUFFO1VBQ1osTUFBTTtZQUFFNk8sNkJBQTZCO1lBQUVDO1VBQXNCLENBQUMsR0FBR25SLFdBQVcsQ0FBQ29SLGlDQUFpQyxDQUM3Ry9PLE9BQU8sRUFDUDVCLElBQ0QsQ0FBQztVQUNELElBQUl5USw2QkFBNkIsSUFBSUMscUJBQXFCLElBQUksQ0FBQ2pELDZCQUE2QixFQUFFO1lBQzdGLE1BQU1tRCxZQUFZLEdBQUdqSCxVQUFVLENBQUNFLDhCQUE4QixDQUFDZ0gsSUFBSSxDQUFFQyxlQUFlLElBQUs7Y0FDeEY7Z0JBQ0M7Z0JBQ0E7Z0JBQ0E7Z0JBQ0FsUCxPQUFPLENBQUNzQixPQUFPLENBQUMsQ0FBQyxLQUFLNE4sZUFBZSxDQUFDN04sVUFBVSxDQUFDLENBQUMsRUFBRUMsT0FBTyxDQUFDLENBQUMsSUFDN0R1Tiw2QkFBNkIsS0FBS0ssZUFBZSxDQUFDNU4sT0FBTyxDQUFDO2NBQUM7WUFFN0QsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDME4sWUFBWSxFQUFFO2NBQ2xCLE1BQU1KLG9CQUFvQixHQUFHbkQsY0FBYyxDQUFDb0QsNkJBQTZCLEVBQUU3TyxPQUFPLENBRWpGO2NBQ0Q7Y0FDQTRPLG9CQUFvQixDQUFDTyxPQUFPLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7Y0FDOUNSLG9CQUFvQixDQUFDUyxjQUFjLENBQUM3RyxXQUFXLENBQUNDLE1BQU0sQ0FBQztjQUN2RFYsVUFBVSxDQUFDRSw4QkFBOEIsQ0FBQ2lDLElBQUksQ0FBQzBFLG9CQUFvQixDQUFDO2NBQ3BFQSxvQkFBb0IsQ0FBQ3ZDLFlBQVksQ0FBRWlELEtBQXVDLElBQUs7Z0JBQzlFO2dCQUNBLE1BQU1DLGVBQWUsR0FBR0QsS0FBSyxDQUFDRSxTQUFTLENBQUMsQ0FBQztnQkFDekMsTUFBTUMsY0FBYyxHQUFHSCxLQUFLLENBQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUNuTyxVQUFVLENBQUMsQ0FBbUI7Z0JBQ3ZFLElBQUlvTyxjQUFjLEVBQUU7a0JBQ25CLE1BQU1DLHNCQUFzQixHQUFHSCxlQUFlLENBQUNJLFFBQVEsQ0FBQyxDQUFDO2tCQUN6RGhTLFdBQVcsQ0FBQ2lTLHdDQUF3QyxDQUFDRixzQkFBc0IsRUFBRUQsY0FBYyxDQUFDO2tCQUM1RmYscUJBQXFCLENBQUNqRixPQUFPLENBQUMsQ0FBQztnQkFDaEM7Y0FDRCxDQUFDLENBQUM7Y0FDRjtjQUNBO2NBQ0FtRixvQkFBb0IsQ0FBQ3RDLFlBQVksQ0FBQyxDQUFDLENBQUNqQyxLQUFLLENBQUVHLEtBQUssSUFBSztnQkFDcERELEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLHVDQUF1QyxFQUFFQSxLQUFLLENBQUM7Y0FDMUQsQ0FBQyxDQUFDO2NBQ0ZtRSxpQ0FBaUMsQ0FBQ0Msb0JBQW9CLENBQUM7WUFDeEQ7VUFDRDtRQUNEO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0FGLHFCQUFxQixDQUFDbEMsY0FBYyxHQUFHLFVBQVUvTCxLQUFhLEVBQVc7VUFDeEUsT0FBTyxJQUFJLENBQUNZLFVBQVUsQ0FBQyxDQUFDLEdBQUdaLEtBQUssSUFBSUEsS0FBSyxLQUFLc0gsVUFBVSxHQUFHdEgsS0FBSyxJQUFJLElBQUksQ0FBQ1IsUUFBUSxDQUFDLENBQUMsS0FBS1EsS0FBSztRQUM5RixDQUFDO1FBQ0QsT0FBT2lPLHFCQUFxQjtNQUM3QjtJQUNELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0ssaUNBQWlDLEVBQUUsU0FBQUEsQ0FDbEMvTyxPQUF1QixFQUN2QjZQLFdBQW1CLEVBQ3FFO01BQ3hGLE1BQU0vUixTQUFTLEdBQUdrQyxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUNLLFlBQVksQ0FBQyxDQUFDO01BQ25ELE1BQU13UCxlQUFlLEdBQUdoUyxTQUFTLENBQUNvRCxXQUFXLENBQUNsQixPQUFPLENBQUNzQixPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ2hFLE1BQU1qRCxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBYyxDQUFDd1IsZUFBZSxDQUFDO01BQzdELE1BQU10QixnQkFBZ0IsR0FBR2hRLDJCQUEyQixDQUFDSCxXQUFXLENBQUMsQ0FBQ21RLGdCQUFnQjtNQUNsRixNQUFNSyw2QkFBNkIsR0FBSUwsZ0JBQWdCLEVBQUVsUCxXQUFXLEVBQUU2SCxFQUFFLEVBQ3JFNEksZUFBZSxFQUFFM1IsSUFBSTtNQUN4QjtNQUNBLE1BQU1nRyxZQUFZLEdBQUd5TCxXQUFXLENBQUM5TixLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckUsTUFBTStNLHFCQUFxQixHQUFHTixnQkFBZ0IsQ0FBQ3dCLGdCQUFnQixDQUFDZixJQUFJLENBQUVnQixjQUFjLElBQUs7UUFDeEYsSUFBSUEsY0FBYyxDQUFDQyxJQUFJLEtBQUtyQiw2QkFBNkIsRUFBRTtVQUMxRCxPQUFRb0IsY0FBYyxFQUFFRSxVQUFVLEVBQWtCQyxVQUFVLENBQUNuQixJQUFJLENBQUVvQixRQUFRLElBQUs7WUFDakYsT0FBT2pNLFlBQVksS0FBS2lNLFFBQVEsQ0FBQ0gsSUFBSTtVQUN0QyxDQUFDLENBQUM7UUFDSDtNQUNELENBQUMsQ0FBQztNQUNGLE9BQU87UUFDTnJCLDZCQUE2QjtRQUM3QkM7TUFDRCxDQUFDO0lBQ0YsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ2Msd0NBQXdDLEVBQUUsU0FBQUEsQ0FBVUYsc0JBQXVDLEVBQUVELGNBQThCLEVBQVE7TUFDbEksSUFBSUMsc0JBQXNCLEVBQUU7UUFDM0IsS0FBSyxNQUFNWSxtQkFBbUIsSUFBSVosc0JBQXNCLEVBQUU7VUFDekQsTUFBTWEsdUJBQXVCLEdBQUdiLHNCQUFzQixDQUFDWSxtQkFBbUIsQ0FBQztVQUMzRSxNQUFNRSxjQUFjLEdBQUdGLG1CQUFtQjtVQUMxQyxNQUFNakksb0JBQW9CLEdBQUdvSCxjQUFjLENBQUN4UCxRQUFRLENBQUMsQ0FBQyxDQUFDZ0wsdUJBQXVCLENBQUMsQ0FBQztVQUNoRixNQUFNd0YsZUFBZSxHQUFHLEVBQUU7VUFDMUIsS0FBSyxNQUFNQyxzQkFBc0IsSUFBSUgsdUJBQXVCLEVBQUU7WUFDN0QsSUFBSUcsc0JBQXNCLENBQUNDLDRCQUE0QixFQUFFO2NBQ3hELE1BQU1DLDhCQUE4QixHQUFHbkIsY0FBYyxDQUFDbk8sT0FBTyxDQUM1RGtQLGNBQWMsR0FBRywyQ0FDbEIsQ0FBQztjQUNELE1BQU1LLG9DQUFvQyxHQUFHcEIsY0FBYyxDQUFDbk8sT0FBTyxDQUNsRWtQLGNBQWMsR0FBRyxpREFDbEIsQ0FBQztjQUNEbkksb0JBQW9CLENBQUNsRSxXQUFXLENBQy9CeU0sOEJBQThCLEVBQzlCRixzQkFBc0IsQ0FBQ0kscUJBQXFCLEVBQzVDckIsY0FBYyxFQUNkLEtBQ0QsQ0FBQztjQUNEcEgsb0JBQW9CLENBQUNsRSxXQUFXLENBQy9CME0sb0NBQW9DLEVBQ3BDSCxzQkFBc0IsQ0FBQ0ssMkJBQTJCLEVBQ2xEdEIsY0FBYyxFQUNkLEtBQ0QsQ0FBQztjQUNEO1lBQ0Q7WUFDQTtZQUNBO1lBQ0EsSUFBSWlCLHNCQUFzQixDQUFDSSxxQkFBcUIsRUFBRTtjQUNqREwsZUFBZSxDQUFDdkcsSUFBSSxDQUFDd0csc0JBQXNCLENBQUNJLHFCQUFxQixDQUFDO1lBQ25FO1VBQ0Q7VUFDQSxJQUFJLENBQUNQLHVCQUF1QixJQUFJLENBQUNBLHVCQUF1QixDQUFDM1AsTUFBTSxFQUFFO1lBQ2hFLE1BQU1nUSw4QkFBOEIsR0FBR25CLGNBQWMsQ0FBQ25PLE9BQU8sQ0FDNURrUCxjQUFjLEdBQUcsMkNBQ2xCLENBQUM7WUFDRCxNQUFNSyxvQ0FBb0MsR0FBR3BCLGNBQWMsQ0FBQ25PLE9BQU8sQ0FDbEVrUCxjQUFjLEdBQUcsaURBQ2xCLENBQUM7WUFDRG5JLG9CQUFvQixDQUFDbEUsV0FBVyxDQUFDeU0sOEJBQThCLEVBQUUsSUFBSSxFQUFFbkIsY0FBYyxFQUFFLEtBQUssQ0FBQztZQUM3RnBILG9CQUFvQixDQUFDbEUsV0FBVyxDQUFDME0sb0NBQW9DLEVBQUUsRUFBRSxFQUFFcEIsY0FBYyxFQUFFLEtBQUssQ0FBQztVQUNsRztVQUNBcEgsb0JBQW9CLENBQUNsRSxXQUFXLENBQy9Cc0wsY0FBYyxDQUFDbk8sT0FBTyxDQUFDa1AsY0FBYyxHQUFHLDBDQUEwQyxDQUFDLEVBQ25GQyxlQUFlLEVBQ2ZoQixjQUFjLEVBQ2QsS0FDRCxDQUFDO1VBQ0RwSCxvQkFBb0IsQ0FBQ2xFLFdBQVcsQ0FBQ3NMLGNBQWMsQ0FBQ25PLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFbU8sY0FBYyxDQUFDO1FBQ2xHO01BQ0Q7SUFDRCxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0N1Qiw0QkFBNEIsRUFBRUEsQ0FBQy9KLFVBQXNCLEVBQUVOLFNBQW9CLEtBQWU7TUFDekYsTUFBTXNLLGFBQXVCLEdBQUcsRUFBRTtNQUNsQyxNQUFNQyxtQkFBbUIsR0FBSUMsZUFBdUMsSUFBVztRQUM5RUEsZUFBZSxFQUFFN1IsV0FBVyxFQUFFOFIsSUFBSSxFQUFFQyxhQUFhLEVBQUVDLE9BQU8sQ0FBRUMsWUFBMEIsSUFBSztVQUMxRkEsWUFBWSxDQUFDQyxHQUFHLENBQUNGLE9BQU8sQ0FBRUcsR0FBZ0IsSUFBSztZQUM5Q1IsYUFBYSxDQUFDL0csSUFBSSxDQUFDdUgsR0FBRyxDQUFDQyxJQUFJLENBQUNyTixLQUFLLENBQUM7VUFDbkMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO01BQ0gsQ0FBQztNQUNELE1BQU1zTixtQkFBbUIsR0FBSUMsRUFBYyxJQUFXO1FBQ3JEQSxFQUFFLEVBQUV0UyxXQUFXLEVBQUVDLE1BQU0sRUFBRXNTLFlBQVksRUFBRVAsT0FBTyxDQUFFUSxZQUEwQixJQUFLO1VBQzlFLElBQUksQ0FBQ2IsYUFBYSxDQUFDaEgsUUFBUSxDQUFDNkgsWUFBWSxDQUFDek4sS0FBSyxDQUFDLEVBQUU7WUFDaEQ0TSxhQUFhLENBQUMvRyxJQUFJLENBQUM0SCxZQUFZLENBQUN6TixLQUFLLENBQUM7VUFDdkM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDO01BQ0Q2TSxtQkFBbUIsQ0FBQ3ZLLFNBQVMsQ0FBQztNQUM5QixJQUFJLENBQUNzSyxhQUFhLENBQUNyUSxNQUFNLEVBQUU7UUFDMUJzUSxtQkFBbUIsQ0FBQ2pLLFVBQVUsQ0FBQztNQUNoQztNQUNBMEssbUJBQW1CLENBQUMxSyxVQUFVLENBQUM7TUFDL0IsT0FBT2dLLGFBQWE7SUFDckI7RUFDRCxDQUFDO0VBQUMsT0FhYXRULFdBQVc7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|