@sapui5/sap.fe.templates 1.100.0 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +123 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -1
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1111 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +134 -137
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +443 -428
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +478 -514
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -9
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1530 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +1 -1
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -9
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +4 -4
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +851 -817
  72. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  74. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  76. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  78. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  79. package/src/sap/fe/templates/TableScroller.js +45 -53
  80. package/src/sap/fe/templates/TableScroller.ts +48 -0
  81. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  82. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  83. package/src/sap/fe/templates/library.js +49 -63
  84. package/src/sap/fe/templates/library.ts +57 -0
  85. package/src/sap/fe/templates/messagebundle.properties +19 -7
  86. package/src/sap/fe/templates/messagebundle_ar.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  88. package/src/sap/fe/templates/messagebundle_ca.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  90. package/src/sap/fe/templates/messagebundle_cy.properties +6 -2
  91. package/src/sap/fe/templates/messagebundle_da.properties +6 -2
  92. package/src/sap/fe/templates/messagebundle_de.properties +6 -2
  93. package/src/sap/fe/templates/messagebundle_el.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  95. package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -2
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +6 -2
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +6 -2
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +6 -2
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +6 -2
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +6 -2
  104. package/src/sap/fe/templates/messagebundle_hi.properties +6 -2
  105. package/src/sap/fe/templates/messagebundle_hr.properties +6 -2
  106. package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
  107. package/src/sap/fe/templates/messagebundle_id.properties +6 -2
  108. package/src/sap/fe/templates/messagebundle_it.properties +6 -2
  109. package/src/sap/fe/templates/messagebundle_iw.properties +6 -2
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +6 -2
  112. package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
  113. package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
  114. package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
  115. package/src/sap/fe/templates/messagebundle_ms.properties +6 -2
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +6 -2
  118. package/src/sap/fe/templates/messagebundle_pl.properties +6 -2
  119. package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
  120. package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
  121. package/src/sap/fe/templates/messagebundle_ro.properties +6 -2
  122. package/src/sap/fe/templates/messagebundle_ru.properties +6 -2
  123. package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
  124. package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
  125. package/src/sap/fe/templates/messagebundle_sl.properties +6 -2
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +6 -2
  128. package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
  129. package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
  130. package/src/sap/fe/templates/messagebundle_vi.properties +6 -2
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +6 -2
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +6 -2
@@ -1,820 +1,854 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/base/Log",
9
- "sap/ui/model/json/JSONModel",
10
- "./RootContainerBaseController",
11
- "sap/f/FlexibleColumnLayoutSemanticHelper",
12
- "sap/ui/core/Component",
13
- "sap/fe/core/helpers/KeepAliveHelper",
14
- "sap/fe/core/controllerextensions/ViewState",
15
- "sap/m/Link",
16
- "sap/m/MessagePage",
17
- "sap/m/MessageBox"
18
- ],
19
- function(
20
- Log,
21
- JSONModel,
22
- BaseController,
23
- FlexibleColumnLayoutSemanticHelper,
24
- Component,
25
- KeepAliveHelper,
26
- ViewState,
27
- Link,
28
- MessagePage,
29
- MessageBox
30
- ) {
31
- "use strict";
32
-
33
- var CONSTANTS = {
34
- page: {
35
- names: ["BeginColumn", "MidColumn", "EndColumn"],
36
- currentGetter: {
37
- prefix: "getCurrent",
38
- suffix: "Page"
39
- },
40
- getter: {
41
- prefix: "get",
42
- suffix: "Pages"
43
- }
44
- }
45
- };
46
-
47
- var _getViewFromContainer = function(oContainer) {
48
- if (oContainer.isA("sap.ui.core.ComponentContainer")) {
49
- return oContainer.getComponentInstance().getRootControl();
50
- } else {
51
- return oContainer;
52
- }
53
- };
54
-
55
- /**
56
- * @class Application developers should use this controller for the sap.fe.templates.RootContainer.view.Fcl view.
57
- *
58
- * This controller and its associated view provide the entry point for your application when using the flexible column layout in SAP Fiori elements.
59
- * When used, you should declare a sap.f.routing.Router as `router` in your application manifest.
60
- *
61
- * @hideconstructor
62
- * @public
63
- * @name sap.fe.templates.RootContainer.controller.Fcl
64
- */
65
- return BaseController.extend("sap.fe.templates.RootContainer.controller.Fcl", {
66
- viewState: ViewState.override({
67
- applyInitialStateOnly: function() {
68
- return false;
69
- },
70
- adaptBindingRefreshControls: function(aControls) {
71
- this.getView()
72
- .getController()
73
- ._getAllVisibleViews()
74
- .forEach(function(oChildView) {
75
- var pChildView = new Promise(function(resolve) {
76
- resolve(oChildView);
77
- });
78
- aControls.push(pChildView);
79
- });
80
- },
81
- adaptStateControls: function(aStateControls) {
82
- this.getView()
83
- .getController()
84
- ._getAllVisibleViews()
85
- .forEach(function(oChildView) {
86
- var pChildView = new Promise(function(resolve) {
87
- resolve(oChildView);
88
- });
89
- aStateControls.push(pChildView);
90
- });
91
- },
92
- onRestore: function() {
93
- var oView = this.getView(),
94
- oNavContainer = oView.byId("appContent");
95
- var oFCLController = this.getView().getController();
96
- var oInternalModel = oNavContainer.getModel("internal");
97
- var oPages = oInternalModel.getProperty("/pages");
98
-
99
- for (var sComponentId in oPages) {
100
- oInternalModel.setProperty("/pages/" + sComponentId + "/restoreStatus", "pending");
101
- }
102
- oFCLController.onContainerReady();
103
- },
104
- onSuspend: function() {
105
- var oFCLController = this.getView().getController();
106
- var oFCLControl = oFCLController.getFclControl();
107
- var aBeginColumnPages = oFCLControl.getBeginColumnPages() || [];
108
- var aMidColumnPages = oFCLControl.getMidColumnPages() || [];
109
- var aEndColumnPages = oFCLControl.getEndColumnPages() || [];
110
- var aPages = [].concat(aBeginColumnPages, aMidColumnPages, aEndColumnPages);
111
-
112
- aPages.forEach(function(oPage) {
113
- var oTargetView = _getViewFromContainer(oPage);
114
-
115
- var oController = oTargetView && oTargetView.getController();
116
- if (oController && oController.viewState && oController.viewState.onSuspend) {
117
- return oController.viewState.onSuspend();
118
- }
119
- });
120
- }
121
- }),
122
-
123
- /**
124
- * @private
125
- * @name sap.fe.templates.RootContainer.controller.Fcl.getMetadata
126
- * @function
127
- */
128
-
129
- onInit: function(oEvent) {
130
- BaseController.prototype.onInit.bind(this)();
131
-
132
- this._internalInit();
133
- },
134
-
135
- attachRouteMatchers: function() {
136
- this.getRouter().attachBeforeRouteMatched(this._getViewForNavigatedRowsComputation, this);
137
- BaseController.prototype.attachRouteMatchers.apply(this, arguments);
138
-
139
- this._internalInit();
140
-
141
- this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
142
- this.getRouter().attachRouteMatched(this.onRouteMatched, this);
143
- this.getFclControl().attachStateChange(this._saveLayout, this);
144
- },
145
-
146
- _internalInit: function() {
147
- if (this._oRouterProxy) {
148
- return; // Already initialized
149
- }
150
-
151
- this.sCurrentRouteName = "";
152
- this.sCurrentArguments = {};
153
- this.SQUERYKEYNAME = "?query";
154
-
155
- var oAppComponent = this.getAppComponent();
156
-
157
- this._oRouterProxy = oAppComponent.getRouterProxy();
158
-
159
- // Get FCL configuration in the manifest
160
- this._oFCLConfig = { maxColumnsCount: 3 };
161
- var oRoutingConfig = oAppComponent.getManifest()["sap.ui5"].routing;
162
- if (oRoutingConfig && oRoutingConfig.config) {
163
- if (oRoutingConfig.config.flexibleColumnLayout) {
164
- var oFCLManifestConfig = oRoutingConfig.config.flexibleColumnLayout;
165
-
166
- // Default layout for 2 columns
167
- if (oFCLManifestConfig.defaultTwoColumnLayoutType) {
168
- this._oFCLConfig.defaultTwoColumnLayoutType = oFCLManifestConfig.defaultTwoColumnLayoutType;
169
- }
170
-
171
- // Default layout for 3 columns
172
- if (oFCLManifestConfig.defaultThreeColumnLayoutType) {
173
- this._oFCLConfig.defaultThreeColumnLayoutType = oFCLManifestConfig.defaultThreeColumnLayoutType;
174
- }
175
-
176
- // Limit FCL to 2 columns ?
177
- if (oFCLManifestConfig.limitFCLToTwoColumns === true) {
178
- this._oFCLConfig.maxColumnsCount = 2;
179
- }
180
- }
181
- if (oRoutingConfig.config.controlAggregation) {
182
- this._oFCLConfig.defaultControlAggregation = oRoutingConfig.config.controlAggregation;
183
- }
184
- }
185
-
186
- this._initializeTargetAggregation(oAppComponent);
187
- this._initializeRoutesInformation(oAppComponent);
188
- },
189
-
190
- getFclControl: function() {
191
- return this.getView().getContent()[0];
192
- },
193
-
194
- _saveLayout: function(oEvent) {
195
- this.sPreviousLayout = oEvent.getParameters().layout;
196
- },
197
-
198
- /**
199
- * Get the additionnal view (on top of the visible views), to be able to compute the latest table navigated rows of the most right visible view after a nav back or column fullscreen.
200
- *
201
- * @function
202
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_getRightMostViewBeforeRouteMatched
203
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
204
- *
205
- */
206
-
207
- _getViewForNavigatedRowsComputation: function() {
208
- var aAllVisibleViewsBeforeRouteMatched = this._getAllVisibleViews(this.sPreviousLayout);
209
- var oRightMostViewBeforeRouteMatched = aAllVisibleViewsBeforeRouteMatched[aAllVisibleViewsBeforeRouteMatched.length - 1];
210
- var oRightMostView;
211
- var that = this;
212
- that.getRouter().attachEventOnce("routeMatched", function(oEvent) {
213
- oRightMostView = _getViewFromContainer(oEvent.getParameter("views")[oEvent.getParameter("views").length - 1]);
214
- if (oRightMostViewBeforeRouteMatched) {
215
- // Navigation forward from L2 to view level L3 (FullScreenLayout):
216
- if (oRightMostView.getViewData() && oRightMostView.getViewData().viewLevel === that._oFCLConfig.maxColumnsCount) {
217
- that.oAdditionalViewForNavRowsComputation = oRightMostView;
218
- }
219
- // Navigations backward from L3 down to L2, L1, L0 (ThreeColumn layout):
220
- if (
221
- oRightMostView.getViewData() &&
222
- oRightMostViewBeforeRouteMatched.getViewData() &&
223
- oRightMostViewBeforeRouteMatched.getViewData().viewLevel < that._oFCLConfig.maxColumnsCount &&
224
- oRightMostViewBeforeRouteMatched.getViewData() &&
225
- oRightMostViewBeforeRouteMatched.getViewData().viewLevel > oRightMostView.getViewData().viewLevel &&
226
- oRightMostView !== oRightMostViewBeforeRouteMatched
227
- ) {
228
- that.oAdditionalViewForNavRowsComputation = oRightMostViewBeforeRouteMatched;
229
- }
230
- }
231
- });
232
- },
233
-
234
- getViewForNavigatedRowsComputation: function() {
235
- return this.oAdditionalViewForNavRowsComputation;
236
- },
237
-
238
- onExit: function() {
239
- this.getRouter().detachRouteMatched(this.onRouteMatched, this);
240
- this.getRouter().detachBeforeRouteMatched(this.onBeforeRouteMatched, this);
241
- this.getFclControl().detachStateChange(this.onStateChanged, this);
242
- this.getFclControl().detachAfterEndColumnNavigate(this.onStateChanged, this);
243
- this._oTargetsAggregation = null;
244
- this._oTargetsFromRoutePattern = null;
245
-
246
- BaseController.prototype.onExit.bind(this)();
247
- },
248
-
249
- /**
250
- * Check if the FCL component is enabled.
251
- *
252
- * @function
253
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#isFclEnabled
254
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
255
- * @returns {boolean} `true` since we are in FCL scenario
256
- *
257
- * @ui5-restricted
258
- * @final
259
- */
260
- isFclEnabled: function() {
261
- return true;
262
- },
263
-
264
- displayMessagePage: function(sErrorMessage, mParameters) {
265
- var oFCLControl = this.getFclControl();
266
-
267
- if (this._oFCLConfig && mParameters.FCLLevel >= this._oFCLConfig.maxColumnsCount) {
268
- mParameters.FCLLevel = this._oFCLConfig.maxColumnsCount - 1;
269
- }
270
-
271
- if (!this.aMessagePages) {
272
- this.aMessagePages = [null, null, null];
273
- }
274
- var oMessagePage = this.aMessagePages[mParameters.FCLLevel];
275
- if (!oMessagePage) {
276
- oMessagePage = new MessagePage({
277
- showHeader: false,
278
- icon: "sap-icon://message-error"
279
- });
280
- this.aMessagePages[mParameters.FCLLevel] = oMessagePage;
281
-
282
- switch (mParameters.FCLLevel) {
283
- case 0:
284
- oFCLControl.addBeginColumnPage(oMessagePage);
285
- break;
286
-
287
- case 1:
288
- oFCLControl.addMidColumnPage(oMessagePage);
289
- break;
290
-
291
- default:
292
- oFCLControl.addEndColumnPage(oMessagePage);
293
- }
294
- }
295
-
296
- oMessagePage.setText(sErrorMessage);
297
-
298
- if (mParameters.technicalMessage) {
299
- oMessagePage.setCustomDescription(
300
- new Link({
301
- text: mParameters.description || mParameters.technicalMessage,
302
- press: function() {
303
- MessageBox.show(mParameters.technicalMessage, {
304
- icon: MessageBox.Icon.ERROR,
305
- title: mParameters.title,
306
- actions: [MessageBox.Action.OK],
307
- defaultAction: MessageBox.Action.OK,
308
- details: mParameters.technicalDetails || "",
309
- contentWidth: "60%"
310
- });
311
- }
312
- })
313
- );
314
- } else {
315
- oMessagePage.setDescription(mParameters.description || "");
316
- }
317
-
318
- oFCLControl.to(oMessagePage.getId());
319
- },
320
-
321
- /**
322
- * Initialize the object _oTargetsAggregation that defines for each route the relevant aggregation and pattern.
323
- *
324
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeTargetAggregation
325
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
326
- * @function
327
- * @param {object} [oAppComponent] Reference to the AppComponent
328
- */
329
- _initializeTargetAggregation: function(oAppComponent) {
330
- var oManifest = oAppComponent.getManifest(),
331
- oTargets = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.targets : null,
332
- that = this;
333
-
334
- this._oTargetsAggregation = {};
335
-
336
- if (oTargets) {
337
- Object.keys(oTargets).forEach(function(sTargetName) {
338
- var oTarget = oTargets[sTargetName];
339
- if (oTarget.controlAggregation) {
340
- that._oTargetsAggregation[sTargetName] = {
341
- aggregation: oTarget.controlAggregation,
342
- pattern: oTarget.contextPattern
343
- };
344
- } else {
345
- that._oTargetsAggregation[sTargetName] = {
346
- aggregation: "page",
347
- pattern: null
348
- };
349
- }
350
- });
351
- }
352
- },
353
-
354
- /**
355
- * Initializes the mapping between a route (identifed as its pattern) and the corresponding targets
356
- *
357
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeRoutesInformation
358
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
359
- * @function
360
- * @param {object} [oAppComponent] ref to the AppComponent
361
- */
362
-
363
- _initializeRoutesInformation: function(oAppComponent) {
364
- var oManifest = oAppComponent.getManifest(),
365
- aRoutes = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.routes : null,
366
- that = this;
367
-
368
- this._oTargetsFromRoutePattern = {};
369
-
370
- if (aRoutes) {
371
- aRoutes.forEach(function(route) {
372
- that._oTargetsFromRoutePattern[route.pattern] = route.target;
373
- });
374
- }
375
- },
376
-
377
- getCurrentArgument: function() {
378
- return this.sCurrentArguments;
379
- },
380
-
381
- getCurrentRouteName: function() {
382
- return this.sCurrentRouteName;
383
- },
384
-
385
- /**
386
- * Get FE FCL constant.
387
- *
388
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
389
- * @returns {object}
390
- */
391
- getConstants: function() {
392
- return CONSTANTS;
393
- },
394
-
395
- /**
396
- * Getter for oTargetsAggregation array.
397
- *
398
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getTargetAggregation
399
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
400
- * @function
401
- * @returns {Array} The _oTargetsAggregation array
402
- *
403
- * @ui5-restricted
404
- */
405
- getTargetAggregation: function() {
406
- return this._oTargetsAggregation;
407
- },
408
-
409
- /**
410
- * Function triggered by the router RouteMatched event.
411
- *
412
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onRouteMatched
413
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
414
- * @param {*} oEvent
415
- */
416
- onRouteMatched: function(oEvent) {
417
- var sRouteName = oEvent.getParameter("name");
418
-
419
- // Save the current/previous routes and arguments
420
- this.sCurrentRouteName = sRouteName;
421
- this.sCurrentArguments = oEvent.getParameter("arguments");
422
- },
423
-
424
- /**
425
- * This function is triggering the table scroll to the navigated row after each layout change.
426
- *
427
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#scrollToLastSelectedItem
428
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
429
- */
430
-
431
- _scrollTablesToLastNavigatedItems: function() {
432
- var aViews = this._getAllVisibleViews();
433
- //The scrolls are triggered only if the layout is with several columns or when switching the mostRight column in full screen
434
- if (aViews.length > 1 || aViews[0].getViewData().viewLevel < this._oFCLConfig.maxColumnsCount) {
435
- var sCurrentViewPath,
436
- oAdditionalView = this.getViewForNavigatedRowsComputation();
437
- if (oAdditionalView && aViews.indexOf(oAdditionalView) === -1) {
438
- aViews.push(oAdditionalView);
439
- }
440
- for (var index = aViews.length - 1; index > 0; index--) {
441
- var oView = aViews[index],
442
- oPreviousView = aViews[index - 1];
443
- if (oView.getBindingContext()) {
444
- sCurrentViewPath = oView.getBindingContext().getPath();
445
- oPreviousView.getController()._scrollTablesToRow(sCurrentViewPath);
446
- }
447
- }
448
- }
449
- },
450
-
451
- /**
452
- * Function triggered by the FCL StateChanged event.
453
- *
454
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onStateChanged
455
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
456
- * @param {*} oEvent
457
- */
458
- onStateChanged: function(oEvent) {
459
- var bIsNavigationArrow = oEvent.getParameter("isNavigationArrow");
460
- if (this.sCurrentArguments !== undefined) {
461
- if (!this.sCurrentArguments[this.SQUERYKEYNAME]) {
462
- this.sCurrentArguments[this.SQUERYKEYNAME] = {};
463
- }
464
- this.sCurrentArguments[this.SQUERYKEYNAME].layout = oEvent.getParameter("layout");
465
- }
466
- this._forceModelContextChangeOnBreadCrumbs(oEvent);
467
-
468
- // Replace the URL with the new layout if a navigation arrow was used
469
- if (bIsNavigationArrow) {
470
- this._oRouterProxy.navTo(this.sCurrentRouteName, this.sCurrentArguments);
471
- }
472
- },
473
-
474
- /**
475
- * Function to fire ModelContextChange event on all breadcrumbs ( on each ObjectPages).
476
- *
477
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_forceModelContextChangeOnBreadCrumbs
478
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
479
- * @param {*} oEvent
480
- */
481
- _forceModelContextChangeOnBreadCrumbs: function(oEvent) {
482
- //force modelcontextchange on ObjectPages to refresh the breadcrumbs link hrefs
483
- var oFcl = oEvent.getSource(),
484
- oPages = [];
485
- oPages = oPages
486
- .concat(oFcl.getBeginColumnPages())
487
- .concat(oFcl.getMidColumnPages())
488
- .concat(oFcl.getEndColumnPages());
489
- oPages.forEach(function(oPage) {
490
- var oView = _getViewFromContainer(oPage);
491
- var oBreadCrumbs = oView.byId && oView.byId("breadcrumbs");
492
- if (oBreadCrumbs) {
493
- oBreadCrumbs.fireModelContextChange();
494
- }
495
- });
496
- },
497
-
498
- /**
499
- * Function triggered to update the Share button Visibility.
500
- *
501
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
502
- * @param {string} viewColumn Name of the current column ("beginColumn", "midColumn", "endColumn")
503
- * @param {string} sLayout The current layout used by the FCL
504
- * @returns {boolean}
505
- */
506
- _updateShareButtonVisibility: function(viewColumn, sLayout) {
507
- var bShowShareIcon;
508
- switch (sLayout) {
509
- case "OneColumn":
510
- bShowShareIcon = viewColumn === "beginColumn";
511
- break;
512
- case "MidColumnFullScreen":
513
- case "ThreeColumnsBeginExpandedEndHidden":
514
- case "ThreeColumnsMidExpandedEndHidden":
515
- case "TwoColumnsBeginExpanded":
516
- case "TwoColumnsMidExpanded":
517
- bShowShareIcon = viewColumn === "midColumn";
518
- break;
519
- case "EndColumnFullScreen":
520
- case "ThreeColumnsEndExpanded":
521
- case "ThreeColumnsMidExpanded":
522
- bShowShareIcon = viewColumn === "endColumn";
523
- break;
524
- default:
525
- bShowShareIcon = false;
526
- }
527
- return bShowShareIcon;
528
- },
529
-
530
- updateUIStateForView: function(oView, FCLLevel) {
531
- var oUIState = this.getHelper().getCurrentUIState(),
532
- oFclColName = ["beginColumn", "midColumn", "endColumn"],
533
- sLayout = this.getFclControl().getLayout(),
534
- viewColumn;
535
-
536
- if (!oView.getModel("fclhelper")) {
537
- oView.setModel(this._createHelperModel(), "fclhelper");
538
- }
539
- if (FCLLevel >= this._oFCLConfig.maxColumnsCount) {
540
- // The view is on a level > max number of columns. It's always fullscreen without close/exit buttons
541
- viewColumn = oFclColName[this._oFCLConfig.maxColumnsCount - 1];
542
- oUIState.actionButtonsInfo.midColumn.fullScreen = null;
543
- oUIState.actionButtonsInfo.midColumn.exitFullScreen = null;
544
- oUIState.actionButtonsInfo.midColumn.closeColumn = null;
545
- oUIState.actionButtonsInfo.endColumn.exitFullScreen = null;
546
- oUIState.actionButtonsInfo.endColumn.fullScreen = null;
547
- oUIState.actionButtonsInfo.endColumn.closeColumn = null;
548
- } else {
549
- viewColumn = oFclColName[FCLLevel];
550
- }
551
-
552
- if (
553
- FCLLevel >= this._oFCLConfig.maxColumnsCount ||
554
- sLayout === "EndColumnFullScreen" ||
555
- sLayout === "MidColumnFullScreen" ||
556
- sLayout === "OneColumn"
557
- ) {
558
- oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", true);
559
- } else {
560
- oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", false);
561
- }
562
- // Unfortunately, the FCLHelper doesn't provide actionButton values for the first column
563
- // so we have to add this info manually
564
- oUIState.actionButtonsInfo.beginColumn = { fullScreen: null, exitFullScreen: null, closeColumn: null };
565
-
566
- var oActionButtonInfos = Object.assign({}, oUIState.actionButtonsInfo[viewColumn]);
567
- oActionButtonInfos.switchVisible = oActionButtonInfos.fullScreen !== null || oActionButtonInfos.exitFullScreen !== null;
568
- oActionButtonInfos.switchIcon =
569
- oActionButtonInfos.fullScreen !== null ? "sap-icon://full-screen" : "sap-icon://exit-full-screen";
570
- oActionButtonInfos.isFullScreen = oActionButtonInfos.fullScreen === null;
571
-
572
- oView.getModel("fclhelper").setProperty("/actionButtonsInfo", oActionButtonInfos);
573
-
574
- oView.getModel("fclhelper").setProperty("/showShareIcon", this._updateShareButtonVisibility(viewColumn, sLayout));
575
- },
576
-
577
- /**
578
- * Function triggered by the router BeforeRouteMatched event.
579
- *
580
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onBeforeRouteMatched
581
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
582
- * @param {*} oEvent
583
- */
584
- onBeforeRouteMatched: function(oEvent) {
585
- if (oEvent) {
586
- var oQueryParams = oEvent.getParameters().arguments[this.SQUERYKEYNAME];
587
- var sLayout = oQueryParams ? oQueryParams.layout : null;
588
-
589
- // If there is no layout parameter, query for the default level 0 layout (normally OneColumn)
590
- if (!sLayout) {
591
- var oNextUIState = this.getHelper().getNextUIState(0);
592
- sLayout = oNextUIState.layout;
593
- }
594
-
595
- // Check if the layout if compatible with the number of targets
596
- // This should always be the case for normal navigation, just needed in case
597
- // the URL has been manually modified
598
- var aTargets = oEvent.getParameter("config").target;
599
- sLayout = this._correctLayoutForTargets(sLayout, aTargets);
600
-
601
- // Update the layout of the FlexibleColumnLayout
602
- if (sLayout) {
603
- this.getFclControl().setLayout(sLayout);
604
- }
605
- }
606
- },
607
-
608
- /**
609
- * Helper for the FCL Component.
610
- *
611
- * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getHelper
612
- * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
613
- * @returns {object} Instance of a semantic helper
614
- */
615
- getHelper: function() {
616
- return FlexibleColumnLayoutSemanticHelper.getInstanceFor(this.getFclControl(), this._oFCLConfig);
617
- },
618
-
619
- /**
620
- * Calculates the FCL layout for a given FCL level and a target hash.
621
- *
622
- * @param {integer} iNextFCLLevel FCL level to be navigated to
623
- * @param {string} sHash The hash to be navigated to
624
- * @param {string} [sProposedLayout] The proposed layout
625
- * @returns {object}
626
- */
627
- calculateLayout: function(iNextFCLLevel, sHash, sProposedLayout) {
628
- // First, ask the FCL helper to calculate the layout in nothing is proposed
629
- if (!sProposedLayout) {
630
- sProposedLayout = this.getHelper().getNextUIState(iNextFCLLevel).layout;
631
- }
632
-
633
- // Then change this value if necessary, based on the number of targets
634
- var oRoute = this.getRouter().getRouteByHash(sHash + "?layout=" + sProposedLayout);
635
- var aTargets = this._oTargetsFromRoutePattern[oRoute.getPattern()];
636
-
637
- return this._correctLayoutForTargets(sProposedLayout, aTargets);
638
- },
639
-
640
- /**
641
- * Checks whether a given FCL layout is compatible with an array of targets.
642
- *
643
- * @param {*} sProposedLayout Proposed value for the FCL layout
644
- * @param {*} aTargets Array of target names used for checking
645
- * @returns {string} The corrected layout
646
- */
647
- _correctLayoutForTargets: function(sProposedLayout, aTargets) {
648
- var allAllowedLayouts = {
649
- "2": ["TwoColumnsMidExpanded", "TwoColumnsBeginExpanded", "MidColumnFullScreen"],
650
- "3": [
651
- "ThreeColumnsMidExpanded",
652
- "ThreeColumnsEndExpanded",
653
- "ThreeColumnsMidExpandedEndHidden",
654
- "ThreeColumnsBeginExpandedEndHidden",
655
- "MidColumnFullScreen",
656
- "EndColumnFullScreen"
657
- ]
658
- };
659
-
660
- if (aTargets && !Array.isArray(aTargets)) {
661
- // To support single target as a string in the manifest
662
- aTargets = [aTargets];
663
- }
664
-
665
- if (!aTargets) {
666
- // Defensive, just in case...
667
- return sProposedLayout;
668
- } else if (aTargets.length > 1) {
669
- // More than 1 target: just simply check from the allowed values
670
- var aLayouts = allAllowedLayouts[aTargets.length];
671
- if (aLayouts.indexOf(sProposedLayout) < 0) {
672
- // The proposed layout isn't compatible with the number of columns
673
- // --> Ask the helper for the default layout for the number of columns
674
- sProposedLayout = aLayouts[0]; //this.getHelper().getNextUIState(aTargets.length - 1).layout;
675
- }
676
- } else {
677
- // Only one target
678
- var sTargetAggregation =
679
- this.getTargetAggregation()[aTargets[0]].aggregation || this._oFCLConfig.defaultControlAggregation;
680
- switch (sTargetAggregation) {
681
- case "beginColumnPages":
682
- sProposedLayout = "OneColumn";
683
- break;
684
- case "midColumnPages":
685
- sProposedLayout = "MidColumnFullScreen";
686
- break;
687
- case "endColumnPages":
688
- sProposedLayout = "EndColumnFullScreen";
689
- break;
690
- }
691
- }
692
-
693
- return sProposedLayout;
694
- },
695
-
696
- /**
697
- * get all visible views in the FCL component.
698
- * sLayout optional parameter is very specific as part of the calculation of the latest navigated row
699
- *
700
- * @param {*} sLayout Layout that was applied just before the current navigation
701
- * @returns {Array} return views
702
- */
703
-
704
- _getAllVisibleViews: function(sLayout) {
705
- var aViews = [];
706
- sLayout = !!sLayout ? sLayout : this.getFclControl().getLayout();
707
- switch (sLayout) {
708
- case sap.f.LayoutType.EndColumnFullScreen:
709
- if (this.getFclControl().getCurrentEndColumnPage()) {
710
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
711
- }
712
- break;
713
-
714
- case sap.f.LayoutType.MidColumnFullScreen:
715
- if (this.getFclControl().getCurrentMidColumnPage()) {
716
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
717
- }
718
- break;
719
-
720
- case sap.f.LayoutType.OneColumn:
721
- if (this.getFclControl().getCurrentBeginColumnPage()) {
722
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
723
- }
724
- break;
725
-
726
- case sap.f.LayoutType.ThreeColumnsEndExpanded:
727
- case sap.f.LayoutType.ThreeColumnsMidExpanded:
728
- if (this.getFclControl().getCurrentBeginColumnPage()) {
729
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
730
- }
731
- if (this.getFclControl().getCurrentMidColumnPage()) {
732
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
733
- }
734
- if (this.getFclControl().getCurrentEndColumnPage()) {
735
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
736
- }
737
- break;
738
-
739
- case sap.f.LayoutType.TwoColumnsBeginExpanded:
740
- case sap.f.LayoutType.TwoColumnsMidExpanded:
741
- case sap.f.LayoutType.ThreeColumnsMidExpandedEndHidden:
742
- case sap.f.LayoutType.ThreeColumnsBeginExpandedEndHidden:
743
- if (this.getFclControl().getCurrentBeginColumnPage()) {
744
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
745
- }
746
- if (this.getFclControl().getCurrentMidColumnPage()) {
747
- aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
748
- }
749
- break;
750
-
751
- default:
752
- Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
753
- }
754
-
755
- return aViews;
756
- },
757
-
758
- onContainerReady: function() {
759
- // Restore views if neccessary.
760
- var aViews = this._getAllVisibleViews();
761
- var aRestorePromises = [];
762
- aViews.reduce(function(aPromises, oTargetView) {
763
- aPromises.push(KeepAliveHelper.restoreView(oTargetView));
764
- return aPromises;
765
- }, aRestorePromises);
766
- return Promise.all(aRestorePromises);
767
- },
768
-
769
- getRightmostContext: function() {
770
- var oContext;
771
- switch (this.getFclControl().getLayout()) {
772
- case sap.f.LayoutType.OneColumn:
773
- if (this.getFclControl().getCurrentBeginColumnPage()) {
774
- oContext = _getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()).getBindingContext();
775
- }
776
- break;
777
-
778
- case sap.f.LayoutType.TwoColumnsBeginExpanded:
779
- case sap.f.LayoutType.TwoColumnsMidExpanded:
780
- if (this.getFclControl().getCurrentMidColumnPage()) {
781
- oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
782
- }
783
- break;
784
-
785
- case sap.f.LayoutType.ThreeColumnsEndExpanded:
786
- case sap.f.LayoutType.ThreeColumnsMidExpanded:
787
- case sap.f.LayoutType.ThreeColumnsMidExpandedEndHidden:
788
- case sap.f.LayoutType.ThreeColumnsBeginExpandedEndHidden:
789
- case sap.f.LayoutType.EndColumnFullScreen:
790
- if (this.getFclControl().getCurrentEndColumnPage()) {
791
- oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
792
- }
793
- break;
794
-
795
- case sap.f.LayoutType.MidColumnFullScreen:
796
- // In this case we need to determine if this mid column fullscreen comes from a 2 or a 3 column layout
797
- var sLayoutWhenExitFullScreen = this.getHelper().getCurrentUIState().actionButtonsInfo.midColumn.exitFullScreen;
798
- if (sLayoutWhenExitFullScreen.indexOf("ThreeColumn") >= 0) {
799
- // We come from a 3 column layout
800
- if (this.getFclControl().getCurrentEndColumnPage()) {
801
- oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
802
- }
803
- } else {
804
- // We come from a 2 column layout
805
- if (this.getFclControl().getCurrentMidColumnPage()) {
806
- oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
807
- }
808
- }
809
- break;
810
-
811
- default:
812
- Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
813
- }
814
-
815
- return oContext;
816
- }
817
- });
818
- },
819
- true
820
- );
5
+ sap.ui.define(["sap/base/Log", "sap/f/FlexibleColumnLayoutSemanticHelper", "sap/f/library", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/m/Link", "sap/m/MessageBox", "sap/m/MessagePage", "./RootContainerBaseController"], function (Log, FlexibleColumnLayoutSemanticHelper, fLibrary, ViewState, ClassSupport, KeepAliveHelper, Link, MessageBox, MessagePage, BaseController) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _class, _class2, _descriptor;
9
+
10
+ var Icon = MessageBox.Icon;
11
+ var Action = MessageBox.Action;
12
+ var usingExtension = ClassSupport.usingExtension;
13
+ var defineUI5Class = ClassSupport.defineUI5Class;
14
+
15
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
16
+
17
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
18
+
19
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
20
+
21
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
+
23
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
24
+
25
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
26
+
27
+ var LayoutType = fLibrary.LayoutType;
28
+ var CONSTANTS = {
29
+ page: {
30
+ names: ["BeginColumn", "MidColumn", "EndColumn"],
31
+ currentGetter: {
32
+ prefix: "getCurrent",
33
+ suffix: "Page"
34
+ },
35
+ getter: {
36
+ prefix: "get",
37
+ suffix: "Pages"
38
+ }
39
+ }
40
+ };
41
+
42
+ var _getViewFromContainer = function (oContainer) {
43
+ if (oContainer.isA("sap.ui.core.ComponentContainer")) {
44
+ return oContainer.getComponentInstance().getRootControl();
45
+ } else {
46
+ return oContainer;
47
+ }
48
+ };
49
+
50
+ var FclController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.Fcl"), _dec2 = usingExtension(ViewState.override({
51
+ applyInitialStateOnly: function () {
52
+ return false;
53
+ },
54
+ adaptBindingRefreshControls: function (aControls) {
55
+ this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
56
+ var pChildView = new Promise(function (resolve) {
57
+ resolve(oChildView);
58
+ });
59
+ aControls.push(pChildView);
60
+ });
61
+ },
62
+ adaptStateControls: function (aStateControls) {
63
+ this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
64
+ var pChildView = new Promise(function (resolve) {
65
+ resolve(oChildView);
66
+ });
67
+ aStateControls.push(pChildView);
68
+ });
69
+ },
70
+ onRestore: function () {
71
+ var oView = this.getView(),
72
+ oNavContainer = oView.byId("appContent");
73
+ var oFCLController = this.getView().getController();
74
+ var oInternalModel = oNavContainer.getModel("internal");
75
+ var oPages = oInternalModel.getProperty("/pages");
76
+
77
+ for (var sComponentId in oPages) {
78
+ oInternalModel.setProperty("/pages/" + sComponentId + "/restoreStatus", "pending");
79
+ }
80
+
81
+ oFCLController.onContainerReady();
82
+ },
83
+ onSuspend: function () {
84
+ var oFCLController = this.getView().getController();
85
+ var oFCLControl = oFCLController.getFclControl();
86
+ var aBeginColumnPages = oFCLControl.getBeginColumnPages() || [];
87
+ var aMidColumnPages = oFCLControl.getMidColumnPages() || [];
88
+ var aEndColumnPages = oFCLControl.getEndColumnPages() || [];
89
+ var aPages = [].concat(aBeginColumnPages, aMidColumnPages, aEndColumnPages);
90
+ aPages.forEach(function (oPage) {
91
+ var oTargetView = _getViewFromContainer(oPage);
92
+
93
+ var oController = oTargetView && oTargetView.getController();
94
+
95
+ if (oController && oController.viewState && oController.viewState.onSuspend) {
96
+ return oController.viewState.onSuspend();
97
+ }
98
+ });
99
+ }
100
+ })), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
101
+ _inheritsLoose(FclController, _BaseController);
102
+
103
+ function FclController() {
104
+ var _this;
105
+
106
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
107
+ args[_key] = arguments[_key];
108
+ }
109
+
110
+ _this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
111
+
112
+ _initializerDefineProperty(_this, "viewState", _descriptor, _assertThisInitialized(_this));
113
+
114
+ return _this;
115
+ }
116
+
117
+ var _proto = FclController.prototype;
118
+
119
+ /**
120
+ * @private
121
+ * @name sap.fe.templates.RootContainer.controller.Fcl.getMetadata
122
+ * @function
123
+ */
124
+ _proto.onInit = function onInit() {
125
+ _BaseController.prototype.onInit.call(this);
126
+
127
+ this._internalInit();
128
+ };
129
+
130
+ _proto.attachRouteMatchers = function attachRouteMatchers() {
131
+ this.getRouter().attachBeforeRouteMatched(this._getViewForNavigatedRowsComputation, this);
132
+
133
+ _BaseController.prototype.attachRouteMatchers.call(this);
134
+
135
+ this._internalInit();
136
+
137
+ this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
138
+ this.getRouter().attachRouteMatched(this.onRouteMatched, this);
139
+ this.getFclControl().attachStateChange(this._saveLayout, this);
140
+ };
141
+
142
+ _proto._internalInit = function _internalInit() {
143
+ if (this._oRouterProxy) {
144
+ return; // Already initialized
145
+ }
146
+
147
+ this.sCurrentRouteName = "";
148
+ this.sCurrentArguments = {};
149
+ this.SQUERYKEYNAME = "?query";
150
+ var oAppComponent = this.getAppComponent();
151
+ this._oRouterProxy = oAppComponent.getRouterProxy(); // Get FCL configuration in the manifest
152
+
153
+ this._oFCLConfig = {
154
+ maxColumnsCount: 3
155
+ };
156
+ var oRoutingConfig = oAppComponent.getManifest()["sap.ui5"].routing;
157
+
158
+ if (oRoutingConfig && oRoutingConfig.config) {
159
+ if (oRoutingConfig.config.flexibleColumnLayout) {
160
+ var oFCLManifestConfig = oRoutingConfig.config.flexibleColumnLayout; // Default layout for 2 columns
161
+
162
+ if (oFCLManifestConfig.defaultTwoColumnLayoutType) {
163
+ this._oFCLConfig.defaultTwoColumnLayoutType = oFCLManifestConfig.defaultTwoColumnLayoutType;
164
+ } // Default layout for 3 columns
165
+
166
+
167
+ if (oFCLManifestConfig.defaultThreeColumnLayoutType) {
168
+ this._oFCLConfig.defaultThreeColumnLayoutType = oFCLManifestConfig.defaultThreeColumnLayoutType;
169
+ } // Limit FCL to 2 columns ?
170
+
171
+
172
+ if (oFCLManifestConfig.limitFCLToTwoColumns === true) {
173
+ this._oFCLConfig.maxColumnsCount = 2;
174
+ }
175
+ }
176
+
177
+ if (oRoutingConfig.config.controlAggregation) {
178
+ this._oFCLConfig.defaultControlAggregation = oRoutingConfig.config.controlAggregation;
179
+ }
180
+ }
181
+
182
+ this._initializeTargetAggregation(oAppComponent);
183
+
184
+ this._initializeRoutesInformation(oAppComponent);
185
+ };
186
+
187
+ _proto.getFclControl = function getFclControl() {
188
+ return this.getView().getContent()[0];
189
+ };
190
+
191
+ _proto._saveLayout = function _saveLayout(oEvent) {
192
+ this.sPreviousLayout = oEvent.getParameters().layout;
193
+ }
194
+ /**
195
+ * Get the additionnal view (on top of the visible views), to be able to compute the latest table navigated rows of the most right visible view after a nav back or column fullscreen.
196
+ *
197
+ * @function
198
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_getRightMostViewBeforeRouteMatched
199
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
200
+ *
201
+ */
202
+ ;
203
+
204
+ _proto._getViewForNavigatedRowsComputation = function _getViewForNavigatedRowsComputation() {
205
+ var _this2 = this;
206
+
207
+ var aAllVisibleViewsBeforeRouteMatched = this._getAllVisibleViews(this.sPreviousLayout);
208
+
209
+ var oRightMostViewBeforeRouteMatched = aAllVisibleViewsBeforeRouteMatched[aAllVisibleViewsBeforeRouteMatched.length - 1];
210
+ var oRightMostView;
211
+ this.getRouter().attachEventOnce("routeMatched", function (oEvent) {
212
+ oRightMostView = _getViewFromContainer(oEvent.getParameter("views")[oEvent.getParameter("views").length - 1]);
213
+
214
+ if (oRightMostViewBeforeRouteMatched) {
215
+ // Navigation forward from L2 to view level L3 (FullScreenLayout):
216
+ if (oRightMostView.getViewData() && oRightMostView.getViewData().viewLevel === _this2._oFCLConfig.maxColumnsCount) {
217
+ _this2.oAdditionalViewForNavRowsComputation = oRightMostView;
218
+ } // Navigations backward from L3 down to L2, L1, L0 (ThreeColumn layout):
219
+
220
+
221
+ if (oRightMostView.getViewData() && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel < _this2._oFCLConfig.maxColumnsCount && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel > oRightMostView.getViewData().viewLevel && oRightMostView !== oRightMostViewBeforeRouteMatched) {
222
+ _this2.oAdditionalViewForNavRowsComputation = oRightMostViewBeforeRouteMatched;
223
+ }
224
+ }
225
+ });
226
+ };
227
+
228
+ _proto.getViewForNavigatedRowsComputation = function getViewForNavigatedRowsComputation() {
229
+ return this.oAdditionalViewForNavRowsComputation;
230
+ };
231
+
232
+ _proto.onExit = function onExit() {
233
+ this.getRouter().detachRouteMatched(this.onRouteMatched, this);
234
+ this.getRouter().detachBeforeRouteMatched(this.onBeforeRouteMatched, this);
235
+ this.getFclControl().detachStateChange(this.onStateChanged, this);
236
+ this.getFclControl().detachAfterEndColumnNavigate(this.onStateChanged, this);
237
+ this._oTargetsAggregation = null;
238
+ this._oTargetsFromRoutePattern = null;
239
+ BaseController.prototype.onExit.bind(this)();
240
+ }
241
+ /**
242
+ * Check if the FCL component is enabled.
243
+ *
244
+ * @function
245
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#isFclEnabled
246
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
247
+ * @returns {boolean} `true` since we are in FCL scenario
248
+ *
249
+ * @ui5-restricted
250
+ * @final
251
+ */
252
+ ;
253
+
254
+ _proto.isFclEnabled = function isFclEnabled() {
255
+ return true;
256
+ };
257
+
258
+ _proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
259
+ var oFCLControl = this.getFclControl();
260
+
261
+ if (this._oFCLConfig && mParameters.FCLLevel >= this._oFCLConfig.maxColumnsCount) {
262
+ mParameters.FCLLevel = this._oFCLConfig.maxColumnsCount - 1;
263
+ }
264
+
265
+ if (!this.aMessagePages) {
266
+ this.aMessagePages = [null, null, null];
267
+ }
268
+
269
+ var oMessagePage = this.aMessagePages[mParameters.FCLLevel];
270
+
271
+ if (!oMessagePage) {
272
+ oMessagePage = new MessagePage({
273
+ showHeader: false,
274
+ icon: "sap-icon://message-error"
275
+ });
276
+ this.aMessagePages[mParameters.FCLLevel] = oMessagePage;
277
+
278
+ switch (mParameters.FCLLevel) {
279
+ case 0:
280
+ oFCLControl.addBeginColumnPage(oMessagePage);
281
+ break;
282
+
283
+ case 1:
284
+ oFCLControl.addMidColumnPage(oMessagePage);
285
+ break;
286
+
287
+ default:
288
+ oFCLControl.addEndColumnPage(oMessagePage);
289
+ }
290
+ }
291
+
292
+ oMessagePage.setText(sErrorMessage);
293
+
294
+ if (mParameters.technicalMessage) {
295
+ oMessagePage.setCustomDescription(new Link({
296
+ text: mParameters.description || mParameters.technicalMessage,
297
+ press: function () {
298
+ MessageBox.show(mParameters.technicalMessage, {
299
+ icon: Icon.ERROR,
300
+ title: mParameters.title,
301
+ actions: [Action.OK],
302
+ defaultAction: Action.OK,
303
+ details: mParameters.technicalDetails || "",
304
+ contentWidth: "60%"
305
+ });
306
+ }
307
+ }));
308
+ } else {
309
+ oMessagePage.setDescription(mParameters.description || "");
310
+ }
311
+
312
+ oFCLControl.to(oMessagePage.getId());
313
+ return Promise.resolve(true);
314
+ }
315
+ /**
316
+ * Initialize the object _oTargetsAggregation that defines for each route the relevant aggregation and pattern.
317
+ *
318
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeTargetAggregation
319
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
320
+ * @function
321
+ * @param {object} [oAppComponent] Reference to the AppComponent
322
+ */
323
+ ;
324
+
325
+ _proto._initializeTargetAggregation = function _initializeTargetAggregation(oAppComponent) {
326
+ var _this3 = this;
327
+
328
+ var oManifest = oAppComponent.getManifest(),
329
+ oTargets = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.targets : null;
330
+ this._oTargetsAggregation = {};
331
+
332
+ if (oTargets) {
333
+ Object.keys(oTargets).forEach(function (sTargetName) {
334
+ var oTarget = oTargets[sTargetName];
335
+
336
+ if (oTarget.controlAggregation) {
337
+ _this3._oTargetsAggregation[sTargetName] = {
338
+ aggregation: oTarget.controlAggregation,
339
+ pattern: oTarget.contextPattern
340
+ };
341
+ } else {
342
+ _this3._oTargetsAggregation[sTargetName] = {
343
+ aggregation: "page",
344
+ pattern: null
345
+ };
346
+ }
347
+ });
348
+ }
349
+ }
350
+ /**
351
+ * Initializes the mapping between a route (identifed as its pattern) and the corresponding targets
352
+ *
353
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeRoutesInformation
354
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
355
+ * @function
356
+ * @param oAppComponent ref to the AppComponent
357
+ */
358
+ ;
359
+
360
+ _proto._initializeRoutesInformation = function _initializeRoutesInformation(oAppComponent) {
361
+ var _this4 = this;
362
+
363
+ var oManifest = oAppComponent.getManifest(),
364
+ aRoutes = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.routes : null;
365
+ this._oTargetsFromRoutePattern = {};
366
+
367
+ if (aRoutes) {
368
+ aRoutes.forEach(function (route) {
369
+ _this4._oTargetsFromRoutePattern[route.pattern] = route.target;
370
+ });
371
+ }
372
+ };
373
+
374
+ _proto.getCurrentArgument = function getCurrentArgument() {
375
+ return this.sCurrentArguments;
376
+ };
377
+
378
+ _proto.getCurrentRouteName = function getCurrentRouteName() {
379
+ return this.sCurrentRouteName;
380
+ }
381
+ /**
382
+ * Get FE FCL constant.
383
+ *
384
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
385
+ * @returns {object}
386
+ */
387
+ ;
388
+
389
+ _proto.getConstants = function getConstants() {
390
+ return CONSTANTS;
391
+ }
392
+ /**
393
+ * Getter for oTargetsAggregation array.
394
+ *
395
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getTargetAggregation
396
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
397
+ * @function
398
+ * @returns {Array} The _oTargetsAggregation array
399
+ *
400
+ * @ui5-restricted
401
+ */
402
+ ;
403
+
404
+ _proto.getTargetAggregation = function getTargetAggregation() {
405
+ return this._oTargetsAggregation;
406
+ }
407
+ /**
408
+ * Function triggered by the router RouteMatched event.
409
+ *
410
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onRouteMatched
411
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
412
+ * @param {*} oEvent
413
+ */
414
+ ;
415
+
416
+ _proto.onRouteMatched = function onRouteMatched(oEvent) {
417
+ var sRouteName = oEvent.getParameter("name"); // Save the current/previous routes and arguments
418
+
419
+ this.sCurrentRouteName = sRouteName;
420
+ this.sCurrentArguments = oEvent.getParameter("arguments");
421
+ }
422
+ /**
423
+ * This function is triggering the table scroll to the navigated row after each layout change.
424
+ *
425
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#scrollToLastSelectedItem
426
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
427
+ */
428
+ ;
429
+
430
+ _proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {
431
+ var aViews = this._getAllVisibleViews(); //The scrolls are triggered only if the layout is with several columns or when switching the mostRight column in full screen
432
+
433
+
434
+ if (aViews.length > 1 || aViews[0].getViewData().viewLevel < this._oFCLConfig.maxColumnsCount) {
435
+ var sCurrentViewPath;
436
+ var oAdditionalView = this.getViewForNavigatedRowsComputation();
437
+
438
+ if (oAdditionalView && aViews.indexOf(oAdditionalView) === -1) {
439
+ aViews.push(oAdditionalView);
440
+ }
441
+
442
+ for (var index = aViews.length - 1; index > 0; index--) {
443
+ var oView = aViews[index],
444
+ oPreviousView = aViews[index - 1];
445
+
446
+ if (oView.getBindingContext()) {
447
+ sCurrentViewPath = oView.getBindingContext().getPath();
448
+
449
+ oPreviousView.getController()._scrollTablesToRow(sCurrentViewPath);
450
+ }
451
+ }
452
+ }
453
+ }
454
+ /**
455
+ * Function triggered by the FCL StateChanged event.
456
+ *
457
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onStateChanged
458
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
459
+ * @param {*} oEvent
460
+ */
461
+ ;
462
+
463
+ _proto.onStateChanged = function onStateChanged(oEvent) {
464
+ var bIsNavigationArrow = oEvent.getParameter("isNavigationArrow");
465
+
466
+ if (this.sCurrentArguments !== undefined) {
467
+ if (!this.sCurrentArguments[this.SQUERYKEYNAME]) {
468
+ this.sCurrentArguments[this.SQUERYKEYNAME] = {};
469
+ }
470
+
471
+ this.sCurrentArguments[this.SQUERYKEYNAME].layout = oEvent.getParameter("layout");
472
+ }
473
+
474
+ this._forceModelContextChangeOnBreadCrumbs(oEvent); // Replace the URL with the new layout if a navigation arrow was used
475
+
476
+
477
+ if (bIsNavigationArrow) {
478
+ this._oRouterProxy.navTo(this.sCurrentRouteName, this.sCurrentArguments);
479
+ }
480
+ }
481
+ /**
482
+ * Function to fire ModelContextChange event on all breadcrumbs ( on each ObjectPages).
483
+ *
484
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#_forceModelContextChangeOnBreadCrumbs
485
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
486
+ * @param {*} oEvent
487
+ */
488
+ ;
489
+
490
+ _proto._forceModelContextChangeOnBreadCrumbs = function _forceModelContextChangeOnBreadCrumbs(oEvent) {
491
+ //force modelcontextchange on ObjectPages to refresh the breadcrumbs link hrefs
492
+ var oFcl = oEvent.getSource();
493
+ var oPages = [];
494
+ oPages = oPages.concat(oFcl.getBeginColumnPages()).concat(oFcl.getMidColumnPages()).concat(oFcl.getEndColumnPages());
495
+ oPages.forEach(function (oPage) {
496
+ var oView = _getViewFromContainer(oPage);
497
+
498
+ var oBreadCrumbs = oView.byId && oView.byId("breadcrumbs");
499
+
500
+ if (oBreadCrumbs) {
501
+ oBreadCrumbs.fireModelContextChange();
502
+ }
503
+ });
504
+ }
505
+ /**
506
+ * Function triggered to update the Share button Visibility.
507
+ *
508
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
509
+ * @param {string} viewColumn Name of the current column ("beginColumn", "midColumn", "endColumn")
510
+ * @param {string} sLayout The current layout used by the FCL
511
+ * @returns {boolean}
512
+ */
513
+ ;
514
+
515
+ _proto._updateShareButtonVisibility = function _updateShareButtonVisibility(viewColumn, sLayout) {
516
+ var bShowShareIcon;
517
+
518
+ switch (sLayout) {
519
+ case "OneColumn":
520
+ bShowShareIcon = viewColumn === "beginColumn";
521
+ break;
522
+
523
+ case "MidColumnFullScreen":
524
+ case "ThreeColumnsBeginExpandedEndHidden":
525
+ case "ThreeColumnsMidExpandedEndHidden":
526
+ case "TwoColumnsBeginExpanded":
527
+ case "TwoColumnsMidExpanded":
528
+ bShowShareIcon = viewColumn === "midColumn";
529
+ break;
530
+
531
+ case "EndColumnFullScreen":
532
+ case "ThreeColumnsEndExpanded":
533
+ case "ThreeColumnsMidExpanded":
534
+ bShowShareIcon = viewColumn === "endColumn";
535
+ break;
536
+
537
+ default:
538
+ bShowShareIcon = false;
539
+ }
540
+
541
+ return bShowShareIcon;
542
+ };
543
+
544
+ _proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {
545
+ var oUIState = this.getHelper().getCurrentUIState(),
546
+ oFclColName = ["beginColumn", "midColumn", "endColumn"],
547
+ sLayout = this.getFclControl().getLayout();
548
+ var viewColumn;
549
+
550
+ if (!oView.getModel("fclhelper")) {
551
+ oView.setModel(this._createHelperModel(), "fclhelper");
552
+ }
553
+
554
+ if (FCLLevel >= this._oFCLConfig.maxColumnsCount) {
555
+ // The view is on a level > max number of columns. It's always fullscreen without close/exit buttons
556
+ viewColumn = oFclColName[this._oFCLConfig.maxColumnsCount - 1];
557
+ oUIState.actionButtonsInfo.midColumn.fullScreen = null;
558
+ oUIState.actionButtonsInfo.midColumn.exitFullScreen = null;
559
+ oUIState.actionButtonsInfo.midColumn.closeColumn = null;
560
+ oUIState.actionButtonsInfo.endColumn.exitFullScreen = null;
561
+ oUIState.actionButtonsInfo.endColumn.fullScreen = null;
562
+ oUIState.actionButtonsInfo.endColumn.closeColumn = null;
563
+ } else {
564
+ viewColumn = oFclColName[FCLLevel];
565
+ }
566
+
567
+ if (FCLLevel >= this._oFCLConfig.maxColumnsCount || sLayout === "EndColumnFullScreen" || sLayout === "MidColumnFullScreen" || sLayout === "OneColumn") {
568
+ oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", true);
569
+ } else {
570
+ oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", false);
571
+ } // Unfortunately, the FCLHelper doesn't provide actionButton values for the first column
572
+ // so we have to add this info manually
573
+
574
+
575
+ oUIState.actionButtonsInfo.beginColumn = {
576
+ fullScreen: null,
577
+ exitFullScreen: null,
578
+ closeColumn: null
579
+ };
580
+ var oActionButtonInfos = Object.assign({}, oUIState.actionButtonsInfo[viewColumn]);
581
+ oActionButtonInfos.switchVisible = oActionButtonInfos.fullScreen !== null || oActionButtonInfos.exitFullScreen !== null;
582
+ oActionButtonInfos.switchIcon = oActionButtonInfos.fullScreen !== null ? "sap-icon://full-screen" : "sap-icon://exit-full-screen";
583
+ oActionButtonInfos.isFullScreen = oActionButtonInfos.fullScreen === null;
584
+ oView.getModel("fclhelper").setProperty("/actionButtonsInfo", oActionButtonInfos);
585
+ oView.getModel("fclhelper").setProperty("/showShareIcon", this._updateShareButtonVisibility(viewColumn, sLayout));
586
+ }
587
+ /**
588
+ * Function triggered by the router BeforeRouteMatched event.
589
+ *
590
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#onBeforeRouteMatched
591
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
592
+ * @param {*} oEvent
593
+ */
594
+ ;
595
+
596
+ _proto.onBeforeRouteMatched = function onBeforeRouteMatched(oEvent) {
597
+ if (oEvent) {
598
+ var oQueryParams = oEvent.getParameters().arguments[this.SQUERYKEYNAME];
599
+ var sLayout = oQueryParams ? oQueryParams.layout : null; // If there is no layout parameter, query for the default level 0 layout (normally OneColumn)
600
+
601
+ if (!sLayout) {
602
+ var oNextUIState = this.getHelper().getNextUIState(0);
603
+ sLayout = oNextUIState.layout;
604
+ } // Check if the layout if compatible with the number of targets
605
+ // This should always be the case for normal navigation, just needed in case
606
+ // the URL has been manually modified
607
+
608
+
609
+ var aTargets = oEvent.getParameter("config").target;
610
+ sLayout = this._correctLayoutForTargets(sLayout, aTargets); // Update the layout of the FlexibleColumnLayout
611
+
612
+ if (sLayout) {
613
+ this.getFclControl().setLayout(sLayout);
614
+ }
615
+ }
616
+ }
617
+ /**
618
+ * Helper for the FCL Component.
619
+ *
620
+ * @name sap.fe.templates.RootContainer.controller.Fcl.controller#getHelper
621
+ * @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
622
+ * @returns {object} Instance of a semantic helper
623
+ */
624
+ ;
625
+
626
+ _proto.getHelper = function getHelper() {
627
+ return FlexibleColumnLayoutSemanticHelper.getInstanceFor(this.getFclControl(), this._oFCLConfig);
628
+ }
629
+ /**
630
+ * Calculates the FCL layout for a given FCL level and a target hash.
631
+ *
632
+ * @param iNextFCLLevel FCL level to be navigated to
633
+ * @param sHash The hash to be navigated to
634
+ * @param sProposedLayout The proposed layout
635
+ * @param keepCurrentLayout True if we want to keep the current layout if possible
636
+ * @returns {object}
637
+ */
638
+ ;
639
+
640
+ _proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
641
+ // First, ask the FCL helper to calculate the layout if nothing is proposed
642
+ if (!sProposedLayout) {
643
+ sProposedLayout = keepCurrentLayout ? this.getFclControl().getLayout() : this.getHelper().getNextUIState(iNextFCLLevel).layout;
644
+ } // Then change this value if necessary, based on the number of targets
645
+
646
+
647
+ var oRoute = this.getRouter().getRouteByHash(sHash + "?layout=" + sProposedLayout);
648
+
649
+ var aTargets = this._oTargetsFromRoutePattern[oRoute.getPattern()];
650
+
651
+ return this._correctLayoutForTargets(sProposedLayout, aTargets);
652
+ }
653
+ /**
654
+ * Checks whether a given FCL layout is compatible with an array of targets.
655
+ *
656
+ * @param {*} sProposedLayout Proposed value for the FCL layout
657
+ * @param {*} aTargets Array of target names used for checking
658
+ * @returns {string} The corrected layout
659
+ */
660
+ ;
661
+
662
+ _proto._correctLayoutForTargets = function _correctLayoutForTargets(sProposedLayout, aTargets) {
663
+ var allAllowedLayouts = {
664
+ "2": ["TwoColumnsMidExpanded", "TwoColumnsBeginExpanded", "MidColumnFullScreen"],
665
+ "3": ["ThreeColumnsMidExpanded", "ThreeColumnsEndExpanded", "ThreeColumnsMidExpandedEndHidden", "ThreeColumnsBeginExpandedEndHidden", "MidColumnFullScreen", "EndColumnFullScreen"]
666
+ };
667
+
668
+ if (aTargets && !Array.isArray(aTargets)) {
669
+ // To support single target as a string in the manifest
670
+ aTargets = [aTargets];
671
+ }
672
+
673
+ if (!aTargets) {
674
+ // Defensive, just in case...
675
+ return sProposedLayout;
676
+ } else if (aTargets.length > 1) {
677
+ // More than 1 target: just simply check from the allowed values
678
+ var aLayouts = allAllowedLayouts[aTargets.length];
679
+
680
+ if (aLayouts.indexOf(sProposedLayout) < 0) {
681
+ // The proposed layout isn't compatible with the number of columns
682
+ // --> Ask the helper for the default layout for the number of columns
683
+ sProposedLayout = aLayouts[0]; //this.getHelper().getNextUIState(aTargets.length - 1).layout;
684
+ }
685
+ } else {
686
+ // Only one target
687
+ var sTargetAggregation = this.getTargetAggregation()[aTargets[0]].aggregation || this._oFCLConfig.defaultControlAggregation;
688
+
689
+ switch (sTargetAggregation) {
690
+ case "beginColumnPages":
691
+ sProposedLayout = "OneColumn";
692
+ break;
693
+
694
+ case "midColumnPages":
695
+ sProposedLayout = "MidColumnFullScreen";
696
+ break;
697
+
698
+ case "endColumnPages":
699
+ sProposedLayout = "EndColumnFullScreen";
700
+ break;
701
+ }
702
+ }
703
+
704
+ return sProposedLayout;
705
+ }
706
+ /**
707
+ * get all visible views in the FCL component.
708
+ * sLayout optional parameter is very specific as part of the calculation of the latest navigated row
709
+ *
710
+ * @param {*} sLayout Layout that was applied just before the current navigation
711
+ * @returns {Array} return views
712
+ */
713
+ ;
714
+
715
+ _proto._getAllVisibleViews = function _getAllVisibleViews(sLayout) {
716
+ var aViews = [];
717
+ sLayout = !!sLayout ? sLayout : this.getFclControl().getLayout();
718
+
719
+ switch (sLayout) {
720
+ case LayoutType.EndColumnFullScreen:
721
+ if (this.getFclControl().getCurrentEndColumnPage()) {
722
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
723
+ }
724
+
725
+ break;
726
+
727
+ case LayoutType.MidColumnFullScreen:
728
+ if (this.getFclControl().getCurrentMidColumnPage()) {
729
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
730
+ }
731
+
732
+ break;
733
+
734
+ case LayoutType.OneColumn:
735
+ if (this.getFclControl().getCurrentBeginColumnPage()) {
736
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
737
+ }
738
+
739
+ break;
740
+
741
+ case LayoutType.ThreeColumnsEndExpanded:
742
+ case LayoutType.ThreeColumnsMidExpanded:
743
+ if (this.getFclControl().getCurrentBeginColumnPage()) {
744
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
745
+ }
746
+
747
+ if (this.getFclControl().getCurrentMidColumnPage()) {
748
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
749
+ }
750
+
751
+ if (this.getFclControl().getCurrentEndColumnPage()) {
752
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
753
+ }
754
+
755
+ break;
756
+
757
+ case LayoutType.TwoColumnsBeginExpanded:
758
+ case LayoutType.TwoColumnsMidExpanded:
759
+ case LayoutType.ThreeColumnsMidExpandedEndHidden:
760
+ case LayoutType.ThreeColumnsBeginExpandedEndHidden:
761
+ if (this.getFclControl().getCurrentBeginColumnPage()) {
762
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
763
+ }
764
+
765
+ if (this.getFclControl().getCurrentMidColumnPage()) {
766
+ aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
767
+ }
768
+
769
+ break;
770
+
771
+ default:
772
+ Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
773
+ }
774
+
775
+ return aViews;
776
+ };
777
+
778
+ _proto.onContainerReady = function onContainerReady() {
779
+ // Restore views if neccessary.
780
+ var aViews = this._getAllVisibleViews();
781
+
782
+ var aRestorePromises = [];
783
+ aViews.reduce(function (aPromises, oTargetView) {
784
+ aPromises.push(KeepAliveHelper.restoreView(oTargetView));
785
+ return aPromises;
786
+ }, aRestorePromises);
787
+ return Promise.all(aRestorePromises);
788
+ };
789
+
790
+ _proto.getRightmostContext = function getRightmostContext() {
791
+ var oContext;
792
+
793
+ switch (this.getFclControl().getLayout()) {
794
+ case LayoutType.OneColumn:
795
+ if (this.getFclControl().getCurrentBeginColumnPage()) {
796
+ oContext = _getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()).getBindingContext();
797
+ }
798
+
799
+ break;
800
+
801
+ case LayoutType.TwoColumnsBeginExpanded:
802
+ case LayoutType.TwoColumnsMidExpanded:
803
+ if (this.getFclControl().getCurrentMidColumnPage()) {
804
+ oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
805
+ }
806
+
807
+ break;
808
+
809
+ case LayoutType.ThreeColumnsEndExpanded:
810
+ case LayoutType.ThreeColumnsMidExpanded:
811
+ case LayoutType.ThreeColumnsMidExpandedEndHidden:
812
+ case LayoutType.ThreeColumnsBeginExpandedEndHidden:
813
+ case LayoutType.EndColumnFullScreen:
814
+ if (this.getFclControl().getCurrentEndColumnPage()) {
815
+ oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
816
+ }
817
+
818
+ break;
819
+
820
+ case LayoutType.MidColumnFullScreen:
821
+ // In this case we need to determine if this mid column fullscreen comes from a 2 or a 3 column layout
822
+ var sLayoutWhenExitFullScreen = this.getHelper().getCurrentUIState().actionButtonsInfo.midColumn.exitFullScreen;
823
+
824
+ if (sLayoutWhenExitFullScreen.indexOf("ThreeColumn") >= 0) {
825
+ // We come from a 3 column layout
826
+ if (this.getFclControl().getCurrentEndColumnPage()) {
827
+ oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
828
+ }
829
+ } else {
830
+ // We come from a 2 column layout
831
+ if (this.getFclControl().getCurrentMidColumnPage()) {
832
+ oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
833
+ }
834
+ }
835
+
836
+ break;
837
+
838
+ default:
839
+ Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
840
+ }
841
+
842
+ return oContext;
843
+ };
844
+
845
+ return FclController;
846
+ }(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec2], {
847
+ configurable: true,
848
+ enumerable: true,
849
+ writable: true,
850
+ initializer: null
851
+ })), _class2)) || _class);
852
+ return FclController;
853
+ }, false);
854
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZjbC5jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbIkxheW91dFR5cGUiLCJmTGlicmFyeSIsIkNPTlNUQU5UUyIsInBhZ2UiLCJuYW1lcyIsImN1cnJlbnRHZXR0ZXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJnZXR0ZXIiLCJfZ2V0Vmlld0Zyb21Db250YWluZXIiLCJvQ29udGFpbmVyIiwiaXNBIiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsIkZjbENvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiVmlld1N0YXRlIiwib3ZlcnJpZGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsIl9nZXRBbGxWaXNpYmxlVmlld3MiLCJmb3JFYWNoIiwib0NoaWxkVmlldyIsInBDaGlsZFZpZXciLCJQcm9taXNlIiwicmVzb2x2ZSIsInB1c2giLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9uUmVzdG9yZSIsIm9WaWV3Iiwib05hdkNvbnRhaW5lciIsImJ5SWQiLCJvRkNMQ29udHJvbGxlciIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJvUGFnZXMiLCJnZXRQcm9wZXJ0eSIsInNDb21wb25lbnRJZCIsInNldFByb3BlcnR5Iiwib25Db250YWluZXJSZWFkeSIsIm9uU3VzcGVuZCIsIm9GQ0xDb250cm9sIiwiZ2V0RmNsQ29udHJvbCIsImFCZWdpbkNvbHVtblBhZ2VzIiwiZ2V0QmVnaW5Db2x1bW5QYWdlcyIsImFNaWRDb2x1bW5QYWdlcyIsImdldE1pZENvbHVtblBhZ2VzIiwiYUVuZENvbHVtblBhZ2VzIiwiZ2V0RW5kQ29sdW1uUGFnZXMiLCJhUGFnZXMiLCJjb25jYXQiLCJvUGFnZSIsIm9UYXJnZXRWaWV3Iiwib0NvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJvbkluaXQiLCJfaW50ZXJuYWxJbml0IiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldFJvdXRlciIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsIl9nZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uIiwib25CZWZvcmVSb3V0ZU1hdGNoZWQiLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZCIsImF0dGFjaFN0YXRlQ2hhbmdlIiwiX3NhdmVMYXlvdXQiLCJfb1JvdXRlclByb3h5Iiwic0N1cnJlbnRSb3V0ZU5hbWUiLCJzQ3VycmVudEFyZ3VtZW50cyIsIlNRVUVSWUtFWU5BTUUiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJfb0ZDTENvbmZpZyIsIm1heENvbHVtbnNDb3VudCIsIm9Sb3V0aW5nQ29uZmlnIiwiZ2V0TWFuaWZlc3QiLCJyb3V0aW5nIiwiY29uZmlnIiwiZmxleGlibGVDb2x1bW5MYXlvdXQiLCJvRkNMTWFuaWZlc3RDb25maWciLCJkZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSIsImRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGUiLCJsaW1pdEZDTFRvVHdvQ29sdW1ucyIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImRlZmF1bHRDb250cm9sQWdncmVnYXRpb24iLCJfaW5pdGlhbGl6ZVRhcmdldEFnZ3JlZ2F0aW9uIiwiX2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvbiIsImdldENvbnRlbnQiLCJvRXZlbnQiLCJzUHJldmlvdXNMYXlvdXQiLCJnZXRQYXJhbWV0ZXJzIiwibGF5b3V0IiwiYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCIsIm9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkIiwibGVuZ3RoIiwib1JpZ2h0TW9zdFZpZXciLCJhdHRhY2hFdmVudE9uY2UiLCJnZXRQYXJhbWV0ZXIiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiIsImdldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24iLCJvbkV4aXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJkZXRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQiLCJkZXRhY2hTdGF0ZUNoYW5nZSIsIm9uU3RhdGVDaGFuZ2VkIiwiZGV0YWNoQWZ0ZXJFbmRDb2x1bW5OYXZpZ2F0ZSIsIl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uIiwiX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiIsIkJhc2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYmluZCIsImlzRmNsRW5hYmxlZCIsImRpc3BsYXlNZXNzYWdlUGFnZSIsInNFcnJvck1lc3NhZ2UiLCJtUGFyYW1ldGVycyIsIkZDTExldmVsIiwiYU1lc3NhZ2VQYWdlcyIsIm9NZXNzYWdlUGFnZSIsIk1lc3NhZ2VQYWdlIiwic2hvd0hlYWRlciIsImljb24iLCJhZGRCZWdpbkNvbHVtblBhZ2UiLCJhZGRNaWRDb2x1bW5QYWdlIiwiYWRkRW5kQ29sdW1uUGFnZSIsInNldFRleHQiLCJ0ZWNobmljYWxNZXNzYWdlIiwic2V0Q3VzdG9tRGVzY3JpcHRpb24iLCJMaW5rIiwidGV4dCIsImRlc2NyaXB0aW9uIiwicHJlc3MiLCJNZXNzYWdlQm94Iiwic2hvdyIsIkljb24iLCJFUlJPUiIsInRpdGxlIiwiYWN0aW9ucyIsIkFjdGlvbiIsIk9LIiwiZGVmYXVsdEFjdGlvbiIsImRldGFpbHMiLCJ0ZWNobmljYWxEZXRhaWxzIiwiY29udGVudFdpZHRoIiwic2V0RGVzY3JpcHRpb24iLCJ0byIsImdldElkIiwib01hbmlmZXN0Iiwib1RhcmdldHMiLCJ0YXJnZXRzIiwiT2JqZWN0Iiwia2V5cyIsInNUYXJnZXROYW1lIiwib1RhcmdldCIsImFnZ3JlZ2F0aW9uIiwicGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwiYVJvdXRlcyIsInJvdXRlcyIsInJvdXRlIiwidGFyZ2V0IiwiZ2V0Q3VycmVudEFyZ3VtZW50IiwiZ2V0Q3VycmVudFJvdXRlTmFtZSIsImdldENvbnN0YW50cyIsImdldFRhcmdldEFnZ3JlZ2F0aW9uIiwic1JvdXRlTmFtZSIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImFWaWV3cyIsInNDdXJyZW50Vmlld1BhdGgiLCJvQWRkaXRpb25hbFZpZXciLCJpbmRleE9mIiwiaW5kZXgiLCJvUHJldmlvdXNWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRQYXRoIiwiX3Njcm9sbFRhYmxlc1RvUm93IiwiYklzTmF2aWdhdGlvbkFycm93IiwidW5kZWZpbmVkIiwiX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyIsIm5hdlRvIiwib0ZjbCIsImdldFNvdXJjZSIsIm9CcmVhZENydW1icyIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJfdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5Iiwidmlld0NvbHVtbiIsInNMYXlvdXQiLCJiU2hvd1NoYXJlSWNvbiIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3Iiwib1VJU3RhdGUiLCJnZXRIZWxwZXIiLCJnZXRDdXJyZW50VUlTdGF0ZSIsIm9GY2xDb2xOYW1lIiwiZ2V0TGF5b3V0Iiwic2V0TW9kZWwiLCJfY3JlYXRlSGVscGVyTW9kZWwiLCJhY3Rpb25CdXR0b25zSW5mbyIsIm1pZENvbHVtbiIsImZ1bGxTY3JlZW4iLCJleGl0RnVsbFNjcmVlbiIsImNsb3NlQ29sdW1uIiwiZW5kQ29sdW1uIiwiYmVnaW5Db2x1bW4iLCJvQWN0aW9uQnV0dG9uSW5mb3MiLCJhc3NpZ24iLCJzd2l0Y2hWaXNpYmxlIiwic3dpdGNoSWNvbiIsImlzRnVsbFNjcmVlbiIsIm9RdWVyeVBhcmFtcyIsImFyZ3VtZW50cyIsIm9OZXh0VUlTdGF0ZSIsImdldE5leHRVSVN0YXRlIiwiYVRhcmdldHMiLCJfY29ycmVjdExheW91dEZvclRhcmdldHMiLCJzZXRMYXlvdXQiLCJGbGV4aWJsZUNvbHVtbkxheW91dFNlbWFudGljSGVscGVyIiwiZ2V0SW5zdGFuY2VGb3IiLCJjYWxjdWxhdGVMYXlvdXQiLCJpTmV4dEZDTExldmVsIiwic0hhc2giLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9Sb3V0ZSIsImdldFJvdXRlQnlIYXNoIiwiZ2V0UGF0dGVybiIsImFsbEFsbG93ZWRMYXlvdXRzIiwiQXJyYXkiLCJpc0FycmF5IiwiYUxheW91dHMiLCJzVGFyZ2V0QWdncmVnYXRpb24iLCJFbmRDb2x1bW5GdWxsU2NyZWVuIiwiZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UiLCJNaWRDb2x1bW5GdWxsU2NyZWVuIiwiZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UiLCJPbmVDb2x1bW4iLCJnZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlIiwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQiLCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZCIsIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkIiwiVHdvQ29sdW1uc01pZEV4cGFuZGVkIiwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRFbmRIaWRkZW4iLCJUaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuIiwiTG9nIiwiZXJyb3IiLCJhUmVzdG9yZVByb21pc2VzIiwicmVkdWNlIiwiYVByb21pc2VzIiwiS2VlcEFsaXZlSGVscGVyIiwicmVzdG9yZVZpZXciLCJhbGwiLCJnZXRSaWdodG1vc3RDb250ZXh0Iiwib0NvbnRleHQiLCJzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU1BLFVBQVUsR0FBR0MsUUFBUSxDQUFDRCxVQUE1QjtBQUVBLE1BQU1FLFNBQVMsR0FBRztBQUNqQkMsSUFBQUEsSUFBSSxFQUFFO0FBQ0xDLE1BQUFBLEtBQUssRUFBRSxDQUFDLGFBQUQsRUFBZ0IsV0FBaEIsRUFBNkIsV0FBN0IsQ0FERjtBQUVMQyxNQUFBQSxhQUFhLEVBQUU7QUFDZEMsUUFBQUEsTUFBTSxFQUFFLFlB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ZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgRmxleGlibGVDb2x1bW5MYXlvdXQgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0XCI7XG5pbXBvcnQgRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlciBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlclwiO1xuaW1wb3J0IGZMaWJyYXJ5IGZyb20gXCJzYXAvZi9saWJyYXJ5XCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94LCB7IEFjdGlvbiwgSWNvbiB9IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVBhZ2UgZnJvbSBcInNhcC9tL01lc3NhZ2VQYWdlXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcIi4vUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCI7XG5cbmNvbnN0IExheW91dFR5cGUgPSBmTGlicmFyeS5MYXlvdXRUeXBlO1xuXG5jb25zdCBDT05TVEFOVFMgPSB7XG5cdHBhZ2U6IHtcblx0XHRuYW1lczogW1wiQmVnaW5Db2x1bW5cIiwgXCJNaWRDb2x1bW5cIiwgXCJFbmRDb2x1bW5cIl0sXG5cdFx0Y3VycmVudEdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldEN1cnJlbnRcIixcblx0XHRcdHN1ZmZpeDogXCJQYWdlXCJcblx0XHR9LFxuXHRcdGdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldFwiLFxuXHRcdFx0c3VmZml4OiBcIlBhZ2VzXCJcblx0XHR9XG5cdH1cbn07XG5jb25zdCBfZ2V0Vmlld0Zyb21Db250YWluZXIgPSBmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdGlmIChvQ29udGFpbmVyLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdHJldHVybiBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCkuZ2V0Um9vdENvbnRyb2woKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb0NvbnRhaW5lcjtcblx0fVxufTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsXCIpXG5jbGFzcyBGY2xDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0Vmlld1N0YXRlLm92ZXJyaWRlKHtcblx0XHRcdGFwcGx5SW5pdGlhbFN0YXRlT25seTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IGFueSkge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIEZjbENvbnRyb2xsZXIpLl9nZXRBbGxWaXNpYmxlVmlld3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hpbGRWaWV3OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBwQ2hpbGRWaWV3ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9DaGlsZFZpZXcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRhZGFwdFN0YXRlQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFTdGF0ZUNvbnRyb2xzOiBhbnkpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NoaWxkVmlldzogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgcENoaWxkVmlldyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvQ2hpbGRWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRvblJlc3RvcmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRvTmF2Q29udGFpbmVyID0gb1ZpZXcuYnlJZChcImFwcENvbnRlbnRcIik7XG5cdFx0XHRcdGNvbnN0IG9GQ0xDb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IG9OYXZDb250YWluZXIuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdGNvbnN0IG9QYWdlcyA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2VzXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3Qgc0NvbXBvbmVudElkIGluIG9QYWdlcykge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2VzL1wiICsgc0NvbXBvbmVudElkICsgXCIvcmVzdG9yZVN0YXR1c1wiLCBcInBlbmRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0KG9GQ0xDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdH0sXG5cdFx0XHRvblN1c3BlbmQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSBvRkNMQ29udHJvbGxlci5nZXRGY2xDb250cm9sKCk7XG5cdFx0XHRcdGNvbnN0IGFCZWdpbkNvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkgfHwgW107XG5cdFx0XHRcdGNvbnN0IGFNaWRDb2x1bW5QYWdlczogQ29udHJvbFtdID0gb0ZDTENvbnRyb2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgYUVuZENvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBhUGFnZXMgPSAoW10gYXMgQ29udHJvbFtdKS5jb25jYXQoYUJlZ2luQ29sdW1uUGFnZXMsIGFNaWRDb2x1bW5QYWdlcywgYUVuZENvbHVtblBhZ2VzKTtcblxuXHRcdFx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRWaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblxuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1RhcmdldFZpZXcgJiYgb1RhcmdldFZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlLm9uU3VzcGVuZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5vblN1c3BlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXHRwcml2YXRlIHNDdXJyZW50Um91dGVOYW1lITogc3RyaW5nO1xuXHRwcml2YXRlIHNDdXJyZW50QXJndW1lbnRzPzogYW55O1xuXHRwcml2YXRlIHNQcmV2aW91c0xheW91dCE6IHN0cmluZztcblx0cHJpdmF0ZSBTUVVFUllLRVlOQU1FITogc3RyaW5nO1xuXHRwcml2YXRlIF9vRkNMQ29uZmlnOiBhbnk7XG5cdHByaXZhdGUgb0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uOiBhbnk7XG5cdHByaXZhdGUgX29UYXJnZXRzQWdncmVnYXRpb246IGFueTtcblx0cHJpdmF0ZSBfb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuOiBhbnk7XG5cdHByaXZhdGUgYU1lc3NhZ2VQYWdlcz86IGFueVtdO1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmdldE1ldGFkYXRhXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cblx0XHR0aGlzLl9pbnRlcm5hbEluaXQoKTtcblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKSB7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiwgdGhpcyk7XG5cdFx0c3VwZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuX2ludGVybmFsSW5pdCgpO1xuXG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5vbkJlZm9yZVJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5vblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuYXR0YWNoU3RhdGVDaGFuZ2UodGhpcy5fc2F2ZUxheW91dCwgdGhpcyk7XG5cdH1cblxuXHRfaW50ZXJuYWxJbml0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkpIHtcblx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBpbml0aWFsaXplZFxuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSB7fTtcblx0XHR0aGlzLlNRVUVSWUtFWU5BTUUgPSBcIj9xdWVyeVwiO1xuXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHQvLyBHZXQgRkNMIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1hbmlmZXN0XG5cdFx0dGhpcy5fb0ZDTENvbmZpZyA9IHsgbWF4Q29sdW1uc0NvdW50OiAzIH07XG5cdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSAob0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nQ29uZmlnICYmIG9Sb3V0aW5nQ29uZmlnLmNvbmZpZykge1xuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5mbGV4aWJsZUNvbHVtbkxheW91dCkge1xuXHRcdFx0XHRjb25zdCBvRkNMTWFuaWZlc3RDb25maWcgPSBvUm91dGluZ0NvbmZpZy5jb25maWcuZmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cblx0XHRcdFx0Ly8gRGVmYXVsdCBsYXlvdXQgZm9yIDIgY29sdW1uc1xuXHRcdFx0XHRpZiAob0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUd29Db2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSA9IG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERlZmF1bHQgbGF5b3V0IGZvciAzIGNvbHVtbnNcblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlID0gb0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW1pdCBGQ0wgdG8gMiBjb2x1bW5zID9cblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5saW1pdEZDTFRvVHdvQ29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50ID0gMjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uID0gb1JvdXRpbmdDb25maWcuY29uZmlnLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudCk7XG5cdFx0dGhpcy5faW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uKG9BcHBDb21wb25lbnQpO1xuXHR9XG5cblx0Z2V0RmNsQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0O1xuXHR9XG5cblx0X3NhdmVMYXlvdXQob0V2ZW50OiBhbnkpIHtcblx0XHR0aGlzLnNQcmV2aW91c0xheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYWRkaXRpb25uYWwgdmlldyAob24gdG9wIG9mIHRoZSB2aXNpYmxlIHZpZXdzKSwgdG8gYmUgYWJsZSB0byBjb21wdXRlIHRoZSBsYXRlc3QgdGFibGUgbmF2aWdhdGVkIHJvd3Mgb2YgdGhlIG1vc3QgcmlnaHQgdmlzaWJsZSB2aWV3IGFmdGVyIGEgbmF2IGJhY2sgb3IgY29sdW1uIGZ1bGxzY3JlZW4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfZ2V0UmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICpcblx0ICovXG5cblx0X2dldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKSB7XG5cdFx0Y29uc3QgYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cyh0aGlzLnNQcmV2aW91c0xheW91dCk7XG5cdFx0Y29uc3Qgb1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQgPSBhQWxsVmlzaWJsZVZpZXdzQmVmb3JlUm91dGVNYXRjaGVkW2FBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG9SaWdodE1vc3RWaWV3O1xuXHRcdHRoaXMuZ2V0Um91dGVyKCkuYXR0YWNoRXZlbnRPbmNlKFwicm91dGVNYXRjaGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0b1JpZ2h0TW9zdFZpZXcgPSBfZ2V0Vmlld0Zyb21Db250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpW29FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKS5sZW5ndGggLSAxXSk7XG5cdFx0XHRpZiAob1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGlvbiBmb3J3YXJkIGZyb20gTDIgdG8gdmlldyBsZXZlbCBMMyAoRnVsbFNjcmVlbkxheW91dCk6XG5cdFx0XHRcdGlmIChvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmIG9SaWdodE1vc3RWaWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsID09PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0XHRcdHRoaXMub0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uID0gb1JpZ2h0TW9zdFZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gTmF2aWdhdGlvbnMgYmFja3dhcmQgZnJvbSBMMyBkb3duIHRvIEwyLCBMMSwgTDAgKFRocmVlQ29sdW1uIGxheW91dCk6XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKSAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgJiZcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZC5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPiBvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbCAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3ICE9PSBvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiA9IG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbjtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLm9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCh0aGlzLm9uQmVmb3JlUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hTdGF0ZUNoYW5nZSh0aGlzLm9uU3RhdGVDaGFuZ2VkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hBZnRlckVuZENvbHVtbk5hdmlnYXRlKHRoaXMub25TdGF0ZUNoYW5nZWQsIHRoaXMpO1xuXHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb24gPSBudWxsO1xuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IG51bGw7XG5cblx0XHRCYXNlQ29udHJvbGxlci5wcm90b3R5cGUub25FeGl0LmJpbmQodGhpcykoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgRkNMIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjaXNGY2xFbmFibGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNpbmNlIHdlIGFyZSBpbiBGQ0wgc2NlbmFyaW9cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aXNGY2xFbmFibGVkKCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0ZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IG9GQ0xDb250cm9sID0gdGhpcy5nZXRGY2xDb250cm9sKCk7XG5cblx0XHRpZiAodGhpcy5fb0ZDTENvbmZpZyAmJiBtUGFyYW1ldGVycy5GQ0xMZXZlbCA+PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCAtIDE7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmFNZXNzYWdlUGFnZXMpIHtcblx0XHRcdHRoaXMuYU1lc3NhZ2VQYWdlcyA9IFtudWxsLCBudWxsLCBudWxsXTtcblx0XHR9XG5cdFx0bGV0IG9NZXNzYWdlUGFnZSA9IHRoaXMuYU1lc3NhZ2VQYWdlc1ttUGFyYW1ldGVycy5GQ0xMZXZlbF07XG5cdFx0aWYgKCFvTWVzc2FnZVBhZ2UpIHtcblx0XHRcdG9NZXNzYWdlUGFnZSA9IG5ldyBNZXNzYWdlUGFnZSh7XG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRpY29uOiBcInNhcC1pY29uOi8vbWVzc2FnZS1lcnJvclwiXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYU1lc3NhZ2VQYWdlc1ttUGFyYW1ldGVycy5GQ0xMZXZlbF0gPSBvTWVzc2FnZVBhZ2U7XG5cblx0XHRcdHN3aXRjaCAobVBhcmFtZXRlcnMuRkNMTGV2ZWwpIHtcblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZEJlZ2luQ29sdW1uUGFnZShvTWVzc2FnZVBhZ2UpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRvRkNMQ29udHJvbC5hZGRNaWRDb2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRvRkNMQ29udHJvbC5hZGRFbmRDb2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b01lc3NhZ2VQYWdlLnNldFRleHQoc0Vycm9yTWVzc2FnZSk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSkge1xuXHRcdFx0b01lc3NhZ2VQYWdlLnNldEN1c3RvbURlc2NyaXB0aW9uKFxuXHRcdFx0XHRuZXcgTGluayh7XG5cdFx0XHRcdFx0dGV4dDogbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gfHwgbVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KG1QYXJhbWV0ZXJzLnRlY2huaWNhbE1lc3NhZ2UsIHtcblx0XHRcdFx0XHRcdFx0aWNvbjogSWNvbi5FUlJPUixcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLnRpdGxlLFxuXHRcdFx0XHRcdFx0XHRhY3Rpb25zOiBbQWN0aW9uLk9LXSxcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdEFjdGlvbjogQWN0aW9uLk9LLFxuXHRcdFx0XHRcdFx0XHRkZXRhaWxzOiBtUGFyYW1ldGVycy50ZWNobmljYWxEZXRhaWxzIHx8IFwiXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCI2MCVcIlxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9NZXNzYWdlUGFnZS5zZXREZXNjcmlwdGlvbihtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiB8fCBcIlwiKTtcblx0XHR9XG5cblx0XHQob0ZDTENvbnRyb2wgYXMgYW55KS50byhvTWVzc2FnZVBhZ2UuZ2V0SWQoKSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHRoZSBvYmplY3QgX29UYXJnZXRzQWdncmVnYXRpb24gdGhhdCBkZWZpbmVzIGZvciBlYWNoIHJvdXRlIHRoZSByZWxldmFudCBhZ2dyZWdhdGlvbiBhbmQgcGF0dGVybi5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0FwcENvbXBvbmVudF0gUmVmZXJlbmNlIHRvIHRoZSBBcHBDb21wb25lbnRcblx0ICovXG5cdF9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSxcblx0XHRcdG9UYXJnZXRzID0gb01hbmlmZXN0W1wic2FwLnVpNVwiXS5yb3V0aW5nID8gb01hbmlmZXN0W1wic2FwLnVpNVwiXS5yb3V0aW5nLnRhcmdldHMgOiBudWxsO1xuXG5cdFx0dGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbiA9IHt9O1xuXG5cdFx0aWYgKG9UYXJnZXRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhvVGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb1RhcmdldHNbc1RhcmdldE5hbWVdO1xuXHRcdFx0XHRpZiAob1RhcmdldC5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHR0aGlzLl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uW3NUYXJnZXROYW1lXSA9IHtcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uOiBvVGFyZ2V0LmNvbnRyb2xBZ2dyZWdhdGlvbixcblx0XHRcdFx0XHRcdHBhdHRlcm46IG9UYXJnZXQuY29udGV4dFBhdHRlcm5cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb25bc1RhcmdldE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb246IFwicGFnZVwiLFxuXHRcdFx0XHRcdFx0cGF0dGVybjogbnVsbFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgcm91dGUgKGlkZW50aWZlZCBhcyBpdHMgcGF0dGVybikgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHNcblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IHJlZiB0byB0aGUgQXBwQ29tcG9uZW50XG5cdCAqL1xuXG5cdF9pbml0aWFsaXplUm91dGVzSW5mb3JtYXRpb24ob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSxcblx0XHRcdGFSb3V0ZXMgPSBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcgPyBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcucm91dGVzIDogbnVsbDtcblxuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IHt9O1xuXG5cdFx0aWYgKGFSb3V0ZXMpIHtcblx0XHRcdGFSb3V0ZXMuZm9yRWFjaCgocm91dGU6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0c0Zyb21Sb3V0ZVBhdHRlcm5bcm91dGUucGF0dGVybl0gPSByb3V0ZS50YXJnZXQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXJyZW50QXJndW1lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc0N1cnJlbnRBcmd1bWVudHM7XG5cdH1cblxuXHRnZXRDdXJyZW50Um91dGVOYW1lKCkge1xuXHRcdHJldHVybiB0aGlzLnNDdXJyZW50Um91dGVOYW1lO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBGRSBGQ0wgY29uc3RhbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0Z2V0Q29uc3RhbnRzKCkge1xuXHRcdHJldHVybiBDT05TVEFOVFM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0dGVyIGZvciBvVGFyZ2V0c0FnZ3JlZ2F0aW9uIGFycmF5LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNnZXRUYXJnZXRBZ2dyZWdhdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIF9vVGFyZ2V0c0FnZ3JlZ2F0aW9uIGFycmF5XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0VGFyZ2V0QWdncmVnYXRpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdHJpZ2dlcmVkIGJ5IHRoZSByb3V0ZXIgUm91dGVNYXRjaGVkIGV2ZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNvblJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdG9uUm91dGVNYXRjaGVkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYW1lXCIpO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgY3VycmVudC9wcmV2aW91cyByb3V0ZXMgYW5kIGFyZ3VtZW50c1xuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBzUm91dGVOYW1lO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiYXJndW1lbnRzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdHJpZ2dlcmluZyB0aGUgdGFibGUgc2Nyb2xsIHRvIHRoZSBuYXZpZ2F0ZWQgcm93IGFmdGVyIGVhY2ggbGF5b3V0IGNoYW5nZS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjc2Nyb2xsVG9MYXN0U2VsZWN0ZWRJdGVtXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKi9cblxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gdGhpcy5fZ2V0QWxsVmlzaWJsZVZpZXdzKCk7XG5cdFx0Ly9UaGUgc2Nyb2xscyBhcmUgdHJpZ2dlcmVkIG9ubHkgaWYgdGhlIGxheW91dCBpcyB3aXRoIHNldmVyYWwgY29sdW1ucyBvciB3aGVuIHN3aXRjaGluZyB0aGUgbW9zdFJpZ2h0IGNvbHVtbiBpbiBmdWxsIHNjcmVlblxuXHRcdGlmIChhVmlld3MubGVuZ3RoID4gMSB8fCBhVmlld3NbMF0uZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPCB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0bGV0IHNDdXJyZW50Vmlld1BhdGg7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFZpZXcgPSB0aGlzLmdldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKTtcblx0XHRcdGlmIChvQWRkaXRpb25hbFZpZXcgJiYgYVZpZXdzLmluZGV4T2Yob0FkZGl0aW9uYWxWaWV3KSA9PT0gLTEpIHtcblx0XHRcdFx0YVZpZXdzLnB1c2gob0FkZGl0aW9uYWxWaWV3KTtcblx0XHRcdH1cblx0XHRcdGZvciAobGV0IGluZGV4ID0gYVZpZXdzLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IGFWaWV3c1tpbmRleF0sXG5cdFx0XHRcdFx0b1ByZXZpb3VzVmlldyA9IGFWaWV3c1tpbmRleCAtIDFdO1xuXHRcdFx0XHRpZiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRcdHNDdXJyZW50Vmlld1BhdGggPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldFBhdGgoKTtcblx0XHRcdFx0XHRvUHJldmlvdXNWaWV3LmdldENvbnRyb2xsZXIoKS5fc2Nyb2xsVGFibGVzVG9Sb3coc0N1cnJlbnRWaWV3UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdHJpZ2dlcmVkIGJ5IHRoZSBGQ0wgU3RhdGVDaGFuZ2VkIGV2ZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNvblN0YXRlQ2hhbmdlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdG9uU3RhdGVDaGFuZ2VkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3QgYklzTmF2aWdhdGlvbkFycm93ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlzTmF2aWdhdGlvbkFycm93XCIpO1xuXHRcdGlmICh0aGlzLnNDdXJyZW50QXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdKSB7XG5cdFx0XHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdLmxheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJsYXlvdXRcIik7XG5cdFx0fVxuXHRcdHRoaXMuX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQpO1xuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgVVJMIHdpdGggdGhlIG5ldyBsYXlvdXQgaWYgYSBuYXZpZ2F0aW9uIGFycm93IHdhcyB1c2VkXG5cdFx0aWYgKGJJc05hdmlnYXRpb25BcnJvdykge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvKHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUsIHRoaXMuc0N1cnJlbnRBcmd1bWVudHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBldmVudCBvbiBhbGwgYnJlYWRjcnVtYnMgKCBvbiBlYWNoIE9iamVjdFBhZ2VzKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1ic1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdF9mb3JjZU1vZGVsQ29udGV4dENoYW5nZU9uQnJlYWRDcnVtYnMob0V2ZW50OiBhbnkpIHtcblx0XHQvL2ZvcmNlIG1vZGVsY29udGV4dGNoYW5nZSBvbiBPYmplY3RQYWdlcyB0byByZWZyZXNoIHRoZSBicmVhZGNydW1icyBsaW5rIGhyZWZzXG5cdFx0Y29uc3Qgb0ZjbCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRsZXQgb1BhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdG9QYWdlcyA9IG9QYWdlcy5jb25jYXQob0ZjbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkpLmNvbmNhdChvRmNsLmdldE1pZENvbHVtblBhZ2VzKCkpLmNvbmNhdChvRmNsLmdldEVuZENvbHVtblBhZ2VzKCkpO1xuXHRcdG9QYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFnZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcihvUGFnZSk7XG5cdFx0XHRjb25zdCBvQnJlYWRDcnVtYnMgPSBvVmlldy5ieUlkICYmIG9WaWV3LmJ5SWQoXCJicmVhZGNydW1ic1wiKTtcblx0XHRcdGlmIChvQnJlYWRDcnVtYnMpIHtcblx0XHRcdFx0b0JyZWFkQ3J1bWJzLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgdG8gdXBkYXRlIHRoZSBTaGFyZSBidXR0b24gVmlzaWJpbGl0eS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3Q29sdW1uIE5hbWUgb2YgdGhlIGN1cnJlbnQgY29sdW1uIChcImJlZ2luQ29sdW1uXCIsIFwibWlkQ29sdW1uXCIsIFwiZW5kQ29sdW1uXCIpXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTGF5b3V0IFRoZSBjdXJyZW50IGxheW91dCB1c2VkIGJ5IHRoZSBGQ0xcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRfdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5KHZpZXdDb2x1bW46IHN0cmluZywgc0xheW91dDogc3RyaW5nKSB7XG5cdFx0bGV0IGJTaG93U2hhcmVJY29uO1xuXHRcdHN3aXRjaCAoc0xheW91dCkge1xuXHRcdFx0Y2FzZSBcIk9uZUNvbHVtblwiOlxuXHRcdFx0XHRiU2hvd1NoYXJlSWNvbiA9IHZpZXdDb2x1bW4gPT09IFwiYmVnaW5Db2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW5cIjpcblx0XHRcdGNhc2UgXCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlblwiOlxuXHRcdFx0Y2FzZSBcIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkXCI6XG5cdFx0XHRjYXNlIFwiVHdvQ29sdW1uc01pZEV4cGFuZGVkXCI6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gdmlld0NvbHVtbiA9PT0gXCJtaWRDb2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc0VuZEV4cGFuZGVkXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRcIjpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSB2aWV3Q29sdW1uID09PSBcImVuZENvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBiU2hvd1NoYXJlSWNvbjtcblx0fVxuXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHRjb25zdCBvVUlTdGF0ZSA9IHRoaXMuZ2V0SGVscGVyKCkuZ2V0Q3VycmVudFVJU3RhdGUoKSBhcyBhbnksXG5cdFx0XHRvRmNsQ29sTmFtZSA9IFtcImJlZ2luQ29sdW1uXCIsIFwibWlkQ29sdW1uXCIsIFwiZW5kQ29sdW1uXCJdLFxuXHRcdFx0c0xheW91dCA9IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpO1xuXHRcdGxldCB2aWV3Q29sdW1uO1xuXG5cdFx0aWYgKCFvVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKSkge1xuXHRcdFx0b1ZpZXcuc2V0TW9kZWwodGhpcy5fY3JlYXRlSGVscGVyTW9kZWwoKSwgXCJmY2xoZWxwZXJcIik7XG5cdFx0fVxuXHRcdGlmIChGQ0xMZXZlbCA+PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXMgb24gYSBsZXZlbCA+IG1heCBudW1iZXIgb2YgY29sdW1ucy4gSXQncyBhbHdheXMgZnVsbHNjcmVlbiB3aXRob3V0IGNsb3NlL2V4aXQgYnV0dG9uc1xuXHRcdFx0dmlld0NvbHVtbiA9IG9GY2xDb2xOYW1lW3RoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IC0gMV07XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW4gPSBudWxsO1xuXHRcdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8ubWlkQ29sdW1uLmNsb3NlQ29sdW1uID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5leGl0RnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5lbmRDb2x1bW4uZnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5lbmRDb2x1bW4uY2xvc2VDb2x1bW4gPSBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWV3Q29sdW1uID0gb0ZjbENvbE5hbWVbRkNMTGV2ZWxdO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdEZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IHx8XG5cdFx0XHRzTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIiB8fFxuXHRcdFx0c0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIgfHxcblx0XHRcdHNMYXlvdXQgPT09IFwiT25lQ29sdW1uXCJcblx0XHQpIHtcblx0XHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL2JyZWFkQ3J1bWJJc1Zpc2libGVcIiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL2JyZWFkQ3J1bWJJc1Zpc2libGVcIiwgZmFsc2UpO1xuXHRcdH1cblx0XHQvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgRkNMSGVscGVyIGRvZXNuJ3QgcHJvdmlkZSBhY3Rpb25CdXR0b24gdmFsdWVzIGZvciB0aGUgZmlyc3QgY29sdW1uXG5cdFx0Ly8gc28gd2UgaGF2ZSB0byBhZGQgdGhpcyBpbmZvIG1hbnVhbGx5XG5cdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8uYmVnaW5Db2x1bW4gPSB7IGZ1bGxTY3JlZW46IG51bGwsIGV4aXRGdWxsU2NyZWVuOiBudWxsLCBjbG9zZUNvbHVtbjogbnVsbCB9O1xuXG5cdFx0Y29uc3Qgb0FjdGlvbkJ1dHRvbkluZm9zID0gT2JqZWN0LmFzc2lnbih7fSwgb1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm9bdmlld0NvbHVtbl0pO1xuXHRcdG9BY3Rpb25CdXR0b25JbmZvcy5zd2l0Y2hWaXNpYmxlID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gIT09IG51bGwgfHwgb0FjdGlvbkJ1dHRvbkluZm9zLmV4aXRGdWxsU2NyZWVuICE9PSBudWxsO1xuXHRcdG9BY3Rpb25CdXR0b25JbmZvcy5zd2l0Y2hJY29uID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gIT09IG51bGwgPyBcInNhcC1pY29uOi8vZnVsbC1zY3JlZW5cIiA6IFwic2FwLWljb246Ly9leGl0LWZ1bGwtc2NyZWVuXCI7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLmlzRnVsbFNjcmVlbiA9IG9BY3Rpb25CdXR0b25JbmZvcy5mdWxsU2NyZWVuID09PSBudWxsO1xuXG5cdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm9cIiwgb0FjdGlvbkJ1dHRvbkluZm9zKTtcblxuXHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL3Nob3dTaGFyZUljb25cIiwgdGhpcy5fdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5KHZpZXdDb2x1bW4sIHNMYXlvdXQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIHJvdXRlciBCZWZvcmVSb3V0ZU1hdGNoZWQgZXZlbnQuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI29uQmVmb3JlUm91dGVNYXRjaGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcGFyYW0geyp9IG9FdmVudFxuXHQgKi9cblx0b25CZWZvcmVSb3V0ZU1hdGNoZWQob0V2ZW50OiBhbnkpIHtcblx0XHRpZiAob0V2ZW50KSB7XG5cdFx0XHRjb25zdCBvUXVlcnlQYXJhbXMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdO1xuXHRcdFx0bGV0IHNMYXlvdXQgPSBvUXVlcnlQYXJhbXMgPyBvUXVlcnlQYXJhbXMubGF5b3V0IDogbnVsbDtcblxuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm8gbGF5b3V0IHBhcmFtZXRlciwgcXVlcnkgZm9yIHRoZSBkZWZhdWx0IGxldmVsIDAgbGF5b3V0IChub3JtYWxseSBPbmVDb2x1bW4pXG5cdFx0XHRpZiAoIXNMYXlvdXQpIHtcblx0XHRcdFx0Y29uc3Qgb05leHRVSVN0YXRlID0gdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZSgwKTtcblx0XHRcdFx0c0xheW91dCA9IG9OZXh0VUlTdGF0ZS5sYXlvdXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBsYXlvdXQgaWYgY29tcGF0aWJsZSB3aXRoIHRoZSBudW1iZXIgb2YgdGFyZ2V0c1xuXHRcdFx0Ly8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlIGZvciBub3JtYWwgbmF2aWdhdGlvbiwganVzdCBuZWVkZWQgaW4gY2FzZVxuXHRcdFx0Ly8gdGhlIFVSTCBoYXMgYmVlbiBtYW51YWxseSBtb2RpZmllZFxuXHRcdFx0Y29uc3QgYVRhcmdldHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZmlnXCIpLnRhcmdldDtcblx0XHRcdHNMYXlvdXQgPSB0aGlzLl9jb3JyZWN0TGF5b3V0Rm9yVGFyZ2V0cyhzTGF5b3V0LCBhVGFyZ2V0cyk7XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgbGF5b3V0IG9mIHRoZSBGbGV4aWJsZUNvbHVtbkxheW91dFxuXHRcdFx0aWYgKHNMYXlvdXQpIHtcblx0XHRcdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuc2V0TGF5b3V0KHNMYXlvdXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZm9yIHRoZSBGQ0wgQ29tcG9uZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNnZXRIZWxwZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEluc3RhbmNlIG9mIGEgc2VtYW50aWMgaGVscGVyXG5cdCAqL1xuXHRnZXRIZWxwZXIoKSB7XG5cdFx0cmV0dXJuIEZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXIuZ2V0SW5zdGFuY2VGb3IodGhpcy5nZXRGY2xDb250cm9sKCksIHRoaXMuX29GQ0xDb25maWcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIEZDTCBsYXlvdXQgZm9yIGEgZ2l2ZW4gRkNMIGxldmVsIGFuZCBhIHRhcmdldCBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gaU5leHRGQ0xMZXZlbCBGQ0wgbGV2ZWwgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHNQcm9wb3NlZExheW91dCBUaGUgcHJvcG9zZWQgbGF5b3V0XG5cdCAqIEBwYXJhbSBrZWVwQ3VycmVudExheW91dCBUcnVlIGlmIHdlIHdhbnQgdG8ga2VlcCB0aGUgY3VycmVudCBsYXlvdXQgaWYgcG9zc2libGVcblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICovXG5cdGNhbGN1bGF0ZUxheW91dChpTmV4dEZDTExldmVsOiBudW1iZXIsIHNIYXNoOiBzdHJpbmcsIHNQcm9wb3NlZExheW91dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBrZWVwQ3VycmVudExheW91dDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIEZpcnN0LCBhc2sgdGhlIEZDTCBoZWxwZXIgdG8gY2FsY3VsYXRlIHRoZSBsYXlvdXQgaWYgbm90aGluZyBpcyBwcm9wb3NlZFxuXHRcdGlmICghc1Byb3Bvc2VkTGF5b3V0KSB7XG5cdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBrZWVwQ3VycmVudExheW91dCA/IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpIDogdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZShpTmV4dEZDTExldmVsKS5sYXlvdXQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGFuZ2UgdGhpcyB2YWx1ZSBpZiBuZWNlc3NhcnksIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgdGFyZ2V0c1xuXHRcdGNvbnN0IG9Sb3V0ZSA9ICh0aGlzLmdldFJvdXRlcigpIGFzIGFueSkuZ2V0Um91dGVCeUhhc2goc0hhc2ggKyBcIj9sYXlvdXQ9XCIgKyBzUHJvcG9zZWRMYXlvdXQpO1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gdGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuW29Sb3V0ZS5nZXRQYXR0ZXJuKCldO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dCwgYVRhcmdldHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gRkNMIGxheW91dCBpcyBjb21wYXRpYmxlIHdpdGggYW4gYXJyYXkgb2YgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBzUHJvcG9zZWRMYXlvdXQgUHJvcG9zZWQgdmFsdWUgZm9yIHRoZSBGQ0wgbGF5b3V0XG5cdCAqIEBwYXJhbSB7Kn0gYVRhcmdldHMgQXJyYXkgb2YgdGFyZ2V0IG5hbWVzIHVzZWQgZm9yIGNoZWNraW5nXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb3JyZWN0ZWQgbGF5b3V0XG5cdCAqL1xuXHRfY29ycmVjdExheW91dEZvclRhcmdldHMoc1Byb3Bvc2VkTGF5b3V0OiBhbnksIGFUYXJnZXRzOiBhbnkpIHtcblx0XHRjb25zdCBhbGxBbGxvd2VkTGF5b3V0czogYW55ID0ge1xuXHRcdFx0XCIyXCI6IFtcIlR3b0NvbHVtbnNNaWRFeHBhbmRlZFwiLCBcIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkXCIsIFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiXSxcblx0XHRcdFwiM1wiOiBbXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRcIixcblx0XHRcdFx0XCJUaHJlZUNvbHVtbnNFbmRFeHBhbmRlZFwiLFxuXHRcdFx0XHRcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuXCIsXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlblwiLFxuXHRcdFx0XHRcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJFbmRDb2x1bW5GdWxsU2NyZWVuXCJcblx0XHRcdF1cblx0XHR9O1xuXG5cdFx0aWYgKGFUYXJnZXRzICYmICFBcnJheS5pc0FycmF5KGFUYXJnZXRzKSkge1xuXHRcdFx0Ly8gVG8gc3VwcG9ydCBzaW5nbGUgdGFyZ2V0IGFzIGEgc3RyaW5nIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0YVRhcmdldHMgPSBbYVRhcmdldHNdO1xuXHRcdH1cblxuXHRcdGlmICghYVRhcmdldHMpIHtcblx0XHRcdC8vIERlZmVuc2l2ZSwganVzdCBpbiBjYXNlLi4uXG5cdFx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHRcdH0gZWxzZSBpZiAoYVRhcmdldHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgdGFyZ2V0OiBqdXN0IHNpbXBseSBjaGVjayBmcm9tIHRoZSBhbGxvd2VkIHZhbHVlc1xuXHRcdFx0Y29uc3QgYUxheW91dHMgPSBhbGxBbGxvd2VkTGF5b3V0c1thVGFyZ2V0cy5sZW5ndGhdO1xuXHRcdFx0aWYgKGFMYXlvdXRzLmluZGV4T2Yoc1Byb3Bvc2VkTGF5b3V0KSA8IDApIHtcblx0XHRcdFx0Ly8gVGhlIHByb3Bvc2VkIGxheW91dCBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlIG51bWJlciBvZiBjb2x1bW5zXG5cdFx0XHRcdC8vIC0tPiBBc2sgdGhlIGhlbHBlciBmb3IgdGhlIGRlZmF1bHQgbGF5b3V0IGZvciB0aGUgbnVtYmVyIG9mIGNvbHVtbnNcblx0XHRcdFx0c1Byb3Bvc2VkTGF5b3V0ID0gYUxheW91dHNbMF07IC8vdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZShhVGFyZ2V0cy5sZW5ndGggLSAxKS5sYXlvdXQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9ubHkgb25lIHRhcmdldFxuXHRcdFx0Y29uc3Qgc1RhcmdldEFnZ3JlZ2F0aW9uID0gdGhpcy5nZXRUYXJnZXRBZ2dyZWdhdGlvbigpW2FUYXJnZXRzWzBdXS5hZ2dyZWdhdGlvbiB8fCB0aGlzLl9vRkNMQ29uZmlnLmRlZmF1bHRDb250cm9sQWdncmVnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHNUYXJnZXRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiYmVnaW5Db2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IFwiT25lQ29sdW1uXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJtaWRDb2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZW5kQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmlzaWJsZSB2aWV3cyBpbiB0aGUgRkNMIGNvbXBvbmVudC5cblx0ICogc0xheW91dCBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdmVyeSBzcGVjaWZpYyBhcyBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgbGF0ZXN0IG5hdmlnYXRlZCByb3dcblx0ICpcblx0ICogQHBhcmFtIHsqfSBzTGF5b3V0IExheW91dCB0aGF0IHdhcyBhcHBsaWVkIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHJldHVybnMge0FycmF5fSByZXR1cm4gdmlld3Ncblx0ICovXG5cblx0X2dldEFsbFZpc2libGVWaWV3cyhzTGF5b3V0PzogYW55KSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gW107XG5cdFx0c0xheW91dCA9ICEhc0xheW91dCA/IHNMYXlvdXQgOiB0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKTtcblx0XHRzd2l0Y2ggKHNMYXlvdXQpIHtcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5FbmRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5PbmVDb2x1bW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNFbmRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVHdvQ29sdW1uc0JlZ2luRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVHdvQ29sdW1uc01pZEV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cuZXJyb3IoXCJVbmhhbmRsZWQgc3dpdGNoIGNhc2UgZm9yIFwiICsgdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhVmlld3M7XG5cdH1cblxuXHRvbkNvbnRhaW5lclJlYWR5KCkge1xuXHRcdC8vIFJlc3RvcmUgdmlld3MgaWYgbmVjY2Vzc2FyeS5cblx0XHRjb25zdCBhVmlld3MgPSB0aGlzLl9nZXRBbGxWaXNpYmxlVmlld3MoKTtcblx0XHRjb25zdCBhUmVzdG9yZVByb21pc2VzOiBhbnlbXSA9IFtdO1xuXHRcdGFWaWV3cy5yZWR1Y2UoZnVuY3Rpb24gKGFQcm9taXNlczogYW55LCBvVGFyZ2V0VmlldzogYW55KSB7XG5cdFx0XHRhUHJvbWlzZXMucHVzaChLZWVwQWxpdmVIZWxwZXIucmVzdG9yZVZpZXcob1RhcmdldFZpZXcpKTtcblx0XHRcdHJldHVybiBhUHJvbWlzZXM7XG5cdFx0fSwgYVJlc3RvcmVQcm9taXNlcyk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXN0b3JlUHJvbWlzZXMpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0Q29udGV4dCgpIHtcblx0XHRsZXQgb0NvbnRleHQ7XG5cdFx0c3dpdGNoICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKSkge1xuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLk9uZUNvbHVtbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRvQ29udGV4dCA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRFbmRIaWRkZW46XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5FbmRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHQvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtaWQgY29sdW1uIGZ1bGxzY3JlZW4gY29tZXMgZnJvbSBhIDIgb3IgYSAzIGNvbHVtbiBsYXlvdXRcblx0XHRcdFx0Y29uc3Qgc0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiA9ICh0aGlzLmdldEhlbHBlcigpLmdldEN1cnJlbnRVSVN0YXRlKCkgYXMgYW55KS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW47XG5cdFx0XHRcdGlmIChzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuLmluZGV4T2YoXCJUaHJlZUNvbHVtblwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0Ly8gV2UgY29tZSBmcm9tIGEgMyBjb2x1bW4gbGF5b3V0XG5cdFx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIGNvbWUgZnJvbSBhIDIgY29sdW1uIGxheW91dFxuXHRcdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dCA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0TG9nLmVycm9yKFwiVW5oYW5kbGVkIHN3aXRjaCBjYXNlIGZvciBcIiArIHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmNsQ29udHJvbGxlcjtcbiJdfQ==