@sapui5/sap.fe.core 1.102.3 → 1.105.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -29,7 +29,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
29
29
|
|
|
30
30
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
31
31
|
|
|
32
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf
|
|
32
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
33
33
|
|
|
34
34
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
35
35
|
|
|
@@ -51,7 +51,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
51
51
|
var _proto = InternalRouting.prototype;
|
|
52
52
|
|
|
53
53
|
_proto.onExit = function onExit() {
|
|
54
|
-
|
|
54
|
+
if (this._oRoutingService) {
|
|
55
|
+
this._oRoutingService.detachRouteMatched(this._fnRouteMatchedBound);
|
|
56
|
+
}
|
|
55
57
|
};
|
|
56
58
|
|
|
57
59
|
_proto.onInit = function onInit() {
|
|
@@ -123,10 +125,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
123
125
|
/**
|
|
124
126
|
* Navigates to the specified navigation target.
|
|
125
127
|
*
|
|
126
|
-
* @param
|
|
127
|
-
* @param
|
|
128
|
-
* @param
|
|
129
|
-
* @param
|
|
128
|
+
* @param oContext Context instance
|
|
129
|
+
* @param sNavigationTargetName Navigation target name
|
|
130
|
+
* @param oSemanticObject Semantic object
|
|
131
|
+
* @param bPreserveHistory True to force the new URL to be added at the end of the browser history (no replace)
|
|
130
132
|
* @ui5-restricted
|
|
131
133
|
*/
|
|
132
134
|
;
|
|
@@ -149,9 +151,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
149
151
|
/**
|
|
150
152
|
* Navigates to the specified navigation target route.
|
|
151
153
|
*
|
|
152
|
-
* @param
|
|
153
|
-
* @param
|
|
154
|
-
* @returns
|
|
154
|
+
* @param sTargetRouteName Name of the target route
|
|
155
|
+
* @param [oParameters] Parameters to be used with route to create the target hash
|
|
156
|
+
* @returns Promise that is resolved when the navigation is finalized
|
|
155
157
|
* @ui5-restricted
|
|
156
158
|
*/
|
|
157
159
|
;
|
|
@@ -162,9 +164,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
162
164
|
/**
|
|
163
165
|
* Navigates to a specific context.
|
|
164
166
|
*
|
|
165
|
-
* @param
|
|
166
|
-
* @param
|
|
167
|
-
* @returns
|
|
167
|
+
* @param oContext The context to be navigated to
|
|
168
|
+
* @param [mParameters] Optional navigation parameters
|
|
169
|
+
* @returns Promise resolved when the navigation has been triggered
|
|
168
170
|
* @ui5-restricted
|
|
169
171
|
*/
|
|
170
172
|
;
|
|
@@ -182,9 +184,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
182
184
|
// the subsequent call to navigateToContext conflicts with the current one
|
|
183
185
|
this._oRouterProxy.activateRouteMatchSynchronization();
|
|
184
186
|
|
|
185
|
-
mParameters.asyncContext.then(function (
|
|
187
|
+
mParameters.asyncContext.then(function (asyncContext) {
|
|
186
188
|
// once the context is returned we navigate into it
|
|
187
|
-
_this2.navigateToContext(
|
|
189
|
+
_this2.navigateToContext(asyncContext, {
|
|
188
190
|
checkNoHashChange: mParameters.checkNoHashChange,
|
|
189
191
|
editable: mParameters.editable,
|
|
190
192
|
bPersistOPScroll: mParameters.bPersistOPScroll,
|
|
@@ -227,9 +229,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
227
229
|
/**
|
|
228
230
|
* Navigates backwards from a context.
|
|
229
231
|
*
|
|
230
|
-
* @param
|
|
231
|
-
* @param
|
|
232
|
-
* @returns
|
|
232
|
+
* @param oContext Context to be navigated from
|
|
233
|
+
* @param [mParameters] Optional navigation parameters
|
|
234
|
+
* @returns Promise resolved when the navigation has been triggered
|
|
233
235
|
* @ui5-restricted
|
|
234
236
|
*/
|
|
235
237
|
;
|
|
@@ -242,9 +244,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
242
244
|
/**
|
|
243
245
|
* Navigates forwards to a context.
|
|
244
246
|
*
|
|
245
|
-
* @param
|
|
246
|
-
* @param
|
|
247
|
-
* @returns
|
|
247
|
+
* @param oContext Context to be navigated to
|
|
248
|
+
* @param mParameters Optional navigation parameters
|
|
249
|
+
* @returns Promise resolved when the navigation has been triggered
|
|
248
250
|
* @ui5-restricted
|
|
249
251
|
*/
|
|
250
252
|
;
|
|
@@ -287,8 +289,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
287
289
|
/**
|
|
288
290
|
* Checks if one of the current views on the screen is bound to a given context.
|
|
289
291
|
*
|
|
290
|
-
* @param
|
|
291
|
-
* @returns
|
|
292
|
+
* @param oContext
|
|
293
|
+
* @returns `true` if the state is impacted by the context
|
|
292
294
|
* @ui5-restricted
|
|
293
295
|
*/
|
|
294
296
|
;
|
|
@@ -358,7 +360,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
358
360
|
* Called when a route is matched.
|
|
359
361
|
* Builds the binding context from the navigation parameters, and bind the page accordingly.
|
|
360
362
|
*
|
|
361
|
-
* @param
|
|
363
|
+
* @param oEvent
|
|
362
364
|
* @ui5-restricted
|
|
363
365
|
*/
|
|
364
366
|
;
|
|
@@ -416,9 +418,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
416
418
|
/**
|
|
417
419
|
* Deferred binding (during object creation).
|
|
418
420
|
*
|
|
419
|
-
* @param
|
|
420
|
-
* @param
|
|
421
|
-
* @returns
|
|
421
|
+
* @param sTargetPath The path to the deffered context
|
|
422
|
+
* @param oNavigationParameters Navigation parameters
|
|
423
|
+
* @returns A Promise
|
|
422
424
|
* @ui5-restricted
|
|
423
425
|
*/
|
|
424
426
|
;
|
|
@@ -455,10 +457,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
455
457
|
/**
|
|
456
458
|
* Sets the binding context of the page from a path.
|
|
457
459
|
*
|
|
458
|
-
* @param
|
|
459
|
-
* @param
|
|
460
|
-
* @param
|
|
461
|
-
* @returns
|
|
460
|
+
* @param sTargetPath The path to the context
|
|
461
|
+
* @param oModel The OData model
|
|
462
|
+
* @param oNavigationParameters Navigation parameters
|
|
463
|
+
* @returns A Promise resolved once the binding has been set on the page
|
|
462
464
|
* @ui5-restricted
|
|
463
465
|
*/
|
|
464
466
|
;
|
|
@@ -485,10 +487,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
485
487
|
/**
|
|
486
488
|
* Creates the filter to retrieve a context corresponding to a semantic path.
|
|
487
489
|
*
|
|
488
|
-
* @param
|
|
489
|
-
* @param
|
|
490
|
-
* @param
|
|
491
|
-
* @returns
|
|
490
|
+
* @param sSemanticPath The semantic path
|
|
491
|
+
* @param aSemanticKeys The semantic keys for the path
|
|
492
|
+
* @param oMetaModel The instance of the meta model
|
|
493
|
+
* @returns The filter
|
|
492
494
|
* @ui5-restricted
|
|
493
495
|
*/
|
|
494
496
|
;
|
|
@@ -561,16 +563,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
561
563
|
and: false
|
|
562
564
|
});
|
|
563
565
|
aFilters.push(oDraftFilter);
|
|
564
|
-
|
|
565
|
-
return oCombinedFilter;
|
|
566
|
+
return new Filter(aFilters, true);
|
|
566
567
|
}
|
|
567
568
|
/**
|
|
568
569
|
* Converts a path with semantic keys to a path with technical keys.
|
|
569
570
|
*
|
|
570
|
-
* @param
|
|
571
|
-
* @param
|
|
572
|
-
* @param
|
|
573
|
-
* @returns
|
|
571
|
+
* @param sSemanticPath The path with semantic keys
|
|
572
|
+
* @param oModel The model for the path
|
|
573
|
+
* @param aSemanticKeys The semantic keys for the path
|
|
574
|
+
* @returns A Promise containing the path with technical keys if sSemanticPath could be interpreted as a semantic path, null otherwise
|
|
574
575
|
* @ui5-restricted
|
|
575
576
|
*/
|
|
576
577
|
;
|
|
@@ -596,7 +597,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
596
597
|
|
|
597
598
|
|
|
598
599
|
if (!((_sEntitySetPath = sEntitySetPath) !== null && _sEntitySetPath !== void 0 && _sEntitySetPath.startsWith("/"))) {
|
|
599
|
-
sEntitySetPath = "/"
|
|
600
|
+
sEntitySetPath = "/".concat(sEntitySetPath);
|
|
600
601
|
}
|
|
601
602
|
|
|
602
603
|
var oListBinding = oModel.bindList(sEntitySetPath, undefined, undefined, oFilter, {
|
|
@@ -614,9 +615,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
614
615
|
/**
|
|
615
616
|
* Checks if a path is eligible for semantic bookmarking.
|
|
616
617
|
*
|
|
617
|
-
* @param
|
|
618
|
-
* @param
|
|
619
|
-
* @returns
|
|
618
|
+
* @param sPath The path to test
|
|
619
|
+
* @param oMetaModel The associated metadata model
|
|
620
|
+
* @returns `true` if the path is eligible
|
|
620
621
|
* @ui5-restricted
|
|
621
622
|
*/
|
|
622
623
|
;
|
|
@@ -630,18 +631,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
630
631
|
} // Get the entitySet name
|
|
631
632
|
|
|
632
633
|
|
|
633
|
-
var sEntitySetPath = "/"
|
|
634
|
+
var sEntitySetPath = "/".concat(aMatches[1]); // Check the entity set supports draft (otherwise we don't support semantic bookmarking)
|
|
634
635
|
|
|
635
|
-
var oDraftRoot = oMetaModel.getObject(sEntitySetPath
|
|
636
|
-
var oDraftNode = oMetaModel.getObject(sEntitySetPath
|
|
636
|
+
var oDraftRoot = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
|
|
637
|
+
var oDraftNode = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
|
|
637
638
|
return oDraftRoot || oDraftNode ? true : false;
|
|
638
639
|
}
|
|
639
640
|
/**
|
|
640
641
|
* Builds a path with semantic keys from a path with technical keys.
|
|
641
642
|
*
|
|
642
|
-
* @param
|
|
643
|
+
* @param sPathToResolve The path to be transformed
|
|
643
644
|
* @param oModel The OData model
|
|
644
|
-
* @returns
|
|
645
|
+
* @returns String promise for the new path. If sPathToResolved couldn't be interpreted as a semantic path, it is returned as is.
|
|
645
646
|
* @ui5-restricted
|
|
646
647
|
*/
|
|
647
648
|
;
|
|
@@ -695,9 +696,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
695
696
|
/**
|
|
696
697
|
* Sets the binding context of the page from a path.
|
|
697
698
|
*
|
|
698
|
-
* @param
|
|
699
|
-
* @param
|
|
700
|
-
* @param
|
|
699
|
+
* @param sTargetPath The path to build the context. Needs to contain technical keys only.
|
|
700
|
+
* @param oModel The OData model
|
|
701
|
+
* @param oNavigationParameters Navigation parameters
|
|
701
702
|
* @ui5-restricted
|
|
702
703
|
*/
|
|
703
704
|
;
|
|
@@ -730,9 +731,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
730
731
|
/**
|
|
731
732
|
* Binds the page to a context.
|
|
732
733
|
*
|
|
733
|
-
* @param
|
|
734
|
-
* @param
|
|
735
|
-
* @param
|
|
734
|
+
* @param oContext Context to be bound
|
|
735
|
+
* @param oModel The OData model
|
|
736
|
+
* @param oNavigationParameters Navigation parameters
|
|
736
737
|
* @ui5-restricted
|
|
737
738
|
*/
|
|
738
739
|
;
|
|
@@ -743,49 +744,59 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
743
744
|
if (!oContext) {
|
|
744
745
|
this.onBeforeBinding(null);
|
|
745
746
|
this.onAfterBinding(null);
|
|
746
|
-
|
|
747
|
-
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
748
749
|
|
|
749
|
-
|
|
750
|
+
var oParentListBinding = oContext.getBinding();
|
|
750
751
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
752
|
+
var oRootViewController = this._oAppComponent.getRootViewController();
|
|
753
|
+
|
|
754
|
+
if (oRootViewController.isFclEnabled()) {
|
|
755
|
+
if (!oParentListBinding || !oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
|
|
756
|
+
// if the parentBinding is not a listBinding, we create a new context
|
|
757
|
+
oContext = this._createContext(oContext.getPath(), oModel);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
try {
|
|
761
|
+
this._setKeepAlive(oContext, true, function () {
|
|
762
|
+
var _oContext;
|
|
756
763
|
|
|
757
|
-
oContext.setKeepAlive(true, function () {
|
|
758
764
|
// it is possible that the context is no longer kept alive
|
|
759
|
-
if (oContext.isKeepAlive() && oRootViewController.isContextUsedInPages(oContext)) {
|
|
765
|
+
if ((_oContext = oContext) !== null && _oContext !== void 0 && _oContext.isKeepAlive() && oRootViewController.isContextUsedInPages(oContext)) {
|
|
760
766
|
_this6.navigateBackFromContext(oContext);
|
|
761
767
|
}
|
|
762
|
-
}, true
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
768
|
+
}, true // Load messages, otherwise they don't get refreshed later, e.g. for side effects
|
|
769
|
+
);
|
|
770
|
+
} catch (oError) {
|
|
771
|
+
// setKeepAlive throws an exception if the parent listbinding doesn't have $$ownRequest=true
|
|
772
|
+
// This case for custom fragments is supported, but an error is logged to make the lack of synchronization apparent
|
|
773
|
+
Log.error("View for ".concat(oContext.getPath(), " won't be synchronized. Parent listBinding must have binding parameter $$ownRequest=true"));
|
|
774
|
+
}
|
|
775
|
+
} else if (!oParentListBinding || oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
|
|
776
|
+
// We need to recreate the context otherwise we get errors
|
|
777
|
+
oContext = this._createContext(oContext.getPath(), oModel, oNavigationParameters.bNavigateToSiblingEntity);
|
|
778
|
+
} // Set the binding context with the proper before/after callbacks
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
this.onBeforeBinding(oContext, {
|
|
782
|
+
editable: oNavigationParameters.bTargetEditable,
|
|
783
|
+
listBinding: oParentListBinding,
|
|
784
|
+
bPersistOPScroll: oNavigationParameters.bPersistOPScroll,
|
|
785
|
+
bDraftNavigation: oNavigationParameters.bDraftNavigation,
|
|
786
|
+
showPlaceholder: oNavigationParameters.bShowPlaceholder
|
|
787
|
+
});
|
|
776
788
|
|
|
777
|
-
|
|
789
|
+
this._setBindingContext(oContext);
|
|
778
790
|
|
|
779
|
-
|
|
780
|
-
}
|
|
791
|
+
this.onAfterBinding(oContext);
|
|
781
792
|
}
|
|
782
793
|
/**
|
|
783
794
|
* Creates a context from a path.
|
|
784
795
|
*
|
|
785
|
-
* @param
|
|
786
|
-
* @param
|
|
787
|
-
* @param
|
|
788
|
-
* @returns
|
|
796
|
+
* @param sPath The path
|
|
797
|
+
* @param oModel The OData model
|
|
798
|
+
* @param navigateToSiblingEntity A parameter that determines whether to navigate to the context on data received
|
|
799
|
+
* @returns The created context
|
|
789
800
|
* @ui5-restricted
|
|
790
801
|
*/
|
|
791
802
|
;
|
|
@@ -796,7 +807,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
796
807
|
var navigateToSiblingEntity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
797
808
|
var oPageComponent = this._oPageComponent,
|
|
798
809
|
sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
|
|
799
|
-
sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/"
|
|
810
|
+
sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet),
|
|
800
811
|
oMetaModel = oModel.getMetaModel(),
|
|
801
812
|
mParameters = {
|
|
802
813
|
$$groupId: "$auto.Heroes",
|
|
@@ -804,15 +815,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
804
815
|
$$patchWithoutSideEffects: true
|
|
805
816
|
}; // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
|
|
806
817
|
|
|
807
|
-
var oDraftRoot = oMetaModel.getObject(sContextPath
|
|
808
|
-
var oDraftNode = oMetaModel.getObject(sContextPath
|
|
818
|
+
var oDraftRoot = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
|
|
819
|
+
var oDraftNode = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
|
|
809
820
|
|
|
810
821
|
var oRootViewController = this._oAppComponent.getRootViewController();
|
|
811
822
|
|
|
812
823
|
if (oRootViewController.isFclEnabled()) {
|
|
813
|
-
var oContext =
|
|
824
|
+
var oContext = this._getKeepAliveContext(oModel, sPath, false, mParameters);
|
|
814
825
|
|
|
815
|
-
if (
|
|
826
|
+
if (!oContext) {
|
|
827
|
+
throw new Error("Cannot create keepAlive context ".concat(sPath));
|
|
828
|
+
} else if (oDraftRoot || oDraftNode) {
|
|
816
829
|
if (oContext.getProperty("IsActiveEntity") === undefined) {
|
|
817
830
|
oContext.requestProperty(["HasActiveEntity", "HasDraftEntity", "IsActiveEntity"]);
|
|
818
831
|
|
|
@@ -829,7 +842,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
829
842
|
return oContext;
|
|
830
843
|
} else {
|
|
831
844
|
if (sEntitySet) {
|
|
832
|
-
var sMessagesPath = oMetaModel.getObject(sContextPath
|
|
845
|
+
var sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
833
846
|
|
|
834
847
|
if (sMessagesPath) {
|
|
835
848
|
mParameters.$select = sMessagesPath;
|
|
@@ -845,6 +858,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
845
858
|
}
|
|
846
859
|
}
|
|
847
860
|
|
|
861
|
+
if (this._oView.getBindingContext()) {
|
|
862
|
+
var _this$_oView$getBindi2;
|
|
863
|
+
|
|
864
|
+
var oPreviousBinding = (_this$_oView$getBindi2 = this._oView.getBindingContext()) === null || _this$_oView$getBindi2 === void 0 ? void 0 : _this$_oView$getBindi2.getBinding();
|
|
865
|
+
oPreviousBinding === null || oPreviousBinding === void 0 ? void 0 : oPreviousBinding.resetChanges().then(function () {
|
|
866
|
+
oPreviousBinding.destroy();
|
|
867
|
+
}).catch(function (oError) {
|
|
868
|
+
Log.error("Error while reseting the changes to the binding", oError);
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
|
|
848
872
|
var oHiddenBinding = oModel.bindContext(sPath, undefined, mParameters);
|
|
849
873
|
oHiddenBinding.attachEventOnce("dataRequested", function () {
|
|
850
874
|
BusyLocker.lock(_this7._oView);
|
|
@@ -879,7 +903,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
879
903
|
};
|
|
880
904
|
} else {
|
|
881
905
|
mParams = {
|
|
882
|
-
title: oResourceBundle.getText("
|
|
906
|
+
title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
883
907
|
description: sErrorDescription,
|
|
884
908
|
isDataReceivedError: true,
|
|
885
909
|
shellBack: true
|
|
@@ -930,7 +954,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
930
954
|
* therefore we get all dependent bindings (via private model method) to determine all paths and then
|
|
931
955
|
* request them.
|
|
932
956
|
*
|
|
933
|
-
* @param
|
|
957
|
+
* @param oBindingContext Context to be refreshed
|
|
934
958
|
* @ui5-restricted
|
|
935
959
|
*/
|
|
936
960
|
;
|
|
@@ -942,7 +966,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
942
966
|
|
|
943
967
|
var sRootContextPath = oBindingContext.getPath();
|
|
944
968
|
var sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet();
|
|
945
|
-
var sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/"
|
|
969
|
+
var sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet);
|
|
946
970
|
|
|
947
971
|
var oMetaModel = this._oView.getModel().getMetaModel();
|
|
948
972
|
|
|
@@ -958,7 +982,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
958
982
|
var aDependentBindings;
|
|
959
983
|
var sRelativePath = (oBinding.getContext() && oBinding.getContext().getPath() || "").replace(sRootContextPath, ""); // If no context, this is an absolute binding so no relative path
|
|
960
984
|
|
|
961
|
-
var sPath = (sRelativePath ? sRelativePath.slice(1)
|
|
985
|
+
var sPath = (sRelativePath ? "".concat(sRelativePath.slice(1), "/") : sRelativePath) + oBinding.getPath();
|
|
962
986
|
|
|
963
987
|
if (oBinding.isA("sap.ui.model.odata.v4.ODataContextBinding")) {
|
|
964
988
|
// if (sPath === "") {
|
|
@@ -986,7 +1010,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
986
1010
|
}
|
|
987
1011
|
|
|
988
1012
|
if (sContextPath) {
|
|
989
|
-
sMessagesPath = oMetaModel.getObject(sContextPath
|
|
1013
|
+
sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
990
1014
|
} // binding of the context must have $$PatchWithoutSideEffects true, this bound context may be needed to be fetched from the dependent binding
|
|
991
1015
|
|
|
992
1016
|
|
|
@@ -1012,7 +1036,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1012
1036
|
/**
|
|
1013
1037
|
* Gets the binding context of the page or the component.
|
|
1014
1038
|
*
|
|
1015
|
-
* @returns
|
|
1039
|
+
* @returns The binding context
|
|
1016
1040
|
* @ui5-restricted
|
|
1017
1041
|
*/
|
|
1018
1042
|
;
|
|
@@ -1027,7 +1051,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1027
1051
|
/**
|
|
1028
1052
|
* Sets the binding context of the page or the component.
|
|
1029
1053
|
*
|
|
1030
|
-
* @param
|
|
1054
|
+
* @param oContext The binding context
|
|
1031
1055
|
* @ui5-restricted
|
|
1032
1056
|
*/
|
|
1033
1057
|
;
|
|
@@ -1046,19 +1070,55 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1046
1070
|
oTargetControl.setBindingContext(oContext);
|
|
1047
1071
|
|
|
1048
1072
|
if (oPreviousContext && oPreviousContext.isKeepAlive()) {
|
|
1049
|
-
|
|
1073
|
+
this._setKeepAlive(oPreviousContext, false);
|
|
1050
1074
|
}
|
|
1051
1075
|
}
|
|
1052
1076
|
/**
|
|
1053
1077
|
* Gets the flexible column layout (FCL) level corresponding to the view (-1 if the app is not FCL).
|
|
1054
1078
|
*
|
|
1055
|
-
* @returns
|
|
1079
|
+
* @returns The level
|
|
1056
1080
|
* @ui5-restricted
|
|
1057
1081
|
*/
|
|
1058
1082
|
;
|
|
1059
1083
|
|
|
1060
1084
|
_proto._getFCLLevel = function _getFCLLevel() {
|
|
1061
1085
|
return this._oTargetInformation.FCLLevel;
|
|
1086
|
+
};
|
|
1087
|
+
|
|
1088
|
+
_proto._setKeepAlive = function _setKeepAlive(oContext, bKeepAlive, fnBeforeDestroy, bRequestMessages) {
|
|
1089
|
+
if (oContext.getPath().endsWith(")")) {
|
|
1090
|
+
// We keep the context alive only if they're part of a collection, i.e. if the path ends with a ')'
|
|
1091
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
1092
|
+
var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
1093
|
+
var sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
1094
|
+
oContext.setKeepAlive(bKeepAlive, fnBeforeDestroy, !!sMessagesPath && bRequestMessages);
|
|
1095
|
+
}
|
|
1096
|
+
};
|
|
1097
|
+
|
|
1098
|
+
_proto._getKeepAliveContext = function _getKeepAliveContext(oModel, path, bRequestMessages, parameters) {
|
|
1099
|
+
// Get the path for the context that is really kept alive (part of a collection)
|
|
1100
|
+
// i.e. remove all segments not ending with a ')'
|
|
1101
|
+
var keptAliveSegments = path.split("/");
|
|
1102
|
+
var additionnalSegments = [];
|
|
1103
|
+
|
|
1104
|
+
while (keptAliveSegments.length && !keptAliveSegments[keptAliveSegments.length - 1].endsWith(")")) {
|
|
1105
|
+
additionnalSegments.push(keptAliveSegments.pop());
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
if (keptAliveSegments.length === 0) {
|
|
1109
|
+
return undefined;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
var keptAlivePath = keptAliveSegments.join("/");
|
|
1113
|
+
var oKeepAliveContext = oModel.getKeepAliveContext(keptAlivePath, bRequestMessages, parameters);
|
|
1114
|
+
|
|
1115
|
+
if (additionnalSegments.length === 0) {
|
|
1116
|
+
return oKeepAliveContext;
|
|
1117
|
+
} else {
|
|
1118
|
+
additionnalSegments.reverse();
|
|
1119
|
+
var additionnalPath = additionnalSegments.join("/");
|
|
1120
|
+
return oModel.bindContext(additionnalPath, oKeepAliveContext).getBoundContext();
|
|
1121
|
+
}
|
|
1062
1122
|
}
|
|
1063
1123
|
/**
|
|
1064
1124
|
* Switches between column and full-screen mode when FCL is used.
|
|
@@ -1114,4 +1174,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1114
1174
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_createContext", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "_createContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
|
|
1115
1175
|
return InternalRouting;
|
|
1116
1176
|
}, false);
|
|
1117
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsImlzRmNsRW5hYmxlZCIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsImJBY3Rpb25DcmVhdGUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwiYXJndW1lbnRzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwib01vZGVsIiwib091dCIsIl9iaW5kRGVmZXJyZWQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJzVGFyZ2V0UGF0aCIsIm9Bc3luY0NvbnRleHQiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJ1c2VDb250ZXh0IiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwiX3Jlc29sdmVTZW1hbnRpY1BhdGgiLCJzVGVjaG5pY2FsUGF0aCIsIl9iaW5kUGFnZVRvUGF0aCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aCIsInNTZW1hbnRpY1BhdGgiLCJhU2VtYW50aWNLZXlzIiwib01ldGFNb2RlbCIsImZuVW5xdW90ZUFuZERlY29kZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwiYUtleVZhbHVlcyIsInNwbGl0IiwiYUZpbHRlcnMiLCJiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwic0tleVZhbHVlIiwiRmlsdGVyIiwiJFByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJtS2V5VmFsdWVzIiwiZm9yRWFjaCIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwiYkZhaWxlZCIsIm1hcCIsIm9TZW1hbnRpY0tleSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwib0NvbWJpbmVkRmlsdGVyIiwiX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJvRmlsdGVyIiwic3RhcnRzV2l0aCIsIm9MaXN0QmluZGluZyIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwib0NvbnRleHRzIiwiX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmciLCJzUGF0aCIsImFNYXRjaGVzIiwiZXhlYyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwic1BhdGhUb1Jlc29sdmUiLCJvTGFzdFNlbWFudGljTWFwcGluZyIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwic1Jvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwiYkFsbG93U2VtYW50aWNCb29rbWFyayIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwic2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNldExhc3RTZW1hbnRpY01hcHBpbmciLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9UYXJnZXRDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJzZXRLZWVwQWxpdmUiLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImxpc3RCaW5kaW5nIiwiYkRyYWZ0TmF2aWdhdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImJTaG93UGxhY2Vob2xkZXIiLCJuYXZpZ2F0ZVRvU2libGluZ0VudGl0eSIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwiY29udGV4dCIsImdldFNvdXJjZSIsIlByb2dyYW1taW5nTW9kZWwiLCJGRUxpYnJhcnkiLCJwcm9ncmFtbWluZ01vZGVsIiwiX2VkaXRGbG93IiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInVubG9jayIsIkRyYWZ0IiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJ0YXJnZXRDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaSIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiY29uY2F0Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsInNMYXlvdXQiLCJ3YXJuaW5nIiwiY2xvc2VDb2x1bW4iLCJvVmlld0RhdGEiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBZ2pCTyxrQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtBQUNyQyxRQUFJO0FBQ0gsVUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0FBQ0EsS0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztBQUNWLGFBQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0FBQ0E7O0FBQ0QsUUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO0FBQzFCLGFBQU9GLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLEtBQUssQ0FBakIsRUFBb0JILE9BQXBCLENBQVA7QUFDQTs7QUFDRCxXQUFPQyxNQUFQO0FBQ0E7Ozs7Ozs7O0FBemhCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BRU1HLGUsV0FETEMsY0FBYyxDQUFDLGtEQUFELEMsVUFZYkMsY0FBYyxFLFVBS2RBLGNBQWMsRSxVQW9DZEMsZUFBZSxFLFVBQ2ZDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsVUFLVkgsZUFBZSxFLFVBQ2ZDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsVUFLVkgsZUFBZSxFLFVBQ2ZDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0FRVkgsZUFBZSxFLFdBQ2ZDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0F1QlZILGVBQWUsRSxXQXlCZkEsZUFBZSxFLFdBYWZBLGVBQWUsRSxXQUNmSSxjQUFjLEUsV0E4RGRKLGVBQWUsRSxXQUNmSSxjQUFjLEUsV0FnQmRKLGVBQWUsRSxXQUNmSSxjQUFjLEUsV0FjZEosZUFBZSxFLFdBQ2ZJLGNBQWMsRSxXQVVkSixlQUFlLEUsV0FDZkksY0FBYyxFLFdBbUJkSixlQUFlLEUsV0FDZkksY0FBYyxF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QXlDeEgsUUFBUSxDQUFDNEosT0FBVCxFQUF6QyxDQUE5QyxFQUE0RztBQUMzR3FGLFFBQUFBLEtBQUssQ0FBQ3FDLHlDQUFOLENBQ0MsWUFBWTtBQUNYdlQsVUFBQUEsSUFBSSxDQUFDaVQsUUFBTCxDQUFjbE8sdUJBQWQsQ0FBc0M5QyxRQUF0QyxFQUFnRDtBQUFFdVIsWUFBQUEsbUJBQW1CLEVBQUU7QUFBdkIsV0FBaEQ7QUFDQSxTQUhGLEVBSUNDLFFBQVEsQ0FBQ0MsU0FKVixFQUtDelIsUUFMRCxFQU1DMlEsT0FBTyxDQUFDalIsYUFBUixFQU5ELEVBT0MsS0FQRCxFQVFDdVAsS0FBSyxDQUFDeUMsY0FBTixDQUFxQkMsY0FSdEI7QUFVQSxPQVhELE1BV087QUFDTjVULFFBQUFBLElBQUksQ0FBQ2lULFFBQUwsQ0FBY2xPLHVCQUFkLENBQXNDOUMsUUFBdEMsRUFBZ0Q7QUFBRXVSLFVBQUFBLG1CQUFtQixFQUFFO0FBQXZCLFNBQWhEO0FBQ0E7QUFDRCxLOzs7SUEvK0I0QkssbUI7U0FrL0JmNVUsZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0RW5oYW5jZVdpdGhVSTUsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgJiYgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYXZpZ2F0aW9uIHRhcmdldCBuYW1lXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgb1NlbWFudGljT2JqZWN0Pzogb2JqZWN0LCBiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH1cblx0XHR0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigob0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBtUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IG1QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiBtUGFyYW1ldGVycy5iRm9yY2VGb2N1cyxcblx0XHRcdFx0XHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBtUGFyYW1ldGVycy5iTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHlcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2l0aCB0aGUgYXN5bmMgY29udGV4dFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHRvQ29udGV4dEluZm8uc291cmNlQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdG9Db250ZXh0SW5mby5iaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9FdmVudCkge1xuXHRcdFx0XHRvQ29udGV4dEluZm8ub0V2ZW50ID0gbVBhcmFtZXRlcnMub0V2ZW50O1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3QgYk92ZXJyaWRlTmF2ID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24ob0NvbnRleHRJbmZvKTtcblx0XHRcdGlmIChiT3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCkge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5kZXhPZihcIiguLi4pXCIpICE9PSAtMSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm0gb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSB3aXRoIEZDTCwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGtlZXBBbGl2ZSBmbGFnLCB0byBhdm9pZCB0aGlzIGNvbnRleHQgdG8gYmUgbWFpbnRhaW5lZCBieVxuXHRcdFx0Ly8gdGhlIGxpc3QgYmluZGluZywgY2F1c2luZyBhZGRpdGlvbm5hbCBxdWVyaWVzIChlLmcuIGFmdGVyIGNsb3NpbmcgdGhlIE9QIGFuZCByZWZyZXNoaW5nIHRoZSBMUiB3aXRoIGEgbmV3IGZpbHRlciwgd2UgZG9uJ3Qgd2FudCB0aGVcblx0XHRcdC8vIGNvbnRleHQgb2YgdGhlIGNsb3NlZCBPUCB0byBiZSByZWxvYWRlZCBiZWNhdXNlIGl0J3Mga2VwdCBhbGl2ZSlcblx0XHRcdGlmIChcblx0XHRcdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHQodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSAmJlxuXHRcdFx0XHR0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpPy5pc0tlZXBBbGl2ZSgpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb091dDtcblx0XHRpZiAoZGVmZXJyZWQpIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0b091dC5maW5hbGx5KCgpID0+IHtcblx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdH0pO1xuXG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmZXJyZWQgYmluZGluZyAoZHVyaW5nIG9iamVjdCBjcmVhdGlvbikuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZERlZmVycmVkKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCwgeyBlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmIChvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCB8fCAhb05hdmlnYXRpb25QYXJhbWV0ZXJzLm9Bc3luY0NvbnRleHQpIHtcblx0XHRcdC8vIGVpdGhlciB0aGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgcGFnZSAoZGVmZXJyZWQgQ29udGV4dCkgb3IgaXQgc2hhbGxcblx0XHRcdC8vIGJlIGNyZWF0ZWQgYXN5bmMgYnV0IHRoZSB1c2VyIHJlZnJlc2hlZCB0aGUgcGFnZSAvIGJvb2ttYXJrZWQgdGhpcyBVUkxcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGUgdGFyZ2V0IGNvbXBvbmVudCBjcmVhdGVzIHRoaXMgZG9jdW1lbnQgYnV0IHdlIHNoYWxsIG1vdmUgdGhpcyB0b1xuXHRcdFx0Ly8gYSBjZW50cmFsIHBsYWNlXG5cdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dChcblx0XHRcdFx0XHRzVGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCkge1xuXHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVzb2x2ZVNlbWFudGljUGF0aChzVGFyZ2V0UGF0aCwgb01vZGVsKVxuXHRcdFx0XHQudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHNUZWNobmljYWxQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBFcnJvciBoYW5kbGluZyBmb3IgZXJyb25lb3VzIG1ldGFkYXRhIHJlcXVlc3Rcblx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvRXJyb3IubWVzc2FnZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZW1hbnRpY1BhdGggVGhlIHNlbWFudGljIHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwuRmlsdGVyfSBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBhU2VtYW50aWNLZXlzOiBhbnlbXSwgb01ldGFNb2RlbDogb2JqZWN0KSB7XG5cdFx0Y29uc3QgZm5VbnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRpZiAoc1ZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHNWYWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHNWYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHZhbHVlIGFuZCBkZWNvZGUgc3BlY2lhbCBjaGFyc1xuXHRcdFx0XHRzVmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoc1ZhbHVlLnN1YnN0cmluZygxLCBzVmFsdWUubGVuZ3RoIC0gMSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNWYWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGFLZXlWYWx1ZXMgPSBzU2VtYW50aWNQYXRoLnN1YnN0cmluZyhzU2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc1NlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cdFx0bGV0IGFGaWx0ZXJzOiBGaWx0ZXJbXTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCAhPSBhS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIFRha2UgdGhlIGZpcnN0IGtleSB2YWx1ZVxuXHRcdFx0Y29uc3Qgc0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0YUZpbHRlcnMgPSBbXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY0tleXNbMF0uJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0dmFsdWUxOiBzS2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRhS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IHNLZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYkZhaWxlZCA9IGZhbHNlO1xuXHRcdFx0YUZpbHRlcnMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob1NlbWFudGljS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IG9TZW1hbnRpY0tleS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHNWYWx1ZSA9IG1LZXlWYWx1ZXNbc0tleV07XG5cblx0XHRcdFx0aWYgKHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogc0tleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogc1ZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiRmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmUgYW55d2F5IHNpbmNlIHdlIHJldHVybiBhZnRlclxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGJGYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3Qgb0RyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRhRmlsdGVycy5wdXNoKG9EcmFmdEZpbHRlcik7XG5cblx0XHRjb25zdCBvQ29tYmluZWRGaWx0ZXIgPSBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0XHRyZXR1cm4gb0NvbWJpbmVkRmlsdGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgdG8gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzU2VtYW50aWNQYXRoIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBQcm9taXNlIGNvbnRhaW5pbmcgdGhlIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cyBpZiBzU2VtYW50aWNQYXRoIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgbnVsbCBvdGhlcndpc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgYVNlbWFudGljS2V5czogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1NlbWFudGljUGF0aCkuZ2V0UGF0aCgpO1xuXG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzIHx8IGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBvRmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoLCBhU2VtYW50aWNLZXlzLCBvTWV0YU1vZGVsKTtcblx0XHRpZiAob0ZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFzRW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNFbnRpdHlTZXRQYXRoID0gXCIvXCIgKyBzRW50aXR5U2V0UGF0aDtcblx0XHR9XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KHNFbnRpdHlTZXRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XCIkJGdyb3VwSWRcIjogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbH0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXRoIGlzIGVsaWdpYmxlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc1BhdGg6IHN0cmluZywgb01ldGFNb2RlbDogYW55KSB7XG5cdFx0Ly8gT25seSBwYXRoIG9uIHJvb3Qgb2JqZWN0cyBhbGxvdyBzZW1hbnRpYyBib29rbWFya2luZywgaS5lLiBzUGF0aCA9IHh4eCh5eXkpXG5cdFx0Y29uc3QgYU1hdGNoZXMgPSAvXltcXC9dPyhcXHcrKVxcKFteXFwvXStcXCkkLy5leGVjKHNQYXRoKTtcblx0XHRpZiAoIWFNYXRjaGVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIEdldCB0aGUgZW50aXR5U2V0IG5hbWVcblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IFwiL1wiICsgYU1hdGNoZXNbMV07XG5cdFx0Ly8gQ2hlY2sgdGhlIGVudGl0eSBzZXQgc3VwcG9ydHMgZHJhZnQgKG90aGVyd2lzZSB3ZSBkb24ndCBzdXBwb3J0IHNlbWFudGljIGJvb2ttYXJraW5nKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiKTtcblx0XHRyZXR1cm4gb0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIGZyb20gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB0byBiZSB0cmFuc2Zvcm1lZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpKSB7XG5cdFx0XHRsZXQgb1RhcmdldENvbnRleHQ7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IG9Vc2VDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gY3JlYXRlIGl0IGZyb20gc1RhcmdldFBhdGhcblx0XHRcdFx0b1RhcmdldENvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1RhcmdldENvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlJlYXNvbklzSWFwcFN0YXRlICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvQ29udGV4dChvQ29udGV4dDogYW55LCBvTW9kZWw6IGFueSwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsKTtcblx0XHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9QYXJlbnRMaXN0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgIW9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY29udGV4dCBpcyBubyBsb25nZXIga2VwdCBhbGl2ZVxuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG9Db250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkgQSBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgb24gZGF0YSByZWNlaXZlZFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFRoZSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBib29sZWFuID0gdHJ1ZSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQsXG5cdFx0XHRzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpLFxuXHRcdFx0c0NvbnRleHRQYXRoID1cblx0XHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIFwiL1wiICsgc0VudGl0eVNldCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IGFueSA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ29udGV4dFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ29udGV4dFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzRW50aXR5U2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ29udGV4dFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gXCJIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLEhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLl9kYXRhUmVjZWl2ZWRFdmVudEhhbmRsZXIuYmluZCh0aGlzLCBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eSkpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9kYXRhUmVjZWl2ZWRFdmVudEhhbmRsZXIobmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk6IGJvb2xlYW4sIG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBjb250ZXh0ID0gb0V2ZW50Py5nZXRTb3VyY2UgJiYgKG9FdmVudD8uZ2V0U291cmNlKCkgYXMgYW55KT8uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSAodGhpcy5fb1ZpZXc/LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcik/Ll9lZGl0Rmxvdz8uZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRjb25zdCBzRXJyb3JEZXNjcmlwdGlvbiA9IG9FdmVudCAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdGlmIChcblx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiZcblx0XHRcdEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKHRoaXMuX29WaWV3KSAmJlxuXHRcdFx0bmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkgJiZcblx0XHRcdGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0Y29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKGNvbnRleHQsIGNvbnRleHQpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24pIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRcdGxldCBtUGFyYW1zID0ge307XG5cdFx0XHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbiAmJiBzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJTQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRXJyb3JEZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIFwiL1wiICsgc0VudGl0eVNldCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogYW55ID0ge1xuXHRcdFx0VGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHRUYXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBzUmVsYXRpdmVQYXRoLnNsaWNlKDEpICsgXCIvXCIgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhhRGVwZW5kZW50QmluZGluZ3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYVByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogc01lc3NhZ2VzUGF0aFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5jb25jYXQob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMpLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dCAmJiBvUHJldmlvdXNDb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSxcblx0XHRcdGJJc0Z1bGxTY3JlZW4gPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vaXNGdWxsU2NyZWVuXCIpLFxuXHRcdFx0c05leHRMYXlvdXQgPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXG5cdFx0XHRcdGJJc0Z1bGxTY3JlZW4gPyBcIi9hY3Rpb25CdXR0b25zSW5mby9leGl0RnVsbFNjcmVlblwiIDogXCIvYWN0aW9uQnV0dG9uc0luZm8vZnVsbFNjcmVlblwiXG5cdFx0XHQpLFxuXHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRjb25zdCBvQ29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IHNMYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQmVmb3JlKVxuXHRjbG9zZUNvbHVtbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvVmlld0RhdGEgPSBvU291cmNlLmdldFZpZXdEYXRhKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgYmFzZSA9IHRoaXMuYmFzZTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGlmIChvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLnZpZXdMZXZlbCA9PT0gMSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwsIG9Db250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvU291cmNlLmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiYXNlLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUgfSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdfQ==
|
|
1177
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsImlzRmNsRW5hYmxlZCIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsImJBY3Rpb25DcmVhdGUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwiYXJndW1lbnRzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwib01vZGVsIiwib091dCIsIl9iaW5kRGVmZXJyZWQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJzVGFyZ2V0UGF0aCIsIm9Bc3luY0NvbnRleHQiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJ1c2VDb250ZXh0IiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwiX3Jlc29sdmVTZW1hbnRpY1BhdGgiLCJzVGVjaG5pY2FsUGF0aCIsIl9iaW5kUGFnZVRvUGF0aCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aCIsInNTZW1hbnRpY1BhdGgiLCJhU2VtYW50aWNLZXlzIiwib01ldGFNb2RlbCIsImZuVW5xdW90ZUFuZERlY29kZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwiYUtleVZhbHVlcyIsInNwbGl0IiwiYUZpbHRlcnMiLCJiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwic0tleVZhbHVlIiwiRmlsdGVyIiwiJFByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJtS2V5VmFsdWVzIiwiZm9yRWFjaCIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwiYkZhaWxlZCIsIm1hcCIsIm9TZW1hbnRpY0tleSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwiX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJvRmlsdGVyIiwic3RhcnRzV2l0aCIsIm9MaXN0QmluZGluZyIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwib0NvbnRleHRzIiwiX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmciLCJzUGF0aCIsImFNYXRjaGVzIiwiZXhlYyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwic1BhdGhUb1Jlc29sdmUiLCJvTGFzdFNlbWFudGljTWFwcGluZyIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwic1Jvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwiYkFsbG93U2VtYW50aWNCb29rbWFyayIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwic2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNldExhc3RTZW1hbnRpY01hcHBpbmciLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9UYXJnZXRDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwibmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJvUGFnZUNvbXBvbmVudCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcXVlc3RQcm9wZXJ0eSIsInJlcXVlc3RPYmplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsIm9QcmV2aW91c0JpbmRpbmciLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlciIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsImNvbnRleHQiLCJnZXRTb3VyY2UiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwicHJvZ3JhbW1pbmdNb2RlbCIsIl9lZGl0RmxvdyIsImdldFByb2dyYW1taW5nTW9kZWwiLCJ1bmxvY2siLCJEcmFmdCIsIkFjdGl2aXR5U3luYyIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwidGFyZ2V0Q29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsImpvaW4iLCJvS2VlcEFsaXZlQ29udGV4dCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXZlcnNlIiwiYWRkaXRpb25uYWxQYXRoIiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwiaXNEcmFmdFN1cHBvcnRlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IEFjdGl2aXR5U3luYyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmF2aWdhdGlvbiB0YXJnZXQgbmFtZVxuXHQgKiBAcGFyYW0gb1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgb1NlbWFudGljT2JqZWN0Pzogb2JqZWN0LCBiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH1cblx0XHR0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM/OiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IG9Db250ZXh0SW5mbzogYW55ID0ge307XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdGlmIChvQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dCkge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dFxuXHRcdFx0XHRcdC50aGVuKChhc3luY0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGFzeW5jQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogbVBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBtUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0XHRcdFx0dXBkYXRlRkNMTGV2ZWw6IG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsLFxuXHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXMsXG5cdFx0XHRcdFx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogbVBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVcIikgPiAtMSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRcdHJldHVybiAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmRpc3BsYXlNZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm0gb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSB3aXRoIEZDTCwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGtlZXBBbGl2ZSBmbGFnLCB0byBhdm9pZCB0aGlzIGNvbnRleHQgdG8gYmUgbWFpbnRhaW5lZCBieVxuXHRcdFx0Ly8gdGhlIGxpc3QgYmluZGluZywgY2F1c2luZyBhZGRpdGlvbm5hbCBxdWVyaWVzIChlLmcuIGFmdGVyIGNsb3NpbmcgdGhlIE9QIGFuZCByZWZyZXNoaW5nIHRoZSBMUiB3aXRoIGEgbmV3IGZpbHRlciwgd2UgZG9uJ3Qgd2FudCB0aGVcblx0XHRcdC8vIGNvbnRleHQgb2YgdGhlIGNsb3NlZCBPUCB0byBiZSByZWxvYWRlZCBiZWNhdXNlIGl0J3Mga2VwdCBhbGl2ZSlcblx0XHRcdGlmIChcblx0XHRcdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHQodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSAmJlxuXHRcdFx0XHR0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpPy5pc0tlZXBBbGl2ZSgpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGxldCBvT3V0O1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0LFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoY3VycmVudEJpbmRpbmdDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBvYmplY3QpIHtcblx0XHRpZiAoc1RhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3Jlc29sdmVTZW1hbnRpY1BhdGgoc1RhcmdldFBhdGgsIG9Nb2RlbClcblx0XHRcdFx0LnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvUGF0aChzVGVjaG5pY2FsUGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb0Vycm9yLm1lc3NhZ2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGZpbHRlciB0byByZXRyaWV2ZSBhIGNvbnRleHQgY29ycmVzcG9uZGluZyB0byBhIHNlbWFudGljIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNQYXRoIFRoZSBzZW1hbnRpYyBwYXRoXG5cdCAqIEBwYXJhbSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGZpbHRlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGg6IHN0cmluZywgYVNlbWFudGljS2V5czogYW55W10sIG9NZXRhTW9kZWw6IG9iamVjdCkge1xuXHRcdGNvbnN0IGZuVW5xdW90ZUFuZERlY29kZSA9IGZ1bmN0aW9uIChzVmFsdWU6IGFueSkge1xuXHRcdFx0aWYgKHNWYWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiBzVmFsdWUubGFzdEluZGV4T2YoXCInXCIpID09PSBzVmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHF1b3RlcyBmcm9tIHRoZSB2YWx1ZSBhbmQgZGVjb2RlIHNwZWNpYWwgY2hhcnNcblx0XHRcdFx0c1ZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHNWYWx1ZS5zdWJzdHJpbmcoMSwgc1ZhbHVlLmxlbmd0aCAtIDEpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzVmFsdWU7XG5cdFx0fTtcblx0XHRjb25zdCBhS2V5VmFsdWVzID0gc1NlbWFudGljUGF0aC5zdWJzdHJpbmcoc1NlbWFudGljUGF0aC5pbmRleE9mKFwiKFwiKSArIDEsIHNTZW1hbnRpY1BhdGgubGVuZ3RoIC0gMSkuc3BsaXQoXCIsXCIpO1xuXHRcdGxldCBhRmlsdGVyczogRmlsdGVyW107XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggIT0gYUtleVZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG9NZXRhTW9kZWwpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHQvLyBUYWtlIHRoZSBmaXJzdCBrZXkgdmFsdWVcblx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhS2V5VmFsdWVzWzBdKTtcblx0XHRcdGFGaWx0ZXJzID0gW1xuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRwYXRoOiBhU2VtYW50aWNLZXlzWzBdLiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdHZhbHVlMTogc0tleVZhbHVlLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdH0pXG5cdFx0XHRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtS2V5VmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdC8vIENyZWF0ZSBhIG1hcCBvZiBhbGwga2V5IHZhbHVlc1xuXHRcdFx0YUtleVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5QXNzaWdubWVudDogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IHNLZXlBc3NpZ25tZW50LnNwbGl0KFwiPVwiKSxcblx0XHRcdFx0XHRzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYVBhcnRzWzFdKTtcblxuXHRcdFx0XHRtS2V5VmFsdWVzW2FQYXJ0c1swXV0gPSBzS2V5VmFsdWU7XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IGJGYWlsZWQgPSBmYWxzZTtcblx0XHRcdGFGaWx0ZXJzID0gYVNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKG9TZW1hbnRpY0tleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IHNLZXkgPSBvU2VtYW50aWNLZXkuJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRzVmFsdWUgPSBtS2V5VmFsdWVzW3NLZXldO1xuXG5cdFx0XHRcdGlmIChzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IHNLZXksXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHNWYWx1ZSxcblx0XHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YkZhaWxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJYWFwiXG5cdFx0XHRcdFx0fSk7IC8vIHdpbGwgYmUgaWdub3JlIGFueXdheSBzaW5jZSB3ZSByZXR1cm4gYWZ0ZXJcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChiRmFpbGVkKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCBhIGRyYWZ0IGZpbHRlciB0byBtYWtlIHN1cmUgd2UgdGFrZSB0aGUgZHJhZnQgZW50aXR5IGlmIHRoZXJlIGlzIG9uZVxuXHRcdC8vIE9yIHRoZSBhY3RpdmUgZW50aXR5IG90aGVyd2lzZVxuXHRcdGNvbnN0IG9EcmFmdEZpbHRlciA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogW25ldyBGaWx0ZXIoXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIGZhbHNlKSwgbmV3IEZpbHRlcihcIlNpYmxpbmdFbnRpdHkvSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBudWxsKV0sXG5cdFx0XHRhbmQ6IGZhbHNlXG5cdFx0fSk7XG5cdFx0YUZpbHRlcnMucHVzaChvRHJhZnRGaWx0ZXIpO1xuXG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoYUZpbHRlcnMsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgdG8gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNQYXRoIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBtb2RlbCBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBjb250YWluaW5nIHRoZSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMgaWYgc1NlbWFudGljUGF0aCBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIG51bGwgb3RoZXJ3aXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIGFTZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHNTZW1hbnRpY1BhdGgpLmdldFBhdGgoKTtcblxuXHRcdGlmICghYVNlbWFudGljS2V5cyB8fCBhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMga2V5c1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSBzZXQgb2YgZmlsdGVycyBjb3JyZXNwb25kaW5nIHRvIGFsbCBrZXlzXG5cdFx0Y29uc3Qgb0ZpbHRlciA9IHRoaXMuX2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aCwgYVNlbWFudGljS2V5cywgb01ldGFNb2RlbCk7XG5cdFx0aWYgKG9GaWx0ZXIgPT09IG51bGwpIHtcblx0XHRcdC8vIENvdWxkbid0IGludGVycHJldCB0aGUgcGF0aCBhcyBhIHNlbWFudGljIG9uZVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHR9XG5cblx0XHQvLyBMb2FkIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdFxuXHRcdGlmICghc0VudGl0eVNldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRzRW50aXR5U2V0UGF0aCA9IGAvJHtzRW50aXR5U2V0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qoc0VudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHRcIiQkZ3JvdXBJZFwiOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKS50aGVuKGZ1bmN0aW9uIChvQ29udGV4dHM6IGFueSkge1xuXHRcdFx0aWYgKG9Db250ZXh0cyAmJiBvQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dHNbMF0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gZGF0YSBjb3VsZCBiZSBsb2FkZWRcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBlbGlnaWJsZSBmb3Igc2VtYW50aWMgYm9va21hcmtpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aCB0byB0ZXN0XG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBlbGlnaWJsZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nKHNQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IGFueSkge1xuXHRcdC8vIE9ubHkgcGF0aCBvbiByb290IG9iamVjdHMgYWxsb3cgc2VtYW50aWMgYm9va21hcmtpbmcsIGkuZS4gc1BhdGggPSB4eHgoeXl5KVxuXHRcdGNvbnN0IGFNYXRjaGVzID0gL15bXFwvXT8oXFx3KylcXChbXlxcL10rXFwpJC8uZXhlYyhzUGF0aCk7XG5cdFx0aWYgKCFhTWF0Y2hlcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGVudGl0eVNldCBuYW1lXG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgLyR7YU1hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdCAob3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgc2VtYW50aWMgYm9va21hcmtpbmcpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0cmV0dXJuIG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyBmcm9tIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQ7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSkge1xuXHRcdFx0bGV0IG9UYXJnZXRDb250ZXh0O1xuXHRcdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdFx0Ly8gV2UgYWxyZWFkeSBoYXZlIHRoZSBjb250ZXh0IHRvIGJlIHVzZWRcblx0XHRcdFx0b1RhcmdldENvbnRleHQgPSBvVXNlQ29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBpdCBmcm9tIHNUYXJnZXRQYXRoXG5cdFx0XHRcdG9UYXJnZXRDb250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChzVGFyZ2V0UGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5KTtcblx0XHRcdH1cblx0XHRcdGlmIChvVGFyZ2V0Q29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9UYXJnZXRDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJSZWFzb25Jc0lhcHBTdGF0ZSAmJiBFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsKTtcblx0XHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjb250ZXh0IGlzIG5vIGxvbmdlciBrZXB0IGFsaXZlXG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlIC8vIExvYWQgbWVzc2FnZXMsIG90aGVyd2lzZSB0aGV5IGRvbid0IGdldCByZWZyZXNoZWQgbGF0ZXIsIGUuZy4gZm9yIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdC8vIHNldEtlZXBBbGl2ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgbGlzdGJpbmRpbmcgZG9lc24ndCBoYXZlICQkb3duUmVxdWVzdD10cnVlXG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBWaWV3IGZvciAke29Db250ZXh0LmdldFBhdGgoKX0gd29uJ3QgYmUgc3luY2hyb25pemVkLiBQYXJlbnQgbGlzdEJpbmRpbmcgbXVzdCBoYXZlIGJpbmRpbmcgcGFyYW1ldGVyICQkb3duUmVxdWVzdD10cnVlYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCBvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRiRHJhZnROYXZpZ2F0aW9uOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHR9KTtcblxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG9Db250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY29udGV4dCBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFRoZSBwYXRoXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eSBBIHBhcmFtZXRlciB0aGF0IGRldGVybWluZXMgd2hldGhlciB0byBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCBvbiBkYXRhIHJlY2VpdmVkXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYm9vbGVhbiA9IHRydWUpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRpZiAob0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRyYWZ0IGFuZCBlZGl0IHdlIG5lZWQgdG8gZW5zdXJlIHRob3NlIHByb3BlcnRpZXMgYXJlIHJlcXVlc3RlZCBhZ2FpbiBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBiaW5kaW5nJ3MgY2FjaGVcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2hlbiB5b3UgZWRpdCBhbmQgZ28gdG8gdGhlIHNhdmVkIHZlcnNpb24geW91IGhhdmUgbm8gd2F5IG9mIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBlZGl0IHZlcnNpb25cblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRvRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdD8gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdXG5cdFx0XHRcdFx0XHRcdDogW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBhbnkpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdG9QcmV2aW91c0JpbmRpbmdcblx0XHRcdFx0XHQ/LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXNldGluZyB0aGUgY2hhbmdlcyB0byB0aGUgYmluZGluZ1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5fZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyLmJpbmQodGhpcywgbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyKG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBib29sZWFuLCBvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3QgY29udGV4dCA9IG9FdmVudD8uZ2V0U291cmNlICYmIChvRXZlbnQ/LmdldFNvdXJjZSgpIGFzIGFueSk/LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gKHRoaXMuX29WaWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpPy5fZWRpdEZsb3c/LmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRpZiAoXG5cdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRBY3Rpdml0eVN5bmMuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCh0aGlzLl9vVmlldykgJiZcblx0XHRcdG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5ICYmXG5cdFx0XHRjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgJiZcblx0XHRcdGNvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihjb250ZXh0LCBjb250ZXh0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24gJiYgc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogYW55ID0ge1xuXHRcdFx0VGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHRUYXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHQkUHJvcGVydHlQYXRoOiBzTWVzc2FnZXNQYXRoXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzLmNvbmNhdChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyksIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBhbnkpIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQgJiYgb1ByZXZpb3VzQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRGQ0xMZXZlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLkZDTExldmVsO1xuXHR9XG5cblx0X3NldEtlZXBBbGl2ZShvQ29udGV4dDogQ29udGV4dCwgYktlZXBBbGl2ZTogYm9vbGVhbiwgZm5CZWZvcmVEZXN0cm95PzogRnVuY3Rpb24sIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuKSB7XG5cdFx0aWYgKG9Db250ZXh0LmdldFBhdGgoKS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdC8vIFdlIGtlZXAgdGhlIGNvbnRleHQgYWxpdmUgb25seSBpZiB0aGV5J3JlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCBpLmUuIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhICcpJ1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoYktlZXBBbGl2ZSwgZm5CZWZvcmVEZXN0cm95LCAhIXNNZXNzYWdlc1BhdGggJiYgYlJlcXVlc3RNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsOiBPRGF0YU1vZGVsLCBwYXRoOiBzdHJpbmcsIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLCBwYXJhbWV0ZXJzPzogYW55KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSxcblx0XHRcdGJJc0Z1bGxTY3JlZW4gPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vaXNGdWxsU2NyZWVuXCIpLFxuXHRcdFx0c05leHRMYXlvdXQgPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXG5cdFx0XHRcdGJJc0Z1bGxTY3JlZW4gPyBcIi9hY3Rpb25CdXR0b25zSW5mby9leGl0RnVsbFNjcmVlblwiIDogXCIvYWN0aW9uQnV0dG9uc0luZm8vZnVsbFNjcmVlblwiXG5cdFx0XHQpLFxuXHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRjb25zdCBvQ29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IHNMYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQmVmb3JlKVxuXHRjbG9zZUNvbHVtbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvVmlld0RhdGEgPSBvU291cmNlLmdldFZpZXdEYXRhKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgYmFzZSA9IHRoaXMuYmFzZTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGlmIChvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLnZpZXdMZXZlbCA9PT0gMSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwsIG9Db250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvU291cmNlLmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiYXNlLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUgfSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91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
|