@sapui5/sap.fe.core 1.98.0 → 1.99.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 +3 -2
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +377 -405
- package/src/sap/fe/core/AnnotationHelper.ts +385 -0
- package/src/sap/fe/core/AppComponent.js +3 -2
- package/src/sap/fe/core/AppStateHandler.js +229 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +3 -2
- 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 +2073 -2399
- package/src/sap/fe/core/CommonUtils.ts +2078 -0
- package/src/sap/fe/core/ExtensionAPI.js +3 -2
- package/src/sap/fe/core/PageController.js +84 -125
- package/src/sap/fe/core/PageController.ts +101 -0
- package/src/sap/fe/core/RouterProxy.js +986 -823
- package/src/sap/fe/core/RouterProxy.ts +838 -0
- package/src/sap/fe/core/Synchronization.js +51 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -164
- package/src/sap/fe/core/TemplateComponent.ts +166 -0
- package/src/sap/fe/core/TemplateModel.js +97 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1576 -1664
- package/src/sap/fe/core/TransactionHelper.ts +1706 -0
- package/src/sap/fe/core/actions/draft.js +559 -608
- package/src/sap/fe/core/actions/draft.ts +593 -0
- package/src/sap/fe/core/actions/messageHandling.js +545 -514
- package/src/sap/fe/core/actions/messageHandling.ts +532 -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 +1074 -1215
- package/src/sap/fe/core/actions/operations.ts +1162 -0
- package/src/sap/fe/core/actions/sticky.js +102 -105
- package/src/sap/fe/core/actions/sticky.ts +102 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +54 -211
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +47 -45
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
- package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
- package/src/sap/fe/core/controls/CommandExecution.js +3 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
- package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
- package/src/sap/fe/core/controls/FilterBar.js +3 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
- package/src/sap/fe/core/converters/ConverterContext.js +2 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
- package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
- package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
- package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -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 +4 -2
- package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
- package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
- package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- 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 +39 -28
- package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
- package/src/sap/fe/core/fpm/Component.js +3 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
- package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
- package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
- package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
- package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -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 +3 -4
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
- package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
- package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +227 -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 +332 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -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 +4 -3
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
- package/src/sap/fe/core/messagebundle.properties +23 -10
- package/src/sap/fe/core/messagebundle_ar.properties +9 -0
- package/src/sap/fe/core/messagebundle_bg.properties +9 -0
- package/src/sap/fe/core/messagebundle_ca.properties +9 -0
- package/src/sap/fe/core/messagebundle_cs.properties +10 -1
- package/src/sap/fe/core/messagebundle_cy.properties +9 -0
- package/src/sap/fe/core/messagebundle_da.properties +9 -0
- package/src/sap/fe/core/messagebundle_de.properties +9 -0
- package/src/sap/fe/core/messagebundle_el.properties +9 -0
- package/src/sap/fe/core/messagebundle_en.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
- package/src/sap/fe/core/messagebundle_es.properties +9 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
- package/src/sap/fe/core/messagebundle_et.properties +9 -0
- package/src/sap/fe/core/messagebundle_fi.properties +9 -0
- package/src/sap/fe/core/messagebundle_fr.properties +13 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
- package/src/sap/fe/core/messagebundle_hi.properties +15 -6
- package/src/sap/fe/core/messagebundle_hr.properties +15 -6
- package/src/sap/fe/core/messagebundle_hu.properties +9 -0
- package/src/sap/fe/core/messagebundle_id.properties +10 -1
- package/src/sap/fe/core/messagebundle_it.properties +9 -0
- package/src/sap/fe/core/messagebundle_iw.properties +9 -0
- package/src/sap/fe/core/messagebundle_ja.properties +9 -0
- package/src/sap/fe/core/messagebundle_kk.properties +15 -6
- package/src/sap/fe/core/messagebundle_ko.properties +9 -0
- package/src/sap/fe/core/messagebundle_lt.properties +9 -0
- package/src/sap/fe/core/messagebundle_lv.properties +15 -6
- package/src/sap/fe/core/messagebundle_ms.properties +14 -5
- package/src/sap/fe/core/messagebundle_nl.properties +9 -0
- package/src/sap/fe/core/messagebundle_no.properties +9 -0
- package/src/sap/fe/core/messagebundle_pl.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
- package/src/sap/fe/core/messagebundle_ro.properties +9 -0
- package/src/sap/fe/core/messagebundle_ru.properties +9 -0
- package/src/sap/fe/core/messagebundle_sh.properties +11 -2
- package/src/sap/fe/core/messagebundle_sk.properties +9 -0
- package/src/sap/fe/core/messagebundle_sl.properties +15 -6
- package/src/sap/fe/core/messagebundle_sv.properties +9 -0
- package/src/sap/fe/core/messagebundle_th.properties +9 -0
- package/src/sap/fe/core/messagebundle_tr.properties +9 -0
- package/src/sap/fe/core/messagebundle_uk.properties +9 -0
- package/src/sap/fe/core/messagebundle_vi.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -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/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +138 -72
- package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
- package/src/sap/fe/core/templating/UIFormatters.js +31 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
- 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
|
@@ -31,7 +31,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
31
31
|
var and = BindingExpression.and;
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Generates context for the standard actions.
|
|
34
|
+
* Generates the context for the standard actions.
|
|
35
35
|
*
|
|
36
36
|
* @param {ConverterContext} converterContext
|
|
37
37
|
* @param {NavigationSettingsConfiguration} navigationSettings
|
|
@@ -70,7 +70,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
70
70
|
return (navigation && navigation.outbound && navigation.outboundDetail) !== undefined;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* Checks if
|
|
73
|
+
* Checks if draft is supported.
|
|
74
74
|
*
|
|
75
75
|
* @param {ConverterContext} converterContext
|
|
76
76
|
* @returns {boolean}
|
|
@@ -79,15 +79,31 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
79
79
|
|
|
80
80
|
_exports.isExternalCreateConfigured = isExternalCreateConfigured;
|
|
81
81
|
|
|
82
|
-
function
|
|
83
|
-
var
|
|
82
|
+
function isDraftSupported(converterContext) {
|
|
83
|
+
var _currentEntitySet$ann, _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
|
|
84
84
|
|
|
85
85
|
var currentEntitySet = converterContext.getEntitySet();
|
|
86
|
-
var bIsStickySessionSupported = (_converterContext$get = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get !== void 0 && (_converterContext$get2 = _converterContext$get.annotations) !== null && _converterContext$get2 !== void 0 && (_converterContext$get3 = _converterContext$get2.Session) !== null && _converterContext$get3 !== void 0 && _converterContext$get3.StickySessionSupported ? true : false;
|
|
87
86
|
var bIsDraftRoot = currentEntitySet && (_currentEntitySet$ann = currentEntitySet.annotations) !== null && _currentEntitySet$ann !== void 0 && (_currentEntitySet$ann2 = _currentEntitySet$ann.Common) !== null && _currentEntitySet$ann2 !== void 0 && _currentEntitySet$ann2.DraftRoot ? true : false;
|
|
88
87
|
var bIsDraftNode = currentEntitySet && (_currentEntitySet$ann3 = currentEntitySet.annotations) !== null && _currentEntitySet$ann3 !== void 0 && (_currentEntitySet$ann4 = _currentEntitySet$ann3.Common) !== null && _currentEntitySet$ann4 !== void 0 && _currentEntitySet$ann4.DraftNode ? true : false;
|
|
89
|
-
var bIsDraftParentEntityForContainment = (_converterContext$
|
|
90
|
-
return bIsDraftRoot || bIsDraftNode ||
|
|
88
|
+
var bIsDraftParentEntityForContainment = (_converterContext$get = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get !== void 0 && _converterContext$get.containsTarget && ((_converterContext$get2 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get2 !== void 0 && (_converterContext$get3 = _converterContext$get2.annotations) !== null && _converterContext$get3 !== void 0 && (_converterContext$get4 = _converterContext$get3.Common) !== null && _converterContext$get4 !== void 0 && _converterContext$get4.DraftRoot || (_converterContext$get5 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get5 !== void 0 && (_converterContext$get6 = _converterContext$get5.annotations) !== null && _converterContext$get6 !== void 0 && (_converterContext$get7 = _converterContext$get6.Common) !== null && _converterContext$get7 !== void 0 && _converterContext$get7.DraftNode) ? true : false;
|
|
89
|
+
return bIsDraftRoot || bIsDraftNode || !converterContext.getEntitySet() && bIsDraftParentEntityForContainment;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Checks if sticky or draft is supported.
|
|
93
|
+
*
|
|
94
|
+
* @param {ConverterContext} converterContext
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
_exports.isDraftSupported = isDraftSupported;
|
|
100
|
+
|
|
101
|
+
function isDraftOrStickySupported(converterContext) {
|
|
102
|
+
var _converterContext$get8, _converterContext$get9, _converterContext$get10;
|
|
103
|
+
|
|
104
|
+
var bIsDraftSupported = isDraftSupported(converterContext);
|
|
105
|
+
var bIsStickySessionSupported = (_converterContext$get8 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get8 !== void 0 && (_converterContext$get9 = _converterContext$get8.annotations) !== null && _converterContext$get9 !== void 0 && (_converterContext$get10 = _converterContext$get9.Session) !== null && _converterContext$get10 !== void 0 && _converterContext$get10.StickySessionSupported ? true : false;
|
|
106
|
+
return bIsDraftSupported || bIsStickySessionSupported;
|
|
91
107
|
}
|
|
92
108
|
/**
|
|
93
109
|
* Gets the configured newAction into annotation.
|
|
@@ -119,7 +135,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
119
135
|
return undefined;
|
|
120
136
|
}
|
|
121
137
|
/**
|
|
122
|
-
* Gets binding expression for the action visibility configured into annotation.
|
|
138
|
+
* Gets the binding expression for the action visibility configured into annotation.
|
|
123
139
|
*
|
|
124
140
|
* @param {ConverterContext} converterContext
|
|
125
141
|
* @param {string} sAnnotationTerm
|
|
@@ -141,7 +157,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
141
157
|
}) : constant(false);
|
|
142
158
|
}
|
|
143
159
|
/**
|
|
144
|
-
* Gets annotated restrictions for actions.
|
|
160
|
+
* Gets the annotated restrictions for the actions.
|
|
145
161
|
*
|
|
146
162
|
* @param {ConverterContext} converterContext
|
|
147
163
|
* @returns {StandardActionsRestrictionsType}
|
|
@@ -178,7 +194,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
178
194
|
* Checks if templating for insert/update actions is mandatory.
|
|
179
195
|
*
|
|
180
196
|
* @param {StandardActionsContext} standardActionsContext
|
|
181
|
-
* @param {boolean}
|
|
197
|
+
* @param {boolean} isDraftOrSticky
|
|
182
198
|
* @param {boolean} isCreateAlwaysHidden
|
|
183
199
|
* @returns {boolean}
|
|
184
200
|
*/
|
|
@@ -186,11 +202,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
186
202
|
|
|
187
203
|
_exports.getRestrictions = getRestrictions;
|
|
188
204
|
|
|
189
|
-
function getInsertUpdateActionsTemplating(standardActionsContext,
|
|
190
|
-
return (
|
|
205
|
+
function getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrSticky, isCreateAlwaysHidden) {
|
|
206
|
+
return (isDraftOrSticky || standardActionsContext.isExternalCreateConfigured) && !isCreateAlwaysHidden;
|
|
191
207
|
}
|
|
192
208
|
/**
|
|
193
|
-
* Gets binding expressions for the properties of the action Create.
|
|
209
|
+
* Gets the binding expressions for the properties of the action Create.
|
|
194
210
|
*
|
|
195
211
|
* @param {ConverterContext} converterContext
|
|
196
212
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -209,7 +225,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
209
225
|
};
|
|
210
226
|
}
|
|
211
227
|
/**
|
|
212
|
-
* Gets binding expressions for the properties of the action Delete.
|
|
228
|
+
* Gets the binding expressions for the properties of the action Delete.
|
|
213
229
|
*
|
|
214
230
|
* @param {ConverterContext} converterContext
|
|
215
231
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -228,47 +244,47 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
228
244
|
};
|
|
229
245
|
}
|
|
230
246
|
/**
|
|
231
|
-
* Gets binding expressions for the properties of the action Paste.
|
|
247
|
+
* Gets the binding expressions for the properties of the action Paste.
|
|
232
248
|
*
|
|
233
249
|
* @param {ConverterContext} converterContext
|
|
234
250
|
* @param {StandardActionsContext} standardActionsContext
|
|
251
|
+
* @param {boolean} isInsertUpdateActionsTemplated
|
|
235
252
|
* @returns {StandardActionConfigType}
|
|
236
253
|
*/
|
|
237
254
|
|
|
238
255
|
|
|
239
256
|
_exports.getStandardActionDelete = getStandardActionDelete;
|
|
240
257
|
|
|
241
|
-
function getStandardActionPaste(converterContext, standardActionsContext) {
|
|
258
|
+
function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
|
|
242
259
|
var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
|
|
243
|
-
var
|
|
260
|
+
var createEnablement = getCreateEnablement(converterContext, standardActionsContext, createVisibility);
|
|
261
|
+
var pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated);
|
|
244
262
|
return {
|
|
245
|
-
isTemplated: compileBinding(getDefaultTemplating(pasteVisibility)),
|
|
246
263
|
visible: compileBinding(pasteVisibility),
|
|
247
|
-
enabled: compileBinding(pasteVisibility)
|
|
264
|
+
enabled: compileBinding(getPasteEnablement(pasteVisibility, createEnablement))
|
|
248
265
|
};
|
|
249
266
|
}
|
|
250
267
|
/**
|
|
251
|
-
* Gets binding expressions for the properties of the action MassEdit.
|
|
268
|
+
* Gets the binding expressions for the properties of the action MassEdit.
|
|
252
269
|
*
|
|
253
270
|
* @param {ConverterContext} converterContext
|
|
254
271
|
* @param {StandardActionsContext} standardActionsContext
|
|
255
|
-
* @param {string | undefined} selectionMode
|
|
256
272
|
* @returns {StandardActionConfigType}
|
|
257
273
|
*/
|
|
258
274
|
|
|
259
275
|
|
|
260
276
|
_exports.getStandardActionPaste = getStandardActionPaste;
|
|
261
277
|
|
|
262
|
-
function getStandardActionMassEdit(converterContext, standardActionsContext
|
|
263
|
-
var massEditVisibility = getMassEditVisibility(converterContext, standardActionsContext
|
|
278
|
+
function getStandardActionMassEdit(converterContext, standardActionsContext) {
|
|
279
|
+
var massEditVisibility = getMassEditVisibility(converterContext, standardActionsContext);
|
|
264
280
|
return {
|
|
265
281
|
isTemplated: compileBinding(getDefaultTemplating(massEditVisibility)),
|
|
266
282
|
visible: compileBinding(massEditVisibility),
|
|
267
|
-
enabled: compileBinding(getMassEditEnablement(standardActionsContext, massEditVisibility))
|
|
283
|
+
enabled: compileBinding(getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility))
|
|
268
284
|
};
|
|
269
285
|
}
|
|
270
286
|
/**
|
|
271
|
-
* Gets binding
|
|
287
|
+
* Gets the binding expression for the templating of the action Create.
|
|
272
288
|
*
|
|
273
289
|
* @param {StandardActionsContext} standardActionsContext
|
|
274
290
|
* @param {Expression<boolean>} createVisibility
|
|
@@ -291,7 +307,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
291
307
|
return ifElse(or(and(isConstant(createVisibility), equal(createVisibility, false)), isCreationRow), false, ifElse(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), false, ifElse(and(not(standardActionsContext.restrictions.isInsertable.isOnlyCurrentEntityExpression), isConstant(isInsertable)), isInsertable, ifElse(standardActionsContext.isExternalCreateConfigured, true, not(and(isConstant(isInsertable), equal(isInsertable, constant(false))))))));
|
|
292
308
|
}
|
|
293
309
|
/**
|
|
294
|
-
* Gets binding
|
|
310
|
+
* Gets the binding expression for the templating of the non-Create actions.
|
|
295
311
|
*
|
|
296
312
|
* @param {Expression<boolean>} actionVisibility
|
|
297
313
|
* @returns {Expression<boolean> }
|
|
@@ -304,7 +320,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
304
320
|
return not(and(isConstant(actionVisibility), equal(actionVisibility, false)));
|
|
305
321
|
}
|
|
306
322
|
/**
|
|
307
|
-
* Gets binding
|
|
323
|
+
* Gets the binding expression for the property visible of the action Create.
|
|
308
324
|
*
|
|
309
325
|
* @param {ConverterContext} converterContext
|
|
310
326
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -331,7 +347,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
331
347
|
return ifElse(standardActionsContext.isExternalCreateConfigured, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, not(isCreateHidden), and(not(isCreateHidden), UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, ifElse(isBinding(isCreateHidden), not(isCreateHidden), true), and(not(isCreateHidden), UI.IsEditable))));
|
|
332
348
|
}
|
|
333
349
|
/**
|
|
334
|
-
* Gets binding
|
|
350
|
+
* Gets the binding expression for the property visible of the action Delete.
|
|
335
351
|
*
|
|
336
352
|
* @param {ConverterContext} converterContext
|
|
337
353
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -343,7 +359,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
343
359
|
|
|
344
360
|
function getDeleteVisibility(converterContext, standardActionsContext) {
|
|
345
361
|
var isDeleteHidden = standardActionsContext.hiddenAnnotation.delete;
|
|
346
|
-
var
|
|
362
|
+
var pathDeletableExpression = standardActionsContext.restrictions.isDeletable.expression; //Delete Button is visible:
|
|
347
363
|
// Prerequisites:
|
|
348
364
|
// - If we're not on multiple visualizations configuration or ALP
|
|
349
365
|
//
|
|
@@ -356,45 +372,45 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
356
372
|
// - If UI.DeleteHidden points to a property path -> provide a negated binding to this path
|
|
357
373
|
// - Otherwise, delete is visible
|
|
358
374
|
|
|
359
|
-
return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(
|
|
375
|
+
return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), ifElse(isBinding(isDeleteHidden), not(isDeleteHidden), true)))));
|
|
360
376
|
}
|
|
361
377
|
/**
|
|
362
|
-
* Gets binding
|
|
378
|
+
* Gets the binding expression for the property visible of the action Paste.
|
|
363
379
|
*
|
|
364
380
|
* @param {ConverterContext} converterContext
|
|
365
381
|
* @param {StandardActionsContext} standardActionsContext
|
|
366
382
|
* @param {Expression<boolean>} createVisibility
|
|
383
|
+
* @param {boolean} isInsertUpdateActionsTemplated
|
|
367
384
|
* @returns {Expression<boolean> }
|
|
368
385
|
*/
|
|
369
386
|
|
|
370
387
|
|
|
371
388
|
_exports.getDeleteVisibility = getDeleteVisibility;
|
|
372
389
|
|
|
373
|
-
function getPasteVisibility(converterContext, standardActionsContext, createVisibility) {
|
|
374
|
-
// If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
|
|
390
|
+
function getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated) {
|
|
391
|
+
// If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
|
|
392
|
+
// Then button will be visible according to insertable restrictions and create visibility
|
|
375
393
|
// Otherwise it's not visible
|
|
376
|
-
return ifElse(and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false),
|
|
394
|
+
return ifElse(and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated), [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1 && standardActionsContext.restrictions.isInsertable.expression, false);
|
|
377
395
|
}
|
|
378
396
|
/**
|
|
379
|
-
* Gets binding
|
|
397
|
+
* Gets the binding expression for the property visible of the action MassEdit.
|
|
380
398
|
*
|
|
381
399
|
* @param {ConverterContext} converterContext
|
|
382
400
|
* @param {StandardActionsContext} standardActionsContext
|
|
383
|
-
* @param {string | undefined} selectionMode
|
|
384
401
|
* @returns {Expression<boolean> }
|
|
385
402
|
*/
|
|
386
403
|
|
|
387
404
|
|
|
388
405
|
_exports.getPasteVisibility = getPasteVisibility;
|
|
389
406
|
|
|
390
|
-
function getMassEditVisibility(converterContext, standardActionsContext
|
|
391
|
-
var _standardActionsConte
|
|
407
|
+
function getMassEditVisibility(converterContext, standardActionsContext) {
|
|
408
|
+
var _standardActionsConte;
|
|
392
409
|
|
|
393
410
|
var isUpdateHidden = standardActionsContext.hiddenAnnotation.update,
|
|
394
|
-
|
|
395
|
-
bMassEditEnabledInManifest = ((_standardActionsConte = standardActionsContext.tableManifestConfiguration) === null || _standardActionsConte === void 0 ? void 0 : _standardActionsConte.enableMassEdit) || false
|
|
396
|
-
|
|
397
|
-
var bIsRelevantSelectionMode = !(selectionMode && selectionMode === "Single" || iSelectionLimit && iSelectionLimit < 2); //MassEdit is visible
|
|
411
|
+
pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression,
|
|
412
|
+
bMassEditEnabledInManifest = ((_standardActionsConte = standardActionsContext.tableManifestConfiguration) === null || _standardActionsConte === void 0 ? void 0 : _standardActionsConte.enableMassEdit) || false;
|
|
413
|
+
var templateBindingExpression = converterContext.getTemplateType() === TemplateType.ObjectPage ? equal(UI.IsEditable, true) : converterContext.getTemplateType() === TemplateType.ListReport; //MassEdit is visible
|
|
398
414
|
// If
|
|
399
415
|
// - there is no static restrictions set to false
|
|
400
416
|
// - and enableMassEdit is not set to false into the manifest
|
|
@@ -402,10 +418,10 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
402
418
|
// Then MassEdit is always visible in LR or dynamically visible in OP according to ui>Editable and hiddenAnnotation
|
|
403
419
|
// Button is hidden for all other cases
|
|
404
420
|
|
|
405
|
-
return ifElse(and(not(and(isConstant(
|
|
421
|
+
return ifElse(and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest), and(templateBindingExpression, not(isUpdateHidden)), false);
|
|
406
422
|
}
|
|
407
423
|
/**
|
|
408
|
-
* Gets binding
|
|
424
|
+
* Gets the binding expression for the property enabled of the action Create.
|
|
409
425
|
*
|
|
410
426
|
* @param {ConverterContext} converterContext
|
|
411
427
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -421,10 +437,10 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
421
437
|
|
|
422
438
|
var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
|
|
423
439
|
var CollectionType = (_converterContext$res = converterContext.resolveAbsolutePath(standardActionsContext.collectionPath).target) === null || _converterContext$res === void 0 ? void 0 : _converterContext$res._type;
|
|
424
|
-
return and(
|
|
440
|
+
return and(createVisibility, ifElse(CollectionType === "EntitySet", true, ifElse(converterContext.getTemplateType() !== TemplateType.ObjectPage, isInsertable, and(isInsertable, equal(bindingExpression("/editMode", "ui"), "Editable")))));
|
|
425
441
|
}
|
|
426
442
|
/**
|
|
427
|
-
* Gets binding
|
|
443
|
+
* Gets the binding expression for the property enabled of the action Delete.
|
|
428
444
|
*
|
|
429
445
|
* @param {ConverterContext} converterContext
|
|
430
446
|
* @param {StandardActionsContext} standardActionsContext
|
|
@@ -441,28 +457,71 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
|
|
|
441
457
|
var numberOfSelectedContexts = bindingExpression("numberOfSelectedContexts", "internal");
|
|
442
458
|
var numberOfDeletableContexts = bindingExpression("deletableContexts", "internal");
|
|
443
459
|
var numberOfUnSavedContexts = bindingExpression("unSavedContexts", "internal");
|
|
444
|
-
return and(
|
|
460
|
+
return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), ifElse(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal"), false), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
|
|
445
461
|
}
|
|
446
462
|
/**
|
|
447
|
-
* Gets binding
|
|
463
|
+
* Gets the binding expression for the property enabled of the action Paste.
|
|
448
464
|
*
|
|
465
|
+
* @param {Expression<boolean>} pasteVisibility
|
|
466
|
+
* @param {Expression<boolean>} createEnablement
|
|
467
|
+
* @returns {Expression<boolean> }
|
|
468
|
+
*/
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
_exports.getDeleteEnablement = getDeleteEnablement;
|
|
472
|
+
|
|
473
|
+
function getPasteEnablement(pasteVisibility, createEnablement) {
|
|
474
|
+
return and(pasteVisibility, createEnablement);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Gets the binding expression for the property enabled of the action MassEdit.
|
|
478
|
+
*
|
|
479
|
+
* @param {ConverterContext} converterContext
|
|
449
480
|
* @param {StandardActionsContext} standardActionsContext
|
|
450
481
|
* @param {Expression<boolean>} massEditVisibility
|
|
451
482
|
* @returns {Expression<boolean> }
|
|
452
483
|
*/
|
|
453
484
|
|
|
454
485
|
|
|
455
|
-
_exports.
|
|
486
|
+
_exports.getPasteEnablement = getPasteEnablement;
|
|
456
487
|
|
|
457
|
-
function getMassEditEnablement(standardActionsContext, massEditVisibility) {
|
|
458
|
-
var
|
|
459
|
-
var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isUpdatable.isOnlyCurrentEntityExpression && !isConstant(
|
|
460
|
-
var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"),
|
|
461
|
-
var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")),
|
|
462
|
-
|
|
488
|
+
function getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility) {
|
|
489
|
+
var pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression;
|
|
490
|
+
var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isUpdatable.isOnlyCurrentEntityExpression && !isConstant(pathUpdatableExpression);
|
|
491
|
+
var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"), 1);
|
|
492
|
+
var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")), 1);
|
|
493
|
+
var bIsDraftSupported = isDraftSupported(converterContext);
|
|
494
|
+
var bDisplayMode = isInDisplayMode(converterContext); // numberOfUpdatableContexts needs to be added to the binding in case
|
|
495
|
+
// 1. Update is dependent on current entity property (isOnlyDynamicOnCurrentEntity is true).
|
|
496
|
+
// 2. The table is read only and draft enabled(like LR), in this case only active contexts can be mass edited.
|
|
497
|
+
// So, update depends on 'IsActiveEntity' value which needs to be checked runtime.
|
|
498
|
+
|
|
499
|
+
var runtimeBinding = ifElse(or(and(bDisplayMode, bIsDraftSupported), isOnlyDynamicOnCurrentEntity), and(numberOfSelectedContexts, numberOfUpdatableContexts), and(numberOfSelectedContexts));
|
|
500
|
+
return and(massEditVisibility, ifElse(isOnlyDynamicOnCurrentEntity, runtimeBinding, and(runtimeBinding, pathUpdatableExpression)));
|
|
463
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* Tells if the table in template is in display mode.
|
|
504
|
+
*
|
|
505
|
+
* @param {ConverterContext} converterContext
|
|
506
|
+
* @param {ViewPathConfiguration} viewConfiguration
|
|
507
|
+
* @returns {boolean}
|
|
508
|
+
*/
|
|
509
|
+
|
|
464
510
|
|
|
465
511
|
_exports.getMassEditEnablement = getMassEditEnablement;
|
|
512
|
+
|
|
513
|
+
function isInDisplayMode(converterContext, viewConfiguration) {
|
|
514
|
+
var templateType = converterContext.getTemplateType();
|
|
515
|
+
|
|
516
|
+
if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
|
|
517
|
+
return true;
|
|
518
|
+
} // updatable will be handled at the property level
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
_exports.isInDisplayMode = isInDisplayMode;
|
|
466
525
|
return _exports;
|
|
467
526
|
}, false);
|
|
468
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJ1cGRhdGUiLCJpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsImlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb24iLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwidW5kZWZpbmVkIiwiY3VycmVudEVudGl0eVNldCIsImdldEVudGl0eVNldCIsImJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJzdGFydGluZ0VudGl0eVNldCIsImFubm90YXRpb25zIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJiSXNEcmFmdFJvb3QiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJiSXNEcmFmdE5vZGUiLCJEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwidGFyZ2V0T2JqZWN0IiwiY29udGFpbnNUYXJnZXQiLCJuZXdBY3Rpb25OYW1lIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInNBbm5vdGF0aW9uVGVybSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnN0YW50IiwicmVzdHJpY3Rpb25zRGVmIiwia2V5IiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNDcmVhdGVBbHdheXNIaWRkZW4iLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlQmluZGluZyIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSIsImRlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsInBhc3RlVmlzaWJpbGl0eSIsImdldFBhc3RlVmlzaWJpbGl0eSIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJzZWxlY3Rpb25Nb2RlIiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNDcmVhdGlvblJvdyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiaXNJbnNlcnRhYmxlIiwiaWZFbHNlIiwib3IiLCJhbmQiLCJpc0NvbnN0YW50IiwiZXF1YWwiLCJub3QiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNDcmVhdGVIaWRkZW4iLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiSXNFZGl0YWJsZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwiaXNEZWxldGFibGUiLCJiaW5kaW5nRXhwcmVzc2lvbiIsIm5vdEVxdWFsIiwiZW5hYmxlUGFzdGUiLCJpbmRleE9mIiwiaXNVcGRhdGVIaWRkZW4iLCJpc1VwZGF0YWJsZSIsImJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0IiwiZW5hYmxlTWFzc0VkaXQiLCJpU2VsZWN0aW9uTGltaXQiLCJzZWxlY3Rpb25MaW1pdCIsImJJc1JlbGV2YW50U2VsZWN0aW9uTW9kZSIsIk9iamVjdFBhZ2UiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJfdHlwZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzIiwibnVtYmVyT2ZVblNhdmVkQ29udGV4dHMiLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRU8sV0FBU0EsOEJBQVQsQ0FDTkMs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Q0FBQ2lFLGlCQUFpQixDQUFDLG1CQUFELEVBQXNCLFVBQXRCLENBQWxCLENBQVAsRUFBNkQsQ0FBN0QsQ0FBaEQ7QUFFQSxXQUFPZixHQUFHLENBQ1RHLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDWixrQkFBRCxFQUFxQnBDLFFBQVEsQ0FBQyxLQUFELENBQTdCLENBQU4sQ0FETSxFQUVUNEMsTUFBTSxDQUNMaUMsNEJBREssRUFFTC9CLEdBQUcsQ0FBQ2dDLHdCQUFELEVBQTJCSyx5QkFBM0IsQ0FGRSxFQUdMckMsR0FBRyxDQUFDZ0Msd0JBQUQsRUFBMkIxRSxlQUEzQixDQUhFLENBRkcsQ0FBVjtBQVFBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRjb21waWxlQmluZGluZyxcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRsZW5ndGgsXG5cdEV4cHJlc3Npb24sXG5cdGdyZWF0ZXJPckVxdWFsLFxuXHRpZkVsc2UsXG5cdGlzQmluZGluZyxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRub3RFcXVhbCxcblx0b3IsXG5cdGdyZWF0ZXJUaGFuXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sIFRlbXBsYXRlVHlwZSwgVmlld1BhdGhDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IHNpbmdsZXRvblBhdGhWaXNpdG9yLCBVSSB9IGZyb20gXCIuLi8uLi8uLi9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBnZXRUYXJnZXRPYmplY3RQYXRoLCBpc1BhdGhEZWxldGFibGUsIGlzUGF0aEluc2VydGFibGUsIGlzUGF0aFVwZGF0YWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vVGFibGVcIjtcblxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlID0ge1xuXHRpc1RlbXBsYXRlZD86IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR2aXNpYmxlOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0ZW5hYmxlZDogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuXG50eXBlIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlID0ge1xuXHRleHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRpc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbjogYm9vbGVhbjtcbn07XG50eXBlIFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUgPSBSZWNvcmQ8c3RyaW5nLCBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZT47XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSB7XG5cdGNvbGxlY3Rpb25QYXRoOiBzdHJpbmc7XG5cdGhpZGRlbkFubm90YXRpb246IHtcblx0XHRjcmVhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0XCJkZWxldGVcIjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHR1cGRhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkOiBib29sZWFuO1xuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cdGlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zOiBib29sZWFuO1xuXHRuZXdBY3Rpb24/OiB7XG5cdFx0bmFtZT86IHN0cmluZztcblx0XHRhdmFpbGFibGU/OiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0cmVzdHJpY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgY29udGV4dCBmb3IgdGhlIHN0YW5kYXJkIGFjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge05hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb259IG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHBhcmFtIHtUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9ufSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxuICogQHBhcmFtIHtWaWV3UGF0aENvbmZpZ3VyYXRpb259IHZpZXdDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyAgVGhlIGNvbnRleHQgZm9yIHRhYmxlIGFjdGlvbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCB7XG5cdHJldHVybiB7XG5cdFx0Y29sbGVjdGlvblBhdGg6IGdldFRhcmdldE9iamVjdFBhdGgoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpLFxuXHRcdGhpZGRlbkFubm90YXRpb246IHtcblx0XHRcdGNyZWF0ZTogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgXCJDcmVhdGVIaWRkZW5cIiksXG5cdFx0XHRcImRlbGV0ZVwiOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkRlbGV0ZUhpZGRlblwiKSxcblx0XHRcdHVwZGF0ZTogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgXCJVcGRhdGVIaWRkZW5cIilcblx0XHR9LFxuXHRcdGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkOiBpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZChuYXZpZ2F0aW9uU2V0dGluZ3MpLFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZDogaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zOiB2aWV3Q29uZmlndXJhdGlvblxuXHRcdFx0PyBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pXG5cdFx0XHQ6IGZhbHNlLFxuXHRcdG5ld0FjdGlvbjogZ2V0TmV3QWN0aW9uKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHRyZXN0cmljdGlvbnM6IGdldFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBleHRlcm5hbCBjcmVhdGVkIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBuYXZpZ2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCBuYXZpZ2F0aW9uID0gbmF2aWdhdGlvblNldHRpbmdzPy5jcmVhdGU7XG5cdHJldHVybiAobmF2aWdhdGlvbiAmJiBuYXZpZ2F0aW9uLm91dGJvdW5kICYmIG5hdmlnYXRpb24ub3V0Ym91bmREZXRhaWwpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCBiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5TZXNzaW9uXG5cdFx0Py5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0PyB0cnVlXG5cdFx0OiBmYWxzZTtcblx0Y29uc3QgYklzRHJhZnRSb290ID0gY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCA/IHRydWUgOiBmYWxzZTtcblx0Y29uc3QgYklzRHJhZnROb2RlID0gY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0Y29uc3QgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5jb250YWluc1RhcmdldCAmJlxuXHRcdChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5zdGFydGluZ0VudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290IHx8XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5zdGFydGluZ0VudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlKVxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IGZhbHNlO1xuXG5cdHJldHVybiAoXG5cdFx0YklzRHJhZnRSb290IHx8XG5cdFx0YklzRHJhZnROb2RlIHx8XG5cdFx0YklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCB8fFxuXHRcdCghY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSAmJiBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgbmV3QWN0aW9uIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdBY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGFueSB7XG5cdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCBuZXdBY3Rpb25OYW1lOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+ID0gKFxuXHRcdGN1cnJlbnRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8XG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvblxuXHQpPy50b1N0cmluZygpO1xuXHRpZiAobmV3QWN0aW9uTmFtZSkge1xuXHRcdGxldCBhdmFpbGFibGVQcm9wZXJ0eTogYW55ID0gY29udmVydGVyQ29udGV4dD8uZ2V0RW50aXR5VHlwZSgpLmFjdGlvbnNbbmV3QWN0aW9uTmFtZV0/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGU7XG5cdFx0YXZhaWxhYmxlUHJvcGVydHkgPSBhdmFpbGFibGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkID8gYXZhaWxhYmxlUHJvcGVydHkgOiB0cnVlO1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBuZXdBY3Rpb25OYW1lLFxuXHRcdFx0YXZhaWxhYmxlOiBhbm5vdGF0aW9uRXhwcmVzc2lvbihhdmFpbGFibGVQcm9wZXJ0eSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc0Fubm90YXRpb25UZXJtOiBzdHJpbmcpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwXG5cdFx0XHQ/IFtkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0ubmFtZV1cblx0XHRcdDogW107XG5cdHJldHVybiBjdXJyZW50RW50aXR5U2V0XG5cdFx0PyBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0KChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VSSBhcyBhbnkpPy5bc0Fubm90YXRpb25UZXJtXSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIGFubm90YXRlZCByZXN0cmljdGlvbnMgZm9yIGFjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZSB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgcmVzdHJpY3Rpb25zRGVmID0gW1xuXHRcdHtcblx0XHRcdGtleTogXCJpc0luc2VydGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoSW5zZXJ0YWJsZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzVXBkYXRhYmxlXCIsXG5cdFx0XHRcImZ1bmN0aW9uXCI6IGlzUGF0aFVwZGF0YWJsZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzRGVsZXRhYmxlXCIsXG5cdFx0XHRcImZ1bmN0aW9uXCI6IGlzUGF0aERlbGV0YWJsZVxuXHRcdH1cblx0XTtcblx0Y29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZT4gPSB7fTtcblx0cmVzdHJpY3Rpb25zRGVmLmZvckVhY2goZnVuY3Rpb24oZGVmKSB7XG5cdFx0Y29uc3QgZGVmRnVuY3Rpb24gPSBkZWZbXCJmdW5jdGlvblwiXTtcblx0XHRyZXN1bHRbZGVmLmtleV0gPSB7XG5cdFx0XHRleHByZXNzaW9uOiBkZWZGdW5jdGlvbi5hcHBseShudWxsLCBbZGF0YU1vZGVsT2JqZWN0UGF0aF0pLFxuXHRcdFx0aXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb246ICEhKGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtkYXRhTW9kZWxPYmplY3RQYXRoLCB1bmRlZmluZWQsIHRydWVdKSBhcyBhbnkpXG5cdFx0XHRcdD8uY3VycmVudEVudGl0eVJlc3RyaWN0aW9uXG5cdFx0fTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRlbXBsYXRpbmcgZm9yIGluc2VydC91cGRhdGUgYWN0aW9ucyBpcyBtYW5kYXRvcnkuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZFxuICogQHBhcmFtIHtib29sZWFufSBpc0NyZWF0ZUFsd2F5c0hpZGRlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBib29sZWFuLFxuXHRpc0NyZWF0ZUFsd2F5c0hpZGRlbjogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIHx8IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQpICYmICFpc0NyZWF0ZUFsd2F5c0hpZGRlbjtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0ZVZpc2liaWxpdHkgPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlIHtcblx0Y29uc3QgZGVsZXRlVmlzaWJpbGl0eSA9IGdldERlbGV0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0RGVmYXVsdFRlbXBsYXRpbmcoZGVsZXRlVmlzaWJpbGl0eSkpLFxuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKGRlbGV0ZVZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlbGV0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZGVsZXRlVmlzaWJpbGl0eSkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgYWN0aW9uIFBhc3RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlIHtcblx0Y29uc3QgY3JlYXRlVmlzaWJpbGl0eSA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhwYXN0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhwYXN0ZVZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSlcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBzZWxlY3Rpb25Nb2RlXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0c2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBtYXNzRWRpdFZpc2liaWxpdHkgPSBnZXRNYXNzRWRpdFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgc2VsZWN0aW9uTW9kZSk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0RGVmYXVsdFRlbXBsYXRpbmcobWFzc0VkaXRWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcobWFzc0VkaXRWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRNYXNzRWRpdEVuYWJsZW1lbnQoc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgbWFzc0VkaXRWaXNpYmlsaXR5KSlcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSB0ZW1wbGF0aW5nIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGVWaXNpYmlsaXR5XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRjcmVhdGVWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNDcmVhdGlvblJvdyA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdGNvbnN0IG5ld0FjdGlvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQubmV3QWN0aW9uO1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL1RlbXBsYXRpbmcgb2YgQ3JlYXRlIEJ1dHRvbiBpcyBub3QgZG9uZTpcblx0Ly8gXHQgLSBJZiBCdXR0b24gaXMgbmV2ZXIgdmlzaWJsZSBvciBDcmVhdGlvbk1vZGUgaXMgb24gQ3JlYXRpb25Sb3dcblx0Ly8gICAtIE90aGVyd2lzZSBJZiBuZXcgYWN0aW9uIGlzIGNvbmZpZ3VyZWQgYW5kIG5ldmVyIGF2YWlsYWJsZVxuXHQvL1x0IC0gT3RoZXJ3aXNlIElmIGRlbGV0ZSByZXN0cmljdGlvbnMgY29taW5nIGZyb20gTmF2aWdhdGlvblJlc3RyaWN0aW9ucyBhcmUgY29uc3RhbnRseSBmYWxzZVxuXHQvLyAgIC0gT3RoZXJ3aXNlIElmIHRoZXJlIGlzIG5vIGV4dGVybmFsIGNyZWF0ZSBhY3Rpb25cblx0Ly9cdCAtIE90aGVyd2lzZSBpZiB0aGVyZSBpcyBkZWxldGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBjdXJyZW50IGVudGl0eVNldCBzZXQgdG8gZmFsc2VcblxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdG9yKGFuZChpc0NvbnN0YW50KGNyZWF0ZVZpc2liaWxpdHkpLCBlcXVhbChjcmVhdGVWaXNpYmlsaXR5LCBmYWxzZSkpLCBpc0NyZWF0aW9uUm93KSxcblx0XHRmYWxzZSxcblx0XHRpZkVsc2UoXG5cdFx0XHRhbmQoaXNDb25zdGFudChuZXdBY3Rpb24/LmF2YWlsYWJsZSksIGVxdWFsKG5ld0FjdGlvbj8uYXZhaWxhYmxlLCBmYWxzZSkpLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGFuZChub3Qoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uKSwgaXNDb25zdGFudChpc0luc2VydGFibGUpKSxcblx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdG5vdChhbmQoaXNDb25zdGFudChpc0luc2VydGFibGUpLCBlcXVhbChpc0luc2VydGFibGUsIGNvbnN0YW50KGZhbHNlKSkpKVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIG5vbi1DcmVhdGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGFjdGlvblZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0aW5nKGFjdGlvblZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5vdChhbmQoaXNDb25zdGFudChhY3Rpb25WaXNpYmlsaXR5KSwgZXF1YWwoYWN0aW9uVmlzaWJpbGl0eSwgZmFsc2UpKSk7XG59XG5cbi8qKlxuICogR2V0cyBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydHkgdmlzaWJsZSBvZiB0aGUgYWN0aW9uIENyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc0NyZWF0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5jcmVhdGU7XG5cdGNvbnN0IG5ld0FjdGlvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQubmV3QWN0aW9uO1xuXG5cdC8vQ3JlYXRlIEJ1dHRvbiBpcyB2aXNpYmxlOlxuXHQvLyBcdCAtIElmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGV4dGVybmFsXG5cdC8vICAgICAgLSBJZiB3ZSdyZSBvbiB0aGUgbGlzdCByZXBvcnQgYW5kIGNyZWF0ZSBpcyBub3QgaGlkZGVuXG5cdC8vXHRcdC0gT3RoZXJ3aXNlIHRoaXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIHRoZSBVSS5Jc0VkaXRhYmxlXG5cdC8vICAgLSBPdGhlcndpc2Vcblx0Ly8gXHQgXHQtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCAtPlxuXHQvLyBcdCBcdFx0LSBJZiBVSS5DcmVhdGVIaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHkgcGF0aCAtPiBwcm92aWRlIGEgbmVnYXRlZCBiaW5kaW5nIHRvIHRoaXMgcGF0aFxuXHQvLyBcdCBcdFx0LSBPdGhlcndpc2UsIGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIFx0IFx0LSBPdGhlcndpc2Vcblx0Ly8gXHQgIFx0IC0gVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0cmV0dXJuIGlmRWxzZShcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkLFxuXHRcdGlmRWxzZShcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0bm90KGlzQ3JlYXRlSGlkZGVuKSxcblx0XHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBVSS5Jc0VkaXRhYmxlKVxuXHRcdCksXG5cdFx0aWZFbHNlKFxuXHRcdFx0b3IoXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgZmFsc2UpLCAhbmV3QWN0aW9uKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNDcmVhdGVIaWRkZW4pLCBlcXVhbChpc0NyZWF0ZUhpZGRlbiwgdHJ1ZSkpLFxuXHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHQpLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzQ3JlYXRlSGlkZGVuKSwgbm90KGlzQ3JlYXRlSGlkZGVuKSwgdHJ1ZSksXG5cdFx0XHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNEZWxldGVIaWRkZW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmhpZGRlbkFubm90YXRpb24uZGVsZXRlO1xuXHRjb25zdCBpc1BhdGhEZWxldGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0RlbGV0YWJsZS5leHByZXNzaW9uO1xuXG5cdC8vRGVsZXRlIEJ1dHRvbiBpcyB2aXNpYmxlOlxuXHQvLyBcdCBQcmVyZXF1aXNpdGVzOlxuXHQvL1x0IC0gSWYgd2UncmUgbm90IG9uIG11bHRpcGxlIHZpc3VhbGl6YXRpb25zIGNvbmZpZ3VyYXRpb24gb3IgQUxQXG5cdC8vXG5cdC8vICAgLSBJZiByZXN0cmljdGlvbnMgb24gZGVsZXRhYmxlIHNldCB0byBmYWxzZSAtPiBub3QgdmlzaWJsZVxuXHQvLyAgIC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0LSBJZiBVSS5EZWxldGVIaWRkZW4gaXMgdHJ1ZSAtPiBub3QgdmlzaWJsZVxuXHQvL1x0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vIFx0IFx0XHRcdC0gSWYgd2UncmUgb24gT1AgLT4gZGVwZW5kaW5nIG9mIHRoZSBlZGl0TW9kZSBhbmQgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZVxuXHQvL1x0XHRcdFx0LSBPdGhlcndpc2Vcblx0Ly9cdFx0XHRcdCBcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIHBvaW50cyB0byBhIHByb3BlcnR5IHBhdGggLT4gcHJvdmlkZSBhIG5lZ2F0ZWQgYmluZGluZyB0byB0aGlzIHBhdGhcblx0Ly9cdCBcdCBcdFx0IFx0LSBPdGhlcndpc2UsIGRlbGV0ZSBpcyB2aXNpYmxlXG5cblx0cmV0dXJuIGlmRWxzZShcblx0XHRvcihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zLCBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlKSxcblx0XHRmYWxzZSxcblx0XHRpZkVsc2UoXG5cdFx0XHRhbmQoaXNDb25zdGFudChpc1BhdGhEZWxldGFibGUpLCBlcXVhbChpc1BhdGhEZWxldGFibGUsIGZhbHNlKSksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChpc0RlbGV0ZUhpZGRlbiwgY29uc3RhbnQodHJ1ZSkpKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHRcdFx0XHRhbmQobm90KGlzRGVsZXRlSGlkZGVuKSwgZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSksXG5cdFx0XHRcdFx0aWZFbHNlKGlzQmluZGluZyhpc0RlbGV0ZUhpZGRlbiksIG5vdChpc0RlbGV0ZUhpZGRlbiksIHRydWUpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydHkgdmlzaWJsZSBvZiB0aGUgYWN0aW9uIFBhc3RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdC8vIElmIENyZWF0ZSBpcyB2aXNpYmxlLCBlbmFibGVQYXN0ZSBpcyBub3QgZGlzYWJsZWQgaW50byBtYW5pZmVzdCBhbmQgd2UgYXJlIG9uIE9QL2Jsb2NrcyBvdXRzaWRlIEZpb3JpIGVsZW1lbnRzIHRlbXBsYXRlcywgYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKG5vdEVxdWFsKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uZW5hYmxlUGFzdGUsIGZhbHNlKSwgZXF1YWwoY3JlYXRlVmlzaWJpbGl0eSwgdHJ1ZSkpLFxuXHRcdFtUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCwgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZV0uaW5kZXhPZihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSA9PT0gLTEgJiZcblx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uLFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydHkgdmlzaWJsZSBvZiB0aGUgYWN0aW9uIE1hc3NFZGl0LlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gc2VsZWN0aW9uTW9kZVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc1VwZGF0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi51cGRhdGUsXG5cdFx0aXNQYXRoVXBkYXRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvbixcblx0XHRiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdDogYm9vbGVhbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24/LmVuYWJsZU1hc3NFZGl0IHx8IGZhbHNlLFxuXHRcdGlTZWxlY3Rpb25MaW1pdDogbnVtYmVyID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj8uc2VsZWN0aW9uTGltaXQ7XG5cdGNvbnN0IGJJc1JlbGV2YW50U2VsZWN0aW9uTW9kZTogYm9vbGVhbiA9ICEoKHNlbGVjdGlvbk1vZGUgJiYgc2VsZWN0aW9uTW9kZSA9PT0gXCJTaW5nbGVcIikgfHwgKGlTZWxlY3Rpb25MaW1pdCAmJiBpU2VsZWN0aW9uTGltaXQgPCAyKSk7XG5cblx0Ly9NYXNzRWRpdCBpcyB2aXNpYmxlXG5cdC8vIElmXG5cdC8vXHRcdC0gdGhlcmUgaXMgbm8gc3RhdGljIHJlc3RyaWN0aW9ucyBzZXQgdG8gZmFsc2Vcblx0Ly9cdFx0LSBhbmQgZW5hYmxlTWFzc0VkaXQgaXMgbm90IHNldCB0byBmYWxzZSBpbnRvIHRoZSBtYW5pZmVzdFxuXHQvL1x0XHQtIGFuZCB0aGUgc2VsZWN0aW9uTW9kZSBpcyByZWxldmFudFxuXHQvL1x0VGhlbiBNYXNzRWRpdCBpcyBhbHdheXMgdmlzaWJsZSBpbiBMUiBvciBkeW5hbWljYWxseSB2aXNpYmxlIGluIE9QIGFjY29yZGluZyB0byB1aT5FZGl0YWJsZSBhbmQgaGlkZGVuQW5ub3RhdGlvblxuXHQvLyAgQnV0dG9uIGlzIGhpZGRlbiBmb3IgYWxsIG90aGVyIGNhc2VzXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKG5vdChhbmQoaXNDb25zdGFudChpc1BhdGhVcGRhdGFibGUpLCBlcXVhbChpc1BhdGhVcGRhdGFibGUsIGZhbHNlKSkpLCBiSXNSZWxldmFudFNlbGVjdGlvbk1vZGUsIGJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0KSxcblx0XHRpZkVsc2UoXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSxcblx0XHRcdGFuZChlcXVhbChVSS5Jc0VkaXRhYmxlLCB0cnVlKSwgbm90KGlzVXBkYXRlSGlkZGVuKSksXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHRcdCksXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgQ29sbGVjdGlvblR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LnJlc29sdmVBYnNvbHV0ZVBhdGg8YW55PihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNvbGxlY3Rpb25QYXRoKS50YXJnZXQ/Ll90eXBlO1xuXHRyZXR1cm4gYW5kKFxuXHRcdG5vdChlcXVhbChjcmVhdGVWaXNpYmlsaXR5LCBjb25zdGFudChmYWxzZSkpKSxcblx0XHRpZkVsc2UoXG5cdFx0XHRDb2xsZWN0aW9uVHlwZSA9PT0gXCJFbnRpdHlTZXRcIixcblx0XHRcdHRydWUsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlLFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdGFuZChpc0luc2VydGFibGUsIGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIikpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gZGVsZXRlVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlRW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0ZGVsZXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSA9XG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuaXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb24gJiYgIWlzQ29uc3RhbnQoaXNEZWxldGFibGUpO1xuXHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCBudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJkZWxldGFibGVDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCBudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwidW5TYXZlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIik7XG5cblx0cmV0dXJuIGFuZChcblx0XHRub3QoZXF1YWwoZGVsZXRlVmlzaWJpbGl0eSwgY29uc3RhbnQoZmFsc2UpKSksXG5cdFx0aWZFbHNlKFxuXHRcdFx0b3IoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UsIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvcihcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cywgdW5kZWZpbmVkKSwgZ3JlYXRlclRoYW4obGVuZ3RoKG51bWJlck9mRGVsZXRhYmxlQ29udGV4dHMpLCAwKSksXG5cdFx0XHRcdFx0YW5kKG5vdEVxdWFsKG51bWJlck9mVW5TYXZlZENvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMpLCAwKSlcblx0XHRcdFx0KSxcblx0XHRcdFx0YmluZGluZ0V4cHJlc3Npb24oXCJkZWxldGVFbmFibGVkXCIsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpLFxuXHRcdFx0YW5kKG5vdEVxdWFsKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgMCksIGlzRGVsZXRhYmxlKVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IG1hc3NFZGl0VmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRFbmFibGVtZW50KFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRtYXNzRWRpdFZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc1BhdGhVcGRhdGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5OiBhbnkgPVxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KGlzUGF0aFVwZGF0YWJsZSk7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDIpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKGJpbmRpbmdFeHByZXNzaW9uKFwidXBkYXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKSksIDIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0bm90KGVxdWFsKG1hc3NFZGl0VmlzaWJpbGl0eSwgY29uc3RhbnQoZmFsc2UpKSksXG5cdFx0aWZFbHNlKFxuXHRcdFx0aXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSxcblx0XHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMpLFxuXHRcdFx0YW5kKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgaXNQYXRoVXBkYXRhYmxlKVxuXHRcdClcblx0KTtcbn1cbiJdfQ==
|
|
527
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJ1cGRhdGUiLCJpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsImlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb24iLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwidW5kZWZpbmVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsImN1cnJlbnRFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJiSXNEcmFmdFJvb3QiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsImJJc0RyYWZ0Tm9kZSIsIkRyYWZ0Tm9kZSIsImJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYklzRHJhZnRTdXBwb3J0ZWQiLCJiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJuZXdBY3Rpb25OYW1lIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInNBbm5vdGF0aW9uVGVybSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnN0YW50IiwicmVzdHJpY3Rpb25zRGVmIiwia2V5IiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNEcmFmdE9yU3RpY2t5IiwiaXNDcmVhdGVBbHdheXNIaWRkZW4iLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlQmluZGluZyIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSIsImRlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNDcmVhdGlvblJvdyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiaXNJbnNlcnRhYmxlIiwiaWZFbHNlIiwib3IiLCJhbmQiLCJpc0NvbnN0YW50IiwiZXF1YWwiLCJub3QiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNDcmVhdGVIaWRkZW4iLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiSXNFZGl0YWJsZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJfdHlwZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzIiwibnVtYmVyT2ZVblNhdmVkQ29udGV4dHMiLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImlzSW5EaXNwbGF5TW9kZSIsInJ1bnRpbWVCaW5kaW5nIiwidGVtcGxhdGVUeXBlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxXQUFTQSw4QkFBVCxDQUNOQyxnQkFETSxFQUVOQyxrQkFGTSxFQUdOQywwQkFITSxFQUlOQyxpQkFKTSxFQUttQjtBQUN6QixXQUFPO0FBQ05DLE1BQUFBLGNBQWMsRUFBRUMsbUJBQW1CLENBQUNMLGdCQUFnQixDQUFDTSxzQkFBakIsRUFBRCxDQUQ3QjtBQUVOQyxNQUFBQSxnQkFBZ0IsRUFBRTtBQUNqQkMsUUFBQUEsTUFBTSxFQUFFQyx1QkFBdUIsQ0FBQ1QsZ0JBQUQsRUFBbUIsY0FBbkIsQ0FEZDtBQUVqQixrQkFBVVMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CLGNBQW5CLENBRmhCO0FBR2pCVSxRQUFBQSxNQUFNLEVBQUVELHVCQUF1QixDQUFDVCxnQkFBRCxFQUFtQixjQUFuQjtBQUhkLE9BRlo7QUFPTlcsTUFBQUEsMEJBQTBCLEVBQUVBLDBCQUEwQixDQUFDVixrQkFBRCxDQVBoRDtBQVFOVyxNQUFBQSx3QkFBd0IsRUFBRUEsd0JBQXdCLENBQUNaLGdCQUFELENBUjVDO0FBU05hLE1BQUFBLGdDQUFnQyxFQUFFVixpQkFBaUIsR0FDaERILGdCQUFnQixDQUFDYyxrQkFBakIsR0FBc0NDLHlCQUF0QyxDQUFnRVosaUJBQWhFLENBRGdELEdBRWhELEtBWEc7QUFZTmEsTUFBQUEsU0FBUyxFQUFFQyxZQUFZLENBQUNqQixnQkFBRCxDQVpqQjtBQWFORSxNQUFBQSwwQkFBMEIsRUFBRUEsMEJBYnRCO0FBY05nQixNQUFBQSxZQUFZLEVBQUVDLGVBQWUsQ0FBQ25CLGdCQUFEO0FBZHZCLEtBQVA7QUFnQkE7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FB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QVksR0FBR3RKLGdCQUFnQixDQUFDbUgsZUFBakIsRUFBckI7O0FBQ0EsUUFDQ21DLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0MsVUFBOUIsSUFDQWlDLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0csa0JBRDlCLElBRUNwSCxpQkFBaUIsSUFBSUgsZ0JBQWdCLENBQUNjLGtCQUFqQixHQUFzQ0MseUJBQXRDLENBQWdFWixpQkFBaEUsQ0FIdkIsRUFJRTtBQUNELGFBQU8sSUFBUDtBQUNBLEtBUnNILENBU3ZIOzs7QUFDQSxXQUFPLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0bGVuZ3RoLFxuXHRFeHByZXNzaW9uLFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0JpbmRpbmcsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRncmVhdGVyVGhhblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLCBUZW1wbGF0ZVR5cGUsIFZpZXdQYXRoQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0UGF0aCwgaXNQYXRoRGVsZXRhYmxlLCBpc1BhdGhJbnNlcnRhYmxlLCBpc1BhdGhVcGRhdGFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL1RhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSA9IHtcblx0aXNUZW1wbGF0ZWQ/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0dmlzaWJsZTogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdGVuYWJsZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcblxudHlwZSBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZSA9IHtcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb246IGJvb2xlYW47XG59O1xudHlwZSBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlID0gUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEFjdGlvbnNDb250ZXh0ID0ge1xuXHRjb2xsZWN0aW9uUGF0aDogc3RyaW5nO1xuXHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRcdFwiZGVsZXRlXCI6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0dXBkYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZDogYm9vbGVhbjtcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBib29sZWFuO1xuXHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0YXZhaWxhYmxlPzogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlc3RyaWN0aW9uczogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBjb250ZXh0IGZvciB0aGUgc3RhbmRhcmQgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcGFyYW0ge1RhYmxlQ29udHJvbENvbmZpZ3VyYXRpb259IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge1ZpZXdQYXRoQ29uZmlndXJhdGlvbn0gdmlld0NvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zICBUaGUgY29udGV4dCBmb3IgdGFibGUgYWN0aW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0IHtcblx0cmV0dXJuIHtcblx0XHRjb2xsZWN0aW9uUGF0aDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0aGlkZGVuQW5ub3RhdGlvbjoge1xuXHRcdFx0Y3JlYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkNyZWF0ZUhpZGRlblwiKSxcblx0XHRcdFwiZGVsZXRlXCI6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiRGVsZXRlSGlkZGVuXCIpLFxuXHRcdFx0dXBkYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIlVwZGF0ZUhpZGRlblwiKVxuXHRcdH0sXG5cdFx0aXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQ6IGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCksXG5cdFx0aXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnM6IHZpZXdDb25maWd1cmF0aW9uXG5cdFx0XHQ/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbilcblx0XHRcdDogZmFsc2UsXG5cdFx0bmV3QWN0aW9uOiBnZXROZXdBY3Rpb24oY29udmVydGVyQ29udGV4dCksXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdHJlc3RyaWN0aW9uczogZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV4dGVybmFsIGNyZWF0ZWQgaXMgY29uZmlndXJlZCBmb3IgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQobmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZTtcblx0cmV0dXJuIChuYXZpZ2F0aW9uICYmIG5hdmlnYXRpb24ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc0Fubm90YXRpb25UZXJtOiBzdHJpbmcpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwXG5cdFx0XHQ/IFtkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0ubmFtZV1cblx0XHRcdDogW107XG5cdHJldHVybiBjdXJyZW50RW50aXR5U2V0XG5cdFx0PyBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0KChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VSSBhcyBhbnkpPy5bc0Fubm90YXRpb25UZXJtXSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtkYXRhTW9kZWxPYmplY3RQYXRoXSksXG5cdFx0XHRpc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbjogISEoZGVmRnVuY3Rpb24uYXBwbHkobnVsbCwgW2RhdGFNb2RlbE9iamVjdFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZV0pIGFzIGFueSlcblx0XHRcdFx0Py5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb25cblx0XHR9O1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGVtcGxhdGluZyBmb3IgaW5zZXJ0L3VwZGF0ZSBhY3Rpb25zIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEcmFmdE9yU3RpY2t5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ3JlYXRlQWx3YXlzSGlkZGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4sXG5cdGlzQ3JlYXRlQWx3YXlzSGlkZGVuOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChpc0RyYWZ0T3JTdGlja3kgfHwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCkgJiYgIWlzQ3JlYXRlQWx3YXlzSGlkZGVuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0ZVZpc2liaWxpdHkgPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGRlbGV0ZVZpc2liaWxpdHkgPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlZmF1bHRUZW1wbGF0aW5nKGRlbGV0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhkZWxldGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVRlbXBsYXRpbmcoXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0NyZWF0aW9uUm93ID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXG5cdC8vVGVtcGxhdGluZyBvZiBDcmVhdGUgQnV0dG9uIGlzIG5vdCBkb25lOlxuXHQvLyBcdCAtIElmIEJ1dHRvbiBpcyBuZXZlciB2aXNpYmxlIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvd1xuXHQvLyAgIC0gT3RoZXJ3aXNlIElmIG5ldyBhY3Rpb24gaXMgY29uZmlndXJlZCBhbmQgbmV2ZXIgYXZhaWxhYmxlXG5cdC8vXHQgLSBPdGhlcndpc2UgSWYgZGVsZXRlIHJlc3RyaWN0aW9ucyBjb21pbmcgZnJvbSBOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIGFyZSBjb25zdGFudGx5IGZhbHNlXG5cdC8vICAgLSBPdGhlcndpc2UgSWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgY3JlYXRlIGFjdGlvblxuXHQvL1x0IC0gT3RoZXJ3aXNlIGlmIHRoZXJlIGlzIGRlbGV0ZSByZXN0cmljdGlvbnMgb24gdGhlIGN1cnJlbnQgZW50aXR5U2V0IHNldCB0byBmYWxzZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3IoYW5kKGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSksIGVxdWFsKGNyZWF0ZVZpc2liaWxpdHksIGZhbHNlKSksIGlzQ3JlYXRpb25Sb3cpLFxuXHRcdGZhbHNlLFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0YW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuaXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb24pLCBpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSkpLFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0bm90KGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgY29uc3RhbnQoZmFsc2UpKSkpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdGVtcGxhdGluZyBvZiB0aGUgbm9uLUNyZWF0ZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gYWN0aW9uVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRpbmcoYWN0aW9uVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGFuZChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpLCBlcXVhbChhY3Rpb25WaXNpYmlsaXR5LCBmYWxzZSkpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLmNyZWF0ZTtcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cblx0Ly9DcmVhdGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IC0gSWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgZXh0ZXJuYWxcblx0Ly8gICAgICAtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCBhbmQgY3JlYXRlIGlzIG5vdCBoaWRkZW5cblx0Ly9cdFx0LSBPdGhlcndpc2UgdGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvLyBcdCBcdC0gSWYgd2UncmUgb24gdGhlIGxpc3QgcmVwb3J0IC0+XG5cdC8vIFx0IFx0XHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0XHQtIE90aGVyd2lzZSwgY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgXHQtIE90aGVyd2lzZVxuXHQvLyBcdCAgXHQgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQsXG5cdFx0aWZFbHNlKFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRub3QoaXNDcmVhdGVIaWRkZW4pLFxuXHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0KSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQobmV3QWN0aW9uPy5hdmFpbGFibGUpLCBlcXVhbChuZXdBY3Rpb24/LmF2YWlsYWJsZSwgZmFsc2UpKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksICFuZXdBY3Rpb24pLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbiksIGVxdWFsKGlzQ3JlYXRlSGlkZGVuLCB0cnVlKSksXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRcdGlmRWxzZShpc0JpbmRpbmcoaXNDcmVhdGVIaWRkZW4pLCBub3QoaXNDcmVhdGVIaWRkZW4pLCB0cnVlKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzRGVsZXRlSGlkZGVuKSwgbm90KGlzRGVsZXRlSGlkZGVuKSwgdHJ1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKFxuXHRcdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHRcdCksXG5cdFx0W1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmRleE9mKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpID09PSAtMSAmJlxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGFuZChub3QoYW5kKGlzQ29uc3RhbnQocGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSksIGJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0KSxcblx0XHRhbmQodGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiwgbm90KGlzVXBkYXRlSGlkZGVuKSksXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgQ29sbGVjdGlvblR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LnJlc29sdmVBYnNvbHV0ZVBhdGg8YW55PihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNvbGxlY3Rpb25QYXRoKS50YXJnZXQ/Ll90eXBlO1xuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aWZFbHNlKFxuXHRcdFx0Q29sbGVjdGlvblR5cGUgPT09IFwiRW50aXR5U2V0XCIsXG5cdFx0XHR0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSxcblx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRhbmQoaXNJbnNlcnRhYmxlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKTtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCksXG5cdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCAwKSwgaXNEZWxldGFibGUpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBQYXN0ZS5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IHBhc3RlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGVFbmFibGVtZW50XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXN0ZUVuYWJsZW1lbnQocGFzdGVWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+LCBjcmVhdGVFbmFibGVtZW50OiBFeHByZXNzaW9uPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBhbmQocGFzdGVWaXNpYmlsaXR5LCBjcmVhdGVFbmFibGVtZW50KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gbWFzc0VkaXRWaXNpYmlsaXR5XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXNzRWRpdEVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdG1hc3NFZGl0VmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHBhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID1cblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5pc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbiAmJiAhaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbik7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKGJpbmRpbmdFeHByZXNzaW9uKFwidXBkYXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKSksIDEpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IGlzRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGJEaXNwbGF5TW9kZSA9IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBiaW5kaW5nIGluIGNhc2Vcblx0Ly8gMS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSBpcyB0cnVlKS5cblx0Ly8gMi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZChsaWtlIExSKSwgaW4gdGhpcyBjYXNlIG9ubHkgYWN0aXZlIGNvbnRleHRzIGNhbiBiZSBtYXNzIGVkaXRlZC5cblx0Ly8gICAgU28sIHVwZGF0ZSBkZXBlbmRzIG9uICdJc0FjdGl2ZUVudGl0eScgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgY2hlY2tlZCBydW50aW1lLlxuXHRjb25zdCBydW50aW1lQmluZGluZyA9IGlmRWxzZShcblx0XHRvcihhbmQoYkRpc3BsYXlNb2RlLCBiSXNEcmFmdFN1cHBvcnRlZCksIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpXG5cdCk7XG5cblx0cmV0dXJuIGFuZChtYXNzRWRpdFZpc2liaWxpdHksIGlmRWxzZShpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5LCBydW50aW1lQmluZGluZywgYW5kKHJ1bnRpbWVCaW5kaW5nLCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikpKTtcbn1cblxuLyoqXG4gKiBUZWxscyBpZiB0aGUgdGFibGUgaW4gdGVtcGxhdGUgaXMgaW4gZGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtWaWV3UGF0aENvbmZpZ3VyYXRpb259IHZpZXdDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG4iXX0=
|