@sapui5/sap.fe.core 1.141.2 → 1.143.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +4 -1
- package/src/sap/fe/core/ActionRuntime.js +78 -23
- package/src/sap/fe/core/ActionRuntime.ts +91 -35
- package/src/sap/fe/core/AppComponent.js +76 -6
- package/src/sap/fe/core/AppComponent.ts +91 -8
- package/src/sap/fe/core/AppStateHandler.js +7 -7
- package/src/sap/fe/core/AppStateHandler.ts +9 -8
- 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 -11
- package/src/sap/fe/core/ExtensionAPI.ts +3 -16
- 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 +12 -1
- package/src/sap/fe/core/TemplateComponent.ts +16 -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 +5 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +5 -2
- 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 -44
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +92 -59
- package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +87 -50
- 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 +10 -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 +4 -4
- package/src/sap/fe/core/controllerextensions/Routing.ts +3 -6
- 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 +49 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +64 -24
- 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 +6 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -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/OperationMessage.js +2 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +1 -0
- 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 +21 -15
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +18 -15
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
- 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 +3 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +2 -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/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
- 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 +118 -39
- package/src/sap/fe/core/converters/controls/Common/Action.js +58 -21
- package/src/sap/fe/core/converters/controls/Common/Action.ts +72 -22
- 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 +87 -22
- package/src/sap/fe/core/converters/controls/Common/Table.ts +112 -21
- 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 +174 -79
- 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 +10 -5
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +13 -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/flexibility/AppComponent.flexibility.js +55 -0
- package/src/sap/fe/core/flexibility/AppComponent.flexibility.ts +65 -0
- package/src/sap/fe/core/flexibility/XMLTools.js +71 -0
- package/src/sap/fe/core/flexibility/XMLTools.ts +61 -0
- package/src/sap/fe/core/fpm/manifest.json +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +92 -32
- package/src/sap/fe/core/helpers/DeleteHelper.js +13 -13
- package/src/sap/fe/core/helpers/DeleteHelper.ts +17 -15
- 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 +47 -11
- package/src/sap/fe/core/helpers/ModelHelper.ts +62 -15
- package/src/sap/fe/core/helpers/PasteHelper.js +6 -2
- package/src/sap/fe/core/helpers/PasteHelper.ts +5 -7
- 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 +33 -3
- package/src/sap/fe/core/library.ts +31 -1
- package/src/sap/fe/core/messagebundle.properties +8 -1
- package/src/sap/fe/core/messagebundle_ar.properties +8 -1
- 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 +8 -1
- 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 +9 -2
- 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 +22 -5
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +2 -1
- 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/CollaborativeToolsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +9 -9
- 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 +9 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -6
- 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 +57 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +69 -10
- 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
|
@@ -157,6 +157,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
157
157
|
private entityTypeRegexPattern!: RegExp;
|
|
158
158
|
|
|
159
159
|
private webSocketStatus!: WEBSOCKET_STATUS;
|
|
160
|
+
|
|
160
161
|
// Interaction type for SideEffects events
|
|
161
162
|
private interactionTypeDefinition?: SideEffectsEventsInteractionManifestSetting;
|
|
162
163
|
|
|
@@ -191,7 +192,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
191
192
|
const channel = getWebSocketChannelUrl(ChannelType.SideEffectsEvents, model);
|
|
192
193
|
|
|
193
194
|
if (url && channel) {
|
|
194
|
-
this.webSocket = createWebSocket(ChannelType.SideEffectsEvents,
|
|
195
|
+
this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, this.appComponent);
|
|
195
196
|
this.webSocket.attachMessage(this.onSideEffectsEventReceived.bind(this));
|
|
196
197
|
this.webSocketStatus = WEBSOCKET_STATUS.CONNECTED;
|
|
197
198
|
|
|
@@ -400,7 +401,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
400
401
|
if (executionOptions.submitBatch != false) {
|
|
401
402
|
context.getModel().submitBatch(groupId);
|
|
402
403
|
}
|
|
403
|
-
await action.
|
|
404
|
+
await action.invoke(groupId, true);
|
|
404
405
|
}
|
|
405
406
|
|
|
406
407
|
/**
|
|
@@ -557,9 +558,8 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
557
558
|
}
|
|
558
559
|
};
|
|
559
560
|
source.entityProperties.forEach((property) => {
|
|
560
|
-
const
|
|
561
|
-
if (
|
|
562
|
-
const roleType = commonAnno.RecommendationRole;
|
|
561
|
+
const roleType = (property.annotations.Common as PropertyAnnotationsWithRecommendation)?.RecommendationRole;
|
|
562
|
+
if (roleType) {
|
|
563
563
|
if (roleType.valueOf().includes("Input")) {
|
|
564
564
|
addRecommendationRoles(`${source.name}`);
|
|
565
565
|
this.recommendationRegistry.roles[`${source.name}`].input.push(property.name);
|
|
@@ -583,6 +583,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
583
583
|
* @returns True if field is has recommendation role - Input annotation
|
|
584
584
|
*/
|
|
585
585
|
public checkIfFieldIsRecommendationRelevant(field: Control): boolean {
|
|
586
|
+
// Runtime call
|
|
586
587
|
const context = field.getBindingContext();
|
|
587
588
|
const propertyName = field.data().sourcePath.split("/").pop();
|
|
588
589
|
if (context) {
|
|
@@ -610,6 +611,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
610
611
|
* @returns Array of property names which are marked RecommendationRole Output
|
|
611
612
|
*/
|
|
612
613
|
public getRecommendationOutputFields(entityTypeName: string): string[] {
|
|
614
|
+
// Runtime ish
|
|
613
615
|
//TODO: We have to consider 1:1 navigation properties as well.
|
|
614
616
|
const recommendationRolesForEntity = this.recommendationRegistry.roles[entityTypeName];
|
|
615
617
|
if (recommendationRolesForEntity?.output?.length > 0) {
|
|
@@ -1127,9 +1129,12 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
1127
1129
|
*/
|
|
1128
1130
|
private getSideEffectsAnnotationFromSource(source: EntityType | Action): CommonSideEffectTypeWithQualifier[] {
|
|
1129
1131
|
const sideEffects: CommonSideEffectsType[] = [];
|
|
1130
|
-
const commonAnnotation = source.annotations?.Common as
|
|
1131
|
-
|
|
1132
|
-
|
|
1132
|
+
const commonAnnotation = source.annotations?.Common as unknown as
|
|
1133
|
+
| undefined
|
|
1134
|
+
| (Record<string, CommonSideEffectTypeWithQualifier> & { _keys?: string[] });
|
|
1135
|
+
const existingKeys = commonAnnotation?._keys?.filter((key) => key.startsWith("SideEffects")) ?? [];
|
|
1136
|
+
for (const key of existingKeys) {
|
|
1137
|
+
const annotation = commonAnnotation![key];
|
|
1133
1138
|
if (this.isSideEffectsAnnotation(annotation)) {
|
|
1134
1139
|
sideEffects.push(annotation);
|
|
1135
1140
|
}
|
|
@@ -157,6 +157,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
|
|
|
157
157
|
if (oViewSettings.preprocessors) {
|
|
158
158
|
oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
|
|
159
159
|
}
|
|
160
|
+
delete oViewSettings.cache;
|
|
161
|
+
oViewSettings.id += "-Error";
|
|
162
|
+
oViewSettings.viewData.stableId += "-Error";
|
|
163
|
+
delete oViewSettings.controller;
|
|
160
164
|
return oComponent.runAsOwner(async () => {
|
|
161
165
|
return View.create(oViewSettings).then(oView => {
|
|
162
166
|
this.oView = oView;
|
|
@@ -180,7 +184,10 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
|
|
|
180
184
|
let sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent)?.options?.settings?.fullContextPath ?? "";
|
|
181
185
|
if (!sFullContextPath) {
|
|
182
186
|
// if the context path couldn't be retrieved from the routing service, try to get it from the component itself
|
|
183
|
-
|
|
187
|
+
const componentContextPath = oComponent.getContextPath();
|
|
188
|
+
if (componentContextPath) {
|
|
189
|
+
sFullContextPath = componentContextPath.endsWith("/") ? componentContextPath : `${componentContextPath}/`;
|
|
190
|
+
}
|
|
184
191
|
}
|
|
185
192
|
const oMetaModel = oAppComponent.getMetaModel();
|
|
186
193
|
const oManifestContent = oAppComponent.getManifest();
|
|
@@ -290,17 +297,62 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
|
|
|
290
297
|
oViewSettings = this._getViewSettings(preprocessorContext, mServiceSettings, oComponent, mViewData, sCacheKey, oPageModel, oResourceModel);
|
|
291
298
|
// Setting the pageModel on the component for potential reuse
|
|
292
299
|
oComponent.setModel(oPageModel, "_pageModel");
|
|
300
|
+
oComponent.setModel(oViewDataModel, "viewData");
|
|
301
|
+
const uiModel = oAppComponent.getModel("ui");
|
|
302
|
+
const internalModel = oAppComponent.getModel("internal");
|
|
303
|
+
oComponent.setModel(uiModel, "ui");
|
|
304
|
+
oComponent.setModel(internalModel, "internal");
|
|
305
|
+
oComponent.setModel(internalModel, "pageInternal");
|
|
306
|
+
const path = `/pages/${oViewSettings.id}`;
|
|
307
|
+
uiModel.setProperty(path, {
|
|
308
|
+
controls: {}
|
|
309
|
+
});
|
|
310
|
+
internalModel.setProperty(path, {
|
|
311
|
+
controls: {},
|
|
312
|
+
collaboration: {}
|
|
313
|
+
});
|
|
314
|
+
let targetUIModelContext = "/";
|
|
315
|
+
if (oComponent.isA("sap.fe.templates.ListReport.Component")) {
|
|
316
|
+
targetUIModelContext = `/${oViewSettings.id}`;
|
|
317
|
+
}
|
|
318
|
+
oComponent.setBindingContext(uiModel.createBindingContext(targetUIModelContext), "ui");
|
|
319
|
+
oComponent.setBindingContext(internalModel.createBindingContext(path), "internal");
|
|
320
|
+
|
|
321
|
+
// for the time being provide it also pageInternal as some macros access it - to be removed
|
|
322
|
+
oComponent.setBindingContext(internalModel.createBindingContext(path), "pageInternal");
|
|
293
323
|
oComponent.setPreprocessorContext(preprocessorContext);
|
|
294
324
|
return oComponent.runAsOwner(async () => {
|
|
295
325
|
return View.create(oViewSettings).then(oView => {
|
|
296
326
|
this.oView = oView;
|
|
297
327
|
const viewJSONModel = new JSONModel(this.oView);
|
|
298
328
|
ModelHelper.enhanceViewJSONModel(viewJSONModel);
|
|
299
|
-
|
|
300
|
-
|
|
329
|
+
oComponent.setModel(viewJSONModel, "$view");
|
|
330
|
+
if (oAppComponent.hideViewDuringCreation && oComponent.isA("sap.fe.templates.ObjectPage.Component")) {
|
|
331
|
+
this.oView.setVisible(false);
|
|
332
|
+
}
|
|
301
333
|
oComponent.setAggregation("rootControl", this.oView);
|
|
334
|
+
if (oAppComponent.eagerViewCreation) {
|
|
335
|
+
setTimeout(() => {
|
|
336
|
+
for (const navName in mNavigation) {
|
|
337
|
+
const routingTargets = oAppComponent.getRoutingService()._getRouteInformation(mNavigation[navName].detail.route)?.targetsWithInfo;
|
|
338
|
+
if (routingTargets) {
|
|
339
|
+
for (const routingTarget of routingTargets) {
|
|
340
|
+
const routingTargetName = typeof routingTarget === "string" ? routingTarget : routingTarget.name;
|
|
341
|
+
const routerTarget = oAppComponent.getRouter().getTarget(routingTargetName);
|
|
342
|
+
if (routerTarget && !Array.isArray(routerTarget)) {
|
|
343
|
+
routerTarget.load(routingTarget);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}, 2000); // Delay a bit to not block the initial rendering
|
|
349
|
+
}
|
|
302
350
|
return sCacheKey;
|
|
303
|
-
}).catch(async reason =>
|
|
351
|
+
}).catch(async reason => {
|
|
352
|
+
oComponent.getRootController()?.destroy();
|
|
353
|
+
oComponent.setRootController();
|
|
354
|
+
return this._createErrorPage(reason, oViewSettings, mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage", oComponent, sCacheKey);
|
|
355
|
+
}).catch(e => Log.error(e.message, e));
|
|
304
356
|
});
|
|
305
357
|
} catch (error) {
|
|
306
358
|
Log.error(error.message, error);
|
|
@@ -441,4 +493,4 @@ sap.ui.define(["sap/base/Log", "sap/base/i18n/Localization", "sap/fe/base/Bindin
|
|
|
441
493
|
_exports.TemplatedViewServiceFactory = TemplatedViewServiceFactory;
|
|
442
494
|
return _exports;
|
|
443
495
|
}, false);
|
|
444
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsImlzQ2FjaGVSZWFkeSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlZlcnNpb25JbmZvIiwibG9hZCIsIm9JbmZvIiwic1RpbWVzdGFtcCIsImxpYnJhcmllcyIsIkNvcmUiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicmVxdWlyZURlcGVuZGVuY2llcyIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsInJlZnJlc2hWaWV3Iiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJkZXN0cm95Iiwib1ZpZXciLCJyZXNvdXJjZU1vZGVsIiwic3RhYmxlSWQiLCJnZXRVSUFyZWEiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJfZ2V0Vmlld1NldHRpbmdzIiwicHJlcHJvY2Vzc29yQ29udGV4dCIsIm1TZXJ2aWNlU2V0dGluZ3MiLCJtVmlld0RhdGEiLCJvUGFnZU1vZGVsIiwidmlld1R5cGUiLCJnZXRWaWV3VHlwZSIsInVuZGVmaW5lZCIsInR5cGUiLCJwcmVwcm9jZXNzb3JzIiwieG1sIiwiY29udHJvbHMiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJ2aWV3RGF0YSIsImNhY2hlIiwia2V5cyIsImFkZGl0aW9uYWxEYXRhIiwiZ2V0QWRkaXRpb25hbENhY2hlRGF0YSIsImdldERhdGEiLCJzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwidmFsdWUiLCJzZXREYXRhIiwibW9kZWxzIiwiaGVpZ2h0IiwiX2NyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm9WaWV3U2V0dGluZ3MiLCJtZXNzYWdlIiwiSlNPTk1vZGVsIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0Q29udHJvbGxlciIsImdldFBsYWNlaG9sZGVyIiwiaGlkZVJvb3RQbGFjZWhvbGRlciIsInNDb252ZXJ0ZXJUeXBlIiwiY29udmVydGVyVHlwZSIsInNGdWxsQ29udGV4dFBhdGgiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldFRhcmdldEluZm9ybWF0aW9uRm9yIiwib3B0aW9ucyIsImZ1bGxDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJvVmlld0RhdGFNb2RlbCIsIm9Sb3V0aW5nU2VydmljZSIsImdldFNlcnZpY2UiLCJvVGFyZ2V0SW5mbyIsIm1PdXRib3VuZHMiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJtTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImdldENhcGFiaWxpdGllcyIsIl9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyIsImRlZmluaXRpb25Db250ZXh0IiwiRGVmaW5pdGlvbkNvbnRleHQiLCJhZGRBcHBsaWNhdGlvbk1hbmlmZXN0IiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJpc0Rlc2t0b3AiLCJzeXN0ZW0iLCJkZXNrdG9wIiwiaXNQaG9uZSIsInBob25lIiwiVGVtcGxhdGVUeXBlIiwiRnJlZVN0eWxlUGFnZSIsImdldFZpZXdEYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5Iiwic2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiaXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94IiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveCIsIm9TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNoZWxsQ29udGVudERlbnNpdHkiLCJnZXRDb250ZW50RGVuc2l0eSIsInNhcGZlTWFuaWZlc3RDb250ZW50Iiwic2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5jbHVkZXMiLCJzVGFyZ2V0QW5ub3RhdGlvblBhdGgiLCJyZXNvbHZlRHluYW1pY0V4cHJlc3Npb24iLCJUZW1wbGF0ZU1vZGVsIiwib0RpYWdub3N0aWNzIiwiZ2V0RGlhZ25vc3RpY3MiLCJpSXNzdWVDb3VudCIsImdldElzc3VlcyIsIm9Db252ZXJ0ZXJQYWdlTW9kZWwiLCJjb252ZXJ0UGFnZSIsIk1hbmlmZXN0V3JhcHBlciIsIl9nZXRDb250cm9sbGVyTmFtZSIsImNvbnRyb2xsZXJOYW1lIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsImFTcGxpdFBhdGgiLCJzcGxpdCIsInNFbnRpdHlTZXRQYXRoIiwiX2dldEZ1bGxQYXRoVG9FbnRpdHlTZXQiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsImRldmljZSIsIm1hbmlmZXN0IiwiZ2V0Q29udmVydGVkTWV0YWRhdGEiLCJnZXREZWZpbml0aW9uQ29udGV4dCIsImdldERlZmluaXRpb25Gb3JQYWdlIiwiZW5kc1dpdGgiLCJzdWJzdHJpbmciLCJnZXRQYWdlRm9yIiwidmlld0lkIiwic2V0UHJlcHJvY2Vzc29yQ29udGV4dCIsInZpZXdKU09OTW9kZWwiLCJNb2RlbEhlbHBlciIsImVuaGFuY2VWaWV3SlNPTk1vZGVsIiwiZXJyb3JWaWV3TmFtZSIsImUiLCJFcnJvciIsImNvbnZlcnRlZFR5cGVzIiwibmF2aWdhdGlvbk9iamVjdEtleSIsIm5hdmlnYXRpb25PYmplY3QiLCJvdXRib3VuZENvbmZpZyIsImRldGFpbCIsIm91dGJvdW5kIiwib3V0Ym91bmREZXRhaWwiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtZXRlcnMiLCJhdmFpbGFiaWxpdHkiLCJyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSIsInJvdXRlIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIl9TZXJ2aWNlRmFjdG9yeSIsIl90aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX29JbnN0YW5jZVJlZ2lzdHJ5IiwiX3Byb3RvMiIsIm9TZXJ2aWNlQ29udGV4dCIsImlDcmVhdGluZ1ZpZXdzIiwib1RlbXBsYXRlZFZpZXdTZXJ2aWNlIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJmZUVudmlyb25tZW50IiwiZ2V0U2hhcmVDb250cm9sVmlzaWJpbGl0eSIsImdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUiLCJ0YXJnZXRzIiwicm91dGluZyIsInJlYWxUYXJnZXQiLCJ0YXJnZXRUb0ZpbmQiLCJhY3R1YWxTZXR0aW5ncyIsImFwcGx5UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnZlcnRlZE1ldGFkYXRhIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNBUEpTT05TY2hlbWFGb3JXZWJBcHBsaWNhdGlvbk1hbmlmZXN0RmlsZSB9IGZyb20gXCJAdWk1L21hbmlmZXN0L3R5cGVzL21hbmlmZXN0XCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2NhbGl6YXRpb24gZnJvbSBcInNhcC9iYXNlL2kxOG4vTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudERhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24sIFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFN1cnZleUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUge1xuXHRCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0Q29udGVudERlbnNpdGllc1R5cGUsXG5cdENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TWFuaWZlc3RIZWFkZXJGYWNldCxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9NZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgKiBhcyBfVGVtcGxhdGVDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlUmVjb3JkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvblBhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IERlZmluaXRpb25Db250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyByZXF1aXJlRGVwZW5kZW5jaWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTG9hZGVyVXRpbHNcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvbWFuaWZlc3RNZXJnZXIvQ2hhbmdlUGFnZUNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgdHlwZSBIaWVyYWNoeU1vZGUgYXMgQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9CcmVhZGNydW1ic1wiO1xuaW1wb3J0IHR5cGUgeyBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eSB9IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RDb250ZW50LCBNYW5pZmVzdE91dGJvdW5kRW50cnksIFNoYXJlT3B0aW9ucyB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7XG5cdHZpZXdUeXBlPzogc3RyaW5nO1xuXHR2aWV3TmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgVmlld1NldHRpbmdzID0gUGFyYW1ldGVyczx0eXBlb2YgVmlldy5jcmVhdGU+WzBdICYgeyBjYWNoZTogdW5rbm93bjsgbW9kZWxzOiB1bmtub3duOyBoZWlnaHQ6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVmlld0RhdGEgPSB7XG5cdGJyZWFkY3J1bWJzSGllcmFyY2h5TW9kZT86IEJyZWFkY3J1bWJzSGllcmFjaHlNb2RlO1xuXHRmY2xFbmFibGVkPzogYm9vbGVhbjtcblx0ZWRpdGFibGVIZWFkZXJDb250ZW50PzogYm9vbGVhbjtcblx0aGlkZUZpbHRlckJhcj86IGJvb2xlYW47XG5cdHVzZUhpZGRlbkZpbHRlckJhcj86IGJvb2xlYW47XG5cdHNlY3Rpb25MYXlvdXQ/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM/OiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRuYXZpZ2F0aW9uOiBvYmplY3Q7XG5cdHZpZXdMZXZlbDogbnVtYmVyO1xuXHR2YXJpYW50TWFuYWdlbWVudD86IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0c3RhYmxlSWQ6IHN0cmluZztcblx0Y29udGVudERlbnNpdGllcz86IENvbnRlbnREZW5zaXRpZXNUeXBlO1xuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsO1xuXHRmdWxsQ29udGV4dFBhdGg6IHN0cmluZztcblx0aXNEZXNrdG9wOiBib29sZWFuO1xuXHRpc1Bob25lOiBib29sZWFuO1xuXHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGU7XG5cdHNoZWxsQ29udGVudERlbnNpdHk/OiBzdHJpbmc7XG5cdHVzZU5ld0xhenlMb2FkaW5nPzogYm9vbGVhbjtcblx0aW5pdGlhbExvYWQ/OiBzdHJpbmc7XG5cdGxpdmVNb2RlPzogYm9vbGVhbjtcblx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdD86IGJvb2xlYW47XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZT86IHVua25vd247XG5cdGVudGl0eVNldD86IHN0cmluZztcblx0aXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94PzogYm9vbGVhbjtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNoYXJlPzogU2hhcmVPcHRpb25zO1xuXHRzaGFyZU92ZXJmbG93UHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0c2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24/OiBNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdGNvbnRlbnQ/OiB7XG5cdFx0ZmVlZGJhY2s/OiB7IGFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+OyBzdGFuZGFyZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+IH07XG5cdFx0aGVhZGVyPzoge1xuXHRcdFx0ZmFjZXRzPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0SGVhZGVyRmFjZXQ+O1xuXHRcdFx0YWN0aW9ucz86IENvbmZpZ3VyYWJsZVJlY29yZDxNYW5pZmVzdEFjdGlvbj47XG5cdFx0fTtcblx0XHRmb290ZXI/OiB7XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHR9O1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8dm9pZD47XG5cblx0b1ZpZXchOiBWaWV3O1xuXG5cdG9SZXNvdXJjZU1vZGVsU2VydmljZSE6IFJlc291cmNlTW9kZWxTZXJ2aWNlO1xuXG5cdG9DYWNoZUhhbmRsZXJTZXJ2aWNlITogQ2FjaGVIYW5kbGVyU2VydmljZTtcblxuXHRvRmFjdG9yeSE6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcblxuXHRyZXNvdXJjZU1vZGVsITogUmVzb3VyY2VNb2RlbDtcblxuXHRzdGFibGVJZCE6IHN0cmluZztcblxuXHRwYWdlSWQhOiBzdHJpbmc7XG5cblx0VGVtcGxhdGVDb252ZXJ0ZXI/OiB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyO1xuXG5cdE1ldGFNb2RlbENvbnZlcnRlcj86IHR5cGVvZiBfTWV0YU1vZGVsQ29udmVydGVyO1xuXG5cdGluaXQoKTogdm9pZCB7XG5cdFx0Y29uc3QgYVNlcnZpY2VEZXBlbmRlbmNpZXMgPSBbXTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdDtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGNvbnN0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRWaWV3UHJlbG9hZGVyU2VydmljZSgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdHRoaXMucGFnZUlkID0gb0FwcENvbXBvbmVudC5nZXRMb2NhbElkKG9Db21wb25lbnQuZ2V0SWQoKSkgYXMgc3RyaW5nO1xuXHRcdGNvbnN0IHNTdGFibGVJZCA9IGAke29BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCl9Ojoke3RoaXMucGFnZUlkfWA7XG5cdFx0Y29uc3QgYUVuaGFuY2VJMThuID0gb0NvbXBvbmVudC5nZXRFbmhhbmNlSTE4bigpIHx8IFtdO1xuXHRcdGxldCBzQXBwTmFtZXNwYWNlO1xuXHRcdHRoaXMub0ZhY3RvcnkgPSBvQ29udGV4dC5mYWN0b3J5O1xuXHRcdGlmIChhRW5oYW5jZUkxOG4pIHtcblx0XHRcdHNBcHBOYW1lc3BhY2UgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0Q29tcG9uZW50TmFtZSgpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRW5oYW5jZUkxOG4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ly8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0ZXh0LXZlcnRpY2FsaXphdGlvbiBhcHBsaWNhdGlvbnMgY2FuIGFsc28gcGFzcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIFVJNSB0YWtlcyBjYXJlIG9mIHRleHQtdmVydGljYWxpemF0aW9uIGZvciByZXNvdXJjZSBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gSGVuY2UgY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIGlmIHNvIHRoaXMgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gZW5oYW5jZSB0aGUgc2FwLmZlIHJlc291cmNlIG1vZGVsIHNvIHBhc3MgaXQgYXMgaXQgaXNcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKGFFbmhhbmNlSTE4bltpXSk7XG5cdFx0XHRcdGlmIChvUmVzb3VyY2VNb2RlbCAmJiBvUmVzb3VyY2VNb2RlbC5pc0EoXCJzYXAudWkubW9kZWwucmVzb3VyY2UuUmVzb3VyY2VNb2RlbFwiKSkge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IGAke3NBcHBOYW1lc3BhY2V9LiR7YUVuaGFuY2VJMThuW2ldLnJlcGxhY2UoXCIucHJvcGVydGllc1wiLCBcIlwiKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHNDYWNoZUlkZW50aWZpZXIgPSBgJHtvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfV8ke3NTdGFibGVJZH1fJHtMb2NhbGl6YXRpb24uZ2V0TGFuZ3VhZ2VUYWcoKX1gO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJlc291cmNlTW9kZWxTZXJ2aWNlXCIpXG5cdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0c2NvcGVUeXBlOiBcImNvbXBvbmVudFwiLFxuXHRcdFx0XHRcdHNjb3BlT2JqZWN0OiBvQ29tcG9uZW50LFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRidW5kbGVzOiBbXCJzYXAuZmUuY29yZS5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLm1hY3Jvcy5tZXNzYWdlYnVuZGxlXCIsIFwic2FwLmZlLnRlbXBsYXRlcy5tZXNzYWdlYnVuZGxlXCJdLFxuXHRcdFx0XHRcdFx0ZW5oYW5jZUkxOG46IGFFbmhhbmNlSTE4bixcblx0XHRcdFx0XHRcdG1vZGVsTmFtZTogXCJzYXAuZmUuaTE4blwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigob1Jlc291cmNlTW9kZWxTZXJ2aWNlOiBSZXNvdXJjZU1vZGVsU2VydmljZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlID0gb1Jlc291cmNlTW9kZWxTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvUmVzb3VyY2VNb2RlbFNlcnZpY2UuZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9Db21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGFzeW5jIChvQ2FjaGVIYW5kbGVyU2VydmljZTogQ2FjaGVIYW5kbGVyU2VydmljZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHZpZXdQcmVsb2FkZXJTZXJ2aWNlLmlzQ2FjaGVSZWFkeSgpO1xuXHRcdFx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgPSBvQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlclNlcnZpY2UudmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyLCBvQ29tcG9uZW50LCBvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFZlcnNpb25JbmZvLmxvYWQoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0luZm8pIHtcblx0XHRcdFx0XHRsZXQgc1RpbWVzdGFtcCA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCFvSW5mby5saWJyYXJpZXMpIHtcblx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgPSAoQ29yZSBhcyB7IGJ1aWxkaW5mbz86IHsgYnVpbGR0aW1lPzogc3RyaW5nIH0gfSk/LmJ1aWxkaW5mbz8uYnVpbGR0aW1lID8/IFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9JbmZvLmxpYnJhcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChvTGlicmFyeSkge1xuXHRcdFx0XHRcdFx0XHRzVGltZXN0YW1wICs9IG9MaWJyYXJ5LmJ1aWxkVGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBzVGltZXN0YW1wO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBcIjxOT1ZBTFVFPlwiO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UuYWxsKGFTZXJ2aWNlRGVwZW5kZW5jaWVzKVxuXHRcdFx0LnRoZW4oYXN5bmMgKGFEZXBlbmRlbmNpZXNSZXN1bHQ6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMF0gYXMgUmVzb3VyY2VNb2RlbDtcblx0XHRcdFx0Y29uc3Qgc0NhY2hlS2V5ID0gYURlcGVuZGVuY2llc1Jlc3VsdFsxXSBhcyBzdHJpbmcgfCBudWxsO1xuXHRcdFx0XHRjb25zdCBbVGVtcGxhdGVDb252ZXJ0ZXIsIE1ldGFNb2RlbENvbnZlcnRlcl0gPSBhd2FpdCByZXF1aXJlRGVwZW5kZW5jaWVzKFtcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIixcblx0XHRcdFx0XHRcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCJcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVZpZXcoXG5cdFx0XHRcdFx0b1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0c1N0YWJsZUlkLFxuXHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRUZW1wbGF0ZUNvbnZlcnRlciBhcyB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyLFxuXHRcdFx0XHRcdE1ldGFNb2RlbENvbnZlcnRlciBhcyB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQ2FjaGVLZXk6IHN0cmluZyB8IHZvaWQgfCBudWxsKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gU2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpLmdldEluc3RhbmNlKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRvQ2FjaGVIYW5kbGVyU2VydmljZS5pbnZhbGlkYXRlSWZOZWVkZWQoXG5cdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdHNDYWNoZUlkZW50aWZpZXIsXG5cdFx0XHRcdFx0b0NvbXBvbmVudCxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgY3VycmVudCB2aWV3IHVzaW5nIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYXMgYmVmb3JlLlxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgaW5kaWNhdGluZyB3aGVuIHRoZSB2aWV3IGlzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaFZpZXcob0NvbXBvbmVudDogVGVtcGxhdGVDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvUm9vdFZpZXcgPSBvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0aWYgKG9Sb290Vmlldykge1xuXHRcdFx0b1Jvb3RWaWV3LmRlc3Ryb3koKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMub1ZpZXcpIHtcblx0XHRcdHRoaXMub1ZpZXcuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVWaWV3KHRoaXMucmVzb3VyY2VNb2RlbCwgdGhpcy5zdGFibGVJZCwgXCJcIiwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciEsIHRoaXMuTWV0YU1vZGVsQ29udmVydGVyISlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRVSUFyZWEoKS5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldFVJQXJlYSgpLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfZ2V0Vmlld1NldHRpbmdzKFxuXHRcdHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0bVNlcnZpY2VTZXR0aW5nczogVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyxcblx0XHRvQ29tcG9uZW50OiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4sXG5cdFx0bVZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0b1BhZ2VNb2RlbDogSlNPTk1vZGVsLFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsXG5cdCk6IFZpZXdTZXR0aW5ncyB7XG5cdFx0bGV0IHZpZXdUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBtU2VydmljZVNldHRpbmdzLnZpZXdUeXBlIHx8IG9Db21wb25lbnQuZ2V0Vmlld1R5cGUoKSB8fCBcIlhNTFwiO1xuXHRcdGlmICh2aWV3VHlwZSAhPT0gXCJYTUxcIikge1xuXHRcdFx0dmlld1R5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiB2aWV3VHlwZSxcblx0XHRcdHByZXByb2Nlc3NvcnM6IHtcblx0XHRcdFx0eG1sOiBwcmVwcm9jZXNzb3JDb250ZXh0LFxuXHRcdFx0XHRjb250cm9sczoge31cblx0XHRcdH0sXG5cdFx0XHRpZDogbVZpZXdEYXRhLnN0YWJsZUlkLFxuXHRcdFx0dmlld05hbWU6IG1TZXJ2aWNlU2V0dGluZ3Mudmlld05hbWUgfHwgb0NvbXBvbmVudC5nZXRWaWV3TmFtZT8uKCksXG5cdFx0XHR2aWV3RGF0YTogbVZpZXdEYXRhLFxuXHRcdFx0Y2FjaGU6IHtcblx0XHRcdFx0a2V5czogW3NDYWNoZUtleV0sXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhOiB7XG5cdFx0XHRcdFx0Ly8gV2Ugc3RvcmUgdGhlIHBhZ2UgbW9kZWwgZGF0YSBpbiB0aGUgYGFkZGl0aW9uYWxEYXRhYCBvZiB0aGUgdmlldyBjYWNoZSwgdGhpcyB3YXkgaXQgaXMgYWx3YXlzIGluIHN5bmNcblx0XHRcdFx0XHRnZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAoKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhOiAodmFsdWU6IG9iamVjdCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b1BhZ2VNb2RlbC5zZXREYXRhKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbFxuXHRcdFx0fSxcblx0XHRcdGhlaWdodDogXCIxMDAlXCJcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgX2NyZWF0ZUVycm9yUGFnZShcblx0XHRyZWFzb246IEVycm9yLFxuXHRcdG9WaWV3U2V0dGluZ3M6IFZpZXdTZXR0aW5ncyxcblx0XHR2aWV3TmFtZTogc3RyaW5nLFxuXHRcdG9Db21wb25lbnQ6IFRlbXBsYXRlQ29tcG9uZW50LFxuXHRcdHNDYWNoZUtleTogc3RyaW5nIHwgbnVsbFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdC8vIGp1c3QgcmVwbGFjZSB0aGUgdmlldyBuYW1lIGFuZCBhIG1vZGVsIGNvbnRhaW5pbmcgdGhlIHJlYXNvbiwgYnV0IGtlZXAgdGhlIG90aGVyIHNldHRpbmdzXG5cdFx0TG9nLmVycm9yKHJlYXNvbi5tZXNzYWdlLCByZWFzb24pO1xuXHRcdG9WaWV3U2V0dGluZ3Mudmlld05hbWUgPSB2aWV3TmFtZTtcblx0XHRpZiAob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzKSB7XG5cdFx0XHQob1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzIGFzIFJlY29yZDxzdHJpbmcsIHsgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gfT4pLnhtbC5tb2RlbHNbXCJlcnJvclwiXSA9IG5ldyBKU09OTW9kZWwocmVhc29uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXc7XG5cdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IEpTT05Nb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250cm9sKCkuZ2V0Q29udHJvbGxlcigpLmdldFBsYWNlaG9sZGVyKCkuaGlkZVJvb3RQbGFjZWhvbGRlcigpO1xuXHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0fSk7XG5cdFx0fSkgYXMgUHJvbWlzZTxzdHJpbmc+O1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlVmlldyhcblx0XHRvUmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRzU3RhYmxlSWQ6IHN0cmluZyxcblx0XHRzQ2FjaGVLZXk6IHN0cmluZyB8IG51bGwsXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0TWV0YU1vZGVsQ29udmVydGVyOiB0eXBlb2YgX01ldGFNb2RlbENvbnZlcnRlclxuXHQpOiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB2b2lkPiB7XG5cdFx0dGhpcy5yZXNvdXJjZU1vZGVsID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0dGhpcy5zdGFibGVJZCA9IHNTdGFibGVJZDtcblx0XHR0aGlzLlRlbXBsYXRlQ29udmVydGVyID0gVGVtcGxhdGVDb252ZXJ0ZXI7XG5cdFx0dGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIgPSBNZXRhTW9kZWxDb252ZXJ0ZXI7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBtU2VydmljZVNldHRpbmdzID0gb0NvbnRleHQuc2V0dGluZ3M7XG5cdFx0Y29uc3Qgc0NvbnZlcnRlclR5cGUgPSBtU2VydmljZVNldHRpbmdzLmNvbnZlcnRlclR5cGU7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db21wb25lbnQpO1xuXHRcdGxldCBzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpPy5vcHRpb25zPy5zZXR0aW5ncz8uZnVsbENvbnRleHRQYXRoID8/IFwiXCI7XG5cdFx0aWYgKCFzRnVsbENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgY29udGV4dCBwYXRoIGNvdWxkbid0IGJlIHJldHJpZXZlZCBmcm9tIHRoZSByb3V0aW5nIHNlcnZpY2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgY29tcG9uZW50IGl0c2VsZlxuXHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IG9Db21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSA/PyBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTWFuaWZlc3RDb250ZW50ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoRGV2aWNlKS5zZXREZWZhdWx0QmluZGluZ01vZGUoXCJPbmVXYXlcIik7XG5cdFx0Y29uc3Qgb01hbmlmZXN0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9NYW5pZmVzdENvbnRlbnQpO1xuXHRcdGxldCBvUGFnZU1vZGVsOiBUZW1wbGF0ZU1vZGVsLCBvVmlld0RhdGFNb2RlbDogTW9kZWwsIG1WaWV3RGF0YTogVmlld0RhdGE7XG5cdFx0Ly8gTG9hZCB0aGUgaW5kZXggZm9yIHRoZSBhZGRpdGlvbmFsIGJ1aWxkaW5nIGJsb2NrcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZW1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdTZXJ2aWNlID0gYXdhaXQgb0FwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIik7XG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgdmlld0xldmVsIGZvciB0aGUgY29tcG9uZW50XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHQob01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzKSB8fFxuXHRcdFx0XHR7fTtcblx0XHRcdGNvbnN0IG1OYXZpZ2F0aW9uID0gb0NvbXBvbmVudC5nZXROYXZpZ2F0aW9uKCkgfHwge307XG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMoXG5cdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKG1OYXZpZ2F0aW9uLCBtT3V0Ym91bmRzLCBjb252ZXJ0ZWRNZXRhZGF0YSwgc1N0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGRlZmluaXRpb25Db250ZXh0ID0gbmV3IERlZmluaXRpb25Db250ZXh0KGNvbnZlcnRlZE1ldGFkYXRhKTtcblx0XHRcdGRlZmluaXRpb25Db250ZXh0LmFkZEFwcGxpY2F0aW9uTWFuaWZlc3Qob01hbmlmZXN0Q29udGVudCBhcyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUpO1xuXG5cdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8/LnZpZXdMZXZlbCxcblx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0/LmNvbnRlbnREZW5zaXRpZXMsXG5cdFx0XHRcdHJlc291cmNlTW9kZWw6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdGlzRGVza3RvcDogRGV2aWNlLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRpc1Bob25lOiBEZXZpY2Uuc3lzdGVtLnBob25lLFxuXHRcdFx0XHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZVxuXHRcdFx0fTtcblx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHRtVmlld0RhdGEgPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnkuc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0dGhpcy5wYWdlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1WaWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChvQXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0Y29uc3Qgc2FwZmVNYW5pZmVzdENvbnRlbnQgPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0XHRcdG1WaWV3RGF0YS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID0gc2FwZmVNYW5pZmVzdENvbnRlbnQ/LmZvcm1cblx0XHRcdFx0PyBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdG9WaWV3RGF0YU1vZGVsID0gbmV3IEpTT05Nb2RlbChtVmlld0RhdGEpO1xuXHRcdFx0aWYgKG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNBbm5vdGF0aW9uUGF0aCBpbiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiW1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RhcmdldEFubm90YXRpb25QYXRoID0gcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uKHNBbm5vdGF0aW9uUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0XHRtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc1RhcmdldEFubm90YXRpb25QYXRoXSA9IG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzQW5ub3RhdGlvblBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvUGFnZU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwoKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFnbm9zdGljcyA9IG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnZlcnRlclBhZ2VNb2RlbCA9IFRlbXBsYXRlQ29udmVydGVyLmNvbnZlcnRQYWdlKFxuXHRcdFx0XHRcdFx0c0NvbnZlcnRlclR5cGUsXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0bVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1WaWV3RGF0YSBhcyB1bmtub3duIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzLCBvQXBwQ29tcG9uZW50KSxcblx0XHRcdFx0XHRcdG9EaWFnbm9zdGljcyxcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCksXG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob0NvbnZlcnRlclBhZ2VNb2RlbCAmJiBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpKSB7XG5cdFx0XHRcdFx0XHQob0NvbnZlcnRlclBhZ2VNb2RlbCBhcyB7IGNvbnRyb2xsZXJOYW1lPzogc3RyaW5nIH0pLmNvbnRyb2xsZXJOYW1lID0gb0NvbXBvbmVudC5fZ2V0Q29udHJvbGxlck5hbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUlzc3VlcyA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKTtcblx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRpZiAoYUFkZGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gdGhpcy5fZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQgPSB7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEgPyBvVmlld0RhdGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgOiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGRldmljZTogb0RldmljZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBvVmlld0RhdGFNb2RlbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGdldENvbnZlcnRlZE1ldGFkYXRhOiAoKSA9PiBjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dCB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uRm9yUGFnZSgpOiBEZWZpbml0aW9uUGFnZSB7XG5cdFx0XHRcdFx0XHRsZXQgZnVsbENvbnRleHRQYXRoID0gc0Z1bGxDb250ZXh0UGF0aDtcblx0XHRcdFx0XHRcdGlmIChmdWxsQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aCA9IGZ1bGxDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgZnVsbENvbnRleHRQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmluaXRpb25Db250ZXh0LmdldFBhZ2VGb3IoZnVsbENvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR2aWV3SWQ6IHNTdGFibGVJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlld1NldHRpbmdzID0gdGhpcy5fZ2V0Vmlld1NldHRpbmdzKFxuXHRcdFx0XHRcdHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncyxcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0b1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldFByZXByb2Nlc3NvckNvbnRleHQocHJlcHJvY2Vzc29yQ29udGV4dCk7XG5cdFx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpXG5cblx0XHRcdFx0XHQudGhlbigob1ZpZXc6IFZpZXcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXdKU09OTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuZW5oYW5jZVZpZXdKU09OTW9kZWwodmlld0pTT05Nb2RlbCBhcyBKU09OTW9kZWwgJiB7IF9nZXRPYmplY3Q6IEZ1bmN0aW9uIH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbCh2aWV3SlNPTk1vZGVsLCBcIiR2aWV3XCIpO1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbChvVmlld0RhdGFNb2RlbCwgXCJ2aWV3RGF0YVwiKTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goYXN5bmMgKHJlYXNvbjogRXJyb3IpID0+XG5cdFx0XHRcdFx0XHR0aGlzLl9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncy5lcnJvclZpZXdOYW1lIHx8IFwic2FwLmZlLmNvcmUuc2VydmljZXMudmlldy5UZW1wbGF0aW5nRXJyb3JQYWdlXCIsXG5cdFx0XHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHNDYWNoZUtleVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQuY2F0Y2goKGUpID0+IExvZy5lcnJvcihlLm1lc3NhZ2UsIGUpKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB2aWV3IDogJHtlcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9lbmhhbmNlTmF2aWdhdGlvbkNvbmZpZyhcblx0XHRtTmF2aWdhdGlvbjogUmVjb3JkPHN0cmluZywgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24+LFxuXHRcdG1PdXRib3VuZHM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdFx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHN0YWJsZUlkOiBzdHJpbmdcblx0KTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb24pLmZvckVhY2goZnVuY3Rpb24gKG5hdmlnYXRpb25PYmplY3RLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3QgbmF2aWdhdGlvbk9iamVjdCA9IG1OYXZpZ2F0aW9uW25hdmlnYXRpb25PYmplY3RLZXldO1xuXHRcdFx0bGV0IG91dGJvdW5kQ29uZmlnO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuZGV0YWlsICYmIG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5KSB7XG5cdFx0XHRcdHJlZ2lzdGVyVmlydHVhbFByb3BlcnR5KFxuXHRcdFx0XHRcdGNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHRcdFwicm91dGVOYXZpZ2FibGUtXCIgKyBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5yb3V0ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZUJpbmRpbmdTdHJpbmcobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwuYXZhaWxhYmlsaXR5ISk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzdGFibGVJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuY3JlYXRlICYmIG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdKSB7XG5cdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF07XG5cdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRGdWxsUGF0aFRvRW50aXR5U2V0KGFTcGxpdFBhdGg6IHN0cmluZ1tdLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFTcGxpdFBhdGgucmVkdWNlKGZ1bmN0aW9uIChzUGF0aFNvRmFyOiBzdHJpbmcsIHNOZXh0UGF0aFBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0XHRpZiAoc05leHRQYXRoUGFydCA9PT0gXCJcIikge1xuXHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdH1cblx0XHRcdGlmIChzUGF0aFNvRmFyID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoU29GYXIgPSBgLyR7c05leHRQYXRoUGFydH1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRoU29GYXJ9LyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7c05leHRQYXRoUGFydH1gKTtcblx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgT2JqZWN0LmtleXMob1RhcmdldCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHNQYXRoU29GYXIgKz0gXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzUGF0aFNvRmFyICs9IGAvJHtzTmV4dFBhdGhQYXJ0fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHR9LCBcIlwiKTtcblx0fVxuXG5cdGdldFZpZXcoKTogVmlldyB7XG5cdFx0cmV0dXJuIHRoaXMub1ZpZXc7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogVGVtcGxhdGVkVmlld1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0ZXhpdCgpOiB2b2lkIHtcblx0XHQvLyBEZXJlZ2lzdGVyIGdsb2JhbCBpbnN0YW5jZVxuXHRcdGlmICh0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSkge1xuXHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSkge1xuXHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHRoaXMub0ZhY3RvcnkucmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTtcblx0fVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIFNlcnZpY2VGYWN0b3J5PFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0X29JbnN0YW5jZVJlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBUZW1wbGF0ZWRWaWV3U2VydmljZT4gPSB7fTtcblxuXHRzdGF0aWMgaUNyZWF0aW5nVmlld3M6IDA7XG5cblx0YXN5bmMgY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPik6IFByb21pc2U8VGVtcGxhdGVkVmlld1NlcnZpY2U+IHtcblx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MrKztcblx0XHRjb25zdCBvVGVtcGxhdGVkVmlld1NlcnZpY2UgPSBuZXcgVGVtcGxhdGVkVmlld1NlcnZpY2UoT2JqZWN0LmFzc2lnbih7IGZhY3Rvcnk6IHRoaXMgfSwgb1NlcnZpY2VDb250ZXh0KSk7XG5cdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZS5pbml0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cy0tO1xuXHRcdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZTtcblx0XHR9KTtcblx0fVxuXG5cdHJlbW92ZUdsb2JhbEluc3RhbmNlKCk6IHZvaWQge1xuXHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5ID0ge307XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNvbXBvbmVudCBkYXRhIHNwZWNpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgJ1NoYXJlJyBidXR0b24gYW5kIHJldHVybnMgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiB0aGUgdmlzaWJpbGl0eS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBTcGVjaWZpZXMgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSBhcyB0cnVlIG9yIGZhbHNlIGJhc2VkIHdoZXRoZXIgdGhlICdTaGFyZScgYnV0dG9uIHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdFxuXHQgKi9cblx0c3RhdGljIGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eUZvck15SW5ib3goYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb21wb25lbnREYXRhOiBDb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRpZiAoY29tcG9uZW50RGF0YSAhPT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudCkge1xuXHRcdFx0cmV0dXJuIGNvbXBvbmVudERhdGEuZmVFbnZpcm9ubWVudC5nZXRTaGFyZUNvbnRyb2xWaXNpYmlsaXR5KCk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3M7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBwYWdlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBwYWdlIGlkZW50aWZpZWQgYnkgaXRzIElELlxuXHQgKiBAcGFyYW0gbWFuaWZlc3QgVGhlIG1hbmlmZXN0IGNvbnRlbnQgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuXHQgKiBAcGFyYW0gdmlld0RhdGEgVGhlIHZpZXcgZGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2aWV3LlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBwYWdlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYWdlIGZvciB3aGljaCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYXJlIHRvIGJlIGFwcGxpZWQuXG5cdCAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHZpZXcgZGF0YSBvYmplY3QgcmVmbGVjdGluZyB0aGUgYXBwbGllZCBjaGFuZ2VzLlxuXHQgKi9cblx0c3RhdGljIHNldFBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhcblx0XHRtYW5pZmVzdDogTWFuaWZlc3RDb250ZW50LFxuXHRcdHZpZXdEYXRhOiBWaWV3RGF0YSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRwYWdlSWQ6IHN0cmluZ1xuXHQpOiBWaWV3RGF0YSB7XG5cdFx0Y29uc3QgdGFyZ2V0cyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzID8/IHt9O1xuXHRcdGxldCByZWFsVGFyZ2V0ID0gXCJcIjtcblx0XHRmb3IgKGNvbnN0IHRhcmdldFRvRmluZCBpbiB0YXJnZXRzKSB7XG5cdFx0XHRpZiAodGFyZ2V0c1t0YXJnZXRUb0ZpbmRdLmlkID09PSBwYWdlSWQpIHtcblx0XHRcdFx0cmVhbFRhcmdldCA9IHRhcmdldFRvRmluZDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChyZWFsVGFyZ2V0ID09PSBcIlwiKSB7XG5cdFx0XHRyZWFsVGFyZ2V0ID0gcGFnZUlkO1xuXHRcdH1cblx0XHRjb25zdCBhY3R1YWxTZXR0aW5ncyA9IG1hbmlmZXN0Py5bXCJzYXAudWk1XCJdPy5yb3V0aW5nPy50YXJnZXRzPy5bcmVhbFRhcmdldF0/Lm9wdGlvbnM/LnNldHRpbmdzIHx8IHt9O1xuXHRcdHJldHVybiBhcHBseVBhZ2VDb25maWd1cmF0aW9uQ2hhbmdlcyhhY3R1YWxTZXR0aW5ncywgdmlld0RhdGEsIGFwcENvbXBvbmVudCwgcGFnZUlkKTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztNQXFHYUEsb0JBQW9CLDBCQUFBQyxRQUFBO0lBQUEsU0FBQUQscUJBQUE7TUFBQSxPQUFBQyxRQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0lBQUFDLFFBQUEsQ0FBQUosb0JBQUEsR0FBQUEsb0JBQUE7SUFBQUssY0FBQSxDQUFBTCxvQkFBQSxFQUFBQyxRQUFBO0lBQUEsSUFBQUssTUFBQSxHQUFBTixvQkFBQSxDQUFBTyxTQUFBO0lBQUFELE1BQUEsQ0FxQmhDRSxJQUFJLEdBQUosU0FBQUEsSUFBSUEsQ0FBQSxFQUFTO01BQ1osTUFBTUMsb0JBQW9CLEdBQUcsRUFBRTtNQUMvQixNQUFNQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxVQUFVLENBQUMsQ0FBQztNQUNsQyxNQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBVztNQUN2QyxNQUFNQyxhQUFhLEdBQUdDLFdBQVcs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
|
|
496
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsIl9TZXJ2aWNlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiaW5pdCIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwidmlld1ByZWxvYWRlclNlcnZpY2UiLCJnZXRWaWV3UHJlbG9hZGVyU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYWdlSWQiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsIkxvY2FsaXphdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsImlzQ2FjaGVSZWFkeSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlZlcnNpb25JbmZvIiwibG9hZCIsIm9JbmZvIiwic1RpbWVzdGFtcCIsImxpYnJhcmllcyIsIkNvcmUiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicmVxdWlyZURlcGVuZGVuY2llcyIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsInJlZnJlc2hWaWV3Iiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJkZXN0cm95Iiwib1ZpZXciLCJyZXNvdXJjZU1vZGVsIiwic3RhYmxlSWQiLCJnZXRVSUFyZWEiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJfZ2V0Vmlld1NldHRpbmdzIiwicHJlcHJvY2Vzc29yQ29udGV4dCIsIm1TZXJ2aWNlU2V0dGluZ3MiLCJtVmlld0RhdGEiLCJvUGFnZU1vZGVsIiwidmlld1R5cGUiLCJnZXRWaWV3VHlwZSIsInVuZGVmaW5lZCIsInR5cGUiLCJwcmVwcm9jZXNzb3JzIiwieG1sIiwiY29udHJvbHMiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJ2aWV3RGF0YSIsImNhY2hlIiwia2V5cyIsImFkZGl0aW9uYWxEYXRhIiwiZ2V0QWRkaXRpb25hbENhY2hlRGF0YSIsImdldERhdGEiLCJzZXRBZGRpdGlvbmFsQ2FjaGVEYXRhIiwidmFsdWUiLCJzZXREYXRhIiwibW9kZWxzIiwiaGVpZ2h0IiwiX2NyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm9WaWV3U2V0dGluZ3MiLCJtZXNzYWdlIiwiSlNPTk1vZGVsIiwiY29udHJvbGxlciIsInJ1bkFzT3duZXIiLCJWaWV3IiwiY3JlYXRlIiwic2V0TW9kZWwiLCJzZXRBZ2dyZWdhdGlvbiIsImdldENvbnRyb2xsZXIiLCJnZXRQbGFjZWhvbGRlciIsImhpZGVSb290UGxhY2Vob2xkZXIiLCJzQ29udmVydGVyVHlwZSIsImNvbnZlcnRlclR5cGUiLCJzRnVsbENvbnRleHRQYXRoIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsIm9wdGlvbnMiLCJmdWxsQ29udGV4dFBhdGgiLCJjb21wb25lbnRDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZW5kc1dpdGgiLCJvTWFuaWZlc3RDb250ZW50IiwiZ2V0TWFuaWZlc3QiLCJvRGV2aWNlTW9kZWwiLCJEZXZpY2UiLCJzZXREZWZhdWx0QmluZGluZ01vZGUiLCJvTWFuaWZlc3RNb2RlbCIsIm9WaWV3RGF0YU1vZGVsIiwib1JvdXRpbmdTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnIiwiZGVmaW5pdGlvbkNvbnRleHQiLCJEZWZpbml0aW9uQ29udGV4dCIsImFkZEFwcGxpY2F0aW9uTWFuaWZlc3QiLCJuYXZpZ2F0aW9uIiwidmlld0xldmVsIiwiY29udGVudERlbnNpdGllcyIsImlzRGVza3RvcCIsInN5c3RlbSIsImRlc2t0b3AiLCJpc1Bob25lIiwicGhvbmUiLCJUZW1wbGF0ZVR5cGUiLCJGcmVlU3R5bGVQYWdlIiwiZ2V0Vmlld0RhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJzZXRQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMiLCJpc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3giLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHlGb3JNeUluYm94Iiwib1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5Iiwic2FwZmVNYW5pZmVzdENvbnRlbnQiLCJzYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJmb3JtIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJzQW5ub3RhdGlvblBhdGgiLCJpbmNsdWRlcyIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiTWFuaWZlc3RXcmFwcGVyIiwiX2dldENvbnRyb2xsZXJOYW1lIiwiY29udHJvbGxlck5hbWUiLCJhSXNzdWVzIiwiYUFkZGVkSXNzdWVzIiwic2xpY2UiLCJ3YXJuaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJfZ2V0RnVsbFBhdGhUb0VudGl0eVNldCIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiY29udGV4dFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0Iiwibm9SZXNvbHZlIiwiZGV2aWNlIiwibWFuaWZlc3QiLCJnZXRDb252ZXJ0ZWRNZXRhZGF0YSIsImdldERlZmluaXRpb25Db250ZXh0IiwiZ2V0RGVmaW5pdGlvbkZvclBhZ2UiLCJzdWJzdHJpbmciLCJnZXRQYWdlRm9yIiwidmlld0lkIiwidWlNb2RlbCIsImludGVybmFsTW9kZWwiLCJwYXRoIiwic2V0UHJvcGVydHkiLCJjb2xsYWJvcmF0aW9uIiwidGFyZ2V0VUlNb2RlbENvbnRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsInNldFByZXByb2Nlc3NvckNvbnRleHQiLCJ2aWV3SlNPTk1vZGVsIiwiTW9kZWxIZWxwZXIiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsImhpZGVWaWV3RHVyaW5nQ3JlYXRpb24iLCJzZXRWaXNpYmxlIiwiZWFnZXJWaWV3Q3JlYXRpb24iLCJzZXRUaW1lb3V0IiwibmF2TmFtZSIsInJvdXRpbmdUYXJnZXRzIiwiX2dldFJvdXRlSW5mb3JtYXRpb24iLCJkZXRhaWwiLCJyb3V0ZSIsInRhcmdldHNXaXRoSW5mbyIsInJvdXRpbmdUYXJnZXQiLCJyb3V0aW5nVGFyZ2V0TmFtZSIsIm5hbWUiLCJyb3V0ZXJUYXJnZXQiLCJnZXRSb3V0ZXIiLCJnZXRUYXJnZXQiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRSb290Q29udHJvbGxlciIsInNldFJvb3RDb250cm9sbGVyIiwiZXJyb3JWaWV3TmFtZSIsImUiLCJFcnJvciIsImNvbnZlcnRlZFR5cGVzIiwibmF2aWdhdGlvbk9iamVjdEtleSIsIm5hdmlnYXRpb25PYmplY3QiLCJvdXRib3VuZENvbmZpZyIsIm91dGJvdW5kIiwib3V0Ym91bmREZXRhaWwiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtZXRlcnMiLCJhdmFpbGFiaWxpdHkiLCJyZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwicmVkdWNlIiwic1BhdGhTb0ZhciIsInNOZXh0UGF0aFBhcnQiLCJvVGFyZ2V0IiwiZ2V0T2JqZWN0IiwiZ2V0VmlldyIsImdldEludGVyZmFjZSIsImV4aXQiLCJyZW1vdmVHbG9iYWxJbnN0YW5jZSIsIlNlcnZpY2UiLCJfU2VydmljZUZhY3RvcnkiLCJfdGhpcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImNhbGwiLCJfb0luc3RhbmNlUmVnaXN0cnkiLCJfcHJvdG8yIiwib1NlcnZpY2VDb250ZXh0IiwiaUNyZWF0aW5nVmlld3MiLCJvVGVtcGxhdGVkVmlld1NlcnZpY2UiLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsImZlRW52aXJvbm1lbnQiLCJnZXRTaGFyZUNvbnRyb2xWaXNpYmlsaXR5IiwiZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSIsInRhcmdldHMiLCJyb3V0aW5nIiwicmVhbFRhcmdldCIsInRhcmdldFRvRmluZCIsImFjdHVhbFNldHRpbmdzIiwiYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU0FQSlNPTlNjaGVtYUZvcldlYkFwcGxpY2F0aW9uTWFuaWZlc3RGaWxlIH0gZnJvbSBcIkB1aTUvbWFuaWZlc3QvdHlwZXMvbWFuaWZlc3RcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IExvY2FsaXphdGlvbiBmcm9tIFwic2FwL2Jhc2UvaTE4bi9Mb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IHJlc29sdmVCaW5kaW5nU3RyaW5nIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24sIFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFN1cnZleUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUge1xuXHRCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0Q29udGVudERlbnNpdGllc1R5cGUsXG5cdENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRNYW5pZmVzdEFjdGlvbixcblx0TWFuaWZlc3RIZWFkZXJGYWNldCxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIF9NZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZWdpc3RlclZpcnR1YWxQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgKiBhcyBfVGVtcGxhdGVDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlUmVjb3JkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvblBhZ2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZGVmaW5pdGlvbi9GRURlZmluaXRpb25cIjtcbmltcG9ydCB7IERlZmluaXRpb25Db250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyByZXF1aXJlRGVwZW5kZW5jaWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTG9hZGVyVXRpbHNcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlQYWdlQ29uZmlndXJhdGlvbkNoYW5nZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvbWFuaWZlc3RNZXJnZXIvQ2hhbmdlUGFnZUNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgdHlwZSBIaWVyYWNoeU1vZGUgYXMgQnJlYWRjcnVtYnNIaWVyYWNoeU1vZGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9CcmVhZGNydW1ic1wiO1xuaW1wb3J0IHR5cGUgeyBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eSB9IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RDb250ZW50LCBNYW5pZmVzdE91dGJvdW5kRW50cnksIFNoYXJlT3B0aW9ucyB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7XG5cdHZpZXdUeXBlPzogc3RyaW5nO1xuXHR2aWV3TmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgVmlld1NldHRpbmdzID0gUGFyYW1ldGVyczx0eXBlb2YgVmlldy5jcmVhdGU+WzBdICYgeyBjYWNoZTogdW5rbm93bjsgbW9kZWxzOiB1bmtub3duOyBoZWlnaHQ6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVmlld0RhdGEgPSB7XG5cdGJyZWFkY3J1bWJzSGllcmFyY2h5TW9kZT86IEJyZWFkY3J1bWJzSGllcmFjaHlNb2RlO1xuXHRmY2xFbmFibGVkPzogYm9vbGVhbjtcblx0ZWRpdGFibGVIZWFkZXJDb250ZW50PzogYm9vbGVhbjtcblx0aGlkZUZpbHRlckJhcj86IGJvb2xlYW47XG5cdHVzZUhpZGRlbkZpbHRlckJhcj86IGJvb2xlYW47XG5cdHNlY3Rpb25MYXlvdXQ/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM/OiBSZWNvcmQ8c3RyaW5nLCBTZW1hbnRpY09iamVjdD47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRuYXZpZ2F0aW9uOiBvYmplY3Q7XG5cdHZpZXdMZXZlbDogbnVtYmVyO1xuXHR2YXJpYW50TWFuYWdlbWVudD86IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0c3RhYmxlSWQ6IHN0cmluZztcblx0Y29udGVudERlbnNpdGllcz86IENvbnRlbnREZW5zaXRpZXNUeXBlO1xuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsO1xuXHRmdWxsQ29udGV4dFBhdGg6IHN0cmluZztcblx0aXNEZXNrdG9wOiBib29sZWFuO1xuXHRpc1Bob25lOiBib29sZWFuO1xuXHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGU7XG5cdHNoZWxsQ29udGVudERlbnNpdHk/OiBzdHJpbmc7XG5cdHVzZU5ld0xhenlMb2FkaW5nPzogYm9vbGVhbjtcblx0aW5pdGlhbExvYWQ/OiBzdHJpbmc7XG5cdGxpdmVNb2RlPzogYm9vbGVhbjtcblx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdD86IGJvb2xlYW47XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZT86IHVua25vd247XG5cdGVudGl0eVNldD86IHN0cmluZztcblx0aXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94PzogYm9vbGVhbjtcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cdHNoYXJlPzogU2hhcmVPcHRpb25zO1xuXHRzaGFyZU92ZXJmbG93UHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0c2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24/OiBNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl07XG5cdGNvbnRlbnQ/OiB7XG5cdFx0ZmVlZGJhY2s/OiB7IGFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+OyBzdGFuZGFyZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBTdXJ2ZXlDb25maWc+IH07XG5cdFx0aGVhZGVyPzoge1xuXHRcdFx0ZmFjZXRzPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0SGVhZGVyRmFjZXQ+O1xuXHRcdFx0YWN0aW9ucz86IENvbmZpZ3VyYWJsZVJlY29yZDxNYW5pZmVzdEFjdGlvbj47XG5cdFx0fTtcblx0XHRmb290ZXI/OiB7XG5cdFx0XHRhY3Rpb25zPzogQ29uZmlndXJhYmxlUmVjb3JkPE1hbmlmZXN0QWN0aW9uPjtcblx0XHR9O1xuXHR9O1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8dm9pZD47XG5cblx0b1ZpZXchOiBGRVZpZXc7XG5cblx0b1Jlc291cmNlTW9kZWxTZXJ2aWNlITogUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cblx0b0NhY2hlSGFuZGxlclNlcnZpY2UhOiBDYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXG5cdG9GYWN0b3J5ITogVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5O1xuXG5cdHJlc291cmNlTW9kZWwhOiBSZXNvdXJjZU1vZGVsO1xuXG5cdHN0YWJsZUlkITogc3RyaW5nO1xuXG5cdHBhZ2VJZCE6IHN0cmluZztcblxuXHRUZW1wbGF0ZUNvbnZlcnRlcj86IHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXI7XG5cblx0TWV0YU1vZGVsQ29udmVydGVyPzogdHlwZW9mIF9NZXRhTW9kZWxDb252ZXJ0ZXI7XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBhU2VydmljZURlcGVuZGVuY2llcyA9IFtdO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0NvbXBvbmVudCk7XG5cdFx0Y29uc3Qgdmlld1ByZWxvYWRlclNlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFZpZXdQcmVsb2FkZXJTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0dGhpcy5wYWdlSWQgPSBvQXBwQ29tcG9uZW50LmdldExvY2FsSWQob0NvbXBvbmVudC5nZXRJZCgpKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3Qgc1N0YWJsZUlkID0gYCR7b0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKX06OiR7dGhpcy5wYWdlSWR9YDtcblx0XHRjb25zdCBhRW5oYW5jZUkxOG4gPSBvQ29tcG9uZW50LmdldEVuaGFuY2VJMThuKCkgfHwgW107XG5cdFx0bGV0IHNBcHBOYW1lc3BhY2U7XG5cdFx0dGhpcy5vRmFjdG9yeSA9IG9Db250ZXh0LmZhY3Rvcnk7XG5cdFx0aWYgKGFFbmhhbmNlSTE4bikge1xuXHRcdFx0c0FwcE5hbWVzcGFjZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbmhhbmNlSTE4bi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHQvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRleHQtdmVydGljYWxpemF0aW9uIGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBwYXNzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gVUk1IHRha2VzIGNhcmUgb2YgdGV4dC12ZXJ0aWNhbGl6YXRpb24gZm9yIHJlc291cmNlIG1vZGVscyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBIZW5jZSBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gaWYgc28gdGhpcyBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBlbmhhbmNlIHRoZSBzYXAuZmUgcmVzb3VyY2UgbW9kZWwgc28gcGFzcyBpdCBhcyBpdCBpc1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoYUVuaGFuY2VJMThuW2ldKTtcblx0XHRcdFx0aWYgKG9SZXNvdXJjZU1vZGVsICYmIG9SZXNvdXJjZU1vZGVsLmlzQShcInNhcC51aS5tb2RlbC5yZXNvdXJjZS5SZXNvdXJjZU1vZGVsXCIpKSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gYCR7c0FwcE5hbWVzcGFjZX0uJHthRW5oYW5jZUkxOG5baV0ucmVwbGFjZShcIi5wcm9wZXJ0aWVzXCIsIFwiXCIpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgc0NhY2hlSWRlbnRpZmllciA9IGAke29BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9XyR7c1N0YWJsZUlkfV8ke0xvY2FsaXphdGlvbi5nZXRMYW5ndWFnZVRhZygpfWA7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuUmVzb3VyY2VNb2RlbFNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzY29wZVR5cGU6IFwiY29tcG9uZW50XCIsXG5cdFx0XHRcdFx0c2NvcGVPYmplY3Q6IG9Db21wb25lbnQsXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdGJ1bmRsZXM6IFtcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIl0sXG5cdFx0XHRcdFx0XHRlbmhhbmNlSTE4bjogYUVuaGFuY2VJMThuLFxuXHRcdFx0XHRcdFx0bW9kZWxOYW1lOiBcInNhcC5mZS5pMThuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvUmVzb3VyY2VNb2RlbFNlcnZpY2U6IFJlc291cmNlTW9kZWxTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgPSBvUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXNvdXJjZU1vZGVsU2VydmljZS5nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0U2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpXG5cdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0NvbXBvbmVudFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oYXN5bmMgKG9DYWNoZUhhbmRsZXJTZXJ2aWNlOiBDYWNoZUhhbmRsZXJTZXJ2aWNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdmlld1ByZWxvYWRlclNlcnZpY2UuaXNDYWNoZVJlYWR5KCk7XG5cdFx0XHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSA9IG9DYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVyU2VydmljZS52YWxpZGF0ZUNhY2hlS2V5KHNDYWNoZUlkZW50aWZpZXIsIG9Db21wb25lbnQsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0VmVyc2lvbkluZm8ubG9hZCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvSW5mbykge1xuXHRcdFx0XHRcdGxldCBzVGltZXN0YW1wID0gXCJcIjtcblx0XHRcdFx0XHRpZiAoIW9JbmZvLmxpYnJhcmllcykge1xuXHRcdFx0XHRcdFx0c1RpbWVzdGFtcCA9IChDb3JlIGFzIHsgYnVpbGRpbmZvPzogeyBidWlsZHRpbWU/OiBzdHJpbmcgfSB9KT8uYnVpbGRpbmZvPy5idWlsZHRpbWUgPz8gXCI8Tk9WQUxVRT5cIjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0luZm8ubGlicmFyaWVzLmZvckVhY2goZnVuY3Rpb24gKG9MaWJyYXJ5KSB7XG5cdFx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgKz0gb0xpYnJhcnkuYnVpbGRUaW1lc3RhbXA7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHNUaW1lc3RhbXA7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5hbGwoYVNlcnZpY2VEZXBlbmRlbmNpZXMpXG5cdFx0XHQudGhlbihhc3luYyAoYURlcGVuZGVuY2llc1Jlc3VsdDogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZU1vZGVsID0gYURlcGVuZGVuY2llc1Jlc3VsdFswXSBhcyBSZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdIGFzIHN0cmluZyB8IG51bGw7XG5cdFx0XHRcdGNvbnN0IFtUZW1wbGF0ZUNvbnZlcnRlciwgTWV0YU1vZGVsQ29udmVydGVyXSA9IGF3YWl0IHJlcXVpcmVEZXBlbmRlbmNpZXMoW1xuXHRcdFx0XHRcdFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiLFxuXHRcdFx0XHRcdFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIlxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyhcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRzU3RhYmxlSWQsXG5cdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdFRlbXBsYXRlQ29udmVydGVyIGFzIHR5cGVvZiBfVGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyIGFzIHR5cGVvZiBfTWV0YU1vZGVsQ29udmVydGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNDYWNoZUtleTogc3RyaW5nIHwgdm9pZCB8IG51bGwpOiB2b2lkIHtcblx0XHRcdFx0Y29uc3Qgb0NhY2hlSGFuZGxlclNlcnZpY2UgPSBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIikuZ2V0SW5zdGFuY2Uob01ldGFNb2RlbCk7XG5cdFx0XHRcdG9DYWNoZUhhbmRsZXJTZXJ2aWNlLmludmFsaWRhdGVJZk5lZWRlZChcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0c0NhY2hlSWRlbnRpZmllcixcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBpbmRpY2F0aW5nIHdoZW4gdGhlIHZpZXcgaXMgcmVmcmVzaGVkXG5cdCAqL1xuXHRhc3luYyByZWZyZXNoVmlldyhvQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Sb290VmlldyA9IG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRpZiAob1Jvb3RWaWV3KSB7XG5cdFx0XHRvUm9vdFZpZXcuZGVzdHJveSgpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5vVmlldykge1xuXHRcdFx0dGhpcy5vVmlldy5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZVZpZXcodGhpcy5yZXNvdXJjZU1vZGVsLCB0aGlzLnN0YWJsZUlkLCBcIlwiLCB0aGlzLlRlbXBsYXRlQ29udmVydGVyISwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIhKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvQ29tcG9uZW50LmdldFVJQXJlYSgpLmludmFsaWRhdGUoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdG9Db21wb25lbnQuZ2V0VUlBcmVhKCkuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRMb2cuZXJyb3Iob0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9nZXRWaWV3U2V0dGluZ3MoXG5cdFx0cHJlcHJvY2Vzc29yQ29udGV4dDogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCxcblx0XHRtU2VydmljZVNldHRpbmdzOiBUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzLFxuXHRcdG9Db21wb25lbnQ6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pixcblx0XHRtVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRcdHNDYWNoZUtleTogc3RyaW5nIHwgbnVsbCxcblx0XHRvUGFnZU1vZGVsOiBKU09OTW9kZWwsXG5cdFx0b1Jlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcblx0KTogVmlld1NldHRpbmdzIHtcblx0XHRsZXQgdmlld1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG1TZXJ2aWNlU2V0dGluZ3Mudmlld1R5cGUgfHwgb0NvbXBvbmVudC5nZXRWaWV3VHlwZSgpIHx8IFwiWE1MXCI7XG5cdFx0aWYgKHZpZXdUeXBlICE9PSBcIlhNTFwiKSB7XG5cdFx0XHR2aWV3VHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6IHZpZXdUeXBlLFxuXHRcdFx0cHJlcHJvY2Vzc29yczoge1xuXHRcdFx0XHR4bWw6IHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdGNvbnRyb2xzOiB7fVxuXHRcdFx0fSxcblx0XHRcdGlkOiBtVmlld0RhdGEuc3RhYmxlSWQsXG5cdFx0XHR2aWV3TmFtZTogbVNlcnZpY2VTZXR0aW5ncy52aWV3TmFtZSB8fCBvQ29tcG9uZW50LmdldFZpZXdOYW1lPy4oKSxcblx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEsXG5cdFx0XHRjYWNoZToge1xuXHRcdFx0XHRrZXlzOiBbc0NhY2hlS2V5XSxcblx0XHRcdFx0YWRkaXRpb25hbERhdGE6IHtcblx0XHRcdFx0XHQvLyBXZSBzdG9yZSB0aGUgcGFnZSBtb2RlbCBkYXRhIGluIHRoZSBgYWRkaXRpb25hbERhdGFgIG9mIHRoZSB2aWV3IGNhY2hlLCB0aGlzIHdheSBpdCBpcyBhbHdheXMgaW4gc3luY1xuXHRcdFx0XHRcdGdldEFkZGl0aW9uYWxDYWNoZURhdGE6ICgpOiB1bmtub3duID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvUGFnZU1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHNldEFkZGl0aW9uYWxDYWNoZURhdGE6ICh2YWx1ZTogb2JqZWN0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRvUGFnZU1vZGVsLnNldERhdGEodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcInNhcC5mZS5pMThuXCI6IG9SZXNvdXJjZU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0aGVpZ2h0OiBcIjEwMCVcIlxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBfY3JlYXRlRXJyb3JQYWdlKFxuXHRcdHJlYXNvbjogRXJyb3IsXG5cdFx0b1ZpZXdTZXR0aW5nczogVmlld1NldHRpbmdzLFxuXHRcdHZpZXdOYW1lOiBzdHJpbmcsXG5cdFx0b0NvbXBvbmVudDogVGVtcGxhdGVDb21wb25lbnQsXG5cdFx0c0NhY2hlS2V5OiBzdHJpbmcgfCBudWxsXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Ly8ganVzdCByZXBsYWNlIHRoZSB2aWV3IG5hbWUgYW5kIGEgbW9kZWwgY29udGFpbmluZyB0aGUgcmVhc29uLCBidXQga2VlcCB0aGUgb3RoZXIgc2V0dGluZ3Ncblx0XHRMb2cuZXJyb3IocmVhc29uLm1lc3NhZ2UsIHJlYXNvbik7XG5cdFx0b1ZpZXdTZXR0aW5ncy52aWV3TmFtZSA9IHZpZXdOYW1lO1xuXHRcdGlmIChvVmlld1NldHRpbmdzLnByZXByb2Nlc3NvcnMpIHtcblx0XHRcdChvVmlld1NldHRpbmdzLnByZXByb2Nlc3NvcnMgYXMgUmVjb3JkPHN0cmluZywgeyBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiB9PikueG1sLm1vZGVsc1tcImVycm9yXCJdID0gbmV3IEpTT05Nb2RlbChyZWFzb24pO1xuXHRcdH1cblx0XHRkZWxldGUgb1ZpZXdTZXR0aW5ncy5jYWNoZTtcblx0XHRvVmlld1NldHRpbmdzLmlkICs9IFwiLUVycm9yXCI7XG5cdFx0b1ZpZXdTZXR0aW5ncy52aWV3RGF0YS5zdGFibGVJZCArPSBcIi1FcnJvclwiO1xuXHRcdGRlbGV0ZSBvVmlld1NldHRpbmdzLmNvbnRyb2xsZXI7XG5cblx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKGFzeW5jICgpID0+IHtcblx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLm9WaWV3ID0gb1ZpZXcgYXMgRkVWaWV3O1xuXHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBKU09OTW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0b0NvbXBvbmVudC5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Q29udHJvbCgpLmdldENvbnRyb2xsZXIoKS5nZXRQbGFjZWhvbGRlcigpLmhpZGVSb290UGxhY2Vob2xkZXIoKTtcblx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdH0pO1xuXHRcdH0pIGFzIFByb21pc2U8c3RyaW5nPjtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZVZpZXcoXG5cdFx0b1Jlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0c1N0YWJsZUlkOiBzdHJpbmcsXG5cdFx0c0NhY2hlS2V5OiBzdHJpbmcgfCBudWxsLFxuXHRcdFRlbXBsYXRlQ29udmVydGVyOiB0eXBlb2YgX1RlbXBsYXRlQ29udmVydGVyLFxuXHRcdE1ldGFNb2RlbENvbnZlcnRlcjogdHlwZW9mIF9NZXRhTW9kZWxDb252ZXJ0ZXJcblx0KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdm9pZD4ge1xuXHRcdHRoaXMucmVzb3VyY2VNb2RlbCA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdHRoaXMuc3RhYmxlSWQgPSBzU3RhYmxlSWQ7XG5cdFx0dGhpcy5UZW1wbGF0ZUNvbnZlcnRlciA9IFRlbXBsYXRlQ29udmVydGVyO1xuXHRcdHRoaXMuTWV0YU1vZGVsQ29udmVydGVyID0gTWV0YU1vZGVsQ29udmVydGVyO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3QgbVNlcnZpY2VTZXR0aW5ncyA9IG9Db250ZXh0LnNldHRpbmdzO1xuXHRcdGNvbnN0IHNDb252ZXJ0ZXJUeXBlID0gbVNlcnZpY2VTZXR0aW5ncy5jb252ZXJ0ZXJUeXBlO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29tcG9uZW50KTtcblx0XHRsZXQgc0Z1bGxDb250ZXh0UGF0aDogc3RyaW5nID1cblx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KT8ub3B0aW9ucz8uc2V0dGluZ3M/LmZ1bGxDb250ZXh0UGF0aCA/PyBcIlwiO1xuXHRcdGlmICghc0Z1bGxDb250ZXh0UGF0aCkge1xuXHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgcGF0aCBjb3VsZG4ndCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcm91dGluZyBzZXJ2aWNlLCB0cnkgdG8gZ2V0IGl0IGZyb20gdGhlIGNvbXBvbmVudCBpdHNlbGZcblx0XHRcdGNvbnN0IGNvbXBvbmVudENvbnRleHRQYXRoID0gb0NvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpO1xuXHRcdFx0aWYgKGNvbXBvbmVudENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPSBjb21wb25lbnRDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikgPyBjb21wb25lbnRDb250ZXh0UGF0aCA6IGAke2NvbXBvbmVudENvbnRleHRQYXRofS9gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTWFuaWZlc3RDb250ZW50ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoRGV2aWNlKS5zZXREZWZhdWx0QmluZGluZ01vZGUoXCJPbmVXYXlcIik7XG5cdFx0Y29uc3Qgb01hbmlmZXN0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9NYW5pZmVzdENvbnRlbnQpO1xuXHRcdGxldCBvUGFnZU1vZGVsOiBUZW1wbGF0ZU1vZGVsLCBvVmlld0RhdGFNb2RlbDogTW9kZWwsIG1WaWV3RGF0YTogVmlld0RhdGE7XG5cdFx0Ly8gTG9hZCB0aGUgaW5kZXggZm9yIHRoZSBhZGRpdGlvbmFsIGJ1aWxkaW5nIGJsb2NrcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZW1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdTZXJ2aWNlID0gYXdhaXQgb0FwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIik7XG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgdmlld0xldmVsIGZvciB0aGUgY29tcG9uZW50XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHQob01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzKSB8fFxuXHRcdFx0XHR7fTtcblx0XHRcdGNvbnN0IG1OYXZpZ2F0aW9uID0gb0NvbXBvbmVudC5nZXROYXZpZ2F0aW9uKCkgfHwge307XG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IE1ldGFNb2RlbENvbnZlcnRlci5jb252ZXJ0VHlwZXMoXG5cdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKG1OYXZpZ2F0aW9uLCBtT3V0Ym91bmRzLCBjb252ZXJ0ZWRNZXRhZGF0YSwgc1N0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGRlZmluaXRpb25Db250ZXh0ID0gbmV3IERlZmluaXRpb25Db250ZXh0KGNvbnZlcnRlZE1ldGFkYXRhKTtcblx0XHRcdGRlZmluaXRpb25Db250ZXh0LmFkZEFwcGxpY2F0aW9uTWFuaWZlc3Qob01hbmlmZXN0Q29udGVudCBhcyBTQVBKU09OU2NoZW1hRm9yV2ViQXBwbGljYXRpb25NYW5pZmVzdEZpbGUpO1xuXG5cdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8/LnZpZXdMZXZlbCxcblx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0/LmNvbnRlbnREZW5zaXRpZXMsXG5cdFx0XHRcdHJlc291cmNlTW9kZWw6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdGlzRGVza3RvcDogRGV2aWNlLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRpc1Bob25lOiBEZXZpY2Uuc3lzdGVtLnBob25lLFxuXHRcdFx0XHRjb252ZXJ0ZXJUeXBlOiBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZVxuXHRcdFx0fTtcblx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHRtVmlld0RhdGEgPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnkuc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnQsXG5cdFx0XHRcdFx0bVZpZXdEYXRhLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0dGhpcy5wYWdlSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1WaWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPSBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChvQXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0Y29uc3Qgc2FwZmVNYW5pZmVzdENvbnRlbnQgPSBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdO1xuXHRcdFx0bVZpZXdEYXRhLnNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXTtcblx0XHRcdG1WaWV3RGF0YS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID0gc2FwZmVNYW5pZmVzdENvbnRlbnQ/LmZvcm1cblx0XHRcdFx0PyBzYXBmZU1hbmlmZXN0Q29udGVudD8uZm9ybT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdG9WaWV3RGF0YU1vZGVsID0gbmV3IEpTT05Nb2RlbChtVmlld0RhdGEpO1xuXHRcdFx0aWYgKG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNBbm5vdGF0aW9uUGF0aCBpbiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluY2x1ZGVzKFwiW1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RhcmdldEFubm90YXRpb25QYXRoID0gcmVzb2x2ZUR5bmFtaWNFeHByZXNzaW9uKHNBbm5vdGF0aW9uUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0XHRtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc1RhcmdldEFubm90YXRpb25QYXRoXSA9IG1WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbltzQW5ub3RhdGlvblBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvUGFnZU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwoKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFnbm9zdGljcyA9IG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKTtcblx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnZlcnRlclBhZ2VNb2RlbCA9IFRlbXBsYXRlQ29udmVydGVyLmNvbnZlcnRQYWdlKFxuXHRcdFx0XHRcdFx0c0NvbnZlcnRlclR5cGUsXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0bVZpZXdEYXRhIGFzIHVua25vd24gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1WaWV3RGF0YSBhcyB1bmtub3duIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzLCBvQXBwQ29tcG9uZW50KSxcblx0XHRcdFx0XHRcdG9EaWFnbm9zdGljcyxcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCksXG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAob0NvbnZlcnRlclBhZ2VNb2RlbCAmJiBvQ29tcG9uZW50Ll9nZXRDb250cm9sbGVyTmFtZSgpKSB7XG5cdFx0XHRcdFx0XHQob0NvbnZlcnRlclBhZ2VNb2RlbCBhcyB7IGNvbnRyb2xsZXJOYW1lPzogc3RyaW5nIH0pLmNvbnRyb2xsZXJOYW1lID0gb0NvbXBvbmVudC5fZ2V0Q29udHJvbGxlck5hbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUlzc3VlcyA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKTtcblx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRpZiAoYUFkZGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gdGhpcy5fZ2V0RnVsbFBhdGhUb0VudGl0eVNldChhU3BsaXRQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IHByZXByb2Nlc3NvckNvbnRleHQ6IFhNTFByZXByb2Nlc3NvckNvbnRleHQgPSB7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVsbENvbnRleHRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEgPyBvVmlld0RhdGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgOiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGRldmljZTogb0RldmljZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRcdHZpZXdEYXRhOiBvVmlld0RhdGFNb2RlbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGdldENvbnZlcnRlZE1ldGFkYXRhOiAoKSA9PiBjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dCB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGVmaW5pdGlvbkNvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXREZWZpbml0aW9uRm9yUGFnZSgpOiBEZWZpbml0aW9uUGFnZSB7XG5cdFx0XHRcdFx0XHRsZXQgZnVsbENvbnRleHRQYXRoID0gc0Z1bGxDb250ZXh0UGF0aDtcblx0XHRcdFx0XHRcdGlmIChmdWxsQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aCA9IGZ1bGxDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgZnVsbENvbnRleHRQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmluaXRpb25Db250ZXh0LmdldFBhZ2VGb3IoZnVsbENvbnRleHRQYXRoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHR2aWV3SWQ6IHNTdGFibGVJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlld1NldHRpbmdzID0gdGhpcy5fZ2V0Vmlld1NldHRpbmdzKFxuXHRcdFx0XHRcdHByZXByb2Nlc3NvckNvbnRleHQsXG5cdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncyxcblx0XHRcdFx0XHRvQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRzQ2FjaGVLZXksXG5cdFx0XHRcdFx0b1BhZ2VNb2RlbCBhcyB1bmtub3duIGFzIEpTT05Nb2RlbCxcblx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHQpO1xuXHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChvUGFnZU1vZGVsIGFzIHVua25vd24gYXMgSlNPTk1vZGVsLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKG9WaWV3RGF0YU1vZGVsLCBcInZpZXdEYXRhXCIpO1xuXHRcdFx0Y29uc3QgdWlNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbCh1aU1vZGVsLCBcInVpXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChpbnRlcm5hbE1vZGVsLCBcImludGVybmFsXCIpO1xuXHRcdFx0b0NvbXBvbmVudC5zZXRNb2RlbChpbnRlcm5hbE1vZGVsLCBcInBhZ2VJbnRlcm5hbFwiKTtcblx0XHRcdGNvbnN0IHBhdGggPSBgL3BhZ2VzLyR7b1ZpZXdTZXR0aW5ncy5pZH1gO1xuXHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShwYXRoLCB7XG5cdFx0XHRcdGNvbnRyb2xzOiB7fVxuXHRcdFx0fSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KHBhdGgsIHtcblx0XHRcdFx0Y29udHJvbHM6IHt9LFxuXHRcdFx0XHRjb2xsYWJvcmF0aW9uOiB7fVxuXHRcdFx0fSk7XG5cdFx0XHRsZXQgdGFyZ2V0VUlNb2RlbENvbnRleHQgPSBcIi9cIjtcblx0XHRcdGlmIChvQ29tcG9uZW50LmlzQTxDb250cm9sPihcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5Db21wb25lbnRcIikpIHtcblx0XHRcdFx0dGFyZ2V0VUlNb2RlbENvbnRleHQgPSBgLyR7b1ZpZXdTZXR0aW5ncy5pZH1gO1xuXHRcdFx0fVxuXHRcdFx0b0NvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dCh1aU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHRhcmdldFVJTW9kZWxDb250ZXh0KSwgXCJ1aVwiKTtcblx0XHRcdG9Db21wb25lbnQuc2V0QmluZGluZ0NvbnRleHQoaW50ZXJuYWxNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChwYXRoKSwgXCJpbnRlcm5hbFwiKTtcblxuXHRcdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIHByb3ZpZGUgaXQgYWxzbyBwYWdlSW50ZXJuYWwgYXMgc29tZSBtYWNyb3MgYWNjZXNzIGl0IC0gdG8gYmUgcmVtb3ZlZFxuXHRcdFx0b0NvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dChpbnRlcm5hbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHBhdGgpLCBcInBhZ2VJbnRlcm5hbFwiKTtcblx0XHRcdG9Db21wb25lbnQuc2V0UHJlcHJvY2Vzc29yQ29udGV4dChwcmVwcm9jZXNzb3JDb250ZXh0KTtcblx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gVmlldy5jcmVhdGUob1ZpZXdTZXR0aW5ncylcblxuXHRcdFx0XHRcdC50aGVuKChvVmlldzogVmlldykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3IGFzIEZFVmlldztcblxuXHRcdFx0XHRcdFx0Y29uc3Qgdmlld0pTT05Nb2RlbCA9IG5ldyBKU09OTW9kZWwodGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5lbmhhbmNlVmlld0pTT05Nb2RlbCh2aWV3SlNPTk1vZGVsIGFzIEpTT05Nb2RlbCAmIHsgX2dldE9iamVjdDogRnVuY3Rpb24gfSk7XG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKHZpZXdKU09OTW9kZWwsIFwiJHZpZXdcIik7XG5cblx0XHRcdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50LmhpZGVWaWV3RHVyaW5nQ3JlYXRpb24gJiYgb0NvbXBvbmVudC5pc0E8Q29udHJvbD4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuQ29tcG9uZW50XCIpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50LmVhZ2VyVmlld0NyZWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgbmF2TmFtZSBpbiBtTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm91dGluZ1RhcmdldHMgPSBvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRSb3V0aW5nU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5fZ2V0Um91dGVJbmZvcm1hdGlvbihtTmF2aWdhdGlvbltuYXZOYW1lXS5kZXRhaWwucm91dGUpPy50YXJnZXRzV2l0aEluZm87XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGluZ1RhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCByb3V0aW5nVGFyZ2V0IG9mIHJvdXRpbmdUYXJnZXRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm91dGluZ1RhcmdldE5hbWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJvdXRpbmdUYXJnZXQgPT09IFwic3RyaW5nXCIgPyByb3V0aW5nVGFyZ2V0IDogcm91dGluZ1RhcmdldC5uYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJvdXRlclRhcmdldCA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0VGFyZ2V0KHJvdXRpbmdUYXJnZXROYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyVGFyZ2V0ICYmICFBcnJheS5pc0FycmF5KHJvdXRlclRhcmdldCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChyb3V0ZXJUYXJnZXQgYXMgdW5rbm93biBhcyB7IGxvYWQ6IEZ1bmN0aW9uIH0pLmxvYWQocm91dGluZ1RhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LCAyMDAwKTsgLy8gRGVsYXkgYSBiaXQgdG8gbm90IGJsb2NrIHRoZSBpbml0aWFsIHJlbmRlcmluZ1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGFzeW5jIChyZWFzb246IEVycm9yKSA9PiB7XG5cdFx0XHRcdFx0XHRvQ29tcG9uZW50LmdldFJvb3RDb250cm9sbGVyKCk/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0Um9vdENvbnRyb2xsZXIoKTtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9jcmVhdGVFcnJvclBhZ2UoXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyxcblx0XHRcdFx0XHRcdFx0bVNlcnZpY2VTZXR0aW5ncy5lcnJvclZpZXdOYW1lIHx8IFwic2FwLmZlLmNvcmUuc2VydmljZXMudmlldy5UZW1wbGF0aW5nRXJyb3JQYWdlXCIsXG5cdFx0XHRcdFx0XHRcdG9Db21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHNDYWNoZUtleVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZSkgPT4gTG9nLmVycm9yKGUubWVzc2FnZSwgZSkpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcigoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHZpZXcgOiAke2Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX2VuaGFuY2VOYXZpZ2F0aW9uQ29uZmlnKFxuXHRcdG1OYXZpZ2F0aW9uOiBSZWNvcmQ8c3RyaW5nLCBOYXZpZ2F0aW9uQ29uZmlndXJhdGlvbj4sXG5cdFx0bU91dGJvdW5kczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RPdXRib3VuZEVudHJ5Pixcblx0XHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdFx0c3RhYmxlSWQ6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyhtTmF2aWdhdGlvbikuZm9yRWFjaChmdW5jdGlvbiAobmF2aWdhdGlvbk9iamVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uT2JqZWN0ID0gbU5hdmlnYXRpb25bbmF2aWdhdGlvbk9iamVjdEtleV07XG5cdFx0XHRsZXQgb3V0Ym91bmRDb25maWc7XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwgJiYgbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF0pIHtcblx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXTtcblx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5hdmFpbGFiaWxpdHkpIHtcblx0XHRcdFx0cmVnaXN0ZXJWaXJ0dWFsUHJvcGVydHkoXG5cdFx0XHRcdFx0Y29udmVydGVkVHlwZXMsXG5cdFx0XHRcdFx0XCJyb3V0ZU5hdmlnYWJsZS1cIiArIG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLnJvdXRlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlQmluZGluZ1N0cmluZyhuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5hdmFpbGFiaWxpdHkhKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHN0YWJsZUlkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5jcmVhdGUgJiYgbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF0pIHtcblx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kXTtcblx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX2dldEZ1bGxQYXRoVG9FbnRpdHlTZXQoYVNwbGl0UGF0aDogc3RyaW5nW10sIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYVNwbGl0UGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHNQYXRoU29GYXI6IHN0cmluZywgc05leHRQYXRoUGFydDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdGlmIChzTmV4dFBhdGhQYXJ0ID09PSBcIlwiKSB7XG5cdFx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQYXRoU29GYXIgPT09IFwiXCIpIHtcblx0XHRcdFx0c1BhdGhTb0ZhciA9IGAvJHtzTmV4dFBhdGhQYXJ0fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGhTb0Zhcn0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtzTmV4dFBhdGhQYXJ0fWApO1xuXHRcdFx0XHRpZiAob1RhcmdldCAmJiBPYmplY3Qua2V5cyhvVGFyZ2V0KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNQYXRoU29GYXIgKz0gYC8ke3NOZXh0UGF0aFBhcnR9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdH0sIFwiXCIpO1xuXHR9XG5cblx0Z2V0VmlldygpOiBWaWV3IHtcblx0XHRyZXR1cm4gdGhpcy5vVmlldztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBUZW1wbGF0ZWRWaWV3U2VydmljZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRleGl0KCk6IHZvaWQge1xuXHRcdC8vIERlcmVnaXN0ZXIgZ2xvYmFsIGluc3RhbmNlXG5cdFx0aWYgKHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0dGhpcy5vRmFjdG9yeS5yZW1vdmVHbG9iYWxJbnN0YW5jZSgpO1xuXHR9XG59XG5leHBvcnQgY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRfb0luc3RhbmNlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlZFZpZXdTZXJ2aWNlPiA9IHt9O1xuXG5cdHN0YXRpYyBpQ3JlYXRpbmdWaWV3czogMDtcblxuXHRhc3luYyBjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+KTogUHJvbWlzZTxUZW1wbGF0ZWRWaWV3U2VydmljZT4ge1xuXHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cysrO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZWRWaWV3U2VydmljZSA9IG5ldyBUZW1wbGF0ZWRWaWV3U2VydmljZShPYmplY3QuYXNzaWduKHsgZmFjdG9yeTogdGhpcyB9LCBvU2VydmljZUNvbnRleHQpKTtcblx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlLmluaXRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzLS07XG5cdFx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlO1xuXHRcdH0pO1xuXHR9XG5cblx0cmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fb0luc3RhbmNlUmVnaXN0cnkgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY29tcG9uZW50IGRhdGEgc3BlY2lmaWVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAnU2hhcmUnIGJ1dHRvbiBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFNwZWNpZmllcyB0aGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIGFzIHRydWUgb3IgZmFsc2UgYmFzZWQgd2hldGhlciB0aGUgJ1NoYXJlJyBidXR0b24gc2hvdWxkIGJlIHZpc2libGUgb3Igbm90XG5cdCAqL1xuXHRzdGF0aWMgZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Rm9yTXlJbmJveChhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNvbXBvbmVudERhdGE6IENvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGlmIChjb21wb25lbnREYXRhICE9PSB1bmRlZmluZWQgJiYgY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50KSB7XG5cdFx0XHRyZXR1cm4gY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldFNoYXJlQ29udHJvbFZpc2liaWxpdHkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHN0YXRpYyBnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHBhZ2UgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGZvciBhIHNwZWNpZmljIHBhZ2UgaWRlbnRpZmllZCBieSBpdHMgSUQuXG5cdCAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgbWFuaWZlc3QgY29udGVudCBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGRldGFpbHMuXG5cdCAqIEBwYXJhbSB2aWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpZXcuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHBhZ2VJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBhZ2UgZm9yIHdoaWNoIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhcmUgdG8gYmUgYXBwbGllZC5cblx0ICogQHJldHVybnMgVGhlIHVwZGF0ZWQgdmlldyBkYXRhIG9iamVjdCByZWZsZWN0aW5nIHRoZSBhcHBsaWVkIGNoYW5nZXMuXG5cdCAqL1xuXHRzdGF0aWMgc2V0UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKFxuXHRcdG1hbmlmZXN0OiBNYW5pZmVzdENvbnRlbnQsXG5cdFx0dmlld0RhdGE6IFZpZXdEYXRhLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHBhZ2VJZDogc3RyaW5nXG5cdCk6IFZpZXdEYXRhIHtcblx0XHRjb25zdCB0YXJnZXRzID0gbWFuaWZlc3Q/LltcInNhcC51aTVcIl0/LnJvdXRpbmc/LnRhcmdldHMgPz8ge307XG5cdFx0bGV0IHJlYWxUYXJnZXQgPSBcIlwiO1xuXHRcdGZvciAoY29uc3QgdGFyZ2V0VG9GaW5kIGluIHRhcmdldHMpIHtcblx0XHRcdGlmICh0YXJnZXRzW3RhcmdldFRvRmluZF0uaWQgPT09IHBhZ2VJZCkge1xuXHRcdFx0XHRyZWFsVGFyZ2V0ID0gdGFyZ2V0VG9GaW5kO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHJlYWxUYXJnZXQgPT09IFwiXCIpIHtcblx0XHRcdHJlYWxUYXJnZXQgPSBwYWdlSWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdHVhbFNldHRpbmdzID0gbWFuaWZlc3Q/LltcInNhcC51aTVcIl0/LnJvdXRpbmc/LnRhcmdldHM/LltyZWFsVGFyZ2V0XT8ub3B0aW9ucz8uc2V0dGluZ3MgfHwge307XG5cdFx0cmV0dXJuIGFwcGx5UGFnZUNvbmZpZ3VyYXRpb25DaGFuZ2VzKGFjdHVhbFNldHRpbmdzLCB2aWV3RGF0YSwgYXBwQ29tcG9uZW50LCBwYWdlSWQpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O01BdUdhQSxvQkFBb0IsMEJBQUFDLFFBQUE7SUFBQSxTQUFBRCxxQkFBQTtNQUFBLE9BQUFDLFFBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0lBQUE7SUFBQUMsUUFBQSxDQUFBSixvQkFBQSxHQUFBQSxvQkFBQTtJQUFBSyxjQUFBLENBQUFMLG9CQUFBLEVBQUFDLFFBQUE7SUFBQSxJQUFBSyxNQUFBLEdBQUFOLG9CQUFBLENBQUFPLFNBQUE7SUFBQUQsTUFBQSxDQXFCaENFLElBQUksR0FBSixTQUFBQSxJQUFJQSxDQUFBLEVBQVM7TUFDWixNQUFNQyxvQkFBb0IsR0FBRyxFQUFFO01BQy9CLE1BQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDO01BQ2xDLE1BQU1DLFVBQVUsR0FBR0YsUUFBUSxDQUFDRyxXQUFXO01BQ3ZDLE1BQU1DLGFBQWEsR0FBR0MsV0FBVyxDQUFDQyxlQUFlLENBQUNKLFVBQVUsQ0FBQztNQUM3RCxNQUFNSyxvQkFBb0IsR0FBR0gsYUFBYSxDQUFDSSx1QkFBdUIsQ0FBQyxDQUFDO01BQ3BFLE1BQU1DLFVBQVUsR0FBR0wsYUFBYSxDQUFDTSxZQUFZLENBQUMsQ0FBQztNQUMvQyxJQUFJLENBQUNDLE1BQU0sR0FBR1AsYUFBYSxDQUFDUSxVQUFVLENBQUNWLFVBQVUsQ0FBQ1csS0FBSyxDQUFDLENBQUMsQ0FBVztNQUNwRSxNQUFNQyxTQUFTLEdBQUcsR0FBR1YsYUFBYSxDQUFDVyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssSUFBSSxD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
|
|
@@ -6,6 +6,7 @@ import { resolveBindingString } from "sap/fe/base/BindingToolkit";
|
|
|
6
6
|
import type { EnhanceWithUI5 } from "sap/fe/base/ClassSupport";
|
|
7
7
|
import type AppComponent from "sap/fe/core/AppComponent";
|
|
8
8
|
import type { ComponentData } from "sap/fe/core/AppComponent";
|
|
9
|
+
import type { FEView } from "sap/fe/core/BaseController";
|
|
9
10
|
import type { SemanticObject } from "sap/fe/core/CommonUtils";
|
|
10
11
|
import CommonUtils from "sap/fe/core/CommonUtils";
|
|
11
12
|
import type ResourceModel from "sap/fe/core/ResourceModel";
|
|
@@ -37,6 +38,7 @@ import { type HierachyMode as BreadcrumbsHierachyMode } from "sap/fe/macros/Brea
|
|
|
37
38
|
import type { OverflowToolbarPriority } from "sap/m/library";
|
|
38
39
|
import Device from "sap/ui/Device";
|
|
39
40
|
import VersionInfo from "sap/ui/VersionInfo";
|
|
41
|
+
import type Control from "sap/ui/core/Control";
|
|
40
42
|
import Core from "sap/ui/core/Core";
|
|
41
43
|
import type { ManifestContent, ManifestOutboundEntry, ShareOptions } from "sap/ui/core/Manifest";
|
|
42
44
|
import View from "sap/ui/core/mvc/View";
|
|
@@ -102,7 +104,7 @@ export type ViewData = {
|
|
|
102
104
|
export class TemplatedViewService extends Service<TemplatedViewServiceSettings> {
|
|
103
105
|
initPromise!: Promise<void>;
|
|
104
106
|
|
|
105
|
-
oView!:
|
|
107
|
+
oView!: FEView;
|
|
106
108
|
|
|
107
109
|
oResourceModelService!: ResourceModelService;
|
|
108
110
|
|
|
@@ -301,10 +303,14 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
|
|
|
301
303
|
if (oViewSettings.preprocessors) {
|
|
302
304
|
(oViewSettings.preprocessors as Record<string, { models: Record<string, Model> }>).xml.models["error"] = new JSONModel(reason);
|
|
303
305
|
}
|
|
306
|
+
delete oViewSettings.cache;
|
|
307
|
+
oViewSettings.id += "-Error";
|
|
308
|
+
oViewSettings.viewData.stableId += "-Error";
|
|
309
|
+
delete oViewSettings.controller;
|
|
304
310
|
|
|
305
311
|
return oComponent.runAsOwner(async () => {
|
|
306
312
|
return View.create(oViewSettings).then((oView: View) => {
|
|
307
|
-
this.oView = oView;
|
|
313
|
+
this.oView = oView as FEView;
|
|
308
314
|
this.oView.setModel(new JSONModel(this.oView), "$view");
|
|
309
315
|
oComponent.setAggregation("rootControl", this.oView);
|
|
310
316
|
oComponent.getAppComponent().getRootControl().getController().getPlaceholder().hideRootPlaceholder();
|
|
@@ -333,7 +339,10 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
|
|
|
333
339
|
oAppComponent.getRoutingService().getTargetInformationFor(oComponent)?.options?.settings?.fullContextPath ?? "";
|
|
334
340
|
if (!sFullContextPath) {
|
|
335
341
|
// if the context path couldn't be retrieved from the routing service, try to get it from the component itself
|
|
336
|
-
|
|
342
|
+
const componentContextPath = oComponent.getContextPath();
|
|
343
|
+
if (componentContextPath) {
|
|
344
|
+
sFullContextPath = componentContextPath.endsWith("/") ? componentContextPath : `${componentContextPath}/`;
|
|
345
|
+
}
|
|
337
346
|
}
|
|
338
347
|
const oMetaModel = oAppComponent.getMetaModel();
|
|
339
348
|
const oManifestContent = oAppComponent.getManifest();
|
|
@@ -476,28 +485,78 @@ export class TemplatedViewService extends Service<TemplatedViewServiceSettings>
|
|
|
476
485
|
);
|
|
477
486
|
// Setting the pageModel on the component for potential reuse
|
|
478
487
|
oComponent.setModel(oPageModel as unknown as JSONModel, "_pageModel");
|
|
488
|
+
oComponent.setModel(oViewDataModel, "viewData");
|
|
489
|
+
const uiModel = oAppComponent.getModel("ui");
|
|
490
|
+
const internalModel = oAppComponent.getModel("internal") as JSONModel;
|
|
491
|
+
oComponent.setModel(uiModel, "ui");
|
|
492
|
+
oComponent.setModel(internalModel, "internal");
|
|
493
|
+
oComponent.setModel(internalModel, "pageInternal");
|
|
494
|
+
const path = `/pages/${oViewSettings.id}`;
|
|
495
|
+
uiModel.setProperty(path, {
|
|
496
|
+
controls: {}
|
|
497
|
+
});
|
|
498
|
+
internalModel.setProperty(path, {
|
|
499
|
+
controls: {},
|
|
500
|
+
collaboration: {}
|
|
501
|
+
});
|
|
502
|
+
let targetUIModelContext = "/";
|
|
503
|
+
if (oComponent.isA<Control>("sap.fe.templates.ListReport.Component")) {
|
|
504
|
+
targetUIModelContext = `/${oViewSettings.id}`;
|
|
505
|
+
}
|
|
506
|
+
oComponent.setBindingContext(uiModel.createBindingContext(targetUIModelContext), "ui");
|
|
507
|
+
oComponent.setBindingContext(internalModel.createBindingContext(path), "internal");
|
|
508
|
+
|
|
509
|
+
// for the time being provide it also pageInternal as some macros access it - to be removed
|
|
510
|
+
oComponent.setBindingContext(internalModel.createBindingContext(path), "pageInternal");
|
|
479
511
|
oComponent.setPreprocessorContext(preprocessorContext);
|
|
480
512
|
return oComponent.runAsOwner(async () => {
|
|
481
513
|
return View.create(oViewSettings)
|
|
482
514
|
|
|
483
515
|
.then((oView: View) => {
|
|
484
|
-
this.oView = oView;
|
|
516
|
+
this.oView = oView as FEView;
|
|
517
|
+
|
|
485
518
|
const viewJSONModel = new JSONModel(this.oView);
|
|
486
519
|
ModelHelper.enhanceViewJSONModel(viewJSONModel as JSONModel & { _getObject: Function });
|
|
487
|
-
|
|
488
|
-
|
|
520
|
+
oComponent.setModel(viewJSONModel, "$view");
|
|
521
|
+
|
|
522
|
+
if (oAppComponent.hideViewDuringCreation && oComponent.isA<Control>("sap.fe.templates.ObjectPage.Component")) {
|
|
523
|
+
this.oView.setVisible(false);
|
|
524
|
+
}
|
|
525
|
+
|
|
489
526
|
oComponent.setAggregation("rootControl", this.oView);
|
|
527
|
+
if (oAppComponent.eagerViewCreation) {
|
|
528
|
+
setTimeout(() => {
|
|
529
|
+
for (const navName in mNavigation) {
|
|
530
|
+
const routingTargets = oAppComponent
|
|
531
|
+
.getRoutingService()
|
|
532
|
+
._getRouteInformation(mNavigation[navName].detail.route)?.targetsWithInfo;
|
|
533
|
+
if (routingTargets) {
|
|
534
|
+
for (const routingTarget of routingTargets) {
|
|
535
|
+
const routingTargetName =
|
|
536
|
+
typeof routingTarget === "string" ? routingTarget : routingTarget.name;
|
|
537
|
+
const routerTarget = oAppComponent.getRouter().getTarget(routingTargetName);
|
|
538
|
+
if (routerTarget && !Array.isArray(routerTarget)) {
|
|
539
|
+
(routerTarget as unknown as { load: Function }).load(routingTarget);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}, 2000); // Delay a bit to not block the initial rendering
|
|
545
|
+
}
|
|
546
|
+
|
|
490
547
|
return sCacheKey;
|
|
491
548
|
})
|
|
492
|
-
.catch(async (reason: Error) =>
|
|
493
|
-
|
|
549
|
+
.catch(async (reason: Error) => {
|
|
550
|
+
oComponent.getRootController()?.destroy();
|
|
551
|
+
oComponent.setRootController();
|
|
552
|
+
return this._createErrorPage(
|
|
494
553
|
reason,
|
|
495
554
|
oViewSettings,
|
|
496
555
|
mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage",
|
|
497
556
|
oComponent,
|
|
498
557
|
sCacheKey
|
|
499
|
-
)
|
|
500
|
-
)
|
|
558
|
+
);
|
|
559
|
+
})
|
|
501
560
|
.catch((e) => Log.error(e.message, e));
|
|
502
561
|
});
|
|
503
562
|
} catch (error: unknown) {
|