@sapui5/sap.fe.core 1.141.2 → 1.142.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +4 -1
- package/src/sap/fe/core/ActionRuntime.js +48 -23
- package/src/sap/fe/core/ActionRuntime.ts +61 -35
- package/src/sap/fe/core/AppComponent.js +76 -6
- package/src/sap/fe/core/AppComponent.ts +94 -8
- package/src/sap/fe/core/AppStateHandler.js +9 -8
- package/src/sap/fe/core/AppStateHandler.ts +13 -9
- package/src/sap/fe/core/BaseController.js +8 -5
- package/src/sap/fe/core/BaseController.ts +6 -1
- package/src/sap/fe/core/CommonUtils.js +4 -123
- package/src/sap/fe/core/CommonUtils.ts +3 -172
- package/src/sap/fe/core/ExtensionAPI.js +3 -10
- package/src/sap/fe/core/ExtensionAPI.ts +2 -14
- package/src/sap/fe/core/PageController.js +64 -43
- package/src/sap/fe/core/PageController.ts +62 -47
- package/src/sap/fe/core/TemplateComponent.js +20 -1
- package/src/sap/fe/core/TemplateComponent.ts +24 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
- package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
- package/src/sap/fe/core/controllerextensions/Share.js +5 -5
- package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
- package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
- package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
- package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
- package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
- package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
- package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
- package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
- package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
- package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/fpm/Component.js +8 -1
- package/src/sap/fe/core/fpm/Component.ts +8 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
- package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
- package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
- package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
- package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
- package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
- package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
- package/src/sap/fe/core/helpers/WebSocket.js +6 -7
- package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
- package/src/sap/fe/core/library.js +30 -3
- package/src/sap/fe/core/library.ts +28 -1
- package/src/sap/fe/core/messagebundle.properties +8 -1
- package/src/sap/fe/core/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/messagebundle_bg.properties +10 -3
- package/src/sap/fe/core/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/messagebundle_cy.properties +8 -1
- package/src/sap/fe/core/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/messagebundle_en.properties +8 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
- package/src/sap/fe/core/messagebundle_es.properties +8 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/messagebundle_fr.properties +16 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/messagebundle_hi.properties +8 -1
- package/src/sap/fe/core/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/messagebundle_ja.properties +8 -1
- package/src/sap/fe/core/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
- package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
- package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
- package/src/sap/fe/core/templating/UIFormatters.js +17 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
- package/ui5.yaml +2 -0
|
@@ -123,6 +123,42 @@ const AppStartupHelper = {
|
|
|
123
123
|
});
|
|
124
124
|
},
|
|
125
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Load contexts for a list of Page infos, based on their respective keys.
|
|
128
|
+
* @param startupPages
|
|
129
|
+
* @param model
|
|
130
|
+
* @returns A Promise for all contexts
|
|
131
|
+
*/
|
|
132
|
+
_getContextsFromPages: async function (startupPages: PageInfo[], model: ODataModel): Promise<Context[][]> {
|
|
133
|
+
return Promise.all(
|
|
134
|
+
startupPages.map(async (pageInfo) => {
|
|
135
|
+
const entityType = model.getMetaModel().getObject(`${pageInfo.contextPath}/`);
|
|
136
|
+
if (pageInfo.technicalKeys) {
|
|
137
|
+
this._sanitizeKeys(pageInfo.technicalKeys, entityType);
|
|
138
|
+
// Create a context with the proper path
|
|
139
|
+
const path = `${pageInfo.contextPath}(${SemanticKeyHelper.getPathContent(pageInfo.technicalKeys, entityType)})`;
|
|
140
|
+
const context = model.bindContext(path).getBoundContext();
|
|
141
|
+
return Promise.resolve([context]);
|
|
142
|
+
} else {
|
|
143
|
+
const keys = pageInfo.semanticKeys ?? [];
|
|
144
|
+
this._sanitizeKeys(keys, entityType);
|
|
145
|
+
const filter = this._createFilterFromKeys(keys, pageInfo.draftMode, model.getMetaModel());
|
|
146
|
+
|
|
147
|
+
// only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
148
|
+
// IsActiveEntity is needed to distinguish between draft and active entities
|
|
149
|
+
const selectedFields = keys.map((key) => key.name);
|
|
150
|
+
if (pageInfo.draftMode && !selectedFields.includes("IsActiveEntity")) {
|
|
151
|
+
selectedFields.push("IsActiveEntity");
|
|
152
|
+
}
|
|
153
|
+
const oListBind = model.bindList(pageInfo.contextPath, undefined, undefined, filter, {
|
|
154
|
+
$select: selectedFields.join(",")
|
|
155
|
+
});
|
|
156
|
+
return oListBind.requestContexts(0, 2);
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
);
|
|
160
|
+
},
|
|
161
|
+
|
|
126
162
|
/**
|
|
127
163
|
* Loads all contexts for a list of page infos.
|
|
128
164
|
* @param aStartupPages The list of page infos
|
|
@@ -130,33 +166,46 @@ const AppStartupHelper = {
|
|
|
130
166
|
* @returns A Promise for all contexts
|
|
131
167
|
*/
|
|
132
168
|
_requestObjectsFromParameters: async function (aStartupPages: PageInfo[], oModel: ODataModel): Promise<Context[][]> {
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const aKeys = pageInfo.semanticKeys ?? [];
|
|
144
|
-
this._sanitizeKeys(aKeys, entityType);
|
|
145
|
-
const oFilter = this._createFilterFromKeys(aKeys, pageInfo.draftMode, oModel.getMetaModel());
|
|
146
|
-
|
|
147
|
-
// only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
148
|
-
const oListBind = oModel.bindList(pageInfo.contextPath, undefined, undefined, oFilter, {
|
|
149
|
-
$select: aKeys
|
|
150
|
-
.map((key) => {
|
|
151
|
-
return key.name;
|
|
152
|
-
})
|
|
153
|
-
.join(",")
|
|
154
|
-
});
|
|
155
|
-
return oListBind.requestContexts(0, 2);
|
|
169
|
+
// We don't want to mix active and draft in the returned contexts,
|
|
170
|
+
// So if the first page uses technical keys + draft + contains IsActiveEntity, add IsActiveEntity everywhere.
|
|
171
|
+
if (aStartupPages[0].draftMode && aStartupPages[0].technicalKeys !== undefined) {
|
|
172
|
+
const isActiveKey = aStartupPages[0].technicalKeys?.find((key) => key.name === "IsActiveEntity");
|
|
173
|
+
if (isActiveKey) {
|
|
174
|
+
for (const pageInfo of aStartupPages) {
|
|
175
|
+
if (pageInfo.draftMode && pageInfo.semanticKeys?.some((key) => key.name === "IsActiveEntity") === false) {
|
|
176
|
+
pageInfo.semanticKeys.push({ name: "IsActiveEntity", value: isActiveKey.value });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
156
179
|
}
|
|
157
|
-
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
183
|
+
if (contexts.some((ctx) => ctx.length !== 1)) {
|
|
184
|
+
return contexts; // failed to load some contexts, return as is
|
|
185
|
+
}
|
|
158
186
|
|
|
159
|
-
|
|
187
|
+
// We don't want to mix active and draft in the returned contexts.
|
|
188
|
+
// --> Check if all contexts are either all drafts or all active entities. If not, rerun the requests by
|
|
189
|
+
// forcing IsActiveEntity = true (this case can happen if a draft sub-object has been deleted but exists
|
|
190
|
+
// in the active object graph). We cannot load draft + active in a single request (CAP limitation)
|
|
191
|
+
const containsActive = contexts.some((ctx) => ctx[0].getObject()?.["IsActiveEntity"] === true);
|
|
192
|
+
const containsDraft = contexts.some((ctx) => ctx[0].getObject()?.["IsActiveEntity"] === false);
|
|
193
|
+
if (containsActive && containsDraft) {
|
|
194
|
+
for (const pageInfo of aStartupPages) {
|
|
195
|
+
if (pageInfo.draftMode) {
|
|
196
|
+
const keys = pageInfo.semanticKeys ?? pageInfo.technicalKeys;
|
|
197
|
+
const isActiveKey = keys!.find((key) => key.name === "IsActiveEntity");
|
|
198
|
+
if (isActiveKey) {
|
|
199
|
+
isActiveKey.value = "true";
|
|
200
|
+
} else {
|
|
201
|
+
keys!.push({ name: "IsActiveEntity", value: "true" });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return contexts;
|
|
160
209
|
},
|
|
161
210
|
|
|
162
211
|
/**
|
|
@@ -173,7 +222,13 @@ const AppStartupHelper = {
|
|
|
173
222
|
const currentTarget = manifestRouting?.targets?.[targetID];
|
|
174
223
|
return (
|
|
175
224
|
currentTarget?.name &&
|
|
176
|
-
[
|
|
225
|
+
[
|
|
226
|
+
"sap.fe.templates.ListReport",
|
|
227
|
+
"sap.fe.ariba.ListReport",
|
|
228
|
+
"sap.fe.templates.ObjectPage",
|
|
229
|
+
"sap.fe.ariba.ObjectPage",
|
|
230
|
+
"sap.fe.core.fpm"
|
|
231
|
+
].includes(currentTarget.name)
|
|
177
232
|
);
|
|
178
233
|
});
|
|
179
234
|
} else {
|
|
@@ -379,12 +434,11 @@ const AppStartupHelper = {
|
|
|
379
434
|
});
|
|
380
435
|
}
|
|
381
436
|
if (current.length > result.length) {
|
|
382
|
-
const currentPage = current.
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
} else {
|
|
437
|
+
const currentPage = current[current.length - 1];
|
|
438
|
+
const matchesTargetResolution = parameterValueForTargetResolution
|
|
439
|
+
? currentPage.targetResolutionValue === parameterValueForTargetResolution
|
|
440
|
+
: currentPage.targetResolutionValue === undefined;
|
|
441
|
+
if (matchesTargetResolution) {
|
|
388
442
|
result = current.slice(); // We have found a sequence longer than our previous best --> store it as the new longest
|
|
389
443
|
}
|
|
390
444
|
}
|
|
@@ -441,6 +495,11 @@ const AppStartupHelper = {
|
|
|
441
495
|
targetResolutionParameter
|
|
442
496
|
);
|
|
443
497
|
|
|
498
|
+
if (startupPages.length === 0) {
|
|
499
|
+
// No deeplink possible
|
|
500
|
+
return {};
|
|
501
|
+
}
|
|
502
|
+
|
|
444
503
|
// Load the contexts
|
|
445
504
|
const allContexts = await this._requestObjectsFromParameters(startupPages, oModel);
|
|
446
505
|
if (allContexts.length) {
|
|
@@ -24,7 +24,10 @@ sap.ui.define([], function () {
|
|
|
24
24
|
function getRouteTargetNames(target) {
|
|
25
25
|
return (Array.isArray(target) ? target : [target]).map(getRouteTargetName);
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
_exports.getRouteTargetNames = getRouteTargetNames;
|
|
28
|
+
function getRouteTargets(target) {
|
|
29
|
+
return Array.isArray(target) ? target : [target];
|
|
30
|
+
}
|
|
28
31
|
/**
|
|
29
32
|
* Map one route target to the target name.
|
|
30
33
|
* @example
|
|
@@ -36,11 +39,11 @@ sap.ui.define([], function () {
|
|
|
36
39
|
* @param target A route target manifest configuration entry
|
|
37
40
|
* @returns The target name
|
|
38
41
|
*/
|
|
39
|
-
_exports.
|
|
42
|
+
_exports.getRouteTargets = getRouteTargets;
|
|
40
43
|
function getRouteTargetName(target) {
|
|
41
44
|
return typeof target === "object" ? target.name : target;
|
|
42
45
|
}
|
|
43
46
|
_exports.getRouteTargetName = getRouteTargetName;
|
|
44
47
|
return _exports;
|
|
45
48
|
}, false);
|
|
46
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRSb3V0ZVRhcmdldE5hbWVzIiwidGFyZ2V0IiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiZ2V0Um91dGVUYXJnZXROYW1lIiwiX2V4cG9ydHMiLCJnZXRSb3V0ZVRhcmdldHMiLCJuYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJNYW5pZmVzdEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJvdXRlVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5cbi8qKlxuICogTWFwIGEgcm91dGUncyB0YXJnZXQgcHJvcGVydHkgLSBmcm9tIFwic2FwLnVpNS9yb3V0aW5nL3JvdXRlcy9bXS90YXJnZXRcIiAtIHRvIGEgbGlzdCBvZiB0YXJnZXQgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICogZ2V0Um91dGVUYXJnZXROYW1lcyhcIm15VGFyZ2V0XCIpO1xuICogLy8gW1wibXlUYXJnZXRcIl1cbiAqXG4gKiBnZXRSb3V0ZVRhcmdldE5hbWVzKFtcIm15VGFyZ2V0MVwiLCBcIm15VGFyZ2V0MlwiXSk7XG4gKiAvLyBbXCJteVRhcmdldDFcIiwgXCJteVRhcmdldDJcIl1cbiAqXG4gKiBnZXRSb3V0ZVRhcmdldE5hbWVzKFtcIm15VGFyZ2V0MVwiLCB7IG5hbWU6IFwibXlUYXJnZXQyXCIgfV0pO1xuICogLy8gW1wibXlUYXJnZXQxXCIsIFwibXlUYXJnZXQyXCJdXG4gKiBAc2VlIE1hbmlmZXN0Q29udGVudFVJNVxuICogQHBhcmFtIHRhcmdldCBUaGUgcm91dGUncyBcInRhcmdldFwiIHByb3BlcnR5IHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZVRhcmdldE5hbWVzKHRhcmdldDogUm91dGVUYXJnZXQgfCBSb3V0ZVRhcmdldFtdKTogc3RyaW5nW10ge1xuXHRyZXR1cm4gKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdKS5tYXAoZ2V0Um91dGVUYXJnZXROYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlVGFyZ2V0cyh0YXJnZXQ6IFJvdXRlVGFyZ2V0IHwgUm91dGVUYXJnZXRbXSk6IFJvdXRlVGFyZ2V0W10ge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF07XG59XG4vKipcbiAqIE1hcCBvbmUgcm91dGUgdGFyZ2V0IHRvIHRoZSB0YXJnZXQgbmFtZS5cbiAqIEBleGFtcGxlXG4gKiBnZXRSb3V0ZVRhcmdldE5hbWUoXCJteVRhcmdldFwiKTtcbiAqIC8vIFwibXlUYXJnZXRcIlxuICpcbiAqIGdldFJvdXRlVGFyZ2V0TmFtZSh7IG5hbWU6IFwibXlUYXJnZXRcIiB9KTtcbiAqIC8vIFwibXlUYXJnZXRcIlxuICogQHBhcmFtIHRhcmdldCBBIHJvdXRlIHRhcmdldCBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGVudHJ5XG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlVGFyZ2V0TmFtZSh0YXJnZXQ6IFJvdXRlVGFyZ2V0KTogc3RyaW5nIHtcblx0cmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgPyB0YXJnZXQubmFtZSA6IHRhcmdldDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQSxtQkFBbUJBLENBQUNDLE1BQW1DLEVBQVk7SUFDbEYsT0FBTyxDQUFDQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsTUFBTSxDQUFDLEdBQUdBLE1BQU0sR0FBRyxDQUFDQSxNQUFNLENBQUMsRUFBRUcsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBQztFQUMzRTtFQUFDQyxRQUFBLENBQUFOLG1CQUFBLEdBQUFBLG1CQUFBO0VBRU0sU0FBU08sZUFBZUEsQ0FBQ04sTUFBbUMsRUFBaUI7SUFDbkYsT0FBT0MsS0FBSyxDQUFDQyxPQUFPLENBQUNGLE1BQU0sQ0FBQyxHQUFHQSxNQUFNLEdBQUcsQ0FBQ0EsTUFBTSxDQUFDO0VBQ2pEO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVZBSyxRQUFBLENBQUFDLGVBQUEsR0FBQUEsZUFBQTtFQVdPLFNBQVNGLGtCQUFrQkEsQ0FBQ0osTUFBbUIsRUFBVTtJQUMvRCxPQUFPLE9BQU9BLE1BQU0sS0FBSyxRQUFRLEdBQUdBLE1BQU0sQ0FBQ08sSUFBSSxHQUFHUCxNQUFNO0VBQ3pEO0VBQUNLLFFBQUEsQ0FBQUQsa0JBQUEsR0FBQUEsa0JBQUE7RUFBQSxPQUFBQyxRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -19,6 +19,9 @@ export function getRouteTargetNames(target: RouteTarget | RouteTarget[]): string
|
|
|
19
19
|
return (Array.isArray(target) ? target : [target]).map(getRouteTargetName);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
export function getRouteTargets(target: RouteTarget | RouteTarget[]): RouteTarget[] {
|
|
23
|
+
return Array.isArray(target) ? target : [target];
|
|
24
|
+
}
|
|
22
25
|
/**
|
|
23
26
|
* Map one route target to the target name.
|
|
24
27
|
* @example
|
|
@@ -236,8 +236,17 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Iss
|
|
|
236
236
|
isNonComputed = !(annotations.Core?.Computed?.valueOf() === true),
|
|
237
237
|
isVisible = !(annotations.UI?.Hidden?.valueOf() === true),
|
|
238
238
|
isComputedDefaultValue = annotations.Core?.ComputedDefaultValue?.valueOf() === true,
|
|
239
|
-
|
|
240
|
-
|
|
239
|
+
isNonGUIDKey = isKey && prop.type !== "Edm.Guid",
|
|
240
|
+
isGUIDKeyWithText = isKey && prop.type === "Edm.Guid" ? !!annotations.Common?.Text : false;
|
|
241
|
+
|
|
242
|
+
// If it's computed we don't show it
|
|
243
|
+
// if it's immutable we show it if it's visible
|
|
244
|
+
// If it's a key with type guid AND ComputedDefaultValue and Text annotation we show it
|
|
245
|
+
// Steampunk case : We have a key of type Guid with Text but not with ComputedDefault -> We need to show them
|
|
246
|
+
// CAP case : We have keys of type Guid with no Text but with ComputedDefaulValue -> We don't show them
|
|
247
|
+
// Other case : GUID Key, with no text and no ComputedDefaultValue -> We should show them from the OData spec but not from fiori guidelines
|
|
248
|
+
|
|
249
|
+
if ((isNonGUIDKey || isGUIDKeyWithText) && isNonComputed && isVisible) {
|
|
241
250
|
nonComputedVisibleKeys.push(propName);
|
|
242
251
|
} else if (requiredProperties.includes(propName) && isVisible && !(isKey && !nonComputedVisibleKeys.includes(propName))) {
|
|
243
252
|
visibileRequiredProperties.push(propName);
|
|
@@ -521,4 +530,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Iss
|
|
|
521
530
|
_exports.METAMODEL_FUNCTIONS = METAMODEL_FUNCTIONS;
|
|
522
531
|
return _exports;
|
|
523
532
|
}, false);
|
|
524
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTZWFyY2hSZXN0cmljdGlvbnMiLCJmdWxsUGF0aCIsIm1ldGFNb2RlbCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnMiLCJuYXZpZ2F0aW9uVGV4dCIsInNlYXJjaFJlc3RyaWN0aW9uc1Rlcm0iLCJlbnRpdHlUeXBlUGF0aFBhcnRzIiwicmVwbGFjZUFsbCIsInNwbGl0IiwiZmlsdGVyIiwiTW9kZWxIZWxwZXIiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImVudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwiZW50aXR5U2V0UGF0aFBhcnRzIiwiaXNDb250YWlubWVudCIsImdldE9iamVjdCIsImpvaW4iLCJjb250YWlubWVudE5hdlBhdGgiLCJsZW5ndGgiLCJuYXZQYXRoIiwiam9pblN0cmluZyIsInBhcmVudEVudGl0eVNldFBhdGgiLCJzbGljZSIsIm5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJNRVRBTU9ERUxfRlVOQ1RJT05TIiwiZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsIl9leHBvcnRzIiwibWV0YU1vZGVsQ29udGV4dCIsIm5hdmlnYXRpb25QYXRoIiwicmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJyZXN0cmljdGVkUHJvcGVydHkiLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImlzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIm1ldGFtb2RlbENvbnRleHQiLCJjb250ZXh0UGF0aCIsImlzTm90RmlsdGVyYWJsZSIsImZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsInNvbWUiLCJwcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJpc0N1c3RvbUFnZ3JlZ2F0ZSIsImludGVyYW5sSXNDdXN0b21BZ2dyZWdhdGUiLCJpc0FwcGx5U3VwcG9ydGVkIiwiZW50aXR5U2V0QW5ub3RhdGlvbnMiLCJjdXN0b21BZ2dyZWdhdGVzQW5ub3RhdGlvbnMiLCJnZXRBbGxDdXN0b21BZ2dyZWdhdGVzIiwiY3VzdG9tQWdncmVnYXRlcyIsIk9iamVjdCIsImtleXMiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsImNoZWNrRW50aXR5U2V0SXNGaWx0ZXJhYmxlIiwibmF2aWdhdGlvbkNvbnRleHQiLCJpc0ZpbHRlcmFibGUiLCJpc0NvbnRleHRQYXRoRmlsdGVyYWJsZSIsInByb3BlcnR5RGF0YVR5cGUiLCJnZXRQcm9wZXJ0eURhdGFUeXBlIiwiaXNUeXBlRmlsdGVyYWJsZSIsImVzUGFydHMiLCJzcGxpY2UiLCJjb250ZXh0cyIsImlzTm9GaWx0ZXJhYmxlIiwiY29udGV4dCIsIml0ZW0iLCJpbmRleCIsImFycmF5IiwiZmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwibm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJ0YXJnZXRQcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJkYXRhVHlwZSIsImdldFByb3BlcnR5IiwiYW5ub3RhdGlvblBhdGgiLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsInNraXBIaWRkZW5GaWx0ZXJzIiwiRXJyb3IiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImhpZGRlblBhdGgiLCJoaWRkZW5GaWx0ZXJQYXRoIiwiY29tcGlsZUV4cHJlc3Npb24iLCJub3QiLCJvciIsInBhdGhJbk1vZGVsIiwiZ2V0Q3JlYXRlUG9wdXBGaWVsZHMiLCJwYXRoIiwiYXBwQ29tcG9uZW50IiwiZGF0YU1vZGVsIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0Q29udGV4dCIsIm5vbkNvbXB1dGVkVmlzaWJsZUtleXMiLCJpbW11dGFibGVWaXNpYmxlRmllbGRzIiwidmlzaWJpbGVSZXF1aXJlZFByb3BlcnRpZXMiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldEVudGl0eVR5cGUiLCJwcm9wIiwiYW5ub3RhdGlvbnMiLCJpc0tleSIsInByb3BOYW1lIiwibmFtZSIsImlzSW1tdXRhYmxlIiwiQ29yZSIsIkltbXV0YWJsZSIsInZhbHVlT2YiLCJpc05vbkNvbXB1dGVkIiwiQ29tcHV0ZWQiLCJpc1Zpc2libGUiLCJVSSIsIkhpZGRlbiIsImlzQ29tcHV0ZWREZWZhdWx0VmFsdWUiLCJDb21wdXRlZERlZmF1bHRWYWx1ZSIsImlzS2V5Q29tcHV0ZWREZWZhdWx0VmFsdWVXaXRoVGV4dCIsInR5cGUiLCJDb21tb24iLCJUZXh0IiwicHVzaCIsImRpYWdub3N0aWNzIiwiZ2V0RGlhZ25vc3RpY3MiLCJtZXNzYWdlIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiQW5ub3RhdGlvbiIsIklzc3VlU2V2ZXJpdHkiLCJNZWRpdW0iLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25zIiwiSWdub3JlZEFubm90YXRpb24iLCJjb25jYXQiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXMiLCJjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyIsImFyZ3VtZW50cyIsInJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoIiwiZW50aXR5U2V0QW5ub3RhdGlvbiIsImVuZHNXaXRoIiwicmVwbGFjZSIsImpvaW5UZXh0IiwiaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zIiwiVXBkYXRlUmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zIiwiZm9yRWFjaCIsInJlcXVpcmVkUHJvcGVydHkiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwiaXNOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwibmF2QW5ub3RhdGlvbnMiLCJlbnRpdHlBbm5vdGF0aW9ucyIsImVudGl0eXRTZXRBbm5vdGF0aW9ucyIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uS2V5Iiwic3RhcnRzV2l0aCIsImFubm90YXRpb25QYXJ0cyIsImN1c3RvbUFnZ3JlZ2F0ZSIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJsYWJlbCIsInNvcnRhYmxlIiwic29ydE9yZGVyIiwiY3VzdG9tIiwiZ2V0U29ydFJlc3RyaWN0aW9uc0luZm8iLCJzb3J0UmVzdHJpY3Rpb25zSW5mbyIsInByb3BlcnR5SW5mbyIsInNvcnRSZXN0cmljdGlvbnMiLCJTb3J0YWJsZSIsInByb3BlcnR5SXRlbSIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsInByb3BlcnR5TmFtZSIsIkFzY2VuZGluZ09ubHlQcm9wZXJ0aWVzIiwic29ydERpcmVjdGlvbiIsIkRlc2NlbmRpbmdPbmx5UHJvcGVydGllcyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0luZm8iLCJpIiwiZmlsdGVyUmVzdHJpY3Rpb25zSW5mbyIsImZpbHRlcmFibGUiLCJyZXF1aXJlc0ZpbHRlciIsIlJlcXVpcmVzRmlsdGVyIiwiRmlsdGVyYWJsZSIsIm1hcCIsImZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIlByb3BlcnR5IiwiZ2V0RmlsdGVyYWJsZURhdGEiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJmaWx0ZXJEYXRhT2JqIiwiaXNNdWx0aVZhbHVlRmlsdGVyRXhwcmVzc2lvbiIsImZpbHRlckV4cHJlc3Npb24iLCJpc011bHRpVmFsdWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1ldGFNb2RlbEZ1bmN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBkaXNhcHBlYXIgYXMgc29vbiBhcyB3ZSBjYW4uXG4vLyBJdCBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byBtb3ZlIGFsbCBtZXRhbW9kZWwgcmVsYXRlZCBvcGVyYXRpb24gZnJvbSBDb21tb25VdGlscyB0byBhIHNlcGFyYXRlIGZpbGUuXG5cbmltcG9ydCB0eXBlICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHtcblx0RmlsdGVyUmVzdHJpY3Rpb25zVHlwZSxcblx0TmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcyxcblx0TmF2aWdhdGlvblJlc3RyaWN0aW9uc1R5cGUsXG5cdFNlYXJjaFJlc3RyaWN0aW9uc1R5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBub3QsIG9yLCBwYXRoSW5Nb2RlbCB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlQ2F0ZWdvcnlUeXBlLCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbmltcG9ydCB7IGlzVHlwZUZpbHRlcmFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEV4cGFuZFBhdGhUeXBlLCBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uLCBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5cbi8vIEZyb20gRmlsdGVyQmFyLmJsb2NrLnRzIG9ubHlcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWFyY2hSZXN0cmljdGlvbnMoZnVsbFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IE1ldGFNb2RlbFR5cGU8U2VhcmNoUmVzdHJpY3Rpb25zVHlwZT4gfCB1bmRlZmluZWQge1xuXHRsZXQgc2VhcmNoUmVzdHJpY3Rpb25zO1xuXHRsZXQgbmF2aWdhdGlvblNlYXJjaFJlc3RyaWN0aW9ucztcblx0Y29uc3QgbmF2aWdhdGlvblRleHQgPSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdGNvbnN0IHNlYXJjaFJlc3RyaWN0aW9uc1Rlcm0gPSBcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9uc1wiO1xuXHRjb25zdCBlbnRpdHlUeXBlUGF0aFBhcnRzID0gZnVsbFBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikuc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGggPSBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKGZ1bGxQYXRoLCBtZXRhTW9kZWwpO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoUGFydHMgPSBlbnRpdHlTZXRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBpc0NvbnRhaW5tZW50ID0gbWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0vJENvbnRhaW5zVGFyZ2V0YCkgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGNvbnRhaW5tZW50TmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBlbnRpdHlUeXBlUGF0aFBhcnRzW2VudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoIC0gMV0gOiBcIlwiO1xuXG5cdC8vTEVBU1QgUFJJT1JJVFkgLSBTZWFyY2ggcmVzdHJpY3Rpb25zIGRpcmVjdGx5IGF0IEVudGl0eSBTZXRcblx0Ly9lLmcuIEZSIGluIFwiTlMuRW50aXR5Q29udGFpbmVyL1NhbGVzT3JkZXJNYW5hZ2VcIiBDb250ZXh0UGF0aDogL1NhbGVzT3JkZXJNYW5hZ2Vcblx0aWYgKCFpc0NvbnRhaW5tZW50KSB7XG5cdFx0c2VhcmNoUmVzdHJpY3Rpb25zID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofSR7c2VhcmNoUmVzdHJpY3Rpb25zVGVybX1gKSBhc1xuXHRcdFx0fCBNZXRhTW9kZWxUeXBlPFNlYXJjaFJlc3RyaWN0aW9uc1R5cGU+XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Y29uc3QgbmF2UGF0aDogc3RyaW5nID0gaXNDb250YWlubWVudCA/IGNvbnRhaW5tZW50TmF2UGF0aCA6IGVudGl0eVNldFBhdGhQYXJ0c1tlbnRpdHlTZXRQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0Ly8gSW4gY2FzZSBvZiBjb250YWlubWVudCB3ZSB0YWtlIGVudGl0eVNldCBwcm92aWRlZCBhcyBwYXJlbnQuIEFuZCBpbiBjYXNlIG9mIG5vcm1hbCB3ZSB3b3VsZCByZW1vdmUgdGhlIGxhc3QgbmF2aWdhdGlvbiBmcm9tIGVudGl0eVNldFBhdGguXG5cdFx0Y29uc3Qgam9pblN0cmluZyA9IGAvJHtuYXZpZ2F0aW9uVGV4dH0vYDtcblx0XHRjb25zdCBwYXJlbnRFbnRpdHlTZXRQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVNldFBhdGggOiBgLyR7ZW50aXR5U2V0UGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKGpvaW5TdHJpbmcpfWA7XG5cblx0XHQvL0hJR0hFU1QgcHJpb3JpdHkgLSBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3QgbmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdHBhcmVudEVudGl0eVNldFBhdGgsXG5cdFx0XHRuYXZQYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpXG5cdFx0KTtcblx0XHRuYXZpZ2F0aW9uU2VhcmNoUmVzdHJpY3Rpb25zID0gbmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uU2VhcmNoUmVzdHJpY3Rpb25zO1xuXHR9XG5cdHJldHVybiBuYXZpZ2F0aW9uU2VhcmNoUmVzdHJpY3Rpb25zID8/IHNlYXJjaFJlc3RyaWN0aW9ucztcbn1cblxuLy8gRnJvbSBDb21tb25VdGlsc1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRlbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG5hdmlnYXRpb25QYXRoOiBzdHJpbmdcbik6IE1ldGFNb2RlbFR5cGU8TmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcz4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zYCkgYXNcblx0XHR8IE1ldGFNb2RlbFR5cGU8TmF2aWdhdGlvblJlc3RyaWN0aW9uc1R5cGU+XG5cdFx0fCB1bmRlZmluZWQ7XG5cdGNvbnN0IHJlc3RyaWN0ZWRQcm9wZXJ0aWVzID0gbmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uUmVzdHJpY3RlZFByb3BlcnRpZXM7XG5cdHJldHVybiByZXN0cmljdGVkUHJvcGVydGllcz8uZmluZChmdW5jdGlvbiAocmVzdHJpY3RlZFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHJlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHk/LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBuYXZpZ2F0aW9uUGF0aDtcblx0fSk7XG59XG5cbi8vIEludGVybmFsIHVzYWdlIG9ubHlcbmZ1bmN0aW9uIGlzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyhtZXRhbW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgZW50aXR5U2V0UGF0aDogc3RyaW5nLCBjb250ZXh0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBpc05vdEZpbHRlcmFibGUgPSBmYWxzZTtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiA9IG1ldGFtb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9QE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zYCkgYXNcblx0XHR8IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5cblx0XHR8IHVuZGVmaW5lZDtcblx0aWYgKGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKSB7XG5cdFx0aXNOb3RGaWx0ZXJhYmxlID0gZmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0KHByb3BlcnR5IGFzIHVua25vd24gYXMgRXhwYW5kUGF0aFR5cGU8RWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg+KS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gY29udGV4dFBhdGggfHxcblx0XHRcdFx0cHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gY29udGV4dFBhdGhcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGlzTm90RmlsdGVyYWJsZTtcbn1cblxuLy8gSW50ZXJuYWwgdXNhZ2Ugb25seVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ3VzdG9tQWdncmVnYXRlKG1ldGFtb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBlbnRpdHlTZXRQYXRoOiBzdHJpbmcsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0bGV0IGludGVyYW5sSXNDdXN0b21BZ2dyZWdhdGUgPSBmYWxzZTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4L2ludmFsaWQtd2FyblxuXHRjb25zdCBpc0FwcGx5U3VwcG9ydGVkID0gbWV0YW1vZGVsQ29udGV4dC5nZXRPYmplY3QoZW50aXR5U2V0UGF0aCArIFwiQE9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BcHBseVN1cHBvcnRlZFwiKSA/IHRydWUgOiBmYWxzZTtcblx0aWYgKGlzQXBwbHlTdXBwb3J0ZWQpIHtcblx0XHRjb25zdCBlbnRpdHlTZXRBbm5vdGF0aW9ucyA9IG1ldGFtb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9QGApIGFzIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb247XG5cdFx0Y29uc3QgY3VzdG9tQWdncmVnYXRlc0Fubm90YXRpb25zID0gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXRBbGxDdXN0b21BZ2dyZWdhdGVzKGVudGl0eVNldEFubm90YXRpb25zKSBhcyBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgY3VzdG9tQWdncmVnYXRlcyA9IGN1c3RvbUFnZ3JlZ2F0ZXNBbm5vdGF0aW9ucyA/IE9iamVjdC5rZXlzKGN1c3RvbUFnZ3JlZ2F0ZXNBbm5vdGF0aW9ucykgOiB1bmRlZmluZWQ7XG5cdFx0aWYgKGN1c3RvbUFnZ3JlZ2F0ZXM/LmluY2x1ZGVzKGNvbnRleHRQYXRoKSkge1xuXHRcdFx0aW50ZXJhbmxJc0N1c3RvbUFnZ3JlZ2F0ZSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcmFubElzQ3VzdG9tQWdncmVnYXRlO1xufVxuXG4vLyBJbnRlcm5hbCB1c2FnZSBvbmx5XG5cbmZ1bmN0aW9uIGNoZWNrRW50aXR5U2V0SXNGaWx0ZXJhYmxlKFxuXHRlbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRuYXZpZ2F0aW9uQ29udGV4dDogQ29udGV4dCB8IG51bGxcbik6IGJvb2xlYW4ge1xuXHRsZXQgaXNGaWx0ZXJhYmxlID1cblx0XHRlbnRpdHlTZXRQYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggPT09IDIgJiYgIXByb3BlcnR5LmluY2x1ZGVzKFwiL1wiKVxuXHRcdFx0PyAhaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKG1ldGFNb2RlbENvbnRleHQsIGVudGl0eVNldFBhdGgsIHByb3BlcnR5KVxuXHRcdFx0OiAhaXNDb250ZXh0UGF0aEZpbHRlcmFibGUobWV0YU1vZGVsQ29udGV4dCwgZW50aXR5U2V0UGF0aCwgcHJvcGVydHkpO1xuXHQvLyBjaGVjayBpZiB0eXBlIGNhbiBiZSB1c2VkIGZvciBmaWx0ZXJpbmdcblx0aWYgKGlzRmlsdGVyYWJsZSAmJiBuYXZpZ2F0aW9uQ29udGV4dCkge1xuXHRcdGNvbnN0IHByb3BlcnR5RGF0YVR5cGUgPSBnZXRQcm9wZXJ0eURhdGFUeXBlKG5hdmlnYXRpb25Db250ZXh0KTtcblx0XHRpZiAocHJvcGVydHlEYXRhVHlwZSkge1xuXHRcdFx0aXNGaWx0ZXJhYmxlID0gcHJvcGVydHlEYXRhVHlwZSA/IGlzVHlwZUZpbHRlcmFibGUocHJvcGVydHlEYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKSA6IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0ZpbHRlcmFibGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGlzRmlsdGVyYWJsZTtcbn1cblxuLy8gSW50ZXJuYWwgdXNhZ2Ugb25seVxuZnVuY3Rpb24gaXNDb250ZXh0UGF0aEZpbHRlcmFibGUobWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIGVudGl0eVNldFBhdGg6IHN0cmluZywgY29udGV4dFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRjb25zdCBmdWxsUGF0aCA9IGAke2VudGl0eVNldFBhdGh9LyR7Y29udGV4dFBhdGh9YCxcblx0XHRlc1BhcnRzID0gZnVsbFBhdGguc3BsaXQoXCIvXCIpLnNwbGljZSgwLCAyKSxcblx0XHRjb250ZXh0cyA9IGZ1bGxQYXRoLnNwbGl0KFwiL1wiKS5zcGxpY2UoMik7XG5cdGxldCBpc05vRmlsdGVyYWJsZSA9IGZhbHNlLFxuXHRcdGNvbnRleHQgPSBcIlwiO1xuXG5cdGVudGl0eVNldFBhdGggPSBlc1BhcnRzLmpvaW4oXCIvXCIpO1xuXG5cdGlzTm9GaWx0ZXJhYmxlID0gY29udGV4dHMuc29tZShmdW5jdGlvbiAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBhcnJheTogc3RyaW5nW10pIHtcblx0XHRpZiAoY29udGV4dC5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb250ZXh0ICs9IGAvJHtpdGVtfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBpdGVtO1xuXHRcdH1cblx0XHRpZiAoaW5kZXggPT09IGFycmF5Lmxlbmd0aCAtIDIpIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgXCIvQ3VzdG9tZXIvU2V0L1Byb3BlcnR5XCIgdGhpcyBpcyB0byBjaGVjayBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucyBvZiBcIkN1c3RvbWVyXCIgZm9yIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXMgaW4gXCJTZXRcIlxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhtZXRhTW9kZWxDb250ZXh0LCBlbnRpdHlTZXRQYXRoLCBpdGVtKTtcblx0XHRcdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9ucyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbnM/LkZpbHRlclJlc3RyaWN0aW9ucztcblx0XHRcdGNvbnN0IG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gZmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHRhcmdldFByb3BlcnR5UGF0aCA9IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcz8uZmluZChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5UGF0aC4kUHJvcGVydHlQYXRoID09PSB0YXJnZXRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdH0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly9sYXN0IHBhdGggc2VnbWVudFxuXHRcdFx0aXNOb0ZpbHRlcmFibGUgPSBpc0luTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMobWV0YU1vZGVsQ29udGV4dCwgZW50aXR5U2V0UGF0aCwgY29udGV4dCk7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofS8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke2l0ZW19YCkpIHtcblx0XHRcdC8vY2hlY2sgZXhpc3RpbmcgY29udGV4dCBwYXRoIGFuZCBpbml0aWFsaXplIGl0XG5cdFx0XHRpc05vRmlsdGVyYWJsZSA9IGlzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyhtZXRhTW9kZWxDb250ZXh0LCBlbnRpdHlTZXRQYXRoLCBjb250ZXh0KTtcblx0XHRcdGNvbnRleHQgPSBcIlwiO1xuXHRcdFx0Ly9zZXQgdGhlIG5ldyBFbnRpdHlTZXRcblx0XHRcdGVudGl0eVNldFBhdGggPSBcIi9cIiArIG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7aXRlbX1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzTm9GaWx0ZXJhYmxlO1xuXHR9KTtcblx0cmV0dXJuIGlzTm9GaWx0ZXJhYmxlO1xufVxuXG4vLyBJbnRlcm5hbCB1c2FnZSBvbmx5XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGF0YVR5cGUobmF2aWdhdGlvbkNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgZGF0YVR5cGUgPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIiRUeXBlXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblx0Ly8gaWYgJGtpbmQgZXhpc3RzLCBpdCdzIG5vdCBhIERhdGFGaWVsZCBhbmQgd2UgaGF2ZSB0aGUgZmluYWwgdHlwZSBhbHJlYWR5XG5cdGlmICghbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCIka2luZFwiKSkge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb25cIjpcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0ZGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCI6XG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoXCI6XG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aFVybFwiOlxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoQWN0aW9uXCI6XG5cdFx0XHRcdGRhdGFUeXBlID0gbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJWYWx1ZS8kUGF0aC8kVHlwZVwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlRhcmdldC8kQW5ub3RhdGlvblBhdGhcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdFx0XHRpZiAoYW5ub3RhdGlvblBhdGguaW5jbHVkZXMoXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RcIikpIHtcblx0XHRcdFx0XHRcdGRhdGFUeXBlID0gbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJUYXJnZXQvJEFubm90YXRpb25QYXRoL2ZuLyRQYXRoLyRUeXBlXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCIpKSB7XG5cdFx0XHRcdFx0XHRkYXRhVHlwZSA9IG5hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiVmFsdWUvJFBhdGgvJFR5cGVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBlLmcuIEZpZWxkR3JvdXAgb3IgQ2hhcnRcblx0XHRcdFx0XHRcdGRhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZGF0YVR5cGU7XG59XG5cbi8vIEZyb20gQ29tbW9uVXRpbHMsIENvbW1vbkhlbHBlciwgRmlsdGVyQmFyRGVsZWdhdGUsIEZpbHRlckZpZWxkLCBWYWx1ZUxpc3RIZWxwZXIsIFRhYmxlRGVsZWdhdGVcbi8vIFRPRE8gY2hlY2sgdXNlZCBwbGFjZXMgYW5kIHJld29yayB0aGlzXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eUZpbHRlcmFibGUoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRlbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBzdHJpbmcsXG5cdHNraXBIaWRkZW5GaWx0ZXJzPzogYm9vbGVhblxuKTogYm9vbGVhbiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcInNQcm9wZXJ0eSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZ1wiKTtcblx0fVxuXG5cdC8vIFBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGZpbHRlcmZpZWxkc1xuXHRpZiAobWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCkgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gbWV0YU1vZGVsQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtlbnRpdHlTZXRQYXRofS8ke3Byb3BlcnR5fWApO1xuXG5cdGlmIChuYXZpZ2F0aW9uQ29udGV4dCAmJiAhc2tpcEhpZGRlbkZpbHRlcnMpIHtcblx0XHRpZiAoXG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIikgPT09IHRydWUgfHxcblx0XHRcdG5hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlbkZpbHRlclwiKSA9PT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBoaWRkZW5QYXRoID0gbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuLyRQYXRoXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBoaWRkZW5GaWx0ZXJQYXRoID0gbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyLyRQYXRoXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChoaWRkZW5QYXRoICYmIGhpZGRlbkZpbHRlclBhdGgpIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihub3Qob3IocGF0aEluTW9kZWwoaGlkZGVuUGF0aCksIHBhdGhJbk1vZGVsKGhpZGRlbkZpbHRlclBhdGgpKSkpO1xuXHRcdH0gZWxzZSBpZiAoaGlkZGVuUGF0aCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChwYXRoSW5Nb2RlbChoaWRkZW5QYXRoKSkpO1xuXHRcdH0gZWxzZSBpZiAoaGlkZGVuRmlsdGVyUGF0aCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChwYXRoSW5Nb2RlbChoaWRkZW5GaWx0ZXJQYXRoKSkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2hlY2tFbnRpdHlTZXRJc0ZpbHRlcmFibGUoZW50aXR5U2V0UGF0aCwgbWV0YU1vZGVsQ29udGV4dCwgcHJvcGVydHksIG5hdmlnYXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZW50aXR5IHByb3BlcnRpZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcmVxdWlyZWQsIG5vbi1jb21wdXRlZCBrZXkgYW5kIGltbXV0YWJsZSBmaWVsZHMuXG4gKiBAcGFyYW0gbWV0YU1vZGVsIE1ldGFtb2RlbFxuICogQHBhcmFtIHBhdGggRW50aXR5c2V0IFBhdGhcbiAqIEBwYXJhbSBhcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVxdWlyZWQsIG5vbi1jb21wdXRlZCBrZXkgYW5kIGltbXV0YWJsZSBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVBvcHVwRmllbGRzKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHBhdGg6IHN0cmluZywgYXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50KTogc3RyaW5nW10ge1xuXHRjb25zdCBkYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQocGF0aCkpO1xuXHRjb25zdCBub25Db21wdXRlZFZpc2libGVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBpbW11dGFibGVWaXNpYmxlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCB2aXNpYmlsZVJlcXVpcmVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0Ly9XZSBmaXJzdCBwcm9jZXNzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzXG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyhwYXRoLCBtZXRhTW9kZWwpO1xuXHRjb25zdCBlbnRpdHlQcm9wZXJ0aWVzID0gZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Zm9yIChjb25zdCBwcm9wIG9mIGVudGl0eVByb3BlcnRpZXMpIHtcblx0XHRjb25zdCBhbm5vdGF0aW9ucyA9IHByb3AuYW5ub3RhdGlvbnMsXG5cdFx0XHRpc0tleSA9IHByb3AuaXNLZXksXG5cdFx0XHRwcm9wTmFtZSA9IHByb3AubmFtZSxcblx0XHRcdGlzSW1tdXRhYmxlID0gYW5ub3RhdGlvbnMuQ29yZT8uSW1tdXRhYmxlPy52YWx1ZU9mKCkgPT09IHRydWUsXG5cdFx0XHRpc05vbkNvbXB1dGVkID0gIShhbm5vdGF0aW9ucy5Db3JlPy5Db21wdXRlZD8udmFsdWVPZigpID09PSB0cnVlKSxcblx0XHRcdGlzVmlzaWJsZSA9ICEoYW5ub3RhdGlvbnMuVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKSxcblx0XHRcdGlzQ29tcHV0ZWREZWZhdWx0VmFsdWUgPSBhbm5vdGF0aW9ucy5Db3JlPy5Db21wdXRlZERlZmF1bHRWYWx1ZT8udmFsdWVPZigpID09PSB0cnVlLFxuXHRcdFx0aXNLZXlDb21wdXRlZERlZmF1bHRWYWx1ZVdpdGhUZXh0ID1cblx0XHRcdFx0aXNLZXkgJiYgcHJvcC50eXBlID09PSBcIkVkbS5HdWlkXCIgPyBpc0NvbXB1dGVkRGVmYXVsdFZhbHVlICYmIGFubm90YXRpb25zLkNvbW1vbj8uVGV4dCA6IGZhbHNlO1xuXHRcdGlmICgoaXNLZXlDb21wdXRlZERlZmF1bHRWYWx1ZVdpdGhUZXh0IHx8IChpc0tleSAmJiBwcm9wLnR5cGUgIT09IFwiRWRtLkd1aWRcIikpICYmIGlzTm9uQ29tcHV0ZWQgJiYgaXNWaXNpYmxlKSB7XG5cdFx0XHRub25Db21wdXRlZFZpc2libGVLZXlzLnB1c2gocHJvcE5hbWUpO1xuXHRcdH0gZWxzZSBpZiAocmVxdWlyZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BOYW1lKSAmJiBpc1Zpc2libGUgJiYgIShpc0tleSAmJiAhbm9uQ29tcHV0ZWRWaXNpYmxlS2V5cy5pbmNsdWRlcyhwcm9wTmFtZSkpKSB7XG5cdFx0XHR2aXNpYmlsZVJlcXVpcmVkUHJvcGVydGllcy5wdXNoKHByb3BOYW1lKTtcblx0XHR9IGVsc2UgaWYgKGlzSW1tdXRhYmxlICYmIGlzTm9uQ29tcHV0ZWQgJiYgaXNWaXNpYmxlKSB7XG5cdFx0XHRpbW11dGFibGVWaXNpYmxlRmllbGRzLnB1c2gocHJvcE5hbWUpO1xuXHRcdH1cblxuXHRcdGlmICghaXNOb25Db21wdXRlZCAmJiBpc0NvbXB1dGVkRGVmYXVsdFZhbHVlICYmIGFwcENvbXBvbmVudCkge1xuXHRcdFx0Y29uc3QgZGlhZ25vc3RpY3MgPSBhcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBcIkNvcmUuQ29tcHV0ZWREZWZhdWx0VmFsdWUgaXMgaWdub3JlZCBhcyBDb3JlLkNvbXB1dGVkIGlzIGFscmVhZHkgc2V0IHRvIHRydWVcIjtcblx0XHRcdGRpYWdub3N0aWNzLmFkZElzc3VlKFxuXHRcdFx0XHRJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sXG5cdFx0XHRcdElzc3VlU2V2ZXJpdHkuTWVkaXVtLFxuXHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZSxcblx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUuQW5ub3RhdGlvbnMuSWdub3JlZEFubm90YXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8vVGhlIG9yZGVyIG9mIGZpZWxkcyB3aWxsIGJlIG5vbiBjb21wdXRlZCBrZXkgZmllbGRzLCByZXF1aXJlZCBwcm9wZXJ0aWVzIGFuZCB0aGVuIG5vbiBjb21wdXRlZCBpbW11dGFibGUgZmllbGRzLlxuXHRyZXR1cm4gbm9uQ29tcHV0ZWRWaXNpYmxlS2V5cy5jb25jYXQodmlzaWJpbGVSZXF1aXJlZFByb3BlcnRpZXMpLmNvbmNhdChpbW11dGFibGVWaXNpYmxlRmllbGRzKTtcbn1cbi8vIEludGVybmFsIG9ubHksIGV4cG9zZWQgZm9yIHRlc3RzXG5mdW5jdGlvbiBnZXRSZXF1aXJlZFByb3BlcnRpZXMocGF0aDogc3RyaW5nLCBtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMgPSBmYWxzZSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgcmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGg6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0bGV0IGVudGl0eVNldEFubm90YXRpb246IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfCBudWxsID0gbnVsbDtcblx0aWYgKHBhdGguZW5kc1dpdGgoXCIkXCIpKSB7XG5cdFx0Ly8gaWYgc1BhdGggY29tZXMgd2l0aCBhICQgaW4gdGhlIGVuZCwgcmVtb3ZpbmcgaXQgYXMgaXQgaXMgb2Ygbm8gc2lnbmlmaWNhbmNlXG5cdFx0cGF0aCA9IHBhdGgucmVwbGFjZShcIi8kXCIsIFwiXCIpO1xuXHR9XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoUGFydHMgPSBwYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChwYXRoLCBtZXRhTW9kZWxDb250ZXh0KTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aFBhcnRzID0gZW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgaXNDb250YWlubWVudCA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfS8kQ29udGFpbnNUYXJnZXRgKSA/IHRydWUgOiBmYWxzZTtcblx0Y29uc3QgY29udGFpbm1lbnROYXZQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXSA6IFwiXCI7XG5cblx0Ly9SZXN0cmljdGlvbnMgZGlyZWN0bHkgYXQgRW50aXR5IFNldFxuXHQvL2UuZy4gRlIgaW4gXCJOUy5FbnRpdHlDb250YWluZXIvU2FsZXNPcmRlck1hbmFnZVwiIENvbnRleHRQYXRoOiAvU2FsZXNPcmRlck1hbmFnZVxuXHRpZiAoIWlzQ29udGFpbm1lbnQpIHtcblx0XHRlbnRpdHlTZXRBbm5vdGF0aW9uID0gbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AYCkgYXMgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbjtcblx0fVxuXHRpZiAoZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Y29uc3QgbmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBjb250YWlubWVudE5hdlBhdGggOiBlbnRpdHlTZXRQYXRoUGFydHNbZW50aXR5U2V0UGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IGpvaW5UZXh0ID0gYC8ke25hdmlnYXRpb25UZXh0fS9gO1xuXHRcdGNvbnN0IHBhcmVudEVudGl0eVNldFBhdGggPSBpc0NvbnRhaW5tZW50ID8gZW50aXR5U2V0UGF0aCA6IGAvJHtlbnRpdHlTZXRQYXRoUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oam9pblRleHQpfWA7XG5cdFx0Ly9OYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3QgbmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0XHRcdG1ldGFNb2RlbENvbnRleHQsXG5cdFx0XHRwYXJlbnRFbnRpdHlTZXRQYXRoLFxuXHRcdFx0bmF2UGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKVxuXHRcdCk7XG5cblx0XHRpZiAoXG5cdFx0XHRuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdE1FVEFNT0RFTF9GVU5DVElPTlMuaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zKG5hdmlnYXRpb25SZXN0cmljdGlvbnMsIHRydWUsIGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zKVxuXHRcdCkge1xuXHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGggPSBjaGVja1VwZGF0ZVJlc3RyaWN0aW9uc1xuXHRcdFx0XHQ/IG5hdmlnYXRpb25SZXN0cmljdGlvbnMuVXBkYXRlUmVzdHJpY3Rpb25zPy5SZXF1aXJlZFByb3BlcnRpZXMgPz8gW11cblx0XHRcdFx0OiBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLkluc2VydFJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzID8/IFtdO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHQhcmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGgubGVuZ3RoICYmXG5cdFx0XHRNRVRBTU9ERUxfRlVOQ1RJT05TLmhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9ucyhlbnRpdHlTZXRBbm5vdGF0aW9uLCBmYWxzZSwgY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpXG5cdFx0KSB7XG5cdFx0XHRyZXF1aXJlZFByb3BlcnRpZXNXaXRoUGF0aCA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zKFxuXHRcdFx0XHRlbnRpdHlTZXRBbm5vdGF0aW9uLFxuXHRcdFx0XHRjaGVja1VwZGF0ZVJlc3RyaWN0aW9uc1xuXHRcdFx0KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoTUVUQU1PREVMX0ZVTkNUSU9OUy5oYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMoZW50aXR5U2V0QW5ub3RhdGlvbiwgZmFsc2UsIGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zKSkge1xuXHRcdHJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoID0gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tQW5ub3RhdGlvbnMoZW50aXR5U2V0QW5ub3RhdGlvbiwgY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpO1xuXHR9XG5cdHJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoLmZvckVhY2goZnVuY3Rpb24gKHJlcXVpcmVkUHJvcGVydHkpIHtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSByZXF1aXJlZFByb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0cmVxdWlyZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlQYXRoKTtcblx0fSk7XG5cdHJldHVybiByZXF1aXJlZFByb3BlcnRpZXM7XG59XG5cbi8vIFRyYW5zYWN0aW9uSGVscGVyIC8vIEludGVybmFsRmllbGRcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHBhdGg6IHN0cmluZywgbWV0YW1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmdbXSB7XG5cdHJldHVybiBNRVRBTU9ERUxfRlVOQ1RJT05TLmdldFJlcXVpcmVkUHJvcGVydGllcyhwYXRoLCBtZXRhbW9kZWxDb250ZXh0KTtcbn1cblxuLy8gSW50ZXJuYWxGaWVsZFxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMocGF0aDogc3RyaW5nLCBtZXRhbW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZ1tdIHtcblx0cmV0dXJuIE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKHBhdGgsIG1ldGFtb2RlbENvbnRleHQsIHRydWUpO1xufVxuXG4vLyBJbnRlcm5hbCBvbmx5LCBleHBvc2VkIGZvciB0ZXN0c1xuZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zKFxuXHRhbm5vdGF0aW9uczogTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbiB8IG51bGwsXG5cdGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zID0gZmFsc2Vcbik6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSB7XG5cdGlmIChjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdHJldHVybiBhbm5vdGF0aW9ucz8uW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zXCJdPy5SZXF1aXJlZFByb3BlcnRpZXMgPz8gW107XG5cdH1cblx0cmV0dXJuIGFubm90YXRpb25zPy5bXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNcIl0/LlJlcXVpcmVkUHJvcGVydGllcyA/PyBbXTtcbn1cblxuLy8gSW50ZXJuYWwgb25seSwgZXhwb3NlZCBmb3IgdGVzdHNcbmZ1bmN0aW9uIGhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9ucyhcblx0YW5ub3RhdGlvbnM6IE1ldGFNb2RlbFR5cGU8TmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcz4gfCBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uIHwgbnVsbCxcblx0aXNOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZmFsc2UsXG5cdGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKSB7XG5cdFx0Y29uc3QgbmF2QW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyBhcyBNZXRhTW9kZWxUeXBlPE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXM+IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdFx0cmV0dXJuIG5hdkFubm90YXRpb25zPy5VcGRhdGVSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcyA/IHRydWUgOiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hdkFubm90YXRpb25zPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcyA/IHRydWUgOiBmYWxzZTtcblx0fSBlbHNlIGlmIChjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdGNvbnN0IGVudGl0eUFubm90YXRpb25zID0gYW5ub3RhdGlvbnMgYXMgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gZW50aXR5QW5ub3RhdGlvbnM/LltcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9uc1wiXT8uUmVxdWlyZWRQcm9wZXJ0aWVzID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cdGNvbnN0IGVudGl0eXRTZXRBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zIGFzIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfCB1bmRlZmluZWQ7XG5cdHJldHVybiBlbnRpdHl0U2V0QW5ub3RhdGlvbnM/LltcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1wiXT8uUmVxdWlyZWRQcm9wZXJ0aWVzID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5leHBvcnQgdHlwZSBDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9uID0ge1xuXHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRuYW1lPzogc3RyaW5nO1xuXHRwcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG5cdHNvcnRhYmxlPzogYm9vbGVhbjtcblx0c29ydE9yZGVyPzogc3RyaW5nO1xuXHRjdXN0b20/OiBib29sZWFuO1xufTtcblxuLy8gVXNlZCBpbiB0aGlzIGZpbGUgYW5kIEZpbHRlclV0aWxzXG4vKipcbiAqIFJldHVybnMgY3VzdG9tIGFnZ3JlZ2F0ZXMgZm9yIGEgZ2l2ZW4gZW50aXR5U2V0LlxuICogQHBhcmFtIGFubm90YXRpb25zIEEgbGlzdCBvZiBhbm5vdGF0aW9ucyBvZiB0aGUgZW50aXR5IHNldFxuICogQHJldHVybnMgQSBtYXAgdG8gdGhlIGN1c3RvbSBhZ2dyZWdhdGVzIGtleWVkIGJ5IHRoZWlyIHF1YWxpZmllcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEN1c3RvbUFnZ3JlZ2F0ZXMoYW5ub3RhdGlvbnM6IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9uPiB7XG5cdGNvbnN0IGN1c3RvbUFnZ3JlZ2F0ZXM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb24+ID0ge307XG5cdGxldCBhbm5vdGF0aW9uO1xuXHRmb3IgKGNvbnN0IGFubm90YXRpb25LZXkgaW4gYW5ub3RhdGlvbnMpIHtcblx0XHRpZiAoYW5ub3RhdGlvbktleS5zdGFydHNXaXRoKFwiQE9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5DdXN0b21BZ2dyZWdhdGVcIikpIHtcblx0XHRcdGFubm90YXRpb24gPSBhbm5vdGF0aW9uS2V5LnJlcGxhY2UoXCJAT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkN1c3RvbUFnZ3JlZ2F0ZSNcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUGFydHMgPSBhbm5vdGF0aW9uLnNwbGl0KFwiQFwiKTtcblxuXHRcdFx0aWYgKGFubm90YXRpb25QYXJ0cy5sZW5ndGggPT0gMikge1xuXHRcdFx0XHRjb25zdCBjdXN0b21BZ2dyZWdhdGU6IEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb24gPSB7fTtcblx0XHRcdFx0Ly9pbm5lciBhbm5vdGF0aW9uIHRoYXQgaXMgbm90IHBhcnQgb2YgXHRWYWxpZGF0aW9uLkFnZ3JlZ2F0YWJsZVRlcm1zXG5cdFx0XHRcdGlmIChhbm5vdGF0aW9uUGFydHNbMV0gPT0gXCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQ29udGV4dERlZmluaW5nUHJvcGVydGllc1wiKSB7XG5cdFx0XHRcdFx0Y3VzdG9tQWdncmVnYXRlLmNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uS2V5XSBhcyBzdHJpbmdbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChhbm5vdGF0aW9uUGFydHNbMV0gPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIikge1xuXHRcdFx0XHRcdGN1c3RvbUFnZ3JlZ2F0ZS5sYWJlbCA9IGFubm90YXRpb25zW2Fubm90YXRpb25LZXldIGFzIHN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRjdXN0b21BZ2dyZWdhdGVzW2Fubm90YXRpb25QYXJ0c1swXV0gPSBjdXN0b21BZ2dyZWdhdGU7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25QYXJ0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRjdXN0b21BZ2dyZWdhdGVzW2Fubm90YXRpb25QYXJ0c1swXV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogYW5ub3RhdGlvblBhcnRzWzBdLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogYW5ub3RhdGlvblBhcnRzWzBdLFxuXHRcdFx0XHRcdGxhYmVsOiBgQ3VzdG9tIEFnZ3JlZ2F0ZSAoJHthbm5vdGF0aW9ufSlgLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNvcnRPcmRlcjogXCJib3RoXCIsXG5cdFx0XHRcdFx0Y3VzdG9tOiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1c3RvbUFnZ3JlZ2F0ZXM7XG59XG5cbi8vIFVzZWQgaW4gVmFsdWVMaXN0SGVscGVyLCBDaGFydERlbGVnYXRlIGFuZCBWYWx1ZUhlbHAtVGFibGVEZWxlZ2F0ZVxuZXhwb3J0IHR5cGUgU29ydFJlc3RyaWN0aW9uc1Byb3BlcnR5SW5mb1R5cGUgPSB7XG5cdHNvcnRhYmxlOiBib29sZWFuO1xuXHRzb3J0RGlyZWN0aW9uPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU29ydFJlc3RyaWN0aW9uc0luZm9UeXBlID0ge1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0cHJvcGVydHlJbmZvOiBSZWNvcmQ8c3RyaW5nLCBTb3J0UmVzdHJpY3Rpb25zUHJvcGVydHlJbmZvVHlwZT47XG59O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBzb3J0aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlc3RyaWN0aW9uIGFubm90YXRpb24uXG4gKiBAcGFyYW0gZW50aXR5U2V0QW5ub3RhdGlvbnMgRW50aXR5U2V0IG9yIGNvbGxlY3Rpb24gYW5ub3RhdGlvbnMgd2l0aCB0aGUgc29ydCByZXN0cmljdGlvbnMgYW5ub3RhdGlvblxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNvcnQgcmVzdHJpY3Rpb24gaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvcnRSZXN0cmljdGlvbnNJbmZvKGVudGl0eVNldEFubm90YXRpb25zOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uKTogU29ydFJlc3RyaWN0aW9uc0luZm9UeXBlIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0luZm86IFNvcnRSZXN0cmljdGlvbnNJbmZvVHlwZSA9IHtcblx0XHRzb3J0YWJsZTogdHJ1ZSxcblx0XHRwcm9wZXJ0eUluZm86IHt9XG5cdH07XG5cblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9ucyA9IGVudGl0eVNldEFubm90YXRpb25zW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU29ydFJlc3RyaWN0aW9uc1wiXTtcblxuXHRpZiAoIXNvcnRSZXN0cmljdGlvbnMpIHtcblx0XHRyZXR1cm4gc29ydFJlc3RyaWN0aW9uc0luZm87XG5cdH1cblxuXHRpZiAoc29ydFJlc3RyaWN0aW9ucy5Tb3J0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHRzb3J0UmVzdHJpY3Rpb25zSW5mby5zb3J0YWJsZSA9IGZhbHNlO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eUl0ZW0gb2Ygc29ydFJlc3RyaWN0aW9ucy5Ob25Tb3J0YWJsZVByb3BlcnRpZXMgfHwgW10pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUl0ZW0uJFByb3BlcnR5UGF0aDtcblx0XHRzb3J0UmVzdHJpY3Rpb25zSW5mby5wcm9wZXJ0eUluZm9bcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdHNvcnRhYmxlOiBmYWxzZVxuXHRcdH07XG5cdH1cblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5SXRlbSBvZiBzb3J0UmVzdHJpY3Rpb25zLkFzY2VuZGluZ09ubHlQcm9wZXJ0aWVzIHx8IFtdKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJdGVtLiRQcm9wZXJ0eVBhdGg7XG5cdFx0c29ydFJlc3RyaWN0aW9uc0luZm8ucHJvcGVydHlJbmZvW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdHNvcnREaXJlY3Rpb246IFwiYXNjXCIgLy8gbm90IHVzZWQsIHlldFxuXHRcdH07XG5cdH1cblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5SXRlbSBvZiBzb3J0UmVzdHJpY3Rpb25zLkRlc2NlbmRpbmdPbmx5UHJvcGVydGllcyB8fCBbXSkge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SXRlbS4kUHJvcGVydHlQYXRoO1xuXHRcdHNvcnRSZXN0cmljdGlvbnNJbmZvLnByb3BlcnR5SW5mb1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0c29ydGFibGU6IHRydWUsXG5cdFx0XHRzb3J0RGlyZWN0aW9uOiBcImRlc2NcIiAvLyBub3QgdXNlZCwgeWV0XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zSW5mbztcbn1cblxuLy8gVXNlZCBpbiBDaGFydERlbGVnYXRlIGFuZCBWYWx1ZUhlbHAtVGFibGVEZWxlZ2F0ZVxuZXhwb3J0IHR5cGUgRmlsdGVyUmVzdHJpY3Rpb25zUHJvcGVydHlJbmZvVHlwZSA9IHtcblx0ZmlsdGVyYWJsZTogYm9vbGVhbjtcblx0YWxsb3dlZEV4cHJlc3Npb25zPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJSZXN0cmljdGlvbnNJbmZvVHlwZSA9IHtcblx0ZmlsdGVyYWJsZTogYm9vbGVhbjtcblx0cmVxdWlyZXNGaWx0ZXI6IGJvb2xlYW47XG5cdHByb3BlcnR5SW5mbzogUmVjb3JkPHN0cmluZywgRmlsdGVyUmVzdHJpY3Rpb25zUHJvcGVydHlJbmZvVHlwZT47XG5cdHJlcXVpcmVkUHJvcGVydGllczogc3RyaW5nW107XG59O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBmaWx0ZXIgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIGZpbHRlciByZXN0cmljdGlvbnMgYW5ub2F0aW9uLlxuICogQHBhcmFtIGZpbHRlclJlc3RyaWN0aW9ucyBUaGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNJbmZvKGZpbHRlclJlc3RyaWN0aW9ucz86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pOiBGaWx0ZXJSZXN0cmljdGlvbnNJbmZvVHlwZSB7XG5cdGxldCBpLCBwcm9wZXJ0eU5hbWU7XG5cdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0luZm86IEZpbHRlclJlc3RyaWN0aW9uc0luZm9UeXBlID0ge1xuXHRcdGZpbHRlcmFibGU6IHRydWUsXG5cdFx0cmVxdWlyZXNGaWx0ZXI6IGZpbHRlclJlc3RyaWN0aW9ucz8uUmVxdWlyZXNGaWx0ZXIgfHwgZmFsc2UsXG5cdFx0cHJvcGVydHlJbmZvOiB7fSxcblx0XHRyZXF1aXJlZFByb3BlcnRpZXM6IFtdXG5cdH07XG5cblx0aWYgKCFmaWx0ZXJSZXN0cmljdGlvbnMpIHtcblx0XHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zSW5mbztcblx0fVxuXG5cdGlmIChmaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLmZpbHRlcmFibGUgPSBmYWxzZTtcblx0fVxuXG5cdC8vSGllcmFyY2hpY2FsIENhc2Vcblx0aWYgKGZpbHRlclJlc3RyaWN0aW9ucy5SZXF1aXJlZFByb3BlcnRpZXMpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgZmlsdGVyUmVzdHJpY3Rpb25zLlJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0cHJvcGVydHlOYW1lID0gZmlsdGVyUmVzdHJpY3Rpb25zLlJlcXVpcmVkUHJvcGVydGllc1tpXS4kUHJvcGVydHlQYXRoO1xuXHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zSW5mby5yZXF1aXJlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gZmlsdGVyUmVzdHJpY3Rpb25zLk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3ApID0+IHByb3AuJFByb3BlcnR5UGF0aCkgfHwgW107XG5cdGNvbnN0IGZpbHRlcmFibGVQcm9wZXJ0aWVzID0gZmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnM/Lm1hcCgocHJvcCkgPT4gcHJvcC5Qcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCkgfHwgW107XG5cdGdldEZpbHRlcmFibGVEYXRhKGZpbHRlclJlc3RyaWN0aW9uc0luZm8ucHJvcGVydHlJbmZvLCBub25GaWx0ZXJhYmxlUHJvcGVydGllcywgZmlsdGVyYWJsZVByb3BlcnRpZXMpO1xuXG5cdGlmIChmaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucykge1xuXHRcdC8vVEJEXG5cdFx0Zm9yIChpID0gMDsgaSA8IGZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBmaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uc1tpXS5Qcm9wZXJ0eT8uJFByb3BlcnR5UGF0aDtcblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zSW5mby5wcm9wZXJ0eUluZm9bcHJvcGVydHlOYW1lXVtcImFsbG93ZWRFeHByZXNzaW9uc1wiXSA9IGZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zW2ldXG5cdFx0XHRcdFx0LkFsbG93ZWRFeHByZXNzaW9ucyBhcyB1bmtub3duIGFzIHN0cmluZ1tdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmaWx0ZXJSZXN0cmljdGlvbnNJbmZvO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIG9iaiB0byBoYXZlIGxpc3Qgb2YgcHJvcGVydGllcyB3aGljaCBjYW4gYmUgZmlsdGVyZWQgb3Igbm90LlxuICogQHBhcmFtIGZpbHRlckRhdGFPYmpcbiAqIEBwYXJhbSBub25GaWx0ZXJhYmxlUHJvcGVydGllc1xuICogQHBhcmFtIGZpbHRlcmFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJhYmxlRGF0YShcblx0ZmlsdGVyRGF0YU9iajogUmVjb3JkPHN0cmluZywgRmlsdGVyUmVzdHJpY3Rpb25zUHJvcGVydHlJbmZvVHlwZT4sXG5cdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSxcblx0ZmlsdGVyYWJsZVByb3BlcnRpZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW11cbik6IHZvaWQge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZmlsdGVyRGF0YU9ialtub25GaWx0ZXJhYmxlUHJvcGVydGllc1tpXV0gPSB7XG5cdFx0XHRmaWx0ZXJhYmxlOiBmYWxzZVxuXHRcdH07XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJhYmxlUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHByb3BOYW1lID0gZmlsdGVyYWJsZVByb3BlcnRpZXNbaV07XG5cdFx0aWYgKHByb3BOYW1lKSB7XG5cdFx0XHRmaWx0ZXJEYXRhT2JqW3Byb3BOYW1lXSA9IHtcblx0XHRcdFx0ZmlsdGVyYWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn1cblxuLy8gVXNlZCBpbiBDaGFydERlbGVnYXRlIGFuZCBWYWx1ZUhlbHAtVGFibGVEZWxlZ2F0ZVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gaWYgdGhlIEZpbHRlckV4cHJlc3Npb24gaXMgYSBtdWx0aVZhbHVlIEZpbHRlciBFeHByZXNzaW9uLlxuICogQHBhcmFtIGZpbHRlckV4cHJlc3Npb24gVGhlIEZpbHRlckV4cHJlc3Npb25UeXBlXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUgd2V0aGVyIGl0IGlzIGEgbXVsdGlWYWx1ZSBGaWx0ZXIgRXhwcmVzc2lvbiBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlWYWx1ZUZpbHRlckV4cHJlc3Npb24oZmlsdGVyRXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBpc011bHRpVmFsdWUgPSB0cnVlO1xuXG5cdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0c3dpdGNoIChmaWx0ZXJFeHByZXNzaW9uKSB7XG5cdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRjYXNlIFwiU2luZ2xlVmFsdWVcIjpcblx0XHRcdGlzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIGlzTXVsdGlWYWx1ZTtcbn1cblxuLy8gRE8gTk9UIFVTRSwgb25seSBmb3IgdGVzdHMgYW5kIGludGVybmFsbHkgaW4gdGhpcyBmaWxlXG5leHBvcnQgY29uc3QgTUVUQU1PREVMX0ZVTkNUSU9OUyA9IHtcblx0Z2V0UmVxdWlyZWRQcm9wZXJ0aWVzLFxuXHRnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tQW5ub3RhdGlvbnMsXG5cdGhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9ucyxcblx0Z2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyxcblx0Z2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyxcblx0Z2V0QWxsQ3VzdG9tQWdncmVnYXRlcyxcblx0Z2V0RmlsdGVyYWJsZURhdGFcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBQUE7RUFDQTtFQXFCQTtFQUNPLFNBQVNBLHFCQUFxQkEsQ0FBQ0MsUUFBZ0IsRUFBRUMsU0FBeUIsRUFBcUQ7SUFDckksSUFBSUMsa0JBQWtCO0lBQ3RCLElBQUlDLDRCQUE0QjtJQUNoQyxNQUFNQyxjQUFjLEdBQUcsNEJBQTRCO0lBQ25ELE1BQU1DLHNCQUFzQixHQUFHLCtDQUErQztJQUM5RSxNQUFNQyxtQkFBbUIsR0FBR04sUUFBUSxDQUFDTyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLE1BQU0sQ0FBQ0MsV0FBVyxDQUFDQyx1QkFBdUIsQ0FBQztJQUNsSCxNQUFNQyxhQUFhLEdBQUdGLFdBQVcsQ0FBQ0csZ0JBQWdCLENBQUNiLFFBQVEsRUFBRUMsU0FBUyxDQUFDO0lBQ3ZFLE1BQU1hLGtCQUFrQixHQUFHRixhQUFhLENBQUNKLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxDQUFDQyxXQUFXLENBQUNDLHVCQUF1QixDQUFDO0lBQy9GLE1BQU1JLGFBQWEsR0FBR2QsU0FBUyxDQUFDZSxTQUFTLENBQUMsSUFBSVYsbUJBQW1CLENBQUNXLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSztJQUM3RyxNQUFNQyxrQkFBa0IsR0FBR0gsYUFBYSxHQUFHVCxtQkFBbUIsQ0FBQ0EsbUJBQW1CLENBQUNhLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFOztJQUVuRztJQUNBO0lBQ0EsSUFBSSxDQUFDSixhQUFhLEVB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
|
|
533
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTZWFyY2hSZXN0cmljdGlvbnMiLCJmdWxsUGF0aCIsIm1ldGFNb2RlbCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnMiLCJuYXZpZ2F0aW9uVGV4dCIsInNlYXJjaFJlc3RyaWN0aW9uc1Rlcm0iLCJlbnRpdHlUeXBlUGF0aFBhcnRzIiwicmVwbGFjZUFsbCIsInNwbGl0IiwiZmlsdGVyIiwiTW9kZWxIZWxwZXIiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImVudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwiZW50aXR5U2V0UGF0aFBhcnRzIiwiaXNDb250YWlubWVudCIsImdldE9iamVjdCIsImpvaW4iLCJjb250YWlubWVudE5hdlBhdGgiLCJsZW5ndGgiLCJuYXZQYXRoIiwiam9pblN0cmluZyIsInBhcmVudEVudGl0eVNldFBhdGgiLCJzbGljZSIsIm5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJNRVRBTU9ERUxfRlVOQ1RJT05TIiwiZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsIl9leHBvcnRzIiwibWV0YU1vZGVsQ29udGV4dCIsIm5hdmlnYXRpb25QYXRoIiwicmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJyZXN0cmljdGVkUHJvcGVydHkiLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImlzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIm1ldGFtb2RlbENvbnRleHQiLCJjb250ZXh0UGF0aCIsImlzTm90RmlsdGVyYWJsZSIsImZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsInNvbWUiLCJwcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJpc0N1c3RvbUFnZ3JlZ2F0ZSIsImludGVyYW5sSXNDdXN0b21BZ2dyZWdhdGUiLCJpc0FwcGx5U3VwcG9ydGVkIiwiZW50aXR5U2V0QW5ub3RhdGlvbnMiLCJjdXN0b21BZ2dyZWdhdGVzQW5ub3RhdGlvbnMiLCJnZXRBbGxDdXN0b21BZ2dyZWdhdGVzIiwiY3VzdG9tQWdncmVnYXRlcyIsIk9iamVjdCIsImtleXMiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsImNoZWNrRW50aXR5U2V0SXNGaWx0ZXJhYmxlIiwibmF2aWdhdGlvbkNvbnRleHQiLCJpc0ZpbHRlcmFibGUiLCJpc0NvbnRleHRQYXRoRmlsdGVyYWJsZSIsInByb3BlcnR5RGF0YVR5cGUiLCJnZXRQcm9wZXJ0eURhdGFUeXBlIiwiaXNUeXBlRmlsdGVyYWJsZSIsImVzUGFydHMiLCJzcGxpY2UiLCJjb250ZXh0cyIsImlzTm9GaWx0ZXJhYmxlIiwiY29udGV4dCIsIml0ZW0iLCJpbmRleCIsImFycmF5IiwiZmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwibm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJ0YXJnZXRQcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJkYXRhVHlwZSIsImdldFByb3BlcnR5IiwiYW5ub3RhdGlvblBhdGgiLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsInNraXBIaWRkZW5GaWx0ZXJzIiwiRXJyb3IiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImhpZGRlblBhdGgiLCJoaWRkZW5GaWx0ZXJQYXRoIiwiY29tcGlsZUV4cHJlc3Npb24iLCJub3QiLCJvciIsInBhdGhJbk1vZGVsIiwiZ2V0Q3JlYXRlUG9wdXBGaWVsZHMiLCJwYXRoIiwiYXBwQ29tcG9uZW50IiwiZGF0YU1vZGVsIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0Q29udGV4dCIsIm5vbkNvbXB1dGVkVmlzaWJsZUtleXMiLCJpbW11dGFibGVWaXNpYmxlRmllbGRzIiwidmlzaWJpbGVSZXF1aXJlZFByb3BlcnRpZXMiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldEVudGl0eVR5cGUiLCJwcm9wIiwiYW5ub3RhdGlvbnMiLCJpc0tleSIsInByb3BOYW1lIiwibmFtZSIsImlzSW1tdXRhYmxlIiwiQ29yZSIsIkltbXV0YWJsZSIsInZhbHVlT2YiLCJpc05vbkNvbXB1dGVkIiwiQ29tcHV0ZWQiLCJpc1Zpc2libGUiLCJVSSIsIkhpZGRlbiIsImlzQ29tcHV0ZWREZWZhdWx0VmFsdWUiLCJDb21wdXRlZERlZmF1bHRWYWx1ZSIsImlzTm9uR1VJREtleSIsInR5cGUiLCJpc0dVSURLZXlXaXRoVGV4dCIsIkNvbW1vbiIsIlRleHQiLCJwdXNoIiwiZGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsIm1lc3NhZ2UiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIk1lZGl1bSIsIklzc3VlQ2F0ZWdvcnlUeXBlIiwiQW5ub3RhdGlvbnMiLCJJZ25vcmVkQW5ub3RhdGlvbiIsImNvbmNhdCIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zIiwiYXJndW1lbnRzIiwicmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGgiLCJlbnRpdHlTZXRBbm5vdGF0aW9uIiwiZW5kc1dpdGgiLCJyZXBsYWNlIiwiam9pblRleHQiLCJoYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJJbnNlcnRSZXN0cmljdGlvbnMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tQW5ub3RhdGlvbnMiLCJmb3JFYWNoIiwicmVxdWlyZWRQcm9wZXJ0eSIsImdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJpc05hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJuYXZBbm5vdGF0aW9ucyIsImVudGl0eUFubm90YXRpb25zIiwiZW50aXR5dFNldEFubm90YXRpb25zIiwiYW5ub3RhdGlvbiIsImFubm90YXRpb25LZXkiLCJzdGFydHNXaXRoIiwiYW5ub3RhdGlvblBhcnRzIiwiY3VzdG9tQWdncmVnYXRlIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImxhYmVsIiwic29ydGFibGUiLCJzb3J0T3JkZXIiLCJjdXN0b20iLCJnZXRTb3J0UmVzdHJpY3Rpb25zSW5mbyIsInNvcnRSZXN0cmljdGlvbnNJbmZvIiwicHJvcGVydHlJbmZvIiwic29ydFJlc3RyaWN0aW9ucyIsIlNvcnRhYmxlIiwicHJvcGVydHlJdGVtIiwiTm9uU29ydGFibGVQcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwiQXNjZW5kaW5nT25seVByb3BlcnRpZXMiLCJzb3J0RGlyZWN0aW9uIiwiRGVzY2VuZGluZ09ubHlQcm9wZXJ0aWVzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zSW5mbyIsImkiLCJmaWx0ZXJSZXN0cmljdGlvbnNJbmZvIiwiZmlsdGVyYWJsZSIsInJlcXVpcmVzRmlsdGVyIiwiUmVxdWlyZXNGaWx0ZXIiLCJGaWx0ZXJhYmxlIiwibWFwIiwiZmlsdGVyYWJsZVByb3BlcnRpZXMiLCJGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiUHJvcGVydHkiLCJnZXRGaWx0ZXJhYmxlRGF0YSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImZpbHRlckRhdGFPYmoiLCJpc011bHRpVmFsdWVGaWx0ZXJFeHByZXNzaW9uIiwiZmlsdGVyRXhwcmVzc2lvbiIsImlzTXVsdGlWYWx1ZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWV0YU1vZGVsRnVuY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIGRpc2FwcGVhciBhcyBzb29uIGFzIHdlIGNhbi5cbi8vIEl0IGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIG1vdmUgYWxsIG1ldGFtb2RlbCByZWxhdGVkIG9wZXJhdGlvbiBmcm9tIENvbW1vblV0aWxzIHRvIGEgc2VwYXJhdGUgZmlsZS5cblxuaW1wb3J0IHR5cGUgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IHR5cGUge1xuXHRGaWx0ZXJSZXN0cmljdGlvbnNUeXBlLFxuXHROYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzLFxuXHROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zVHlwZSxcblx0U2VhcmNoUmVzdHJpY3Rpb25zVHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIG5vdCwgb3IsIHBhdGhJbk1vZGVsIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERlZmF1bHRUeXBlRm9yRWRtVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IHsgaXNUeXBlRmlsdGVyYWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhwYW5kUGF0aFR5cGUsIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24sIE1ldGFNb2RlbFR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcblxuLy8gRnJvbSBGaWx0ZXJCYXIuYmxvY2sudHMgb25seVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlYXJjaFJlc3RyaWN0aW9ucyhmdWxsUGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogTWV0YU1vZGVsVHlwZTxTZWFyY2hSZXN0cmljdGlvbnNUeXBlPiB8IHVuZGVmaW5lZCB7XG5cdGxldCBzZWFyY2hSZXN0cmljdGlvbnM7XG5cdGxldCBuYXZpZ2F0aW9uU2VhcmNoUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0Y29uc3Qgc2VhcmNoUmVzdHJpY3Rpb25zVGVybSA9IFwiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VhcmNoUmVzdHJpY3Rpb25zXCI7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoUGFydHMgPSBmdWxsUGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKS5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoZnVsbFBhdGgsIG1ldGFNb2RlbCk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGhQYXJ0cyA9IGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGlzQ29udGFpbm1lbnQgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfS8kQ29udGFpbnNUYXJnZXRgKSA/IHRydWUgOiBmYWxzZTtcblx0Y29uc3QgY29udGFpbm1lbnROYXZQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXSA6IFwiXCI7XG5cblx0Ly9MRUFTVCBQUklPUklUWSAtIFNlYXJjaCByZXN0cmljdGlvbnMgZGlyZWN0bHkgYXQgRW50aXR5IFNldFxuXHQvL2UuZy4gRlIgaW4gXCJOUy5FbnRpdHlDb250YWluZXIvU2FsZXNPcmRlck1hbmFnZVwiIENvbnRleHRQYXRoOiAvU2FsZXNPcmRlck1hbmFnZVxuXHRpZiAoIWlzQ29udGFpbm1lbnQpIHtcblx0XHRzZWFyY2hSZXN0cmljdGlvbnMgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9JHtzZWFyY2hSZXN0cmljdGlvbnNUZXJtfWApIGFzXG5cdFx0XHR8IE1ldGFNb2RlbFR5cGU8U2VhcmNoUmVzdHJpY3Rpb25zVHlwZT5cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChlbnRpdHlUeXBlUGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCBuYXZQYXRoOiBzdHJpbmcgPSBpc0NvbnRhaW5tZW50ID8gY29udGFpbm1lbnROYXZQYXRoIDogZW50aXR5U2V0UGF0aFBhcnRzW2VudGl0eVNldFBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHQvLyBJbiBjYXNlIG9mIGNvbnRhaW5tZW50IHdlIHRha2UgZW50aXR5U2V0IHByb3ZpZGVkIGFzIHBhcmVudC4gQW5kIGluIGNhc2Ugb2Ygbm9ybWFsIHdlIHdvdWxkIHJlbW92ZSB0aGUgbGFzdCBuYXZpZ2F0aW9uIGZyb20gZW50aXR5U2V0UGF0aC5cblx0XHRjb25zdCBqb2luU3RyaW5nID0gYC8ke25hdmlnYXRpb25UZXh0fS9gO1xuXHRcdGNvbnN0IHBhcmVudEVudGl0eVNldFBhdGggPSBpc0NvbnRhaW5tZW50ID8gZW50aXR5U2V0UGF0aCA6IGAvJHtlbnRpdHlTZXRQYXRoUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oam9pblN0cmluZyl9YDtcblxuXHRcdC8vSElHSEVTVCBwcmlvcml0eSAtIE5hdmlnYXRpb24gcmVzdHJpY3Rpb25zXG5cdFx0Ly9lLmcuIFBhcmVudCBcIi9DdXN0b21lclwiIHdpdGggTmF2aWdhdGlvblByb3BlcnR5UGF0aD1cIlNldFwiIENvbnRleHRQYXRoOiBDdXN0b21lci9TZXRcblx0XHRjb25zdCBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKFxuXHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0cGFyZW50RW50aXR5U2V0UGF0aCxcblx0XHRcdG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIilcblx0XHQpO1xuXHRcdG5hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnMgPSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5TZWFyY2hSZXN0cmljdGlvbnM7XG5cdH1cblx0cmV0dXJuIG5hdmlnYXRpb25TZWFyY2hSZXN0cmljdGlvbnMgPz8gc2VhcmNoUmVzdHJpY3Rpb25zO1xufVxuXG4vLyBGcm9tIENvbW1vblV0aWxzXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdGVudGl0eVNldFBhdGg6IHN0cmluZyxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZ1xuKTogTWV0YU1vZGVsVHlwZTxOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzPiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofUBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnNgKSBhc1xuXHRcdHwgTWV0YU1vZGVsVHlwZTxOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zVHlwZT5cblx0XHR8IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVzdHJpY3RlZFByb3BlcnRpZXMgPSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcztcblx0cmV0dXJuIHJlc3RyaWN0ZWRQcm9wZXJ0aWVzPy5maW5kKGZ1bmN0aW9uIChyZXN0cmljdGVkUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gcmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eT8uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IG5hdmlnYXRpb25QYXRoO1xuXHR9KTtcbn1cblxuLy8gSW50ZXJuYWwgdXNhZ2Ugb25seVxuZnVuY3Rpb24gaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKG1ldGFtb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBlbnRpdHlTZXRQYXRoOiBzdHJpbmcsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0bGV0IGlzTm90RmlsdGVyYWJsZSA9IGZhbHNlO1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uID0gbWV0YW1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNgKSBhc1xuXHRcdHwgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPlxuXHRcdHwgdW5kZWZpbmVkO1xuXHRpZiAoZmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj8uTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMpIHtcblx0XHRpc05vdEZpbHRlcmFibGUgPSBmaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQocHJvcGVydHkgYXMgdW5rbm93biBhcyBFeHBhbmRQYXRoVHlwZTxFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aD4pLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBjb250ZXh0UGF0aCB8fFxuXHRcdFx0XHRwcm9wZXJ0eS4kUHJvcGVydHlQYXRoID09PSBjb250ZXh0UGF0aFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gaXNOb3RGaWx0ZXJhYmxlO1xufVxuXG4vLyBJbnRlcm5hbCB1c2FnZSBvbmx5XG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21BZ2dyZWdhdGUobWV0YW1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIGVudGl0eVNldFBhdGg6IHN0cmluZywgY29udGV4dFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRsZXQgaW50ZXJhbmxJc0N1c3RvbUFnZ3JlZ2F0ZSA9IGZhbHNlO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXgvaW52YWxpZC13YXJuXG5cdGNvbnN0IGlzQXBwbHlTdXBwb3J0ZWQgPSBtZXRhbW9kZWxDb250ZXh0LmdldE9iamVjdChlbnRpdHlTZXRQYXRoICsgXCJAT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXHRpZiAoaXNBcHBseVN1cHBvcnRlZCkge1xuXHRcdGNvbnN0IGVudGl0eVNldEFubm90YXRpb25zID0gbWV0YW1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AYCkgYXMgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbjtcblx0XHRjb25zdCBjdXN0b21BZ2dyZWdhdGVzQW5ub3RhdGlvbnMgPSBNRVRBTU9ERUxfRlVOQ1RJT05TLmdldEFsbEN1c3RvbUFnZ3JlZ2F0ZXMoZW50aXR5U2V0QW5ub3RhdGlvbnMpIGFzIG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBjdXN0b21BZ2dyZWdhdGVzID0gY3VzdG9tQWdncmVnYXRlc0Fubm90YXRpb25zID8gT2JqZWN0LmtleXMoY3VzdG9tQWdncmVnYXRlc0Fubm90YXRpb25zKSA6IHVuZGVmaW5lZDtcblx0XHRpZiAoY3VzdG9tQWdncmVnYXRlcz8uaW5jbHVkZXMoY29udGV4dFBhdGgpKSB7XG5cdFx0XHRpbnRlcmFubElzQ3VzdG9tQWdncmVnYXRlID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVyYW5sSXNDdXN0b21BZ2dyZWdhdGU7XG59XG5cbi8vIEludGVybmFsIHVzYWdlIG9ubHlcblxuZnVuY3Rpb24gY2hlY2tFbnRpdHlTZXRJc0ZpbHRlcmFibGUoXG5cdGVudGl0eVNldFBhdGg6IHN0cmluZyxcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHByb3BlcnR5OiBzdHJpbmcsXG5cdG5hdmlnYXRpb25Db250ZXh0OiBDb250ZXh0IHwgbnVsbFxuKTogYm9vbGVhbiB7XG5cdGxldCBpc0ZpbHRlcmFibGUgPVxuXHRcdGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCA9PT0gMiAmJiAhcHJvcGVydHkuaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHQ/ICFpc0luTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMobWV0YU1vZGVsQ29udGV4dCwgZW50aXR5U2V0UGF0aCwgcHJvcGVydHkpXG5cdFx0XHQ6ICFpc0NvbnRleHRQYXRoRmlsdGVyYWJsZShtZXRhTW9kZWxDb250ZXh0LCBlbnRpdHlTZXRQYXRoLCBwcm9wZXJ0eSk7XG5cdC8vIGNoZWNrIGlmIHR5cGUgY2FuIGJlIHVzZWQgZm9yIGZpbHRlcmluZ1xuXHRpZiAoaXNGaWx0ZXJhYmxlICYmIG5hdmlnYXRpb25Db250ZXh0KSB7XG5cdFx0Y29uc3QgcHJvcGVydHlEYXRhVHlwZSA9IGdldFByb3BlcnR5RGF0YVR5cGUobmF2aWdhdGlvbkNvbnRleHQpO1xuXHRcdGlmIChwcm9wZXJ0eURhdGFUeXBlKSB7XG5cdFx0XHRpc0ZpbHRlcmFibGUgPSBwcm9wZXJ0eURhdGFUeXBlID8gaXNUeXBlRmlsdGVyYWJsZShwcm9wZXJ0eURhdGFUeXBlIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpIDogZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlzRmlsdGVyYWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaXNGaWx0ZXJhYmxlO1xufVxuXG4vLyBJbnRlcm5hbCB1c2FnZSBvbmx5XG5mdW5jdGlvbiBpc0NvbnRleHRQYXRoRmlsdGVyYWJsZShtZXRhTW9kZWxDb250ZXh0OiBPRGF0YU1ldGFNb2RlbCwgZW50aXR5U2V0UGF0aDogc3RyaW5nLCBjb250ZXh0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZ1bGxQYXRoID0gYCR7ZW50aXR5U2V0UGF0aH0vJHtjb250ZXh0UGF0aH1gLFxuXHRcdGVzUGFydHMgPSBmdWxsUGF0aC5zcGxpdChcIi9cIikuc3BsaWNlKDAsIDIpLFxuXHRcdGNvbnRleHRzID0gZnVsbFBhdGguc3BsaXQoXCIvXCIpLnNwbGljZSgyKTtcblx0bGV0IGlzTm9GaWx0ZXJhYmxlID0gZmFsc2UsXG5cdFx0Y29udGV4dCA9IFwiXCI7XG5cblx0ZW50aXR5U2V0UGF0aCA9IGVzUGFydHMuam9pbihcIi9cIik7XG5cblx0aXNOb0ZpbHRlcmFibGUgPSBjb250ZXh0cy5zb21lKGZ1bmN0aW9uIChpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGFycmF5OiBzdHJpbmdbXSkge1xuXHRcdGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnRleHQgKz0gYC8ke2l0ZW19YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGl0ZW07XG5cdFx0fVxuXHRcdGlmIChpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMikge1xuXHRcdFx0Ly8gSW4gY2FzZSBvZiBcIi9DdXN0b21lci9TZXQvUHJvcGVydHlcIiB0aGlzIGlzIHRvIGNoZWNrIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zIG9mIFwiQ3VzdG9tZXJcIiBmb3Igbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcyBpbiBcIlNldFwiXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKG1ldGFNb2RlbENvbnRleHQsIGVudGl0eVNldFBhdGgsIGl0ZW0pO1xuXHRcdFx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zID0gbmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRcdFx0Y29uc3Qgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBmaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3QgdGFyZ2V0UHJvcGVydHlQYXRoID0gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5maW5kKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlQYXRoLiRQcm9wZXJ0eVBhdGggPT09IHRhcmdldFByb3BlcnR5UGF0aDtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGluZGV4ID09PSBhcnJheS5sZW5ndGggLSAxKSB7XG5cdFx0XHQvL2xhc3QgcGF0aCBzZWdtZW50XG5cdFx0XHRpc05vRmlsdGVyYWJsZSA9IGlzSW5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyhtZXRhTW9kZWxDb250ZXh0LCBlbnRpdHlTZXRQYXRoLCBjb250ZXh0KTtcblx0XHR9IGVsc2UgaWYgKG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7aXRlbX1gKSkge1xuXHRcdFx0Ly9jaGVjayBleGlzdGluZyBjb250ZXh0IHBhdGggYW5kIGluaXRpYWxpemUgaXRcblx0XHRcdGlzTm9GaWx0ZXJhYmxlID0gaXNJbk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKG1ldGFNb2RlbENvbnRleHQsIGVudGl0eVNldFBhdGgsIGNvbnRleHQpO1xuXHRcdFx0Y29udGV4dCA9IFwiXCI7XG5cdFx0XHQvL3NldCB0aGUgbmV3IEVudGl0eVNldFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IFwiL1wiICsgbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtpdGVtfWApO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNOb0ZpbHRlcmFibGU7XG5cdH0pO1xuXHRyZXR1cm4gaXNOb0ZpbHRlcmFibGU7XG59XG5cbi8vIEludGVybmFsIHVzYWdlIG9ubHlcblxuZnVuY3Rpb24gZ2V0UHJvcGVydHlEYXRhVHlwZShuYXZpZ2F0aW9uQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBkYXRhVHlwZSA9IG5hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiJFR5cGVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHQvLyBpZiAka2luZCBleGlzdHMsIGl0J3Mgbm90IGEgRGF0YUZpZWxkIGFuZCB3ZSBoYXZlIHRoZSBmaW5hbCB0eXBlIGFscmVhZHlcblx0aWYgKCFuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIiRraW5kXCIpKSB7XG5cdFx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0XHRkYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIjpcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcIjpcblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoVXJsXCI6XG5cdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhBY3Rpb25cIjpcblx0XHRcdFx0ZGF0YVR5cGUgPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlZhbHVlLyRQYXRoLyRUeXBlXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG5hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiVGFyZ2V0LyRBbm5vdGF0aW9uUGF0aFwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0XHRcdGlmIChhbm5vdGF0aW9uUGF0aC5pbmNsdWRlcyhcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFwiKSkge1xuXHRcdFx0XHRcdFx0ZGF0YVR5cGUgPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIlRhcmdldC8kQW5ub3RhdGlvblBhdGgvZm4vJFBhdGgvJFR5cGVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvblBhdGguaW5jbHVkZXMoXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikpIHtcblx0XHRcdFx0XHRcdGRhdGFUeXBlID0gbmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJWYWx1ZS8kUGF0aC8kVHlwZVwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGUuZy4gRmllbGRHcm91cCBvciBDaGFydFxuXHRcdFx0XHRcdFx0ZGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBkYXRhVHlwZTtcbn1cblxuLy8gRnJvbSBDb21tb25VdGlscywgQ29tbW9uSGVscGVyLCBGaWx0ZXJCYXJEZWxlZ2F0ZSwgRmlsdGVyRmllbGQsIFZhbHVlTGlzdEhlbHBlciwgVGFibGVEZWxlZ2F0ZVxuLy8gVE9ETyBjaGVjayB1c2VkIHBsYWNlcyBhbmQgcmV3b3JrIHRoaXNcbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5RmlsdGVyYWJsZShcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdGVudGl0eVNldFBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IHN0cmluZyxcblx0c2tpcEhpZGRlbkZpbHRlcnM/OiBib29sZWFuXG4pOiBib29sZWFuIHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRpZiAodHlwZW9mIHByb3BlcnR5ICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwic1Byb3BlcnR5IHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuXHR9XG5cblx0Ly8gUGFyYW1ldGVycyBzaG91bGQgYmUgcmVuZGVyZWQgYXMgZmlsdGVyZmllbGRzXG5cdGlmIChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29uc3QgbmF2aWdhdGlvbkNvbnRleHQgPSBtZXRhTW9kZWxDb250ZXh0LmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2VudGl0eVNldFBhdGh9LyR7cHJvcGVydHl9YCk7XG5cblx0aWYgKG5hdmlnYXRpb25Db250ZXh0ICYmICFza2lwSGlkZGVuRmlsdGVycykge1xuXHRcdGlmIChcblx0XHRcdG5hdmlnYXRpb25Db250ZXh0LmdldFByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiKSA9PT0gdHJ1ZSB8fFxuXHRcdFx0bmF2aWdhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyXCIpID09PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGhpZGRlblBhdGggPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW4vJFBhdGhcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGhpZGRlbkZpbHRlclBhdGggPSBuYXZpZ2F0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5GaWx0ZXIvJFBhdGhcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGhpZGRlblBhdGggJiYgaGlkZGVuRmlsdGVyUGF0aCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChvcihwYXRoSW5Nb2RlbChoaWRkZW5QYXRoKSwgcGF0aEluTW9kZWwoaGlkZGVuRmlsdGVyUGF0aCkpKSk7XG5cdFx0fSBlbHNlIGlmIChoaWRkZW5QYXRoKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KHBhdGhJbk1vZGVsKGhpZGRlblBhdGgpKSk7XG5cdFx0fSBlbHNlIGlmIChoaWRkZW5GaWx0ZXJQYXRoKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KHBhdGhJbk1vZGVsKGhpZGRlbkZpbHRlclBhdGgpKSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBjaGVja0VudGl0eVNldElzRmlsdGVyYWJsZShlbnRpdHlTZXRQYXRoLCBtZXRhTW9kZWxDb250ZXh0LCBwcm9wZXJ0eSwgbmF2aWdhdGlvbkNvbnRleHQpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBlbnRpdHkgcHJvcGVydGllcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByZXF1aXJlZCwgbm9uLWNvbXB1dGVkIGtleSBhbmQgaW1tdXRhYmxlIGZpZWxkcy5cbiAqIEBwYXJhbSBtZXRhTW9kZWwgTWV0YW1vZGVsXG4gKiBAcGFyYW0gcGF0aCBFbnRpdHlzZXQgUGF0aFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBBcHAgQ29tcG9uZW50XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiByZXF1aXJlZCwgbm9uLWNvbXB1dGVkIGtleSBhbmQgaW1tdXRhYmxlIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlUG9wdXBGaWVsZHMobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcGF0aDogc3RyaW5nLCBhcHBDb21wb25lbnQ/OiBBcHBDb21wb25lbnQpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGRhdGFNb2RlbCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0Q29udGV4dChwYXRoKSk7XG5cdGNvbnN0IG5vbkNvbXB1dGVkVmlzaWJsZUtleXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGltbXV0YWJsZVZpc2libGVGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHZpc2liaWxlUmVxdWlyZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHQvL1dlIGZpcnN0IHByb2Nlc3MgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXNcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHBhdGgsIG1ldGFNb2RlbCk7XG5cdGNvbnN0IGVudGl0eVByb3BlcnRpZXMgPSBkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHRmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5UHJvcGVydGllcykge1xuXHRcdGNvbnN0IGFubm90YXRpb25zID0gcHJvcC5hbm5vdGF0aW9ucyxcblx0XHRcdGlzS2V5ID0gcHJvcC5pc0tleSxcblx0XHRcdHByb3BOYW1lID0gcHJvcC5uYW1lLFxuXHRcdFx0aXNJbW11dGFibGUgPSBhbm5vdGF0aW9ucy5Db3JlPy5JbW11dGFibGU/LnZhbHVlT2YoKSA9PT0gdHJ1ZSxcblx0XHRcdGlzTm9uQ29tcHV0ZWQgPSAhKGFubm90YXRpb25zLkNvcmU/LkNvbXB1dGVkPy52YWx1ZU9mKCkgPT09IHRydWUpLFxuXHRcdFx0aXNWaXNpYmxlID0gIShhbm5vdGF0aW9ucy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpLFxuXHRcdFx0aXNDb21wdXRlZERlZmF1bHRWYWx1ZSA9IGFubm90YXRpb25zLkNvcmU/LkNvbXB1dGVkRGVmYXVsdFZhbHVlPy52YWx1ZU9mKCkgPT09IHRydWUsXG5cdFx0XHRpc05vbkdVSURLZXkgPSBpc0tleSAmJiBwcm9wLnR5cGUgIT09IFwiRWRtLkd1aWRcIixcblx0XHRcdGlzR1VJREtleVdpdGhUZXh0ID0gaXNLZXkgJiYgcHJvcC50eXBlID09PSBcIkVkbS5HdWlkXCIgPyAhIWFubm90YXRpb25zLkNvbW1vbj8uVGV4dCA6IGZhbHNlO1xuXG5cdFx0Ly8gSWYgaXQncyBjb21wdXRlZCB3ZSBkb24ndCBzaG93IGl0XG5cdFx0Ly8gaWYgaXQncyBpbW11dGFibGUgd2Ugc2hvdyBpdCBpZiBpdCdzIHZpc2libGVcblx0XHQvLyBJZiBpdCdzIGEga2V5IHdpdGggdHlwZSBndWlkIEFORCBDb21wdXRlZERlZmF1bHRWYWx1ZSBhbmQgVGV4dCBhbm5vdGF0aW9uIHdlIHNob3cgaXRcblx0XHQvLyBTdGVhbXB1bmsgY2FzZSA6IFdlIGhhdmUgYSBrZXkgb2YgdHlwZSBHdWlkIHdpdGggVGV4dCBidXQgbm90IHdpdGggQ29tcHV0ZWREZWZhdWx0IC0+IFdlIG5lZWQgdG8gc2hvdyB0aGVtXG5cdFx0Ly8gQ0FQIGNhc2UgOiBXZSBoYXZlIGtleXMgb2YgdHlwZSBHdWlkIHdpdGggbm8gVGV4dCBidXQgd2l0aCBDb21wdXRlZERlZmF1bFZhbHVlIC0+IFdlIGRvbid0IHNob3cgdGhlbVxuXHRcdC8vIE90aGVyIGNhc2UgOiBHVUlEIEtleSwgd2l0aCBubyB0ZXh0IGFuZCBubyBDb21wdXRlZERlZmF1bHRWYWx1ZSAtPiBXZSBzaG91bGQgc2hvdyB0aGVtIGZyb20gdGhlIE9EYXRhIHNwZWMgYnV0IG5vdCBmcm9tIGZpb3JpIGd1aWRlbGluZXNcblxuXHRcdGlmICgoaXNOb25HVUlES2V5IHx8IGlzR1VJREtleVdpdGhUZXh0KSAmJiBpc05vbkNvbXB1dGVkICYmIGlzVmlzaWJsZSkge1xuXHRcdFx0bm9uQ29tcHV0ZWRWaXNpYmxlS2V5cy5wdXNoKHByb3BOYW1lKTtcblx0XHR9IGVsc2UgaWYgKHJlcXVpcmVkUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wTmFtZSkgJiYgaXNWaXNpYmxlICYmICEoaXNLZXkgJiYgIW5vbkNvbXB1dGVkVmlzaWJsZUtleXMuaW5jbHVkZXMocHJvcE5hbWUpKSkge1xuXHRcdFx0dmlzaWJpbGVSZXF1aXJlZFByb3BlcnRpZXMucHVzaChwcm9wTmFtZSk7XG5cdFx0fSBlbHNlIGlmIChpc0ltbXV0YWJsZSAmJiBpc05vbkNvbXB1dGVkICYmIGlzVmlzaWJsZSkge1xuXHRcdFx0aW1tdXRhYmxlVmlzaWJsZUZpZWxkcy5wdXNoKHByb3BOYW1lKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzTm9uQ29tcHV0ZWQgJiYgaXNDb21wdXRlZERlZmF1bHRWYWx1ZSAmJiBhcHBDb21wb25lbnQpIHtcblx0XHRcdGNvbnN0IGRpYWdub3N0aWNzID0gYXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCk7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gXCJDb3JlLkNvbXB1dGVkRGVmYXVsdFZhbHVlIGlzIGlnbm9yZWQgYXMgQ29yZS5Db21wdXRlZCBpcyBhbHJlYWR5IHNldCB0byB0cnVlXCI7XG5cdFx0XHRkaWFnbm9zdGljcy5hZGRJc3N1ZShcblx0XHRcdFx0SXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRJc3N1ZVNldmVyaXR5Lk1lZGl1bSxcblx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUsXG5cdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLkFubm90YXRpb25zLklnbm9yZWRBbm5vdGF0aW9uXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHQvL1RoZSBvcmRlciBvZiBmaWVsZHMgd2lsbCBiZSBub24gY29tcHV0ZWQga2V5IGZpZWxkcywgcmVxdWlyZWQgcHJvcGVydGllcyBhbmQgdGhlbiBub24gY29tcHV0ZWQgaW1tdXRhYmxlIGZpZWxkcy5cblx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUtleXMuY29uY2F0KHZpc2liaWxlUmVxdWlyZWRQcm9wZXJ0aWVzKS5jb25jYXQoaW1tdXRhYmxlVmlzaWJsZUZpZWxkcyk7XG59XG4vLyBJbnRlcm5hbCBvbmx5LCBleHBvc2VkIGZvciB0ZXN0c1xuZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKHBhdGg6IHN0cmluZywgbWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zID0gZmFsc2UpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHJlcXVpcmVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0bGV0IHJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10gPSBbXTtcblx0Y29uc3QgbmF2aWdhdGlvblRleHQgPSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdGxldCBlbnRpdHlTZXRBbm5vdGF0aW9uOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cdGlmIChwYXRoLmVuZHNXaXRoKFwiJFwiKSkge1xuXHRcdC8vIGlmIHNQYXRoIGNvbWVzIHdpdGggYSAkIGluIHRoZSBlbmQsIHJlbW92aW5nIGl0IGFzIGl0IGlzIG9mIG5vIHNpZ25pZmljYW5jZVxuXHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoXCIvJFwiLCBcIlwiKTtcblx0fVxuXHRjb25zdCBlbnRpdHlUeXBlUGF0aFBhcnRzID0gcGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKS5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgocGF0aCwgbWV0YU1vZGVsQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGhQYXJ0cyA9IGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGlzQ29udGFpbm1lbnQgPSBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0vJENvbnRhaW5zVGFyZ2V0YCkgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGNvbnRhaW5tZW50TmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBlbnRpdHlUeXBlUGF0aFBhcnRzW2VudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoIC0gMV0gOiBcIlwiO1xuXG5cdC8vUmVzdHJpY3Rpb25zIGRpcmVjdGx5IGF0IEVudGl0eSBTZXRcblx0Ly9lLmcuIEZSIGluIFwiTlMuRW50aXR5Q29udGFpbmVyL1NhbGVzT3JkZXJNYW5hZ2VcIiBDb250ZXh0UGF0aDogL1NhbGVzT3JkZXJNYW5hZ2Vcblx0aWYgKCFpc0NvbnRhaW5tZW50KSB7XG5cdFx0ZW50aXR5U2V0QW5ub3RhdGlvbiA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9QGApIGFzIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb247XG5cdH1cblx0aWYgKGVudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdGNvbnN0IG5hdlBhdGggPSBpc0NvbnRhaW5tZW50ID8gY29udGFpbm1lbnROYXZQYXRoIDogZW50aXR5U2V0UGF0aFBhcnRzW2VudGl0eVNldFBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblx0XHRjb25zdCBqb2luVGV4dCA9IGAvJHtuYXZpZ2F0aW9uVGV4dH0vYDtcblx0XHRjb25zdCBwYXJlbnRFbnRpdHlTZXRQYXRoID0gaXNDb250YWlubWVudCA/IGVudGl0eVNldFBhdGggOiBgLyR7ZW50aXR5U2V0UGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKGpvaW5UZXh0KX1gO1xuXHRcdC8vTmF2aWdhdGlvbiByZXN0cmljdGlvbnNcblx0XHQvL2UuZy4gUGFyZW50IFwiL0N1c3RvbWVyXCIgd2l0aCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoPVwiU2V0XCIgQ29udGV4dFBhdGg6IEN1c3RvbWVyL1NldFxuXHRcdGNvbnN0IG5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBNRVRBTU9ERUxfRlVOQ1RJT05TLmdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdFx0XHRtZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0cGFyZW50RW50aXR5U2V0UGF0aCxcblx0XHRcdG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIilcblx0XHQpO1xuXG5cdFx0aWYgKFxuXHRcdFx0bmF2aWdhdGlvblJlc3RyaWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRNRVRBTU9ERUxfRlVOQ1RJT05TLmhhc1Jlc3RyaWN0ZWRQcm9wZXJ0aWVzSW5Bbm5vdGF0aW9ucyhuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLCB0cnVlLCBjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucylcblx0XHQpIHtcblx0XHRcdHJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoID0gY2hlY2tVcGRhdGVSZXN0cmljdGlvbnNcblx0XHRcdFx0PyBuYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLlVwZGF0ZVJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzID8/IFtdXG5cdFx0XHRcdDogbmF2aWdhdGlvblJlc3RyaWN0aW9ucy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcyA/PyBbXTtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0IXJlcXVpcmVkUHJvcGVydGllc1dpdGhQYXRoLmxlbmd0aCAmJlxuXHRcdFx0TUVUQU1PREVMX0ZVTkNUSU9OUy5oYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMoZW50aXR5U2V0QW5ub3RhdGlvbiwgZmFsc2UsIGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zKVxuXHRcdCkge1xuXHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzV2l0aFBhdGggPSBNRVRBTU9ERUxfRlVOQ1RJT05TLmdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyhcblx0XHRcdFx0ZW50aXR5U2V0QW5ub3RhdGlvbixcblx0XHRcdFx0Y2hlY2tVcGRhdGVSZXN0cmljdGlvbnNcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKE1FVEFNT0RFTF9GVU5DVElPTlMuaGFzUmVzdHJpY3RlZFByb3BlcnRpZXNJbkFubm90YXRpb25zKGVudGl0eVNldEFubm90YXRpb24sIGZhbHNlLCBjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucykpIHtcblx0XHRyZXF1aXJlZFByb3BlcnRpZXNXaXRoUGF0aCA9IE1FVEFNT0RFTF9GVU5DVElPTlMuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zKGVudGl0eVNldEFubm90YXRpb24sIGNoZWNrVXBkYXRlUmVzdHJpY3Rpb25zKTtcblx0fVxuXHRyZXF1aXJlZFByb3BlcnRpZXNXaXRoUGF0aC5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gcmVxdWlyZWRQcm9wZXJ0eS4kUHJvcGVydHlQYXRoO1xuXHRcdHJlcXVpcmVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5UGF0aCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVxdWlyZWRQcm9wZXJ0aWVzO1xufVxuXG4vLyBUcmFuc2FjdGlvbkhlbHBlciAvLyBJbnRlcm5hbEZpZWxkXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyhwYXRoOiBzdHJpbmcsIG1ldGFtb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nW10ge1xuXHRyZXR1cm4gTUVUQU1PREVMX0ZVTkNUSU9OUy5nZXRSZXF1aXJlZFByb3BlcnRpZXMocGF0aCwgbWV0YW1vZGVsQ29udGV4dCk7XG59XG5cbi8vIEludGVybmFsRmllbGRcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zKHBhdGg6IHN0cmluZywgbWV0YW1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmdbXSB7XG5cdHJldHVybiBNRVRBTU9ERUxfRlVOQ1RJT05TLmdldFJlcXVpcmVkUHJvcGVydGllcyhwYXRoLCBtZXRhbW9kZWxDb250ZXh0LCB0cnVlKTtcbn1cblxuLy8gSW50ZXJuYWwgb25seSwgZXhwb3NlZCBmb3IgdGVzdHNcbmZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21Bbm5vdGF0aW9ucyhcblx0YW5ub3RhdGlvbnM6IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfCBudWxsLFxuXHRjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyA9IGZhbHNlXG4pOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10ge1xuXHRpZiAoY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbnM/LltcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9uc1wiXT8uUmVxdWlyZWRQcm9wZXJ0aWVzID8/IFtdO1xuXHR9XG5cdHJldHVybiBhbm5vdGF0aW9ucz8uW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zXCJdPy5SZXF1aXJlZFByb3BlcnRpZXMgPz8gW107XG59XG5cbi8vIEludGVybmFsIG9ubHksIGV4cG9zZWQgZm9yIHRlc3RzXG5mdW5jdGlvbiBoYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMoXG5cdGFubm90YXRpb25zOiBNZXRhTW9kZWxUeXBlPE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXM+IHwgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbiB8IG51bGwsXG5cdGlzTmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGZhbHNlLFxuXHRjaGVja1VwZGF0ZVJlc3RyaWN0aW9ucyA9IGZhbHNlXG4pOiBib29sZWFuIHtcblx0aWYgKGlzTmF2aWdhdGlvblJlc3RyaWN0aW9ucykge1xuXHRcdGNvbnN0IG5hdkFubm90YXRpb25zID0gYW5ub3RhdGlvbnMgYXMgTWV0YU1vZGVsVHlwZTxOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzPiB8IHVuZGVmaW5lZDtcblx0XHRpZiAoY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRcdHJldHVybiBuYXZBbm5vdGF0aW9ucz8uVXBkYXRlUmVzdHJpY3Rpb25zPy5SZXF1aXJlZFByb3BlcnRpZXMgPyB0cnVlIDogZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBuYXZBbm5vdGF0aW9ucz8uSW5zZXJ0UmVzdHJpY3Rpb25zPy5SZXF1aXJlZFByb3BlcnRpZXMgPyB0cnVlIDogZmFsc2U7XG5cdH0gZWxzZSBpZiAoY2hlY2tVcGRhdGVSZXN0cmljdGlvbnMpIHtcblx0XHRjb25zdCBlbnRpdHlBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zIGFzIE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIGVudGl0eUFubm90YXRpb25zPy5bXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNcIl0/LlJlcXVpcmVkUHJvcGVydGllcyA/IHRydWUgOiBmYWxzZTtcblx0fVxuXHRjb25zdCBlbnRpdHl0U2V0QW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyBhcyBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uIHwgdW5kZWZpbmVkO1xuXHRyZXR1cm4gZW50aXR5dFNldEFubm90YXRpb25zPy5bXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNcIl0/LlJlcXVpcmVkUHJvcGVydGllcyA/IHRydWUgOiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgQ3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbiA9IHtcblx0Y29udGV4dERlZmluaW5nUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRsYWJlbD86IHN0cmluZztcblx0bmFtZT86IHN0cmluZztcblx0cHJvcGVydHlQYXRoPzogc3RyaW5nO1xuXHRzb3J0YWJsZT86IGJvb2xlYW47XG5cdHNvcnRPcmRlcj86IHN0cmluZztcblx0Y3VzdG9tPzogYm9vbGVhbjtcbn07XG5cbi8vIFVzZWQgaW4gdGhpcyBmaWxlIGFuZCBGaWx0ZXJVdGlsc1xuLyoqXG4gKiBSZXR1cm5zIGN1c3RvbSBhZ2dyZWdhdGVzIGZvciBhIGdpdmVuIGVudGl0eVNldC5cbiAqIEBwYXJhbSBhbm5vdGF0aW9ucyBBIGxpc3Qgb2YgYW5ub3RhdGlvbnMgb2YgdGhlIGVudGl0eSBzZXRcbiAqIEByZXR1cm5zIEEgbWFwIHRvIHRoZSBjdXN0b20gYWdncmVnYXRlcyBrZXllZCBieSB0aGVpciBxdWFsaWZpZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDdXN0b21BZ2dyZWdhdGVzKGFubm90YXRpb25zOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbj4ge1xuXHRjb25zdCBjdXN0b21BZ2dyZWdhdGVzOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9uPiA9IHt9O1xuXHRsZXQgYW5ub3RhdGlvbjtcblx0Zm9yIChjb25zdCBhbm5vdGF0aW9uS2V5IGluIGFubm90YXRpb25zKSB7XG5cdFx0aWYgKGFubm90YXRpb25LZXkuc3RhcnRzV2l0aChcIkBPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQ3VzdG9tQWdncmVnYXRlXCIpKSB7XG5cdFx0XHRhbm5vdGF0aW9uID0gYW5ub3RhdGlvbktleS5yZXBsYWNlKFwiQE9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5DdXN0b21BZ2dyZWdhdGUjXCIsIFwiXCIpO1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhcnRzID0gYW5ub3RhdGlvbi5zcGxpdChcIkBcIik7XG5cblx0XHRcdGlmIChhbm5vdGF0aW9uUGFydHMubGVuZ3RoID09IDIpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tQWdncmVnYXRlOiBDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9uID0ge307XG5cdFx0XHRcdC8vaW5uZXIgYW5ub3RhdGlvbiB0aGF0IGlzIG5vdCBwYXJ0IG9mIFx0VmFsaWRhdGlvbi5BZ2dyZWdhdGFibGVUZXJtc1xuXHRcdFx0XHRpZiAoYW5ub3RhdGlvblBhcnRzWzFdID09IFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcIikge1xuXHRcdFx0XHRcdGN1c3RvbUFnZ3JlZ2F0ZS5jb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbktleV0gYXMgc3RyaW5nW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYW5ub3RhdGlvblBhcnRzWzFdID09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCIpIHtcblx0XHRcdFx0XHRjdXN0b21BZ2dyZWdhdGUubGFiZWwgPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uS2V5XSBhcyBzdHJpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VzdG9tQWdncmVnYXRlc1thbm5vdGF0aW9uUGFydHNbMF1dID0gY3VzdG9tQWdncmVnYXRlO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uUGFydHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0Y3VzdG9tQWdncmVnYXRlc1thbm5vdGF0aW9uUGFydHNbMF1dID0ge1xuXHRcdFx0XHRcdG5hbWU6IGFubm90YXRpb25QYXJ0c1swXSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IGFubm90YXRpb25QYXJ0c1swXSxcblx0XHRcdFx0XHRsYWJlbDogYEN1c3RvbSBBZ2dyZWdhdGUgKCR7YW5ub3RhdGlvbn0pYCxcblx0XHRcdFx0XHRzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzb3J0T3JkZXI6IFwiYm90aFwiLFxuXHRcdFx0XHRcdGN1c3RvbTogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXN0b21BZ2dyZWdhdGVzO1xufVxuXG4vLyBVc2VkIGluIFZhbHVlTGlzdEhlbHBlciwgQ2hhcnREZWxlZ2F0ZSBhbmQgVmFsdWVIZWxwLVRhYmxlRGVsZWdhdGVcbmV4cG9ydCB0eXBlIFNvcnRSZXN0cmljdGlvbnNQcm9wZXJ0eUluZm9UeXBlID0ge1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0c29ydERpcmVjdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNvcnRSZXN0cmljdGlvbnNJbmZvVHlwZSA9IHtcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdHByb3BlcnR5SW5mbzogUmVjb3JkPHN0cmluZywgU29ydFJlc3RyaWN0aW9uc1Byb3BlcnR5SW5mb1R5cGU+O1xufTtcbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgc29ydGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXN0cmljdGlvbiBhbm5vdGF0aW9uLlxuICogQHBhcmFtIGVudGl0eVNldEFubm90YXRpb25zIEVudGl0eVNldCBvciBjb2xsZWN0aW9uIGFubm90YXRpb25zIHdpdGggdGhlIHNvcnQgcmVzdHJpY3Rpb25zIGFubm90YXRpb25cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzb3J0IHJlc3RyaWN0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3J0UmVzdHJpY3Rpb25zSW5mbyhlbnRpdHlTZXRBbm5vdGF0aW9uczogTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbik6IFNvcnRSZXN0cmljdGlvbnNJbmZvVHlwZSB7XG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNJbmZvOiBTb3J0UmVzdHJpY3Rpb25zSW5mb1R5cGUgPSB7XG5cdFx0c29ydGFibGU6IHRydWUsXG5cdFx0cHJvcGVydHlJbmZvOiB7fVxuXHR9O1xuXG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnMgPSBlbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNvcnRSZXN0cmljdGlvbnNcIl07XG5cblx0aWYgKCFzb3J0UmVzdHJpY3Rpb25zKSB7XG5cdFx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNJbmZvO1xuXHR9XG5cblx0aWYgKHNvcnRSZXN0cmljdGlvbnMuU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0c29ydFJlc3RyaWN0aW9uc0luZm8uc29ydGFibGUgPSBmYWxzZTtcblx0fVxuXG5cdGZvciAoY29uc3QgcHJvcGVydHlJdGVtIG9mIHNvcnRSZXN0cmljdGlvbnMuTm9uU29ydGFibGVQcm9wZXJ0aWVzIHx8IFtdKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJdGVtLiRQcm9wZXJ0eVBhdGg7XG5cdFx0c29ydFJlc3RyaWN0aW9uc0luZm8ucHJvcGVydHlJbmZvW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRzb3J0YWJsZTogZmFsc2Vcblx0XHR9O1xuXHR9XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eUl0ZW0gb2Ygc29ydFJlc3RyaWN0aW9ucy5Bc2NlbmRpbmdPbmx5UHJvcGVydGllcyB8fCBbXSkge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SXRlbS4kUHJvcGVydHlQYXRoO1xuXHRcdHNvcnRSZXN0cmljdGlvbnNJbmZvLnByb3BlcnR5SW5mb1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0c29ydGFibGU6IHRydWUsXG5cdFx0XHRzb3J0RGlyZWN0aW9uOiBcImFzY1wiIC8vIG5vdCB1c2VkLCB5ZXRcblx0XHR9O1xuXHR9XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eUl0ZW0gb2Ygc29ydFJlc3RyaWN0aW9ucy5EZXNjZW5kaW5nT25seVByb3BlcnRpZXMgfHwgW10pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUl0ZW0uJFByb3BlcnR5UGF0aDtcblx0XHRzb3J0UmVzdHJpY3Rpb25zSW5mby5wcm9wZXJ0eUluZm9bcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdHNvcnRhYmxlOiB0cnVlLFxuXHRcdFx0c29ydERpcmVjdGlvbjogXCJkZXNjXCIgLy8gbm90IHVzZWQsIHlldFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gc29ydFJlc3RyaWN0aW9uc0luZm87XG59XG5cbi8vIFVzZWQgaW4gQ2hhcnREZWxlZ2F0ZSBhbmQgVmFsdWVIZWxwLVRhYmxlRGVsZWdhdGVcbmV4cG9ydCB0eXBlIEZpbHRlclJlc3RyaWN0aW9uc1Byb3BlcnR5SW5mb1R5cGUgPSB7XG5cdGZpbHRlcmFibGU6IGJvb2xlYW47XG5cdGFsbG93ZWRFeHByZXNzaW9ucz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsdGVyUmVzdHJpY3Rpb25zSW5mb1R5cGUgPSB7XG5cdGZpbHRlcmFibGU6IGJvb2xlYW47XG5cdHJlcXVpcmVzRmlsdGVyOiBib29sZWFuO1xuXHRwcm9wZXJ0eUluZm86IFJlY29yZDxzdHJpbmcsIEZpbHRlclJlc3RyaWN0aW9uc1Byb3BlcnR5SW5mb1R5cGU+O1xuXHRyZXF1aXJlZFByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZmlsdGVyIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGFubm9hdGlvbi5cbiAqIEBwYXJhbSBmaWx0ZXJSZXN0cmljdGlvbnMgVGhlIGZpbHRlciByZXN0cmljdGlvbnMgYW5ub3RhdGlvblxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbHRlciByZXN0cmljdGlvbiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zSW5mbyhmaWx0ZXJSZXN0cmljdGlvbnM/OiBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+KTogRmlsdGVyUmVzdHJpY3Rpb25zSW5mb1R5cGUge1xuXHRsZXQgaSwgcHJvcGVydHlOYW1lO1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNJbmZvOiBGaWx0ZXJSZXN0cmljdGlvbnNJbmZvVHlwZSA9IHtcblx0XHRmaWx0ZXJhYmxlOiB0cnVlLFxuXHRcdHJlcXVpcmVzRmlsdGVyOiBmaWx0ZXJSZXN0cmljdGlvbnM/LlJlcXVpcmVzRmlsdGVyIHx8IGZhbHNlLFxuXHRcdHByb3BlcnR5SW5mbzoge30sXG5cdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBbXVxuXHR9O1xuXG5cdGlmICghZmlsdGVyUmVzdHJpY3Rpb25zKSB7XG5cdFx0cmV0dXJuIGZpbHRlclJlc3RyaWN0aW9uc0luZm87XG5cdH1cblxuXHRpZiAoZmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG5cdFx0ZmlsdGVyUmVzdHJpY3Rpb25zSW5mby5maWx0ZXJhYmxlID0gZmFsc2U7XG5cdH1cblxuXHQvL0hpZXJhcmNoaWNhbCBDYXNlXG5cdGlmIChmaWx0ZXJSZXN0cmljdGlvbnMuUmVxdWlyZWRQcm9wZXJ0aWVzKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGZpbHRlclJlc3RyaWN0aW9ucy5SZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGZpbHRlclJlc3RyaWN0aW9ucy5SZXF1aXJlZFByb3BlcnRpZXNbaV0uJFByb3BlcnR5UGF0aDtcblx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0luZm8ucmVxdWlyZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBub25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IGZpbHRlclJlc3RyaWN0aW9ucy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKChwcm9wKSA9PiBwcm9wLiRQcm9wZXJ0eVBhdGgpIHx8IFtdO1xuXHRjb25zdCBmaWx0ZXJhYmxlUHJvcGVydGllcyA9IGZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zPy5tYXAoKHByb3ApID0+IHByb3AuUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGgpIHx8IFtdO1xuXHRnZXRGaWx0ZXJhYmxlRGF0YShmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLnByb3BlcnR5SW5mbywgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXMsIGZpbHRlcmFibGVQcm9wZXJ0aWVzKTtcblxuXHRpZiAoZmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMpIHtcblx0XHQvL1RCRFxuXHRcdGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0cHJvcGVydHlOYW1lID0gZmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnNbaV0uUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0luZm8ucHJvcGVydHlJbmZvW3Byb3BlcnR5TmFtZV1bXCJhbGxvd2VkRXhwcmVzc2lvbnNcIl0gPSBmaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uc1tpXVxuXHRcdFx0XHRcdC5BbGxvd2VkRXhwcmVzc2lvbnMgYXMgdW5rbm93biBhcyBzdHJpbmdbXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zSW5mbztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBvYmogdG8gaGF2ZSBsaXN0IG9mIHByb3BlcnRpZXMgd2hpY2ggY2FuIGJlIGZpbHRlcmVkIG9yIG5vdC5cbiAqIEBwYXJhbSBmaWx0ZXJEYXRhT2JqXG4gKiBAcGFyYW0gbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcbiAqIEBwYXJhbSBmaWx0ZXJhYmxlUHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyYWJsZURhdGEoXG5cdGZpbHRlckRhdGFPYmo6IFJlY29yZDxzdHJpbmcsIEZpbHRlclJlc3RyaWN0aW9uc1Byb3BlcnR5SW5mb1R5cGU+LFxuXHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW10sXG5cdGZpbHRlcmFibGVQcm9wZXJ0aWVzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXG4pOiB2b2lkIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBub25GaWx0ZXJhYmxlUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdGZpbHRlckRhdGFPYmpbbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNbaV1dID0ge1xuXHRcdFx0ZmlsdGVyYWJsZTogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyYWJsZVByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBwcm9wTmFtZSA9IGZpbHRlcmFibGVQcm9wZXJ0aWVzW2ldO1xuXHRcdGlmIChwcm9wTmFtZSkge1xuXHRcdFx0ZmlsdGVyRGF0YU9ialtwcm9wTmFtZV0gPSB7XG5cdFx0XHRcdGZpbHRlcmFibGU6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbi8vIFVzZWQgaW4gQ2hhcnREZWxlZ2F0ZSBhbmQgVmFsdWVIZWxwLVRhYmxlRGVsZWdhdGVcbi8qKlxuICogUHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIGlmIHRoZSBGaWx0ZXJFeHByZXNzaW9uIGlzIGEgbXVsdGlWYWx1ZSBGaWx0ZXIgRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBmaWx0ZXJFeHByZXNzaW9uIFRoZSBGaWx0ZXJFeHByZXNzaW9uVHlwZVxuICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlIHdldGhlciBpdCBpcyBhIG11bHRpVmFsdWUgRmlsdGVyIEV4cHJlc3Npb24gb3Igbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpVmFsdWVGaWx0ZXJFeHByZXNzaW9uKGZpbHRlckV4cHJlc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRsZXQgaXNNdWx0aVZhbHVlID0gdHJ1ZTtcblxuXHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdHN3aXRjaCAoZmlsdGVyRXhwcmVzc2lvbikge1xuXHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRpc011bHRpVmFsdWUgPSBmYWxzZTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiBpc011bHRpVmFsdWU7XG59XG5cbi8vIERPIE5PVCBVU0UsIG9ubHkgZm9yIHRlc3RzIGFuZCBpbnRlcm5hbGx5IGluIHRoaXMgZmlsZVxuZXhwb3J0IGNvbnN0IE1FVEFNT0RFTF9GVU5DVElPTlMgPSB7XG5cdGdldFJlcXVpcmVkUHJvcGVydGllcyxcblx0Z2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUFubm90YXRpb25zLFxuXHRoYXNSZXN0cmljdGVkUHJvcGVydGllc0luQW5ub3RhdGlvbnMsXG5cdGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMsXG5cdGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMsXG5cdGdldEFsbEN1c3RvbUFnZ3JlZ2F0ZXMsXG5cdGdldEZpbHRlcmFibGVEYXRhXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztFQUFBO0VBQ0E7RUFxQkE7RUFDTyxTQUFTQSxxQkFBcUJBLENBQUNDLFFBQWdCLEVBQUVDLFNBQXlCLEVBQXFEO0lBQ3JJLElBQUlDLGtCQUFrQjtJQUN0QixJQUFJQyw0QkFBNEI7SUFDaEMsTUFBTUMsY0FBYyxHQUFHLDRCQUE0QjtJQUNuRCxNQUFNQyxzQkFBc0IsR0FBRywrQ0FBK0M7SUFDOUUsTUFBTUMsbUJBQW1CLEdBQUdOLFFBQVEsQ0FBQ08sVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDQyxNQUFNLENBQUNDLFdBQVcsQ0FBQ0MsdUJBQXVCLENBQUM7SUFDbEgsTUFBTUMsYUFBYSxHQUFHRixXQUFXLENBQUNHLGdCQUFnQixDQUFDYixRQUFRLEVBQUVDLFNBQVMsQ0FBQztJQUN2RSxNQUFNYSxrQkFBa0IsR0FBR0YsYUFBYSxDQUFDSixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLE1BQU0sQ0FBQ0MsV0FBVyxDQUFDQyx1QkFBdUIsQ0FBQztJQUMvRixNQUFNSSxhQUFhLEdBQUdkLFNBQVMsQ0FBQ2UsU0FBUyxDQUFDLElBQUlWLG1CQUFtQixDQUFDVyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUs7SUFDN0csTUFBTUMsa0JBQWtCLEdBQUdILGFBQWEsR0FBR1QsbUJBQW1CLENBQUNBLG1CQUFtQixDQUFDYSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRTs7SUFFbkc7SUFDQTtJQUNBLElBQUksQ0FBQ0osYUFBYSxFQUFFO01BQ25CYixrQkFBa0IsR0FBR0QsU0FBUyxDQUFDZSxTQUFTLENBQUMsR0FBR0osYUFBYSxHQUFHUCxzQkFBc0IsRUFBRSxDQUV4RTtJQUNiO0lBQ0EsSUFBSUMsbUJBQW1CLENBQUNhLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDbkMsTUFBTUMsT0FBZSxHQUFHTCxhQUFhLEdBQUdHLGtCQUFrQixHQUFHSixrQkFBa0IsQ0FBQ0Esa0JBQWtCLENBQUNLLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDOUc7TUFDQSxNQUFNRSxVQUFVLEdBQUcsSUFBSWpCLGNBQWMsR0FBRztNQUN4QyxNQUFNa0IsbUJBQW1CLEdBQUdQLGFBQWEsR0FBR0gsYUFBYSxHQUFHLElBQUlFLGtCQUFrQixDQUFDUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNOLElBQUksQ0FBQ0ksVUFBVSxDQUFDLEVBQUU7O01BRWxIO01BQ0E7TUFDQSxNQUFNRyxzQkFBc0IsR0FBR0MsbUJBQW1CLENBQUNDLHlCQUF5QixDQUMzRXpCLFNBQVMsRUFDVHFCLG1CQUFtQixFQUNuQkYsT0FBTyxDQUFDYixVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FDOUIsQ0FBQztNQUNESiw0QkFBNEIsR0FBR3FCLHNCQUFzQixFQUFFRyxrQkFBa0I7SUFDMUU7SUFDQSxPQUFPeEIsNEJBQTRCLElBQUlELGtCQUFrQjtFQUMxRDs7RUFFQTtFQUFBMEIsUUFBQSxDQUFBN0IscUJBQUEsR0FBQUEscUJBQUE7RUFDTyxTQUFTMkIseUJBQXlCQSxDQUN4Q0csZ0JBQWdDLEVBQ2hDakIsYUFBcUIsRUFDckJrQixjQUFzQixFQUMwQztJQUNoRSxNQUFNTixzQkFBc0IsR0FBR0ssZ0JBQWdCLENBQUNiLFNBQVMsQ0FBQyxHQUFHSixhQUFhLG1EQUFtRCxDQUVqSDtJQUNaLE1BQU1tQixvQkFBb0IsR0FBR1Asc0JBQXNCLEVBQUVRLG9CQUFvQjtJQUN6RSxPQUFPRCxvQkFBb0IsRUFBRUUsSUFBSSxDQUFDLFVBQVVDLGtCQUFrQixFQUFFO01BQy9ELE9BQU9BLGtCQUFrQixDQUFDQyxrQkFBa0IsRUFBRUMsdUJBQXVCLEtBQUtOLGNBQWM7SUFDekYsQ0FBQyxDQUFDO0VBQ0g7O0VBRUE7RUFBQUYsUUFBQSxDQUFBRix5QkFBQSxHQUFBQSx5QkFBQTtFQUNBLFNBQVNXLDJCQUEyQkEsQ0FBQ0MsZ0JBQWdDLEVBQUUxQixhQUFxQixFQUFFMkIsV0FBbUIsRUFBVztJQUMzSCxJQUFJQyxlQUFlLEdBQUcsS0FBSztJQUMzQixNQUFNQyw0QkFBNEIsR0FBR0gsZ0JBQWdCLENBQUN0QixTQUFTLENBQUMsR0FBR0osYUFBYSwrQ0FBK0MsQ0FFbkg7SUFDWixJQUFJNkIsNEJBQTRCLEVBQUVDLHVCQUF1QixFQUFFO01BQzFERixlQUFlLEdBQUdDLDRCQUE0QixDQUFDQyx1QkFBdUIsQ0FBQ0MsSUFBSSxDQUFDLFVBQVVDLFFBQVEsRUFBRTtRQUMvRixPQUNFQSxRQUFRLENBQTJEUix1QkFBdUIsS0FBS0csV0FBVyxJQUMzR0ssUUFBUSxDQUFDQyxhQUFhLEtBQUtOLFdBQVc7TUFFeEMsQ0FBQyxDQUFDO0lBQ0g7SUFDQSxPQUFPQyxlQUFlO0VBQ3ZCOztFQUVBO0VBQ08sU0FBU00saUJBQWlCQSxDQUFDUixnQkFBZ0MsRUFBRTFCLGFBQXFCLEVBQUUyQixXQUFtQixFQUFXO0lBQ3hILElBQUlRLHlCQUF5QixHQUFHLEtBQUs7SUFDckM7SUFDQSxNQUFNQyxnQkFBZ0IsR0FBR1YsZ0JBQWdCLENBQUN0QixTQUFTLENBQUNKLGFBQWEsR0FBRywwQ0FBMEMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLO0lBQzlILElBQUlvQyxnQkFBZ0IsRUFBRTtNQUNyQixNQUFNQyxvQkFBb0IsR0FBR1gsZ0JBQWdCLENBQUN0QixTQUFTLENBQUMsR0FBR0osYUFBYSxHQUFHLENBQWlDO01BQzVHLE1BQU1zQywyQkFBMkIsR0FBR3pCLG1CQUFtQixDQUFDMEIsc0JBQXNCLENBQUNGLG9CQUFvQixDQUF1QjtNQUMxSCxNQUFNRyxnQkFBZ0IsR0FBR0YsMkJBQTJCLEdBQUdHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSiwyQkFBMkIsQ0FBQyxHQUFHSyxTQUFTO01BQzNHLElBQUlILGdCQUFnQixFQUFFSSxRQUFRLENBQUNqQixXQUFXLENBQUMsRUFBRTtRQUM1Q1EseUJBQXlCLEdBQUcsSUFBSTtNQUNqQztJQUNEO0lBQ0EsT0FBT0EseUJBQXlCO0VBQ2pDOztFQUVBO0VBQUFuQixRQUFBLENBQUFrQixpQkFBQSxHQUFBQSxpQkFBQTtFQUVBLFNBQVNXLDBCQUEwQkEsQ0FDbEM3QyxhQUFxQixFQUNyQmlCLGdCQUFnQyxFQUNoQ2UsUUFBZ0IsRUFDaEJjLGlCQUFpQyxFQUN2QjtJQUNWLElBQUlDLFlBQVksR0FDZi9DLGFBQWEsQ0FBQ0osS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDVyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUN5QixRQUFRLENBQUNZLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FDN0QsQ0FBQ25CLDJCQUEyQixDQUFDUixnQkFBZ0IsRUFBRWpCLGFBQWEsRUFBRWdDLFFBQVEsQ0FBQyxHQUN2RSxDQUFDZ0IsdUJBQXVCLENBQUMvQixnQkFBZ0IsRUFBRWpCLGFBQWEsRUFBRWdDLFFBQVEsQ0FBQztJQUN2RTtJQUNBLElBQUllLFlBQVksSUFBSUQsaUJBQWlCLEVBQUU7TUFDdEMsTUFBTUcsZ0JBQWdCLEdBQUdDLG1CQUFtQixDQUFDSixpQkFBaUIsQ0FBQztNQUMvRCxJQUFJRyxnQkFBZ0IsRUFBRTtRQUNyQkYsWUFBWSxHQUFHRSxnQkFBZ0IsR0FBR0UsZ0JBQWdCLENBQUNGLGdCQUFzRCxDQUFDLEdBQUcsS0FBSztNQUNuSCxDQUFDLE1BQU07UUFDTkYsWUFBWSxHQUFHLEtBQUs7TUFDckI7SUFDRDtJQUNBLE9BQU9BLFlBQVk7RUFDcEI7O0VBRUE7RUFDQSxTQUFTQyx1QkFBdUJBLENBQUMvQixnQkFBZ0MsRUFBRWpCLGFBQXFCLEVBQUUyQixXQUFtQixFQUFXO0lBQ3ZILE1BQU12QyxRQUFRLEdBQUcsR0FBR1ksYUFBYSxJQUFJMkIsV0FBVyxFQUFFO01BQ2pEeUIsT0FBTyxHQUFHaEUsUUFBUSxDQUFDUSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUN5RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUMxQ0MsUUFBUSxHQUFHbEUsUUFBUSxDQUFDUSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUN5RCxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUlFLGNBQWMsR0FBRyxLQUFLO01BQ3pCQyxPQUFPLEdBQUcsRUFBRTtJQUVieEQsYUFBYSxHQUFHb0QsT0FBTyxDQUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUVqQ2tELGNBQWMsR0FBR0QsUUFBUSxDQUFDdkIsSUFBSSxDQUFDLFVBQVUwQixJQUFZLEVBQUVDLEtBQWEsRUFBRUMsS0FBZSxFQUFFO01BQ3RGLElBQUlILE9BQU8sQ0FBQ2pELE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkJpRCxPQUFPLElBQUksSUFBSUMsSUFBSSxFQUFFO01BQ3RCLENBQUMsTUFBTTtRQUNORCxPQUFPLEdBQUdDLElBQUk7TUFDZjtNQUNBLElBQUlDLEtBQUssS0FBS0MsS0FBSyxDQUFDcEQsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMvQjtRQUNBLE1BQU1LLHNCQUFzQixHQUFHQyxtQkFBbUIsQ0FBQ0MseUJBQXlCLENBQUNHLGdCQUFnQixFQUFFakIsYUFBYSxFQUFFeUQsSUFBSSxDQUFDO1FBQ25ILE1BQU1HLGtCQUFrQixHQUFHaEQsc0JBQXNCLEVBQUVpRCxrQkFBa0I7UUFDckUsTUFBTUMsdUJBQXVCLEdBQUdGLGtCQUFrQixFQUFFOUIsdUJBQXVCO1FBQzNFLE1BQU1pQyxrQkFBa0IsR0FBR0osS0FBSyxDQUFDQSxLQUFLLENBQUNwRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELElBQ0N1RCx1QkFBdUIsRUFBRXpDLElBQUksQ0FBQyxVQUFVMkMsWUFBWSxFQUFFO1VBQ3JELE9BQU9BLFlBQVksQ0FBQy9CLGFBQWEsS0FBSzhCLGtCQUFrQjtRQUN6RCxDQUFDLENBQUMsRUFDRDtVQUNELE9BQU8sSUFBSTtRQUNaO01BQ0Q7TUFDQSxJQUFJTCxLQUFLLEtBQUtDLEtBQUssQ0FBQ3BELE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDL0I7UUFDQWdELGNBQWMsR0FBRzlCLDJCQUEyQixDQUFDUixnQkFBZ0IsRUFBRWpCLGFBQWEsRUFBRXdELE9BQU8sQ0FBQztNQUN2RixDQUFDLE1BQU0sSUFBSXZDLGdCQUFnQixDQUFDYixTQUFTLENBQUMsR0FBR0osYUFBYSwrQkFBK0J5RCxJQUFJLEVBQUUsQ0FBQyxFQUFFO1FBQzdGO1FBQ0FGLGNBQWMsR0FBRzlCLDJCQUEyQixDQUFDUixnQkFBZ0IsRUFBRWpCLGFBQWEsRUFBRXdELE9BQU8sQ0FBQztRQUN0RkEsT0FBTyxHQUFHLEVBQUU7UUFDWjtRQUNBeEQsYUFBYSxHQUFHLEdBQUcsR0FBR2lCLGdCQUFnQixDQUFDYixTQUFTLENBQUMsR0FBR0osYUFBYSwrQkFBK0J5RCxJQUFJLEVBQUUsQ0FBQztNQUN4RztNQUNBLE9BQU9GLGNBQWM7SUFDdEIsQ0FBQyxDQUFDO0lBQ0YsT0FBT0EsY0FBYztFQUN0Qjs7RUFFQTs7RUFFQSxTQUFTTCxtQkFBbUJBLENBQUNKLGlCQUEwQixFQUFzQjtJQUM1RSxJQUFJbUIsUUFBUSxHQUFHbkIsaUJBQWlCLENBQUNvQixXQUFXLENBQUMsT0FBTyxDQUF1QjtJQUMzRTtJQUNBLElBQUksQ0FBQ3BCLGlCQUFpQixDQUFDb0IsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFO01BQzVDLFFBQVFELFFBQVE7UUFDZixLQUFLLCtDQUErQztRQUNwRCxLQUFLLDhEQUE4RDtVQUNsRUEsUUFBUSxHQUFHdEIsU0FBUztVQUNwQjtRQUVELEtBQUssc0NBQXNDO1FBQzNDLEtBQUssd0RBQXdEO1FBQzdELEtBQUssNkNBQTZDO1FBQ2xELEtBQUssK0RBQStEO1FBQ3BFLEtBQUssZ0RBQWdEO1VBQ3BEc0IsUUFBUSxHQUFHbkIsaUJBQWlCLENBQUNvQixXQUFXLENBQUMsbUJBQW1CLENBQXVCO1VBQ25GO1FBRUQsS0FBSyxtREFBbUQ7UUFDeEQ7VUFDQyxNQUFNQyxjQUFjLEdBQUdyQixpQkFBaUIsQ0FBQ29CLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBdUI7VUFDcEcsSUFBSUMsY0FBYyxFQUFFO1lBQ25CLElBQUlBLGNBQWMsQ0FBQ3ZCLFFBQVEsQ0FBQywrQ0FBK0MsQ0FBQyxFQUFFO2NBQzdFcUIsUUFBUSxHQUFHbkIsaUJBQWlCLENBQUNvQixXQUFXLENBQUMsdUNBQXVDLENBQXVCO1lBQ3hHLENBQUMsTUFBTSxJQUFJQyxjQUFjLENBQUN2QixRQUFRLENBQUMsc0NBQXNDLENBQUMsRUFBRTtjQUMzRXFCLFFBQVEsR0FBR25CLGlCQUFpQixDQUFDb0IsV0FBVyxDQUFDLG1CQUFtQixDQUF1QjtZQUNwRixDQUFDLE1BQU07Y0FDTjtjQUNBRCxRQUFRLEdBQUd0QixTQUFTO1lBQ3JCO1VBQ0QsQ0FBQyxNQUFNO1lBQ05zQixRQUFRLEdBQUd0QixTQUFTO1VBQ3JCO1VBQ0E7TUFDRjtJQUNEO0lBRUEsT0FBT3NCLFFBQVE7RUFDaEI7O0VBRUE7RUFDQTtFQUNPLFNBQVNHLG9CQUFvQkEsQ0FDbkNuRCxnQkFBZ0MsRUFDaENqQixhQUFxQixFQUNyQmdDLFFBQWdCLEVBQ2hCcUMsaUJBQTJCLEVBQ2tCO0lBQzdDLElBQUksT0FBT3JDLFFBQVEsS0FBSyxRQUFRLEVBQUU7TUFDakMsTUFBTSxJQUFJc0MsS0FBSyxDQUFDLHNDQUFzQyxDQUFDO0lBQ3hEOztJQUVBO0lBQ0EsSUFBSXJELGdCQUFnQixDQUFDYixTQUFTLENBQUMsR0FBR0osYUFBYSxnREFBZ0QsQ0FBQyxLQUFLLElBQUksRUFBRTtNQUMxRyxPQUFPLElBQUk7SUFDWjtJQUVBLE1BQU04QyxpQkFBaUIsR0FBRzdCLGdCQUFnQixDQUFDc0Qsb0JBQW9CLENBQUMsR0FBR3ZFLGFBQWEsSUFBSWdDLFFBQVEsRUFBRSxDQUFDO0lBRS9GLElBQUljLGlCQUFpQixJQUFJLENBQUN1QixpQkFBaUIsRUFBRTtNQUM1QyxJQUNDdkIsaUJBQWlCLENBQUNvQixXQUFXLENBQUMsb0NBQW9DLENBQUMsS0FBSyxJQUFJLElBQzVFcEIsaUJBQWlCLENBQUNvQixXQUFXLENBQUMsMENBQTBDLENBQUMsS0FBSyxJQUFJLEVBQ2pGO1FBQ0QsT0FBTyxLQUFLO01BQ2I7TUFDQSxNQUFNTSxVQUFVLEdBQUcxQixpQkFBaUIsQ0FBQ29CLFdBQVcsQ0FBQywwQ0FBMEMsQ0FBdUI7TUFDbEgsTUFBTU8sZ0JBQWdCLEdBQUczQixpQkFBaUIsQ0FBQ29CLFdBQVcsQ0FBQyxnREFBZ0QsQ0FBdUI7TUFFOUgsSUFBSU0sVUFBVSxJQUFJQyxnQkFBZ0IsRUFBRTtRQUNuQyxPQUFPQyxpQkFBaUIsQ0FBQ0MsR0FBRyxDQUFDQyxFQUFFLENBQUNDLFdBQVcsQ0FBQ0wsVUFBVSxDQUFDLEVBQUVLLFdBQVcsQ0FBQ0osZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDMUYsQ0FBQyxNQUFNLElBQUlELFVBQVUsRUFBRTtRQUN0QixPQUFPRSxpQkFBaUIsQ0FBQ0MsR0FBRyxDQUFDRSxXQUFXLENBQUNMLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDdkQsQ0FBQyxNQUFNLElBQUlDLGdCQUFnQixFQUFFO1FBQzVCLE9BQU9DLGlCQUFpQixDQUFDQyxHQUFHLENBQUNFLFdBQVcsQ0FBQ0osZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO01BQzdEO0lBQ0Q7SUFDQSxPQUFPNUIsMEJBQTBCLENBQUM3QyxhQUFhLEVBQUVpQixnQkFBZ0IsRUFBRWUsUUFBUSxFQUFFYyxpQkFBaUIsQ0FBQztFQUNoRzs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BOUIsUUFBQSxDQUFBb0Qsb0JBQUEsR0FBQUEsb0JBQUE7RUFPTyxTQUFTVSxvQkFBb0JBLENBQUN6RixTQUF5QixFQUFFMEYsSUFBWSxFQUFFQyxZQUEyQixFQUFZO0lBQ3BILE1BQU1DLFNBQVMsR0FBR0MsMkJBQTJCLENBQUM3RixTQUFTLENBQUM4RixVQUFVLENBQUNKLElBQUksQ0FBQyxDQUFDO0lBQ3pFLE1BQU1LLHNCQUFnQyxHQUFHLEVBQUU7SUFDM0MsTUFBTUMsc0JBQWdDLEdBQUcsRUFBRTtJQUMzQyxNQUFNQywwQkFBb0MsR0FBRyxFQUFFO0lBQy9DO0lBQ0EsTUFBTUMsa0JBQWtCLEdBQUcxRSxtQkFBbUIsQ0FBQzJFLDJDQUEyQyxDQUFDVCxJQUFJLEVBQUUxRixTQUFTLENBQUM7SUFDM0csTUFBTW9HLGdCQUFnQixHQUFHUixTQUFTLENBQUNTLGdCQUFnQixDQUFDRCxnQkFBZ0I7SUFDcEUsS0FBSyxNQUFNRSxJQUFJLElBQUlGLGdCQUFnQixFQUFFO01BQ3BDLE1BQU1HLFdBQVcsR0FBR0QsSUFBSSxDQUFDQyxXQUFXO1FBQ25DQyxLQUFLLEdBQUdGLElBQUksQ0FBQ0UsS0FBSztRQUNsQkMsUUFBUSxHQUFHSCxJQUFJLENBQUNJLElBQUk7UUFDcEJDLFdBQVcsR0FBR0osV0FBVyxDQUFDSyxJQUFJLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJO1FBQzdEQyxhQUFhLEdBQUcsRUFBRVIsV0FBVyxDQUFDSyxJQUFJLEVBQUVJLFFBQVEsRUFBRUYsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDakVHLFNBQVMsR0FBRyxFQUFFVixXQUFXLENBQUNXLEVBQUUsRUFBRUMsTUFBTSxFQUFFTCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUN6RE0sc0JBQXNCLEdBQUdiLFdBQVcsQ0FBQ0ssSUFBSSxFQUFFUyxvQkFBb0IsRUFBRVAsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJO1FBQ25GUSxZQUFZLEdBQUdkLEtBQUssSUFBSUYsSUFBSSxDQUFDaUIsSUFBSSxLQUFLLFVBQVU7UUFDaERDLGlCQUFpQixHQUFHaEIsS0FBSyxJQUFJRixJQUFJLENBQUNpQixJQUFJLEtBQUssVUFBVSxHQUFHLENBQUMsQ0FBQ2hCLFdBQVcsQ0FBQ2tCLE1BQU0sRUFBRUMsSUFBSSxHQUFHLEtBQUs7O01BRTNGO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTs7TUFFQSxJQUFJLENBQUNKLFlBQVksSUFBSUUsaUJBQWlCLEtBQUtULGFBQWEsSUFBSUUsU0FBUyxFQUFFO1FBQ3RFbEIsc0JBQXNCLENBQUM0QixJQUFJLENBQUNsQixRQUFRLENBQUM7TUFDdEMsQ0FBQyxNQUFNLElBQUlQLGtCQUFrQixDQUFDM0MsUUFBUSxDQUFDa0QsUUFBUSxDQUFDLElBQUlRLFNBQVMsSUFBSSxFQUFFVCxLQUFLLElBQUksQ0FBQ1Qsc0JBQXNCLENBQUN4QyxRQUFRLENBQUNrRCxRQUFRLENBQUMsQ0FBQyxFQUFFO1FBQ3hIUiwwQkFBMEIsQ0FBQzBCLElBQUksQ0FBQ2xCLFFBQVEsQ0FBQztNQUMxQyxDQUFDLE1BQU0sSUFBSUUsV0FBVyxJQUFJSSxhQUFhLElBQUlFLFNBQVMsRUFBRTtRQUNyRGpCLHNCQUFzQixDQUFDMkIsSUFBSSxDQUFDbEIsUUFBUSxDQUFDO01BQ3RDO01BRUEsSUFBSSxDQUFDTSxhQUFhLElBQUlLLHNCQUFzQixJQUFJekIsWUFBWSxFQUFFO1FBQzdELE1BQU1pQyxXQUFXLEdBQUdqQyxZQUFZLENBQUNrQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxNQUFNQyxPQUFPLEdBQUcsOEVBQThFO1FBQzlGRixXQUFXLENBQUNHLFFBQVEsQ0FDbkJDLGFBQWEsQ0FBQ0MsVUFBVSxFQUN4QkMsYUFBYSxDQUFDQyxNQUFNLEVBQ3BCTCxPQUFPLEVBQ1BNLGlCQUFpQixFQUNqQkEsaUJBQWlCLENBQUNDLFdBQVcsQ0FBQ0MsaUJBQy9CLENBQUM7TUFDRjtJQUNEO0lBQ0E7SUFDQSxPQUFPdkMsc0JBQXNCLENBQUN3QyxNQUFNLENBQUN0QywwQkFBMEIsQ0FBQyxDQUFDc0MsTUFBTSxDQUFDdkMsc0JBQXNCLENBQUM7RUFDaEc7RUFDQTtFQUFBckUsUUFBQSxDQUFBOEQsb0JBQUEsR0FBQUEsb0JBQUE7RUFDQSxTQUFTK0MscUJBQXFCQSxDQUFDOUMsSUFBWSxFQUFFOUQsZ0JBQWdDLEVBQTZDO0lBQUEsSUFBM0M2Ryx1QkFBdUIsR0FBQUMsU0FBQSxDQUFBeEgsTUFBQSxRQUFBd0gsU0FBQSxRQUFBcEYsU0FBQSxHQUFBb0YsU0FBQSxNQUFHLEtBQUs7SUFDN0csTUFBTXhDLGtCQUE0QixHQUFHLEVBQUU7SUFDdkMsSUFBSXlDLDBCQUF1RCxHQUFHLEVBQUU7SUFDaEUsTUFBTXhJLGNBQWMsR0FBRyw0QkFBNEI7SUFDbkQsSUFBSXlJLG1CQUF3RCxHQUFHLElBQUk7SUFDbkUsSUFBSWxELElBQUksQ0FBQ21ELFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUN2QjtNQUNBbkQsSUFBSSxHQUFHQSxJQUFJLENBQUNvRCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUM5QjtJQUNBLE1BQU16SSxtQkFBbUIsR0FBR3FGLElBQUksQ0FBQ3BGLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUNDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxDQUFDQyxXQUFXLENBQUNDLHVCQUF1QixDQUFDO0lBQzlHLE1BQU1DLGFBQWEsR0FBR0YsV0FBVyxDQUFDRyxnQkFBZ0IsQ0FBQzhFLElBQUksRUFBRTlELGdCQUFnQixDQUFDO0lBQzFFLE1BQU1mLGtCQUFrQixHQUFHRixhQUFhLENBQUNKLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxDQUFDQyxXQUFXLENBQUNDLHVCQUF1QixDQUFDO0lBQy9GLE1BQU1JLGFBQWEsR0FBR2MsZ0JBQWdCLENBQUNiLFNBQVMsQ0FBQyxJQUFJVixtQkFBbUIsQ0FBQ1csSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLO0lBQ3BILE1BQU1DLGtCQUFrQixHQUFHSCxhQUFhLEdBQUdULG1CQUFtQixDQUFDQSxtQkFBbUIsQ0FBQ2EsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7O0lBRW5HO0lBQ0E7SUFDQSxJQUFJLENBQUNKLGFBQWEsRUFBRTtNQUNuQjhILG1CQUFtQixHQUFHaEgsZ0JBQWdCLENBQUNiLFNBQVMsQ0FBQyxHQUFHSixhQUFhLEdBQUcsQ0FBaUM7SUFDdEc7SUFDQSxJQUFJTixtQkFBbUIsQ0FBQ2EsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNuQyxNQUFNQyxPQUFPLEdBQUdMLGFBQWEsR0FBR0csa0JBQWtCLEdBQUdKLGtCQUFrQixDQUFDQSxrQkFBa0IsQ0FBQ0ssTUFBTSxHQUFHLENBQUMsQ0FBQztNQUN0RyxNQUFNNkgsUUFBUSxHQUFHLElBQUk1SSxjQUFjLEdBQUc7TUFDdEMsTUFBTWtCLG1CQUFtQixHQUFHUCxhQUFhLEdBQUdILGFBQWEsR0FBRyxJQUFJRSxrQkFBa0IsQ0FBQ1MsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDTixJQUFJLENBQUMrSCxRQUFRLENBQUMsRUFBRTtNQUNoSDtNQUNBO01BQ0EsTUFBTXhILHNCQUFzQixHQUFHQyxtQkFBbUIsQ0FBQ0MseUJBQXlCLENBQzNFRyxnQkFBZ0IsRUFDaEJQLG1CQUFtQixFQUNuQkYsT0FBTyxDQUFDYixVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FDOUIsQ0FBQztNQUVELElBQ0NpQixzQkFBc0IsS0FBSytCLFNBQVMsSUFDcEM5QixtQkFBbUIsQ0FBQ3dILG9DQUFvQyxDQUFDekgsc0JBQXNCLEVBQUUsSUFBSSxFQUFFa0gsdUJBQXVCLENBQUMsRUFDOUc7UUFDREUsMEJBQTBCLEdBQUdGLHVCQUF1QixHQUNqRGxILHNCQUFzQixDQUFDMEgsa0JBQWtCLEVBQUVDLGtCQUFrQixJQUFJLEVBQUUsR0FDbkUzSCxzQkFBc0IsQ0FBQzRILGtCQUFrQixFQUFFRCxrQkFBa0IsSUFBSSxFQUFFO01BQ3ZFO01BQ0EsSUFDQyxDQUFDUCwwQkFBMEIsQ0FBQ3pILE1BQU0sSUFDbENNLG1CQUFtQixDQUFDd0gsb0NBQW9DLENBQUNKLG1CQUFtQixFQUFFLEtBQUssRUFBRUgsdUJBQXVCLENBQUMsRUFDNUc7UUFDREUsMEJBQTBCLEdBQUduSCxtQkFBbUIsQ0FBQzRILG9DQUFvQyxDQUNwRlIsbUJBQW1CLEVBQ25CSCx1QkFDRCxDQUFDO01BQ0Y7SUFDRCxDQUFDLE1BQU0sSUFBSWpILG1CQUFtQixDQUFDd0gsb0NBQW9DLENBQUNKLG1CQUFtQixFQUFFLEtBQUssRUFBRUgsdUJBQXVCLENBQUMsRUFBRTtNQUN6SEUsMEJBQTBCLEdBQUduSCxtQkFBbUIsQ0FBQzRILG9DQUFvQyxDQUFDUixtQkFBbUIsRUFBRUgsdUJBQXVCLENBQUM7SUFDcEk7SUFDQUUsMEJBQTBCLENBQUNVLE9BQU8sQ0FBQyxVQUFVQyxnQkFBZ0IsRUFBRTtNQUM5RCxNQUFNM0UsWUFBWSxHQUFHMkUsZ0JBQWdCLENBQUMxRyxhQUFhO01BQ25Ec0Qsa0JBQWtCLENBQUN5QixJQUFJLENBQUNoRCxZQUFZLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBQ0YsT0FBT3VCLGtCQUFrQjtFQUMxQjs7RUFFQTtFQUNPLFNBQVNDLDJDQUEyQ0EsQ0FBQ1QsSUFBWSxFQUFFckQsZ0JBQWdDLEVBQVk7SUFDckgsT0FBT2IsbUJBQW1CLENBQUNnSCxxQkFBcUIsQ0FBQzlDLElBQUksRUFBRXJELGdCQUFnQixDQUFDO0VBQ3pFOztFQUVBO0VBQUFWLFFBQUEsQ0FBQXdFLDJDQUFBLEdBQUFBLDJDQUFBO0VBQ08sU0FBU29ELDJDQUEyQ0EsQ0FBQzdELElBQVksRUFBRXJELGdCQUFnQyxFQUFZO0lBQ3JILE9BQU9iLG1CQUFtQixDQUFDZ0gscUJBQXFCLENBQUM5QyxJQUFJLEVBQUVyRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7RUFDL0U7O0VBRUE7RUFBQVYsUUFBQSxDQUFBNEgsMkNBQUEsR0FBQUEsMkNBQUE7RUFDQSxTQUFTSCxvQ0FBb0NBLENBQzVDN0MsV0FBZ0QsRUFFbEI7SUFBQSxJQUQ5QmtDLHVCQUF1QixHQUFBQyxTQUFBLENBQUF4SCxNQUFBLFFBQUF3SCxTQUFBLFFBQUFwRixTQUFBLEdBQUFvRixTQUFBLE1BQUcsS0FBSztJQUUvQixJQUFJRCx1QkFBdUIsRUFBRTtNQUM1QixPQUFPbEMsV0FBVyxHQUFHLCtDQUErQyxDQUFDLEVBQUUyQyxrQkFBa0IsSUFBSSxFQUFFO0lBQ2hHO0lBQ0EsT0FBTzNDLFdBQVcsR0FBRywrQ0FBK0MsQ0FBQyxFQUFFMkMsa0JBQWtCLElBQUksRUFBRTtFQUNoRzs7RUFFQTtFQUNBLFNBQVNGLG9DQUFvQ0EsQ0FDNUN6QyxXQUFvRyxFQUcxRjtJQUFBLElBRlZpRCx3QkFBd0IsR0FBQWQsU0FBQSxDQUFBeEgsTUFBQSxRQUFBd0gsU0FBQSxRQUFBcEYsU0FBQSxHQUFBb0YsU0FBQSxNQUFHLEtBQUs7SUFBQSxJQUNoQ0QsdUJBQXVCLEdBQUFDLFNBQUEsQ0FBQXhILE1BQUEsUUFBQXdILFNBQUEsUUFBQXBGLFNBQUEsR0FBQW9GLFNBQUEsTUFBRyxLQUFLO0lBRS9CLElBQUljLHdCQUF3QixFQUFFO01BQzdCLE1BQU1DLGNBQWMsR0FBR2xELFdBQTRFO01BQ25HLElBQUlrQyx1QkFBdUIsRUFBRTtRQUM1QixPQUFPZ0IsY0FBYyxFQUFFUixrQkFBa0IsRUFBRUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEtBQUs7TUFDN0U7TUFDQSxPQUFPTyxjQUFjLEVBQUVOLGtCQUFrQixFQUFFRCxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsS0FBSztJQUM3RSxDQUFDLE1BQU0sSUFBSVQsdUJBQXVCLEVBQUU7TUFDbkMsTUFBTWlCLGlCQUFpQixHQUFHbkQsV0FBdUQ7TUFDakYsT0FBT21ELGlCQUFpQixHQUFHLCtDQUErQyxDQUFDLEVBQUVSLGtCQUFrQixHQUFHLElBQUksR0FBRyxLQUFLO0lBQy9HO0lBQ0EsTUFBTVMscUJBQXFCLEdBQUdwRCxXQUF1RDtJQUNyRixPQUFPb0QscUJBQXFCLEdBQUcsK0NBQStDLENBQUMsRUFBRVQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEtBQUs7RUFDbkg7RUFZQTtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTaEcsc0JBQXNCQSxDQUFDcUQsV0FBeUMsRUFBNkM7SUFDNUgsTUFBTXBELGdCQUEyRCxHQUFHLENBQUMsQ0FBQztJQUN0RSxJQUFJeUcsVUFBVTtJQUNkLEtBQUssTUFBTUMsYUFBYSxJQUFJdEQsV0FBVyxFQUFFO01BQ3hDLElBQUlzRCxhQUFhLENBQUNDLFVBQVUsQ0FBQywyQ0FBMkMsQ0FBQyxFQUFFO1FBQzFFRixVQUFVLEdBQUdDLGFBQWEsQ0FBQ2YsT0FBTyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsQ0FBQztRQUNwRixNQUFNaUIsZUFBZSxHQUFHSCxVQUFVLENBQUNySixLQUFLLENBQUMsR0FBRyxDQUFDO1FBRTdDLElBQUl3SixlQUFlLENBQUM3SSxNQUFNLElBQUksQ0FBQyxFQUFFO1VBQ2hDLE1BQU04SSxlQUEwQyxHQUFHLENBQUMsQ0FBQztVQUNyRDtVQUNBLElBQUlELGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxvREFBb0QsRUFBRTtZQUMvRUMsZUFBZSxDQUFDQyx5QkFBeUIsR0FBRzFELFdBQVcsQ0FBQ3NELGFBQWEsQ0FBYTtVQUNuRjtVQUVBLElBQUlFLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxzQ0FBc0MsRUFBRTtZQUNqRUMsZUFBZSxDQUFDRSxLQUFLLEdBQUczRCxXQUFXLENBQUNzRCxhQUFhLENBQVc7VUFDN0Q7VUFDQTFHLGdCQUFnQixDQUFDNEcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLGVBQWU7UUFDdkQsQ0FBQyxNQUFNLElBQUlELGVBQWUsQ0FBQzdJLE1BQU0sSUFBSSxDQUFDLEVBQUU7VUFDdkNpQyxnQkFBZ0IsQ0FBQzRHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQ3RDckQsSUFBSSxFQUFFcUQsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUN4QnBGLFlBQVksRUFBRW9GLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDaENHLEtBQUssRUFBRSxxQkFBcUJOLFVBQVUsR0FBRztZQUN6Q08sUUFBUSxFQUFFLElBQUk7WUFDZEMsU0FBUyxFQUFFLE1BQU07WUFDakJDLE1BQU0sRUFBRTtVQUNULENBQUM7UUFDRjtNQUNEO0lBQ0Q7SUFFQSxPQUFPbEgsZ0JBQWdCO0VBQ3hCOztFQUVBO0VBQUF4QixRQUFBLENBQUF1QixzQkFBQSxHQUFBQSxzQkFBQTtFQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTb0gsdUJBQXVCQSxDQUFDdEgsb0JBQWtELEVBQTRCO0lBQ3JILE1BQU11SCxvQkFBOEMsR0FBRztNQUN0REosUUFBUSxFQUFFLElBQUk7TUFDZEssWUFBWSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU1DLGdCQUFnQixHQUFHekgsb0JBQW9CLENBQUMsNkNBQTZDLENBQUM7SUFFNUYsSUFBSSxDQUFDeUgsZ0JBQWdCLEVBQUU7TUFDdEIsT0FBT0Ysb0JBQW9CO0lBQzVCO0lBRUEsSUFBSUUsZ0JBQWdCLENBQUNDLFFBQVEsS0FBSyxLQUFLLEVBQUU7TUFDeENILG9CQUFvQixDQUFDSixRQUFRLEdBQUcsS0FBSztJQUN0QztJQUVBLEtBQUssTUFBTVEsWUFBWSxJQUFJRixnQkFBZ0IsQ0FBQ0cscUJBQXFCLElBQUksRUFBRSxFQUFFO01BQ3hFLE1BQU1DLFlBQVksR0FBR0YsWUFBWSxDQUFDL0gsYUFBYTtNQUMvQzJILG9CQUFvQixDQUFDQyxZQUFZLENBQUNLLFlBQVksQ0FBQyxHQUFHO1FBQ2pEVixRQUFRLEVBQUU7TUFDWCxDQUFDO0lBQ0Y7SUFFQSxLQUFLLE1BQU1RLFlBQVksSUFBSUYsZ0JBQWdCLENBQUNLLHVCQUF1QixJQUFJLEVBQUUsRUFBRTtNQUMxRSxNQUFNRCxZQUFZLEdBQUdGLFlBQVksQ0FBQy9ILGFBQWE7TUFDL0MySCxvQkFBb0IsQ0FBQ0MsWUFBWSxDQUFDSyxZQUFZLENBQUMsR0FBRztRQUNqRFYsUUFBUSxFQUFFLElBQUk7UUFDZFksYUFBYSxFQUFFLEtBQUssQ0FBQztNQUN0QixDQUFDO0lBQ0Y7SUFFQSxLQUFLLE1BQU1KLFlBQVksSUFBSUYsZ0JBQWdCLENBQUNPLHdCQUF3QixJQUFJLEVBQUUsRUFBRTtNQUMzRSxNQUFNSCxZQUFZLEdBQUdGLFlBQVksQ0FBQy9ILGFBQWE7TUFDL0MySCxvQkFBb0IsQ0FBQ0MsWUFBWSxDQUFDSyxZQUFZLENBQUMsR0FBRztRQUNqRFYsUUFBUSxFQUFFLElBQUk7UUFDZFksYUFBYSxFQUFFLE1BQU0sQ0FBQztNQUN2QixDQUFDO0lBQ0Y7SUFFQSxPQUFPUixvQkFBb0I7RUFDNUI7O0VBRUE7RUFBQTVJLFFBQUEsQ0FBQTJJLHVCQUFBLEdBQUFBLHVCQUFBO0VBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNXLHlCQUF5QkEsQ0FBQzFHLGtCQUEwRCxFQUE4QjtJQUNqSSxJQUFJMkcsQ0FBQyxFQUFFTCxZQUFZO0lBQ25CLE1BQU1NLHNCQUFrRCxHQUFHO01BQzFEQyxVQUFVLEVBQUUsSUFBSTtNQUNoQkMsY0FBYyxFQUFFOUcsa0JBQWtCLEVBQUUrRyxjQUFjLElBQUksS0FBSztNQUMzRGQsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQnRFLGtCQUFrQixFQUFFO0lBQ3JCLENBQUM7SUFFRCxJQUFJLENBQUMzQixrQkFBa0IsRUFBRTtNQUN4QixPQUFPNEcsc0JBQXNCO0lBQzlCO0lBRUEsSUFBSTVHLGtCQUFrQixDQUFDZ0gsVUFBVSxLQUFLLEtBQUssRUFBRTtNQUM1Q0osc0JBQXNCLENBQUNDLFVBQVUsR0FBRyxLQUFLO0lBQzFDOztJQUVBO0lBQ0EsSUFBSTdHLGtCQUFrQixDQUFDMkUsa0JBQWtCLEVBQUU7TUFDMUMsS0FBS2dDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzNHLGtCQUFrQixDQUFDMkUsa0JBQWtCLENBQUNoSSxNQUFNLEVBQUVnSyxDQUFDLEVBQUUsRUFBRTtRQUNsRUwsWUFBWSxHQUFHdEcsa0JBQWtCLENBQUMyRSxrQkFBa0IsQ0FBQ2dDLENBQUMsQ0FBQyxDQUFDdEksYUFBYTtRQUNyRXVJLHNCQUFzQixDQUFDakYsa0JBQWtCLENBQUN5QixJQUFJLENBQUNrRCxZQUFZLENBQUM7TUFDN0Q7SUFDRDtJQUVBLE1BQU1wRyx1QkFBdUIsR0FBR0Ysa0JBQWtCLENBQUM5Qix1QkFBdUIsRUFBRStJLEdBQUcsQ0FBRWxGLElBQUksSUFBS0EsSUFBSSxDQUFDMUQsYUFBYSxDQUFDLElBQUksRUFBRTtJQUNuSCxNQUFNNkksb0JBQW9CLEdBQUdsSCxrQkFBa0IsQ0FBQ21ILDRCQUE0QixFQUFFRixHQUFHLENBQUVsRixJQUFJLElBQUtBLElBQUksQ0FBQ3FGLFFBQVEsRUFBRS9JLGFBQWEsQ0FBQyxJQUFJLEVBQUU7SUFDL0hnSixpQkFBaUIsQ0FBQ1Qsc0JBQXNCLENBQUNYLFlBQVksRUFBRS9GLHVCQUF1QixFQUFFZ0gsb0JBQW9CLENBQUM7SUFFckcsSUFBSWxILGtCQUFrQixDQUFDbUgsNEJBQTRCLEVBQUU7TUFDcEQ7TUFDQSxLQUFLUixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUczRyxrQkFBa0IsQ0FBQ21ILDRCQUE0QixDQUFDeEssTUFBTSxFQUFFZ0ssQ0FBQyxFQUFFLEVBQUU7UUFDNUVMLFlBQVksR0FBR3RHLGtCQUFrQixDQUFDbUgsNEJBQTRCLENBQUNSLENBQUMsQ0FBQyxDQUFDUyxRQUFRLEVBQUUvSSxhQUFhO1FBQ3pGLElBQUlpSSxZQUFZLEVBQUU7VUFDakJNLHNCQUFzQixDQUFDWCxZQUFZLENBQUNLLFlBQVksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUd0RyxrQkFBa0IsQ0FBQ21ILDRCQUE0QixDQUFDUixDQUFDLENBQUMsQ0FDMUhXLGtCQUF5QztRQUM1QztNQUNEO0lBQ0Q7SUFFQSxPQUFPVixzQkFBc0I7RUFDOUI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEF4SixRQUFBLENBQUFzSix5QkFBQSxHQUFBQSx5QkFBQTtFQU1PLFNBQVNXLGlCQUFpQkEsQ0FDaENFLGFBQWlFLEVBQ2pFckgsdUJBQWlDLEVBQ2pDZ0gsb0JBQTRDLEVBQ3JDO0lBQ1AsS0FBSyxJQUFJUCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd6Ryx1QkFBdUIsQ0FBQ3ZELE1BQU0sRUFBRWdLLENBQUMsRUFBRSxFQUFFO01BQ3hEWSxhQUFhLENBQUNySCx1QkFBdUIsQ0FBQ3lHLENBQUMsQ0FBQyxDQUFDLEdBQUc7UUFDM0NFLFVBQVUsRUFBRTtNQUNiLENBQUM7SUFDRjtJQUNBLEtBQUssSUFBSUYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHTyxvQkFBb0IsQ0FBQ3ZLLE1BQU0sRUFBRWdLLENBQUMsRUFBRSxFQUFFO01BQ3JELE1BQU16RSxRQUFRLEdBQUdnRixvQkFBb0IsQ0FBQ1AsQ0FBQyxDQUFDO01BQ3hDLElBQUl6RSxRQUFRLEVBQUU7UUFDYnFGLGFBQWEsQ0FBQ3JGLFFBQVEsQ0FBQyxHQUFHO1VBQ3pCMkUsVUFBVSxFQUFFO1FBQ2IsQ0FBQztNQUNGO0lBQ0Q7RUFDRDs7RUFFQTtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQXpKLFFBQUEsQ0FBQWlLLGlCQUFBLEdBQUFBLGlCQUFBO0VBS08sU0FBU0csNEJBQTRCQSxDQUFDQyxnQkFBd0IsRUFBVztJQUMvRSxJQUFJQyxZQUFZLEdBQUcsSUFBSTs7SUFFdkI7SUFDQSxRQUFRRCxnQkFBZ0I7TUFDdkIsS0FBSyxrQkFBa0I7TUFDdkIsS0FBSyxhQUFhO01BQ2xCLEtBQUssYUFBYTtRQUNqQkMsWUFBWSxHQUFHLEtBQUs7UUFDcEI7TUFDRDtRQUNDO0lBQ0Y7SUFFQSxPQUFPQSxZQUFZO0VBQ3BCOztFQUVBO0VBQUF0SyxRQUFBLENBQUFvSyw0QkFBQSxHQUFBQSw0QkFBQTtFQUNPLE1BQU12SyxtQkFBbUIsR0FBRztJQUNsQ2dILHFCQUFxQjtJQUNyQlksb0NBQW9DO0lBQ3BDSixvQ0FBb0M7SUFDcEM3QywyQ0FBMkM7SUFDM0MxRSx5QkFBeUI7SUFDekJ5QixzQkFBc0I7SUFDdEIwSTtFQUNELENBQUM7RUFBQ2pLLFFBQUEsQ0FBQUgsbUJBQUEsR0FBQUEsbUJBQUE7RUFBQSxPQUFBRyxRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -279,9 +279,17 @@ export function getCreatePopupFields(metaModel: ODataMetaModel, path: string, ap
|
|
|
279
279
|
isNonComputed = !(annotations.Core?.Computed?.valueOf() === true),
|
|
280
280
|
isVisible = !(annotations.UI?.Hidden?.valueOf() === true),
|
|
281
281
|
isComputedDefaultValue = annotations.Core?.ComputedDefaultValue?.valueOf() === true,
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
282
|
+
isNonGUIDKey = isKey && prop.type !== "Edm.Guid",
|
|
283
|
+
isGUIDKeyWithText = isKey && prop.type === "Edm.Guid" ? !!annotations.Common?.Text : false;
|
|
284
|
+
|
|
285
|
+
// If it's computed we don't show it
|
|
286
|
+
// if it's immutable we show it if it's visible
|
|
287
|
+
// If it's a key with type guid AND ComputedDefaultValue and Text annotation we show it
|
|
288
|
+
// Steampunk case : We have a key of type Guid with Text but not with ComputedDefault -> We need to show them
|
|
289
|
+
// CAP case : We have keys of type Guid with no Text but with ComputedDefaulValue -> We don't show them
|
|
290
|
+
// Other case : GUID Key, with no text and no ComputedDefaultValue -> We should show them from the OData spec but not from fiori guidelines
|
|
291
|
+
|
|
292
|
+
if ((isNonGUIDKey || isGUIDKeyWithText) && isNonComputed && isVisible) {
|
|
285
293
|
nonComputedVisibleKeys.push(propName);
|
|
286
294
|
} else if (requiredProperties.includes(propName) && isVisible && !(isKey && !nonComputedVisibleKeys.includes(propName))) {
|
|
287
295
|
visibileRequiredProperties.push(propName);
|