@sapui5/sap.fe.templates 1.101.0 → 1.103.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 (136) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +2 -2
  4. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +1 -1
  5. package/src/sap/fe/templates/Feedback.js +18 -18
  6. package/src/sap/fe/templates/Feedback.ts +12 -12
  7. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +15 -15
  8. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +19 -16
  9. package/src/sap/fe/templates/ListReport/ListReport.view.xml +107 -58
  10. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +180 -70
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +191 -88
  12. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
  13. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
  14. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +1 -1
  15. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -2
  16. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -7
  17. package/src/sap/fe/templates/ListReport/overrides/Share.ts +10 -10
  18. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +13 -6
  19. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +17 -11
  20. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -1
  21. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +1 -1
  22. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +12 -16
  23. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +17 -20
  24. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +167 -20
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +195 -206
  26. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +187 -229
  27. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +861 -0
  28. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +822 -0
  29. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +2 -3
  30. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +4 -4
  31. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
  32. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -1
  33. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  34. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -1
  35. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.js +103 -0
  36. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.ts +97 -0
  37. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +1 -1
  38. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +5 -5
  39. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
  40. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +2 -2
  41. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  42. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -2
  43. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +1 -1
  44. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +1 -1
  45. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +17 -17
  46. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +19 -30
  47. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +2 -2
  48. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +4 -4
  49. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +15 -11
  50. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +1 -2
  51. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +25 -17
  52. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +28 -24
  53. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
  54. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
  55. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
  56. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
  57. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -17
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +4 -3
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +7 -2
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +26 -0
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +4 -4
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +74 -6
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +118 -94
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +1 -0
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +1 -0
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +2 -2
  70. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +102 -57
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +96 -61
  72. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +3 -4
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +4 -5
  74. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +140 -52
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +108 -54
  76. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -1
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +3 -3
  78. package/src/sap/fe/templates/TableScroller.js +3 -3
  79. package/src/sap/fe/templates/TableScroller.ts +2 -2
  80. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +1 -0
  81. package/src/sap/fe/templates/controls/Table.fragment.xml +4 -4
  82. package/src/sap/fe/templates/library.js +5 -2
  83. package/src/sap/fe/templates/library.ts +3 -0
  84. package/src/sap/fe/templates/messagebundle.properties +6 -18
  85. package/src/sap/fe/templates/messagebundle_ar.properties +10 -6
  86. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_ca.properties +10 -6
  88. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cy.properties +10 -6
  90. package/src/sap/fe/templates/messagebundle_da.properties +10 -6
  91. package/src/sap/fe/templates/messagebundle_de.properties +10 -6
  92. package/src/sap/fe/templates/messagebundle_el.properties +10 -6
  93. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en_GB.properties +8 -4
  95. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +7 -3
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +7 -3
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +10 -6
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +10 -6
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +10 -6
  104. package/src/sap/fe/templates/messagebundle_hi.properties +10 -6
  105. package/src/sap/fe/templates/messagebundle_hr.properties +10 -6
  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 +10 -6
  109. package/src/sap/fe/templates/messagebundle_iw.properties +10 -6
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +10 -6
  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 +10 -6
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +10 -6
  118. package/src/sap/fe/templates/messagebundle_pl.properties +10 -6
  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 +10 -6
  122. package/src/sap/fe/templates/messagebundle_ru.properties +10 -6
  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 +10 -6
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +10 -6
  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 +10 -6
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +10 -6
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +10 -6
  133. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -482
  134. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +0 -511
  135. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
  136. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +0 -138
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper"], function (Log, BaseController, Placeholder, ClassSupport, SizeHelper, BindingParser, HashChanger, JSONModel, AnnotationHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper"], function (Log, BaseController, CommonUtils, Placeholder, ClassSupport, SizeHelper, BindingParser, HashChanger, JSONModel, AnnotationHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _class, _class2, _descriptor;
@@ -10,6 +10,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
10
10
  var usingExtension = ClassSupport.usingExtension;
11
11
  var defineUI5Class = ClassSupport.defineUI5Class;
12
12
 
13
+ function _catch(body, recover) {
14
+ try {
15
+ var result = body();
16
+ } catch (e) {
17
+ return recover(e);
18
+ }
19
+
20
+ if (result && result.then) {
21
+ return result.then(void 0, recover);
22
+ }
23
+
24
+ return result;
25
+ }
26
+
13
27
  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 }); }
14
28
 
15
29
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
@@ -69,7 +83,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
69
83
  * Convenience method for getting the resource bundle.
70
84
  *
71
85
  * @public
72
- * @returns {sap.ui.model.resource.ResourceModel} The resourceModel of the component
86
+ * @returns The resourceModel of the component
73
87
  */
74
88
  ;
75
89
 
@@ -99,8 +113,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
99
113
  * Function waiting for the Right most view to be ready.
100
114
  *
101
115
  * @memberof sap.fe.templates.RootContainer.controller.BaseController
102
- * @param {*} oEvent Reference an Event parameter coming from routeMatched event
103
- * @returns {Promise}
116
+ * @param oEvent Reference an Event parameter coming from routeMatched event
117
+ * @returns A promise indicating when the right most view is ready
104
118
  */
105
119
  ;
106
120
 
@@ -125,8 +139,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
125
139
 
126
140
  if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
127
141
  resolve(oRightMostFEView);
128
- } else {
129
- oRightMostFEView && oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function () {
142
+ } else if (oRightMostFEView) {
143
+ oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function () {
130
144
  resolve(oRightMostFEView);
131
145
  });
132
146
  }
@@ -190,8 +204,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
190
204
  *
191
205
  * @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
192
206
  * @memberof sap.fe.templates.RootContainer.controller.BaseController
193
- *
194
- * @returns {object} The TitleHierarchy cache
207
+ * @returns The TitleHierarchy cache
195
208
  */
196
209
  ;
197
210
 
@@ -206,10 +219,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
206
219
  * This function returns a titleInfo object.
207
220
  *
208
221
  * @memberof sap.fe.templates.RootContainer.controller.BaseController
209
- * @param {*} title
210
- * @param {*} subtitle
211
- * @param {*} sIntent The intent path to be redirected to
212
- * @returns {object} The title information
222
+ * @param title
223
+ * @param subtitle
224
+ * @param sIntent The intent path to be redirected to
225
+ * @returns The title information
213
226
  */
214
227
  ;
215
228
 
@@ -228,42 +241,118 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
228
241
  intent: sIntent,
229
242
  icon: ""
230
243
  };
244
+ };
245
+
246
+ _proto._formatTitle = function _formatTitle(displayMode, titleValue, titleDescription) {
247
+ var formattedTitle = "";
248
+
249
+ switch (displayMode) {
250
+ case "Value":
251
+ formattedTitle = "".concat(titleValue);
252
+ break;
253
+
254
+ case "ValueDescription":
255
+ formattedTitle = "".concat(titleValue, " (").concat(titleDescription, ")");
256
+ break;
257
+
258
+ case "DescriptionValue":
259
+ formattedTitle = "".concat(titleDescription, " (").concat(titleValue, ")");
260
+ break;
261
+
262
+ case "Description":
263
+ formattedTitle = "".concat(titleDescription);
264
+ break;
265
+
266
+ default:
267
+ }
268
+
269
+ return formattedTitle;
231
270
  }
232
271
  /**
233
272
  * Fetches the value of the HeaderInfo title for a given path.
234
273
  *
235
- * @param {string} sPath The path to the entity
236
- * @returns {Promise} A promise containing the value of the title, or an empty string if no HeaderInfo title annotation is available
274
+ * @param sPath The path to the entity
275
+ * @returns A promise containing the formatted title, or an empty string if no HeaderInfo title annotation is available
237
276
  */
238
277
  ;
239
278
 
240
279
  _proto._fetchTitleValue = function _fetchTitleValue(sPath) {
241
- var oAppComponent = this.getAppComponent(),
242
- oModel = this.getView().getModel(),
243
- oMetaModel = oAppComponent.getMetaModel(),
244
- sMetaPath = oMetaModel.getMetaPath(sPath);
245
- var sTitleExpression = AnnotationHelper.format(oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value"), {
246
- context: oMetaModel.createBindingContext("/")
247
- });
248
- var oTitleExpression = BindingParser.complexParser(sTitleExpression);
249
-
250
- if (oTitleExpression) {
251
- var sTitlePath = oTitleExpression.parts ? oTitleExpression.parts[0].path : oTitleExpression.path;
252
- var fnTitleFormatter = oTitleExpression.formatter;
253
- var oBindingViewContext = oModel.createBindingContext(sPath);
254
- var oPropertyBinding = oModel.bindProperty(sTitlePath, oBindingViewContext);
255
- oPropertyBinding.initialize();
256
- return new Promise(function (resolve) {
280
+ try {
281
+ var _this4 = this;
282
+
283
+ var oAppComponent = _this4.getAppComponent(),
284
+ oModel = _this4.getView().getModel(),
285
+ oMetaModel = oAppComponent.getMetaModel(),
286
+ sMetaPath = oMetaModel.getMetaPath(sPath),
287
+ oBindingViewContext = oModel.createBindingContext(sPath),
288
+ sValueExpression = AnnotationHelper.format(oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value")), {
289
+ context: oMetaModel.createBindingContext("/")
290
+ });
291
+
292
+ if (!sValueExpression) {
293
+ return Promise.resolve("");
294
+ }
295
+
296
+ var sTextExpression = AnnotationHelper.format(oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@com.sap.vocabularies.Common.v1.Text")), {
297
+ context: oMetaModel.createBindingContext("/")
298
+ }),
299
+ oPropertyContext = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@")),
300
+ aPromises = [],
301
+ oValueExpression = BindingParser.complexParser(sValueExpression),
302
+ oPromiseForDisplayMode = new Promise(function (resolve) {
303
+ var displayMode = CommonUtils.computeDisplayMode(oPropertyContext);
304
+ resolve(displayMode);
305
+ });
306
+ aPromises.push(oPromiseForDisplayMode);
307
+ var sValuePath = oValueExpression.parts ? oValueExpression.parts[0].path : oValueExpression.path,
308
+ fnValueFormatter = oValueExpression.formatter,
309
+ oValueBinding = oModel.bindProperty(sValuePath, oBindingViewContext);
310
+ oValueBinding.initialize();
311
+ var oPromiseForTitleValue = new Promise(function (resolve) {
257
312
  var fnChange = function (oEvent) {
258
- var sTargetValue = fnTitleFormatter ? fnTitleFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
259
- oPropertyBinding.detachChange(fnChange);
313
+ var sTargetValue = fnValueFormatter ? fnValueFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
314
+ oValueBinding.detachChange(fnChange);
260
315
  resolve(sTargetValue);
261
316
  };
262
317
 
263
- oPropertyBinding.attachChange(fnChange);
318
+ oValueBinding.attachChange(fnChange);
264
319
  });
265
- } else {
266
- return Promise.resolve("");
320
+ aPromises.push(oPromiseForTitleValue);
321
+
322
+ if (sTextExpression) {
323
+ var oTextExpression = BindingParser.complexParser(sTextExpression);
324
+ var sTextPath = oTextExpression.parts ? oTextExpression.parts[0].path : oTextExpression.path;
325
+ sTextPath = sValuePath.lastIndexOf("/") > -1 ? sValuePath.slice(0, sValuePath.lastIndexOf("/")) + "/" + sTextPath : sTextPath;
326
+ var fnTextFormatter = oTextExpression.formatter,
327
+ oTextBinding = oModel.bindProperty(sTextPath, oBindingViewContext);
328
+ oTextBinding.initialize();
329
+ var oPromiseForTitleText = new Promise(function (resolve) {
330
+ var fnChange = function (oEvent) {
331
+ var sTargetText = fnTextFormatter ? fnTextFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
332
+ oTextBinding.detachChange(fnChange);
333
+ resolve(sTargetText);
334
+ };
335
+
336
+ oTextBinding.attachChange(fnChange);
337
+ });
338
+ aPromises.push(oPromiseForTitleText);
339
+ }
340
+
341
+ return Promise.resolve(_catch(function () {
342
+ return Promise.resolve(Promise.all(aPromises)).then(function (titleInfo) {
343
+ var formattedTitle = "";
344
+
345
+ if (typeof titleInfo !== "string") {
346
+ formattedTitle = _this4._formatTitle(titleInfo[0], titleInfo[1], titleInfo[2]);
347
+ }
348
+
349
+ return formattedTitle;
350
+ });
351
+ }, function (error) {
352
+ Log.error("Error while fetching the title from the header info :" + error);
353
+ }));
354
+ } catch (e) {
355
+ return Promise.reject(e);
267
356
  }
268
357
  };
269
358
 
@@ -282,13 +371,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
282
371
  * @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
283
372
  * @memberof sap.fe.templates.RootContainer.controller.BaseController
284
373
  * @param {*} sPath path of the context to retrieve title information from MetaModel
285
- *
286
- * @returns {promise} oTitleinformation returned as promise
374
+ * @returns {Promise} oTitleinformation returned as promise
287
375
  */
288
376
  ;
289
377
 
290
378
  _proto.getTitleInfoFromPath = function getTitleInfoFromPath(sPath) {
291
- var _this3 = this;
379
+ var _this5 = this;
292
380
 
293
381
  var oTitleHierarchyCache = this._getTitleHierarchyCache();
294
382
 
@@ -299,13 +387,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
299
387
 
300
388
  var oMetaModel = this.getAppComponent().getMetaModel();
301
389
  var sEntityPath = oMetaModel.getMetaPath(sPath);
302
- var sTypeName = oMetaModel.getObject(sEntityPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName");
390
+ var sTypeName = oMetaModel.getObject("".concat(sEntityPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName"));
303
391
 
304
392
  var sAppSpecificHash = this._getAppSpecificHash();
305
393
 
306
394
  var sIntent = sAppSpecificHash + sPath.slice(1);
307
395
  return this._fetchTitleValue(sPath).then(function (sTitle) {
308
- var oTitleInfo = _this3._computeTitleInfo(sTypeName, sTitle, sIntent);
396
+ var oTitleInfo = _this5._computeTitleInfo(sTypeName, sTitle, sIntent);
309
397
 
310
398
  oTitleHierarchyCache[sPath] = oTitleInfo;
311
399
  return oTitleInfo;
@@ -321,8 +409,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
321
409
  *
322
410
  * Creates a new hierarchy and converts non-string types to string.
323
411
  *
324
- * @param {*} aHierarchy Shell title hierarchy
325
- * @returns {*} Copy of shell title hierarchy containing all elements as strings
412
+ * @param aHierarchy Shell title hierarchy
413
+ * @returns Copy of shell title hierarchy containing all elements as strings
326
414
  */
327
415
  ;
328
416
 
@@ -364,13 +452,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
364
452
  * This function is updating the shell title after each navigation.
365
453
  *
366
454
  * @memberof sap.fe.templates.RootContainer.controller.BaseController
367
- * @param {*} oView The current view
368
- * @returns {*} A Promise that is resolved when the menu is filled properly
455
+ * @param oView The current view
456
+ * @returns A Promise that is resolved when the menu is filled properly
369
457
  */
370
458
  ;
371
459
 
372
460
  _proto._computeTitleHierarchy = function _computeTitleHierarchy(oView) {
373
- var _this4 = this;
461
+ var _this6 = this;
374
462
 
375
463
  var oAppComponent = this.getAppComponent(),
376
464
  oContext = oView.getBindingContext(),
@@ -398,13 +486,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
398
486
  aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
399
487
 
400
488
  aPathParts.forEach(function (sPathPart) {
401
- sPath += "/" + sPathPart;
489
+ sPath += "/".concat(sPathPart);
402
490
  var oMetaModel = oAppComponent.getMetaModel(),
403
491
  sParameterPath = oMetaModel.getMetaPath(sPath),
404
- bIsParameterized = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
492
+ bIsParameterized = oMetaModel.getObject("".concat(sParameterPath, "/@com.sap.vocabularies.Common.v1.ResultContext"));
405
493
 
406
494
  if (!bIsParameterized) {
407
- aTitleInformationPromises.push(_this4.getTitleInfoFromPath(sPath));
495
+ aTitleInformationPromises.push(_this6.getTitleInfoFromPath(sPath));
408
496
  }
409
497
  });
410
498
  } // Current page
@@ -424,7 +512,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
424
512
 
425
513
  return Promise.all(aTitleInformationPromises).then(function (aTitleInfoHierarchy) {
426
514
  // workaround for shell which is expecting all elements being of type string
427
- var aTitleInfoHierarchyShell = _this4._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
515
+ var aTitleInfoHierarchyShell = _this6._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
428
516
  sTitle = oPageTitleInformation.title;
429
517
 
430
518
  oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
@@ -432,7 +520,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
432
520
  }).catch(function (sErrorMessage) {
433
521
  Log.error(sErrorMessage);
434
522
  }).finally(function () {
435
- _this4.bIsComputingTitleHierachy = false;
523
+ _this6.bIsComputingTitleHierachy = false;
436
524
  }).catch(function (sErrorMessage) {
437
525
  Log.error(sErrorMessage);
438
526
  });
@@ -445,7 +533,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
445
533
  /**
446
534
  * Callback after a view has been bound to a context.
447
535
  *
448
- * @param {sap.ui.model.odata.v4.Context} oContext The context that has been bound to a view
536
+ * @param oContext The context that has been bound to a view
449
537
  */
450
538
  ;
451
539
 
@@ -484,4 +572,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/contro
484
572
  })), _class2)) || _class);
485
573
  return RootContainerBaseController;
486
574
  }, false);
487
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5Iiwib25Jbml0IiwiU2l6ZUhlbHBlciIsImluaXQiLCJfYUhlbHBlck1vZGVscyIsImdldFBsYWNlaG9sZGVyIiwib1BsYWNlaG9sZGVyIiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJfb25BZnRlclJvdXRlTWF0Y2hlZCIsIm9uRXhpdCIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwib1JvdXRlciIsInVuZGVmaW5lZCIsImV4aXQiLCJmb3JFYWNoIiwib01vZGVsIiwiZGVzdHJveSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRNb2RlbCIsImdldFJvdXRlciIsIl9jcmVhdGVIZWxwZXJNb2RlbCIsIkpTT05Nb2RlbCIsInB1c2giLCJ3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5Iiwib0V2ZW50IiwiUHJvbWlzZSIsInJlc29sdmUiLCJhQ29udGFpbmVycyIsImdldFBhcmFtZXRlciIsImFGRUNvbnRhaW5lcnMiLCJvQ29udGFpbmVyIiwib1ZpZXciLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldFJvb3RDb250cm9sIiwiZ2V0Q29udHJvbGxlciIsInBhZ2VSZWFkeSIsIm9SaWdodE1vc3RGRVZpZXciLCJsZW5ndGgiLCJpc1BhZ2VSZWFkeSIsImF0dGFjaEV2ZW50T25jZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsInRoZW4iLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiX2NvbXB1dGVUaXRsZUhpZXJhcmNoeSIsImJGb3JjZUZvY3VzIiwiZ2V0Um91dGVyUHJveHkiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJvblBhZ2VSZWFkeSIsImdldFBhcmVudCIsImZvcmNlRm9jdXMiLCJvbkNvbnRhaW5lclJlYWR5IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImZpbmFsbHkiLCJfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9UaXRsZUhpZXJhcmNoeUNhY2hlIiwiX2NvbXB1dGVUaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwic0ludGVudCIsImFQYXJ0cyIsInNwbGl0IiwiaW5kZXhPZiIsImludGVudCIsImljb24iLCJfZmV0Y2hUaXRsZVZhbHVlIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzVGl0bGVFeHByZXNzaW9uIiwiQW5ub3RhdGlvbkhlbHBlciIsImZvcm1hdCIsImdldE9iamVjdCIsImNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9UaXRsZUV4cHJlc3Npb24iLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsInNUaXRsZVBhdGgiLCJwYXJ0cyIsInBhdGgiLCJmblRpdGxlRm9ybWF0dGVyIiwiZm9ybWF0dGVyIiwib0JpbmRpbmdWaWV3Q29udGV4dCIsIm9Qcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJpbml0aWFsaXplIiwiZm5DaGFuZ2UiLCJzVGFyZ2V0VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRWYWx1ZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJIYXNoQ2hhbmdlciIsImdldEluc3RhbmNlIiwiaHJlZkZvckFwcFNwZWNpZmljSGFzaCIsIl9nZXRIYXNoIiwiZ2V0SGFzaCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwic0VudGl0eVBhdGgiLCJzVHlwZU5hbWUiLCJzQXBwU3BlY2lmaWNIYXNoIiwic2xpY2UiLCJzVGl0bGUiLCJvVGl0bGVJbmZvIiwiX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyIsImFIaWVyYXJjaHkiLCJhSGllcmFyY2h5U2hlbGwiLCJsZXZlbCIsIm9IaWVyYXJjaHkiLCJvU2hlbGxIaWVyYXJjaHkiLCJrZXkiLCJTdHJpbmciLCJfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoIiwic0hhc2giLCJzVGFyZ2V0VHlwZSIsImFSb3V0ZXMiLCJnZXRNYW5pZmVzdEVudHJ5IiwiaiIsIm9Sb3V0ZSIsImdldFJvdXRlIiwibmFtZSIsIm1hdGNoIiwic1RhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsImdldFRhcmdldCIsIl9vT3B0aW9ucyIsIm9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ3VycmVudFBhZ2UiLCJhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzIiwic0FwcFRpdGxlIiwiZ2V0TWV0YWRhdGEiLCJzQXBwU3ViVGl0bGUiLCJhcHBTdWJUaXRsZSIsIm9QYWdlVGl0bGVJbmZvcm1hdGlvbiIsInNOZXdQYXRoIiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwiZ2V0UGF0aCIsImFQYXRoUGFydHMiLCJzaGlmdCIsInBvcCIsInNQYXRoUGFydCIsInNQYXJhbWV0ZXJQYXRoIiwiYklzUGFyYW1ldGVyaXplZCIsInJlamVjdCIsImFsbCIsImFUaXRsZUluZm9IaWVyYXJjaHkiLCJhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0SGllcmFyY2h5IiwicmV2ZXJzZSIsInNldFRpdGxlIiwic0Vycm9yTWVzc2FnZSIsImNhbGN1bGF0ZUxheW91dCIsImlOZXh0RkNMTGV2ZWwiLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9uQ29udGV4dEJvdW5kVG9WaWV3Iiwic0RlZXBlc3RQYXRoIiwiZ2V0UHJvcGVydHkiLCJzVmlld0NvbnRleHRQYXRoIiwiZGlzcGxheU1lc3NhZ2VQYWdlIiwibVBhcmFtZXRlcnMiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIkZDTExldmVsIiwiQmFzZUNvbnRyb2xsZXIiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQVlNQSwyQixXQURMQyxjQUFjLENBQUMsdUVBQUQsQyxVQUViQyxjQUFjLENBQUNDLFdBQUQsQzs7Ozs7Ozs7Ozs7Ozs7WUFNUEMseUIsR0FBcUMsSzs7Ozs7O1dBRTdDQyxNLEdBQUEsa0JBQVM7QUFDUkMsTUFBQUEsVUFBVSxDQUFDQyxJQUFYO0FBRUEsV0FBS0MsY0FBTCxHQUFzQixFQUF0QjtBQUNBLEs7O1dBRURDLGMsR0FBQSwwQkFBaUI7QUFDaEIsYUFBTyxLQUFLQyxZQUFaO0FBQ0EsSzs7V0FDREMsbUIsR0FBQSwrQkFBc0I7QUFDckIsV0FBS0QsWUFBTCxDQUFrQkMsbUJBQWxCO0FBQ0EsV0FBS0MsZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDQyx1QkFBM0MsQ0FBbUUsS0FBS0Msb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsSzs7V0FDREMsTSxHQUFBLGtCQUFTO0FBQ1IsV0FBS0osZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDSSx1QkFBM0MsQ0FBbUUsS0FBS0Ysb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsV0FBS0csT0FBTCxHQUFlQyxTQUFmO0FBRUFiLE1BQUFBLFVBQVUsQ0FBQ2MsSUFBWCxHQUpRLENBTVI7O0FBQ0EsV0FBS1osY0FBTCxDQUFvQmEsT0FBcEIsQ0FBNEIsVUFBVUMsTUFBVixFQUF1QjtBQUNsREEsUUFBQUEsTUFBTSxDQUFDQyxPQUFQO0FBQ0EsT0FGRDtBQUdBO0FBQ0Q7QUFD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QyxFQUFnRCxDQUMvQztBQUNBLEs7O1dBQ0R0SSxpQyxHQUFBLDZDQUEwQyxDQUN6QztBQUNBLEs7OztJQWphd0N1SSxjOzs7Ozs7U0F1YTNCaE0sMkIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU2l6ZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9TaXplSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlclwiKVxuY2xhc3MgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdG9QbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRwcml2YXRlIF9hSGVscGVyTW9kZWxzITogYW55W107XG5cdHByaXZhdGUgb1JvdXRlcj86IFJvdXRlcjtcblx0cHJpdmF0ZSBfb1JvdXRlTWF0Y2hlZFByb21pc2U6IGFueTtcblx0cHJpdmF0ZSBvVGl0bGVIaWVyYXJjaHlDYWNoZTogYW55O1xuXHRwcml2YXRlIGJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRvbkluaXQoKSB7XG5cdFx0U2l6ZUhlbHBlci5pbml0KCk7XG5cblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzID0gW107XG5cdH1cblxuXHRnZXRQbGFjZWhvbGRlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5vUGxhY2Vob2xkZXI7XG5cdH1cblx0YXR0YWNoUm91dGVNYXRjaGVycygpIHtcblx0XHR0aGlzLm9QbGFjZWhvbGRlci5hdHRhY2hSb3V0ZU1hdGNoZXJzKCk7XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHR9XG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5fb25BZnRlclJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyID0gdW5kZWZpbmVkO1xuXG5cdFx0U2l6ZUhlbHBlci5leGl0KCk7XG5cblx0XHQvLyBEZXN0cm95IGFsbCBKU09OIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5IGZvciB0aGUgdmlld3Ncblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKG9Nb2RlbDogYW55KSB7XG5cdFx0XHRvTW9kZWwuZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLnJlc291cmNlLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZU1vZGVsIG9mIHRoZSBjb21wb25lbnRcblx0ICovXG5cdGdldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHR9XG5cdGdldFJvdXRlcigpIHtcblx0XHRpZiAoIXRoaXMub1JvdXRlcikge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyO1xuXHR9XG5cblx0X2NyZWF0ZUhlbHBlck1vZGVsKCkge1xuXHRcdC8vIFdlIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5LCBhcyB0aGV5IGRvbid0IGdldCBkZXN0cm95ZWRcblx0XHQvLyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXcgaXMgZGVzdHJveWVkLlxuXHRcdC8vIFRoaXMgaXMgZG9uZSBkdXJpbmcgb25FeGl0XG5cdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMucHVzaChvTW9kZWwpO1xuXG5cdFx0cmV0dXJuIG9Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3YWl0aW5nIGZvciB0aGUgUmlnaHQgbW9zdCB2aWV3IHRvIGJlIHJlYWR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnQgUmVmZXJlbmNlIGFuIEV2ZW50IHBhcmFtZXRlciBjb21pbmcgZnJvbSByb3V0ZU1hdGNoZWQgZXZlbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHR3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudDogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgYUNvbnRhaW5lcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIiksXG5cdFx0XHRcdC8vIFRoZXJlIGNhbiBhbHNvIGJlIHJldXNlIGNvbXBvbmVudHMgaW4gdGhlIHZpZXcsIHJlbW92ZSB0aGVtIGJlZm9yZSBwcm9jZXNzaW5nLlxuXHRcdFx0XHRhRkVDb250YWluZXJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUNvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdFx0XHRcdGxldCBvVmlldyA9IG9Db250YWluZXI7XG5cdFx0XHRcdGlmIChvQ29udGFpbmVyICYmIG9Db250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29tcG9uZW50SW5zdGFuY2UgPSBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0b1ZpZXcgPSBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkpIHtcblx0XHRcdFx0XHRhRkVDb250YWluZXJzLnB1c2gob1ZpZXcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9SaWdodE1vc3RGRVZpZXcgPSBhRkVDb250YWluZXJzW2FGRUNvbnRhaW5lcnMubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAob1JpZ2h0TW9zdEZFVmlldyAmJiBvUmlnaHRNb3N0RkVWaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkuaXNQYWdlUmVhZHkoKSkge1xuXHRcdFx0XHRyZXNvbHZlKG9SaWdodE1vc3RGRVZpZXcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1JpZ2h0TW9zdEZFVmlldyAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmUuXG5cdCAqICAtIHVwZGF0ZSB0aGUgc2hlbGwgdGl0bGUuXG5cdCAqICAtIHVwZGF0ZSB0YWJsZSBzY3JvbGwuXG5cdCAqICAtIGNhbGwgb25QYWdlUmVhZHkgb24gdGhlIHJpZ2h0TW9zdFZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX29uQWZ0ZXJSb3V0ZU1hdGNoZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqL1xuXHRfb25BZnRlclJvdXRlTWF0Y2hlZChvRXZlbnQ6IGFueSkge1xuXHRcdGlmICghdGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gdGhpcy53YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudClcblx0XHRcdFx0LnRoZW4oKG9WaWV3OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBUaGUgYXV0b0ZvY3VzIGlzIGluaXRpYWxseSBkaXNhYmxlZCBvbiB0aGUgbmF2Q29udGFpbmVyIG9yIHRoZSBGQ0wsIHNvIHRoYXQgdGhlIGZvY3VzIHN0YXlzIG9uIHRoZSBTaGVsbCBtZW51XG5cdFx0XHRcdFx0Ly8gZXZlbiBpZiB0aGUgYXBwIHRha2VzIGEgbG9uZyB0aW1lIHRvIGxhdW5jaFxuXHRcdFx0XHRcdC8vIFRoZSBmaXJzdCB0aW1lIHRoZSB2aWV3IGlzIGRpc3BsYXllZCwgd2UgbmVlZCB0byBlbmFibGUgdGhlIGF1dG9mb2N1cyBzbyB0aGF0IGl0J3MgbWFuYWdlZCBwcm9wZXJseSBkdXJpbmcgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGNvbnN0IG9Sb290Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXSBhcyBhbnk7XG5cdFx0XHRcdFx0aWYgKG9Sb290Q29udHJvbCAmJiBvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzICYmICFvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzKCkpIHtcblx0XHRcdFx0XHRcdG9Sb290Q29udHJvbC5zZXRQcm9wZXJ0eShcImF1dG9Gb2N1c1wiLCB0cnVlLCB0cnVlKTsgLy8gRG8gbm90IG1hcmsgdGhlIGNvbnRhaW5lciBhcyBpbnZhbGlkLCBvdGhlcndpc2UgaXQncyByZS1yZW5kZXJlZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdHRoaXMuX3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk7XG5cdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5VU2hlbGwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NvbXB1dGVUaXRsZUhpZXJhcmNoeShvVmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJGb3JjZUZvY3VzID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmlzRm9jdXNGb3JjZWQoKTtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0Rm9jdXNGb3JjZWQoZmFsc2UpOyAvLyByZXNldFxuXHRcdFx0XHRcdGlmIChvVmlldy5nZXRDb250cm9sbGVyKCkgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpLm9uUGFnZVJlYWR5ICYmIG9WaWV3LmdldFBhcmVudCgpLm9uUGFnZVJlYWR5KSB7XG5cdFx0XHRcdFx0XHRvVmlldy5nZXRQYXJlbnQoKS5vblBhZ2VSZWFkeSh7IGZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5vbkNvbnRhaW5lclJlYWR5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tcHV0aW5nIHRoZSB0aXRsZSBoaWVyYXJjaHkgYW5kIGNhbGxpbmcgZm9jdXMgbWV0aG9kXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IG51bGw7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRpdGxlSGllcmFyY2h5IGNhY2hlICggb3IgaW5pdGlhbGl6ZXMgaXQgaWYgdW5kZWZpbmVkKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX2dldFRpdGxlSGllcmFyY2h5Q2FjaGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBUaGUgVGl0bGVIaWVyYXJjaHkgY2FjaGVcblx0ICovXG5cdF9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCkge1xuXHRcdGlmICghdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSkge1xuXHRcdFx0dGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSA9IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0aXRsZUluZm8gb2JqZWN0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSB0aXRsZVxuXHQgKiBAcGFyYW0geyp9IHN1YnRpdGxlXG5cdCAqIEBwYXJhbSB7Kn0gc0ludGVudCBUaGUgaW50ZW50IHBhdGggdG8gYmUgcmVkaXJlY3RlZCB0b1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdGl0bGUgaW5mb3JtYXRpb25cblx0ICovXG5cdF9jb21wdXRlVGl0bGVJbmZvKHRpdGxlOiBhbnksIHN1YnRpdGxlOiBhbnksIHNJbnRlbnQ6IGFueSkge1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNJbnRlbnQuc3BsaXQoXCIvXCIpO1xuXHRcdGlmIChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLmluZGV4T2YoXCI/XCIpID09PSAtMSkge1xuXHRcdFx0c0ludGVudCArPSBcIj9yZXN0b3JlSGlzdG9yeT10cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNJbnRlbnQgKz0gXCImcmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3VidGl0bGU6IHN1YnRpdGxlLFxuXHRcdFx0aW50ZW50OiBzSW50ZW50LFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIEhlYWRlckluZm8gdGl0bGUgZm9yIGEgZ2l2ZW4gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFRoZSBwYXRoIHRvIHRoZSBlbnRpdHlcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBIZWFkZXJJbmZvIHRpdGxlIGFubm90YXRpb24gaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRfZmV0Y2hUaXRsZVZhbHVlKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXG5cdFx0Y29uc3Qgc1RpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWVcIiksXG5cdFx0XHR7IGNvbnRleHQ6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQgfVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1RpdGxlRXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzVGl0bGVFeHByZXNzaW9uKTtcblxuXHRcdGlmIChvVGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRjb25zdCBzVGl0bGVQYXRoID0gb1RpdGxlRXhwcmVzc2lvbi5wYXJ0cyA/IG9UaXRsZUV4cHJlc3Npb24ucGFydHNbMF0ucGF0aCA6IG9UaXRsZUV4cHJlc3Npb24ucGF0aDtcblx0XHRcdGNvbnN0IGZuVGl0bGVGb3JtYXR0ZXIgPSBvVGl0bGVFeHByZXNzaW9uLmZvcm1hdHRlcjtcblx0XHRcdGNvbnN0IG9CaW5kaW5nVmlld0NvbnRleHQgPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpO1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5QmluZGluZyA9IG9Nb2RlbC5iaW5kUHJvcGVydHkoc1RpdGxlUGF0aCwgb0JpbmRpbmdWaWV3Q29udGV4dCk7XG5cblx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RhcmdldFZhbHVlID0gZm5UaXRsZUZvcm1hdHRlciA/IGZuVGl0bGVGb3JtYXR0ZXIob0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogb0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0XHRvUHJvcGVydHlCaW5kaW5nLmRldGFjaENoYW5nZShmbkNoYW5nZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShzVGFyZ2V0VmFsdWUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRBcHBTcGVjaWZpY0hhc2goKSB7XG5cdFx0Ly8gSGFzaENoYW5nZWQgaXNTaGVsbE5hdmlnYXRpb25IYXNoQ2hhbmdlclxuXHRcdHJldHVybiAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hcblx0XHRcdD8gKEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkgYXMgYW55KS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblxuXHRfZ2V0SGFzaCgpIHtcblx0XHRyZXR1cm4gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRpdGxlSW5mb3JtYXRpb24gZnJvbSBhIHBhdGguXG5cdCAqIEl0IHVwZGF0ZXMgdGhlIGNhY2hlIHRvIHN0b3JlIFRpdGxlIEluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeVxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNnZXRUaXRsZUluZm9Gcm9tUGF0aFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBzUGF0aCBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIHJldHJpZXZlIHRpdGxlIGluZm9ybWF0aW9uIGZyb20gTWV0YU1vZGVsXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSAgb1RpdGxlaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcHJvbWlzZVxuXHQgKi9cblxuXHRnZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aDogYW55KSB7XG5cdFx0Y29uc3Qgb1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk7XG5cblx0XHRpZiAob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKSB7XG5cdFx0XHQvLyBUaGUgdGl0bGUgaW5mbyBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY2FjaGVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IHNUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVHlwZU5hbWVcIik7XG5cdFx0Y29uc3Qgc0FwcFNwZWNpZmljSGFzaCA9IHRoaXMuX2dldEFwcFNwZWNpZmljSGFzaCgpO1xuXHRcdGNvbnN0IHNJbnRlbnQgPSBzQXBwU3BlY2lmaWNIYXNoICsgc1BhdGguc2xpY2UoMSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZmV0Y2hUaXRsZVZhbHVlKHNQYXRoKS50aGVuKChzVGl0bGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb1RpdGxlSW5mbyA9IHRoaXMuX2NvbXB1dGVUaXRsZUluZm8oc1R5cGVOYW1lLCBzVGl0bGUsIHNJbnRlbnQpO1xuXHRcdFx0b1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdID0gb1RpdGxlSW5mbztcblx0XHRcdHJldHVybiBvVGl0bGVJbmZvO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgdXNoZWxsIHNlcnZpY2UgcmVjZWl2ZXMgYWxsIGVsZW1lbnRzXG5cdCAqICh0aXRsZSwgc3VidGl0bGUsIGludGVudCwgaWNvbikgYXMgc3RyaW5ncy5cblx0ICpcblx0ICogQW5ub3RhdGlvbiBIZWFkZXJJbmZvIGFsbG93cyBmb3IgYmluZGluZyBvZiB0aXRsZSBhbmQgZGVzY3JpcHRpb25cblx0ICogKHdoaWNoIGFyZSB1c2VkIGhlcmUgYXMgdGl0bGUgYW5kIHN1YnRpdGxlKSB0byBhbnkgZWxlbWVudCBpbiB0aGUgZW50aXR5XG5cdCAqIChiZWluZyBwb3NzaWJseSB0eXBlcyBsaWtlIGJvb2xlYW4sIHRpbWVzdGFtcCwgZG91YmxlLCBldGMuKVxuXHQgKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGhpZXJhcmNoeSBhbmQgY29udmVydHMgbm9uLXN0cmluZyB0eXBlcyB0byBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYUhpZXJhcmNoeSBTaGVsbCB0aXRsZSBoaWVyYXJjaHlcblx0ICogQHJldHVybnMgeyp9IENvcHkgb2Ygc2hlbGwgdGl0bGUgaGllcmFyY2h5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGFzIHN0cmluZ3Ncblx0ICovXG5cdF9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MoYUhpZXJhcmNoeTogYW55KSB7XG5cdFx0Y29uc3QgYUhpZXJhcmNoeVNoZWxsID0gW107XG5cdFx0Zm9yIChjb25zdCBsZXZlbCBpbiBhSGllcmFyY2h5KSB7XG5cdFx0XHRjb25zdCBvSGllcmFyY2h5ID0gYUhpZXJhcmNoeVtsZXZlbF07XG5cdFx0XHRjb25zdCBvU2hlbGxIaWVyYXJjaHk6IGFueSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0hpZXJhcmNoeSkge1xuXHRcdFx0XHRvU2hlbGxIaWVyYXJjaHlba2V5XSA9IHR5cGVvZiBvSGllcmFyY2h5W2tleV0gIT09IFwic3RyaW5nXCIgPyBTdHJpbmcob0hpZXJhcmNoeVtrZXldKSA6IG9IaWVyYXJjaHlba2V5XTtcblx0XHRcdH1cblx0XHRcdGFIaWVyYXJjaHlTaGVsbC5wdXNoKG9TaGVsbEhpZXJhcmNoeSk7XG5cdFx0fVxuXHRcdHJldHVybiBhSGllcmFyY2h5U2hlbGw7XG5cdH1cblxuXHRfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoKHNIYXNoOiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRsZXQgc1RhcmdldFR5cGUgPSBcIlwiO1xuXG5cdFx0Y29uc3QgYVJvdXRlcyA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVJvdXRlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRSb3V0ZShhUm91dGVzW2pdLm5hbWUpO1xuXHRcdFx0aWYgKG9Sb3V0ZS5tYXRjaChzSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9IEFycmF5LmlzQXJyYXkoYVJvdXRlc1tqXS50YXJnZXQpID8gYVJvdXRlc1tqXS50YXJnZXRbMF0gOiBhUm91dGVzW2pdLnRhcmdldDtcblx0XHRcdFx0c1RhcmdldFR5cGUgPSAob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQoc1RhcmdldCkgYXMgYW55KS5fb09wdGlvbnMubmFtZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNUYXJnZXRUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXBkYXRpbmcgdGhlIHNoZWxsIHRpdGxlIGFmdGVyIGVhY2ggbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSB7Kn0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7Kn0gQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbWVudSBpcyBmaWxsZWQgcHJvcGVybHlcblx0ICovXG5cdF9jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXc6IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0b0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0N1cnJlbnRQYWdlID0gb1ZpZXcuZ2V0UGFyZW50KCksXG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzID0gW10sXG5cdFx0XHRzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCksXG5cdFx0XHRzQXBwVGl0bGUgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIikudGl0bGUgfHwgXCJcIixcblx0XHRcdHNBcHBTdWJUaXRsZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKS5hcHBTdWJUaXRsZSB8fCBcIlwiO1xuXHRcdGxldCBvUGFnZVRpdGxlSW5mb3JtYXRpb246IGFueSwgc05ld1BhdGg7XG5cblx0XHRpZiAob0N1cnJlbnRQYWdlICYmIG9DdXJyZW50UGFnZS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24pIHtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhzQXBwVGl0bGUsIHNBcHBTdWJUaXRsZSwgc0FwcFNwZWNpZmljSGFzaCkpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRoZW4gbWFuYWdlIG90aGVyIHBhZ2VzXG5cdFx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc05ld1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXG5cdFx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50IChlbXB0eSBzdHJpbmcpIGFzIGl0IGhhcyBiZWVuIG1hbmFnZWQgYWJvdmVcblx0XHRcdFx0YVBhdGhQYXJ0cy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdWxkbid0IGFwcGVhciBpbiB0aGUgbWVudVxuXG5cdFx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaCgoc1BhdGhQYXJ0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRzUGF0aCArPSBcIi9cIiArIHNQYXRoUGFydDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCksXG5cdFx0XHRcdFx0XHRiSXNQYXJhbWV0ZXJpemVkID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhcmFtZXRlclBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRcIik7XG5cdFx0XHRcdFx0aWYgKCFiSXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHRcdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2godGhpcy5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1cnJlbnQgcGFnZVxuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gb0N1cnJlbnRQYWdlLl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpO1xuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlLFxuXHRcdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24uc3VidGl0bGUsXG5cdFx0XHRcdHNBcHBTcGVjaWZpY0hhc2ggKyB0aGlzLl9nZXRIYXNoKClcblx0XHRcdCk7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKClbc05ld1BhdGhdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW3NBcHBTcGVjaWZpY0hhc2hdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZWplY3QoXCJUaXRsZSBpbmZvcm1hdGlvbiBtaXNzaW5nIGluIEhlYWRlckluZm9cIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcylcblx0XHRcdC50aGVuKChhVGl0bGVJbmZvSGllcmFyY2h5OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIGZvciBzaGVsbCB3aGljaCBpcyBleHBlY3RpbmcgYWxsIGVsZW1lbnRzIGJlaW5nIG9mIHR5cGUgc3RyaW5nXG5cdFx0XHRcdGNvbnN0IGFUaXRsZUluZm9IaWVyYXJjaHlTaGVsbCA9IHRoaXMuX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyhhVGl0bGVJbmZvSGllcmFyY2h5KSxcblx0XHRcdFx0XHRzVGl0bGUgPSBvUGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGU7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEhpZXJhcmNoeShhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwucmV2ZXJzZSgpKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0VGl0bGUoc1RpdGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgYWZ0ZXIgYSB2aWV3IGhhcyBiZWVuIGJvdW5kIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHZpZXdcblx0ICovXG5cdG9uQ29udGV4dEJvdW5kVG9WaWV3KG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNEZWVwZXN0UGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiksXG5cdFx0XHRcdHNWaWV3Q29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHRcdGlmICghc0RlZXBlc3RQYXRoIHx8IHNEZWVwZXN0UGF0aC5pbmRleE9mKHNWaWV3Q29udGV4dFBhdGgpICE9PSAwKSB7XG5cdFx0XHRcdC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGRlZXBlc3QgcmVhY2hlZCBwYXRoLCBvciB0aGUgcGF0aFxuXHRcdFx0XHQvLyBmb3IgdGhlIHZpZXcgaXNuJ3QgYSBzdWJwYXRoIG9mIHRoZSBwcmV2aW91cyBkZWVwZXN0IHBhdGggLS0+IHVwZGF0ZVxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIsIHNWaWV3Q29udGV4dFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cbn1cbmludGVyZmFjZSBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIge1xuXHRvbkNvbnRhaW5lclJlYWR5PygpOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXI7XG4iXX0=
575
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsIm9uSW5pdCIsIlNpemVIZWxwZXIiLCJpbml0IiwiX2FIZWxwZXJNb2RlbHMiLCJnZXRQbGFjZWhvbGRlciIsIm9QbGFjZWhvbGRlciIsImF0dGFjaFJvdXRlTWF0Y2hlcnMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiX29uQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJvbkV4aXQiLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsIm9Sb3V0ZXIiLCJ1bmRlZmluZWQiLCJleGl0IiwiZm9yRWFjaCIsIm9Nb2RlbCIsImRlc3Ryb3kiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsImdldE93bmVyQ29tcG9uZW50IiwiZ2V0TW9kZWwiLCJnZXRSb3V0ZXIiLCJfY3JlYXRlSGVscGVyTW9kZWwiLCJKU09OTW9kZWwiLCJwdXNoIiwid2FpdEZvclJpZ2h0TW9zdFZpZXdSZWFkeSIsIm9FdmVudCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYUNvbnRhaW5lcnMiLCJnZXRQYXJhbWV0ZXIiLCJhRkVDb250YWluZXJzIiwib0NvbnRhaW5lciIsIm9WaWV3IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJvQ29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJvUmlnaHRNb3N0RkVWaWV3IiwibGVuZ3RoIiwiaXNQYWdlUmVhZHkiLCJhdHRhY2hFdmVudE9uY2UiLCJfb1JvdXRlTWF0Y2hlZFByb21pc2UiLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiX2NvbXB1dGVUaXRsZUhpZXJhcmNoeSIsImJGb3JjZUZvY3VzIiwiZ2V0Um91dGVyUHJveHkiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJvblBhZ2VSZWFkeSIsImdldFBhcmVudCIsImZvcmNlRm9jdXMiLCJvbkNvbnRhaW5lclJlYWR5IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImZpbmFsbHkiLCJfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9UaXRsZUhpZXJhcmNoeUNhY2hlIiwiX2NvbXB1dGVUaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwic0ludGVudCIsImFQYXJ0cyIsInNwbGl0IiwiaW5kZXhPZiIsImludGVudCIsImljb24iLCJfZm9ybWF0VGl0bGUiLCJkaXNwbGF5TW9kZSIsInRpdGxlVmFsdWUiLCJ0aXRsZURlc2NyaXB0aW9uIiwiZm9ybWF0dGVkVGl0bGUiLCJfZmV0Y2hUaXRsZVZhbHVlIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJvQmluZGluZ1ZpZXdDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJzVmFsdWVFeHByZXNzaW9uIiwiQW5ub3RhdGlvbkhlbHBlciIsImZvcm1hdCIsImdldE9iamVjdCIsImNvbnRleHQiLCJzVGV4dEV4cHJlc3Npb24iLCJvUHJvcGVydHlDb250ZXh0IiwiYVByb21pc2VzIiwib1ZhbHVlRXhwcmVzc2lvbiIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwib1Byb21pc2VGb3JEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwic1ZhbHVlUGF0aCIsInBhcnRzIiwicGF0aCIsImZuVmFsdWVGb3JtYXR0ZXIiLCJmb3JtYXR0ZXIiLCJvVmFsdWVCaW5kaW5nIiwiYmluZFByb3BlcnR5IiwiaW5pdGlhbGl6ZSIsIm9Qcm9taXNlRm9yVGl0bGVWYWx1ZSIsImZuQ2hhbmdlIiwic1RhcmdldFZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0VmFsdWUiLCJkZXRhY2hDaGFuZ2UiLCJhdHRhY2hDaGFuZ2UiLCJvVGV4dEV4cHJlc3Npb24iLCJzVGV4dFBhdGgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIiwiZm5UZXh0Rm9ybWF0dGVyIiwib1RleHRCaW5kaW5nIiwib1Byb21pc2VGb3JUaXRsZVRleHQiLCJzVGFyZ2V0VGV4dCIsImFsbCIsInRpdGxlSW5mbyIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJIYXNoQ2hhbmdlciIsImdldEluc3RhbmNlIiwiaHJlZkZvckFwcFNwZWNpZmljSGFzaCIsIl9nZXRIYXNoIiwiZ2V0SGFzaCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwic0VudGl0eVBhdGgiLCJzVHlwZU5hbWUiLCJzQXBwU3BlY2lmaWNIYXNoIiwic1RpdGxlIiwib1RpdGxlSW5mbyIsIl9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MiLCJhSGllcmFyY2h5IiwiYUhpZXJhcmNoeVNoZWxsIiwibGV2ZWwiLCJvSGllcmFyY2h5Iiwib1NoZWxsSGllcmFyY2h5Iiwia2V5IiwiU3RyaW5nIiwiX2dldFRhcmdldFR5cGVGcm9tSGFzaCIsInNIYXNoIiwic1RhcmdldFR5cGUiLCJhUm91dGVzIiwiZ2V0TWFuaWZlc3RFbnRyeSIsImoiLCJvUm91dGUiLCJnZXRSb3V0ZSIsIm5hbWUiLCJtYXRjaCIsInNUYXJnZXQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXQiLCJnZXRUYXJnZXQiLCJfb09wdGlvbnMiLCJvQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0N1cnJlbnRQYWdlIiwiYVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcyIsInNBcHBUaXRsZSIsImdldE1ldGFkYXRhIiwic0FwcFN1YlRpdGxlIiwiYXBwU3ViVGl0bGUiLCJvUGFnZVRpdGxlSW5mb3JtYXRpb24iLCJzTmV3UGF0aCIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsImdldFBhdGgiLCJhUGF0aFBhcnRzIiwic2hpZnQiLCJwb3AiLCJzUGF0aFBhcnQiLCJzUGFyYW1ldGVyUGF0aCIsImJJc1BhcmFtZXRlcml6ZWQiLCJyZWplY3QiLCJhVGl0bGVJbmZvSGllcmFyY2h5IiwiYVRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEhpZXJhcmNoeSIsInJldmVyc2UiLCJzZXRUaXRsZSIsInNFcnJvck1lc3NhZ2UiLCJjYWxjdWxhdGVMYXlvdXQiLCJpTmV4dEZDTExldmVsIiwic1Byb3Bvc2VkTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsInNEZWVwZXN0UGF0aCIsImdldFByb3BlcnR5Iiwic1ZpZXdDb250ZXh0UGF0aCIsImRpc3BsYXlNZXNzYWdlUGFnZSIsIm1QYXJhbWV0ZXJzIiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJGQ0xMZXZlbCIsIkJhc2VDb250cm9sbGVyIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFnakJPLGtCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7QUFDQSxLQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO0FBQ1YsYUFBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtBQUNBOztBQUNELFdB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Q0QsSyxDQUVEOzs7V0FDQTRMLGtCLEdBQUEsNEJBQW1CVCxhQUFuQixFQUF1Q1UsV0FBdkMsRUFBMkU7QUFDMUU7QUFDQSxhQUFPL0ssT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDQSxLLENBRUQ7OztXQUNBK0ssb0IsR0FBQSw4QkFBcUIxSyxLQUFyQixFQUFpQzJLLFFBQWpDLEVBQWdELENBQy9DO0FBQ0EsSzs7V0FDRDFKLGlDLEdBQUEsNkNBQTBDLENBQ3pDO0FBQ0EsSzs7O0lBdGR3QzJKLGM7Ozs7OztTQTRkM0JuTiwyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgdXNpbmdFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBTaXplSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL1NpemVIZWxwZXJcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCIpXG5jbGFzcyBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlciB7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0b1BsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cdHByaXZhdGUgX2FIZWxwZXJNb2RlbHMhOiBhbnlbXTtcblx0cHJpdmF0ZSBvUm91dGVyPzogUm91dGVyO1xuXHRwcml2YXRlIF9vUm91dGVNYXRjaGVkUHJvbWlzZTogYW55O1xuXHRwcml2YXRlIG9UaXRsZUhpZXJhcmNoeUNhY2hlOiBhbnk7XG5cdHByaXZhdGUgYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdG9uSW5pdCgpIHtcblx0XHRTaXplSGVscGVyLmluaXQoKTtcblxuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMgPSBbXTtcblx0fVxuXG5cdGdldFBsYWNlaG9sZGVyKCkge1xuXHRcdHJldHVybiB0aGlzLm9QbGFjZWhvbGRlcjtcblx0fVxuXHRhdHRhY2hSb3V0ZU1hdGNoZXJzKCkge1xuXHRcdHRoaXMub1BsYWNlaG9sZGVyLmF0dGFjaFJvdXRlTWF0Y2hlcnMoKTtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5fb25BZnRlclJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdH1cblx0b25FeGl0KCkge1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLl9vbkFmdGVyUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLm9Sb3V0ZXIgPSB1bmRlZmluZWQ7XG5cblx0XHRTaXplSGVscGVyLmV4aXQoKTtcblxuXHRcdC8vIERlc3Ryb3kgYWxsIEpTT04gbW9kZWxzIGNyZWF0ZWQgZHluYW1pY2FsbHkgZm9yIHRoZSB2aWV3c1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAob01vZGVsOiBhbnkpIHtcblx0XHRcdG9Nb2RlbC5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgcmVzb3VyY2UgYnVuZGxlLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvdXJjZU1vZGVsIG9mIHRoZSBjb21wb25lbnRcblx0ICovXG5cdGdldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHR9XG5cdGdldFJvdXRlcigpIHtcblx0XHRpZiAoIXRoaXMub1JvdXRlcikge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyO1xuXHR9XG5cblx0X2NyZWF0ZUhlbHBlck1vZGVsKCkge1xuXHRcdC8vIFdlIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5LCBhcyB0aGV5IGRvbid0IGdldCBkZXN0cm95ZWRcblx0XHQvLyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXcgaXMgZGVzdHJveWVkLlxuXHRcdC8vIFRoaXMgaXMgZG9uZSBkdXJpbmcgb25FeGl0XG5cdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMucHVzaChvTW9kZWwpO1xuXG5cdFx0cmV0dXJuIG9Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3YWl0aW5nIGZvciB0aGUgUmlnaHQgbW9zdCB2aWV3IHRvIGJlIHJlYWR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIG9FdmVudCBSZWZlcmVuY2UgYW4gRXZlbnQgcGFyYW1ldGVyIGNvbWluZyBmcm9tIHJvdXRlTWF0Y2hlZCBldmVudFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgaW5kaWNhdGluZyB3aGVuIHRoZSByaWdodCBtb3N0IHZpZXcgaXMgcmVhZHlcblx0ICovXG5cdHdhaXRGb3JSaWdodE1vc3RWaWV3UmVhZHkob0V2ZW50OiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBhQ29udGFpbmVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKSxcblx0XHRcdFx0Ly8gVGhlcmUgY2FuIGFsc28gYmUgcmV1c2UgY29tcG9uZW50cyBpbiB0aGUgdmlldywgcmVtb3ZlIHRoZW0gYmVmb3JlIHByb2Nlc3NpbmcuXG5cdFx0XHRcdGFGRUNvbnRhaW5lcnM6IGFueVtdID0gW107XG5cdFx0XHRhQ29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGFpbmVyOiBhbnkpIHtcblx0XHRcdFx0bGV0IG9WaWV3ID0gb0NvbnRhaW5lcjtcblx0XHRcdFx0aWYgKG9Db250YWluZXIgJiYgb0NvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9Db21wb25lbnRJbnN0YW5jZSA9IG9Db250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdFx0XHRvVmlldyA9IG9Db21wb25lbnRJbnN0YW5jZS5nZXRSb290Q29udHJvbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVmlldyAmJiBvVmlldy5nZXRDb250cm9sbGVyKCkgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeSkge1xuXHRcdFx0XHRcdGFGRUNvbnRhaW5lcnMucHVzaChvVmlldyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0TW9zdEZFVmlldyA9IGFGRUNvbnRhaW5lcnNbYUZFQ29udGFpbmVycy5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChvUmlnaHRNb3N0RkVWaWV3ICYmIG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUob1JpZ2h0TW9zdEZFVmlldyk7XG5cdFx0XHR9IGVsc2UgaWYgKG9SaWdodE1vc3RGRVZpZXcpIHtcblx0XHRcdFx0b1JpZ2h0TW9zdEZFVmlldy5nZXRDb250cm9sbGVyKCkucGFnZVJlYWR5LmF0dGFjaEV2ZW50T25jZShcInBhZ2VSZWFkeVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lLlxuXHQgKiAgLSB1cGRhdGUgdGhlIHNoZWxsIHRpdGxlLlxuXHQgKiAgLSB1cGRhdGUgdGFibGUgc2Nyb2xsLlxuXHQgKiAgLSBjYWxsIG9uUGFnZVJlYWR5IG9uIHRoZSByaWdodE1vc3RWaWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyI19vbkFmdGVyUm91dGVNYXRjaGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlclxuXHQgKi9cblx0X29uQWZ0ZXJSb3V0ZU1hdGNoZWQob0V2ZW50OiBhbnkpIHtcblx0XHRpZiAoIXRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IHRoaXMud2FpdEZvclJpZ2h0TW9zdFZpZXdSZWFkeShvRXZlbnQpXG5cdFx0XHRcdC50aGVuKChvVmlldzogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gVGhlIGF1dG9Gb2N1cyBpcyBpbml0aWFsbHkgZGlzYWJsZWQgb24gdGhlIG5hdkNvbnRhaW5lciBvciB0aGUgRkNMLCBzbyB0aGF0IHRoZSBmb2N1cyBzdGF5cyBvbiB0aGUgU2hlbGwgbWVudVxuXHRcdFx0XHRcdC8vIGV2ZW4gaWYgdGhlIGFwcCB0YWtlcyBhIGxvbmcgdGltZSB0byBsYXVuY2hcblx0XHRcdFx0XHQvLyBUaGUgZmlyc3QgdGltZSB0aGUgdmlldyBpcyBkaXNwbGF5ZWQsIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBhdXRvZm9jdXMgc28gdGhhdCBpdCdzIG1hbmFnZWQgcHJvcGVybHkgZHVyaW5nIG5hdmlnYXRpb25cblx0XHRcdFx0XHRjb25zdCBvUm9vdENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0gYXMgYW55O1xuXHRcdFx0XHRcdGlmIChvUm9vdENvbnRyb2wgJiYgb1Jvb3RDb250cm9sLmdldEF1dG9Gb2N1cyAmJiAhb1Jvb3RDb250cm9sLmdldEF1dG9Gb2N1cygpKSB7XG5cdFx0XHRcdFx0XHRvUm9vdENvbnRyb2wuc2V0UHJvcGVydHkoXCJhdXRvRm9jdXNcIiwgdHJ1ZSwgdHJ1ZSk7IC8vIERvIG5vdCBtYXJrIHRoZSBjb250YWluZXIgYXMgaW52YWxpZCwgb3RoZXJ3aXNlIGl0J3MgcmUtcmVuZGVyZWRcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHR0aGlzLl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcygpO1xuXHRcdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuVVNoZWxsKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiRm9yY2VGb2N1cyA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5pc0ZvY3VzRm9yY2VkKCk7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldEZvY3VzRm9yY2VkKGZhbHNlKTsgLy8gcmVzZXRcblx0XHRcdFx0XHRpZiAob1ZpZXcuZ2V0Q29udHJvbGxlcigpICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKS5vblBhZ2VSZWFkeSAmJiBvVmlldy5nZXRQYXJlbnQoKS5vblBhZ2VSZWFkeSkge1xuXHRcdFx0XHRcdFx0b1ZpZXcuZ2V0UGFyZW50KCkub25QYWdlUmVhZHkoeyBmb3JjZUZvY3VzOiBiRm9yY2VGb2N1cyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRoaXMub25Db250YWluZXJSZWFkeSkge1xuXHRcdFx0XHRcdFx0dGhpcy5vbkNvbnRhaW5lclJlYWR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXB1dGluZyB0aGUgdGl0bGUgaGllcmFyY2h5IGFuZCBjYWxsaW5nIGZvY3VzIG1ldGhvZFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UgPSBudWxsO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUaXRsZUhpZXJhcmNoeSBjYWNoZSAoIG9yIGluaXRpYWxpemVzIGl0IGlmIHVuZGVmaW5lZCkuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyI19nZXRUaXRsZUhpZXJhcmNoeUNhY2hlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlclxuXHQgKiBAcmV0dXJucyAgVGhlIFRpdGxlSGllcmFyY2h5IGNhY2hlXG5cdCAqL1xuXHRfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpIHtcblx0XHRpZiAoIXRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGUpIHtcblx0XHRcdHRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB7fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMub1RpdGxlSGllcmFyY2h5Q2FjaGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdGl0bGVJbmZvIG9iamVjdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSB0aXRsZVxuXHQgKiBAcGFyYW0gc3VidGl0bGVcblx0ICogQHBhcmFtIHNJbnRlbnQgVGhlIGludGVudCBwYXRoIHRvIGJlIHJlZGlyZWN0ZWQgdG9cblx0ICogQHJldHVybnMgVGhlIHRpdGxlIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRfY29tcHV0ZVRpdGxlSW5mbyh0aXRsZTogYW55LCBzdWJ0aXRsZTogYW55LCBzSW50ZW50OiBhbnkpIHtcblx0XHRjb25zdCBhUGFydHMgPSBzSW50ZW50LnNwbGl0KFwiL1wiKTtcblx0XHRpZiAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXS5pbmRleE9mKFwiP1wiKSA9PT0gLTEpIHtcblx0XHRcdHNJbnRlbnQgKz0gXCI/cmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzSW50ZW50ICs9IFwiJnJlc3RvcmVIaXN0b3J5PXRydWVcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiB0aXRsZSxcblx0XHRcdHN1YnRpdGxlOiBzdWJ0aXRsZSxcblx0XHRcdGludGVudDogc0ludGVudCxcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cdF9mb3JtYXRUaXRsZShkaXNwbGF5TW9kZTogc3RyaW5nLCB0aXRsZVZhbHVlOiBzdHJpbmcsIHRpdGxlRGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IGZvcm1hdHRlZFRpdGxlID0gXCJcIjtcblx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZVZhbHVlfWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlZhbHVlRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZVZhbHVlfSAoJHt0aXRsZURlc2NyaXB0aW9ufSlgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdGZvcm1hdHRlZFRpdGxlID0gYCR7dGl0bGVEZXNjcmlwdGlvbn0gKCR7dGl0bGVWYWx1ZX0pYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSBgJHt0aXRsZURlc2NyaXB0aW9ufWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHR9XG5cdFx0cmV0dXJuIGZvcm1hdHRlZFRpdGxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBIZWFkZXJJbmZvIHRpdGxlIGZvciBhIGdpdmVuIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aCB0byB0aGUgZW50aXR5XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBmb3JtYXR0ZWQgdGl0bGUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBIZWFkZXJJbmZvIHRpdGxlIGFubm90YXRpb24gaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRhc3luYyBfZmV0Y2hUaXRsZVZhbHVlKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpLFxuXHRcdFx0b0JpbmRpbmdWaWV3Q29udGV4dCA9IG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0XHRzVmFsdWVFeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5mb3JtYXQoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWVgKSxcblx0XHRcdFx0eyBjb250ZXh0OiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0IH1cblx0XHRcdCk7XG5cdFx0aWYgKCFzVmFsdWVFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzVGV4dEV4cHJlc3Npb24gPSBBbm5vdGF0aW9uSGVscGVyLmZvcm1hdChcblx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0YCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UaXRsZS9WYWx1ZS8kUGF0aEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dGBcblx0XHRcdFx0KSxcblx0XHRcdFx0eyBjb250ZXh0OiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0IH1cblx0XHRcdCksXG5cdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UaXRsZS9WYWx1ZS8kUGF0aEBgKSxcblx0XHRcdGFQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW10sXG5cdFx0XHRvVmFsdWVFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNWYWx1ZUV4cHJlc3Npb24pLFxuXHRcdFx0b1Byb21pc2VGb3JEaXNwbGF5TW9kZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IENvbW1vblV0aWxzLmNvbXB1dGVEaXNwbGF5TW9kZShvUHJvcGVydHlDb250ZXh0KTtcblx0XHRcdFx0cmVzb2x2ZShkaXNwbGF5TW9kZSk7XG5cdFx0XHR9KTtcblx0XHRhUHJvbWlzZXMucHVzaChvUHJvbWlzZUZvckRpc3BsYXlNb2RlKTtcblx0XHRjb25zdCBzVmFsdWVQYXRoID0gb1ZhbHVlRXhwcmVzc2lvbi5wYXJ0cyA/IG9WYWx1ZUV4cHJlc3Npb24ucGFydHNbMF0ucGF0aCA6IG9WYWx1ZUV4cHJlc3Npb24ucGF0aCxcblx0XHRcdGZuVmFsdWVGb3JtYXR0ZXIgPSBvVmFsdWVFeHByZXNzaW9uLmZvcm1hdHRlcixcblx0XHRcdG9WYWx1ZUJpbmRpbmcgPSBvTW9kZWwuYmluZFByb3BlcnR5KHNWYWx1ZVBhdGgsIG9CaW5kaW5nVmlld0NvbnRleHQpO1xuXHRcdG9WYWx1ZUJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXHRcdGNvbnN0IG9Qcm9taXNlRm9yVGl0bGVWYWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgZm5DaGFuZ2UgPSBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldFZhbHVlID0gZm5WYWx1ZUZvcm1hdHRlciA/IGZuVmFsdWVGb3JtYXR0ZXIob0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogb0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0b1ZhbHVlQmluZGluZy5kZXRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0XHRyZXNvbHZlKHNUYXJnZXRWYWx1ZSk7XG5cdFx0XHR9O1xuXHRcdFx0b1ZhbHVlQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdH0pO1xuXHRcdGFQcm9taXNlcy5wdXNoKG9Qcm9taXNlRm9yVGl0bGVWYWx1ZSk7XG5cblx0XHRpZiAoc1RleHRFeHByZXNzaW9uKSB7XG5cdFx0XHRjb25zdCBvVGV4dEV4cHJlc3Npb24gPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc1RleHRFeHByZXNzaW9uKTtcblx0XHRcdGxldCBzVGV4dFBhdGggPSBvVGV4dEV4cHJlc3Npb24ucGFydHMgPyBvVGV4dEV4cHJlc3Npb24ucGFydHNbMF0ucGF0aCA6IG9UZXh0RXhwcmVzc2lvbi5wYXRoO1xuXHRcdFx0c1RleHRQYXRoID0gc1ZhbHVlUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPiAtMSA/IHNWYWx1ZVBhdGguc2xpY2UoMCwgc1ZhbHVlUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpICsgXCIvXCIgKyBzVGV4dFBhdGggOiBzVGV4dFBhdGg7XG5cdFx0XHRjb25zdCBmblRleHRGb3JtYXR0ZXIgPSBvVGV4dEV4cHJlc3Npb24uZm9ybWF0dGVyLFxuXHRcdFx0XHRvVGV4dEJpbmRpbmcgPSBvTW9kZWwuYmluZFByb3BlcnR5KHNUZXh0UGF0aCwgb0JpbmRpbmdWaWV3Q29udGV4dCk7XG5cdFx0XHRvVGV4dEJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXHRcdFx0Y29uc3Qgb1Byb21pc2VGb3JUaXRsZVRleHQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKGRlc2NyaXB0aW9uOiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdFx0Y29uc3QgZm5DaGFuZ2UgPSBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBzVGFyZ2V0VGV4dCA9IGZuVGV4dEZvcm1hdHRlciA/IGZuVGV4dEZvcm1hdHRlcihvRXZlbnQuZ2V0U291cmNlKCkuZ2V0VmFsdWUoKSkgOiBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0VmFsdWUoKTtcblxuXHRcdFx0XHRcdG9UZXh0QmluZGluZy5kZXRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0XHRcdHJlc29sdmUoc1RhcmdldFRleHQpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9UZXh0QmluZGluZy5hdHRhY2hDaGFuZ2UoZm5DaGFuZ2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRhUHJvbWlzZXMucHVzaChvUHJvbWlzZUZvclRpdGxlVGV4dCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0aXRsZUluZm86IGFueVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoYVByb21pc2VzKTtcblx0XHRcdGxldCBmb3JtYXR0ZWRUaXRsZSA9IFwiXCI7XG5cdFx0XHRpZiAodHlwZW9mIHRpdGxlSW5mbyAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IHRoaXMuX2Zvcm1hdFRpdGxlKHRpdGxlSW5mb1swXSwgdGl0bGVJbmZvWzFdLCB0aXRsZUluZm9bMl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlZFRpdGxlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGZldGNoaW5nIHRoZSB0aXRsZSBmcm9tIHRoZSBoZWFkZXIgaW5mbyA6XCIgKyBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0X2dldEFwcFNwZWNpZmljSGFzaCgpIHtcblx0XHQvLyBIYXNoQ2hhbmdlZCBpc1NoZWxsTmF2aWdhdGlvbkhhc2hDaGFuZ2VyXG5cdFx0cmV0dXJuIChIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpIGFzIGFueSkuaHJlZkZvckFwcFNwZWNpZmljSGFzaFxuXHRcdFx0PyAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2goXCJcIilcblx0XHRcdDogXCJcIjtcblx0fVxuXG5cdF9nZXRIYXNoKCkge1xuXHRcdHJldHVybiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGl0bGVJbmZvcm1hdGlvbiBmcm9tIGEgcGF0aC5cblx0ICogSXQgdXBkYXRlcyB0aGUgY2FjaGUgdG8gc3RvcmUgVGl0bGUgSW5mb3JtYXRpb24gaWYgbmVjZXNzYXJ5XG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyI2dldFRpdGxlSW5mb0Zyb21QYXRoXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlclxuXHQgKiBAcGFyYW0geyp9IHNQYXRoIHBhdGggb2YgdGhlIGNvbnRleHQgdG8gcmV0cmlldmUgdGl0bGUgaW5mb3JtYXRpb24gZnJvbSBNZXRhTW9kZWxcblx0ICogQHJldHVybnMge1Byb21pc2V9ICBvVGl0bGVpbmZvcm1hdGlvbiByZXR1cm5lZCBhcyBwcm9taXNlXG5cdCAqL1xuXG5cdGdldFRpdGxlSW5mb0Zyb21QYXRoKHNQYXRoOiBhbnkpIHtcblx0XHRjb25zdCBvVGl0bGVIaWVyYXJjaHlDYWNoZSA9IHRoaXMuX2dldFRpdGxlSGllcmFyY2h5Q2FjaGUoKTtcblxuXHRcdGlmIChvVGl0bGVIaWVyYXJjaHlDYWNoZVtzUGF0aF0pIHtcblx0XHRcdC8vIFRoZSB0aXRsZSBpbmZvIGlzIGFscmVhZHkgc3RvcmVkIGluIHRoZSBjYWNoZVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShvVGl0bGVIaWVyYXJjaHlDYWNoZVtzUGF0aF0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgc1R5cGVOYW1lID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvL1R5cGVOYW1lYCk7XG5cdFx0Y29uc3Qgc0FwcFNwZWNpZmljSGFzaCA9IHRoaXMuX2dldEFwcFNwZWNpZmljSGFzaCgpO1xuXHRcdGNvbnN0IHNJbnRlbnQgPSBzQXBwU3BlY2lmaWNIYXNoICsgc1BhdGguc2xpY2UoMSk7XG5cdFx0cmV0dXJuIHRoaXMuX2ZldGNoVGl0bGVWYWx1ZShzUGF0aCkudGhlbigoc1RpdGxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9UaXRsZUluZm8gPSB0aGlzLl9jb21wdXRlVGl0bGVJbmZvKHNUeXBlTmFtZSwgc1RpdGxlLCBzSW50ZW50KTtcblx0XHRcdG9UaXRsZUhpZXJhcmNoeUNhY2hlW3NQYXRoXSA9IG9UaXRsZUluZm87XG5cdFx0XHRyZXR1cm4gb1RpdGxlSW5mbztcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRW5zdXJlIHRoYXQgdGhlIHVzaGVsbCBzZXJ2aWNlIHJlY2VpdmVzIGFsbCBlbGVtZW50c1xuXHQgKiAodGl0bGUsIHN1YnRpdGxlLCBpbnRlbnQsIGljb24pIGFzIHN0cmluZ3MuXG5cdCAqXG5cdCAqIEFubm90YXRpb24gSGVhZGVySW5mbyBhbGxvd3MgZm9yIGJpbmRpbmcgb2YgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG5cdCAqICh3aGljaCBhcmUgdXNlZCBoZXJlIGFzIHRpdGxlIGFuZCBzdWJ0aXRsZSkgdG8gYW55IGVsZW1lbnQgaW4gdGhlIGVudGl0eVxuXHQgKiAoYmVpbmcgcG9zc2libHkgdHlwZXMgbGlrZSBib29sZWFuLCB0aW1lc3RhbXAsIGRvdWJsZSwgZXRjLilcblx0ICpcblx0ICogQ3JlYXRlcyBhIG5ldyBoaWVyYXJjaHkgYW5kIGNvbnZlcnRzIG5vbi1zdHJpbmcgdHlwZXMgdG8gc3RyaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gYUhpZXJhcmNoeSBTaGVsbCB0aXRsZSBoaWVyYXJjaHlcblx0ICogQHJldHVybnMgQ29weSBvZiBzaGVsbCB0aXRsZSBoaWVyYXJjaHkgY29udGFpbmluZyBhbGwgZWxlbWVudHMgYXMgc3RyaW5nc1xuXHQgKi9cblx0X2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyhhSGllcmFyY2h5OiBhbnkpIHtcblx0XHRjb25zdCBhSGllcmFyY2h5U2hlbGwgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGxldmVsIGluIGFIaWVyYXJjaHkpIHtcblx0XHRcdGNvbnN0IG9IaWVyYXJjaHkgPSBhSGllcmFyY2h5W2xldmVsXTtcblx0XHRcdGNvbnN0IG9TaGVsbEhpZXJhcmNoeTogYW55ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBvSGllcmFyY2h5KSB7XG5cdFx0XHRcdG9TaGVsbEhpZXJhcmNoeVtrZXldID0gdHlwZW9mIG9IaWVyYXJjaHlba2V5XSAhPT0gXCJzdHJpbmdcIiA/IFN0cmluZyhvSGllcmFyY2h5W2tleV0pIDogb0hpZXJhcmNoeVtrZXldO1xuXHRcdFx0fVxuXHRcdFx0YUhpZXJhcmNoeVNoZWxsLnB1c2gob1NoZWxsSGllcmFyY2h5KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFIaWVyYXJjaHlTaGVsbDtcblx0fVxuXG5cdF9nZXRUYXJnZXRUeXBlRnJvbUhhc2goc0hhc2g6IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGxldCBzVGFyZ2V0VHlwZSA9IFwiXCI7XG5cblx0XHRjb25zdCBhUm91dGVzID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC51aTUvcm91dGluZy9yb3V0ZXNcIik7XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhUm91dGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRjb25zdCBvUm91dGUgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFJvdXRlKGFSb3V0ZXNbal0ubmFtZSk7XG5cdFx0XHRpZiAob1JvdXRlLm1hdGNoKHNIYXNoKSkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0ID0gQXJyYXkuaXNBcnJheShhUm91dGVzW2pdLnRhcmdldCkgPyBhUm91dGVzW2pdLnRhcmdldFswXSA6IGFSb3V0ZXNbal0udGFyZ2V0O1xuXHRcdFx0XHRzVGFyZ2V0VHlwZSA9IChvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFRhcmdldChzVGFyZ2V0KSBhcyBhbnkpLl9vT3B0aW9ucy5uYW1lO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc1RhcmdldFR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyB1cGRhdGluZyB0aGUgc2hlbGwgdGl0bGUgYWZ0ZXIgZWFjaCBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbWVudSBpcyBmaWxsZWQgcHJvcGVybHlcblx0ICovXG5cdF9jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXc6IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0b0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0N1cnJlbnRQYWdlID0gb1ZpZXcuZ2V0UGFyZW50KCksXG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzID0gW10sXG5cdFx0XHRzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCksXG5cdFx0XHRzQXBwVGl0bGUgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIikudGl0bGUgfHwgXCJcIixcblx0XHRcdHNBcHBTdWJUaXRsZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKS5hcHBTdWJUaXRsZSB8fCBcIlwiO1xuXHRcdGxldCBvUGFnZVRpdGxlSW5mb3JtYXRpb246IGFueSwgc05ld1BhdGg7XG5cblx0XHRpZiAob0N1cnJlbnRQYWdlICYmIG9DdXJyZW50UGFnZS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24pIHtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhzQXBwVGl0bGUsIHNBcHBTdWJUaXRsZSwgc0FwcFNwZWNpZmljSGFzaCkpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRoZW4gbWFuYWdlIG90aGVyIHBhZ2VzXG5cdFx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc05ld1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXG5cdFx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50IChlbXB0eSBzdHJpbmcpIGFzIGl0IGhhcyBiZWVuIG1hbmFnZWQgYWJvdmVcblx0XHRcdFx0YVBhdGhQYXJ0cy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdWxkbid0IGFwcGVhciBpbiB0aGUgbWVudVxuXG5cdFx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaCgoc1BhdGhQYXJ0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRzUGF0aCArPSBgLyR7c1BhdGhQYXJ0fWA7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRzUGFyYW1ldGVyUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpLFxuXHRcdFx0XHRcdFx0YklzUGFyYW1ldGVyaXplZCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRcdFx0XHRpZiAoIWJJc1BhcmFtZXRlcml6ZWQpIHtcblx0XHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaCh0aGlzLmdldFRpdGxlSW5mb0Zyb21QYXRoKHNQYXRoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3VycmVudCBwYWdlXG5cdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24gPSBvQ3VycmVudFBhZ2UuX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCk7XG5cdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24gPSB0aGlzLl9jb21wdXRlVGl0bGVJbmZvKFxuXHRcdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGUsXG5cdFx0XHRcdG9QYWdlVGl0bGVJbmZvcm1hdGlvbi5zdWJ0aXRsZSxcblx0XHRcdFx0c0FwcFNwZWNpZmljSGFzaCArIHRoaXMuX2dldEhhc2goKVxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX2dldFRpdGxlSGllcmFyY2h5Q2FjaGUoKVtzTmV3UGF0aF0gPSBvUGFnZVRpdGxlSW5mb3JtYXRpb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKClbc0FwcFNwZWNpZmljSGFzaF0gPSBvUGFnZVRpdGxlSW5mb3JtYXRpb247XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChQcm9taXNlLnJlamVjdChcIlRpdGxlIGluZm9ybWF0aW9uIG1pc3NpbmcgaW4gSGVhZGVySW5mb1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLmFsbChhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzKVxuXHRcdFx0LnRoZW4oKGFUaXRsZUluZm9IaWVyYXJjaHk6IGFueVtdKSA9PiB7XG5cdFx0XHRcdC8vIHdvcmthcm91bmQgZm9yIHNoZWxsIHdoaWNoIGlzIGV4cGVjdGluZyBhbGwgZWxlbWVudHMgYmVpbmcgb2YgdHlwZSBzdHJpbmdcblx0XHRcdFx0Y29uc3QgYVRpdGxlSW5mb0hpZXJhcmNoeVNoZWxsID0gdGhpcy5fZW5zdXJlSGllcmFyY2h5RWxlbWVudHNBcmVTdHJpbmdzKGFUaXRsZUluZm9IaWVyYXJjaHkpLFxuXHRcdFx0XHRcdHNUaXRsZSA9IG9QYWdlVGl0bGVJbmZvcm1hdGlvbi50aXRsZTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0SGllcmFyY2h5KGFUaXRsZUluZm9IaWVyYXJjaHlTaGVsbC5yZXZlcnNlKCkpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRUaXRsZShzVGl0bGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoc0Vycm9yTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihzRXJyb3JNZXNzYWdlKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoc0Vycm9yTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihzRXJyb3JNZXNzYWdlKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRjYWxjdWxhdGVMYXlvdXQoaU5leHRGQ0xMZXZlbDogbnVtYmVyLCBzSGFzaDogc3RyaW5nLCBzUHJvcG9zZWRMYXlvdXQ6IHN0cmluZyB8IHVuZGVmaW5lZCwga2VlcEN1cnJlbnRMYXlvdXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBhZnRlciBhIHZpZXcgaGFzIGJlZW4gYm91bmQgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHZpZXdcblx0ICovXG5cdG9uQ29udGV4dEJvdW5kVG9WaWV3KG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNEZWVwZXN0UGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiksXG5cdFx0XHRcdHNWaWV3Q29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHRcdGlmICghc0RlZXBlc3RQYXRoIHx8IHNEZWVwZXN0UGF0aC5pbmRleE9mKHNWaWV3Q29udGV4dFBhdGgpICE9PSAwKSB7XG5cdFx0XHRcdC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGRlZXBlc3QgcmVhY2hlZCBwYXRoLCBvciB0aGUgcGF0aFxuXHRcdFx0XHQvLyBmb3IgdGhlIHZpZXcgaXNuJ3QgYSBzdWJwYXRoIG9mIHRoZSBwcmV2aW91cyBkZWVwZXN0IHBhdGggLS0+IHVwZGF0ZVxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIsIHNWaWV3Q29udGV4dFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cbn1cbmludGVyZmFjZSBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIge1xuXHRvbkNvbnRhaW5lclJlYWR5PygpOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXI7XG4iXX0=