@sapui5/sap.fe.core 1.102.2 → 1.104.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +73 -30
- package/src/sap/fe/core/AppComponent.ts +65 -43
- 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 +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +227 -126
- package/src/sap/fe/core/CommonUtils.ts +240 -163
- package/src/sap/fe/core/ExtensionAPI.js +24 -27
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -6
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
- 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/EditFlow.js +379 -330
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +170 -139
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
- 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 +11 -10
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
- 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 +11 -25
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- 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 +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +7 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- 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/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- 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 +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -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 +64 -35
- package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
- 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 +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
- package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
- package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
- 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 +30 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
- package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
- package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -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 +181 -197
- package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
- 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 +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
- 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 +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- 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/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 +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
- 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/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
- 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/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/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/jsx-control.js +99 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -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/library.js +42 -3
- 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 -63
- package/src/sap/fe/core/messagebundle_ar.properties +25 -39
- package/src/sap/fe/core/messagebundle_bg.properties +25 -39
- package/src/sap/fe/core/messagebundle_ca.properties +25 -39
- package/src/sap/fe/core/messagebundle_cs.properties +25 -39
- package/src/sap/fe/core/messagebundle_cy.properties +25 -39
- package/src/sap/fe/core/messagebundle_da.properties +25 -39
- package/src/sap/fe/core/messagebundle_de.properties +25 -39
- package/src/sap/fe/core/messagebundle_el.properties +26 -40
- package/src/sap/fe/core/messagebundle_en.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
- package/src/sap/fe/core/messagebundle_es.properties +27 -41
- package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
- package/src/sap/fe/core/messagebundle_et.properties +25 -39
- package/src/sap/fe/core/messagebundle_fi.properties +25 -39
- package/src/sap/fe/core/messagebundle_fr.properties +26 -40
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
- package/src/sap/fe/core/messagebundle_hi.properties +25 -39
- package/src/sap/fe/core/messagebundle_hr.properties +25 -39
- package/src/sap/fe/core/messagebundle_hu.properties +25 -39
- package/src/sap/fe/core/messagebundle_id.properties +25 -39
- package/src/sap/fe/core/messagebundle_it.properties +41 -55
- package/src/sap/fe/core/messagebundle_iw.properties +25 -39
- package/src/sap/fe/core/messagebundle_ja.properties +25 -39
- package/src/sap/fe/core/messagebundle_kk.properties +25 -39
- package/src/sap/fe/core/messagebundle_ko.properties +30 -44
- package/src/sap/fe/core/messagebundle_lt.properties +25 -39
- package/src/sap/fe/core/messagebundle_lv.properties +25 -39
- package/src/sap/fe/core/messagebundle_ms.properties +25 -39
- package/src/sap/fe/core/messagebundle_nl.properties +27 -41
- package/src/sap/fe/core/messagebundle_no.properties +25 -39
- package/src/sap/fe/core/messagebundle_pl.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
- package/src/sap/fe/core/messagebundle_ro.properties +25 -39
- package/src/sap/fe/core/messagebundle_ru.properties +25 -39
- package/src/sap/fe/core/messagebundle_sh.properties +25 -39
- package/src/sap/fe/core/messagebundle_sk.properties +25 -39
- package/src/sap/fe/core/messagebundle_sl.properties +25 -39
- package/src/sap/fe/core/messagebundle_sv.properties +25 -39
- package/src/sap/fe/core/messagebundle_th.properties +25 -39
- package/src/sap/fe/core/messagebundle_tr.properties +25 -39
- package/src/sap/fe/core/messagebundle_uk.properties +25 -39
- package/src/sap/fe/core/messagebundle_vi.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
- 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/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -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 +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- 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 +16 -15
- 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/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -25,7 +25,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
25
25
|
*
|
|
26
26
|
* @namespace
|
|
27
27
|
* @alias sap.fe.core.controllerextensions.InternalInternalBasedNavigation
|
|
28
|
-
*
|
|
29
28
|
* @private
|
|
30
29
|
* @since 1.84.0
|
|
31
30
|
*/
|
|
@@ -49,10 +48,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
49
48
|
* If semantic object mapping is provided, this is also applied to the selection variant after the adaptation by a consumer.
|
|
50
49
|
* This takes care of removing any technical parameters and determines if an explace or inplace navigation should take place.
|
|
51
50
|
*
|
|
52
|
-
* @param
|
|
53
|
-
* @param
|
|
54
|
-
* @param
|
|
55
|
-
* @param
|
|
51
|
+
* @param sSemanticObject Semantic object for the target app
|
|
52
|
+
* @param sAction Action for the target app
|
|
53
|
+
* @param [mNavigationParameters] Optional parameters to be passed to the external navigation
|
|
54
|
+
* @param [mNavigationParameters.navigationContexts] Uses one of the following to be passed to the intent:
|
|
56
55
|
* a single instance of {@link sap.ui.model.odata.v4.Context}
|
|
57
56
|
* multiple instances of {@link sap.ui.model.odata.v4.Context}
|
|
58
57
|
* an object or an array of objects
|
|
@@ -65,11 +64,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
65
64
|
* },
|
|
66
65
|
* metaPath: "/SalesOrderManage"
|
|
67
66
|
* }
|
|
68
|
-
* @param
|
|
69
|
-
* @param
|
|
70
|
-
* @param
|
|
71
|
-
* @param
|
|
72
|
-
|
|
67
|
+
* @param [mNavigationParameters.semanticObjectMapping] String representation of the SemanticObjectMapping or SemanticObjectMapping that applies to this navigation
|
|
68
|
+
* @param [mNavigationParameters.defaultRefreshStrategy] Default refresh strategy to be used in case no refresh strategy is specified for the intent in the view.
|
|
69
|
+
* @param [mNavigationParameters.refreshStrategies]
|
|
70
|
+
* @param [mNavigationParameters.additionalNavigationParameters] Additional navigation parameters configured in the crossAppNavigation outbound parameters.
|
|
71
|
+
*/
|
|
73
72
|
;
|
|
74
73
|
|
|
75
74
|
_proto.navigate = function navigate(sSemanticObject, sAction, mNavigationParameters) {
|
|
@@ -176,8 +175,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
176
175
|
var onError = function () {
|
|
177
176
|
sap.ui.require(["sap/m/MessageBox"], function (MessageBox) {
|
|
178
177
|
var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
179
|
-
MessageBox.
|
|
180
|
-
title: oResourceBundle.getText("
|
|
178
|
+
MessageBox.error(oResourceBundle.getText("C_COMMON_HELPER_NAVIGATION_ERROR_MESSAGE"), {
|
|
179
|
+
title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR")
|
|
181
180
|
});
|
|
182
181
|
});
|
|
183
182
|
};
|
|
@@ -199,9 +198,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
199
198
|
}
|
|
200
199
|
/**
|
|
201
200
|
* Prepare attributes to be passed to external navigation.
|
|
202
|
-
*
|
|
203
|
-
* @param
|
|
204
|
-
* @
|
|
201
|
+
*
|
|
202
|
+
* @param oSemanticAttributes Context data after removing all sensitive information.
|
|
203
|
+
* @param oContext Actual context from which the semanticAttributes were derived.
|
|
204
|
+
* @returns Object of prepared attributes for external navigation and no conflict properties.
|
|
205
205
|
*/
|
|
206
206
|
;
|
|
207
207
|
|
|
@@ -229,7 +229,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
229
229
|
// if a nested object is found
|
|
230
230
|
var oNewLookUpObject = LookUpObject[sKey];
|
|
231
231
|
|
|
232
|
-
_findDistinctKeysInObject(oNewLookUpObject, sLookUpObjectMetaPath
|
|
232
|
+
_findDistinctKeysInObject(oNewLookUpObject, "".concat(sLookUpObjectMetaPath, "/").concat(sKey));
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
}
|
|
@@ -238,7 +238,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
238
238
|
|
|
239
239
|
|
|
240
240
|
var sMainEntitySetName = aMetaPathParts[0],
|
|
241
|
-
sMainEntityTypeName = oMetaModel.getObject("/"
|
|
241
|
+
sMainEntityTypeName = oMetaModel.getObject("/".concat(sMainEntitySetName, "/@sapui.name")),
|
|
242
242
|
oPropertiesWithoutConflict = {};
|
|
243
243
|
var sMainEntityValuePath, sCurrentValuePath, sLastValuePath;
|
|
244
244
|
|
|
@@ -253,9 +253,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
253
253
|
// conflict
|
|
254
254
|
for (var i = 0; i <= aConflictingPaths.length - 1; i++) {
|
|
255
255
|
var sPath = aConflictingPaths[i];
|
|
256
|
-
var sPathInContext = sPath.replace(sPath === sMetaPath ? sMetaPath : sMetaPath
|
|
257
|
-
sPathInContext = (sPathInContext === "" ? sPathInContext : sPathInContext
|
|
258
|
-
var sEntityTypeName = oMetaModel.getObject(sPath
|
|
256
|
+
var sPathInContext = sPath.replace(sPath === sMetaPath ? sMetaPath : "".concat(sMetaPath, "/"), "");
|
|
257
|
+
sPathInContext = (sPathInContext === "" ? sPathInContext : "".concat(sPathInContext, "/")) + sDistinctKey;
|
|
258
|
+
var sEntityTypeName = oMetaModel.getObject("".concat(sPath, "/@sapui.name")); // rule A
|
|
259
259
|
// rule A
|
|
260
260
|
|
|
261
261
|
if (sEntityTypeName === sMainEntityTypeName) {
|
|
@@ -271,7 +271,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
271
271
|
sLastValuePath = sPathInContext; // add conflicted path to semantic attributes
|
|
272
272
|
// check if the current path points to main entity and prefix attribute names accordingly
|
|
273
273
|
|
|
274
|
-
oSemanticAttributes[(sMetaPath
|
|
274
|
+
oSemanticAttributes["".concat(sMetaPath, "/").concat(sPathInContext).split("/").filter(function (sValue) {
|
|
275
275
|
return sValue != "";
|
|
276
276
|
}).join(".")] = oContext.getProperty(sPathInContext);
|
|
277
277
|
} // A || B || C
|
|
@@ -286,11 +286,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
286
286
|
// no conflict, add distinct key without adding paths
|
|
287
287
|
var _sPath = aConflictingPaths[0]; // because there is only one and hence no conflict
|
|
288
288
|
|
|
289
|
-
var _sPathInContext = _sPath.replace(_sPath === sMetaPath ? sMetaPath : sMetaPath
|
|
289
|
+
var _sPathInContext = _sPath.replace(_sPath === sMetaPath ? sMetaPath : "".concat(sMetaPath, "/"), "");
|
|
290
290
|
|
|
291
|
-
_sPathInContext = (_sPathInContext === "" ? _sPathInContext : _sPathInContext
|
|
291
|
+
_sPathInContext = (_sPathInContext === "" ? _sPathInContext : "".concat(_sPathInContext, "/")) + sDistinctKey;
|
|
292
292
|
oSemanticAttributes[sDistinctKey] = oContext.getProperty(_sPathInContext);
|
|
293
|
-
oPropertiesWithoutConflict[sDistinctKey] = (sMetaPath
|
|
293
|
+
oPropertiesWithoutConflict[sDistinctKey] = "".concat(sMetaPath, "/").concat(_sPathInContext).split("/").filter(function (sValue) {
|
|
294
294
|
return sValue != "";
|
|
295
295
|
}).join(".");
|
|
296
296
|
}
|
|
@@ -310,10 +310,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
310
310
|
}
|
|
311
311
|
/**
|
|
312
312
|
* Prepare filter conditions to be passed to external navigation.
|
|
313
|
-
*
|
|
314
|
-
* @param
|
|
315
|
-
* @param
|
|
316
|
-
* @
|
|
313
|
+
*
|
|
314
|
+
* @param oFilterBarConditions Filter conditions.
|
|
315
|
+
* @param sRootPath Root path of the application.
|
|
316
|
+
* @param aParameters Names of parameters to be considered.
|
|
317
|
+
* @returns Object of prepared filter conditions for external navigation and no conflict filters.
|
|
317
318
|
*/
|
|
318
319
|
;
|
|
319
320
|
|
|
@@ -359,16 +360,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
359
360
|
sPath = aConflictingPaths[i];
|
|
360
361
|
|
|
361
362
|
if (sPath === sRootPath) {
|
|
362
|
-
sFullContextPath = sRootPath
|
|
363
|
+
sFullContextPath = "".concat(sRootPath, "/").concat(sDistinctKey);
|
|
363
364
|
sPathInContext = sDistinctKey;
|
|
364
365
|
sMainEntityValuePath = sDistinctKey;
|
|
365
366
|
|
|
366
367
|
if (aParameters && aParameters.includes(sDistinctKey)) {
|
|
367
|
-
oFilterBarConditions["$Parameter."
|
|
368
|
+
oFilterBarConditions["$Parameter.".concat(sDistinctKey)] = oFilterBarConditions[sDistinctKey];
|
|
368
369
|
}
|
|
369
370
|
} else {
|
|
370
371
|
sPathInContext = sPath;
|
|
371
|
-
sFullContextPath = (sRootPath
|
|
372
|
+
sFullContextPath = "".concat(sRootPath, "/").concat(sPath).replaceAll(/\*/g, "");
|
|
372
373
|
sCurrentValuePath = sPath;
|
|
373
374
|
}
|
|
374
375
|
|
|
@@ -383,13 +384,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
383
384
|
} else {
|
|
384
385
|
// no conflict, add distinct key without adding paths
|
|
385
386
|
sPath = aConflictingPaths[0];
|
|
386
|
-
sFullContextPath = sPath === sRootPath ? sRootPath
|
|
387
|
+
sFullContextPath = sPath === sRootPath ? "".concat(sRootPath, "/").concat(sDistinctKey) : "".concat(sRootPath, "/").concat(sPath).replaceAll("*", "");
|
|
387
388
|
oFilterConditionsWithoutConflict[sDistinctKey] = sFullContextPath.split("/").filter(function (sValue) {
|
|
388
389
|
return sValue != "";
|
|
389
390
|
}).join(".");
|
|
390
391
|
|
|
391
392
|
if (aParameters && aParameters.includes(sDistinctKey)) {
|
|
392
|
-
oFilterBarConditions["$Parameter."
|
|
393
|
+
oFilterBarConditions["$Parameter.".concat(sDistinctKey)] = oFilterBarConditions[sDistinctKey];
|
|
393
394
|
}
|
|
394
395
|
}
|
|
395
396
|
}
|
|
@@ -402,7 +403,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
402
403
|
/**
|
|
403
404
|
* Get Navigation mode.
|
|
404
405
|
*
|
|
405
|
-
* @returns
|
|
406
|
+
* @returns The navigation mode
|
|
406
407
|
*/
|
|
407
408
|
;
|
|
408
409
|
|
|
@@ -414,13 +415,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
414
415
|
* If semantic object mapping is provided, this setting is also applied to the selection variant after adaptation by a consumer.
|
|
415
416
|
* This setting also removes any technical parameters and determines if an inplace or explace navigation should take place.
|
|
416
417
|
*
|
|
417
|
-
* @param
|
|
418
|
-
* @param
|
|
419
|
-
* @param
|
|
420
|
-
* @param
|
|
421
|
-
* @param
|
|
422
|
-
* @param
|
|
423
|
-
* @param
|
|
418
|
+
* @param sSemanticObject Semantic object for the target app
|
|
419
|
+
* @param sAction Action for the target app
|
|
420
|
+
* @param [mNavigationParameters] Optional parameters to be passed to the external navigation
|
|
421
|
+
* @param [mNavigationParameters.label]
|
|
422
|
+
* @param [mNavigationParameters.navigationContexts] Single instance or multiple instances of {@link sap.ui.model.odata.v4.Context}, or alternatively an object or array of objects, to be passed to the intent.
|
|
423
|
+
* @param [mNavigationParameters.applicableContexts] Single instance or multiple instances of {@link sap.ui.model.odata.v4.Context}, or alternatively an object or array of objects, to be passed to the intent and for which the IBN button is enabled
|
|
424
|
+
* @param [mNavigationParameters.notApplicableContexts] Single instance or multiple instances of {@link sap.ui.model.odata.v4.Context}, or alternatively an object or array of objects, which cannot be passed to the intent.
|
|
424
425
|
* if an array of contexts is passed the context is used to determine the meta path and accordingly remove the sensitive data
|
|
425
426
|
* If an array of objects is passed, the following format is expected:
|
|
426
427
|
* {
|
|
@@ -431,8 +432,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
431
432
|
* metaPath: "/SalesOrderManage"
|
|
432
433
|
* }
|
|
433
434
|
* The metaPath is used to remove any sensitive data.
|
|
434
|
-
* @param
|
|
435
|
-
|
|
435
|
+
* @param [mNavigationParameters.semanticObjectMapping] String representation of SemanticObjectMapping or SemanticObjectMapping that applies to this navigation
|
|
436
|
+
*/
|
|
436
437
|
;
|
|
437
438
|
|
|
438
439
|
_proto.navigateWithConfirmationDialog = function navigateWithConfirmationDialog(sSemanticObject, sAction, mNavigationParameters) {
|
|
@@ -483,7 +484,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
483
484
|
|
|
484
485
|
var oMetaModel = oModel.getMetaModel();
|
|
485
486
|
var sCanonicalPath = mNavigationParameters.notApplicableContexts[0].getCanonicalPath();
|
|
486
|
-
var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("("))
|
|
487
|
+
var sEntitySet = "".concat(sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")), "/");
|
|
487
488
|
Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
|
|
488
489
|
name: sFragmentName
|
|
489
490
|
}, {
|
|
@@ -521,9 +522,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
521
522
|
/**
|
|
522
523
|
* Get targeted Entity set.
|
|
523
524
|
*
|
|
524
|
-
* @returns
|
|
525
|
-
*
|
|
526
|
-
*
|
|
525
|
+
* @returns Entity set name
|
|
527
526
|
*/
|
|
528
527
|
;
|
|
529
528
|
|
|
@@ -537,7 +536,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
537
536
|
* @param sMetaPath Meta path to reach the entitySet in the MetaModel
|
|
538
537
|
* @returns Array of semantic Attributes
|
|
539
538
|
* @private
|
|
540
|
-
|
|
539
|
+
*/
|
|
541
540
|
// TO-DO add unit tests for this function in the controller extension qunit.
|
|
542
541
|
;
|
|
543
542
|
|
|
@@ -580,10 +579,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
580
579
|
/**
|
|
581
580
|
* Check if path-based FieldControl evaluates to inapplicable.
|
|
582
581
|
*
|
|
583
|
-
* @param
|
|
584
|
-
* @param
|
|
585
|
-
* @returns
|
|
586
|
-
*
|
|
582
|
+
* @param sFieldControlPath Field control path
|
|
583
|
+
* @param oAttribute SemanticAttributes
|
|
584
|
+
* @returns `true` if inapplicable
|
|
587
585
|
*/
|
|
588
586
|
;
|
|
589
587
|
|
|
@@ -602,9 +600,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
602
600
|
/**
|
|
603
601
|
* Method to replace Local Properties with Semantic Object mappings.
|
|
604
602
|
*
|
|
605
|
-
* @param
|
|
606
|
-
* @param
|
|
607
|
-
* @returns
|
|
603
|
+
* @param oSelectionVariant SelectionVariant consisting of filterbar, Table and Page Context
|
|
604
|
+
* @param vMappings A string representation of semantic object mapping
|
|
605
|
+
* @returns - Modified SelectionVariant with LocalProperty replaced with SemanticObjectProperties.
|
|
608
606
|
*/
|
|
609
607
|
;
|
|
610
608
|
|
|
@@ -627,12 +625,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
627
625
|
}
|
|
628
626
|
/**
|
|
629
627
|
* Navigates to an Outbound provided in the manifest.
|
|
628
|
+
*
|
|
630
629
|
* @function
|
|
631
|
-
* @param
|
|
632
|
-
* @param
|
|
630
|
+
* @param sOutbound Identifier to location the outbound in the manifest
|
|
631
|
+
* @param mNavigationParameters Optional map containing key/value pairs to be passed to the intent
|
|
633
632
|
* @alias sap.fe.core.controllerextensions.IntentBasedNavigation#navigateOutbound
|
|
634
633
|
* @since 1.86.0
|
|
635
|
-
|
|
634
|
+
*/
|
|
636
635
|
;
|
|
637
636
|
|
|
638
637
|
_proto.navigateOutbound = function navigateOutbound(sOutbound, mNavigationParameters) {
|
|
@@ -686,9 +685,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
686
685
|
}
|
|
687
686
|
/**
|
|
688
687
|
* Method to apply outbound parameters defined in the manifest.
|
|
689
|
-
*
|
|
690
|
-
* @param
|
|
691
|
-
* @
|
|
688
|
+
*
|
|
689
|
+
* @param oSelectionVariant SelectionVariant consisting of a filter bar, a table, and a page context
|
|
690
|
+
* @param vOutboundParams Outbound Properties defined in the manifest
|
|
691
|
+
* @returns - The modified SelectionVariant with outbound parameters.
|
|
692
692
|
*/
|
|
693
693
|
;
|
|
694
694
|
|
|
@@ -706,9 +706,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
706
706
|
* Method to get the outbound parameters defined in the manifest.
|
|
707
707
|
*
|
|
708
708
|
* @function
|
|
709
|
-
* @param
|
|
710
|
-
* @returns
|
|
711
|
-
|
|
709
|
+
* @param oOutboundParams Parameters defined in the outbounds. Only "plain" is supported
|
|
710
|
+
* @returns Parameters with the key-Value pair
|
|
711
|
+
*/
|
|
712
712
|
;
|
|
713
713
|
|
|
714
714
|
_proto.getOutboundParams = function getOutboundParams(oOutboundParams) {
|
|
@@ -768,7 +768,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
768
768
|
}
|
|
769
769
|
|
|
770
770
|
if (sCreatePath) {
|
|
771
|
-
var sKey = oDisplayOutbound.semanticObject
|
|
771
|
+
var sKey = "".concat(oDisplayOutbound.semanticObject, "-").concat(oDisplayOutbound.action);
|
|
772
772
|
oRefreshStrategies.intents[sKey] = {};
|
|
773
773
|
oRefreshStrategies.intents[sKey][sCreatePath] = "self";
|
|
774
774
|
}
|
|
@@ -790,7 +790,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
790
790
|
|
|
791
791
|
return Promise.resolve();
|
|
792
792
|
} else {
|
|
793
|
-
throw new Error("outbound target "
|
|
793
|
+
throw new Error("outbound target ".concat(sOutboundTarget, " not found in cross navigation definition of manifest"));
|
|
794
794
|
}
|
|
795
795
|
};
|
|
796
796
|
|
|
@@ -798,4 +798,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
|
|
|
798
798
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigate", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "navigate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareContextForExternalNavigation", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareContextForExternalNavigation"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareFiltersForExternalNavigation", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareFiltersForExternalNavigation"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getNavigationMode", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "getNavigationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateWithConfirmationDialog", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateWithConfirmationDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getEntitySet", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getEntitySet"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeSensitiveData", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "removeSensitiveData"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateOutbound", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateOutbound"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getOutboundParams", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "getOutboundParams"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onChevronPressNavigateOutBound", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "onChevronPressNavigateOutBound"), _class2.prototype)), _class2)) || _class);
|
|
799
799
|
return InternalIntentBasedNavigation;
|
|
800
800
|
}, false);
|
|
801
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sIm5hbWVzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiSW5zdGVhZCIsInByaXZhdGVFeHRlbnNpb24iLCJvbkluaXQiLCJfb0FwcENvbXBvbmVudCIsImJhc2UiLCJnZXRBcHBDb21wb25lbnQiLCJfb01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiX29OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwiX29WaWV3IiwiZ2V0VmlldyIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbiIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9kb05hdmlnYXRlIiwib0NvbnRleHQiLCJ2TmF2aWdhdGlvbkNvbnRleHRzIiwibmF2aWdhdGlvbkNvbnRleHRzIiwiYU5hdmlnYXRpb25Db250ZXh0cyIsIkFycmF5IiwiaXNBcnJheSIsInZTZW1hbnRpY09iamVjdE1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJ2T3V0Ym91bmRQYXJhbXMiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvVGFyZ2V0SW5mbyIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJsZW5ndGgiLCJmb3JFYWNoIiwib05hdmlnYXRpb25Db250ZXh0IiwiaXNBIiwib1NlbWFudGljQXR0cmlidXRlcyIsImdldE9iamVjdCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvTmF2Q29udGV4dCIsInByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwicHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInB1c2giLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJkYXRhIiwibWV0YVBhdGgiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsInRvSlNPTlN0cmluZyIsIm9Nb2RlbCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFVybCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJ1bmRlZmluZWQiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiX2FwcGx5T3V0Ym91bmRQYXJhbXMiLCJpbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyIsIl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzIiwic05hdk1vZGUiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJtUmVmcmVzaFN0cmF0ZWdpZXMiLCJyZWZyZXNoU3RyYXRlZ2llcyIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0Vmlld0RhdGEiLCJyZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUiLCJtVmlld1JlZnJlc2hTdHJhdGVnaWVzIiwibWVyZ2VPYmplY3RzIiwibVJlZnJlc2hTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCIsInNldFByb3BlcnR5Iiwib25FcnJvciIsInNhcCIsInVpIiwicmVxdWlyZSIsIk1lc3NhZ2VCb3giLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic2hvdyIsImdldFRleHQiLCJ0aXRsZSIsIkVycm9yIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvTWV0YU1vZGVsIiwiY29udmVydGVyVHlwZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsImJpbmQiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk5hdmlnYXRpb25UeXBlIiwiRm9yd2FyZE5hdmlnYXRpb24iLCJvRGlzdGluY3RLZXlzIiwic0NvbnRleHRQYXRoIiwiYU1ldGFQYXRoUGFydHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0IiwiTG9va1VwT2JqZWN0Iiwic0xvb2tVcE9iamVjdE1ldGFQYXRoIiwic0tleSIsIm9OZXdMb29rVXBPYmplY3QiLCJzTWFpbkVudGl0eVNldE5hbWUiLCJzTWFpbkVudGl0eVR5cGVOYW1lIiwib1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJzTWFpbkVudGl0eVZhbHVlUGF0aCIsInNDdXJyZW50VmFsdWVQYXRoIiwic0xhc3RWYWx1ZVBhdGgiLCJzRGlzdGluY3RLZXkiLCJhQ29uZmxpY3RpbmdQYXRocyIsInNXaW5uZXJWYWx1ZVBhdGgiLCJpIiwic1BhdGgiLCJzUGF0aEluQ29udGV4dCIsInJlcGxhY2UiLCJzRW50aXR5VHlwZU5hbWUiLCJzVmFsdWUiLCJqb2luIiwiZ2V0UHJvcGVydHkiLCJzUHJvcGVydHkiLCJwcmVwYXJlRmlsdGVyc0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9GaWx0ZXJCYXJDb25kaXRpb25zIiwic1Jvb3RQYXRoIiwiYVBhcmFtZXRlcnMiLCJvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdCIsInNGdWxsQ29udGV4dFBhdGgiLCJpbmNsdWRlcyIsImFQYXRoUGFydHMiLCJyZXBsYWNlQWxsIiwiZmlsdGVyQ29uZGl0aW9ucyIsImZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QiLCJuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2ciLCJub3RBcHBsaWNhYmxlQ29udGV4dHMiLCJvQXBwbGljYWJsZUNvbnRleHREaWFsb2ciLCJvbkNsb3NlIiwiY2xvc2UiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZm5PcGVuQW5kRmlsbERpYWxvZyIsIm9EaWFsb2dDb250ZW50Iiwibk5vdEFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZUl0ZW1zIiwib05vdEFwcGxpY2FibGVJdGVtc01vZGVsIiwiSlNPTk1vZGVsIiwib1RvdGFscyIsInRvdGFsIiwibGFiZWwiLCJzZXRNb2RlbCIsIm9wZW4iLCJzRnJhZ21lbnROYW1lIiwib0RpYWxvZ0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJzQ2Fub25pY2FsUGF0aCIsImdldENhbm9uaWNhbFBhdGgiLCJzdWJzdHIiLCJpbmRleE9mIiwiUHJvbWlzZSIsInJlc29sdmUiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVR5cGUiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm1vZGVscyIsIm1ldGFNb2RlbCIsInRoZW4iLCJvRnJhZ21lbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9Qb3BvdmVyIiwiYWRkRGVwZW5kZW50IiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsInJlbW92ZVNlbGVjdE9wdGlvbiIsImVudGl0eVNldCIsIm9BdHRyaWJ1dGVzIiwiYVByb3BlcnRpZXMiLCJPYmplY3QiLCJrZXlzIiwiaiIsInNQcm9wIiwiYVByb3BlcnR5QW5ub3RhdGlvbnMiLCJvRmllbGRDb250cm9sIiwiX2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsInNGaWVsZENvbnRyb2xQYXRoIiwib0F0dHJpYnV0ZSIsImJJbmFwcGxpY2FibGUiLCJhUGFydHMiLCJoYXNPd25Qcm9wZXJ0eSIsInZNYXBwaW5ncyIsIm9NYXBwaW5ncyIsIkpTT04iLCJwYXJzZSIsInNMb2NhbFByb3BlcnR5Iiwic1NlbWFudGljT2JqZWN0UHJvcGVydHkiLCJnZXRTZWxlY3RPcHRpb24iLCJvU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsIm5hdmlnYXRlT3V0Ym91bmQiLCJzT3V0Ym91bmQiLCJhTmF2UGFyYW1zIiwib01hbmlmZXN0RW50cnkiLCJnZXRNYW5pZmVzdEVudHJ5Iiwib091dGJvdW5kIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib3V0Ym91bmRQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiZ2V0T3V0Ym91bmRQYXJhbXMiLCJrZXkiLCJvUGFyYW1zIiwiYVZhbHVlcyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvT3V0Ym91bmRQYXJhbXMiLCJvUGFyYW1zTWFwcGluZyIsIm9NYXBwaW5nIiwidmFsdWUiLCJmb3JtYXQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9PdXRib3VuZHMiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9EaXNwbGF5T3V0Ym91bmQiLCJvUmVmcmVzaFN0cmF0ZWdpZXMiLCJpbnRlbnRzIiwib0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3kiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUVNQSw2QixXQURMQyxjQUFjLENBQUMsa0VBQUQsQyxVQU9iQyxjQUFjLEUsVUFrQ2RDLGVBQWUsRSxVQUNmQyxjQUFjLEUsVUE4SmRELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFrSGRELGVBQWUs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QUNwQ1gsWUFBQUEsOEJBQThCLEdBQUc2TSxPQUFqQztBQUNBO0FBQ0Q7O0FBRUR4TSxRQUFBQSxXQUFXLENBQUNzQyxzQkFBWixDQUFtQ3pELFFBQW5DLENBQTRDMk8sZ0JBQWdCLENBQUMzTixjQUE3RCxFQUE2RTJOLGdCQUFnQixDQUFDMU4sTUFBOUYsRUFBc0c7QUFDckdWLFVBQUFBLGtCQUFrQixFQUFFRixRQURpRjtBQUVyR3VELFVBQUFBLGlCQUFpQixFQUFFZ0wsa0JBRmtGO0FBR3JHOU4sVUFBQUEsOEJBQThCLEVBQUVBO0FBSHFFLFNBQXRHLEVBOUJtRixDQW9DbkY7OztBQUNBLGVBQU9tSixPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBLE9BdENELE1Bc0NPO0FBQ04sY0FBTSxJQUFJakYsS0FBSixDQUFVLHFCQUFxQnFKLGVBQXJCLEdBQXVDLHVEQUFqRCxDQUFOO0FBQ0E7QUFDRCxLOzs7SUFyd0IwQ1UsbUI7U0F3d0I3QnBRLDZCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHtcblx0ZGVmaW5lVUk1Q2xhc3MsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvTmF2aWdhdGlvblNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEludGVybmFsQmFzZWROYXZpZ2F0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjg0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxJbnRlcm5hbEJhc2VkTmF2aWdhdGlvblwiKVxuY2xhc3MgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRwcml2YXRlIF9vTmF2aWdhdGlvblNlcnZpY2UhOiBOYXZpZ2F0aW9uU2VydmljZTtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0aGlzLl9vTWV0YU1vZGVsID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbiAoU2VtYW50aWNPYmplY3QtQWN0aW9uKSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuXHQgKiBJZiBzZW1hbnRpYyBvYmplY3QgbWFwcGluZyBpcyBwcm92aWRlZCwgdGhpcyBpcyBhbHNvIGFwcGxpZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFmdGVyIHRoZSBhZGFwdGF0aW9uIGJ5IGEgY29uc3VtZXIuXG5cdCAqIFRoaXMgdGFrZXMgY2FyZSBvZiByZW1vdmluZyBhbnkgdGVjaG5pY2FsIHBhcmFtZXRlcnMgYW5kIGRldGVybWluZXMgaWYgYW4gZXhwbGFjZSBvciBpbnBsYWNlIG5hdmlnYXRpb24gc2hvdWxkIHRha2UgcGxhY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0IGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbiAgQWN0aW9uIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21OYXZpZ2F0aW9uUGFyYW1ldGVyc10gT3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIGV4dGVybmFsIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtBcnJheXxvYmplY3R9IFttTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzXSBVc2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50OlxuXHQgKiAgICBhIHNpbmdsZSBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9XG5cdCAqICAgIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9XG5cdCAqICAgIGFuIG9iamVjdCBvciBhbiBhcnJheSBvZiBvYmplY3RzXG5cdCAqXHRcdCAgSWYgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyBwYXNzZWQsIHRoZSBjb250ZXh0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtZXRhUGF0aCBhbmQgdG8gcmVtb3ZlIGFueSBzZW5zaXRpdmUgZGF0YVxuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgZm9sbG93aW5nIGZvcm1hdCBpeCBleHBlY3RlZDpcblx0ICpcdFx0ICB7XG5cdCAqXHRcdFx0ZGF0YToge1xuXHQgKlx0IFx0XHRcdFByb2R1Y3RJRDogNzYzNCxcblx0ICpcdFx0XHRcdE5hbWU6IFwiTGFwdG9wXCJcblx0ICpcdFx0XHQgfSxcblx0ICpcdFx0XHQgbWV0YVBhdGg6IFwiL1NhbGVzT3JkZXJNYW5hZ2VcIlxuXHQgKiAgICAgICAgfVxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdH0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmddIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgU2VtYW50aWNPYmplY3RNYXBwaW5nIG9yIFNlbWFudGljT2JqZWN0TWFwcGluZyB0aGF0IGFwcGxpZXMgdG8gdGhpcyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmRlZmF1bHRSZWZyZXNoU3RyYXRlZ3ldIERlZmF1bHQgcmVmcmVzaCBzdHJhdGVneSB0byBiZSB1c2VkIGluIGNhc2Ugbm8gcmVmcmVzaCBzdHJhdGVneSBpcyBzcGVjaWZpZWQgZm9yIHRoZSBpbnRlbnQgaW4gdGhlIHZpZXcuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlZnJlc2hTdHJhdGVnaWVzXVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNdIEFkZGl0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQgaW4gdGhlIGNyb3NzQXBwTmF2aWdhdGlvbiBvdXRib3VuZCBwYXJhbWV0ZXJzLlxuXHQgKiovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZShcblx0XHRzU2VtYW50aWNPYmplY3Q6IHN0cmluZyxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzPzogb2JqZWN0IHwgYW55W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogc3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGRlZmF1bHRSZWZyZXNoU3RyYXRlZ3k/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0cmVmcmVzaFN0cmF0ZWdpZXM/OiBhbnk7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZFxuXHQpIHtcblx0XHRjb25zdCBfZG9OYXZpZ2F0ZSA9IChvQ29udGV4dD86IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgdk5hdmlnYXRpb25Db250ZXh0cyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzLFxuXHRcdFx0XHRhTmF2aWdhdGlvbkNvbnRleHRzID1cblx0XHRcdFx0XHR2TmF2aWdhdGlvbkNvbnRleHRzICYmICFBcnJheS5pc0FycmF5KHZOYXZpZ2F0aW9uQ29udGV4dHMpID8gW3ZOYXZpZ2F0aW9uQ29udGV4dHNdIDogdk5hdmlnYXRpb25Db250ZXh0cyxcblx0XHRcdFx0dlNlbWFudGljT2JqZWN0TWFwcGluZyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHR2T3V0Ym91bmRQYXJhbXMgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0b1RhcmdldEluZm86IGFueSA9IHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogc0FjdGlvblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1ZpZXcuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1NlbWFudGljT2JqZWN0ICYmIHNBY3Rpb24pIHtcblx0XHRcdFx0bGV0IGFTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueVtdID0gW10sXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0XHQvLyAxLiBnZXQgU2VtYW50aWNBdHRyaWJ1dGVzIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvbkNvbnRleHRzICYmIGFOYXZpZ2F0aW9uQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Db250ZXh0cy5mb3JFYWNoKChvTmF2aWdhdGlvbkNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gMS4xLmEgaWYgbmF2aWdhdGlvbiBjb250ZXh0IGlzIGluc3RhbmNlIG9mIHNhcC51aS5tb2RlLm9kYXRhLnY0LkNvbnRleHRcblx0XHRcdFx0XHRcdC8vIGVsc2UgY2hlY2sgaWYgbmF2aWdhdGlvbiBjb250ZXh0IGlzIG9mIHR5cGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Db250ZXh0LmlzQSAmJiBvTmF2aWdhdGlvbkNvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRcdFx0Ly8gMS4xLmIgcmVtb3ZlIHNlbnNpdGl2ZSBkYXRhXG5cdFx0XHRcdFx0XHRcdGxldCBvU2VtYW50aWNBdHRyaWJ1dGVzID0gb05hdmlnYXRpb25Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSB0aGlzLl9vTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBhbHNvIHJlbW92ZSBzZW5zaXRpdmUgZGF0YSBmcm9tICBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljQXR0cmlidXRlcyA9IHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvU2VtYW50aWNBdHRyaWJ1dGVzLCBzTWV0YVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmF2Q29udGV4dCA9IHRoaXMucHJlcGFyZUNvbnRleHRGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1NlbWFudGljQXR0cmlidXRlcywgb05hdmlnYXRpb25Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0b1RhcmdldEluZm9bXCJwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0XCJdID0gb05hdkNvbnRleHQucHJvcGVydGllc1dpdGhvdXRDb25mbGljdDtcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcy5wdXNoKG9OYXZDb250ZXh0LnNlbWFudGljQXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHQhKG9OYXZpZ2F0aW9uQ29udGV4dCAmJiBBcnJheS5pc0FycmF5KG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhKSkgJiZcblx0XHRcdFx0XHRcdFx0dHlwZW9mIG9OYXZpZ2F0aW9uQ29udGV4dCA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdC8vIDEuMS5iIHJlbW92ZSBzZW5zaXRpdmUgZGF0YSBmcm9tIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNBdHRyaWJ1dGVzLnB1c2godGhpcy5yZW1vdmVTZW5zaXRpdmVEYXRhKG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhLCBvTmF2aWdhdGlvbkNvbnRleHQubWV0YVBhdGgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25Db250ZXh0ICYmIEFycmF5LmlzQXJyYXkob05hdmlnYXRpb25Db250ZXh0LmRhdGEpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhIGNhbiBiZSBhcnJheSBhbHJlYWR5IGV4IDogW3tDdXN0b21lcjogXCIxMDAwMVwifSwge0N1c3RvbWVyOiBcIjEwMDkxXCJ9XVxuXHRcdFx0XHRcdFx0XHQvLyBoZW5jZSBhc3NpZ25pbmcgaXQgdG8gdGhlIGFTZW1hbnRpY0F0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcyA9IHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSwgb05hdmlnYXRpb25Db250ZXh0Lm1ldGFQYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyAyLjEgTWVyZ2UgYmFzZSBzZWxlY3Rpb24gdmFyaWFudCBhbmQgc2FuaXRpemVkIHNlbWFudGljIGF0dHJpYnV0ZXMgaW50byBvbmUgU2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHRpZiAoYVNlbWFudGljQXR0cmlidXRlcyAmJiBhU2VtYW50aWNBdHRyaWJ1dGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gdGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDMuIEFkZCBmaWx0ZXJDb250ZXh0VXJsIHRvIFNWIHNvIHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBjYW4gcmVtb3ZlIGFueSBzZW5zaXRpdmUgZGF0YSBiYXNlZCBvbiB2aWV3IGVudGl0eVNldFxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdHNFbnRpdHlTZXQgPSB0aGlzLmdldEVudGl0eVNldCgpLFxuXHRcdFx0XHRcdHNDb250ZXh0VXJsID0gc0VudGl0eVNldCA/IHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZS5jb25zdHJ1Y3RDb250ZXh0VXJsKHNFbnRpdHlTZXQsIG9Nb2RlbCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChzQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnNldEZpbHRlckNvbnRleHRVcmwoc0NvbnRleHRVcmwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgT3V0Ym91bmQgUGFyYW1ldGVycyB0byB0aGUgU1Zcblx0XHRcdFx0aWYgKHZPdXRib3VuZFBhcmFtcykge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5T3V0Ym91bmRQYXJhbXMob1NlbGVjdGlvblZhcmlhbnQsIHZPdXRib3VuZFBhcmFtcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA0LiBnaXZlIGFuIG9wcG9ydHVuaXR5IGZvciB0aGUgYXBwbGljYXRpb24gdG8gaW5mbHVlbmNlIHRoZSBTZWxlY3Rpb25WYXJpYW50XG5cdFx0XHRcdG9Db250cm9sbGVyLmludGVudEJhc2VkTmF2aWdhdGlvbi5hZGFwdE5hdmlnYXRpb25Db250ZXh0KG9TZWxlY3Rpb25WYXJpYW50LCBvVGFyZ2V0SW5mbyk7XG5cblx0XHRcdFx0Ly8gNS4gQXBwbHkgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdzIHRvIHRoZSBTVlxuXHRcdFx0XHRpZiAodlNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyhvU2VsZWN0aW9uVmFyaWFudCwgdlNlbWFudGljT2JqZWN0TWFwcGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA2LiByZW1vdmUgdGVjaG5pY2FsIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb24gVmFyaWFudFxuXHRcdFx0XHR0aGlzLl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9TZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHQvLyA3LiBjaGVjayBpZiBwcm9ncmFtbWluZyBtb2RlbCBpcyBzdGlja3kgYW5kIHBhZ2UgaXMgZWRpdGFibGVcblx0XHRcdFx0Y29uc3Qgc05hdk1vZGUgPSBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLmdldE5hdmlnYXRpb25Nb2RlKCk7XG5cblx0XHRcdFx0Ly8gOC4gVXBkYXRpbmcgcmVmcmVzaCBzdHJhdGVneSBpbiBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0XHRjb25zdCBtUmVmcmVzaFN0cmF0ZWdpZXMgPSAobU5hdmlnYXRpb25QYXJhbWV0ZXJzICYmIG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWZyZXNoU3RyYXRlZ2llcykgfHwge30sXG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKChvVmlldyAmJiAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpKS5yZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1WaWV3UmVmcmVzaFN0cmF0ZWdpZXMgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZSB8fCB7fTtcblx0XHRcdFx0XHRcdG1lcmdlT2JqZWN0cyhtUmVmcmVzaFN0cmF0ZWdpZXMsIG1WaWV3UmVmcmVzaFN0cmF0ZWdpZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBtUmVmcmVzaFN0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldFJlZnJlc2hTdHJhdGVneUZvckludGVudChtUmVmcmVzaFN0cmF0ZWdpZXMsIHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbik7XG5cdFx0XHRcdFx0aWYgKG1SZWZyZXNoU3RyYXRlZ3kpIHtcblx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3JlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZVwiLCBtUmVmcmVzaFN0cmF0ZWd5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA5LiBOYXZpZ2F0ZSB2aWEgTmF2aWdhdGlvbkhhbmRsZXJcblx0XHRcdFx0Y29uc3Qgb25FcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvbS9NZXNzYWdlQm94XCJdLCBmdW5jdGlvbiAoTWVzc2FnZUJveDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fSEVMUEVSX05BVklHQVRJT05fRVJST1JfTUVTU0FHRVwiKSwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9OQVZJR0FUSU9OX0VSUk9SX1RJVExFXCIpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0dGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLm5hdmlnYXRlKFxuXHRcdFx0XHRcdHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdChvU2VsZWN0aW9uVmFyaWFudCBhcyBhbnkpLnRvSlNPTlN0cmluZygpLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzTmF2TW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2VtYW50aWMgT2JqZWN0L2FjdGlvbiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dCAmJiAob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCIgJiZcblx0XHRcdG9NZXRhTW9kZWwgJiZcblx0XHRcdCFNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob01ldGFNb2RlbClcblx0XHQpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRfZG9OYXZpZ2F0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfZG9OYXZpZ2F0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVwYXJlIGF0dHJpYnV0ZXMgdG8gYmUgcGFzc2VkIHRvIGV4dGVybmFsIG5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2VtYW50aWNBdHRyaWJ1dGVzIENvbnRleHQgZGF0YSBhZnRlciByZW1vdmluZyBhbGwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQWN0dWFsIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIHdlcmUgZGVyaXZlZC5cblx0ICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IG9mIHByZXBhcmVkIGF0dHJpYnV0ZXMgZm9yIGV4dGVybmFsIG5hdmlnYXRpb24gYW5kIG5vIGNvbmZsaWN0IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJlcGFyZUNvbnRleHRGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1NlbWFudGljQXR0cmlidXRlczogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdC8vIDEuIEZpbmQgYWxsIGRpc3RpbmN0IGtleXMgaW4gdGhlIG9iamVjdCBTZW1hbnRpY0F0dHJpYnV0ZXNcblx0XHQvLyBTdG9yZSBtZXRhIHBhdGggZm9yIGVhY2ggb2NjdXJlbmNlIG9mIHRoZSBrZXlcblx0XHRjb25zdCBvRGlzdGluY3RLZXlzOiBhbnkgPSB7fSxcblx0XHRcdHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzQ29udGV4dFBhdGgpLFxuXHRcdFx0YU1ldGFQYXRoUGFydHMgPSBzTWV0YVBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuXHRcdGZ1bmN0aW9uIF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3QoTG9va1VwT2JqZWN0OiBhbnksIHNMb29rVXBPYmplY3RNZXRhUGF0aDogYW55KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gTG9va1VwT2JqZWN0KSB7XG5cdFx0XHRcdC8vIG51bGwgY2FzZT8/XG5cdFx0XHRcdGlmIChMb29rVXBPYmplY3Rbc0tleV0gPT09IG51bGwgfHwgdHlwZW9mIExvb2tVcE9iamVjdFtzS2V5XSAhPT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0S2V5c1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYga2V5IGlzIGZvdW5kIGZvciB0aGUgZmlyc3QgdGltZSB0aGVuIGNyZWF0ZSBhcnJheVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XSA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBwdXNoIHBhdGggdG8gYXJyYXlcblx0XHRcdFx0XHRvRGlzdGluY3RLZXlzW3NLZXldLnB1c2goc0xvb2tVcE9iamVjdE1ldGFQYXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiBhIG5lc3RlZCBvYmplY3QgaXMgZm91bmRcblx0XHRcdFx0XHRjb25zdCBvTmV3TG9va1VwT2JqZWN0ID0gTG9va1VwT2JqZWN0W3NLZXldO1xuXHRcdFx0XHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob05ld0xvb2tVcE9iamVjdCwgc0xvb2tVcE9iamVjdE1ldGFQYXRoICsgXCIvXCIgKyBzS2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob1NlbWFudGljQXR0cmlidXRlcywgc01ldGFQYXRoKTtcblxuXHRcdC8vIDIuIERldGVybWluZSBkaXN0aW5jdCBrZXkgdmFsdWUgYW5kIGFkZCBjb25mbGljdGVkIHBhdGhzIHRvIHNlbWFudGljIGF0dHJpYnV0ZXNcblx0XHRjb25zdCBzTWFpbkVudGl0eVNldE5hbWUgPSBhTWV0YVBhdGhQYXJ0c1swXSxcblx0XHRcdHNNYWluRW50aXR5VHlwZU5hbWUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIiArIHNNYWluRW50aXR5U2V0TmFtZSArIFwiL0BzYXB1aS5uYW1lXCIpLFxuXHRcdFx0b1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q6IGFueSA9IHt9O1xuXHRcdGxldCBzTWFpbkVudGl0eVZhbHVlUGF0aCwgc0N1cnJlbnRWYWx1ZVBhdGgsIHNMYXN0VmFsdWVQYXRoO1xuXHRcdGZvciAoY29uc3Qgc0Rpc3RpbmN0S2V5IGluIG9EaXN0aW5jdEtleXMpIHtcblx0XHRcdGNvbnN0IGFDb25mbGljdGluZ1BhdGhzID0gb0Rpc3RpbmN0S2V5c1tzRGlzdGluY3RLZXldO1xuXHRcdFx0bGV0IHNXaW5uZXJWYWx1ZVBhdGg7XG5cdFx0XHQvLyBGaW5kIHdpbm5lciB2YWx1ZSBmb3IgZWFjaCBkaXN0aW5jdCBrZXkgaW4gY2FzZSBvZiBjb25mbGljdCBieSB0aGUgZm9sbG93aW5nIHJ1bGU6XG5cblx0XHRcdC8vIC0+IEEuIGlmIGFueSBtZXRhIHBhdGggZm9yIGEgZGlzdGluY3Qga2V5IGlzIHRoZSBzYW1lIGFzIG1haW4gZW50aXR5IHRha2UgdGhhdCBhcyB0aGUgdmFsdWVcblx0XHRcdC8vIC0+IEIuIGlmIEEgaXMgbm90IG1ldCBrZWVwIHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQgKHNNZXRhUGF0aCA9PT0gcGF0aCBvZiBkaXN0aW5jZSBrZXkpXG5cdFx0XHQvLyAtPiBDLiBpZiBBLCBCIG9yIEMgYXJlIG5vdCBtZXQgdGFrZSB0aGUgbGFzdCBwYXRoIGZvciB2YWx1ZVxuXHRcdFx0aWYgKGFDb25mbGljdGluZ1BhdGhzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0Ly8gY29uZmxpY3Rcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPD0gYUNvbmZsaWN0aW5nUGF0aHMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBhQ29uZmxpY3RpbmdQYXRoc1tpXTtcblx0XHRcdFx0XHRsZXQgc1BhdGhJbkNvbnRleHQgPSBzUGF0aC5yZXBsYWNlKHNQYXRoID09PSBzTWV0YVBhdGggPyBzTWV0YVBhdGggOiBzTWV0YVBhdGggKyBcIi9cIiwgXCJcIik7XG5cdFx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSAoc1BhdGhJbkNvbnRleHQgPT09IFwiXCIgPyBzUGF0aEluQ29udGV4dCA6IHNQYXRoSW5Db250ZXh0ICsgXCIvXCIpICsgc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNQYXRoICsgXCIvQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdFx0Ly8gcnVsZSBBXG5cblx0XHRcdFx0XHQvLyBydWxlIEFcblx0XHRcdFx0XHRpZiAoc0VudGl0eVR5cGVOYW1lID09PSBzTWFpbkVudGl0eVR5cGVOYW1lKSB7XG5cdFx0XHRcdFx0XHRzTWFpbkVudGl0eVZhbHVlUGF0aCA9IHNQYXRoSW5Db250ZXh0O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHJ1bGUgQlxuXHRcdFx0XHRcdGlmIChzUGF0aCA9PT0gc01ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRzQ3VycmVudFZhbHVlUGF0aCA9IHNQYXRoSW5Db250ZXh0O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHJ1bGUgQ1xuXHRcdFx0XHRcdHNMYXN0VmFsdWVQYXRoID0gc1BhdGhJbkNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBhZGQgY29uZmxpY3RlZCBwYXRoIHRvIHNlbWFudGljIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgY3VycmVudCBwYXRoIHBvaW50cyB0byBtYWluIGVudGl0eSBhbmQgcHJlZml4IGF0dHJpYnV0ZSBuYW1lcyBhY2NvcmRpbmdseVxuXHRcdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbXG5cdFx0XHRcdFx0XHQoc01ldGFQYXRoICsgXCIvXCIgKyBzUGF0aEluQ29udGV4dClcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCIuXCIpXG5cdFx0XHRcdFx0XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNQYXRoSW5Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBIHx8IEIgfHwgQ1xuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGggfHwgc0xhc3RWYWx1ZVBhdGg7XG5cdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbc0Rpc3RpbmN0S2V5XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNXaW5uZXJWYWx1ZVBhdGgpO1xuXHRcdFx0XHRzTWFpbkVudGl0eVZhbHVlUGF0aCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0c0N1cnJlbnRWYWx1ZVBhdGggPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHNMYXN0VmFsdWVQYXRoID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gbm8gY29uZmxpY3QsIGFkZCBkaXN0aW5jdCBrZXkgd2l0aG91dCBhZGRpbmcgcGF0aHNcblx0XHRcdFx0Y29uc3Qgc1BhdGggPSBhQ29uZmxpY3RpbmdQYXRoc1swXTsgLy8gYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBhbmQgaGVuY2Ugbm8gY29uZmxpY3Rcblx0XHRcdFx0bGV0IHNQYXRoSW5Db250ZXh0ID0gc1BhdGgucmVwbGFjZShzUGF0aCA9PT0gc01ldGFQYXRoID8gc01ldGFQYXRoIDogc01ldGFQYXRoICsgXCIvXCIsIFwiXCIpO1xuXHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IChzUGF0aEluQ29udGV4dCA9PT0gXCJcIiA/IHNQYXRoSW5Db250ZXh0IDogc1BhdGhJbkNvbnRleHQgKyBcIi9cIikgKyBzRGlzdGluY3RLZXk7XG5cdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbc0Rpc3RpbmN0S2V5XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNQYXRoSW5Db250ZXh0KTtcblx0XHRcdFx0b1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rbc0Rpc3RpbmN0S2V5XSA9IChzTWV0YVBhdGggKyBcIi9cIiArIHNQYXRoSW5Db250ZXh0KVxuXHRcdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNWYWx1ZSAhPSBcIlwiO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmpvaW4oXCIuXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyAzLiBSZW1vdmUgYWxsIE5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5IGluIG9TZW1hbnRpY0F0dHJpYnV0ZXMpIHtcblx0XHRcdGlmIChvU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eV0gIT09IG51bGwgJiYgdHlwZW9mIG9TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5XSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRkZWxldGUgb1NlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VtYW50aWNBdHRyaWJ1dGVzOiBvU2VtYW50aWNBdHRyaWJ1dGVzLFxuXHRcdFx0cHJvcGVydGllc1dpdGhvdXRDb25mbGljdDogb1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rcblx0XHR9O1xuXHR9XG5cdC8qKlxuXHQgKiBQcmVwYXJlIGZpbHRlciBjb25kaXRpb25zIHRvIGJlIHBhc3NlZCB0byBleHRlcm5hbCBuYXZpZ2F0aW9uLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpbHRlckJhckNvbmRpdGlvbnMgRmlsdGVyIGNvbmRpdGlvbnMuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUm9vdFBhdGggUm9vdCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbi5cblx0ICogQHBhcmFtIHtBcnJheX0gYVBhcmFtZXRlcnMgTmFtZXMgb2YgcGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkLlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgb2YgcHJlcGFyZWQgZmlsdGVyIGNvbmRpdGlvbnMgZm9yIGV4dGVybmFsIG5hdmlnYXRpb24gYW5kIG5vIGNvbmZsaWN0IGZpbHRlcnMuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJlcGFyZUZpbHRlcnNGb3JFeHRlcm5hbE5hdmlnYXRpb24ob0ZpbHRlckJhckNvbmRpdGlvbnM6IGFueSwgc1Jvb3RQYXRoOiBzdHJpbmcsIGFQYXJhbWV0ZXJzPzogYW55W10pIHtcblx0XHRsZXQgc1BhdGg7XG5cdFx0Y29uc3Qgb0Rpc3RpbmN0S2V5czogYW55ID0ge307XG5cdFx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Q6IGFueSA9IHt9O1xuXHRcdGxldCBzTWFpbkVudGl0eVZhbHVlUGF0aCwgc0N1cnJlbnRWYWx1ZVBhdGgsIHNGdWxsQ29udGV4dFBhdGgsIHNXaW5uZXJWYWx1ZVBhdGgsIHNQYXRoSW5Db250ZXh0O1xuXG5cdFx0ZnVuY3Rpb24gX2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdChMb29rVXBPYmplY3Q6IGFueSkge1xuXHRcdFx0bGV0IHNMb29rVXBPYmplY3RNZXRhUGF0aDtcblx0XHRcdGZvciAobGV0IHNLZXkgaW4gTG9va1VwT2JqZWN0KSB7XG5cdFx0XHRcdGlmIChMb29rVXBPYmplY3Rbc0tleV0pIHtcblx0XHRcdFx0XHRpZiAoc0tleS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0XHRcdHNMb29rVXBPYmplY3RNZXRhUGF0aCA9IHNLZXk7IC8vIFwiL1NhbGVzT3JkZXJtYW5hZ2UvX0l0ZW0vTWF0ZXJpYWxcIlxuXHRcdFx0XHRcdFx0Y29uc3QgYVBhdGhQYXJ0cyA9IHNLZXkuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRcdFx0c0tleSA9IGFQYXRoUGFydHNbYVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0xvb2tVcE9iamVjdE1ldGFQYXRoID0gc1Jvb3RQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdEtleXNbc0tleV0pIHtcblx0XHRcdFx0XHRcdC8vIGlmIGtleSBpcyBmb3VuZCBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlbiBjcmVhdGUgYXJyYXlcblx0XHRcdFx0XHRcdG9EaXN0aW5jdEtleXNbc0tleV0gPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBwdXNoIHBhdGggdG8gYXJyYXlcblx0XHRcdFx0XHRvRGlzdGluY3RLZXlzW3NLZXldLnB1c2goc0xvb2tVcE9iamVjdE1ldGFQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob0ZpbHRlckJhckNvbmRpdGlvbnMpO1xuXHRcdGZvciAoY29uc3Qgc0Rpc3RpbmN0S2V5IGluIG9EaXN0aW5jdEtleXMpIHtcblx0XHRcdGNvbnN0IGFDb25mbGljdGluZ1BhdGhzID0gb0Rpc3RpbmN0S2V5c1tzRGlzdGluY3RLZXldO1xuXG5cdFx0XHRpZiAoYUNvbmZsaWN0aW5nUGF0aHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHQvLyBjb25mbGljdFxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8PSBhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRzUGF0aCA9IGFDb25mbGljdGluZ1BhdGhzW2ldO1xuXHRcdFx0XHRcdGlmIChzUGF0aCA9PT0gc1Jvb3RQYXRoKSB7XG5cdFx0XHRcdFx0XHRzRnVsbENvbnRleHRQYXRoID0gc1Jvb3RQYXRoICsgXCIvXCIgKyBzRGlzdGluY3RLZXk7XG5cdFx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IHNEaXN0aW5jdEtleTtcblx0XHRcdFx0XHRcdHNNYWluRW50aXR5VmFsdWVQYXRoID0gc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRcdFx0b0ZpbHRlckJhckNvbmRpdGlvbnNbXCIkUGFyYW1ldGVyLlwiICsgc0Rpc3RpbmN0S2V5XSA9IG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNQYXRoSW5Db250ZXh0ID0gc1BhdGg7XG5cdFx0XHRcdFx0XHRzRnVsbENvbnRleHRQYXRoID0gKChzUm9vdFBhdGggKyBcIi9cIiArIHNQYXRoKSBhcyBhbnkpLnJlcGxhY2VBbGwoL1xcKi9nLCBcIlwiKTtcblx0XHRcdFx0XHRcdHNDdXJyZW50VmFsdWVQYXRoID0gc1BhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW1xuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aFxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNWYWx1ZSAhPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi5cIilcblx0XHRcdFx0XHRdID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc1BhdGhJbkNvbnRleHRdO1xuXHRcdFx0XHRcdGRlbGV0ZSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzUGF0aF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGg7XG5cdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzV2lubmVyVmFsdWVQYXRoXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG5vIGNvbmZsaWN0LCBhZGQgZGlzdGluY3Qga2V5IHdpdGhvdXQgYWRkaW5nIHBhdGhzXG5cdFx0XHRcdHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbMF07XG5cdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdHNQYXRoID09PSBzUm9vdFBhdGggPyBzUm9vdFBhdGggKyBcIi9cIiArIHNEaXN0aW5jdEtleSA6ICgoc1Jvb3RQYXRoICsgXCIvXCIgKyBzUGF0aCkgYXMgYW55KS5yZXBsYWNlQWxsKFwiKlwiLCBcIlwiKTtcblx0XHRcdFx0b0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Rbc0Rpc3RpbmN0S2V5XSA9IHNGdWxsQ29udGV4dFBhdGhcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKFwiLlwiKTtcblx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRvRmlsdGVyQmFyQ29uZGl0aW9uc1tcIiRQYXJhbWV0ZXIuXCIgKyBzRGlzdGluY3RLZXldID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc0Rpc3RpbmN0S2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRmaWx0ZXJDb25kaXRpb25zOiBvRmlsdGVyQmFyQ29uZGl0aW9ucyxcblx0XHRcdGZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Q6IG9GaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgTmF2aWdhdGlvbiBtb2RlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGdldE5hdmlnYXRpb25Nb2RlKCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0LyoqXG5cdCAqIEFsbG93cyBmb3IgbmF2aWdhdGlvbiB0byBhIGdpdmVuIGludGVudCAoU2VtYW50aWNPYmplY3QtQWN0aW9uKSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0LCB1c2luZyBhIGRpYWxvZyB0aGF0IHNob3dzIHRoZSBjb250ZXh0cyB3aGljaCBjYW5ub3QgYmUgcGFzc2VkXG5cdCAqIElmIHNlbWFudGljIG9iamVjdCBtYXBwaW5nIGlzIHByb3ZpZGVkLCB0aGlzIHNldHRpbmcgaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciBhZGFwdGF0aW9uIGJ5IGEgY29uc3VtZXIuXG5cdCAqIFRoaXMgc2V0dGluZyBhbHNvIHJlbW92ZXMgYW55IHRlY2huaWNhbCBwYXJhbWV0ZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGFuIGlucGxhY2Ugb3IgZXhwbGFjZSBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlIHBsYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb24gIEFjdGlvbiBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHtvYmplY3R9IFttTmF2aWdhdGlvblBhcmFtZXRlcnNdIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBleHRlcm5hbCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsXVxuXHQgKiBAcGFyYW0ge0FycmF5fG9iamVjdH0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHNdIFNpbmdsZSBpbnN0YW5jZSBvciBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSwgb3IgYWx0ZXJuYXRpdmVseSBhbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnQuXG5cdCAqIEBwYXJhbSB7QXJyYXl8b2JqZWN0fSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0c10gU2luZ2xlIGluc3RhbmNlIG9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9LCBvciBhbHRlcm5hdGl2ZWx5IGFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzLCB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudCBhbmQgZm9yIHdoaWNoIHRoZSBJQk4gYnV0dG9uIGlzIGVuYWJsZWRcblx0ICogQHBhcmFtIHtBcnJheXxvYmplY3R9IFttTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzXSBTaW5nbGUgaW5zdGFuY2Ugb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0sIG9yIGFsdGVybmF0aXZlbHkgYW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIHdoaWNoIGNhbm5vdCBiZSBwYXNzZWQgdG8gdGhlIGludGVudC5cblx0ICpcdFx0ICBpZiBhbiBhcnJheSBvZiBjb250ZXh0cyBpcyBwYXNzZWQgdGhlIGNvbnRleHQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1ldGEgcGF0aCBhbmQgYWNjb3JkaW5nbHkgcmVtb3ZlIHRoZSBzZW5zaXRpdmUgZGF0YVxuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgZm9sbG93aW5nIGZvcm1hdCBpcyBleHBlY3RlZDpcblx0ICpcdFx0ICB7XG5cdCAqXHRcdFx0ZGF0YToge1xuXHQgKlx0IFx0XHRcdFByb2R1Y3RJRDogNzYzNCxcblx0ICpcdFx0XHRcdE5hbWU6IFwiTGFwdG9wXCJcblx0ICpcdFx0XHQgfSxcblx0ICpcdFx0XHQgbWV0YVBhdGg6IFwiL1NhbGVzT3JkZXJNYW5hZ2VcIlxuXHQgKiAgICAgICAgfVxuXHQgKlx0XHRUaGUgbWV0YVBhdGggaXMgdXNlZCB0byByZW1vdmUgYW55IHNlbnNpdGl2ZSBkYXRhLlxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdH0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmddIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZW1hbnRpY09iamVjdE1hcHBpbmcgb3IgU2VtYW50aWNPYmplY3RNYXBwaW5nIHRoYXQgYXBwbGllcyB0byB0aGlzIG5hdmlnYXRpb25cblx0ICoqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb246IHN0cmluZyxcblx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBvYmplY3QgfCBhbnlbXTtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IG9iamVjdCB8IGFueVtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogYW55O1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc/OiBzdHJpbmcgfCBvYmplY3Q7XG5cdFx0fVxuXHQpIHtcblx0XHRpZiAobU5hdmlnYXRpb25QYXJhbWV0ZXJzPy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cz8ubGVuZ3RoID49IDEpIHtcblx0XHRcdGxldCBvQXBwbGljYWJsZUNvbnRleHREaWFsb2c6IERpYWxvZztcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvbkNvbnRpbnVlOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gVXNlcnMgY29udGludWVzIHRoZSBhY3Rpb24gd2l0aCB0aGUgYm91bmQgY29udGV4dHNcblx0XHRcdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cztcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGxldCBvRGlhbG9nQ29udGVudDtcblx0XHRcdFx0Y29uc3Qgbk5vdEFwcGxpY2FibGUgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zID0gW107XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0c1tpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoYU5vdEFwcGxpY2FibGVJdGVtcyk7XG5cdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsIH0pO1xuXHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob05vdEFwcGxpY2FibGVJdGVtc01vZGVsLCBcIm5vdEFwcGxpY2FibGVcIik7XG5cdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvVG90YWxzLCBcInRvdGFsc1wiKTtcblx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLm9wZW4oKTtcblx0XHRcdH07XG5cdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuQWN0aW9uUGFydGlhbFwiO1xuXHRcdFx0Y29uc3Qgb0RpYWxvZ0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0c1swXS5nZXRDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gc0Nhbm9uaWNhbFBhdGguc3Vic3RyKDAsIHNDYW5vbmljYWxQYXRoLmluZGV4T2YoXCIoXCIpKSArIFwiL1wiO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldClcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZTogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9Qb3BvdmVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2coKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvclwiKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXHRfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvU2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLmNvbnRleHRcIik7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiKTtcblx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oXCJTQVBfX01lc3NhZ2VzXCIpO1xuXHR9XG5cdC8qKlxuXHQgKiBHZXQgdGFyZ2V0ZWQgRW50aXR5IHNldC5cblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ30gRW50aXR5IHNldCBuYW1lXG5cdCAqXG5cdCAqXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdGdldEVudGl0eVNldCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdH1cblx0LyoqXG5cdCAqIFJlbW92ZXMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIHdpdGggcmVzcGVjdCB0byB0aGUgZW50aXR5U2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0F0dHJpYnV0ZXMgQ29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggTWV0YSBwYXRoIHRvIHJlYWNoIHRoZSBlbnRpdHlTZXQgaW4gdGhlIE1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzZW1hbnRpYyBBdHRyaWJ1dGVzXG5cdCAqIEBwcml2YXRlXG5cdCAqKi9cblx0Ly8gVE8tRE8gYWRkIHVuaXQgdGVzdHMgZm9yIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHF1bml0LlxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVtb3ZlU2Vuc2l0aXZlRGF0YShvQXR0cmlidXRlczogYW55LCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChvQXR0cmlidXRlcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvQXR0cmlidXRlcyk7XG5cdFx0XHRpZiAoYVByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJAb2RhdGEubWV0YWRhdGFFdGFnXCJdO1xuXHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJTQVBfX01lc3NhZ2VzXCJdO1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFQcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKG9BdHRyaWJ1dGVzW2FQcm9wZXJ0aWVzW2pdXSAmJiB0eXBlb2Ygb0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dLCBgJHtzTWV0YVBhdGh9LyR7YVByb3BlcnRpZXNbal19YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNQcm9wID0gYVByb3BlcnRpZXNbal0sXG5cdFx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9ucyA9IHRoaXMuX29NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcH1AYCk7XG5cdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eUFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIl0gfHxcblx0XHRcdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIl1cblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdICYmIG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXS5zcGxpdChcIi9cIilbMV0gPT09IFwiSW5hcHBsaWNhYmxlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSAmJlxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZShvRmllbGRDb250cm9sW1wiJFBhdGhcIl0sIG9BdHRyaWJ1dGVzKVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQXR0cmlidXRlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBwYXRoLWJhc2VkIEZpZWxkQ29udHJvbCBldmFsdWF0ZXMgdG8gaW5hcHBsaWNhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZpZWxkQ29udHJvbFBhdGggRmllbGQgY29udHJvbCBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQXR0cmlidXRlIFNlbWFudGljQXR0cmlidXRlc1xuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGluYXBwbGljYWJsZVxuXHQgKlxuXHQgKi9cblx0X2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZShzRmllbGRDb250cm9sUGF0aDogc3RyaW5nLCBvQXR0cmlidXRlOiBhbnkpIHtcblx0XHRsZXQgYkluYXBwbGljYWJsZSA9IGZhbHNlO1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNGaWVsZENvbnRyb2xQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHQvLyBzZW5zaXRpdmUgZGF0YSBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIHBhdGggaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC5cblx0XHRpZiAoYVBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGJJbmFwcGxpY2FibGUgPVxuXHRcdFx0XHRvQXR0cmlidXRlW2FQYXJ0c1swXV0gJiYgb0F0dHJpYnV0ZVthUGFydHNbMF1dLmhhc093blByb3BlcnR5KGFQYXJ0c1sxXSkgJiYgb0F0dHJpYnV0ZVthUGFydHNbMF1dW2FQYXJ0c1sxXV0gPT09IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJJbmFwcGxpY2FibGUgPSBvQXR0cmlidXRlW3NGaWVsZENvbnRyb2xQYXRoXSA9PT0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIGJJbmFwcGxpY2FibGU7XG5cdH1cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXBsYWNlIExvY2FsIFByb3BlcnRpZXMgd2l0aCBTZW1hbnRpYyBPYmplY3QgbWFwcGluZ3MuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb25WYXJpYW50IGNvbnNpc3Rpbmcgb2YgZmlsdGVyYmFyLCBUYWJsZSBhbmQgUGFnZSBDb250ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0IHwgc3RyaW5nfSB2TWFwcGluZ3MgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdcblx0ICogQHJldHVybnMge29iamVjdH0gLSBNb2RpZmllZCBTZWxlY3Rpb25WYXJpYW50IHdpdGggTG9jYWxQcm9wZXJ0eSByZXBsYWNlZCB3aXRoIFNlbWFudGljT2JqZWN0UHJvcGVydGllcy5cblx0ICovXG5cdF9hcHBseVNlbWFudGljT2JqZWN0TWFwcGluZ3Mob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIHZNYXBwaW5nczogb2JqZWN0IHwgc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb01hcHBpbmdzID0gdHlwZW9mIHZNYXBwaW5ncyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uodk1hcHBpbmdzKSA6IHZNYXBwaW5ncztcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9NYXBwaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc0xvY2FsUHJvcGVydHkgPVxuXHRcdFx0XHQob01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXSAmJiBvTWFwcGluZ3NbaV1bXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXSkgfHxcblx0XHRcdFx0KG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXSAmJlxuXHRcdFx0XHRcdG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXVtcIiRQYXRoXCJdKTtcblx0XHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdFByb3BlcnR5ID1cblx0XHRcdFx0b01hcHBpbmdzW2ldW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXSB8fCBvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl07XG5cdFx0XHRpZiAob1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0T3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KTtcblxuXHRcdFx0XHQvL0NyZWF0ZSBhIG5ldyBTZWxlY3RPcHRpb24gd2l0aCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSBhcyB0aGUgcHJvcGVydHkgTmFtZSBhbmQgcmVtb3ZlIHRoZSBvbGRlciBvbmVcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KTtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbihzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSwgb1NlbGVjdE9wdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGFuIE91dGJvdW5kIHByb3ZpZGVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzT3V0Ym91bmQgSWRlbnRpZmllciB0byBsb2NhdGlvbiB0aGUgb3V0Ym91bmQgaW4gdGhlIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgT3B0aW9uYWwgbWFwIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlbnRCYXNlZE5hdmlnYXRpb24jbmF2aWdhdGVPdXRib3VuZFxuXHQgKiBAc2luY2UgMS44Ni4wXG5cdCAqKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kOiBzdHJpbmcsIG1OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGFOYXZQYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9NYW5pZmVzdEVudHJ5ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpLFxuXHRcdFx0b091dGJvdW5kID0gb01hbmlmZXN0RW50cnkuY3Jvc3NOYXZpZ2F0aW9uICYmIG9NYW5pZmVzdEVudHJ5LmNyb3NzTmF2aWdhdGlvbi5vdXRib3VuZHNbc091dGJvdW5kXTtcblx0XHRpZiAoIW9PdXRib3VuZCkge1xuXHRcdFx0TG9nLmVycm9yKFwiT3V0Ym91bmQgaXMgbm90IGRlZmluZWQgaW4gbWFuaWZlc3QhIVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0ID0gb091dGJvdW5kLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0c0FjdGlvbiA9IG9PdXRib3VuZC5hY3Rpb24sXG5cdFx0XHRvdXRib3VuZFBhcmFtcyA9IG9PdXRib3VuZC5wYXJhbWV0ZXJzICYmIHRoaXMuZ2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kLnBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKG1OYXZpZ2F0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0YU5hdlBhcmFtcyA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb25QYXJhbWV0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0XHRsZXQgb1BhcmFtczogYW55O1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtTmF2aWdhdGlvblBhcmFtZXRlcnNba2V5XSkpIHtcblx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzW2tleV07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1zID0ge307XG5cdFx0XHRcdFx0XHRvUGFyYW1zW2tleV0gPSBhVmFsdWVzW2ldO1xuXHRcdFx0XHRcdFx0YU5hdlBhcmFtcz8ucHVzaChvUGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1BhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdG9QYXJhbXNba2V5XSA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVyc1trZXldO1xuXHRcdFx0XHRcdGFOYXZQYXJhbXM/LnB1c2gob1BhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYU5hdlBhcmFtcyB8fCBvdXRib3VuZFBhcmFtcykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IHtcblx0XHRcdFx0XHRkYXRhOiBhTmF2UGFyYW1zIHx8IG91dGJvdW5kUGFyYW1zXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gYXBwbHkgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICogQHBhcmFtIHtvYmplY3R9IG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvblZhcmlhbnQgY29uc2lzdGluZyBvZiBhIGZpbHRlciBiYXIsIGEgdGFibGUsIGFuZCBhIHBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gdk91dGJvdW5kUGFyYW1zIE91dGJvdW5kIFByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0ICogQHJldHVybnMge29iamVjdH0gLSBUaGUgbW9kaWZpZWQgU2VsZWN0aW9uVmFyaWFudCB3aXRoIG91dGJvdW5kIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRfYXBwbHlPdXRib3VuZFBhcmFtcyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk91dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKHZPdXRib3VuZFBhcmFtcyk7XG5cdFx0Y29uc3QgYVNlbGVjdFByb3BlcnRpZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWFTZWxlY3RQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKGtleSwgXCJJXCIsIFwiRVFcIiwgdk91dGJvdW5kUGFyYW1zW2tleV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvT3V0Ym91bmRQYXJhbXMgUGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBvdXRib3VuZHMuIE9ubHkgXCJwbGFpblwiIGlzIHN1cHBvcnRlZFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFBhcmFtZXRlcnMgd2l0aCB0aGUga2V5LVZhbHVlIHBhaXJcblx0ICoqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBvUGFyYW1zTWFwcGluZzogYW55ID0ge307XG5cdFx0aWYgKG9PdXRib3VuZFBhcmFtcykge1xuXHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvT3V0Ym91bmRQYXJhbXMpIHx8IFtdO1xuXHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IG9PdXRib3VuZFBhcmFtc1trZXldO1xuXHRcdFx0XHRcdGlmIChvTWFwcGluZy52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS5mb3JtYXQgPT09IFwicGxhaW5cIikge1xuXHRcdFx0XHRcdFx0aWYgKCFvUGFyYW1zTWFwcGluZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNNYXBwaW5nW2tleV0gPSBvTWFwcGluZy52YWx1ZS52YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1BhcmFtc01hcHBpbmc7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYW4gb3V0Ym91bmQgbmF2aWdhdGlvbiB3aGVuIGEgdXNlciBjaG9vc2VzIHRoZSBjaGV2cm9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsIG9Db250ZXh0OiBhbnksIHNDcmVhdGVQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvT3V0Ym91bmRzID0gKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpIGFzIGFueSkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKTtcblx0XHRjb25zdCBvRGlzcGxheU91dGJvdW5kID0gb091dGJvdW5kc1tzT3V0Ym91bmRUYXJnZXRdO1xuXHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0aWYgKG9EaXNwbGF5T3V0Ym91bmQgJiYgb0Rpc3BsYXlPdXRib3VuZC5zZW1hbnRpY09iamVjdCAmJiBvRGlzcGxheU91dGJvdW5kLmFjdGlvbikge1xuXHRcdFx0Y29uc3Qgb1JlZnJlc2hTdHJhdGVnaWVzOiBhbnkgPSB7XG5cdFx0XHRcdGludGVudHM6IHt9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3k6IGFueSA9IHt9O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDtcblxuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5pc0EgJiYgb0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gW29Db250ZXh0XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHRbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5W3NNZXRhUGF0aF0gPSBcInNlbGZcIjtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzW1wiX2ZlRGVmYXVsdFwiXSA9IG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc0NyZWF0ZVBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IG9EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3QgKyBcIi1cIiArIG9EaXNwbGF5T3V0Ym91bmQuYWN0aW9uO1xuXHRcdFx0XHRvUmVmcmVzaFN0cmF0ZWdpZXMuaW50ZW50c1tzS2V5XSA9IHt9O1xuXHRcdFx0XHRvUmVmcmVzaFN0cmF0ZWdpZXMuaW50ZW50c1tzS2V5XVtzQ3JlYXRlUGF0aF0gPSBcInNlbGZcIjtcblx0XHRcdH1cblx0XHRcdGlmIChvRGlzcGxheU91dGJvdW5kICYmIG9EaXNwbGF5T3V0Ym91bmQucGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zID0gb0Rpc3BsYXlPdXRib3VuZC5wYXJhbWV0ZXJzICYmIHRoaXMuZ2V0T3V0Ym91bmRQYXJhbXMob0Rpc3BsYXlPdXRib3VuZC5wYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvUGFyYW1zO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUob0Rpc3BsYXlPdXRib3VuZC5zZW1hbnRpY09iamVjdCwgb0Rpc3BsYXlPdXRib3VuZC5hY3Rpb24sIHtcblx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBvQ29udGV4dCxcblx0XHRcdFx0cmVmcmVzaFN0cmF0ZWdpZXM6IG9SZWZyZXNoU3RyYXRlZ2llcyxcblx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdH0pO1xuXG5cdFx0XHQvL1RPRE86IGNoZWNrIHdoeSByZXR1cm5pbmcgYSBwcm9taXNlIGlzIHJlcXVpcmVkXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm91dGJvdW5kIHRhcmdldCBcIiArIHNPdXRib3VuZFRhcmdldCArIFwiIG5vdCBmb3VuZCBpbiBjcm9zcyBuYXZpZ2F0aW9uIGRlZmluaXRpb24gb2YgbWFuaWZlc3RcIik7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuIl19
|
|
801
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sIm5hbWVzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiSW5zdGVhZCIsInByaXZhdGVFeHRlbnNpb24iLCJvbkluaXQiLCJfb0FwcENvbXBvbmVudCIsImJhc2UiLCJnZXRBcHBDb21wb25lbnQiLCJfb01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiX29OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwiX29WaWV3IiwiZ2V0VmlldyIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbiIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9kb05hdmlnYXRlIiwib0NvbnRleHQiLCJ2TmF2aWdhdGlvbkNvbnRleHRzIiwibmF2aWdhdGlvbkNvbnRleHRzIiwiYU5hdmlnYXRpb25Db250ZXh0cyIsIkFycmF5IiwiaXNBcnJheSIsInZTZW1hbnRpY09iamVjdE1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJ2T3V0Ym91bmRQYXJhbXMiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvVGFyZ2V0SW5mbyIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJsZW5ndGgiLCJmb3JFYWNoIiwib05hdmlnYXRpb25Db250ZXh0IiwiaXNBIiwib1NlbWFudGljQXR0cmlidXRlcyIsImdldE9iamVjdCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvTmF2Q29udGV4dCIsInByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwicHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInB1c2giLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJkYXRhIiwibWV0YVBhdGgiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsInRvSlNPTlN0cmluZyIsIm9Nb2RlbCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFVybCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJ1bmRlZmluZWQiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiX2FwcGx5T3V0Ym91bmRQYXJhbXMiLCJpbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyIsIl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzIiwic05hdk1vZGUiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJtUmVmcmVzaFN0cmF0ZWdpZXMiLCJyZWZyZXNoU3RyYXRlZ2llcyIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0Vmlld0RhdGEiLCJyZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUiLCJtVmlld1JlZnJlc2hTdHJhdGVnaWVzIiwibWVyZ2VPYmplY3RzIiwibVJlZnJlc2hTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCIsInNldFByb3BlcnR5Iiwib25FcnJvciIsInNhcCIsInVpIiwicmVxdWlyZSIsIk1lc3NhZ2VCb3giLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZXJyb3IiLCJnZXRUZXh0IiwidGl0bGUiLCJFcnJvciIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImNvbnZlcnRlclR5cGUiLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJiaW5kIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkZvcndhcmROYXZpZ2F0aW9uIiwib0Rpc3RpbmN0S2V5cyIsInNDb250ZXh0UGF0aCIsImFNZXRhUGF0aFBhcnRzIiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiX2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdCIsIkxvb2tVcE9iamVjdCIsInNMb29rVXBPYmplY3RNZXRhUGF0aCIsInNLZXkiLCJvTmV3TG9va1VwT2JqZWN0Iiwic01haW5FbnRpdHlTZXROYW1lIiwic01haW5FbnRpdHlUeXBlTmFtZSIsIm9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0Iiwic01haW5FbnRpdHlWYWx1ZVBhdGgiLCJzQ3VycmVudFZhbHVlUGF0aCIsInNMYXN0VmFsdWVQYXRoIiwic0Rpc3RpbmN0S2V5IiwiYUNvbmZsaWN0aW5nUGF0aHMiLCJzV2lubmVyVmFsdWVQYXRoIiwiaSIsInNQYXRoIiwic1BhdGhJbkNvbnRleHQiLCJyZXBsYWNlIiwic0VudGl0eVR5cGVOYW1lIiwic1ZhbHVlIiwiam9pbiIsImdldFByb3BlcnR5Iiwic1Byb3BlcnR5IiwicHJlcGFyZUZpbHRlcnNGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJvRmlsdGVyQmFyQ29uZGl0aW9ucyIsInNSb290UGF0aCIsImFQYXJhbWV0ZXJzIiwib0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QiLCJzRnVsbENvbnRleHRQYXRoIiwiaW5jbHVkZXMiLCJhUGF0aFBhcnRzIiwicmVwbGFjZUFsbCIsImZpbHRlckNvbmRpdGlvbnMiLCJmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0IiwibmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nIiwibm90QXBwbGljYWJsZUNvbnRleHRzIiwib0FwcGxpY2FibGVDb250ZXh0RGlhbG9nIiwib25DbG9zZSIsImNsb3NlIiwib25Db250aW51ZSIsImFwcGxpY2FibGVDb250ZXh0cyIsImZuT3BlbkFuZEZpbGxEaWFsb2ciLCJvRGlhbG9nQ29udGVudCIsIm5Ob3RBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGVJdGVtcyIsIm9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCIsIkpTT05Nb2RlbCIsIm9Ub3RhbHMiLCJ0b3RhbCIsImxhYmVsIiwic2V0TW9kZWwiLCJvcGVuIiwic0ZyYWdtZW50TmFtZSIsIm9EaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwic0Nhbm9uaWNhbFBhdGgiLCJnZXRDYW5vbmljYWxQYXRoIiwic3Vic3RyIiwiaW5kZXhPZiIsIlByb21pc2UiLCJyZXNvbHZlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlUeXBlIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJtZXRhTW9kZWwiLCJ0aGVuIiwib0ZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJvUG9wb3ZlciIsImFkZERlcGVuZGVudCIsImNhdGNoIiwiTG9nIiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwiZW50aXR5U2V0Iiwib0F0dHJpYnV0ZXMiLCJhUHJvcGVydGllcyIsIk9iamVjdCIsImtleXMiLCJqIiwic1Byb3AiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJfaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlIiwic0ZpZWxkQ29udHJvbFBhdGgiLCJvQXR0cmlidXRlIiwiYkluYXBwbGljYWJsZSIsImFQYXJ0cyIsImhhc093blByb3BlcnR5Iiwidk1hcHBpbmdzIiwib01hcHBpbmdzIiwiSlNPTiIsInBhcnNlIiwic0xvY2FsUHJvcGVydHkiLCJzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsImdldFNlbGVjdE9wdGlvbiIsIm9TZWxlY3RPcHRpb24iLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwibmF2aWdhdGVPdXRib3VuZCIsInNPdXRib3VuZCIsImFOYXZQYXJhbXMiLCJvTWFuaWZlc3RFbnRyeSIsImdldE1hbmlmZXN0RW50cnkiLCJvT3V0Ym91bmQiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJvdXRib3VuZFBhcmFtcyIsInBhcmFtZXRlcnMiLCJnZXRPdXRib3VuZFBhcmFtcyIsImtleSIsIm9QYXJhbXMiLCJhVmFsdWVzIiwiYVNlbGVjdFByb3BlcnRpZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsImFkZFNlbGVjdE9wdGlvbiIsIm9PdXRib3VuZFBhcmFtcyIsIm9QYXJhbXNNYXBwaW5nIiwib01hcHBpbmciLCJ2YWx1ZSIsImZvcm1hdCIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib091dGJvdW5kcyIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib0Rpc3BsYXlPdXRib3VuZCIsIm9SZWZyZXNoU3RyYXRlZ2llcyIsImludGVudHMiLCJvRGVmYXVsdFJlZnJlc2hTdHJhdGVneSIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUVNQSw2QixXQURMQyxjQUFjLENBQUMsa0VBQUQsQyxVQU9iQyxjQUFjLEUsVUFrQ2RDLGVBQWUsRSxVQUNmQyxjQUFjLEUsVUErSmRELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFtSGRELGVBQWUsRSxVQUNmQyxjQUFj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ek4sTUFBOUYsRUFBc0c7QUFDckdWLFVBQUFBLGtCQUFrQixFQUFFRixRQURpRjtBQUVyR3VELFVBQUFBLGlCQUFpQixFQUFFK0ssa0JBRmtGO0FBR3JHN04sVUFBQUEsOEJBQThCLEVBQUVBO0FBSHFFLFNBQXRHLEVBOUJtRixDQW9DbkY7OztBQUNBLGVBQU9tSixPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBLE9BdENELE1Bc0NPO0FBQ04sY0FBTSxJQUFJakYsS0FBSiwyQkFBNkJvSixlQUE3QiwyREFBTjtBQUNBO0FBQ0QsSzs7O0lBdHdCMENVLG1CO1NBeXdCN0JuUSw2QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHtcblx0ZGVmaW5lVUk1Q2xhc3MsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsSW50ZXJuYWxCYXNlZE5hdmlnYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS44NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsSW50ZXJuYWxCYXNlZE5hdmlnYXRpb25cIilcbmNsYXNzIEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX29NZXRhTW9kZWwhOiBPRGF0YU1ldGFNb2RlbDtcblx0cHJpdmF0ZSBfb05hdmlnYXRpb25TZXJ2aWNlITogTmF2aWdhdGlvblNlcnZpY2U7XG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dGhpcy5fb01ldGFNb2RlbCA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHR0aGlzLl9vTmF2aWdhdGlvblNlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldE5hdmlnYXRpb25TZXJ2aWNlKCk7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24gKFNlbWFudGljT2JqZWN0LUFjdGlvbikgd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogSWYgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgaXMgcHJvdmlkZWQsIHRoaXMgaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciB0aGUgYWRhcHRhdGlvbiBieSBhIGNvbnN1bWVyLlxuXHQgKiBUaGlzIHRha2VzIGNhcmUgb2YgcmVtb3ZpbmcgYW55IHRlY2huaWNhbCBwYXJhbWV0ZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGFuIGV4cGxhY2Ugb3IgaW5wbGFjZSBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlIHBsYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb24gIEFjdGlvbiBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnNdIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBleHRlcm5hbCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5hdmlnYXRpb25Db250ZXh0c10gVXNlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudDpcblx0ICogICAgYSBzaW5nbGUgaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fVxuXHQgKiAgICBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fVxuXHQgKiAgICBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0c1xuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgY29udGV4dCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbWV0YVBhdGggYW5kIHRvIHJlbW92ZSBhbnkgc2Vuc2l0aXZlIGRhdGFcblx0ICpcdFx0ICBJZiBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHBhc3NlZCwgdGhlIGZvbGxvd2luZyBmb3JtYXQgaXggZXhwZWN0ZWQ6XG5cdCAqXHRcdCAge1xuXHQgKlx0XHRcdGRhdGE6IHtcblx0ICpcdCBcdFx0XHRQcm9kdWN0SUQ6IDc2MzQsXG5cdCAqXHRcdFx0XHROYW1lOiBcIkxhcHRvcFwiXG5cdCAqXHRcdFx0IH0sXG5cdCAqXHRcdFx0IG1ldGFQYXRoOiBcIi9TYWxlc09yZGVyTWFuYWdlXCJcblx0ICogICAgICAgIH1cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nXSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNlbWFudGljT2JqZWN0TWFwcGluZyBvciBTZW1hbnRpY09iamVjdE1hcHBpbmcgdGhhdCBhcHBsaWVzIHRvIHRoaXMgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5kZWZhdWx0UmVmcmVzaFN0cmF0ZWd5XSBEZWZhdWx0IHJlZnJlc2ggc3RyYXRlZ3kgdG8gYmUgdXNlZCBpbiBjYXNlIG5vIHJlZnJlc2ggc3RyYXRlZ3kgaXMgc3BlY2lmaWVkIGZvciB0aGUgaW50ZW50IGluIHRoZSB2aWV3LlxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWZyZXNoU3RyYXRlZ2llc11cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXSBBZGRpdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVycyBjb25maWd1cmVkIGluIHRoZSBjcm9zc0FwcE5hdmlnYXRpb24gb3V0Ym91bmQgcGFyYW1ldGVycy5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZShcblx0XHRzU2VtYW50aWNPYmplY3Q6IHN0cmluZyxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzPzogb2JqZWN0IHwgYW55W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogc3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGRlZmF1bHRSZWZyZXNoU3RyYXRlZ3k/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0cmVmcmVzaFN0cmF0ZWdpZXM/OiBhbnk7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZFxuXHQpIHtcblx0XHRjb25zdCBfZG9OYXZpZ2F0ZSA9IChvQ29udGV4dD86IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgdk5hdmlnYXRpb25Db250ZXh0cyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzLFxuXHRcdFx0XHRhTmF2aWdhdGlvbkNvbnRleHRzID1cblx0XHRcdFx0XHR2TmF2aWdhdGlvbkNvbnRleHRzICYmICFBcnJheS5pc0FycmF5KHZOYXZpZ2F0aW9uQ29udGV4dHMpID8gW3ZOYXZpZ2F0aW9uQ29udGV4dHNdIDogdk5hdmlnYXRpb25Db250ZXh0cyxcblx0XHRcdFx0dlNlbWFudGljT2JqZWN0TWFwcGluZyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHR2T3V0Ym91bmRQYXJhbXMgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0b1RhcmdldEluZm86IGFueSA9IHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogc0FjdGlvblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1ZpZXcuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1NlbWFudGljT2JqZWN0ICYmIHNBY3Rpb24pIHtcblx0XHRcdFx0bGV0IGFTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueVtdID0gW10sXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQ6IGFueSA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdFx0XHRcdC8vIDEuIGdldCBTZW1hbnRpY0F0dHJpYnV0ZXMgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uQ29udGV4dHMgJiYgYU5hdmlnYXRpb25Db250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvbkNvbnRleHRzLmZvckVhY2goKG9OYXZpZ2F0aW9uQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyAxLjEuYSBpZiBuYXZpZ2F0aW9uIGNvbnRleHQgaXMgaW5zdGFuY2Ugb2Ygc2FwLnVpLm1vZGUub2RhdGEudjQuQ29udGV4dFxuXHRcdFx0XHRcdFx0Ly8gZWxzZSBjaGVjayBpZiBuYXZpZ2F0aW9uIGNvbnRleHQgaXMgb2YgdHlwZSBvYmplY3Rcblx0XHRcdFx0XHRcdGlmIChvTmF2aWdhdGlvbkNvbnRleHQuaXNBICYmIG9OYXZpZ2F0aW9uQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0XHRcdFx0XHQvLyAxLjEuYiByZW1vdmUgc2Vuc2l0aXZlIGRhdGFcblx0XHRcdFx0XHRcdFx0bGV0IG9TZW1hbnRpY0F0dHJpYnV0ZXMgPSBvTmF2aWdhdGlvbkNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IHRoaXMuX29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob05hdmlnYXRpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGFsc28gcmVtb3ZlIHNlbnNpdGl2ZSBkYXRhIGZyb20gIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNBdHRyaWJ1dGVzID0gdGhpcy5yZW1vdmVTZW5zaXRpdmVEYXRhKG9TZW1hbnRpY0F0dHJpYnV0ZXMsIHNNZXRhUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OYXZDb250ZXh0ID0gdGhpcy5wcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvbihvU2VtYW50aWNBdHRyaWJ1dGVzLCBvTmF2aWdhdGlvbkNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0SW5mb1tcInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3RcIl0gPSBvTmF2Q29udGV4dC5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0O1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNBdHRyaWJ1dGVzLnB1c2gob05hdkNvbnRleHQuc2VtYW50aWNBdHRyaWJ1dGVzKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdCEob05hdmlnYXRpb25Db250ZXh0ICYmIEFycmF5LmlzQXJyYXkob05hdmlnYXRpb25Db250ZXh0LmRhdGEpKSAmJlxuXHRcdFx0XHRcdFx0XHR0eXBlb2Ygb05hdmlnYXRpb25Db250ZXh0ID09PSBcIm9iamVjdFwiXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gMS4xLmIgcmVtb3ZlIHNlbnNpdGl2ZSBkYXRhIGZyb20gb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGFTZW1hbnRpY0F0dHJpYnV0ZXMucHVzaCh0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob05hdmlnYXRpb25Db250ZXh0LmRhdGEsIG9OYXZpZ2F0aW9uQ29udGV4dC5tZXRhUGF0aCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvTmF2aWdhdGlvbkNvbnRleHQgJiYgQXJyYXkuaXNBcnJheShvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gb05hdmlnYXRpb25Db250ZXh0LmRhdGEgY2FuIGJlIGFycmF5IGFscmVhZHkgZXggOiBbe0N1c3RvbWVyOiBcIjEwMDAxXCJ9LCB7Q3VzdG9tZXI6IFwiMTAwOTFcIn1dXG5cdFx0XHRcdFx0XHRcdC8vIGhlbmNlIGFzc2lnbmluZyBpdCB0byB0aGUgYVNlbWFudGljQXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNBdHRyaWJ1dGVzID0gdGhpcy5yZW1vdmVTZW5zaXRpdmVEYXRhKG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhLCBvTmF2aWdhdGlvbkNvbnRleHQubWV0YVBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIDIuMSBNZXJnZSBiYXNlIHNlbGVjdGlvbiB2YXJpYW50IGFuZCBzYW5pdGl6ZWQgc2VtYW50aWMgYXR0cmlidXRlcyBpbnRvIG9uZSBTZWxlY3Rpb25WYXJpYW50XG5cdFx0XHRcdGlmIChhU2VtYW50aWNBdHRyaWJ1dGVzICYmIGFTZW1hbnRpY0F0dHJpYnV0ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSB0aGlzLl9vTmF2aWdhdGlvblNlcnZpY2UubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0XHRcdFx0XHRhU2VtYW50aWNBdHRyaWJ1dGVzLFxuXHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gMy4gQWRkIGZpbHRlckNvbnRleHRVcmwgdG8gU1Ygc28gdGhlIE5hdmlnYXRpb25IYW5kbGVyIGNhbiByZW1vdmUgYW55IHNlbnNpdGl2ZSBkYXRhIGJhc2VkIG9uIHZpZXcgZW50aXR5U2V0XG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0c0VudGl0eVNldCA9IHRoaXMuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRcdFx0c0NvbnRleHRVcmwgPSBzRW50aXR5U2V0ID8gdGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLmNvbnN0cnVjdENvbnRleHRVcmwoc0VudGl0eVNldCwgb01vZGVsKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHNDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuc2V0RmlsdGVyQ29udGV4dFVybChzQ29udGV4dFVybCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBPdXRib3VuZCBQYXJhbWV0ZXJzIHRvIHRoZSBTVlxuXHRcdFx0XHRpZiAodk91dGJvdW5kUGFyYW1zKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlPdXRib3VuZFBhcmFtcyhvU2VsZWN0aW9uVmFyaWFudCwgdk91dGJvdW5kUGFyYW1zKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDQuIGdpdmUgYW4gb3Bwb3J0dW5pdHkgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBpbmZsdWVuY2UgdGhlIFNlbGVjdGlvblZhcmlhbnRcblx0XHRcdFx0b0NvbnRyb2xsZXIuaW50ZW50QmFzZWROYXZpZ2F0aW9uLmFkYXB0TmF2aWdhdGlvbkNvbnRleHQob1NlbGVjdGlvblZhcmlhbnQsIG9UYXJnZXRJbmZvKTtcblxuXHRcdFx0XHQvLyA1LiBBcHBseSBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ3MgdG8gdGhlIFNWXG5cdFx0XHRcdGlmICh2U2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50LCB2U2VtYW50aWNPYmplY3RNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDYuIHJlbW92ZSB0ZWNobmljYWwgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvbiBWYXJpYW50XG5cdFx0XHRcdHRoaXMuX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1NlbGVjdGlvblZhcmlhbnQpO1xuXG5cdFx0XHRcdC8vIDcuIGNoZWNrIGlmIHByb2dyYW1taW5nIG1vZGVsIGlzIHN0aWNreSBhbmQgcGFnZSBpcyBlZGl0YWJsZVxuXHRcdFx0XHRjb25zdCBzTmF2TW9kZSA9IG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0TmF2aWdhdGlvbk1vZGUoKTtcblxuXHRcdFx0XHQvLyA4LiBVcGRhdGluZyByZWZyZXNoIHN0cmF0ZWd5IGluIGludGVybmFsIG1vZGVsXG5cdFx0XHRcdGNvbnN0IG1SZWZyZXNoU3RyYXRlZ2llcyA9IChtTmF2aWdhdGlvblBhcmFtZXRlcnMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlZnJlc2hTdHJhdGVnaWVzKSB8fCB7fSxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbCA9IG9WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0XHRpZiAob0ludGVybmFsTW9kZWwpIHtcblx0XHRcdFx0XHRpZiAoKG9WaWV3ICYmIChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkpLnJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbVZpZXdSZWZyZXNoU3RyYXRlZ2llcyA9IChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkucmVmcmVzaFN0cmF0ZWd5T25BcHBSZXN0b3JlIHx8IHt9O1xuXHRcdFx0XHRcdFx0bWVyZ2VPYmplY3RzKG1SZWZyZXNoU3RyYXRlZ2llcywgbVZpZXdSZWZyZXNoU3RyYXRlZ2llcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG1SZWZyZXNoU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0UmVmcmVzaFN0cmF0ZWd5Rm9ySW50ZW50KG1SZWZyZXNoU3RyYXRlZ2llcywgc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uKTtcblx0XHRcdFx0XHRpZiAobVJlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcmVmcmVzaFN0cmF0ZWd5T25BcHBSZXN0b3JlXCIsIG1SZWZyZXNoU3RyYXRlZ3kpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDkuIE5hdmlnYXRlIHZpYSBOYXZpZ2F0aW9uSGFuZGxlclxuXHRcdFx0XHRjb25zdCBvbkVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC9tL01lc3NhZ2VCb3hcIl0sIGZ1bmN0aW9uIChNZXNzYWdlQm94OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fSEVMUEVSX05BVklHQVRJT05fRVJST1JfTUVTU0FHRVwiKSwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZS5uYXZpZ2F0ZShcblx0XHRcdFx0XHRzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0b25FcnJvcixcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c05hdk1vZGVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNlbWFudGljIE9iamVjdC9hY3Rpb24gaXMgbm90IHByb3ZpZGVkXCIpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQmluZGluZ0NvbnRleHQgJiYgKG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRpZiAoXG5cdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiICYmXG5cdFx0XHRvTWV0YU1vZGVsICYmXG5cdFx0XHQhTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9NZXRhTW9kZWwpXG5cdFx0KSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0X2RvTmF2aWdhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0X2RvTmF2aWdhdGUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJlcGFyZSBhdHRyaWJ1dGVzIHRvIGJlIHBhc3NlZCB0byBleHRlcm5hbCBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NlbWFudGljQXR0cmlidXRlcyBDb250ZXh0IGRhdGEgYWZ0ZXIgcmVtb3ZpbmcgYWxsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIG9Db250ZXh0IEFjdHVhbCBjb250ZXh0IGZyb20gd2hpY2ggdGhlIHNlbWFudGljQXR0cmlidXRlcyB3ZXJlIGRlcml2ZWQuXG5cdCAqIEByZXR1cm5zIE9iamVjdCBvZiBwcmVwYXJlZCBhdHRyaWJ1dGVzIGZvciBleHRlcm5hbCBuYXZpZ2F0aW9uIGFuZCBubyBjb25mbGljdCBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHQvLyAxLiBGaW5kIGFsbCBkaXN0aW5jdCBrZXlzIGluIHRoZSBvYmplY3QgU2VtYW50aWNBdHRyaWJ1dGVzXG5cdFx0Ly8gU3RvcmUgbWV0YSBwYXRoIGZvciBlYWNoIG9jY3VyZW5jZSBvZiB0aGUga2V5XG5cdFx0Y29uc3Qgb0Rpc3RpbmN0S2V5czogYW55ID0ge30sXG5cdFx0XHRzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc0NvbnRleHRQYXRoKSxcblx0XHRcdGFNZXRhUGF0aFBhcnRzID0gc01ldGFQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRmdW5jdGlvbiBfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KExvb2tVcE9iamVjdDogYW55LCBzTG9va1VwT2JqZWN0TWV0YVBhdGg6IGFueSkge1xuXHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIExvb2tVcE9iamVjdCkge1xuXHRcdFx0XHQvLyBudWxsIGNhc2U/P1xuXHRcdFx0XHRpZiAoTG9va1VwT2JqZWN0W3NLZXldID09PSBudWxsIHx8IHR5cGVvZiBMb29rVXBPYmplY3Rbc0tleV0gIT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdEtleXNbc0tleV0pIHtcblx0XHRcdFx0XHRcdC8vIGlmIGtleSBpcyBmb3VuZCBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlbiBjcmVhdGUgYXJyYXlcblx0XHRcdFx0XHRcdG9EaXN0aW5jdEtleXNbc0tleV0gPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gcHVzaCBwYXRoIHRvIGFycmF5XG5cdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XS5wdXNoKHNMb29rVXBPYmplY3RNZXRhUGF0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgYSBuZXN0ZWQgb2JqZWN0IGlzIGZvdW5kXG5cdFx0XHRcdFx0Y29uc3Qgb05ld0xvb2tVcE9iamVjdCA9IExvb2tVcE9iamVjdFtzS2V5XTtcblx0XHRcdFx0XHRfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KG9OZXdMb29rVXBPYmplY3QsIGAke3NMb29rVXBPYmplY3RNZXRhUGF0aH0vJHtzS2V5fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0X2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdChvU2VtYW50aWNBdHRyaWJ1dGVzLCBzTWV0YVBhdGgpO1xuXG5cdFx0Ly8gMi4gRGV0ZXJtaW5lIGRpc3RpbmN0IGtleSB2YWx1ZSBhbmQgYWRkIGNvbmZsaWN0ZWQgcGF0aHMgdG8gc2VtYW50aWMgYXR0cmlidXRlc1xuXHRcdGNvbnN0IHNNYWluRW50aXR5U2V0TmFtZSA9IGFNZXRhUGF0aFBhcnRzWzBdLFxuXHRcdFx0c01haW5FbnRpdHlUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzTWFpbkVudGl0eVNldE5hbWV9L0BzYXB1aS5uYW1lYCksXG5cdFx0XHRvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdDogYW55ID0ge307XG5cdFx0bGV0IHNNYWluRW50aXR5VmFsdWVQYXRoLCBzQ3VycmVudFZhbHVlUGF0aCwgc0xhc3RWYWx1ZVBhdGg7XG5cdFx0Zm9yIChjb25zdCBzRGlzdGluY3RLZXkgaW4gb0Rpc3RpbmN0S2V5cykge1xuXHRcdFx0Y29uc3QgYUNvbmZsaWN0aW5nUGF0aHMgPSBvRGlzdGluY3RLZXlzW3NEaXN0aW5jdEtleV07XG5cdFx0XHRsZXQgc1dpbm5lclZhbHVlUGF0aDtcblx0XHRcdC8vIEZpbmQgd2lubmVyIHZhbHVlIGZvciBlYWNoIGRpc3RpbmN0IGtleSBpbiBjYXNlIG9mIGNvbmZsaWN0IGJ5IHRoZSBmb2xsb3dpbmcgcnVsZTpcblxuXHRcdFx0Ly8gLT4gQS4gaWYgYW55IG1ldGEgcGF0aCBmb3IgYSBkaXN0aW5jdCBrZXkgaXMgdGhlIHNhbWUgYXMgbWFpbiBlbnRpdHkgdGFrZSB0aGF0IGFzIHRoZSB2YWx1ZVxuXHRcdFx0Ly8gLT4gQi4gaWYgQSBpcyBub3QgbWV0IGtlZXAgdGhlIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCAoc01ldGFQYXRoID09PSBwYXRoIG9mIGRpc3RpbmNlIGtleSlcblx0XHRcdC8vIC0+IEMuIGlmIEEsIEIgb3IgQyBhcmUgbm90IG1ldCB0YWtlIHRoZSBsYXN0IHBhdGggZm9yIHZhbHVlXG5cdFx0XHRpZiAoYUNvbmZsaWN0aW5nUGF0aHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHQvLyBjb25mbGljdFxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8PSBhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBzUGF0aCA9IGFDb25mbGljdGluZ1BhdGhzW2ldO1xuXHRcdFx0XHRcdGxldCBzUGF0aEluQ29udGV4dCA9IHNQYXRoLnJlcGxhY2Uoc1BhdGggPT09IHNNZXRhUGF0aCA/IHNNZXRhUGF0aCA6IGAke3NNZXRhUGF0aH0vYCwgXCJcIik7XG5cdFx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSAoc1BhdGhJbkNvbnRleHQgPT09IFwiXCIgPyBzUGF0aEluQ29udGV4dCA6IGAke3NQYXRoSW5Db250ZXh0fS9gKSArIHNEaXN0aW5jdEtleTtcblx0XHRcdFx0XHRjb25zdCBzRW50aXR5VHlwZU5hbWUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH0vQHNhcHVpLm5hbWVgKTtcblx0XHRcdFx0XHQvLyBydWxlIEFcblxuXHRcdFx0XHRcdC8vIHJ1bGUgQVxuXHRcdFx0XHRcdGlmIChzRW50aXR5VHlwZU5hbWUgPT09IHNNYWluRW50aXR5VHlwZU5hbWUpIHtcblx0XHRcdFx0XHRcdHNNYWluRW50aXR5VmFsdWVQYXRoID0gc1BhdGhJbkNvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcnVsZSBCXG5cdFx0XHRcdFx0aWYgKHNQYXRoID09PSBzTWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdHNDdXJyZW50VmFsdWVQYXRoID0gc1BhdGhJbkNvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcnVsZSBDXG5cdFx0XHRcdFx0c0xhc3RWYWx1ZVBhdGggPSBzUGF0aEluQ29udGV4dDtcblxuXHRcdFx0XHRcdC8vIGFkZCBjb25mbGljdGVkIHBhdGggdG8gc2VtYW50aWMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHBhdGggcG9pbnRzIHRvIG1haW4gZW50aXR5IGFuZCBwcmVmaXggYXR0cmlidXRlIG5hbWVzIGFjY29yZGluZ2x5XG5cdFx0XHRcdFx0b1NlbWFudGljQXR0cmlidXRlc1tcblx0XHRcdFx0XHRcdGAke3NNZXRhUGF0aH0vJHtzUGF0aEluQ29udGV4dH1gXG5cdFx0XHRcdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc1ZhbHVlICE9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiLlwiKVxuXHRcdFx0XHRcdF0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aEluQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQSB8fCBCIHx8IENcblx0XHRcdFx0c1dpbm5lclZhbHVlUGF0aCA9IHNNYWluRW50aXR5VmFsdWVQYXRoIHx8IHNDdXJyZW50VmFsdWVQYXRoIHx8IHNMYXN0VmFsdWVQYXRoO1xuXHRcdFx0XHRvU2VtYW50aWNBdHRyaWJ1dGVzW3NEaXN0aW5jdEtleV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShzV2lubmVyVmFsdWVQYXRoKTtcblx0XHRcdFx0c01haW5FbnRpdHlWYWx1ZVBhdGggPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHNDdXJyZW50VmFsdWVQYXRoID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRzTGFzdFZhbHVlUGF0aCA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG5vIGNvbmZsaWN0LCBhZGQgZGlzdGluY3Qga2V5IHdpdGhvdXQgYWRkaW5nIHBhdGhzXG5cdFx0XHRcdGNvbnN0IHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbMF07IC8vIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgYW5kIGhlbmNlIG5vIGNvbmZsaWN0XG5cdFx0XHRcdGxldCBzUGF0aEluQ29udGV4dCA9IHNQYXRoLnJlcGxhY2Uoc1BhdGggPT09IHNNZXRhUGF0aCA/IHNNZXRhUGF0aCA6IGAke3NNZXRhUGF0aH0vYCwgXCJcIik7XG5cdFx0XHRcdHNQYXRoSW5Db250ZXh0ID0gKHNQYXRoSW5Db250ZXh0ID09PSBcIlwiID8gc1BhdGhJbkNvbnRleHQgOiBgJHtzUGF0aEluQ29udGV4dH0vYCkgKyBzRGlzdGluY3RLZXk7XG5cdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbc0Rpc3RpbmN0S2V5XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNQYXRoSW5Db250ZXh0KTtcblx0XHRcdFx0b1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rbc0Rpc3RpbmN0S2V5XSA9IGAke3NNZXRhUGF0aH0vJHtzUGF0aEluQ29udGV4dH1gXG5cdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKHNWYWx1ZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc1ZhbHVlICE9IFwiXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbihcIi5cIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIDMuIFJlbW92ZSBhbGwgTmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Zm9yIChjb25zdCBzUHJvcGVydHkgaW4gb1NlbWFudGljQXR0cmlidXRlcykge1xuXHRcdFx0aWYgKG9TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5XSAhPT0gbnVsbCAmJiB0eXBlb2Ygb1NlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHldID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGRlbGV0ZSBvU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRzZW1hbnRpY0F0dHJpYnV0ZXM6IG9TZW1hbnRpY0F0dHJpYnV0ZXMsXG5cdFx0XHRwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0OiBvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdFxuXHRcdH07XG5cdH1cblx0LyoqXG5cdCAqIFByZXBhcmUgZmlsdGVyIGNvbmRpdGlvbnMgdG8gYmUgcGFzc2VkIHRvIGV4dGVybmFsIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmlsdGVyQmFyQ29uZGl0aW9ucyBGaWx0ZXIgY29uZGl0aW9ucy5cblx0ICogQHBhcmFtIHNSb290UGF0aCBSb290IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gYVBhcmFtZXRlcnMgTmFtZXMgb2YgcGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkLlxuXHQgKiBAcmV0dXJucyBPYmplY3Qgb2YgcHJlcGFyZWQgZmlsdGVyIGNvbmRpdGlvbnMgZm9yIGV4dGVybmFsIG5hdmlnYXRpb24gYW5kIG5vIGNvbmZsaWN0IGZpbHRlcnMuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJlcGFyZUZpbHRlcnNGb3JFeHRlcm5hbE5hdmlnYXRpb24ob0ZpbHRlckJhckNvbmRpdGlvbnM6IGFueSwgc1Jvb3RQYXRoOiBzdHJpbmcsIGFQYXJhbWV0ZXJzPzogYW55W10pIHtcblx0XHRsZXQgc1BhdGg7XG5cdFx0Y29uc3Qgb0Rpc3RpbmN0S2V5czogYW55ID0ge307XG5cdFx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Q6IGFueSA9IHt9O1xuXHRcdGxldCBzTWFpbkVudGl0eVZhbHVlUGF0aCwgc0N1cnJlbnRWYWx1ZVBhdGgsIHNGdWxsQ29udGV4dFBhdGgsIHNXaW5uZXJWYWx1ZVBhdGgsIHNQYXRoSW5Db250ZXh0O1xuXG5cdFx0ZnVuY3Rpb24gX2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdChMb29rVXBPYmplY3Q6IGFueSkge1xuXHRcdFx0bGV0IHNMb29rVXBPYmplY3RNZXRhUGF0aDtcblx0XHRcdGZvciAobGV0IHNLZXkgaW4gTG9va1VwT2JqZWN0KSB7XG5cdFx0XHRcdGlmIChMb29rVXBPYmplY3Rbc0tleV0pIHtcblx0XHRcdFx0XHRpZiAoc0tleS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0XHRcdHNMb29rVXBPYmplY3RNZXRhUGF0aCA9IHNLZXk7IC8vIFwiL1NhbGVzT3JkZXJtYW5hZ2UvX0l0ZW0vTWF0ZXJpYWxcIlxuXHRcdFx0XHRcdFx0Y29uc3QgYVBhdGhQYXJ0cyA9IHNLZXkuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRcdFx0c0tleSA9IGFQYXRoUGFydHNbYVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0xvb2tVcE9iamVjdE1ldGFQYXRoID0gc1Jvb3RQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdEtleXNbc0tleV0pIHtcblx0XHRcdFx0XHRcdC8vIGlmIGtleSBpcyBmb3VuZCBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlbiBjcmVhdGUgYXJyYXlcblx0XHRcdFx0XHRcdG9EaXN0aW5jdEtleXNbc0tleV0gPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBwdXNoIHBhdGggdG8gYXJyYXlcblx0XHRcdFx0XHRvRGlzdGluY3RLZXlzW3NLZXldLnB1c2goc0xvb2tVcE9iamVjdE1ldGFQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob0ZpbHRlckJhckNvbmRpdGlvbnMpO1xuXHRcdGZvciAoY29uc3Qgc0Rpc3RpbmN0S2V5IGluIG9EaXN0aW5jdEtleXMpIHtcblx0XHRcdGNvbnN0IGFDb25mbGljdGluZ1BhdGhzID0gb0Rpc3RpbmN0S2V5c1tzRGlzdGluY3RLZXldO1xuXG5cdFx0XHRpZiAoYUNvbmZsaWN0aW5nUGF0aHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHQvLyBjb25mbGljdFxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8PSBhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRzUGF0aCA9IGFDb25mbGljdGluZ1BhdGhzW2ldO1xuXHRcdFx0XHRcdGlmIChzUGF0aCA9PT0gc1Jvb3RQYXRoKSB7XG5cdFx0XHRcdFx0XHRzRnVsbENvbnRleHRQYXRoID0gYCR7c1Jvb3RQYXRofS8ke3NEaXN0aW5jdEtleX1gO1xuXHRcdFx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSBzRGlzdGluY3RLZXk7XG5cdFx0XHRcdFx0XHRzTWFpbkVudGl0eVZhbHVlUGF0aCA9IHNEaXN0aW5jdEtleTtcblx0XHRcdFx0XHRcdGlmIChhUGFyYW1ldGVycyAmJiBhUGFyYW1ldGVycy5pbmNsdWRlcyhzRGlzdGluY3RLZXkpKSB7XG5cdFx0XHRcdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW2AkUGFyYW1ldGVyLiR7c0Rpc3RpbmN0S2V5fWBdID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc0Rpc3RpbmN0S2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSBzUGF0aDtcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPSAoYCR7c1Jvb3RQYXRofS8ke3NQYXRofWAgYXMgYW55KS5yZXBsYWNlQWxsKC9cXCovZywgXCJcIik7XG5cdFx0XHRcdFx0XHRzQ3VycmVudFZhbHVlUGF0aCA9IHNQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvRmlsdGVyQmFyQ29uZGl0aW9uc1tcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChzVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCIuXCIpXG5cdFx0XHRcdFx0XSA9IG9GaWx0ZXJCYXJDb25kaXRpb25zW3NQYXRoSW5Db250ZXh0XTtcblx0XHRcdFx0XHRkZWxldGUgb0ZpbHRlckJhckNvbmRpdGlvbnNbc1BhdGhdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c1dpbm5lclZhbHVlUGF0aCA9IHNNYWluRW50aXR5VmFsdWVQYXRoIHx8IHNDdXJyZW50VmFsdWVQYXRoO1xuXHRcdFx0XHRvRmlsdGVyQmFyQ29uZGl0aW9uc1tzRGlzdGluY3RLZXldID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc1dpbm5lclZhbHVlUGF0aF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBubyBjb25mbGljdCwgYWRkIGRpc3RpbmN0IGtleSB3aXRob3V0IGFkZGluZyBwYXRoc1xuXHRcdFx0XHRzUGF0aCA9IGFDb25mbGljdGluZ1BhdGhzWzBdO1xuXHRcdFx0XHRzRnVsbENvbnRleHRQYXRoID1cblx0XHRcdFx0XHRzUGF0aCA9PT0gc1Jvb3RQYXRoID8gYCR7c1Jvb3RQYXRofS8ke3NEaXN0aW5jdEtleX1gIDogKGAke3NSb290UGF0aH0vJHtzUGF0aH1gIGFzIGFueSkucmVwbGFjZUFsbChcIipcIiwgXCJcIik7XG5cdFx0XHRcdG9GaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0W3NEaXN0aW5jdEtleV0gPSBzRnVsbENvbnRleHRQYXRoXG5cdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc1ZhbHVlICE9IFwiXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbihcIi5cIik7XG5cdFx0XHRcdGlmIChhUGFyYW1ldGVycyAmJiBhUGFyYW1ldGVycy5pbmNsdWRlcyhzRGlzdGluY3RLZXkpKSB7XG5cdFx0XHRcdFx0b0ZpbHRlckJhckNvbmRpdGlvbnNbYCRQYXJhbWV0ZXIuJHtzRGlzdGluY3RLZXl9YF0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzRGlzdGluY3RLZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbHRlckNvbmRpdGlvbnM6IG9GaWx0ZXJCYXJDb25kaXRpb25zLFxuXHRcdFx0ZmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdDogb0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Rcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBOYXZpZ2F0aW9uIG1vZGUuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIG1vZGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRnZXROYXZpZ2F0aW9uTW9kZSgpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8qKlxuXHQgKiBBbGxvd3MgZm9yIG5hdmlnYXRpb24gdG8gYSBnaXZlbiBpbnRlbnQgKFNlbWFudGljT2JqZWN0LUFjdGlvbikgd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dCwgdXNpbmcgYSBkaWFsb2cgdGhhdCBzaG93cyB0aGUgY29udGV4dHMgd2hpY2ggY2Fubm90IGJlIHBhc3NlZFxuXHQgKiBJZiBzZW1hbnRpYyBvYmplY3QgbWFwcGluZyBpcyBwcm92aWRlZCwgdGhpcyBzZXR0aW5nIGlzIGFsc28gYXBwbGllZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYWZ0ZXIgYWRhcHRhdGlvbiBieSBhIGNvbnN1bWVyLlxuXHQgKiBUaGlzIHNldHRpbmcgYWxzbyByZW1vdmVzIGFueSB0ZWNobmljYWwgcGFyYW1ldGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBhbiBpbnBsYWNlIG9yIGV4cGxhY2UgbmF2aWdhdGlvbiBzaG91bGQgdGFrZSBwbGFjZS5cblx0ICpcblx0ICogQHBhcmFtIHNTZW1hbnRpY09iamVjdCBTZW1hbnRpYyBvYmplY3QgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSBzQWN0aW9uICBBY3Rpb24gZm9yIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzXSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgZXh0ZXJuYWwgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5sYWJlbF1cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzXSBTaW5nbGUgaW5zdGFuY2Ugb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0sIG9yIGFsdGVybmF0aXZlbHkgYW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50LlxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHNdIFNpbmdsZSBpbnN0YW5jZSBvciBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSwgb3IgYWx0ZXJuYXRpdmVseSBhbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnQgYW5kIGZvciB3aGljaCB0aGUgSUJOIGJ1dHRvbiBpcyBlbmFibGVkXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0c10gU2luZ2xlIGluc3RhbmNlIG9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9LCBvciBhbHRlcm5hdGl2ZWx5IGFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzLCB3aGljaCBjYW5ub3QgYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnQuXG5cdCAqXHRcdCAgaWYgYW4gYXJyYXkgb2YgY29udGV4dHMgaXMgcGFzc2VkIHRoZSBjb250ZXh0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtZXRhIHBhdGggYW5kIGFjY29yZGluZ2x5IHJlbW92ZSB0aGUgc2Vuc2l0aXZlIGRhdGFcblx0ICpcdFx0ICBJZiBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHBhc3NlZCwgdGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgZXhwZWN0ZWQ6XG5cdCAqXHRcdCAge1xuXHQgKlx0XHRcdGRhdGE6IHtcblx0ICpcdCBcdFx0XHRQcm9kdWN0SUQ6IDc2MzQsXG5cdCAqXHRcdFx0XHROYW1lOiBcIkxhcHRvcFwiXG5cdCAqXHRcdFx0IH0sXG5cdCAqXHRcdFx0IG1ldGFQYXRoOiBcIi9TYWxlc09yZGVyTWFuYWdlXCJcblx0ICogICAgICAgIH1cblx0ICpcdFx0VGhlIG1ldGFQYXRoIGlzIHVzZWQgdG8gcmVtb3ZlIGFueSBzZW5zaXRpdmUgZGF0YS5cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nXSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgU2VtYW50aWNPYmplY3RNYXBwaW5nIG9yIFNlbWFudGljT2JqZWN0TWFwcGluZyB0aGF0IGFwcGxpZXMgdG8gdGhpcyBuYXZpZ2F0aW9uXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb246IHN0cmluZyxcblx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBvYmplY3QgfCBhbnlbXTtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IG9iamVjdCB8IGFueVtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogYW55O1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc/OiBzdHJpbmcgfCBvYmplY3Q7XG5cdFx0fVxuXHQpIHtcblx0XHRpZiAobU5hdmlnYXRpb25QYXJhbWV0ZXJzPy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cz8ubGVuZ3RoID49IDEpIHtcblx0XHRcdGxldCBvQXBwbGljYWJsZUNvbnRleHREaWFsb2c6IERpYWxvZztcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvbkNvbnRpbnVlOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gVXNlcnMgY29udGludWVzIHRoZSBhY3Rpb24gd2l0aCB0aGUgYm91bmQgY29udGV4dHNcblx0XHRcdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cztcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGxldCBvRGlhbG9nQ29udGVudDtcblx0XHRcdFx0Y29uc3Qgbk5vdEFwcGxpY2FibGUgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zID0gW107XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0c1tpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoYU5vdEFwcGxpY2FibGVJdGVtcyk7XG5cdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsIH0pO1xuXHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob05vdEFwcGxpY2FibGVJdGVtc01vZGVsLCBcIm5vdEFwcGxpY2FibGVcIik7XG5cdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvVG90YWxzLCBcInRvdGFsc1wiKTtcblx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLm9wZW4oKTtcblx0XHRcdH07XG5cdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuQWN0aW9uUGFydGlhbFwiO1xuXHRcdFx0Y29uc3Qgb0RpYWxvZ0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0c1swXS5nZXRDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gYCR7c0Nhbm9uaWNhbFBhdGguc3Vic3RyKDAsIHNDYW5vbmljYWxQYXRoLmluZGV4T2YoXCIoXCIpKX0vYDtcblx0XHRcdFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0RpYWxvZ0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXQpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCwgY29udHJvbGxlcjogb0NvbnRyb2xsZXIgfSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvUG9wb3ZlcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nID0gb1BvcG92ZXI7XG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KG9Qb3BvdmVyKTtcblx0XHRcdFx0XHRmbk9wZW5BbmRGaWxsRGlhbG9nKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3JcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblx0X3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1NlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5jb250ZXh0XCIpO1xuXHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIik7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiU0FQX19NZXNzYWdlc1wiKTtcblx0fVxuXHQvKipcblx0ICogR2V0IHRhcmdldGVkIEVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIEVudGl0eSBzZXQgbmFtZVxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRnZXRFbnRpdHlTZXQoKSB7XG5cdFx0cmV0dXJuICh0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHR9XG5cdC8qKlxuXHQgKiBSZW1vdmVzIHNlbnNpdGl2ZSBkYXRhIGZyb20gdGhlIHNlbWFudGljIGF0dHJpYnV0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGVudGl0eVNldC5cblx0ICpcblx0ICogQHBhcmFtIG9BdHRyaWJ1dGVzIENvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIE1ldGEgcGF0aCB0byByZWFjaCB0aGUgZW50aXR5U2V0IGluIHRoZSBNZXRhTW9kZWxcblx0ICogQHJldHVybnMgQXJyYXkgb2Ygc2VtYW50aWMgQXR0cmlidXRlc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Ly8gVE8tRE8gYWRkIHVuaXQgdGVzdHMgZm9yIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHF1bml0LlxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmVtb3ZlU2Vuc2l0aXZlRGF0YShvQXR0cmlidXRlczogYW55LCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChvQXR0cmlidXRlcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvQXR0cmlidXRlcyk7XG5cdFx0XHRpZiAoYVByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJAb2RhdGEubWV0YWRhdGFFdGFnXCJdO1xuXHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJTQVBfX01lc3NhZ2VzXCJdO1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFQcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKG9BdHRyaWJ1dGVzW2FQcm9wZXJ0aWVzW2pdXSAmJiB0eXBlb2Ygb0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dLCBgJHtzTWV0YVBhdGh9LyR7YVByb3BlcnRpZXNbal19YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNQcm9wID0gYVByb3BlcnRpZXNbal0sXG5cdFx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9ucyA9IHRoaXMuX29NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcH1AYCk7XG5cdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eUFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIl0gfHxcblx0XHRcdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIl1cblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdICYmIG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXS5zcGxpdChcIi9cIilbMV0gPT09IFwiSW5hcHBsaWNhYmxlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSAmJlxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZShvRmllbGRDb250cm9sW1wiJFBhdGhcIl0sIG9BdHRyaWJ1dGVzKVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbc1Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQXR0cmlidXRlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBwYXRoLWJhc2VkIEZpZWxkQ29udHJvbCBldmFsdWF0ZXMgdG8gaW5hcHBsaWNhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ZpZWxkQ29udHJvbFBhdGggRmllbGQgY29udHJvbCBwYXRoXG5cdCAqIEBwYXJhbSBvQXR0cmlidXRlIFNlbWFudGljQXR0cmlidXRlc1xuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaW5hcHBsaWNhYmxlXG5cdCAqL1xuXHRfaXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlKHNGaWVsZENvbnRyb2xQYXRoOiBzdHJpbmcsIG9BdHRyaWJ1dGU6IGFueSkge1xuXHRcdGxldCBiSW5hcHBsaWNhYmxlID0gZmFsc2U7XG5cdFx0Y29uc3QgYVBhcnRzID0gc0ZpZWxkQ29udHJvbFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdC8vIHNlbnNpdGl2ZSBkYXRhIGlzIHJlbW92ZWQgb25seSBpZiB0aGUgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLlxuXHRcdGlmIChhUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YkluYXBwbGljYWJsZSA9XG5cdFx0XHRcdG9BdHRyaWJ1dGVbYVBhcnRzWzBdXSAmJiBvQXR0cmlidXRlW2FQYXJ0c1swXV0uaGFzT3duUHJvcGVydHkoYVBhcnRzWzFdKSAmJiBvQXR0cmlidXRlW2FQYXJ0c1swXV1bYVBhcnRzWzFdXSA9PT0gMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YkluYXBwbGljYWJsZSA9IG9BdHRyaWJ1dGVbc0ZpZWxkQ29udHJvbFBhdGhdID09PSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gYkluYXBwbGljYWJsZTtcblx0fVxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJlcGxhY2UgTG9jYWwgUHJvcGVydGllcyB3aXRoIFNlbWFudGljIE9iamVjdCBtYXBwaW5ncy5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvblZhcmlhbnQgY29uc2lzdGluZyBvZiBmaWx0ZXJiYXIsIFRhYmxlIGFuZCBQYWdlIENvbnRleHRcblx0ICogQHBhcmFtIHZNYXBwaW5ncyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ1xuXHQgKiBAcmV0dXJucyAtIE1vZGlmaWVkIFNlbGVjdGlvblZhcmlhbnQgd2l0aCBMb2NhbFByb3BlcnR5IHJlcGxhY2VkIHdpdGggU2VtYW50aWNPYmplY3RQcm9wZXJ0aWVzLlxuXHQgKi9cblx0X2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk1hcHBpbmdzOiBvYmplY3QgfCBzdHJpbmcpIHtcblx0XHRjb25zdCBvTWFwcGluZ3MgPSB0eXBlb2Ygdk1hcHBpbmdzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2TWFwcGluZ3MpIDogdk1hcHBpbmdzO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb01hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzTG9jYWxQcm9wZXJ0eSA9XG5cdFx0XHRcdChvTWFwcGluZ3NbaV1bXCJMb2NhbFByb3BlcnR5XCJdICYmIG9NYXBwaW5nc1tpXVtcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdKSB8fFxuXHRcdFx0XHQob01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdICYmXG5cdFx0XHRcdFx0b01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdW1wiJFBhdGhcIl0pO1xuXHRcdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0UHJvcGVydHkgPVxuXHRcdFx0XHRvTWFwcGluZ3NbaV1bXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdIHx8IG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRcdGlmIChvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RPcHRpb24gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXG5cdFx0XHRcdC8vQ3JlYXRlIGEgbmV3IFNlbGVjdE9wdGlvbiB3aXRoIHNTZW1hbnRpY09iamVjdFByb3BlcnR5IGFzIHRoZSBwcm9wZXJ0eSBOYW1lIGFuZCByZW1vdmUgdGhlIG9sZGVyIG9uZVxuXHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKHNTZW1hbnRpY09iamVjdFByb3BlcnR5LCBvU2VsZWN0T3B0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xuXHR9XG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYW4gT3V0Ym91bmQgcHJvdmlkZWQgaW4gdGhlIG1hbmlmZXN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHNPdXRib3VuZCBJZGVudGlmaWVyIHRvIGxvY2F0aW9uIHRoZSBvdXRib3VuZCBpbiB0aGUgbWFuaWZlc3Rcblx0ICogQHBhcmFtIG1OYXZpZ2F0aW9uUGFyYW1ldGVycyBPcHRpb25hbCBtYXAgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVudEJhc2VkTmF2aWdhdGlvbiNuYXZpZ2F0ZU91dGJvdW5kXG5cdCAqIEBzaW5jZSAxLjg2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZU91dGJvdW5kKHNPdXRib3VuZDogc3RyaW5nLCBtTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBhTmF2UGFyYW1zOiBhbnlbXSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvTWFuaWZlc3RFbnRyeSA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKSxcblx0XHRcdG9PdXRib3VuZCA9IG9NYW5pZmVzdEVudHJ5LmNyb3NzTmF2aWdhdGlvbiAmJiBvTWFuaWZlc3RFbnRyeS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzW3NPdXRib3VuZF07XG5cdFx0aWYgKCFvT3V0Ym91bmQpIHtcblx0XHRcdExvZy5lcnJvcihcIk91dGJvdW5kIGlzIG5vdCBkZWZpbmVkIGluIG1hbmlmZXN0ISFcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdCA9IG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCxcblx0XHRcdHNBY3Rpb24gPSBvT3V0Ym91bmQuYWN0aW9uLFxuXHRcdFx0b3V0Ym91bmRQYXJhbXMgPSBvT3V0Ym91bmQucGFyYW1ldGVycyAmJiB0aGlzLmdldE91dGJvdW5kUGFyYW1zKG9PdXRib3VuZC5wYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChtTmF2aWdhdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdGFOYXZQYXJhbXMgPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKG1OYXZpZ2F0aW9uUGFyYW1ldGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0bGV0IG9QYXJhbXM6IGFueTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkobU5hdmlnYXRpb25QYXJhbWV0ZXJzW2tleV0pKSB7XG5cdFx0XHRcdFx0Y29uc3QgYVZhbHVlcyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVyc1trZXldO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0b1BhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdFx0b1BhcmFtc1trZXldID0gYVZhbHVlc1tpXTtcblx0XHRcdFx0XHRcdGFOYXZQYXJhbXM/LnB1c2gob1BhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9QYXJhbXMgPSB7fTtcblx0XHRcdFx0XHRvUGFyYW1zW2tleV0gPSBtTmF2aWdhdGlvblBhcmFtZXRlcnNba2V5XTtcblx0XHRcdFx0XHRhTmF2UGFyYW1zPy5wdXNoKG9QYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGFOYXZQYXJhbXMgfHwgb3V0Ym91bmRQYXJhbXMpIHtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiB7XG5cdFx0XHRcdFx0ZGF0YTogYU5hdlBhcmFtcyB8fCBvdXRib3VuZFBhcmFtc1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHR0aGlzLmJhc2UuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZShzU2VtYW50aWNPYmplY3QsIHNBY3Rpb24sIG1OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGFwcGx5IG91dGJvdW5kIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb25WYXJpYW50IGNvbnNpc3Rpbmcgb2YgYSBmaWx0ZXIgYmFyLCBhIHRhYmxlLCBhbmQgYSBwYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIHZPdXRib3VuZFBhcmFtcyBPdXRib3VuZCBQcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdCAqIEByZXR1cm5zIC0gVGhlIG1vZGlmaWVkIFNlbGVjdGlvblZhcmlhbnQgd2l0aCBvdXRib3VuZCBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0X2FwcGx5T3V0Ym91bmRQYXJhbXMob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIHZPdXRib3VuZFBhcmFtczogYW55KSB7XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyh2T3V0Ym91bmRQYXJhbXMpO1xuXHRcdGNvbnN0IGFTZWxlY3RQcm9wZXJ0aWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhU2VsZWN0UHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihrZXksIFwiSVwiLCBcIkVRXCIsIHZPdXRib3VuZFBhcmFtc1trZXldKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIG91dGJvdW5kIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb091dGJvdW5kUGFyYW1zIFBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGUgb3V0Ym91bmRzLiBPbmx5IFwicGxhaW5cIiBpcyBzdXBwb3J0ZWRcblx0ICogQHJldHVybnMgUGFyYW1ldGVycyB3aXRoIHRoZSBrZXktVmFsdWUgcGFpclxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldE91dGJvdW5kUGFyYW1zKG9PdXRib3VuZFBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgb1BhcmFtc01hcHBpbmc6IGFueSA9IHt9O1xuXHRcdGlmIChvT3V0Ym91bmRQYXJhbXMpIHtcblx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob091dGJvdW5kUGFyYW1zKSB8fCBbXTtcblx0XHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBvT3V0Ym91bmRQYXJhbXNba2V5XTtcblx0XHRcdFx0XHRpZiAob01hcHBpbmcudmFsdWUgJiYgb01hcHBpbmcudmFsdWUudmFsdWUgJiYgb01hcHBpbmcudmFsdWUuZm9ybWF0ID09PSBcInBsYWluXCIpIHtcblx0XHRcdFx0XHRcdGlmICghb1BhcmFtc01hcHBpbmdba2V5XSkge1xuXHRcdFx0XHRcdFx0XHRvUGFyYW1zTWFwcGluZ1trZXldID0gb01hcHBpbmcudmFsdWUudmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9QYXJhbXNNYXBwaW5nO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldDogc3RyaW5nLCBvQ29udGV4dDogYW55LCBzQ3JlYXRlUGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb091dGJvdW5kcyA9IChvQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKSBhcyBhbnkpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0T3V0Ym91bmRzKCk7XG5cdFx0Y29uc3Qgb0Rpc3BsYXlPdXRib3VuZCA9IG9PdXRib3VuZHNbc091dGJvdW5kVGFyZ2V0XTtcblx0XHRsZXQgYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXHRcdGlmIChvRGlzcGxheU91dGJvdW5kICYmIG9EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3QgJiYgb0Rpc3BsYXlPdXRib3VuZC5hY3Rpb24pIHtcblx0XHRcdGNvbnN0IG9SZWZyZXNoU3RyYXRlZ2llczogYW55ID0ge1xuXHRcdFx0XHRpbnRlbnRzOiB7fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5OiBhbnkgPSB7fTtcblx0XHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuaXNBICYmIG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRvQ29udGV4dCA9IFtvQ29udGV4dF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9Db250ZXh0WzBdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGVmYXVsdFJlZnJlc2hTdHJhdGVneVtzTWV0YVBhdGhdID0gXCJzZWxmXCI7XG5cdFx0XHRcdG9SZWZyZXNoU3RyYXRlZ2llc1tcIl9mZURlZmF1bHRcIl0gPSBvRGVmYXVsdFJlZnJlc2hTdHJhdGVneTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNDcmVhdGVQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNLZXkgPSBgJHtvRGlzcGxheU91dGJvdW5kLnNlbWFudGljT2JqZWN0fS0ke29EaXNwbGF5T3V0Ym91bmQuYWN0aW9ufWA7XG5cdFx0XHRcdG9SZWZyZXNoU3RyYXRlZ2llcy5pbnRlbnRzW3NLZXldID0ge307XG5cdFx0XHRcdG9SZWZyZXNoU3RyYXRlZ2llcy5pbnRlbnRzW3NLZXldW3NDcmVhdGVQYXRoXSA9IFwic2VsZlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EaXNwbGF5T3V0Ym91bmQgJiYgb0Rpc3BsYXlPdXRib3VuZC5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvRGlzcGxheU91dGJvdW5kLnBhcmFtZXRlcnMgJiYgdGhpcy5nZXRPdXRib3VuZFBhcmFtcyhvRGlzcGxheU91dGJvdW5kLnBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMob1BhcmFtcykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9QYXJhbXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZShvRGlzcGxheU91dGJvdW5kLnNlbWFudGljT2JqZWN0LCBvRGlzcGxheU91dGJvdW5kLmFjdGlvbiwge1xuXHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IG9Db250ZXh0LFxuXHRcdFx0XHRyZWZyZXNoU3RyYXRlZ2llczogb1JlZnJlc2hTdHJhdGVnaWVzLFxuXHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vVE9ETzogY2hlY2sgd2h5IHJldHVybmluZyBhIHByb21pc2UgaXMgcmVxdWlyZWRcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBvdXRib3VuZCB0YXJnZXQgJHtzT3V0Ym91bmRUYXJnZXR9IG5vdCBmb3VuZCBpbiBjcm9zcyBuYXZpZ2F0aW9uIGRlZmluaXRpb24gb2YgbWFuaWZlc3RgKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG4iXX0=
|