@sapui5/sap.fe.core 1.100.0 → 1.101.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 +4 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AnnotationHelper.js +43 -24
- package/src/sap/fe/core/AnnotationHelper.ts +43 -37
- package/src/sap/fe/core/AppComponent.js +20 -27
- package/src/sap/fe/core/AppComponent.ts +19 -25
- package/src/sap/fe/core/AppStateHandler.js +5 -5
- package/src/sap/fe/core/AppStateHandler.ts +2 -2
- package/src/sap/fe/core/BaseController.js +9 -9
- package/src/sap/fe/core/BaseController.ts +3 -4
- package/src/sap/fe/core/CommonUtils.js +74 -17
- package/src/sap/fe/core/CommonUtils.ts +181 -110
- package/src/sap/fe/core/ExtensionAPI.js +11 -10
- package/src/sap/fe/core/ExtensionAPI.ts +22 -30
- package/src/sap/fe/core/PageController.js +12 -11
- package/src/sap/fe/core/PageController.ts +34 -34
- package/src/sap/fe/core/RouterProxy.js +36 -24
- package/src/sap/fe/core/RouterProxy.ts +36 -22
- package/src/sap/fe/core/TemplateComponent.js +193 -118
- package/src/sap/fe/core/TemplateComponent.ts +105 -117
- package/src/sap/fe/core/TemplateModel.js +6 -8
- package/src/sap/fe/core/TemplateModel.ts +2 -2
- package/src/sap/fe/core/TransactionHelper.js +33 -18
- package/src/sap/fe/core/TransactionHelper.ts +172 -153
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +31 -17
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +52 -45
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +16 -6
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +13 -3
- package/src/sap/fe/core/actions/collaboration/Manage.js +9 -7
- package/src/sap/fe/core/actions/collaboration/Manage.ts +33 -31
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +53 -56
- package/src/sap/fe/core/actions/draft.js +308 -166
- package/src/sap/fe/core/actions/draft.ts +177 -74
- package/src/sap/fe/core/actions/messageHandling.js +25 -13
- package/src/sap/fe/core/actions/messageHandling.ts +49 -39
- package/src/sap/fe/core/actions/operations.js +4 -4
- package/src/sap/fe/core/actions/operations.ts +3 -2
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +506 -245
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +395 -275
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +15 -17
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +98 -96
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +15 -15
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +60 -53
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +94 -42
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +114 -91
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
- package/src/sap/fe/core/controllerextensions/MassEdit.js +12 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +8 -9
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +13 -25
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +18 -28
- package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
- package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -18
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +16 -16
- package/src/sap/fe/core/controllerextensions/Share.ts +32 -32
- package/src/sap/fe/core/controllerextensions/SideEffects.js +14 -14
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +62 -63
- package/src/sap/fe/core/controllerextensions/ViewState.js +17 -31
- package/src/sap/fe/core/controllerextensions/ViewState.ts +93 -102
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +38 -15
- package/src/sap/fe/core/controls/CommandExecution.ts +20 -20
- package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +73 -36
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +22 -32
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +116 -66
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +121 -67
- package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
- package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
- package/src/sap/fe/core/controls/FileWrapper.js +313 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
- package/src/sap/fe/core/controls/FilterBar.js +154 -119
- package/src/sap/fe/core/controls/FilterBar.ts +128 -123
- package/src/sap/fe/core/controls/FormElementWrapper.js +92 -37
- package/src/sap/fe/core/controls/FormElementWrapper.ts +32 -35
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +7 -6
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +15 -14
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +5 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +3 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +10 -10
- package/src/sap/fe/core/converters/controls/Common/Action.ts +20 -19
- package/src/sap/fe/core/converters/controls/Common/Chart.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -11
- package/src/sap/fe/core/converters/controls/Common/Form.js +5 -5
- package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
- package/src/sap/fe/core/converters/controls/Common/Table.js +245 -112
- package/src/sap/fe/core/converters/controls/Common/Table.ts +305 -193
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -7
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +72 -43
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +134 -100
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +5 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +4 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +2 -2
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
- package/src/sap/fe/core/fpm/Component.js +46 -17
- package/src/sap/fe/core/fpm/Component.ts +11 -16
- package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
- package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
- package/src/sap/fe/core/helpers/ClassSupport.ts +314 -237
- package/src/sap/fe/core/helpers/MassEditHelper.js +173 -39
- package/src/sap/fe/core/helpers/MassEditHelper.ts +236 -132
- package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
- package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +0 -4
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
- package/src/sap/fe/core/library.js +4 -5
- package/src/sap/fe/core/library.ts +17 -17
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
- package/src/sap/fe/core/messagebundle.properties +23 -8
- package/src/sap/fe/core/messagebundle_ar.properties +2 -0
- package/src/sap/fe/core/messagebundle_bg.properties +2 -0
- package/src/sap/fe/core/messagebundle_ca.properties +2 -0
- package/src/sap/fe/core/messagebundle_cs.properties +2 -0
- package/src/sap/fe/core/messagebundle_cy.properties +5 -3
- package/src/sap/fe/core/messagebundle_da.properties +2 -0
- package/src/sap/fe/core/messagebundle_de.properties +2 -0
- package/src/sap/fe/core/messagebundle_el.properties +2 -0
- package/src/sap/fe/core/messagebundle_en.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +2 -0
- package/src/sap/fe/core/messagebundle_es.properties +2 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
- package/src/sap/fe/core/messagebundle_et.properties +2 -0
- package/src/sap/fe/core/messagebundle_fi.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr.properties +4 -2
- package/src/sap/fe/core/messagebundle_fr_CA.properties +5 -3
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +5 -3
- package/src/sap/fe/core/messagebundle_hu.properties +2 -0
- package/src/sap/fe/core/messagebundle_id.properties +2 -0
- package/src/sap/fe/core/messagebundle_it.properties +2 -0
- package/src/sap/fe/core/messagebundle_iw.properties +2 -0
- package/src/sap/fe/core/messagebundle_ja.properties +2 -0
- package/src/sap/fe/core/messagebundle_kk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +2 -0
- package/src/sap/fe/core/messagebundle_lv.properties +5 -3
- package/src/sap/fe/core/messagebundle_ms.properties +2 -0
- package/src/sap/fe/core/messagebundle_nl.properties +2 -0
- package/src/sap/fe/core/messagebundle_no.properties +2 -0
- package/src/sap/fe/core/messagebundle_pl.properties +5 -3
- package/src/sap/fe/core/messagebundle_pt.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
- package/src/sap/fe/core/messagebundle_ro.properties +5 -3
- package/src/sap/fe/core/messagebundle_ru.properties +5 -3
- package/src/sap/fe/core/messagebundle_sh.properties +2 -0
- package/src/sap/fe/core/messagebundle_sk.properties +2 -0
- package/src/sap/fe/core/messagebundle_sl.properties +2 -0
- package/src/sap/fe/core/messagebundle_sv.properties +3 -1
- package/src/sap/fe/core/messagebundle_th.properties +2 -0
- package/src/sap/fe/core/messagebundle_tr.properties +2 -0
- package/src/sap/fe/core/messagebundle_uk.properties +2 -0
- package/src/sap/fe/core/messagebundle_vi.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +5 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +5 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -7
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.js +4 -4
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -62
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +51 -42
- package/src/sap/fe/core/services/ShellServicesFactory.js +69 -29
- package/src/sap/fe/core/services/ShellServicesFactory.ts +26 -29
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +8 -8
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +6 -17
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +0 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
- package/src/sap/fe/core/templating/PropertyHelper.js +15 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +30 -23
- package/src/sap/fe/core/templating/UIFormatters.js +121 -21
- package/src/sap/fe/core/templating/UIFormatters.ts +134 -49
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +8 -7
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
function _settle(pact, state, value) {
|
|
7
|
+
if (!pact.s) {
|
|
8
|
+
if (value instanceof _Pact) {
|
|
9
|
+
if (value.s) {
|
|
10
|
+
if (state & 1) {
|
|
11
|
+
state = value.s;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
value = value.v;
|
|
15
|
+
} else {
|
|
16
|
+
value.o = _settle.bind(null, pact, state);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (value && value.then) {
|
|
22
|
+
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
pact.s = state;
|
|
27
|
+
pact.v = value;
|
|
28
|
+
var observer = pact.o;
|
|
29
|
+
|
|
30
|
+
if (observer) {
|
|
31
|
+
observer(pact);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var _Pact = /*#__PURE__*/function () {
|
|
37
|
+
function _Pact() {}
|
|
38
|
+
|
|
39
|
+
_Pact.prototype.then = function (onFulfilled, onRejected) {
|
|
40
|
+
var result = new _Pact();
|
|
41
|
+
var state = this.s;
|
|
42
|
+
|
|
43
|
+
if (state) {
|
|
44
|
+
var callback = state & 1 ? onFulfilled : onRejected;
|
|
45
|
+
|
|
46
|
+
if (callback) {
|
|
47
|
+
try {
|
|
48
|
+
_settle(result, 1, callback(this.v));
|
|
49
|
+
} catch (e) {
|
|
50
|
+
_settle(result, 2, e);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return result;
|
|
54
|
+
} else {
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.o = function (_this) {
|
|
60
|
+
try {
|
|
61
|
+
var value = _this.v;
|
|
62
|
+
|
|
63
|
+
if (_this.s & 1) {
|
|
64
|
+
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
65
|
+
} else if (onRejected) {
|
|
66
|
+
_settle(result, 1, onRejected(value));
|
|
67
|
+
} else {
|
|
68
|
+
_settle(result, 2, value);
|
|
69
|
+
}
|
|
70
|
+
} catch (e) {
|
|
71
|
+
_settle(result, 2, e);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
return _Pact;
|
|
79
|
+
}();
|
|
80
|
+
|
|
81
|
+
function _isSettledPact(thenable) {
|
|
82
|
+
return thenable instanceof _Pact && thenable.s & 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function _forTo(array, body, check) {
|
|
86
|
+
var i = -1,
|
|
87
|
+
pact,
|
|
88
|
+
reject;
|
|
89
|
+
|
|
90
|
+
function _cycle(result) {
|
|
91
|
+
try {
|
|
92
|
+
while (++i < array.length && (!check || !check())) {
|
|
93
|
+
result = body(i);
|
|
94
|
+
|
|
95
|
+
if (result && result.then) {
|
|
96
|
+
if (_isSettledPact(result)) {
|
|
97
|
+
result = result.v;
|
|
98
|
+
} else {
|
|
99
|
+
result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (pact) {
|
|
106
|
+
_settle(pact, 1, result);
|
|
107
|
+
} else {
|
|
108
|
+
pact = result;
|
|
109
|
+
}
|
|
110
|
+
} catch (e) {
|
|
111
|
+
_settle(pact || (pact = new _Pact()), 2, e);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
_cycle();
|
|
116
|
+
|
|
117
|
+
return pact;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, AttributeModel, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
121
|
+
"use strict";
|
|
122
|
+
|
|
123
|
+
var _exports = {};
|
|
124
|
+
|
|
125
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
126
|
+
|
|
127
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
128
|
+
|
|
129
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
130
|
+
|
|
131
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
132
|
+
|
|
133
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
134
|
+
|
|
135
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
136
|
+
|
|
137
|
+
function _catch(body, recover) {
|
|
138
|
+
try {
|
|
139
|
+
var result = body();
|
|
140
|
+
} catch (e) {
|
|
141
|
+
return recover(e);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (result && result.then) {
|
|
145
|
+
return result.then(void 0, recover);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
var processBuildingBlock = function (buildingBLockDefinition, oNode, oVisitor) {
|
|
152
|
+
var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
var _temp5 = _catch(function () {
|
|
156
|
+
var sFragmentName = buildingBLockDefinition.fragment || "".concat(buildingBLockDefinition.namespace, ".").concat(buildingBLockDefinition.name);
|
|
157
|
+
var sName = "this";
|
|
158
|
+
var mContexts = {};
|
|
159
|
+
var oMetadataContexts = {};
|
|
160
|
+
var oSettings = oVisitor.getSettings(); // TODO Move this elsewhere this is weird :)
|
|
161
|
+
|
|
162
|
+
if (oSettings.models["sap.fe.i18n"]) {
|
|
163
|
+
oSettings.models["sap.fe.i18n"].getResourceBundle().then(function (oResourceBundle) {
|
|
164
|
+
ResourceModel.setApplicationI18nBundle(oResourceBundle);
|
|
165
|
+
}).catch(function (error) {
|
|
166
|
+
Log.error(error);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var oMetadata = prepareMetadata(buildingBLockDefinition.metadata); //Inject storage for macros
|
|
171
|
+
|
|
172
|
+
if (!oSettings[sFragmentName]) {
|
|
173
|
+
oSettings[sFragmentName] = {};
|
|
174
|
+
} // First of all we need to visit the attributes
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
|
|
178
|
+
var mMissingContext = _ref.mMissingContext,
|
|
179
|
+
propertyValues = _ref.propertyValues;
|
|
180
|
+
// Aggregation and complex type support
|
|
181
|
+
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues)).then(function (oAggregations) {
|
|
182
|
+
var oInstance;
|
|
183
|
+
var oControlConfig = {};
|
|
184
|
+
|
|
185
|
+
if (oSettings.models.viewData) {
|
|
186
|
+
// Only used in the Field macro and even then maybe not really useful
|
|
187
|
+
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.create) {
|
|
191
|
+
propertyValues = buildingBLockDefinition.create.call(buildingBLockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
|
|
192
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
|
|
193
|
+
if (oMetadata.metadataContexts[sMetadataName].computed) {
|
|
194
|
+
mContexts[sMetadataName] = propertyValues[sMetadataName];
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
Object.keys(mMissingContext).forEach(function (sContextName) {
|
|
198
|
+
if (propertyValues.hasOwnProperty(sContextName)) {
|
|
199
|
+
mContexts[sContextName] = propertyValues[sContextName];
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
} else if (buildingBLockDefinition.apiVersion === 2) {
|
|
203
|
+
Object.keys(propertyValues).forEach(function (propName) {
|
|
204
|
+
var oData = propertyValues[propName];
|
|
205
|
+
|
|
206
|
+
if (oData && oData.isA && oData.isA("sap.ui.model.Context") && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
|
|
207
|
+
propertyValues[propName] = oData.getObject();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
var BuildingBlockClass = buildingBLockDefinition;
|
|
211
|
+
oInstance = new BuildingBlockClass(propertyValues
|
|
212
|
+
/*, oControlConfig, oSettings, oAggregations, isPublic*/
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
var oAttributesModel = new AttributeModel(oNode, propertyValues, buildingBLockDefinition);
|
|
217
|
+
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
218
|
+
var oPreviousMacroInfo; // Keep track
|
|
219
|
+
|
|
220
|
+
if (TraceInfo.isTraceInfoActive()) {
|
|
221
|
+
var oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
|
|
222
|
+
|
|
223
|
+
if (oTraceInfo) {
|
|
224
|
+
oPreviousMacroInfo = oSettings["_macroInfo"];
|
|
225
|
+
oSettings["_macroInfo"] = oTraceInfo.macroInfo;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
|
|
230
|
+
var oContextVisitor = oVisitor.with(mContexts, buildingBLockDefinition.isOpen !== undefined ? !buildingBLockDefinition.isOpen : true);
|
|
231
|
+
var oParent = oNode.parentNode;
|
|
232
|
+
var iChildIndex;
|
|
233
|
+
var oPromise;
|
|
234
|
+
|
|
235
|
+
var _temp3 = function () {
|
|
236
|
+
if (oParent) {
|
|
237
|
+
iChildIndex = Array.from(oParent.children).indexOf(oNode);
|
|
238
|
+
|
|
239
|
+
if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.getTemplate || buildingBLockDefinition.apiVersion === 2) {
|
|
240
|
+
var oTemplate;
|
|
241
|
+
|
|
242
|
+
if (buildingBLockDefinition.apiVersion === 2) {
|
|
243
|
+
oTemplate = oInstance.getTemplate();
|
|
244
|
+
} else if (buildingBLockDefinition.getTemplate) {
|
|
245
|
+
oTemplate = buildingBLockDefinition.getTemplate(propertyValues);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (oTemplate) {
|
|
249
|
+
if (!oTemplate.firstElementChild) {
|
|
250
|
+
oTemplate = DOMParserInstance.parseFromString(oTemplate, "text/xml");
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
oNode.replaceWith(oTemplate.firstElementChild);
|
|
254
|
+
oNode = oParent.children[iChildIndex];
|
|
255
|
+
oPromise = oContextVisitor.visitNode(oNode);
|
|
256
|
+
} else {
|
|
257
|
+
oNode.remove();
|
|
258
|
+
oPromise = Promise.resolve();
|
|
259
|
+
}
|
|
260
|
+
} else {
|
|
261
|
+
oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return Promise.resolve(oPromise).then(function () {
|
|
265
|
+
var oMacroElement = oParent.children[iChildIndex];
|
|
266
|
+
|
|
267
|
+
if (Object.keys(oAggregations).length > 0) {
|
|
268
|
+
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
269
|
+
var oAggregationElement = oAggregations[sAggregationName];
|
|
270
|
+
|
|
271
|
+
if (oMacroElement !== null && oMacroElement !== undefined) {
|
|
272
|
+
var oNewChild = document.createElementNS(oMacroElement.namespaceURI, sAggregationName);
|
|
273
|
+
var oElementChild = oAggregationElement.firstElementChild;
|
|
274
|
+
|
|
275
|
+
while (oElementChild) {
|
|
276
|
+
var oNextChild = oElementChild.nextElementSibling;
|
|
277
|
+
oNewChild.appendChild(oElementChild);
|
|
278
|
+
oElementChild = oNextChild;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
282
|
+
var sSlotName = oMetadata.aggregations[sAggregationName] && oMetadata.aggregations[sAggregationName].slot || sAggregationName;
|
|
283
|
+
var oTargetElement = oMacroElement.querySelector("slot[name='" + sSlotName + "']");
|
|
284
|
+
|
|
285
|
+
if (oTargetElement) {
|
|
286
|
+
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
oMacroElement.appendChild(oNewChild);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (oMacroElement) {
|
|
296
|
+
var oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
297
|
+
oRemainingSlots.forEach(function (oSlotElement) {
|
|
298
|
+
oSlotElement.remove();
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (oPreviousMacroInfo) {
|
|
303
|
+
//restore macro info if available
|
|
304
|
+
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
305
|
+
} else {
|
|
306
|
+
delete oSettings["_macroInfo"];
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}();
|
|
311
|
+
|
|
312
|
+
if (_temp3 && _temp3.then) return _temp3.then(function () {});
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}, function (e) {
|
|
316
|
+
Log.error(e);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {}) : void 0);
|
|
320
|
+
} catch (e) {
|
|
321
|
+
return Promise.reject(e);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues) {
|
|
326
|
+
try {
|
|
327
|
+
var oAggregations = {};
|
|
328
|
+
|
|
329
|
+
var _temp2 = function () {
|
|
330
|
+
if (oNode.firstElementChild !== null) {
|
|
331
|
+
// If there are aggregation we need to visit the childNodes first and foremost
|
|
332
|
+
return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {
|
|
333
|
+
var oFirstElementChild = oNode.firstElementChild;
|
|
334
|
+
|
|
335
|
+
while (oFirstElementChild !== null) {
|
|
336
|
+
var sChildName = oFirstElementChild.localName;
|
|
337
|
+
|
|
338
|
+
if (Object.keys(oMetadata.aggregations).indexOf(sChildName) !== -1 && (!isPublic || oMetadata.aggregations[sChildName].isPublic)) {
|
|
339
|
+
oAggregations[oFirstElementChild.localName] = oFirstElementChild;
|
|
340
|
+
} else if (Object.keys(oMetadata.properties).indexOf(sChildName) !== -1) {
|
|
341
|
+
// Object Type properties
|
|
342
|
+
propertyValues[sChildName] = {};
|
|
343
|
+
|
|
344
|
+
for (var _i = 0, _Object$keys = Object.keys(oFirstElementChild.attributes); _i < _Object$keys.length; _i++) {
|
|
345
|
+
var attributeIndex = _Object$keys[_i];
|
|
346
|
+
propertyValues[sChildName][oFirstElementChild.attributes[attributeIndex].localName] = oFirstElementChild.attributes[attributeIndex].value;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
oFirstElementChild = oFirstElementChild.nextElementSibling;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}();
|
|
355
|
+
|
|
356
|
+
return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {
|
|
357
|
+
return oAggregations;
|
|
358
|
+
}) : oAggregations);
|
|
359
|
+
} catch (e) {
|
|
360
|
+
return Promise.reject(e);
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
|
|
365
|
+
try {
|
|
366
|
+
function _temp10() {
|
|
367
|
+
// Sort keys to be sure contextPath is before metaPath ( yes I'm desperate )
|
|
368
|
+
aDefinitionContextsKeys = aDefinitionContextsKeys.sort(function (a, b) {
|
|
369
|
+
return a > b ? 1 : -1;
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
for (var _j = 0; _j < aDefinitionContextsKeys.length; _j++) {
|
|
373
|
+
var sAttributeName = aDefinitionContextsKeys[_j];
|
|
374
|
+
var bDoNotResolve = isPublic && !oDefinitionContexts[sAttributeName].isPublic && oNode.hasAttribute(sAttributeName);
|
|
375
|
+
|
|
376
|
+
var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve);
|
|
377
|
+
|
|
378
|
+
if (oMetadataContext) {
|
|
379
|
+
oMetadataContext.name = sAttributeName;
|
|
380
|
+
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
381
|
+
|
|
382
|
+
if (sAttributeName === "entitySet" && !oSettings.bindingContexts.hasOwnProperty(sAttributeName) || sAttributeName === "contextPath" && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
383
|
+
oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (sAttributeName === "contextPath") {
|
|
387
|
+
oSettings.currentContextPath = mContexts[sAttributeName];
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
propertyValues[sAttributeName] = mContexts[sAttributeName];
|
|
391
|
+
} else {
|
|
392
|
+
mMissingContext[sAttributeName] = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return {
|
|
397
|
+
mMissingContext: mMissingContext,
|
|
398
|
+
propertyValues: propertyValues
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
var mMissingContext = {};
|
|
403
|
+
var oDefinitionProperties = oMetadata.properties;
|
|
404
|
+
var oDefinitionContexts = oMetadata.metadataContexts;
|
|
405
|
+
oSettings.currentContextPath = oSettings.bindingContexts.contextPath; // Retrieve properties values
|
|
406
|
+
|
|
407
|
+
var aDefinitionPropertiesKeys = Object.keys(oDefinitionProperties);
|
|
408
|
+
var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
|
|
409
|
+
var propertyValues = {};
|
|
410
|
+
|
|
411
|
+
var _temp11 = _forTo(aDefinitionPropertiesKeys, function (j) {
|
|
412
|
+
var sKeyValue = aDefinitionPropertiesKeys[j];
|
|
413
|
+
|
|
414
|
+
if (oDefinitionProperties[sKeyValue].type === "object") {
|
|
415
|
+
propertyValues[sKeyValue] = {}; // To avoid vales being reused accross macros
|
|
416
|
+
} else {
|
|
417
|
+
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
var _temp7 = function () {
|
|
421
|
+
if (oNode.hasAttribute(sKeyValue) && isPublic && !oDefinitionProperties[sKeyValue].isPublic) {
|
|
422
|
+
Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
|
|
423
|
+
} else {
|
|
424
|
+
var _temp12 = function () {
|
|
425
|
+
if (oNode.hasAttribute(sKeyValue)) {
|
|
426
|
+
return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
|
|
427
|
+
var vValue = oNode.getAttribute(sKeyValue);
|
|
428
|
+
|
|
429
|
+
if (vValue !== undefined) {
|
|
430
|
+
propertyValues[sKeyValue] = vValue;
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
}();
|
|
435
|
+
|
|
436
|
+
if (_temp12 && _temp12.then) return _temp12.then(function () {});
|
|
437
|
+
}
|
|
438
|
+
}();
|
|
439
|
+
|
|
440
|
+
if (_temp7 && _temp7.then) return _temp7.then(function () {});
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(_temp10) : _temp10(_temp11));
|
|
444
|
+
} catch (e) {
|
|
445
|
+
return Promise.reject(e);
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
var LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockRuntime";
|
|
450
|
+
var DOMParserInstance = new DOMParser();
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Typeguard for checking if a building block use API 1.
|
|
454
|
+
*
|
|
455
|
+
* @param buildingBlockDefinition
|
|
456
|
+
* @returns `true` if the building block is using API 1.
|
|
457
|
+
*/
|
|
458
|
+
function isV1MacroDef(buildingBlockDefinition) {
|
|
459
|
+
return buildingBlockDefinition.apiVersion === undefined || buildingBlockDefinition.apiVersion === 1;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
|
|
463
|
+
var oContext = mContexts[sKey];
|
|
464
|
+
var oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
|
|
465
|
+
|
|
466
|
+
if (oContextSettings.required && (!oContext || oContextObject === null)) {
|
|
467
|
+
throw new Error("".concat(sName, ": Required metadataContext '").concat(sKey, "' is missing"));
|
|
468
|
+
} else if (oContextObject) {
|
|
469
|
+
// If context object has $kind property, $Type should not be checked
|
|
470
|
+
// Therefore remove from context settings
|
|
471
|
+
if (oContextObject.hasOwnProperty("$kind") && oContextSettings.$kind) {
|
|
472
|
+
// Check if the $kind is part of the allowed ones
|
|
473
|
+
if (oContextSettings.$kind.indexOf(oContextObject["$kind"]) === -1) {
|
|
474
|
+
throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$kind' '").concat(oContextSettings["$kind"], "' but is '").concat(oContextObject.$kind, "': ").concat(oContext.getPath()));
|
|
475
|
+
}
|
|
476
|
+
} else if (oContextObject.hasOwnProperty("$Type") && oContextSettings.$Type) {
|
|
477
|
+
// Check only $Type
|
|
478
|
+
if (oContextSettings.$Type.indexOf(oContextObject["$Type"]) === -1) {
|
|
479
|
+
throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$Type' '").concat(oContextSettings["$Type"], "' but is '").concat(oContextObject.$Type, "': ").concat(oContext.getPath()));
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
function validateMacroSignature(sName, oMetadata, mContexts, oNode) {
|
|
486
|
+
var aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [],
|
|
487
|
+
aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
|
|
488
|
+
oAttributeNames = {}; // collect all attributes to find unchecked properties
|
|
489
|
+
|
|
490
|
+
Object.keys(oNode.attributes).forEach(function (iKey) {
|
|
491
|
+
var sKey = oNode.attributes[iKey].name;
|
|
492
|
+
oAttributeNames[sKey] = true;
|
|
493
|
+
}); //Check metadataContexts
|
|
494
|
+
|
|
495
|
+
aMetadataContextKeys.forEach(function (sKey) {
|
|
496
|
+
var oContextSettings = oMetadata.metadataContexts[sKey];
|
|
497
|
+
validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey);
|
|
498
|
+
delete oAttributeNames[sKey];
|
|
499
|
+
}); //Check properties
|
|
500
|
+
|
|
501
|
+
aProperties.forEach(function (sKey) {
|
|
502
|
+
var oPropertySettings = oMetadata.properties[sKey];
|
|
503
|
+
|
|
504
|
+
if (!oNode.hasAttribute(sKey)) {
|
|
505
|
+
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
506
|
+
throw new Error(sName + ": " + "Required property '" + sKey + "' is missing");
|
|
507
|
+
}
|
|
508
|
+
} else {
|
|
509
|
+
delete oAttributeNames[sKey];
|
|
510
|
+
}
|
|
511
|
+
}); // Unchecked properties
|
|
512
|
+
|
|
513
|
+
Object.keys(oAttributeNames).forEach(function (sKey) {
|
|
514
|
+
// no check for properties which start with underscore "_" or contain a colon ":" (different namespace), e.g. xmlns:trace, trace:macroID, unittest:id
|
|
515
|
+
if (sKey.indexOf(":") < 0 && !sKey.startsWith("xmlns")) {
|
|
516
|
+
Log.warning("Unchecked parameter: ".concat(sName, ": ").concat(sKey), undefined, LOGGER_SCOPE);
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Ensures that the metadata for the building block are properly defined.
|
|
522
|
+
*
|
|
523
|
+
* @param buildingBlockMetadata The metadata received from the input
|
|
524
|
+
* @returns A set of completed metadata for further processing
|
|
525
|
+
*/
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
_exports.validateMacroSignature = validateMacroSignature;
|
|
529
|
+
|
|
530
|
+
function prepareMetadata(buildingBlockMetadata) {
|
|
531
|
+
if (buildingBlockMetadata) {
|
|
532
|
+
var oProperties = {};
|
|
533
|
+
var oAggregations = {
|
|
534
|
+
"dependents": {
|
|
535
|
+
type: "sap.ui.core.Element"
|
|
536
|
+
},
|
|
537
|
+
"customData": {
|
|
538
|
+
type: "sap.ui.core.Element"
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
var oMetadataContexts = {};
|
|
542
|
+
Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
|
|
543
|
+
if (buildingBlockMetadata.properties[sPropertyName].type !== "sap.ui.model.Context") {
|
|
544
|
+
oProperties[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
545
|
+
} else {
|
|
546
|
+
oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
547
|
+
}
|
|
548
|
+
}); // Merge events into properties as they are handled identically
|
|
549
|
+
|
|
550
|
+
if (buildingBlockMetadata.events) {
|
|
551
|
+
Object.keys(buildingBlockMetadata.events).forEach(function (sEventName) {
|
|
552
|
+
oProperties[sEventName] = buildingBlockMetadata.events[sEventName];
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (buildingBlockMetadata.aggregations) {
|
|
557
|
+
Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
|
|
558
|
+
oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return {
|
|
563
|
+
properties: oProperties,
|
|
564
|
+
aggregations: oAggregations,
|
|
565
|
+
metadataContexts: oMetadataContexts
|
|
566
|
+
};
|
|
567
|
+
} else {
|
|
568
|
+
return {
|
|
569
|
+
metadataContexts: {},
|
|
570
|
+
aggregations: {
|
|
571
|
+
"dependents": {
|
|
572
|
+
type: "sap.ui.core.Element"
|
|
573
|
+
},
|
|
574
|
+
"customData": {
|
|
575
|
+
type: "sap.ui.core.Element"
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
properties: {}
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve) {
|
|
584
|
+
var oMetadataContext;
|
|
585
|
+
|
|
586
|
+
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
587
|
+
var sAttributeValue = oNode.getAttribute(sAttributeName);
|
|
588
|
+
var sMetaPath; // oVisitor.getResult(sAttributeValue, oNode);
|
|
589
|
+
|
|
590
|
+
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
591
|
+
|
|
592
|
+
if (!oMetadataContext) {
|
|
593
|
+
if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
|
|
594
|
+
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
595
|
+
// absolute path - we just use this one
|
|
596
|
+
sMetaPath = sAttributeValue;
|
|
597
|
+
} else {
|
|
598
|
+
var sContextPath = oSettings.currentContextPath.getPath();
|
|
599
|
+
|
|
600
|
+
if (!sContextPath.endsWith("/")) {
|
|
601
|
+
sContextPath += "/";
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
sMetaPath = sContextPath + sAttributeValue;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
oMetadataContext = {
|
|
608
|
+
model: "metaModel",
|
|
609
|
+
path: sMetaPath
|
|
610
|
+
};
|
|
611
|
+
} else {
|
|
612
|
+
oMetadataContext = {
|
|
613
|
+
model: "metaModel",
|
|
614
|
+
path: oSettings.bindingContexts.entitySet ? oSettings.bindingContexts.entitySet.getPath(sAttributeValue) : sAttributeValue
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
} else if (oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
619
|
+
oMetadataContext = {
|
|
620
|
+
model: sAttributeName,
|
|
621
|
+
path: ""
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
return oMetadataContext;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
|
|
629
|
+
var sKey = oCtx.name || oCtx.model || undefined;
|
|
630
|
+
|
|
631
|
+
if (oMetadataContexts[sKey]) {
|
|
632
|
+
return; // do not add twice
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
try {
|
|
636
|
+
var sContextPath = oCtx.path;
|
|
637
|
+
|
|
638
|
+
if (oCtx.model != null) {
|
|
639
|
+
sContextPath = oCtx.model + ">" + sContextPath;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
var mSetting = oVisitor.getSettings();
|
|
643
|
+
|
|
644
|
+
if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
|
|
645
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
|
|
646
|
+
} else {
|
|
647
|
+
mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
oMetadataContexts[sKey] = mContexts[sKey]; // make it available inside metadataContexts JSON object
|
|
651
|
+
} catch (ex) {//console.error(ex);
|
|
652
|
+
// ignore the context as this can only be the case if the model is not ready, i.e. not a preprocessing model but maybe a model for
|
|
653
|
+
// providing afterwards
|
|
654
|
+
// TODO not yet implemented
|
|
655
|
+
//mContexts["_$error"].oModel.setProperty("/" + sKey, ex);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Register a building block definition to be used inside the xml template processor.
|
|
660
|
+
*
|
|
661
|
+
* @param buildingBlockDefinition The building block definition
|
|
662
|
+
*/
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
function registerBuildingBlock(buildingBlockDefinition) {
|
|
666
|
+
XMLPreprocessor.plugIn(function (oNode, oVisitor) {
|
|
667
|
+
return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor);
|
|
668
|
+
}, buildingBlockDefinition.namespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
669
|
+
|
|
670
|
+
if (buildingBlockDefinition.publicNamespace) {
|
|
671
|
+
XMLPreprocessor.plugIn(function (oNode, oVisitor) {
|
|
672
|
+
return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor, true);
|
|
673
|
+
}, buildingBlockDefinition.publicNamespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Create an XML representation of the string used in the template literal.
|
|
678
|
+
*
|
|
679
|
+
* @param strings The string parts of the template literal
|
|
680
|
+
* @param values The values part of the template literal
|
|
681
|
+
* @returns The XML document representing the string that was used.
|
|
682
|
+
*/
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
686
|
+
|
|
687
|
+
var xml = function (strings) {
|
|
688
|
+
var outStr = "";
|
|
689
|
+
var i;
|
|
690
|
+
|
|
691
|
+
for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
692
|
+
values[_key - 1] = arguments[_key];
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
for (i = 0; i < values.length; i++) {
|
|
696
|
+
outStr += strings[i];
|
|
697
|
+
outStr += values[i];
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
outStr += strings[i];
|
|
701
|
+
return DOMParserInstance.parseFromString(outStr, "text/xml");
|
|
702
|
+
};
|
|
703
|
+
|
|
704
|
+
_exports.xml = xml;
|
|
705
|
+
return _exports;
|
|
706
|
+
}, false);
|
|
707
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsImlzVjFNYWNyb0RlZiIsImNyZWF0ZSIsImNhbGwiLCJPYmplY3QiLCJrZXlzIiwibWV0YWRhdGFDb250ZXh0cyIsImZvckVhY2giLCJzTWV0YWRhdGFOYW1lIiwiY29tcHV0ZWQiLCJzQ29udGV4dE5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImFwaVZlcnNpb24iLCJwcm9wTmFtZSIsIm9EYXRhIiwiaXNBIiwiZ2V0TW9kZWwiLCJnZXRPYmplY3QiLCJCdWlsZGluZ0Jsb2NrQ2xhc3MiLCJvQXR0cmlidXRlc01vZGVsIiwiQXR0cmlidXRlTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9QcmV2aW91c01hY3JvSW5mbyIsIlRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIiwib1RyYWNlSW5mbyIsInRyYWNlTWFjcm9DYWxscyIsIm1hY3JvSW5mbyIsInZhbGlkYXRlTWFjcm9TaWduYXR1cmUiLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwiaXNPcGVuIiwidW5kZWZpbmVkIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIm9Qcm9taXNlIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGRyZW4iLCJpbmRleE9mIiwiZ2V0VGVtcGxhdGUiLCJvVGVtcGxhdGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIkRPTVBhcnNlckluc3RhbmNlIiwicGFyc2VGcm9tU3RyaW5nIiwicmVwbGFjZVdpdGgiLCJ2aXNpdE5vZGUiLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc2VydEZyYWdtZW50Iiwib01hY3JvRWxlbWVudCIsInNBZ2dyZWdhdGlvbk5hbWUiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib05ld0NoaWxkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ2aXNpdENoaWxkTm9kZXMiLCJvRmlyc3RFbGVtZW50Q2hpbGQiLCJzQ2hpbGROYW1lIiwibG9jYWxOYW1lIiwicHJvcGVydGllcyIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVJbmRleCIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwic29ydCIsImEiLCJiIiwiaiIsInNBdHRyaWJ1dGVOYW1lIiwiYkRvTm90UmVzb2x2ZSIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJoYXNBdHRyaWJ1dGUiLCJvTWV0YWRhdGFDb250ZXh0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsImFkZFNpbmdsZUNvbnRleHQiLCJiaW5kaW5nQ29udGV4dHMiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJjb250ZXh0UGF0aCIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJzS2V5VmFsdWUiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwidmlzaXRBdHRyaWJ1dGUiLCJnZXROYW1lZEl0ZW0iLCJ2VmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXIiLCJidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCJnZXRQYXRoIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJzQ29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsImVudGl0eVNldCIsIm9DdHgiLCJtU2V0dGluZyIsImdldENvbnRleHQiLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsInhtbCIsInN0cmluZ3MiLCJvdXRTdHIiLCJ2YWx1ZXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7O0FBcUNPLGlCQUFpQkEsSUFBakIsRUFBdUJDLEtBQXZCLEVBQThCQyxLQUE5QixFQUFxQztBQUMzQyxNQUFJLENBQUNGLElBQUksQ0FBQ0csQ0FBVixFQUFhO0FBQ1osUUFBSUQsS0FBSyxpQkFBVCxFQUE0QjtBQUMzQixVQUFJQSxLQUFLLENBQUNDLENBQVYsRUFBYTtBQUNaLFlBQUlGLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDZEEsVUFBQUEsS0FBSyxHQUFHQyxLQUFLLENBQUNDLENBQWQ7QUFDQTs7QUFDREQsUUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLENBQWQ7QUFDQSxPQUxELE1BS087QUFDTkYsUUFBQUEsS0FBSyxDQUFDRyxDQUFOLEdBQVUsUUFBUUMsSUFBUixDQUFhLElBQWIsRUFBbUJOLElBQW5CLEVBQXlCQyxLQUF6QixDQUFWO0FBQ0E7QUFDQTtBQUNEOztBQUNELFFBQUlDLEtBQUssSUFBSUEsS0FBSyxDQUFDSyxJQUFuQixFQUF5QjtBQUN4QkwsTUFBQUEsS0FBSyxDQUFDSyxJQUFOLENBQVcsUUFBUUQsSUFBUixDQUFhLElBQWIsRUFBbUJOLElBQW5CLEVBQXlCQyxLQUF6QixDQUFYLEVBQTRDLFFBQVFLLElBQVIsQ0FBYSxJQUFiLEVBQW1CTixJQUFuQixFQUF5QixDQUF6QixDQUE1QztBQUNBO0FBQ0E7O0FBQ0RBLElBQUFBLElBQUksQ0FBQ0csQ0FBTCxHQUFTRixLQUFUO0FBQ0FELElBQUFBLElBQUksQ0FBQ0ksQ0FBTCxHQUFTRixLQUFUO0FBQ0EsUUFBTU0sUUFBUSxHQUFHUixJQUFJLENBQUNLLENBQXRCOztBQUNBLFFBQUlHLFFBQUosRUFBYztBQUNiQSxNQUFBQSxR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LE1BQXZCLEVBQStCSCxDQUFDLEVBQWhDLEVBQW9DO0FBQ25DeUwsTUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUN4TCxDQUFELENBQWpCO0FBQ0F5TCxNQUFBQSxNQUFNLElBQUlDLE1BQU0sQ0FBQzFMLENBQUQsQ0FBaEI7QUFDQTs7QUFDRHlMLElBQUFBLE1BQU0sSUFBSUQsT0FBTyxDQUFDeEwsQ0FBRCxDQUFqQjtBQUNBLFdBQU9rRixpQkFBaUIsQ0FBQ0MsZUFBbEIsQ0FBa0NzRyxNQUFsQyxFQUEwQyxVQUExQyxDQUFQO0FBQ0EsR0FUTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXR0cmlidXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxudHlwZSBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IHtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbnR5cGUgSUNhbGxiYWNrID0ge1xuXHRnZXRTZXR0aW5ncygpOiBhbnk7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqKi9cblx0dmlzaXROb2RlKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSW5zZXJ0cyB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBwbGFjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gTG9hZHMgdGhlXG5cdCAqIGZyYWdtZW50LCB0YWtlcyBjYXJlIG9mIGNhY2hpbmcgKGZvciB0aGUgY3VycmVudCBwcmUtcHJvY2Vzc29yIHJ1bikgYW5kIHZpc2l0cyB0aGVcblx0ICogZnJhZ21lbnQncyBjb250ZW50IG9uY2UgaXQgaGFzIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGFuZFxuXHQgKiBwdXQgaW50byBwbGFjZS4gTG9hZGluZyBvZiBmcmFnbWVudHMgaXMgYXN5bmNocm9ub3VzIGlmIHRoZSB0ZW1wbGF0ZSB2aWV3IGlzXG5cdCAqIGFzeW5jaHJvbm91cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGcmFnbWVudE5hbWVcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUudXRpbC5fd2l0aH0gb1dpdGhDb250cm9sXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiBBIHN5bmMgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB0aGUgZnJhZ21lbnRcblx0ICogICBoYXMgYmVlbiBpbnNlcnRlZCwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgbG9hZGluZyBvciB2aXNpdGluZ1xuXHQgKiAgIGZhaWxzLlxuXHQgKi9cblx0aW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50OiBzdHJpbmcsIG9FbGVtZW50OiBFbGVtZW50LCBvV2l0aD86IGFueSk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hcCBvZiB2YXJpYWJsZXMgd2hpY2hcblx0ICogb3ZlcnJpZGUgY3VycmVudGx5IGtub3duIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lIGluIDxjb2RlPnRoaXM8L2NvZGU+XG5cdCAqIHBhcmVudCBpbnRlcmZhY2Ugb3IgcmVwbGFjZSB0aGVtIGFsdG9nZXRoZXIuIEVhY2ggdmFyaWFibGUgbmFtZSBiZWNvbWVzIGFcblx0ICogbmFtZWQgbW9kZWwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGJpbmRpbmcgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSB0aGVcblx0ICogWE1MIHRlbXBsYXRlIGluIHRoZSB1c3VhbCB3YXksIHRoYXQgaXMsIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb24gbGlrZVxuXHQgKiA8Y29kZT5cInt2YXI+c29tZS9yZWxhdGl2ZS9wYXRofVwiPC9jb2RlPiAoc2VlIGV4YW1wbGUpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21WYXJpYWJsZXM9e31dXG5cdCAqICAgTWFwIGZyb20gdmFyaWFibGUgbmFtZSAoc3RyaW5nKSB0byB2YWx1ZSAoe0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2t9XG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogYW55LCBiUmVwbGFjZT86IGJvb2xlYW4pOiBJQ2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIFR5cGVndWFyZCBmb3IgY2hlY2tpbmcgaWYgYSBidWlsZGluZyBibG9jayB1c2UgQVBJIDEuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzaW5nIEFQSSAxLlxuICovXG5mdW5jdGlvbiBpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gaXMgQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSB7XG5cdHJldHVybiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogYW55LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRraW5kXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIkVHlwZVwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc05hbWU6IGFueSwgb01ldGFkYXRhOiBhbnksIG1Db250ZXh0czogYW55LCBvTm9kZTogYW55KSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IGFueSA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvTm9kZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzS2V5ID0gb05vZGUuYXR0cmlidXRlc1tpS2V5XS5uYW1lO1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1tzS2V5XSA9IHRydWU7XG5cdH0pO1xuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc05hbWUgKyBcIjogXCIgKyBcIlJlcXVpcmVkIHByb3BlcnR5ICdcIiArIHNLZXkgKyBcIicgaXMgbWlzc2luZ1wiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcmV0dXJucyBBIHNldCBvZiBjb21wbGV0ZWQgbWV0YWRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICovXG5mdW5jdGlvbiBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhPzogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhKSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnRpZXM6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHtcblx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdHR5cGU6IFwic2FwLnVpLmNvcmUuRWxlbWVudFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXG5cdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdLnR5cGUgIT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dHNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBNZXJnZSBldmVudHMgaW50byBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHlcblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoc0V2ZW50TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NFdmVudE5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50c1tzRXZlbnROYW1lXTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9wZXJ0aWVzOiBvUHJvcGVydGllcyxcblx0XHRcdGFnZ3JlZ2F0aW9uczogb0FnZ3JlZ2F0aW9ucyxcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWV0YWRhdGFDb250ZXh0czoge30sXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IHtcblx0XHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFwic2FwLnVpLmNvcmUuRWxlbWVudFwiXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fVxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3M6IGFueSwgb05vZGU6IEVsZW1lbnQsIHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG9WaXNpdG9yOiBJQ2FsbGJhY2ssIGJEb05vdFJlc29sdmU6IGJvb2xlYW4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ7XG5cdGlmICghYkRvTm90UmVzb2x2ZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0Y29uc3Qgc0F0dHJpYnV0ZVZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSBhcyBzdHJpbmc7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHQvLyBvVmlzaXRvci5nZXRSZXN1bHQoc0F0dHJpYnV0ZVZhbHVlLCBvTm9kZSk7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzQXR0cmlidXRlVmFsdWUpO1xuXHRcdGlmICghb01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0aWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55XG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGxldCBqID0gMDsgaiA8IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMubGVuZ3RoOyBqKyspIHtcblx0XHRjb25zdCBzS2V5VmFsdWUgPSBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzW2pdO1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbGVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0Y29uc3QgdlZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChsZXQgaiA9IDA7IGogPCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5sZW5ndGg7IGorKykge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVOYW1lID0gYURlZmluaXRpb25Db250ZXh0c0tleXNbal07XG5cdFx0Y29uc3QgYkRvTm90UmVzb2x2ZSA9IGlzUHVibGljICYmICFvRGVmaW5pdGlvbkNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXS5pc1B1YmxpYyAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpO1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHQgPSBfZ2V0TWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgb05vZGUsIHNBdHRyaWJ1dGVOYW1lLCBvVmlzaXRvciwgYkRvTm90UmVzb2x2ZSk7XG5cdFx0aWYgKG9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQubmFtZSA9IHNBdHRyaWJ1dGVOYW1lO1xuXHRcdFx0YWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHMsIG9WaXNpdG9yLCBvTWV0YWRhdGFDb250ZXh0LCBvTWV0YWRhdGFDb250ZXh0cyk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzQXR0cmlidXRlTmFtZSA9PT0gXCJlbnRpdHlTZXRcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHx8XG5cdFx0XHRcdChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiICYmICFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSlcblx0XHRcdCkge1xuXHRcdFx0XHRvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdFx0XHRvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1NaXNzaW5nQ29udGV4dFtzQXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4geyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyBmaXJzdCBhbmQgZm9yZW1vc3Rcblx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0NoaWxkTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQ2hpbGROYW1lXS5pc1B1YmxpYylcblx0XHRcdCkge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQ2hpbGROYW1lXSA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZUluZGV4IG9mIE9iamVjdC5rZXlzKG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0YnVpbGRpbmdCTG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0XHRjb25zdCBzTmFtZSA9IFwidGhpc1wiO1xuXG5cdFx0Y29uc3QgbUNvbnRleHRzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdFx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHQvLyBUT0RPIE1vdmUgdGhpcyBlbHNld2hlcmUgdGhpcyBpcyB3ZWlyZCA6KVxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0XHQuZ2V0UmVzb3VyY2VCdW5kbGUoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm1ldGFkYXRhKTtcblxuXHRcdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRcdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlc1xuXHRcdGxldCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXMgfSA9IGF3YWl0IHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRcdFx0b01ldGFkYXRhLFxuXHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0b05vZGUsXG5cdFx0XHRpc1B1YmxpYyxcblx0XHRcdG9WaXNpdG9yLFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0b01ldGFkYXRhQ29udGV4dHNcblx0XHQpO1xuXG5cdFx0Ly8gQWdncmVnYXRpb24gYW5kIGNvbXBsZXggdHlwZSBzdXBwb3J0XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9ucyA9IGF3YWl0IHByb2Nlc3NDaGlsZHJlbihvTm9kZSwgb1Zpc2l0b3IsIG9NZXRhZGF0YSwgaXNQdWJsaWMsIHByb3BlcnR5VmFsdWVzKTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhwcm9wZXJ0eVZhbHVlcyAvKiwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncywgb0FnZ3JlZ2F0aW9ucywgaXNQdWJsaWMqLyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDJcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcob1RlbXBsYXRlLCBcInRleHQveG1sXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTm9kZS5yZXBsYWNlV2l0aChvVGVtcGxhdGUuZmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9Ob2RlID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gbnVsbCAmJiBvTWFjcm9FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTWFjcm9FbGVtZW50Lm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRsZXQgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdFx0XHR3aGlsZSAob0VsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdFx0b0VsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gXCJjdXN0b21EYXRhXCIgJiYgc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gXCJkZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdFx0XHQob01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSAmJiBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzbG90W25hbWU9J1wiICsgc1Nsb3ROYW1lICsgXCInXVwiKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldEVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIGFueSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWFjcm9FbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9TbG90RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0TG9nLmVycm9yKGUgYXMgYW55KTtcblx0fVxufVxuZnVuY3Rpb24gYWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHM6IGFueSwgb1Zpc2l0b3I6IGFueSwgb0N0eDogYW55LCBvTWV0YWRhdGFDb250ZXh0czogYW55KSB7XG5cdGNvbnN0IHNLZXkgPSBvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQ7XG5cblx0aWYgKG9NZXRhZGF0YUNvbnRleHRzW3NLZXldKSB7XG5cdFx0cmV0dXJuOyAvLyBkbyBub3QgYWRkIHR3aWNlXG5cdH1cblx0dHJ5IHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb0N0eC5wYXRoO1xuXHRcdGlmIChvQ3R4Lm1vZGVsICE9IG51bGwpIHtcblx0XHRcdHNDb250ZXh0UGF0aCA9IG9DdHgubW9kZWwgKyBcIj5cIiArIHNDb250ZXh0UGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmICghbVNldHRpbmcuYmluZGluZ0NvbnRleHRzW29DdHgubW9kZWxdICYmIG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG9WaXNpdG9yLmdldENvbnRleHQoc0NvbnRleHRQYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fVxuXG5cdFx0b01ldGFkYXRhQ29udGV4dHNbc0tleV0gPSBtQ29udGV4dHNbc0tleV07IC8vIG1ha2UgaXQgYXZhaWxhYmxlIGluc2lkZSBtZXRhZGF0YUNvbnRleHRzIEpTT04gb2JqZWN0XG5cdH0gY2F0Y2ggKGV4KSB7XG5cdFx0Ly9jb25zb2xlLmVycm9yKGV4KTtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LCBpLmUuIG5vdCBhIHByZXByb2Nlc3NpbmcgbW9kZWwgYnV0IG1heWJlIGEgbW9kZWwgZm9yXG5cdFx0Ly8gcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0XHQvLyBUT0RPIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogYW55W10pID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0cmV0dXJuIERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyhvdXRTdHIsIFwidGV4dC94bWxcIik7XG59O1xuIl19
|