@sapui5/sap.fe.core 1.97.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -4
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +309 -405
- package/src/sap/fe/core/AnnotationHelper.ts +315 -0
- package/src/sap/fe/core/AppComponent.js +389 -397
- package/src/sap/fe/core/AppComponent.ts +403 -0
- package/src/sap/fe/core/AppStateHandler.js +198 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +83 -58
- package/src/sap/fe/core/BaseController.ts +68 -0
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2164 -2379
- package/src/sap/fe/core/CommonUtils.ts +2177 -0
- package/src/sap/fe/core/ExtensionAPI.js +279 -266
- package/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/src/sap/fe/core/PageController.js +218 -125
- package/src/sap/fe/core/PageController.ts +129 -0
- package/src/sap/fe/core/RouterProxy.js +924 -807
- package/src/sap/fe/core/RouterProxy.ts +840 -0
- package/src/sap/fe/core/Synchronization.js +41 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -155
- package/src/sap/fe/core/TemplateComponent.ts +173 -0
- package/src/sap/fe/core/TemplateModel.js +79 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1560 -1579
- package/src/sap/fe/core/TransactionHelper.ts +1717 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +521 -581
- package/src/sap/fe/core/actions/draft.ts +566 -0
- package/src/sap/fe/core/actions/messageHandling.js +564 -511
- package/src/sap/fe/core/actions/messageHandling.ts +552 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1093 -1211
- package/src/sap/fe/core/actions/operations.ts +1192 -0
- package/src/sap/fe/core/actions/sticky.js +114 -104
- package/src/sap/fe/core/actions/sticky.ts +119 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
- package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
- package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
- package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
- package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
- package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +220 -244
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
- package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/CommandExecution.js +68 -66
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
- package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/src/sap/fe/core/controls/FilterBar.js +163 -159
- package/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
- package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -367
- package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
- package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
- package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
- package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
- package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
- package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
- package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
- package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
- package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
- package/src/sap/fe/core/fpm/Component.js +51 -54
- package/src/sap/fe/core/fpm/Component.ts +48 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
- package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
- package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
- package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
- package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
- package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +427 -425
- package/src/sap/fe/core/library.support.js +23 -27
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
- package/src/sap/fe/core/messagebundle.properties +78 -13
- package/src/sap/fe/core/messagebundle_ar.properties +58 -7
- package/src/sap/fe/core/messagebundle_bg.properties +58 -7
- package/src/sap/fe/core/messagebundle_ca.properties +58 -7
- package/src/sap/fe/core/messagebundle_cs.properties +59 -8
- package/src/sap/fe/core/messagebundle_cy.properties +58 -7
- package/src/sap/fe/core/messagebundle_da.properties +58 -7
- package/src/sap/fe/core/messagebundle_de.properties +58 -7
- package/src/sap/fe/core/messagebundle_el.properties +58 -7
- package/src/sap/fe/core/messagebundle_en.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
- package/src/sap/fe/core/messagebundle_es.properties +58 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
- package/src/sap/fe/core/messagebundle_et.properties +58 -7
- package/src/sap/fe/core/messagebundle_fi.properties +60 -9
- package/src/sap/fe/core/messagebundle_fr.properties +64 -13
- package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
- package/src/sap/fe/core/messagebundle_hi.properties +58 -7
- package/src/sap/fe/core/messagebundle_hr.properties +58 -7
- package/src/sap/fe/core/messagebundle_hu.properties +59 -8
- package/src/sap/fe/core/messagebundle_id.properties +61 -10
- package/src/sap/fe/core/messagebundle_it.properties +58 -7
- package/src/sap/fe/core/messagebundle_iw.properties +58 -7
- package/src/sap/fe/core/messagebundle_ja.properties +58 -7
- package/src/sap/fe/core/messagebundle_kk.properties +58 -7
- package/src/sap/fe/core/messagebundle_ko.properties +58 -7
- package/src/sap/fe/core/messagebundle_lt.properties +58 -7
- package/src/sap/fe/core/messagebundle_lv.properties +59 -8
- package/src/sap/fe/core/messagebundle_ms.properties +58 -7
- package/src/sap/fe/core/messagebundle_nl.properties +58 -7
- package/src/sap/fe/core/messagebundle_no.properties +58 -7
- package/src/sap/fe/core/messagebundle_pl.properties +58 -7
- package/src/sap/fe/core/messagebundle_pt.properties +59 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
- package/src/sap/fe/core/messagebundle_ro.properties +58 -7
- package/src/sap/fe/core/messagebundle_ru.properties +58 -7
- package/src/sap/fe/core/messagebundle_sh.properties +58 -7
- package/src/sap/fe/core/messagebundle_sk.properties +58 -7
- package/src/sap/fe/core/messagebundle_sl.properties +58 -7
- package/src/sap/fe/core/messagebundle_sv.properties +59 -8
- package/src/sap/fe/core/messagebundle_th.properties +58 -7
- package/src/sap/fe/core/messagebundle_tr.properties +60 -9
- package/src/sap/fe/core/messagebundle_uk.properties +58 -7
- package/src/sap/fe/core/messagebundle_vi.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
- package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +140 -78
- package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters.js +76 -135
- package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controls/filterbar.d.js +0 -8
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
|
@@ -16,9 +16,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
16
16
|
var getVisualFilters = VisualFilters.getVisualFilters;
|
|
17
17
|
var Placement = ConfigurableObject.Placement;
|
|
18
18
|
var insertCustomElements = ConfigurableObject.insertCustomElements;
|
|
19
|
+
var getTypeConfig = Table.getTypeConfig;
|
|
19
20
|
var isFilteringCaseSensitive = Table.isFilteringCaseSensitive;
|
|
20
21
|
var getSelectionVariantConfiguration = Table.getSelectionVariantConfiguration;
|
|
21
|
-
var TemplateType = ManifestSettings.TemplateType;
|
|
22
22
|
var AvailabilityType = ManifestSettings.AvailabilityType;
|
|
23
23
|
|
|
24
24
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -27,11 +27,21 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
27
27
|
|
|
28
28
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
29
29
|
|
|
30
|
+
var filterFieldType;
|
|
31
|
+
|
|
32
|
+
(function (filterFieldType) {
|
|
33
|
+
filterFieldType["Default"] = "Default";
|
|
34
|
+
filterFieldType["Slot"] = "Slot";
|
|
35
|
+
})(filterFieldType || (filterFieldType = {}));
|
|
36
|
+
|
|
37
|
+
var sEdmString = "Edm.String";
|
|
38
|
+
var sStringDataType = "sap.ui.model.odata.type.String";
|
|
39
|
+
|
|
30
40
|
/**
|
|
31
41
|
* Enter all DataFields of a given FieldGroup into the filterFacetMap.
|
|
32
42
|
*
|
|
33
43
|
* @param {AnnotationTerm<FieldGroupType>} fieldGroup
|
|
34
|
-
* @returns {Record<string, FilterGroup>} The map of facets for the given
|
|
44
|
+
* @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
|
|
35
45
|
*/
|
|
36
46
|
function getFieldGroupFilterGroups(fieldGroup) {
|
|
37
47
|
var filterFacetMap = {};
|
|
@@ -57,8 +67,8 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
57
67
|
}, {});
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
|
-
* Check that all the tables for a dedicated
|
|
61
|
-
* @param {TableVisualization[]} listReportTables List
|
|
70
|
+
* Check that all the tables for a dedicated entity set are configured as analytical table.
|
|
71
|
+
* @param {TableVisualization[]} listReportTables List report tables
|
|
62
72
|
* @param {string} contextPath
|
|
63
73
|
* @returns {boolean} Is FilterBar search field hidden or not
|
|
64
74
|
*/
|
|
@@ -80,9 +90,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
80
90
|
var tableFilters = visualization.control.filters;
|
|
81
91
|
var tableSVConfigs = [];
|
|
82
92
|
|
|
83
|
-
for (var
|
|
84
|
-
if (Array.isArray(tableFilters[
|
|
85
|
-
var paths = tableFilters[
|
|
93
|
+
for (var _key in tableFilters) {
|
|
94
|
+
if (Array.isArray(tableFilters[_key].paths)) {
|
|
95
|
+
var paths = tableFilters[_key].paths;
|
|
86
96
|
paths.forEach(function (path) {
|
|
87
97
|
if (path && path.annotationPath && selectionVariantPaths.indexOf(path.annotationPath) === -1) {
|
|
88
98
|
selectionVariantPaths.push(path.annotationPath);
|
|
@@ -102,10 +112,10 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
102
112
|
}, []);
|
|
103
113
|
}
|
|
104
114
|
/**
|
|
105
|
-
* Returns the condition path required for the condition model. It looks
|
|
115
|
+
* Returns the condition path required for the condition model. It looks as follows:
|
|
106
116
|
* <1:N-PropertyName>*\/<1:1-PropertyName>/<PropertyName>.
|
|
107
117
|
*
|
|
108
|
-
* @param entityType The root
|
|
118
|
+
* @param entityType The root EntityType
|
|
109
119
|
* @param propertyPath The full path to the target property
|
|
110
120
|
* @returns {string} The formatted condition path
|
|
111
121
|
*/
|
|
@@ -153,6 +163,67 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
153
163
|
return undefined;
|
|
154
164
|
};
|
|
155
165
|
|
|
166
|
+
function getModelType(sType) {
|
|
167
|
+
var mDefaultTypeForEdmType = {
|
|
168
|
+
"Edm.Boolean": {
|
|
169
|
+
modelType: "Bool"
|
|
170
|
+
},
|
|
171
|
+
"Edm.Byte": {
|
|
172
|
+
modelType: "Int"
|
|
173
|
+
},
|
|
174
|
+
"Edm.Date": {
|
|
175
|
+
modelType: "Date"
|
|
176
|
+
},
|
|
177
|
+
"Edm.DateTime": {
|
|
178
|
+
modelType: "Date"
|
|
179
|
+
},
|
|
180
|
+
"Edm.DateTimeOffset": {
|
|
181
|
+
modelType: "DateTimeOffset"
|
|
182
|
+
},
|
|
183
|
+
"Edm.Decimal": {
|
|
184
|
+
modelType: "Decimal"
|
|
185
|
+
},
|
|
186
|
+
"Edm.Double": {
|
|
187
|
+
modelType: "Float"
|
|
188
|
+
},
|
|
189
|
+
"Edm.Float": {
|
|
190
|
+
modelType: "Float"
|
|
191
|
+
},
|
|
192
|
+
"Edm.Guid": {
|
|
193
|
+
modelType: "Guid"
|
|
194
|
+
},
|
|
195
|
+
"Edm.Int16": {
|
|
196
|
+
modelType: "Int"
|
|
197
|
+
},
|
|
198
|
+
"Edm.Int32": {
|
|
199
|
+
modelType: "Int"
|
|
200
|
+
},
|
|
201
|
+
"Edm.Int64": {
|
|
202
|
+
modelType: "Int"
|
|
203
|
+
},
|
|
204
|
+
"Edm.SByte": {
|
|
205
|
+
modelType: "Int"
|
|
206
|
+
},
|
|
207
|
+
"Edm.Single": {
|
|
208
|
+
modelType: "Float"
|
|
209
|
+
},
|
|
210
|
+
"Edm.String": {
|
|
211
|
+
modelType: "String"
|
|
212
|
+
},
|
|
213
|
+
"Edm.Time": {
|
|
214
|
+
modelType: "TimeOfDay"
|
|
215
|
+
},
|
|
216
|
+
"Edm.TimeOfDay": {
|
|
217
|
+
modelType: "TimeOfDay"
|
|
218
|
+
},
|
|
219
|
+
"Edm.Stream": {//no corresponding modelType - ignore for filtering
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
return sType && sType in mDefaultTypeForEdmType && mDefaultTypeForEdmType[sType].modelType;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
_exports.getModelType = getModelType;
|
|
226
|
+
|
|
156
227
|
var _getSelectionFields = function (entityType, navigationPath, properties, includeHidden, converterContext) {
|
|
157
228
|
var selectionFieldMap = {};
|
|
158
229
|
|
|
@@ -187,7 +258,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
187
258
|
if (property._type === "NavigationProperty") {
|
|
188
259
|
// handle navigation properties
|
|
189
260
|
localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.entityProperties, includeHidden, converterContext);
|
|
190
|
-
} else if (property.targetType !== undefined) {
|
|
261
|
+
} else if (property.targetType !== undefined && property.targetType._type === "ComplexType") {
|
|
191
262
|
// handle ComplexType properties
|
|
192
263
|
localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.properties, includeHidden, converterContext);
|
|
193
264
|
} else {
|
|
@@ -212,7 +283,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
212
283
|
}
|
|
213
284
|
|
|
214
285
|
if (!filterField) {
|
|
215
|
-
|
|
286
|
+
var _converterContext$get;
|
|
287
|
+
|
|
288
|
+
(_converterContext$get = converterContext.getDiagnostics()) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.addIssue(IssueCategory.Annotation, IssueSeverity.High, IssueType.MISSING_SELECTIONFIELD);
|
|
216
289
|
} // defined SelectionFields are available by default
|
|
217
290
|
|
|
218
291
|
|
|
@@ -276,7 +349,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
276
349
|
return selectionFields;
|
|
277
350
|
};
|
|
278
351
|
/**
|
|
279
|
-
* Get all
|
|
352
|
+
* Get all parameter filter fields in case of a parameterized service.
|
|
280
353
|
* @param {ConverterContext} converterContext
|
|
281
354
|
* @returns {FilterField[]} An array of parameter filterfields
|
|
282
355
|
*/
|
|
@@ -298,20 +371,28 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
298
371
|
* Determines if the FilterBar search field is hidden or not.
|
|
299
372
|
*
|
|
300
373
|
* @param {TableVisualization[]} listReportTables The list report tables
|
|
374
|
+
* @param {ChartVisualization[]} charts The ALP charts
|
|
301
375
|
* @param {ConverterContext} converterContext The converter context
|
|
302
376
|
* @returns {boolean} The information if the FilterBar search field is hidden or not
|
|
303
377
|
*/
|
|
304
378
|
|
|
305
379
|
|
|
306
|
-
var getFilterBarhideBasicSearch = function (listReportTables, converterContext) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
// if
|
|
380
|
+
var getFilterBarhideBasicSearch = function (listReportTables, charts, converterContext) {
|
|
381
|
+
// Check if charts allow search
|
|
382
|
+
var noSearchInCharts = charts.length === 0 || charts.every(function (chart) {
|
|
383
|
+
return !chart.applySupported.enableSearch;
|
|
384
|
+
}); // Check if all tables are analytical and none of them allow for search
|
|
311
385
|
|
|
386
|
+
var noSearchInTables = listReportTables.length === 0 || listReportTables.every(function (table) {
|
|
387
|
+
return table.enableAnalytics && !table.enableAnalyticsSearch;
|
|
388
|
+
});
|
|
389
|
+
var contextPath = converterContext.getContextPath();
|
|
312
390
|
|
|
313
|
-
|
|
314
|
-
|
|
391
|
+
if (contextPath && noSearchInCharts && noSearchInTables) {
|
|
392
|
+
return true;
|
|
393
|
+
} else {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
315
396
|
};
|
|
316
397
|
/**
|
|
317
398
|
* Retrieves filter fields from the manifest.
|
|
@@ -338,9 +419,11 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
338
419
|
var filterField = definedFilterFields[sKey];
|
|
339
420
|
var propertyName = KeyHelper.getPathFromSelectionFieldKey(sKey);
|
|
340
421
|
var selectionField = selectionFields[propertyName];
|
|
341
|
-
var
|
|
422
|
+
var type = filterField.type === "Slot" ? filterFieldType.Slot : filterFieldType.Default;
|
|
423
|
+
var visualFilter = filterField && filterField !== null && filterField !== void 0 && filterField.visualFilter ? getVisualFilters(entityType, converterContext, sKey, definedFilterFields) : undefined;
|
|
342
424
|
filterFields[sKey] = {
|
|
343
425
|
key: sKey,
|
|
426
|
+
type: type,
|
|
344
427
|
annotationPath: selectionField === null || selectionField === void 0 ? void 0 : selectionField.annotationPath,
|
|
345
428
|
conditionPath: (selectionField === null || selectionField === void 0 ? void 0 : selectionField.conditionPath) || propertyName,
|
|
346
429
|
template: filterField.template,
|
|
@@ -362,10 +445,329 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
362
445
|
var getFilterField = function (propertyPath, converterContext, entityType) {
|
|
363
446
|
return _getFilterField({}, propertyPath, converterContext, entityType);
|
|
364
447
|
};
|
|
448
|
+
|
|
449
|
+
_exports.getFilterField = getFilterField;
|
|
450
|
+
|
|
451
|
+
var getFilterRestrictions = function (oFilterRestrictionsAnnotation, sRestriction) {
|
|
452
|
+
if (sRestriction === "RequiredProperties" || sRestriction === "NonFilterableProperties") {
|
|
453
|
+
var aProps = [];
|
|
454
|
+
|
|
455
|
+
if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation[sRestriction]) {
|
|
456
|
+
aProps = oFilterRestrictionsAnnotation[sRestriction].map(function (oProperty) {
|
|
457
|
+
return oProperty.$PropertyPath || oProperty.value;
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return aProps;
|
|
462
|
+
} else if (sRestriction === "FilterAllowedExpressions") {
|
|
463
|
+
var mAllowedExpressions = {};
|
|
464
|
+
|
|
465
|
+
if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation.FilterExpressionRestrictions) {
|
|
466
|
+
oFilterRestrictionsAnnotation.FilterExpressionRestrictions.forEach(function (oProperty) {
|
|
467
|
+
//SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
|
|
468
|
+
if (mAllowedExpressions[oProperty.Property.value]) {
|
|
469
|
+
mAllowedExpressions[oProperty.Property.value].push(oProperty.AllowedExpressions);
|
|
470
|
+
} else {
|
|
471
|
+
mAllowedExpressions[oProperty.Property.value] = [oProperty.AllowedExpressions];
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
return mAllowedExpressions;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
return oFilterRestrictionsAnnotation;
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
_exports.getFilterRestrictions = getFilterRestrictions;
|
|
483
|
+
|
|
484
|
+
var getSearchFilterPropertyInfo = function () {
|
|
485
|
+
return {
|
|
486
|
+
name: "$search",
|
|
487
|
+
path: "$search",
|
|
488
|
+
dataType: sStringDataType,
|
|
489
|
+
maxConditions: 1
|
|
490
|
+
};
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
var getEditStateFilterPropertyInfo = function () {
|
|
494
|
+
return {
|
|
495
|
+
name: "$editState",
|
|
496
|
+
path: "$editState",
|
|
497
|
+
groupLabel: "",
|
|
498
|
+
group: "",
|
|
499
|
+
dataType: sStringDataType,
|
|
500
|
+
hiddenFilter: false
|
|
501
|
+
};
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
var getSearchRestrictions = function (converterContext) {
|
|
505
|
+
var _converterContext$get2, _converterContext$get3, _converterContext$get4;
|
|
506
|
+
|
|
507
|
+
return (_converterContext$get2 = converterContext.getEntitySet()) === null || _converterContext$get2 === void 0 ? void 0 : (_converterContext$get3 = _converterContext$get2.annotations) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.Capabilities) === null || _converterContext$get4 === void 0 ? void 0 : _converterContext$get4.SearchRestrictions;
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
var getNavigationRestrictions = function (converterContext, sNavigationPath) {
|
|
511
|
+
var _converterContext$get5, _converterContext$get6, _converterContext$get7;
|
|
512
|
+
|
|
513
|
+
var oNavigationRestrictions = (_converterContext$get5 = converterContext.getEntitySet()) === null || _converterContext$get5 === void 0 ? void 0 : (_converterContext$get6 = _converterContext$get5.annotations) === null || _converterContext$get6 === void 0 ? void 0 : (_converterContext$get7 = _converterContext$get6.Capabilities) === null || _converterContext$get7 === void 0 ? void 0 : _converterContext$get7.NavigationRestrictions;
|
|
514
|
+
var aRestrictedProperties = oNavigationRestrictions && oNavigationRestrictions.RestrictedProperties;
|
|
515
|
+
return aRestrictedProperties && aRestrictedProperties.find(function (oRestrictedProperty) {
|
|
516
|
+
return oRestrictedProperty && oRestrictedProperty.NavigationProperty && (oRestrictedProperty.NavigationProperty.$NavigationPropertyPath === sNavigationPath || oRestrictedProperty.NavigationProperty.value === sNavigationPath);
|
|
517
|
+
});
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
_exports.getNavigationRestrictions = getNavigationRestrictions;
|
|
521
|
+
|
|
522
|
+
var _fetchBasicPropertyInfo = function (oFilterFieldInfo) {
|
|
523
|
+
return {
|
|
524
|
+
key: oFilterFieldInfo.key,
|
|
525
|
+
annotationPath: oFilterFieldInfo.annotationPath,
|
|
526
|
+
conditionPath: oFilterFieldInfo.conditionPath,
|
|
527
|
+
name: oFilterFieldInfo.conditionPath,
|
|
528
|
+
label: oFilterFieldInfo.label,
|
|
529
|
+
hiddenFilter: oFilterFieldInfo.availability === "Hidden",
|
|
530
|
+
display: "Value",
|
|
531
|
+
isParameter: oFilterFieldInfo.isParameter,
|
|
532
|
+
caseSensitive: oFilterFieldInfo.caseSensitive,
|
|
533
|
+
availability: oFilterFieldInfo.availability,
|
|
534
|
+
position: oFilterFieldInfo.position,
|
|
535
|
+
type: oFilterFieldInfo.type,
|
|
536
|
+
template: oFilterFieldInfo.template,
|
|
537
|
+
menu: oFilterFieldInfo.menu
|
|
538
|
+
};
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
var getSpecificAllowedExpression = function (aExpressions) {
|
|
542
|
+
var aAllowedExpressionsPriority = ["SingleValue", "MultiValue", "SingleRange", "MultiRange", "SearchExpression", "MultiRangeOrSearchExpression"];
|
|
543
|
+
aExpressions.sort(function (a, b) {
|
|
544
|
+
return aAllowedExpressionsPriority.indexOf(a) - aAllowedExpressionsPriority.indexOf(b);
|
|
545
|
+
});
|
|
546
|
+
return aExpressions[0];
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
_exports.getSpecificAllowedExpression = getSpecificAllowedExpression;
|
|
550
|
+
|
|
551
|
+
var displayMode = function (oPropertyAnnotations, oCollectionAnnotations) {
|
|
552
|
+
var _oPropertyAnnotations, _oPropertyAnnotations2, _oPropertyAnnotations3, _oPropertyAnnotations4, _oPropertyAnnotations5, _oCollectionAnnotatio;
|
|
553
|
+
|
|
554
|
+
var oTextAnnotation = oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations = oPropertyAnnotations.Common) === null || _oPropertyAnnotations === void 0 ? void 0 : _oPropertyAnnotations.Text,
|
|
555
|
+
oTextArrangmentAnnotation = oTextAnnotation && (oPropertyAnnotations && (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations2 = oPropertyAnnotations.Common) === null || _oPropertyAnnotations2 === void 0 ? void 0 : (_oPropertyAnnotations3 = _oPropertyAnnotations2.Text) === null || _oPropertyAnnotations3 === void 0 ? void 0 : (_oPropertyAnnotations4 = _oPropertyAnnotations3.annotations) === null || _oPropertyAnnotations4 === void 0 ? void 0 : (_oPropertyAnnotations5 = _oPropertyAnnotations4.UI) === null || _oPropertyAnnotations5 === void 0 ? void 0 : _oPropertyAnnotations5.TextArrangement) || oCollectionAnnotations && (oCollectionAnnotations === null || oCollectionAnnotations === void 0 ? void 0 : (_oCollectionAnnotatio = oCollectionAnnotations.UI) === null || _oCollectionAnnotatio === void 0 ? void 0 : _oCollectionAnnotatio.TextArrangement));
|
|
556
|
+
|
|
557
|
+
if (oTextArrangmentAnnotation) {
|
|
558
|
+
if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextOnly") {
|
|
559
|
+
return "Description";
|
|
560
|
+
} else if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextLast") {
|
|
561
|
+
return "ValueDescription";
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return "DescriptionValue"; //TextFirst
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return oTextAnnotation ? "DescriptionValue" : "Value";
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
_exports.displayMode = displayMode;
|
|
571
|
+
|
|
572
|
+
var _fetchPropertyInfo = function (converterContext, oFilterFieldInfo, oTypeConfig) {
|
|
573
|
+
var _converterContext$get8;
|
|
574
|
+
|
|
575
|
+
var oPropertyInfo = _fetchBasicPropertyInfo(oFilterFieldInfo);
|
|
576
|
+
|
|
577
|
+
var sAnnotationPath = oFilterFieldInfo.annotationPath;
|
|
578
|
+
|
|
579
|
+
if (!sAnnotationPath) {
|
|
580
|
+
return oPropertyInfo;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
var targetPropertyObject = converterContext.getConverterContextFor(sAnnotationPath).getDataModelObjectPath().targetObject;
|
|
584
|
+
var oPropertyAnnotations = targetPropertyObject === null || targetPropertyObject === void 0 ? void 0 : targetPropertyObject.annotations;
|
|
585
|
+
var oCollectionAnnotations = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get8 = converterContext.getDataModelObjectPath().targetObject) === null || _converterContext$get8 === void 0 ? void 0 : _converterContext$get8.annotations;
|
|
586
|
+
var oFormatOptions = oTypeConfig.formatOptions;
|
|
587
|
+
var oConstraints = oTypeConfig.constraints;
|
|
588
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
589
|
+
formatOptions: oFormatOptions,
|
|
590
|
+
constraints: oConstraints,
|
|
591
|
+
display: displayMode(oPropertyAnnotations, oCollectionAnnotations)
|
|
592
|
+
});
|
|
593
|
+
return oPropertyInfo;
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
var isMultiValue = function (oProperty) {
|
|
597
|
+
var bIsMultiValue = true; //SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
|
|
598
|
+
|
|
599
|
+
switch (oProperty.filterExpression) {
|
|
600
|
+
case "SearchExpression":
|
|
601
|
+
case "SingleRange":
|
|
602
|
+
case "SingleValue":
|
|
603
|
+
bIsMultiValue = false;
|
|
604
|
+
break;
|
|
605
|
+
|
|
606
|
+
default:
|
|
607
|
+
break;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
if (oProperty.type && oProperty.type.indexOf("Boolean") > 0) {
|
|
611
|
+
bIsMultiValue = false;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
return bIsMultiValue;
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
_exports.isMultiValue = isMultiValue;
|
|
618
|
+
|
|
619
|
+
var getAnnotatedSelectionFieldData = function (converterContext) {
|
|
620
|
+
var _converterContext$get9, _entityType$annotatio3, _entityType$annotatio4;
|
|
621
|
+
|
|
622
|
+
var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
623
|
+
var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
624
|
+
// Fetch all selectionVariants defined in the different visualizations and different views (multi table mode)
|
|
625
|
+
var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
|
|
626
|
+
|
|
627
|
+
var excludedFilterProperties = getExcludedFilterProperties(selectionVariants);
|
|
628
|
+
var entityType = converterContext.getEntityType(); //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
|
|
629
|
+
|
|
630
|
+
var annotatedSelectionFields = annotationPath && ((_converterContext$get9 = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get9 === void 0 ? void 0 : _converterContext$get9.annotation) || ((_entityType$annotatio3 = entityType.annotations) === null || _entityType$annotatio3 === void 0 ? void 0 : (_entityType$annotatio4 = _entityType$annotatio3.UI) === null || _entityType$annotatio4 === void 0 ? void 0 : _entityType$annotatio4.SelectionFields) || []; // create a map of all potential filter fields based on...
|
|
631
|
+
|
|
632
|
+
var filterFields = _objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, false, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, false, converterContext));
|
|
633
|
+
|
|
634
|
+
var propertyInfoFields = (annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
|
|
635
|
+
var propertyPath = selectionField.value;
|
|
636
|
+
|
|
637
|
+
if (!(propertyPath in excludedFilterProperties)) {
|
|
638
|
+
var filterField = _getFilterField(filterFields, propertyPath, converterContext, entityType);
|
|
639
|
+
|
|
640
|
+
if (filterField) {
|
|
641
|
+
filterField.group = "";
|
|
642
|
+
filterField.groupLabel = "";
|
|
643
|
+
selectionFields.push(filterField);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
return selectionFields;
|
|
648
|
+
}, [])) || [];
|
|
649
|
+
return {
|
|
650
|
+
excludedFilterProperties: excludedFilterProperties,
|
|
651
|
+
entityType: entityType,
|
|
652
|
+
annotatedSelectionFields: annotatedSelectionFields,
|
|
653
|
+
filterFields: filterFields,
|
|
654
|
+
propertyInfoFields: propertyInfoFields
|
|
655
|
+
};
|
|
656
|
+
};
|
|
657
|
+
|
|
658
|
+
var processSelectionFields = function (propertyInfoFields, converterContext) {
|
|
659
|
+
var _converterContext$get10, _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15;
|
|
660
|
+
|
|
661
|
+
//get TypeConfig function
|
|
662
|
+
var aTypeConfig = [];
|
|
663
|
+
var selectionFieldTypes = [];
|
|
664
|
+
|
|
665
|
+
var _fnTypeConfig = function (property) {
|
|
666
|
+
var oTypeConfig = getTypeConfig(property, undefined);
|
|
667
|
+
selectionFieldTypes.push(property === null || property === void 0 ? void 0 : property.type);
|
|
668
|
+
|
|
669
|
+
if ((property === null || property === void 0 ? void 0 : property.type) === sEdmString && (!oTypeConfig.constraints.nullable || oTypeConfig.constraints.nullable === true)) {
|
|
670
|
+
oTypeConfig.formatOptions.parseKeepsEmptyString = false;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
aTypeConfig.push(oTypeConfig);
|
|
674
|
+
}; //add typeConfig
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
propertyInfoFields.forEach(function (parameterField) {
|
|
678
|
+
if (parameterField.annotationPath) {
|
|
679
|
+
var propertyConvertyContext = converterContext.getConverterContextFor(parameterField.annotationPath);
|
|
680
|
+
var propertyTargetObject = propertyConvertyContext.getDataModelObjectPath().targetObject;
|
|
681
|
+
|
|
682
|
+
_fnTypeConfig(propertyTargetObject);
|
|
683
|
+
} else {
|
|
684
|
+
selectionFieldTypes.push(sEdmString);
|
|
685
|
+
aTypeConfig.push({
|
|
686
|
+
type: sStringDataType
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
}); // filterRestrictions
|
|
690
|
+
|
|
691
|
+
var oFilterRestrictions = (_converterContext$get10 = converterContext.getEntitySet()) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.annotations) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.Capabilities) === null || _converterContext$get12 === void 0 ? void 0 : _converterContext$get12.FilterRestrictions;
|
|
692
|
+
var oRet = {};
|
|
693
|
+
oRet["RequiredProperties"] = getFilterRestrictions(oFilterRestrictions, "RequiredProperties") || [];
|
|
694
|
+
oRet["NonFilterableProperties"] = getFilterRestrictions(oFilterRestrictions, "NonFilterableProperties") || [];
|
|
695
|
+
oRet["FilterAllowedExpressions"] = getFilterRestrictions(oFilterRestrictions, "FilterAllowedExpressions") || {};
|
|
696
|
+
var sEntitySetPath = converterContext.getContextPath();
|
|
697
|
+
var aPathParts = sEntitySetPath.split("/");
|
|
698
|
+
|
|
699
|
+
if (aPathParts.length > 2) {
|
|
700
|
+
var sNavigationPath = aPathParts[aPathParts.length - 1];
|
|
701
|
+
aPathParts.splice(-1, 1);
|
|
702
|
+
var oNavigationRestrictions = getNavigationRestrictions(converterContext, sNavigationPath);
|
|
703
|
+
var oNavigationFilterRestrictions = oNavigationRestrictions && oNavigationRestrictions.FilterRestrictions;
|
|
704
|
+
oRet.RequiredProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "RequiredProperties") || []);
|
|
705
|
+
oRet.NonFilterableProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "NonFilterableProperties") || []);
|
|
706
|
+
oRet.FilterAllowedExpressions = _objectSpread(_objectSpread({}, getFilterRestrictions(oNavigationFilterRestrictions, "FilterAllowedExpressions") || {}), oRet.FilterAllowedExpressions);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
var isCaseSensitive = isFilteringCaseSensitive(converterContext);
|
|
710
|
+
var aRequiredProps = oRet.RequiredProperties;
|
|
711
|
+
var aNonFilterableProps = oRet.NonFilterableProperties;
|
|
712
|
+
var oPropertyInfo;
|
|
713
|
+
var aFetchedProperties = []; // process the fields to add necessary properties
|
|
714
|
+
|
|
715
|
+
Object.keys(propertyInfoFields).forEach(function (sFilterFieldKey) {
|
|
716
|
+
var oConvertedProperty = propertyInfoFields[sFilterFieldKey];
|
|
717
|
+
var sPropertyPath;
|
|
718
|
+
|
|
719
|
+
if (oConvertedProperty.conditionPath) {
|
|
720
|
+
sPropertyPath = oConvertedProperty.conditionPath.replace(/\+|\*/g, "");
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
if (aNonFilterableProps.indexOf(sPropertyPath) === -1) {
|
|
724
|
+
oPropertyInfo = _fetchPropertyInfo(converterContext, oConvertedProperty, aTypeConfig[sFilterFieldKey]);
|
|
725
|
+
|
|
726
|
+
if (oPropertyInfo) {
|
|
727
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
728
|
+
maxConditions: !oPropertyInfo.isParameter && isMultiValue(oPropertyInfo) ? -1 : 1,
|
|
729
|
+
required: oPropertyInfo.isParameter || aRequiredProps.indexOf(sPropertyPath) >= 0,
|
|
730
|
+
caseSensitive: isCaseSensitive,
|
|
731
|
+
dataType: selectionFieldTypes[sFilterFieldKey]
|
|
732
|
+
});
|
|
733
|
+
aFetchedProperties.push(oPropertyInfo);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}); //add edit
|
|
737
|
+
|
|
738
|
+
if ((_converterContext$get13 = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get13 !== void 0 && (_converterContext$get14 = _converterContext$get13.annotations) !== null && _converterContext$get14 !== void 0 && (_converterContext$get15 = _converterContext$get14.Common) !== null && _converterContext$get15 !== void 0 && _converterContext$get15.DraftRoot) {
|
|
739
|
+
aFetchedProperties.push(getEditStateFilterPropertyInfo());
|
|
740
|
+
} // add search
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
var searchRestrictions = getSearchRestrictions(converterContext);
|
|
744
|
+
var hideBasicSearch = Boolean(searchRestrictions && !searchRestrictions.Searchable);
|
|
745
|
+
|
|
746
|
+
if (sEntitySetPath && hideBasicSearch !== true) {
|
|
747
|
+
if (!searchRestrictions || searchRestrictions !== null && searchRestrictions !== void 0 && searchRestrictions.Searchable) {
|
|
748
|
+
aFetchedProperties.push(getSearchFilterPropertyInfo());
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
return aFetchedProperties;
|
|
753
|
+
};
|
|
754
|
+
|
|
755
|
+
_exports.processSelectionFields = processSelectionFields;
|
|
756
|
+
|
|
757
|
+
var insertCustomManifestElements = function (filterFields, entityType, converterContext) {
|
|
758
|
+
return insertCustomElements(filterFields, getManifestFilterFields(entityType, converterContext), {
|
|
759
|
+
"availability": "overwrite",
|
|
760
|
+
label: "overwrite",
|
|
761
|
+
type: "overwrite",
|
|
762
|
+
position: "overwrite",
|
|
763
|
+
template: "overwrite",
|
|
764
|
+
settings: "overwrite",
|
|
765
|
+
visualFilter: "overwrite"
|
|
766
|
+
});
|
|
767
|
+
};
|
|
365
768
|
/**
|
|
366
769
|
* Retrieve the configuration for the selection fields that will be used within the filter bar
|
|
367
770
|
* This configuration takes into account annotation and the selection variants.
|
|
368
|
-
*
|
|
369
771
|
* @param {ConverterContext} converterContext
|
|
370
772
|
* @param {TableVisualization[]} lrTables
|
|
371
773
|
* @param {string} annotationPath
|
|
@@ -373,19 +775,44 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
373
775
|
*/
|
|
374
776
|
|
|
375
777
|
|
|
376
|
-
_exports.
|
|
778
|
+
_exports.insertCustomManifestElements = insertCustomManifestElements;
|
|
377
779
|
|
|
378
780
|
var getSelectionFields = function (converterContext) {
|
|
379
|
-
var _entityType$
|
|
781
|
+
var _entityType$annotatio5, _entityType$annotatio6;
|
|
380
782
|
|
|
381
783
|
var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
382
784
|
var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
383
|
-
|
|
384
|
-
|
|
785
|
+
var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath);
|
|
786
|
+
|
|
787
|
+
var parameterFields = _getParameterFields(converterContext);
|
|
788
|
+
|
|
789
|
+
var propertyInfoFields = JSON.parse(JSON.stringify(oAnnotatedSelectionFieldData.propertyInfoFields));
|
|
790
|
+
var entityType = oAnnotatedSelectionFieldData.entityType;
|
|
791
|
+
propertyInfoFields = parameterFields.concat(propertyInfoFields);
|
|
792
|
+
propertyInfoFields = insertCustomManifestElements(propertyInfoFields, entityType, converterContext);
|
|
793
|
+
var aFetchedProperties = processSelectionFields(propertyInfoFields, converterContext);
|
|
794
|
+
aFetchedProperties.sort(function (a, b) {
|
|
795
|
+
if (a.groupLabel === undefined || a.groupLabel === null) {
|
|
796
|
+
return -1;
|
|
797
|
+
}
|
|
385
798
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
799
|
+
if (b.groupLabel === undefined || b.groupLabel === null) {
|
|
800
|
+
return 1;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
return a.groupLabel.localeCompare(b.groupLabel);
|
|
804
|
+
});
|
|
805
|
+
var sFetchProperties = JSON.stringify(aFetchedProperties);
|
|
806
|
+
sFetchProperties = sFetchProperties.replace(/\{/g, "\\{");
|
|
807
|
+
sFetchProperties = sFetchProperties.replace(/\}/g, "\\}");
|
|
808
|
+
var sPropertyInfo = sFetchProperties; // end of propertyFields processing
|
|
809
|
+
// to populate selection fields
|
|
810
|
+
|
|
811
|
+
var propSelectionFields = JSON.parse(JSON.stringify(oAnnotatedSelectionFieldData.propertyInfoFields));
|
|
812
|
+
propSelectionFields = parameterFields.concat(propSelectionFields); // create a map of properties to be used in selection variants
|
|
813
|
+
|
|
814
|
+
var excludedFilterProperties = oAnnotatedSelectionFieldData.excludedFilterProperties;
|
|
815
|
+
var filterFacets = entityType === null || entityType === void 0 ? void 0 : (_entityType$annotatio5 = entityType.annotations) === null || _entityType$annotatio5 === void 0 ? void 0 : (_entityType$annotatio6 = _entityType$annotatio5.UI) === null || _entityType$annotatio6 === void 0 ? void 0 : _entityType$annotatio6.FilterFacets;
|
|
389
816
|
var filterFacetMap = {};
|
|
390
817
|
var aFieldGroups = converterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.FieldGroup");
|
|
391
818
|
|
|
@@ -416,31 +843,14 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
416
843
|
} // create a map of all potential filter fields based on...
|
|
417
844
|
|
|
418
845
|
|
|
419
|
-
var filterFields =
|
|
420
|
-
|
|
846
|
+
var filterFields = oAnnotatedSelectionFieldData.filterFields; //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
|
|
421
847
|
|
|
422
|
-
var annotatedSelectionFields =
|
|
848
|
+
var annotatedSelectionFields = oAnnotatedSelectionFieldData.annotatedSelectionFields;
|
|
423
849
|
|
|
424
|
-
var defaultFilters = _getDefaultFilterFields(filterFields, aSelectOptions, entityType, converterContext, excludedFilterProperties, annotatedSelectionFields);
|
|
850
|
+
var defaultFilters = _getDefaultFilterFields(filterFields, aSelectOptions, entityType, converterContext, excludedFilterProperties, annotatedSelectionFields); // finally create final list of filter fields by adding the SelectionFields first (order matters)...
|
|
425
851
|
|
|
426
|
-
var parameterFields = _getParameterFields(converterContext); // finally create final list of filter fields by adding the SelectionFields first (order matters)...
|
|
427
852
|
|
|
428
|
-
|
|
429
|
-
var allFilters = parameterFields.concat((annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
|
|
430
|
-
var propertyPath = selectionField.value;
|
|
431
|
-
|
|
432
|
-
if (!(propertyPath in excludedFilterProperties)) {
|
|
433
|
-
var filterField = _getFilterField(filterFields, propertyPath, converterContext, entityType);
|
|
434
|
-
|
|
435
|
-
if (filterField) {
|
|
436
|
-
filterField.group = "";
|
|
437
|
-
filterField.groupLabel = "";
|
|
438
|
-
selectionFields.push(filterField);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
return selectionFields;
|
|
443
|
-
}, [])) || []) // To add the FilterField which is not part of the Selection Fields but the property is mentioned in the Selection Variant
|
|
853
|
+
var allFilters = propSelectionFields // To add the FilterField which is not part of the Selection Fields but the property is mentioned in the Selection Variant
|
|
444
854
|
.concat(defaultFilters || []) // ...and adding remaining filter fields, that are not used in a SelectionVariant (order doesn't matter)
|
|
445
855
|
.concat(Object.keys(filterFields).filter(function (propertyPath) {
|
|
446
856
|
return !(propertyPath in excludedFilterProperties);
|
|
@@ -465,23 +875,19 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
465
875
|
}
|
|
466
876
|
}
|
|
467
877
|
|
|
468
|
-
var selectionFields =
|
|
469
|
-
"availability": "overwrite",
|
|
470
|
-
label: "overwrite",
|
|
471
|
-
position: "overwrite",
|
|
472
|
-
template: "overwrite",
|
|
473
|
-
settings: "overwrite",
|
|
474
|
-
visualFilter: "overwrite"
|
|
475
|
-
}); // Add caseSensitive property to all selection fields.
|
|
878
|
+
var selectionFields = insertCustomManifestElements(allFilters, entityType, converterContext); // Add caseSensitive property to all selection fields.
|
|
476
879
|
|
|
477
880
|
var isCaseSensitive = isFilteringCaseSensitive(converterContext);
|
|
478
881
|
selectionFields.forEach(function (filterField) {
|
|
479
882
|
filterField.caseSensitive = isCaseSensitive;
|
|
480
883
|
});
|
|
481
|
-
return
|
|
884
|
+
return {
|
|
885
|
+
selectionFields: selectionFields,
|
|
886
|
+
sPropertyInfo: sPropertyInfo
|
|
887
|
+
};
|
|
482
888
|
};
|
|
483
889
|
|
|
484
890
|
_exports.getSelectionFields = getSelectionFields;
|
|
485
891
|
return _exports;
|
|
486
892
|
}, false);
|
|
487
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyRmllbGQiLCJnZXRTZWxlY3Rpb25GaWVsZHMiLCJsclRhYmxlcyIsImdldEVudGl0eVR5cGUiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiZ2V0U2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwiZGVmYXVsdEZpbHRlcnMiLCJhbGxGaWx0ZXJzIiwiZmlsdGVyIiwiYXNzaWduIiwiYWdncmVnYXRlcyIsImFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJhZ2dyZWdhdGVLZXkiLCJyZWxhdGl2ZVBhdGgiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImlzQ2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImNhc2VTZW5zaXRpdmUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVNBLHlCQUFULENBQW1DQyxVQUFuQyxFQUE0RztBQUMzRyxRQUFNQyxjQUEyQyxHQUFHLEVBQXBEO0FBQ0FELElBQUFBLFVBQVUsQ0FBQ0UsSUFBWCxDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBQ0MsU0FBRCxFQUF1QztBQUM5RCxVQUFJQSxTQUFTLENBQUNDLEtBQVYsS0FBb0Isc0NBQXhCLEVBQWdFO0FBQUE7O0FBQy9ESixRQUFBQSxjQUFjLENBQUNHLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQkMsSUFBakIsQ0FBZCxHQUF1QztBQUN0Q0MsVUFBQUEsS0FBSyxFQUFFUixVQUFVLENBQUNTLGtCQURvQjtBQUV0Q0MsVUFBQUEsVUFBVSxFQUNUQyxjQUFjLENBQ2JDLG9CQUFvQixDQUFDWixVQUFVLENBQUNhLEtBQVgsOEJBQW9CYixVQUFVLENBQUNjLFdBQS9CLG9GQUFvQixzQkFBd0JDLE1BQTVDLDJEQUFvQix1QkFB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LFVBQUQsRUFBYXBDLHVCQUF1QixDQUFDMUYsVUFBRCxFQUFhbkIsZ0JBQWIsQ0FBcEMsRUFBb0U7QUFDL0csc0JBQWdCLFdBRCtGO0FBRS9HZ0QsTUFBQUEsS0FBSyxFQUFFLFdBRndHO0FBRy9Hd0UsTUFBQUEsUUFBUSxFQUFFLFdBSHFHO0FBSS9HRCxNQUFBQSxRQUFRLEVBQUUsV0FKcUc7QUFLL0dLLE1BQUFBLFFBQVEsRUFBRSxXQUxxRztBQU0vR1AsTUFBQUEsWUFBWSxFQUFFO0FBTmlHLEtBQXBFLENBQTVDLENBMUdnQixDQW1IaEI7O0FBQ0EsUUFBTW9DLGVBQWUsR0FBR0Msd0JBQXdCLENBQUMxSixnQkFBRCxDQUFoRDtBQUNBMEQsSUFBQUEsZUFBZSxDQUFDMUYsT0FBaEIsQ0FBd0IsVUFBQWtHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDeUYsYUFBWixHQUE0QkYsZUFBNUI7QUFDQSxLQUZEO0FBSUEsV0FBTy9GLGVBQVA7QUFDQSxHQTlITSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0RmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0RmlsdGVyU2V0dGluZ3MsXG5cdFRlbXBsYXRlVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlVmlzdWFsaXphdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMsIFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIEZpZWxkR3JvdXBUeXBlLCBGaWVsZEdyb3VwIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBJc3N1ZVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlQ2F0ZWdvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmlsdGVyR3JvdXAgPSB7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkID0gQ3VzdG9tRWxlbWVudDxGaWx0ZXJGaWVsZD47XG5cbi8qKlxuICogRW50ZXIgYWxsIERhdGFGaWVsZHMgb2YgYSBnaXZlbiBGaWVsZEdyb3VwIGludG8gdGhlIGZpbHRlckZhY2V0TWFwLlxuICpcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+fSBmaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+fSBUaGUgbWFwIG9mIGZhY2V0cyBmb3IgdGhlIGdpdmVuIGZpZWxkR3JvdXBcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhmaWVsZEdyb3VwOiBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4ge1xuXHRjb25zdCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cdGZpZWxkR3JvdXAuRGF0YS5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcFtkYXRhRmllbGQuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdGdyb3VwOiBmaWVsZEdyb3VwLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDpcblx0XHRcdFx0XHRjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5c2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGUuXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIExpc3QgUmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBsaWtlIGZvbGxvdzpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlbZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IHBhcnRpYWxQYXRoICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBrZXkgKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5jb25zdCBfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgdGFyZ2V0RW50aXR5VHlwZS5uYW1lKVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZyxcblx0cHJvcGVydGllczogQXJyYXk8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGNvbnN0IGZ1bGxQYXRoOiBzdHJpbmcgPSAobmF2aWdhdGlvblBhdGggPyBuYXZpZ2F0aW9uUGF0aCArIFwiL1wiIDogXCJcIikgKyBwcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBwcm9wZXJ0eSwgZnVsbFBhdGgsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKHNlbGVjdGlvbkZpZWxkKSB7XG5cdFx0XHRcdHNlbGVjdGlvbkZpZWxkTWFwW2Z1bGxQYXRoXSA9IHNlbGVjdGlvbkZpZWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZE1hcDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGggPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUlTU0lOR19TRUxFQ1RJT05GSUVMRCk7XG5cdH1cblx0Ly8gZGVmaW5lZCBTZWxlY3Rpb25GaWVsZHMgYXJlIGF2YWlsYWJsZSBieSBkZWZhdWx0XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSA9IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdDtcblx0XHRmaWx0ZXJGaWVsZC5pc1BhcmFtZXRlciA9ICEhZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZDtcbn07XG5cbmNvbnN0IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRhU2VsZWN0T3B0aW9uczogYW55W10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogUHJvcGVydHlQYXRoW11cbik6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBbXTtcblx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHQvLyBVc2luZyBlbnRpdHlUeXBlIGluc3RlYWQgb2YgZW50aXR5U2V0XG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRcdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEoUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKFByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgUGFyYW1ldGVyIGZpbHRlckZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0Y29uc3QgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCA9XG5cdFx0aXNQYXJhbWV0ZXJpemVkICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihcIi9cIiArIGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSk7XG5cblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gKHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHRcblx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sIHByb3BlcnR5Lm5hbWUsIHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQsIHBhcmFtZXRlckVudGl0eVR5cGUpO1xuXHRcdCAgfSlcblx0XHQ6IFtdKSBhcyBGaWx0ZXJGaWVsZFtdO1xuXG5cdHJldHVybiBwYXJhbWV0ZXJGaWVsZHM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxpc3RSZXBvcnRUYWJsZXMgVGhlIGxpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbihsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8vIFRyaWVzIHRvIGZpbmQgYSBub24tYW5hbHl0aWNhbCB0YWJsZSB3aXRoIHRoZSBtYWluIGVudGl0eSBzZXQgKHBhZ2UgZW50aXR5IHNldCkgYXMgY29sbGVjdGlvblxuXHQvLyBpZiBhdCBsZWFzdCBvbmUgdGFibGUgbWF0Y2hlcyB0aGVzZSBjb25kaXRpb25zLCBiYXNpYyBzZWFyY2ggZmllbGQgbXVzdCBiZSBkaXNwbGF5ZWQuXG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0cmV0dXJuIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXMsIHNDb250ZXh0UGF0aCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+IHtcblx0Y29uc3QgZmJDb25maWc6IEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZpbmVkRmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj4gPSBmYkNvbmZpZz8uZmlsdGVyRmllbGRzIHx8IHt9O1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRPYmplY3Qua2V5cyhkZWZpbmVkRmlsdGVyRmllbGRzKS5tYXAoa2V5ID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHZpc3VhbEZpbHRlciA9IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcyk7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5hbm5vdGF0aW9uUGF0aCxcblx0XHRcdGNvbmRpdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5jb25kaXRpb25QYXRoIHx8IHByb3BlcnR5TmFtZSxcblx0XHRcdHRlbXBsYXRlOiBmaWx0ZXJGaWVsZC50ZW1wbGF0ZSxcblx0XHRcdGxhYmVsOiBmaWx0ZXJGaWVsZC5sYWJlbCxcblx0XHRcdHBvc2l0aW9uOiBmaWx0ZXJGaWVsZC5wb3NpdGlvbiB8fCB7IHBsYWNlbWVudDogUGxhY2VtZW50LkFmdGVyIH0sXG5cdFx0XHRhdmFpbGFiaWxpdHk6IGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSB8fCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRzZXR0aW5nczogZmlsdGVyRmllbGQuc2V0dGluZ3MsXG5cdFx0XHR2aXN1YWxGaWx0ZXI6IHZpc3VhbEZpbHRlclxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJGaWVsZCA9IGZ1bmN0aW9uKHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XG5cdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30sIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VsZWN0aW9uIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGZpbHRlciBiYXJcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYW5ub3RhdGlvbiBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5GaWx0ZXJGYWNldHM7XG5cdGxldCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cblx0Y29uc3QgYUZpZWxkR3JvdXBzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApO1xuXG5cdGlmIChmaWx0ZXJGYWNldHMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJGYWNldHMubGVuZ3RoIDwgMCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiBhRmllbGRHcm91cHMpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwID0ge1xuXHRcdFx0XHQuLi5maWx0ZXJGYWNldE1hcCxcblx0XHRcdFx0Li4uZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhhRmllbGRHcm91cHNbaV0gYXMgQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmlsdGVyRmFjZXRNYXAgPSBmaWx0ZXJGYWNldHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4sIGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldFR5cGVzKSA9PiB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHByZXZpb3VzVmFsdWVbKChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhW2ldIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0XHRncm91cDogZmlsdGVyRmFjZXQ/LklEPy50b1N0cmluZygpLFxuXHRcdFx0XHRcdGdyb3VwTGFiZWw6IGZpbHRlckZhY2V0Py5MYWJlbD8udG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0bGV0IGFTZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtdO1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50ID0gZ2V0U2VsZWN0aW9uVmFyaWFudChlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRhU2VsZWN0T3B0aW9ucyA9IHNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucztcblx0fVxuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBhbGwgcG90ZW50aWFsIGZpbHRlciBmaWVsZHMgYmFzZWQgb24uLi5cblx0Y29uc3QgZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7XG5cdFx0Ly8gLi4ubm9uIGhpZGRlbiBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHlcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIFwiXCIsIGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcywgZmFsc2UsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdC8vIC4uLmFkZGl0aW9uYWwgbWFuaWZlc3QgZGVmaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0KVxuXHR9O1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0Y29uc3QgZGVmYXVsdEZpbHRlcnMgPSBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyhcblx0XHRmaWx0ZXJGaWVsZHMsXG5cdFx0YVNlbGVjdE9wdGlvbnMsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHNcblx0KTtcblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBmaW5hbGx5IGNyZWF0ZSBmaW5hbCBsaXN0IG9mIGZpbHRlciBmaWVsZHMgYnkgYWRkaW5nIHRoZSBTZWxlY3Rpb25GaWVsZHMgZmlyc3QgKG9yZGVyIG1hdHRlcnMpLi4uXG5cdGxldCBhbGxGaWx0ZXJzID0gcGFyYW1ldGVyRmllbGRzXG5cdFx0LmNvbmNhdChcblx0XHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHRcdH0sIFtdKSB8fCBbXVxuXHRcdClcblx0XHQvLyBUbyBhZGQgdGhlIEZpbHRlckZpZWxkIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBTZWxlY3Rpb24gRmllbGRzIGJ1dCB0aGUgcHJvcGVydHkgaXMgbWVudGlvbmVkIGluIHRoZSBTZWxlY3Rpb24gVmFyaWFudFxuXHRcdC5jb25jYXQoZGVmYXVsdEZpbHRlcnMgfHwgW10pXG5cdFx0Ly8gLi4uYW5kIGFkZGluZyByZW1haW5pbmcgZmlsdGVyIGZpZWxkcywgdGhhdCBhcmUgbm90IHVzZWQgaW4gYSBTZWxlY3Rpb25WYXJpYW50IChvcmRlciBkb2Vzbid0IG1hdHRlcilcblx0XHQuY29uY2F0KFxuXHRcdFx0T2JqZWN0LmtleXMoZmlsdGVyRmllbGRzKVxuXHRcdFx0XHQuZmlsdGVyKHByb3BlcnR5UGF0aCA9PiAhKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKVxuXHRcdFx0XHQubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF0sIGZpbHRlckZhY2V0TWFwW3Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblxuXHQvL2lmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgdGFibGVzIFwiYWdncmVnYXRhYmxlXCIgcHJvcGVydGllcyBtdXN0IGJlIGV4Y2x1ZGVkXG5cdGlmIChjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsclRhYmxlcywgc0NvbnRleHRQYXRoKSkge1xuXHRcdC8vIEN1cnJlbnRseSBhbGwgYWdyZWdhdGVzIGFyZSByb290IGVudGl0eSBwcm9wZXJ0aWVzIChubyBwcm9wZXJ0aWVzIGNvbWluZyBmcm9tIG5hdmlnYXRpb24pIGFuZCBhbGxcblx0XHQvLyB0YWJsZXMgd2l0aCBzYW1lIGVudGl0eVNldCBnZXRzIHNhbWUgYWdncmVhZ3RlIGNvbmZpZ3VyYXRpb24gdGhhdCdzIHdoeSB3ZSBjYW4gdXNlIGZpcnN0IHRhYmxlIGludG9cblx0XHQvLyBMUiB0byBnZXQgYWdncmVnYXRlcyAod2l0aG91dCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMgc2luY2Ugd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZmlsdGVyIHRoZW0pLlxuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXMgPSBsclRhYmxlc1swXS5hZ2dyZWdhdGVzO1xuXHRcdGlmIChhZ2dyZWdhdGVzKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZXMpLm1hcChhZ2dyZWdhdGVLZXkgPT4gYWdncmVnYXRlc1thZ2dyZWdhdGVLZXldLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRhbGxGaWx0ZXJzID0gYWxsRmlsdGVycy5maWx0ZXIoZmlsdGVyRmllbGQgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWdncmVnYXRhYmxlUHJvcGVydGllcy5pbmRleE9mKGZpbHRlckZpZWxkLmtleSkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYWxsRmlsdGVycywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIlxuXHR9KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaChmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG4iXX0=
|
|
893
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlQmluZGluZyIsImFubm90YXRpb25FeHByZXNzaW9uIiwiTGFiZWwiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsInF1YWxpZmllciIsImdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsInNlbGVjdGlvblZhcmlhbnRzIiwicmVkdWNlIiwicHJldmlvdXNWYWx1ZSIsInNlbGVjdGlvblZhcmlhbnQiLCJwcm9wZXJ0eU5hbWVzIiwicHJvcGVydHlOYW1lIiwiY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwiLCJsaXN0UmVwb3J0VGFibGVzIiwiY29udGV4dFBhdGgiLCJsZW5ndGgiLCJldmVyeSIsInZpc3VhbGl6YXRpb24iLCJlbmFibGVBbmFseXRpY3MiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsImdldFNlbGVjdGlvblZhcmlhbnRzIiwibHJUYWJsZVZpc3VhbGl6YXRpb25zIiwiY29udmVydGVyQ29udGV4dCIsInNlbGVjdGlvblZhcmlhbnRQYXRocyIsIm1hcCIsInRhYmxlRmlsdGVycyIsImNvbnRyb2wiLCJmaWx0ZXJzIiwidGFibGVTVkNvbmZpZ3MiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJwYXRocyIsImFubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInB1c2giLCJzZWxlY3Rpb25WYXJpYW50Q29uZmlnIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzdkNvbmZpZ3MiLCJjb25jYXQiLCJfZ2V0Q29uZGl0aW9uUGF0aCIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXJ0cyIsInNwbGl0IiwicGFydGlhbFBhdGgiLCJwYXJ0Iiwic2hpZnQiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJpc0NvbGxlY3Rpb24iLCJfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQiLCJmdWxsUHJvcGVydHlQYXRoIiwiaW5jbHVkZUhpZGRlbiIsInVuZGVmaW5lZCIsInRhcmdldFR5cGUiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUiLCJLZXlIZWxwZXIiLCJnZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsImNvbmRpdGlvblBhdGgiLCJhdmFpbGFiaWxpdHkiLCJIaWRkZW5GaWx0ZXIiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsImxhYmVsIiwibmFtZSIsImdldE1vZGVsVHlwZSIsInNUeXBlIiwibURlZmF1bHRUeXBlRm9yRWRtVHlwZSIsIm1vZGVsVHlwZSIsIl9nZXRTZWxlY3Rpb25GaWVsZHMiLCJuYXZpZ2F0aW9uUGF0aCIsInByb3BlcnRpZXMiLCJzZWxlY3Rpb25GaWVsZE1hcCIsImZ1bGxQYXRoIiwic2VsZWN0aW9uRmllbGQiLCJfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoIiwicHJvcGVydHlQYXRocyIsInNlbGVjdGlvbkZpZWxkcyIsImxvY2FsU2VsZWN0aW9uRmllbGRzIiwiZW50aXR5UHJvcGVydGllcyIsImluY2x1ZGVzIiwic3BsaWNlIiwiam9pbiIsIl9nZXRGaWx0ZXJGaWVsZCIsImZpbHRlckZpZWxkcyIsImZpbHRlckZpZWxkIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNSVNTSU5HX1NFTEVDVElPTkZJRUxEIiwiRGVmYXVsdCIsImlzUGFyYW1ldGVyIiwiUmVzdWx0Q29udGV4dCIsIl9nZXREZWZhdWx0RmlsdGVyRmllbGRzIiwiYVNlbGVjdE9wdGlvbnMiLCJleGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMiLCJVSVNlbGVjdGlvbkZpZWxkcyIsIlNlbGVjdGlvbkZpZWxkIiwidmFsdWUiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJzUHJvcGVydHlQYXRoIiwiRmlsdGVyRmllbGQiLCJkZWZhdWx0RmlsdGVyVmFsdWUiLCJGaWx0ZXJEZWZhdWx0VmFsdWUiLCJQcm9wZXJ0eVBhdGgiLCJfZ2V0UGFyYW1ldGVyRmllbGRzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwYXJhbWV0ZXJFbnRpdHlUeXBlIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJpc1BhcmFtZXRlcml6ZWQiLCJwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsInBhcmFtZXRlckZpZWxkcyIsImdldEZpbHRlckJhcmhpZGVCYXNpY1NlYXJjaCIsImNoYXJ0cyIsIm5vU2VhcmNoSW5DaGFydHMiLCJjaGFydCIsImFwcGx5U3VwcG9ydGVkIiwiZW5hYmxlU2VhcmNoIiwibm9TZWFyY2hJblRhYmxlcyIsInRhYmxlIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiZ2V0Q29udGV4dFBhdGgiLCJnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyIsImZiQ29uZmlnIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0RmlsdGVyQ29uZmlndXJhdGlvbiIsImRlZmluZWRGaWx0ZXJGaWVsZHMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleSIsInNLZXkiLCJ0eXBlIiwiU2xvdCIsInZpc3VhbEZpbHRlciIsImdldFZpc3VhbEZpbHRlcnMiLCJ0ZW1wbGF0ZSIsInBvc2l0aW9uIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJzZXR0aW5ncyIsImdldEZpbHRlckZpZWxkIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJzUmVzdHJpY3Rpb24iLCJhUHJvcHMiLCJvUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyIsImRhdGFUeXBlIiwibWF4Q29uZGl0aW9ucyIsImdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbyIsImhpZGRlbkZpbHRlciIsImdldFNlYXJjaFJlc3RyaWN0aW9ucyIsImdldEVudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJzTmF2aWdhdGlvblBhdGgiLCJvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJkaXNwbGF5IiwiY2FzZVNlbnNpdGl2ZSIsIm1lbnUiLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwiYUV4cHJlc3Npb25zIiwiYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5Iiwic29ydCIsImEiLCJiIiwiZGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJUZXh0Iiwib1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiIsIlRleHRBcnJhbmdlbWVudCIsIl9mZXRjaFByb3BlcnR5SW5mbyIsIm9UeXBlQ29uZmlnIiwib1Byb3BlcnR5SW5mbyIsInNBbm5vdGF0aW9uUGF0aCIsInRhcmdldFByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0Zvcm1hdE9wdGlvbnMiLCJmb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhc3NpZ24iLCJpc011bHRpVmFsdWUiLCJiSXNNdWx0aVZhbHVlIiwiZmlsdGVyRXhwcmVzc2lvbiIsImdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJwcm9wZXJ0eUluZm9GaWVsZHMiLCJwcm9jZXNzU2VsZWN0aW9uRmllbGRzIiwiYVR5cGVDb25maWciLCJzZWxlY3Rpb25GaWVsZFR5cGVzIiwiX2ZuVHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInBhcmFtZXRlckZpZWxkIiwicHJvcGVydHlDb252ZXJ0eUNvbnRleHQiLCJwcm9wZXJ0eVRhcmdldE9iamVjdCIsIm9GaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJvUmV0Iiwic0VudGl0eVNldFBhdGgiLCJhUGF0aFBhcnRzIiwib05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsImlzQ2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImFSZXF1aXJlZFByb3BzIiwiYU5vbkZpbHRlcmFibGVQcm9wcyIsImFGZXRjaGVkUHJvcGVydGllcyIsInNGaWx0ZXJGaWVsZEtleSIsIm9Db252ZXJ0ZWRQcm9wZXJ0eSIsInJlcGxhY2UiLCJyZXF1aXJlZCIsIkRyYWZ0Um9vdCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsImhpZGVCYXNpY1NlYXJjaCIsIkJvb2xlYW4iLCJTZWFyY2hhYmxlIiwiaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiZ2V0U2VsZWN0aW9uRmllbGRzIiwib0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImxvY2FsZUNvbXBhcmUiLCJzRmV0Y2hQcm9wZXJ0aWVzIiwic1Byb3BlcnR5SW5mbyIsInByb3BTZWxlY3Rpb25GaWVsZHMiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiZ2V0U2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJkZWZhdWx0RmlsdGVycyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF3Q0tBLGU7O2FBQUFBLGU7QUFBQUEsSUFBQUEsZTtBQUFBQSxJQUFBQSxlO0tBQUFBLGUsS0FBQUEsZTs7QUFLTCxNQUFNQyxVQUFVLEdBQUcsWUFBbkI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsZ0NBQXhCOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVNDLHlCQUFULENBQW1DQyxVQUFuQyxFQUE0RztBQUMzRyxR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QjBELFdBQVcsQ0FBQy9ELEdBQTNDLE1BQW9ELENBQUMsQ0FBNUQ7QUFDQSxTQUZZLENBQWI7QUFHQTtBQUNEOztBQUVELFFBQU11RCxlQUFlLEdBQUc4Syw0QkFBNEIsQ0FBQ3dCLFVBQUQsRUFBYWpQLFVBQWIsRUFBeUJuQixnQkFBekIsQ0FBcEQsQ0F4R00sQ0EwR047O0FBQ0EsUUFBTThOLGVBQWUsR0FBR0Msd0JBQXdCLENBQUMvTixnQkFBRCxDQUFoRDtBQUNBOEQsSUFBQUEsZUFBZSxDQUFDOUYsT0FBaEIsQ0FBd0IsVUFBQXNHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDaUcsYUFBWixHQUE0QnVELGVBQTVCO0FBQ0EsS0FGRDtBQUlBLFdBQU87QUFBRWhLLE1BQUFBLGVBQWUsRUFBZkEsZUFBRjtBQUFtQnVMLE1BQUFBLGFBQWEsRUFBYkE7QUFBbkIsS0FBUDtBQUNBLEdBckhNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFpbGFiaWxpdHlUeXBlLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uLCBGaWx0ZXJTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEFubm90YXRpb25UZXJtLCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBEYXRhRmllbGRUeXBlcywgUmVmZXJlbmNlRmFjZXRUeXBlcywgVUlBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0VGFibGVWaXN1YWxpemF0aW9uLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdGdldFR5cGVDb25maWdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBDaGFydFZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQ2hhcnRcIjtcbmltcG9ydCB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBnZXRWaXN1YWxGaWx0ZXJzLCBWaXN1YWxGaWx0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9WaXN1YWxGaWx0ZXJzXCI7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25UeXBlLCBGaWVsZEdyb3VwVHlwZSwgRmllbGRHcm91cCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbXBpbGVCaW5kaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IGdldFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi4vQ29tbW9uL0RhdGFWaXN1YWxpemF0aW9uXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgSXNzdWVUeXBlLCBJc3N1ZVNldmVyaXR5LCBJc3N1ZUNhdGVnb3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0VkbVwiO1xuLy9pbXBvcnQgeyBoYXNWYWx1ZUhlbHAgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJGaWVsZCA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0dHlwZT86IHN0cmluZztcblx0Y29uZGl0aW9uUGF0aDogc3RyaW5nO1xuXHRhdmFpbGFiaWxpdHk6IEF2YWlsYWJpbGl0eVR5cGU7XG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZT86IHN0cmluZztcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdHNldHRpbmdzPzogRmlsdGVyU2V0dGluZ3M7XG5cdGlzUGFyYW1ldGVyPzogYm9vbGVhbjtcblx0dmlzdWFsRmlsdGVyPzogVmlzdWFsRmlsdGVycztcblx0Y2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpbHRlckdyb3VwID0ge1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcbn07XG5cbmVudW0gZmlsdGVyRmllbGRUeXBlIHtcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRTbG90ID0gXCJTbG90XCJcbn1cblxuY29uc3Qgc0VkbVN0cmluZyA9IFwiRWRtLlN0cmluZ1wiO1xuY29uc3Qgc1N0cmluZ0RhdGFUeXBlID0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkID0gQ3VzdG9tRWxlbWVudDxGaWx0ZXJGaWVsZD47XG5cbi8qKlxuICogRW50ZXIgYWxsIERhdGFGaWVsZHMgb2YgYSBnaXZlbiBGaWVsZEdyb3VwIGludG8gdGhlIGZpbHRlckZhY2V0TWFwLlxuICpcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+fSBmaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+fSBUaGUgbWFwIG9mIGZhY2V0cyBmb3IgdGhlIGdpdmVuIEZpZWxkR3JvdXBcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhmaWVsZEdyb3VwOiBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4ge1xuXHRjb25zdCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cdGZpZWxkR3JvdXAuRGF0YS5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcFtkYXRhRmllbGQuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdGdyb3VwOiBmaWVsZEdyb3VwLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDpcblx0XHRcdFx0XHRjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5IHNldCBhcmUgY29uZmlndXJlZCBhcyBhbmFseXRpY2FsIHRhYmxlLlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBMaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59IElzIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaGlkZGVuIG9yIG5vdFxuICovXG5mdW5jdGlvbiBjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udGV4dFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY29udGV4dFBhdGggJiYgbGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRyZXR1cm4gdmlzdWFsaXphdGlvbi5lbmFibGVBbmFseXRpY3MgJiYgY29udGV4dFBhdGggPT09IHZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5jb2xsZWN0aW9uO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudHMoXG5cdGxyVGFibGVWaXN1YWxpemF0aW9uczogVGFibGVWaXN1YWxpemF0aW9uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10ge1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdHJldHVybiBsclRhYmxlVmlzdWFsaXphdGlvbnNcblx0XHQubWFwKHZpc3VhbGl6YXRpb24gPT4ge1xuXHRcdFx0Y29uc3QgdGFibGVGaWx0ZXJzID0gdmlzdWFsaXphdGlvbi5jb250cm9sLmZpbHRlcnM7XG5cdFx0XHRjb25zdCB0YWJsZVNWQ29uZmlnczogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGFibGVGaWx0ZXJzKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRhYmxlRmlsdGVyc1trZXldLnBhdGhzKSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhdGhzID0gdGFibGVGaWx0ZXJzW2tleV0ucGF0aHM7XG5cdFx0XHRcdFx0cGF0aHMuZm9yRWFjaChwYXRoID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguYW5ub3RhdGlvblBhdGggJiYgc2VsZWN0aW9uVmFyaWFudFBhdGhzLmluZGV4T2YocGF0aC5hbm5vdGF0aW9uUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnRQYXRocy5wdXNoKHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb25WYXJpYW50Q29uZmlnID0gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24ocGF0aC5hbm5vdGF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGVTVkNvbmZpZ3MucHVzaChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFibGVTVkNvbmZpZ3M7XG5cdFx0fSlcblx0XHQucmVkdWNlKChzdkNvbmZpZ3MsIHNlbGVjdGlvblZhcmlhbnQpID0+IHN2Q29uZmlncy5jb25jYXQoc2VsZWN0aW9uVmFyaWFudCksIFtdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gcGF0aCByZXF1aXJlZCBmb3IgdGhlIGNvbmRpdGlvbiBtb2RlbC4gSXQgbG9va3MgYXMgZm9sbG93czpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlwZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IHBhcnRpYWxQYXRoICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBrZXkgKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5jb25zdCBfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgdGFyZ2V0RW50aXR5VHlwZS5uYW1lKVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbFR5cGUoc1R5cGU6IGFueSkge1xuXHR0eXBlIGRlZmF1bHRNb2RlbFR5cGUgPSB7XG5cdFx0W2tleTogc3RyaW5nXToge1xuXHRcdFx0W2tleTogc3RyaW5nXTogc3RyaW5nO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IG1EZWZhdWx0VHlwZUZvckVkbVR5cGU6IGRlZmF1bHRNb2RlbFR5cGUgPSB7XG5cdFx0XCJFZG0uQm9vbGVhblwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiQm9vbFwiXG5cdFx0fSxcblx0XHRcIkVkbS5CeXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlVGltZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlVGltZU9mZnNldFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGF0ZVRpbWVPZmZzZXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGVjaW1hbFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRGVjaW1hbFwiXG5cdFx0fSxcblx0XHRcIkVkbS5Eb3VibGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkZsb2F0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5HdWlkXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJHdWlkXCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDE2XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50MzJcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQ2NFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLlNCeXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU2luZ2xlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TdHJpbmdcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlN0cmluZ1wiXG5cdFx0fSxcblx0XHRcIkVkbS5UaW1lXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJUaW1lT2ZEYXlcIlxuXHRcdH0sXG5cdFx0XCJFZG0uVGltZU9mRGF5XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJUaW1lT2ZEYXlcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU3RyZWFtXCI6IHtcblx0XHRcdC8vbm8gY29ycmVzcG9uZGluZyBtb2RlbFR5cGUgLSBpZ25vcmUgZm9yIGZpbHRlcmluZ1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHNUeXBlICYmIHNUeXBlIGluIG1EZWZhdWx0VHlwZUZvckVkbVR5cGUgJiYgbURlZmF1bHRUeXBlRm9yRWRtVHlwZVtzVHlwZV0ubW9kZWxUeXBlO1xufVxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eVBhdGhzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRsZXQgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnR5UGF0aHMpIHtcblx0XHRwcm9wZXJ0eVBhdGhzLmZvckVhY2goKHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYWxTZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPjtcblxuXHRcdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0aWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkudGFyZ2V0VHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5LnRhcmdldFR5cGUuX3R5cGUgPT09IFwiQ29tcGxleFR5cGVcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpPy5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1JU1NJTkdfU0VMRUNUSU9ORklFTEQpO1xuXHR9XG5cdC8vIGRlZmluZWQgU2VsZWN0aW9uRmllbGRzIGFyZSBhdmFpbGFibGUgYnkgZGVmYXVsdFxuXHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgPSBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQ7XG5cdFx0ZmlsdGVyRmllbGQuaXNQYXJhbWV0ZXIgPSAhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGQ7XG59O1xuXG5jb25zdCBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPixcblx0YVNlbGVjdE9wdGlvbnM6IGFueVtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IFByb3BlcnR5UGF0aFtdXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gW107XG5cdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Ly8gVXNpbmcgZW50aXR5VHlwZSBpbnN0ZWFkIG9mIGVudGl0eVNldFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goU2VsZWN0aW9uRmllbGQgPT4ge1xuXHRcdFVJU2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdH0pO1xuXHRpZiAoYVNlbGVjdE9wdGlvbnMgJiYgYVNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdGFTZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHByb3BlcnR5TmFtZS52YWx1ZTtcblx0XHRcdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0XHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0XHRcdFVJU2VsZWN0aW9uRmllbGRzW1NlbGVjdGlvbkZpZWxkLnZhbHVlXSA9IHRydWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHNQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgZGVmYXVsdEZpbHRlclZhbHVlID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRmlsdGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0Y29uc3QgUHJvcGVydHlQYXRoID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGlmICghKFByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmIChkZWZhdWx0RmlsdGVyVmFsdWUgJiYgIShQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzO1xufTtcblxuLyoqXG4gKiBHZXQgYWxsIHBhcmFtZXRlciBmaWx0ZXIgZmllbGRzIGluIGNhc2Ugb2YgYSBwYXJhbWV0ZXJpemVkIHNlcnZpY2UuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtGaWx0ZXJGaWVsZFtdfSBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgZmlsdGVyZmllbGRzXG4gKi9cbmZ1bmN0aW9uIF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHBhcmFtZXRlckVudGl0eVR5cGUgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRjb25zdCBwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0ID1cblx0XHRpc1BhcmFtZXRlcml6ZWQgJiYgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsgZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lKTtcblxuXHRjb25zdCBwYXJhbWV0ZXJGaWVsZHMgPSAocGFyYW1ldGVyQ29udmVydGVyQ29udGV4dFxuXHRcdD8gcGFyYW1ldGVyRW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9IGFzIFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiwgcHJvcGVydHkubmFtZSwgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCwgcGFyYW1ldGVyRW50aXR5VHlwZSk7XG5cdFx0ICB9KVxuXHRcdDogW10pIGFzIEZpbHRlckZpZWxkW107XG5cblx0cmV0dXJuIHBhcmFtZXRlckZpZWxkcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGlzIGhpZGRlbiBvciBub3QuXG4gKlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBUaGUgbGlzdCByZXBvcnQgdGFibGVzXG4gKiBAcGFyYW0ge0NoYXJ0VmlzdWFsaXphdGlvbltdfSBjaGFydHMgVGhlIEFMUCBjaGFydHNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgaW5mb3JtYXRpb24gaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoID0gZnVuY3Rpb24oXG5cdGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjaGFydHM6IENoYXJ0VmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgaWYgY2hhcnRzIGFsbG93IHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluQ2hhcnRzID0gY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuZXZlcnkoY2hhcnQgPT4gIWNoYXJ0LmFwcGx5U3VwcG9ydGVkLmVuYWJsZVNlYXJjaCk7XG5cblx0Ly8gQ2hlY2sgaWYgYWxsIHRhYmxlcyBhcmUgYW5hbHl0aWNhbCBhbmQgbm9uZSBvZiB0aGVtIGFsbG93IGZvciBzZWFyY2hcblx0Y29uc3Qgbm9TZWFyY2hJblRhYmxlcyA9XG5cdFx0bGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPT09IDAgfHwgbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh0YWJsZSA9PiB0YWJsZS5lbmFibGVBbmFseXRpY3MgJiYgIXRhYmxlLmVuYWJsZUFuYWx5dGljc1NlYXJjaCk7XG5cblx0Y29uc3QgY29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBub1NlYXJjaEluQ2hhcnRzICYmIG5vU2VhcmNoSW5UYWJsZXMpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGZpbHRlciBmaWVsZHMgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5VHlwZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPn0gVGhlIGZpbHRlciBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBmYkNvbmZpZzogRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmluZWRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPiA9IGZiQ29uZmlnPy5maWx0ZXJGaWVsZHMgfHwge307XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRlbnRpdHlUeXBlLFxuXHRcdE9iamVjdC5rZXlzKGRlZmluZWRGaWx0ZXJGaWVsZHMpLm1hcChrZXkgPT4gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoa2V5KSksXG5cdFx0dHJ1ZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdCk7XG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBkZWZpbmVkRmlsdGVyRmllbGRzKSB7XG5cdFx0Y29uc3QgZmlsdGVyRmllbGQgPSBkZWZpbmVkRmlsdGVyRmllbGRzW3NLZXldO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KHNLZXkpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzW3Byb3BlcnR5TmFtZV07XG5cdFx0Y29uc3QgdHlwZSA9IGZpbHRlckZpZWxkLnR5cGUgPT09IFwiU2xvdFwiID8gZmlsdGVyRmllbGRUeXBlLlNsb3QgOiBmaWx0ZXJGaWVsZFR5cGUuRGVmYXVsdDtcblx0XHRjb25zdCB2aXN1YWxGaWx0ZXIgPVxuXHRcdFx0ZmlsdGVyRmllbGQgJiYgZmlsdGVyRmllbGQ/LnZpc3VhbEZpbHRlclxuXHRcdFx0XHQ/IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRjb25kaXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uY29uZGl0aW9uUGF0aCB8fCBwcm9wZXJ0eU5hbWUsXG5cdFx0XHR0ZW1wbGF0ZTogZmlsdGVyRmllbGQudGVtcGxhdGUsXG5cdFx0XHRsYWJlbDogZmlsdGVyRmllbGQubGFiZWwsXG5cdFx0XHRwb3NpdGlvbjogZmlsdGVyRmllbGQucG9zaXRpb24gfHwgeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5BZnRlciB9LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgfHwgQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0LFxuXHRcdFx0c2V0dGluZ3M6IGZpbHRlckZpZWxkLnNldHRpbmdzLFxuXHRcdFx0dmlzdWFsRmlsdGVyOiB2aXN1YWxGaWx0ZXJcblx0XHR9O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xuXHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9LCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlclJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uOiBhbnksIHNSZXN0cmljdGlvbjogYW55KSB7XG5cdGlmIChzUmVzdHJpY3Rpb24gPT09IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfHwgc1Jlc3RyaWN0aW9uID09PSBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHtcblx0XHRsZXQgYVByb3BzID0gW107XG5cdFx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0pIHtcblx0XHRcdGFQcm9wcyA9IG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0ubWFwKGZ1bmN0aW9uKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUHJvcGVydHkuJFByb3BlcnR5UGF0aCB8fCBvUHJvcGVydHkudmFsdWU7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQcm9wcztcblx0fSBlbHNlIGlmIChzUmVzdHJpY3Rpb24gPT09IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHtcblx0XHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zID0ge30gYXMgYW55O1xuXHRcdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0XHRpZiAobUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdKSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdLnB1c2gob1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnNdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uO1xufTtcblxuY29uc3QgZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkc2VhcmNoXCIsXG5cdFx0cGF0aDogXCIkc2VhcmNoXCIsXG5cdFx0ZGF0YVR5cGU6IHNTdHJpbmdEYXRhVHlwZSxcblx0XHRtYXhDb25kaXRpb25zOiAxXG5cdH07XG59O1xuXG5jb25zdCBnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcIiRlZGl0U3RhdGVcIixcblx0XHRwYXRoOiBcIiRlZGl0U3RhdGVcIixcblx0XHRncm91cExhYmVsOiBcIlwiLFxuXHRcdGdyb3VwOiBcIlwiLFxuXHRcdGRhdGFUeXBlOiBzU3RyaW5nRGF0YVR5cGUsXG5cdFx0aGlkZGVuRmlsdGVyOiBmYWxzZVxuXHR9O1xufTtcblxuY29uc3QgZ2V0U2VhcmNoUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uU2VhcmNoUmVzdHJpY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBmdW5jdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGg6IHN0cmluZykge1xuXHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9uczogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuUmVzdHJpY3RlZFByb3BlcnRpZXM7XG5cdHJldHVybiAoXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzICYmXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24ob1Jlc3RyaWN0ZWRQcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5ICYmXG5cdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5ICYmXG5cdFx0XHRcdChvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gc05hdmlnYXRpb25QYXRoIHx8XG5cdFx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkudmFsdWUgPT09IHNOYXZpZ2F0aW9uUGF0aClcblx0XHRcdCk7XG5cdFx0fSlcblx0KTtcbn07XG5cbmNvbnN0IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvID0gZnVuY3Rpb24ob0ZpbHRlckZpZWxkSW5mbzogYW55KSB7XG5cdHJldHVybiB7XG5cdFx0a2V5OiBvRmlsdGVyRmllbGRJbmZvLmtleSxcblx0XHRhbm5vdGF0aW9uUGF0aDogb0ZpbHRlckZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aCxcblx0XHRjb25kaXRpb25QYXRoOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0bmFtZTogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdGxhYmVsOiBvRmlsdGVyRmllbGRJbmZvLmxhYmVsLFxuXHRcdGhpZGRlbkZpbHRlcjogb0ZpbHRlckZpZWxkSW5mby5hdmFpbGFiaWxpdHkgPT09IFwiSGlkZGVuXCIsXG5cdFx0ZGlzcGxheTogXCJWYWx1ZVwiLFxuXHRcdGlzUGFyYW1ldGVyOiBvRmlsdGVyRmllbGRJbmZvLmlzUGFyYW1ldGVyLFxuXHRcdGNhc2VTZW5zaXRpdmU6IG9GaWx0ZXJGaWVsZEluZm8uY2FzZVNlbnNpdGl2ZSxcblx0XHRhdmFpbGFiaWxpdHk6IG9GaWx0ZXJGaWVsZEluZm8uYXZhaWxhYmlsaXR5LFxuXHRcdHBvc2l0aW9uOiBvRmlsdGVyRmllbGRJbmZvLnBvc2l0aW9uLFxuXHRcdHR5cGU6IG9GaWx0ZXJGaWVsZEluZm8udHlwZSxcblx0XHR0ZW1wbGF0ZTogb0ZpbHRlckZpZWxkSW5mby50ZW1wbGF0ZSxcblx0XHRtZW51OiBvRmlsdGVyRmllbGRJbmZvLm1lbnVcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uID0gZnVuY3Rpb24oYUV4cHJlc3Npb25zOiBhbnkpIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gW1xuXHRcdFwiU2luZ2xlVmFsdWVcIixcblx0XHRcIk11bHRpVmFsdWVcIixcblx0XHRcIlNpbmdsZVJhbmdlXCIsXG5cdFx0XCJNdWx0aVJhbmdlXCIsXG5cdFx0XCJTZWFyY2hFeHByZXNzaW9uXCIsXG5cdFx0XCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCJcblx0XTtcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbihhOiBhbnksIGI6IGFueSkge1xuXHRcdHJldHVybiBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihhKSAtIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGIpO1xuXHR9KTtcblxuXHRyZXR1cm4gYUV4cHJlc3Npb25zWzBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BsYXlNb2RlID0gZnVuY3Rpb24ob1Byb3BlcnR5QW5ub3RhdGlvbnM6IGFueSwgb0NvbGxlY3Rpb25Bbm5vdGF0aW9uczogYW55KSB7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zPy5Db21tb24/LlRleHQsXG5cdFx0b1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiA9XG5cdFx0XHRvVGV4dEFubm90YXRpb24gJiZcblx0XHRcdCgob1Byb3BlcnR5QW5ub3RhdGlvbnMgJiYgb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHx8XG5cdFx0XHRcdChvQ29sbGVjdGlvbkFubm90YXRpb25zICYmIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpKTtcblxuXHRpZiAob1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbikge1xuXHRcdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHJldHVybiBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9XG5cdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25WYWx1ZVwiOyAvL1RleHRGaXJzdFxuXHR9XG5cdHJldHVybiBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcbn07XG5cbmNvbnN0IF9mZXRjaFByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG9GaWx0ZXJGaWVsZEluZm86IGFueSwgb1R5cGVDb25maWc6IGFueSkge1xuXHRsZXQgb1Byb3BlcnR5SW5mbyA9IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvKG9GaWx0ZXJGaWVsZEluZm8pO1xuXHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoO1xuXG5cdGlmICghc0Fubm90YXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG5cdH1cblx0Y29uc3QgdGFyZ2V0UHJvcGVydHlPYmplY3QgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3Ioc0Fubm90YXRpb25QYXRoKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eUFubm90YXRpb25zID0gdGFyZ2V0UHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zO1xuXHRjb25zdCBvQ29sbGVjdGlvbkFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM7XG5cblx0Y29uc3Qgb0Zvcm1hdE9wdGlvbnMgPSBvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zO1xuXHRjb25zdCBvQ29uc3RyYWludHMgPSBvVHlwZUNvbmZpZy5jb25zdHJhaW50cztcblx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zLFxuXHRcdGNvbnN0cmFpbnRzOiBvQ29uc3RyYWludHMsXG5cdFx0ZGlzcGxheTogZGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnMsIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMpXG5cdH0pO1xuXHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcbn07XG5cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWUgPSBmdW5jdGlvbihvUHJvcGVydHk6IGFueSkge1xuXHRsZXQgYklzTXVsdGlWYWx1ZSA9IHRydWU7XG5cdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0c3dpdGNoIChvUHJvcGVydHkuZmlsdGVyRXhwcmVzc2lvbikge1xuXHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS50eXBlICYmIG9Qcm9wZXJ0eS50eXBlLmluZGV4T2YoXCJCb29sZWFuXCIpID4gMCkge1xuXHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gYklzTXVsdGlWYWx1ZTtcbn07XG5cbmNvbnN0IGdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSA9IGZ1bmN0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRsclRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10gPSBbXSxcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZyA9IFwiXCJcbikge1xuXHQvLyBGZXRjaCBhbGwgc2VsZWN0aW9uVmFyaWFudHMgZGVmaW5lZCBpbiB0aGUgZGlmZmVyZW50IHZpc3VhbGl6YXRpb25zIGFuZCBkaWZmZXJlbnQgdmlld3MgKG11bHRpIHRhYmxlIG1vZGUpXG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gZ2V0U2VsZWN0aW9uVmFyaWFudHMobHJUYWJsZXMsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gc2VsZWN0aW9uIHZhcmlhbnRzXG5cdGNvbnN0IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHMpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGZhbHNlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdClcblx0fTtcblxuXHRjb25zdCBwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSA9XG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5yZWR1Y2UoKHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSwgc2VsZWN0aW9uRmllbGQpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwTGFiZWwgPSBcIlwiO1xuXHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHR9LCBbXSkgfHwgW107XG5cblx0cmV0dXJuIHtcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzLFxuXHRcdGZpbHRlckZpZWxkczogZmlsdGVyRmllbGRzLFxuXHRcdHByb3BlcnR5SW5mb0ZpZWxkczogcHJvcGVydHlJbmZvRmllbGRzXG5cdH07XG59O1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHQvL2dldCBUeXBlQ29uZmlnIGZ1bmN0aW9uXG5cdGNvbnN0IGFUeXBlQ29uZmlnOiBhbnkgPSBbXTtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRUeXBlczogYW55ID0gW107XG5cdGNvbnN0IF9mblR5cGVDb25maWcgPSBmdW5jdGlvbihwcm9wZXJ0eTogUHJvcGVydHkpIHtcblx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIHVuZGVmaW5lZCk7XG5cdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHByb3BlcnR5Py50eXBlKTtcblx0XHRpZiAocHJvcGVydHk/LnR5cGUgPT09IHNFZG1TdHJpbmcgJiYgKCFvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSB8fCBvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gdHJ1ZSkpIHtcblx0XHRcdG9UeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMucGFyc2VLZWVwc0VtcHR5U3RyaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdGFUeXBlQ29uZmlnLnB1c2gob1R5cGVDb25maWcpO1xuXHR9O1xuXG5cdC8vYWRkIHR5cGVDb25maWdcblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24ocGFyYW1ldGVyRmllbGQ6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlDb252ZXJ0eUNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUYXJnZXRPYmplY3QgPSBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXHRcdFx0X2ZuVHlwZUNvbmZpZyhwcm9wZXJ0eVRhcmdldE9iamVjdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChzRWRtU3RyaW5nKTtcblx0XHRcdGFUeXBlQ29uZmlnLnB1c2goeyB0eXBlOiBzU3RyaW5nRGF0YVR5cGUgfSk7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBmaWx0ZXJSZXN0cmljdGlvbnNcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3Qgb1JldCA9IHt9IGFzIGFueTtcblx0b1JldFtcIlJlcXVpcmVkUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0b1JldFtcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge307XG5cblx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IGFQYXRoUGFydHMgPSBzRW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIik7XG5cdGlmIChhUGF0aFBhcnRzLmxlbmd0aCA+IDIpIHtcblx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBhUGF0aFBhcnRzW2FQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0YVBhdGhQYXJ0cy5zcGxpY2UoLTEsIDEpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10pO1xuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge1xuXHRcdFx0Li4uKGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge30pLFxuXHRcdFx0Li4ub1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcblx0XHR9O1xuXHR9XG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcHMgPSBvUmV0LlJlcXVpcmVkUHJvcGVydGllcztcblx0Y29uc3QgYU5vbkZpbHRlcmFibGVQcm9wcyA9IG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM7XG5cdGxldCBvUHJvcGVydHlJbmZvO1xuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXM6IGFueSA9IFtdO1xuXG5cdC8vIHByb2Nlc3MgdGhlIGZpZWxkcyB0byBhZGQgbmVjZXNzYXJ5IHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMocHJvcGVydHlJbmZvRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNGaWx0ZXJGaWVsZEtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnZlcnRlZFByb3BlcnR5ID0gcHJvcGVydHlJbmZvRmllbGRzW3NGaWx0ZXJGaWVsZEtleV07XG5cdFx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdFx0aWYgKG9Db252ZXJ0ZWRQcm9wZXJ0eS5jb25kaXRpb25QYXRoKSB7XG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0NvbnZlcnRlZFByb3BlcnR5LmNvbmRpdGlvblBhdGgucmVwbGFjZSgvXFwrfFxcKi9nLCBcIlwiKTtcblx0XHR9XG5cdFx0aWYgKGFOb25GaWx0ZXJhYmxlUHJvcHMuaW5kZXhPZihzUHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBfZmV0Y2hQcm9wZXJ0eUluZm8oY29udmVydGVyQ29udGV4dCwgb0NvbnZlcnRlZFByb3BlcnR5LCBhVHlwZUNvbmZpZ1tzRmlsdGVyRmllbGRLZXldKTtcblx0XHRcdGlmIChvUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBPYmplY3QuYXNzaWduKG9Qcm9wZXJ0eUluZm8sIHtcblx0XHRcdFx0XHRtYXhDb25kaXRpb25zOiAhb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciAmJiBpc011bHRpVmFsdWUob1Byb3BlcnR5SW5mbykgPyAtMSA6IDEsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IG9Qcm9wZXJ0eUluZm8uaXNQYXJhbWV0ZXIgfHwgYVJlcXVpcmVkUHJvcHMuaW5kZXhPZihzUHJvcGVydHlQYXRoKSA+PSAwLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzQ2FzZVNlbnNpdGl2ZSxcblx0XHRcdFx0XHRkYXRhVHlwZTogc2VsZWN0aW9uRmllbGRUeXBlc1tzRmlsdGVyRmllbGRLZXldXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly9hZGQgZWRpdFxuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdH1cblx0Ly8gYWRkIHNlYXJjaFxuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGlmIChzRW50aXR5U2V0UGF0aCAmJiBoaWRlQmFzaWNTZWFyY2ggIT09IHRydWUpIHtcblx0XHRpZiAoIXNlYXJjaFJlc3RyaWN0aW9ucyB8fCBzZWFyY2hSZXN0cmljdGlvbnM/LlNlYXJjaGFibGUpIHtcblx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKGdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbygpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYUZldGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pIHtcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGZpbHRlckZpZWxkcywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHR5cGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0cG9zaXRpb246IFwib3ZlcndyaXRlXCIsXG5cdFx0dGVtcGxhdGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0dmlzdWFsRmlsdGVyOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pOiBhbnkge1xuXHRjb25zdCBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhID0gZ2V0QW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhKGNvbnZlcnRlckNvbnRleHQsIGxyVGFibGVzLCBhbm5vdGF0aW9uUGF0aCk7XG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dCk7XG5cdGxldCBwcm9wZXJ0eUluZm9GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEucHJvcGVydHlJbmZvRmllbGRzKSk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmVudGl0eVR5cGU7XG5cblx0cHJvcGVydHlJbmZvRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wZXJ0eUluZm9GaWVsZHMpO1xuXG5cdHByb3BlcnR5SW5mb0ZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMocHJvcGVydHlJbmZvRmllbGRzLCBlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXMgPSBwcm9jZXNzU2VsZWN0aW9uRmllbGRzKHByb3BlcnR5SW5mb0ZpZWxkcywgY29udmVydGVyQ29udGV4dCk7XG5cdGFGZXRjaGVkUHJvcGVydGllcy5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0aWYgKGEuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGEuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRpZiAoYi5ncm91cExhYmVsID09PSB1bmRlZmluZWQgfHwgYi5ncm91cExhYmVsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0cmV0dXJuIGEuZ3JvdXBMYWJlbC5sb2NhbGVDb21wYXJlKGIuZ3JvdXBMYWJlbCk7XG5cdH0pO1xuXG5cdGxldCBzRmV0Y2hQcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkoYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0c0ZldGNoUHJvcGVydGllcyA9IHNGZXRjaFByb3BlcnRpZXMucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIik7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcfS9nLCBcIlxcXFx9XCIpO1xuXHRjb25zdCBzUHJvcGVydHlJbmZvID0gc0ZldGNoUHJvcGVydGllcztcblx0Ly8gZW5kIG9mIHByb3BlcnR5RmllbGRzIHByb2Nlc3NpbmdcblxuXHQvLyB0byBwb3B1bGF0ZSBzZWxlY3Rpb24gZmllbGRzXG5cdGxldCBwcm9wU2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRwcm9wU2VsZWN0aW9uRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wU2VsZWN0aW9uRmllbGRzKTtcblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0bGV0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblxuXHRjb25zdCBhRmllbGRHcm91cHMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCk7XG5cblx0aWYgKGZpbHRlckZhY2V0cyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckZhY2V0cy5sZW5ndGggPCAwKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFGaWVsZEdyb3Vwcykge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXAgPSB7XG5cdFx0XHRcdC4uLmZpbHRlckZhY2V0TWFwLFxuXHRcdFx0XHQuLi5nZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGFGaWVsZEdyb3Vwc1tpXSBhcyBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGYWNldE1hcCA9IGZpbHRlckZhY2V0cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiwgZmlsdGVyRmFjZXQ6IFJlZmVyZW5jZUZhY2V0VHlwZXMpID0+IHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cHJldmlvdXNWYWx1ZVsoKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFbaV0gYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRcdGdyb3VwOiBmaWx0ZXJGYWNldD8uSUQ/LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0Z3JvdXBMYWJlbDogZmlsdGVyRmFjZXQ/LkxhYmVsPy50b1N0cmluZygpXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHR9LCB7fSk7XG5cdH1cblxuXHRsZXQgYVNlbGVjdE9wdGlvbnM6IGFueVtdID0gW107XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnQgPSBnZXRTZWxlY3Rpb25WYXJpYW50KGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zO1xuXHR9XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZmlsdGVyRmllbGRzO1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzO1xuXHRjb25zdCBkZWZhdWx0RmlsdGVycyA9IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzKFxuXHRcdGZpbHRlckZpZWxkcyxcblx0XHRhU2VsZWN0T3B0aW9ucyxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkc1xuXHQpO1xuXG5cdC8vIGZpbmFsbHkgY3JlYXRlIGZpbmFsIGxpc3Qgb2YgZmlsdGVyIGZpZWxkcyBieSBhZGRpbmcgdGhlIFNlbGVjdGlvbkZpZWxkcyBmaXJzdCAob3JkZXIgbWF0dGVycykuLi5cblx0bGV0IGFsbEZpbHRlcnMgPSBwcm9wU2VsZWN0aW9uRmllbGRzXG5cdFx0Ly8gVG8gYWRkIHRoZSBGaWx0ZXJGaWVsZCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgU2VsZWN0aW9uIEZpZWxkcyBidXQgdGhlIHByb3BlcnR5IGlzIG1lbnRpb25lZCBpbiB0aGUgU2VsZWN0aW9uIFZhcmlhbnRcblx0XHQuY29uY2F0KGRlZmF1bHRGaWx0ZXJzIHx8IFtdKVxuXHRcdC8vIC4uLmFuZCBhZGRpbmcgcmVtYWluaW5nIGZpbHRlciBmaWVsZHMsIHRoYXQgYXJlIG5vdCB1c2VkIGluIGEgU2VsZWN0aW9uVmFyaWFudCAob3JkZXIgZG9lc24ndCBtYXR0ZXIpXG5cdFx0LmNvbmNhdChcblx0XHRcdE9iamVjdC5rZXlzKGZpbHRlckZpZWxkcylcblx0XHRcdFx0LmZpbHRlcihwcm9wZXJ0eVBhdGggPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdLCBmaWx0ZXJGYWNldE1hcFtwcm9wZXJ0eVBhdGhdKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRjb25zdCBzQ29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cblx0Ly9pZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIHRhYmxlcyBcImFnZ3JlZ2F0YWJsZVwiIHByb3BlcnRpZXMgbXVzdCBiZSBleGNsdWRlZFxuXHRpZiAoY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobHJUYWJsZXMsIHNDb250ZXh0UGF0aCkpIHtcblx0XHQvLyBDdXJyZW50bHkgYWxsIGFncmVnYXRlcyBhcmUgcm9vdCBlbnRpdHkgcHJvcGVydGllcyAobm8gcHJvcGVydGllcyBjb21pbmcgZnJvbSBuYXZpZ2F0aW9uKSBhbmQgYWxsXG5cdFx0Ly8gdGFibGVzIHdpdGggc2FtZSBlbnRpdHlTZXQgZ2V0cyBzYW1lIGFnZ3JlYWd0ZSBjb25maWd1cmF0aW9uIHRoYXQncyB3aHkgd2UgY2FuIHVzZSBmaXJzdCB0YWJsZSBpbnRvXG5cdFx0Ly8gTFIgdG8gZ2V0IGFnZ3JlZ2F0ZXMgKHdpdGhvdXQgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzIHNpbmNlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGVtKS5cblx0XHRjb25zdCBhZ2dyZWdhdGVzID0gbHJUYWJsZXNbMF0uYWdncmVnYXRlcztcblx0XHRpZiAoYWdncmVnYXRlcykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhZ2dyZWdhdGVzKS5tYXAoYWdncmVnYXRlS2V5ID0+IGFnZ3JlZ2F0ZXNbYWdncmVnYXRlS2V5XS5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0YWxsRmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKGZpbHRlckZpZWxkID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMoYWxsRmlsdGVycywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gQWRkIGNhc2VTZW5zaXRpdmUgcHJvcGVydHkgdG8gYWxsIHNlbGVjdGlvbiBmaWVsZHMuXG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0c2VsZWN0aW9uRmllbGRzLmZvckVhY2goZmlsdGVyRmllbGQgPT4ge1xuXHRcdGZpbHRlckZpZWxkLmNhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7XG5cdH0pO1xuXG5cdHJldHVybiB7IHNlbGVjdGlvbkZpZWxkcywgc1Byb3BlcnR5SW5mbyB9O1xufTtcbiJdfQ==
|