@sapui5/sap.fe.templates 1.103.0 → 1.106.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 +5 -6
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +2 -2
  4. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +2 -2
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +1 -1
  6. package/src/sap/fe/templates/Feedback.js +1 -1
  7. package/src/sap/fe/templates/Feedback.ts +0 -3
  8. package/src/sap/fe/templates/ListComponent.js +2 -2
  9. package/src/sap/fe/templates/ListReport/Component.js +2 -2
  10. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +5 -3
  11. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +2 -1
  12. package/src/sap/fe/templates/ListReport/ListReport.view.xml +12 -86
  13. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +90 -429
  14. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +81 -392
  15. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +1 -1
  16. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +459 -0
  17. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +338 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +16 -9
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +15 -9
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +4 -12
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +4 -12
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +23 -31
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +27 -31
  24. package/src/sap/fe/templates/ListReport/view/fragments/Chart.fragment.xml +3 -0
  25. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +16 -5
  26. package/src/sap/fe/templates/{controls → ListReport/view/fragments}/MacroChart.fragment.xml +3 -2
  27. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +20 -4
  28. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +80 -48
  29. package/src/sap/fe/templates/{controls → ListReport/view/fragments}/Table.fragment.xml +6 -6
  30. package/src/sap/fe/templates/ListReport/view/fragments/VariantManagement.fragment.xml +31 -0
  31. package/src/sap/fe/templates/ObjectPage/Component.js +9 -9
  32. package/src/sap/fe/templates/ObjectPage/Component.ts +10 -6
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +25 -12
  34. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +18 -5
  35. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +60 -151
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +195 -140
  37. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +103 -93
  38. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +52 -22
  39. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +46 -25
  40. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +178 -0
  41. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.tsx +132 -0
  42. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +2 -2
  43. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +2 -2
  44. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +2 -2
  45. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  48. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +1 -1
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +1 -1
  50. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +1 -1
  51. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  52. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
  53. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  54. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +1 -1
  55. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +55 -29
  56. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +28 -29
  57. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +1 -1
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +62 -62
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/Chart.fragment.xml +13 -0
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +10 -8
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +1 -1
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +5 -1
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +2 -2
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +11 -6
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/MacroChart.fragment.xml +22 -0
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +7 -2
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +8 -49
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionPresentationVisualization.fragment.xml +1 -1
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/Table.fragment.xml +23 -0
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +2 -2
  72. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +2 -2
  73. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +5 -5
  74. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +3 -3
  75. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -1
  76. package/src/sap/fe/templates/TableScroller.js +1 -1
  77. package/src/sap/fe/templates/library.js +4 -3
  78. package/src/sap/fe/templates/library.ts +2 -0
  79. package/src/sap/fe/templates/messagebundle.properties +2 -5
  80. package/src/sap/fe/templates/messagebundle_ar.properties +3 -12
  81. package/src/sap/fe/templates/messagebundle_bg.properties +2 -11
  82. package/src/sap/fe/templates/messagebundle_ca.properties +2 -11
  83. package/src/sap/fe/templates/messagebundle_cs.properties +3 -12
  84. package/src/sap/fe/templates/messagebundle_cy.properties +2 -11
  85. package/src/sap/fe/templates/messagebundle_da.properties +3 -12
  86. package/src/sap/fe/templates/messagebundle_de.properties +2 -11
  87. package/src/sap/fe/templates/messagebundle_el.properties +2 -11
  88. package/src/sap/fe/templates/messagebundle_en.properties +2 -11
  89. package/src/sap/fe/templates/messagebundle_en_GB.properties +2 -11
  90. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +2 -11
  91. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +2 -11
  92. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +2 -11
  93. package/src/sap/fe/templates/messagebundle_es.properties +0 -9
  94. package/src/sap/fe/templates/messagebundle_es_MX.properties +2 -11
  95. package/src/sap/fe/templates/messagebundle_et.properties +0 -9
  96. package/src/sap/fe/templates/messagebundle_fi.properties +2 -11
  97. package/src/sap/fe/templates/messagebundle_fr.properties +3 -12
  98. package/src/sap/fe/templates/messagebundle_fr_CA.properties +2 -11
  99. package/src/sap/fe/templates/messagebundle_hi.properties +2 -11
  100. package/src/sap/fe/templates/messagebundle_hr.properties +2 -11
  101. package/src/sap/fe/templates/messagebundle_hu.properties +2 -11
  102. package/src/sap/fe/templates/messagebundle_id.properties +2 -11
  103. package/src/sap/fe/templates/messagebundle_it.properties +2 -11
  104. package/src/sap/fe/templates/messagebundle_iw.properties +2 -11
  105. package/src/sap/fe/templates/messagebundle_ja.properties +2 -11
  106. package/src/sap/fe/templates/messagebundle_kk.properties +2 -11
  107. package/src/sap/fe/templates/messagebundle_ko.properties +2 -11
  108. package/src/sap/fe/templates/messagebundle_lt.properties +2 -11
  109. package/src/sap/fe/templates/messagebundle_lv.properties +2 -11
  110. package/src/sap/fe/templates/messagebundle_ms.properties +2 -11
  111. package/src/sap/fe/templates/messagebundle_nl.properties +2 -11
  112. package/src/sap/fe/templates/messagebundle_no.properties +0 -9
  113. package/src/sap/fe/templates/messagebundle_pl.properties +0 -9
  114. package/src/sap/fe/templates/messagebundle_pt.properties +2 -11
  115. package/src/sap/fe/templates/messagebundle_pt_PT.properties +2 -11
  116. package/src/sap/fe/templates/messagebundle_ro.properties +0 -9
  117. package/src/sap/fe/templates/messagebundle_ru.properties +2 -11
  118. package/src/sap/fe/templates/messagebundle_sh.properties +2 -11
  119. package/src/sap/fe/templates/messagebundle_sk.properties +2 -11
  120. package/src/sap/fe/templates/messagebundle_sl.properties +2 -11
  121. package/src/sap/fe/templates/messagebundle_sv.properties +2 -11
  122. package/src/sap/fe/templates/messagebundle_th.properties +1 -10
  123. package/src/sap/fe/templates/messagebundle_tr.properties +2 -11
  124. package/src/sap/fe/templates/messagebundle_uk.properties +2 -11
  125. package/src/sap/fe/templates/messagebundle_vi.properties +0 -9
  126. package/src/sap/fe/templates/messagebundle_zh_CN.properties +0 -9
  127. package/src/sap/fe/templates/messagebundle_zh_TW.properties +2 -11
  128. package/src/sap/fe/templates/ListReport/view/fragments/MultipleModeOld.fragment.xml +0 -50
  129. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.js +0 -103
  130. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.ts +0 -97
  131. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +0 -27
  132. package/src/sap/fe/templates/controls/Chart.fragment.xml +0 -25
@@ -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/base/util/ObjectPath", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/Utils", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Core", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/fl/write/api/ControlPersonalizationWriteAPI", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableUtils, ExtensionAPI, EditFlowOverrides, TableScroller, Core, OverrideExecution, Device, ControlPersonalizationWriteAPI, StateUtil, hasher, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MessageStrip", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Component", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./ListReportTemplating", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, ActionRuntime, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, MessageStrip, StableIdHelper, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, ExtensionAPI, EditFlowOverrides, TableScroller, Component, OverrideExecution, Device, StateUtil, hasher, ListReportTemplating, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
@@ -21,7 +21,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
21
21
 
22
22
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
23
23
 
24
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
24
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
25
 
26
26
  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; }
27
27
 
@@ -70,63 +70,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
70
70
  _initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
71
71
 
72
72
  _this.handlers = {
73
- onTabMultiModeChange: function (oEvent) {
74
- this._updateMultiModeSelectedControl();
75
-
76
- this._updateMultiControlHiddenStatus();
77
-
78
- var oFilterBar = this._getFilterBarControl();
79
-
80
- var oInternalModelContext = this.getView().getBindingContext("internal");
81
-
82
- var oDisplayedControl = this._getCurrentControl();
83
-
84
- var oMultiModeControl = this._getMultiModeControl();
85
-
86
- var sSelectedKey = oMultiModeControl.getSelectedKey();
87
- var sPreviousSelectedKey = oEvent && oEvent.mParameters ? oEvent.mParameters.previousKey : undefined;
88
- oInternalModelContext.setProperty("tabs/selected", sSelectedKey);
89
-
90
- if (oInternalModelContext.getProperty("hasPendingFilters") !== true) {
91
- // No pending filters into FilterBar
92
- if (oFilterBar && this._isCustomTab()) {
93
- var oFilterConditions = oFilterBar.getFilterConditions();
94
- this.onViewNeedsRefresh({
95
- filterConditions: oFilterConditions,
96
- currentTabId: sSelectedKey,
97
- refreshCause: "tabChanged"
98
- });
99
- } else if (!oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getRowBinding() || // first time the tab/table is displayed
100
- oDisplayedControl.data("outdatedRows") === true)) {
101
- // Search has been triggered on a different tab {}
102
- oDisplayedControl.rebind();
103
- oDisplayedControl.data("outdatedRows", false);
104
- } else if (oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl).getBinding("data") || // first time the tab/chart is displayed
105
- oDisplayedControl.data("outdatedRows") === true)) {
106
- var oInnerChart = oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl);
107
-
108
- oDisplayedControl.getControlDelegate().rebind(oDisplayedControl, oInnerChart.getBindingInfo("data"));
109
- oDisplayedControl.data("outdatedRows", false);
110
- }
111
- }
112
-
113
- if (oEvent && oEvent.mParameters && sPreviousSelectedKey !== oEvent.mParameters.selectedKey) {
114
- ControlPersonalizationWriteAPI.add({
115
- changes: [{
116
- changeSpecificData: {
117
- changeType: "selectIconTabBarFilter",
118
- content: {
119
- selectedKey: sSelectedKey,
120
- previousSelectedKey: sPreviousSelectedKey
121
- }
122
- },
123
- selectorElement: oMultiModeControl
124
- }]
125
- });
126
- }
127
-
128
- this.getExtensionAPI().updateAppState();
129
- },
130
73
  onFiltersChanged: function (oEvent) {
131
74
  var oFilterBar = this._getFilterBarControl();
132
75
 
@@ -144,17 +87,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
144
87
  onVariantSelected: function (oEvent) {
145
88
  var _this2 = this;
146
89
 
147
- var oVM = oEvent.getSource(); // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
90
+ var oVM = oEvent.getSource();
91
+ var currentVariantKey = oEvent.getParameter("key");
148
92
 
149
- setTimeout(function () {
150
- if (_this2._isMultiMode()) {
151
- _this2.handlers.onTabMultiModeChange.apply(_this2, [oEvent]);
152
- }
93
+ var oMultiModeControl = this._getMultiModeControl();
94
+
95
+ oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.invalidateContent();
96
+ oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.setFreezeContent(true); // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
153
97
 
98
+ setTimeout(function () {
154
99
  if (_this2._shouldAutoTriggerSearch(oVM)) {
155
100
  // the app state will be updated via onSearch handler
156
101
  return _this2._getFilterBarControl().triggerSearch();
157
- } else {
102
+ } else if (!_this2._getApplyAutomaticallyOnVariant(oVM, currentVariantKey)) {
158
103
  _this2.getExtensionAPI().updateAppState();
159
104
  }
160
105
  }, 0);
@@ -178,27 +123,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
178
123
  oInternalModelContext.setProperty("hasPendingFilters", false);
179
124
  oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
180
125
 
181
- if (this._isMultiMode()) {
182
- var oMultiModeControl = this._getMultiModeControl();
183
-
184
- this._setCountsOutDated();
185
-
186
- if (!this._isCustomTab()) {
187
- this._updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar); // This should be done outside the search event handler of the filter bar.
188
- // The same logic is required when filter bar is hidden and multiple tables exist on the LR.
189
- // This is currently done in ListReport/overrides/ViewState.js#onAfterStateApplied()
190
-
191
-
192
- this._invalidateMultipleModeContent();
193
- } else {
194
- var oFilterConditions = oFilterBar.getFilterConditions();
195
- this.onViewNeedsRefresh({
196
- filterConditions: oFilterConditions,
197
- currentTabId: oMultiModeControl.getSelectedKey(),
198
- refreshCause: "search"
199
- });
200
- }
201
- } else {
126
+ if (!this._getMultiModeControl()) {
202
127
  this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
203
128
  }
204
129
 
@@ -274,8 +199,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
274
199
  var sSelectedKey = oEvent.mParameters.key ? oEvent.mParameters.key : null;
275
200
  var oInternalModelContext = this.getView().getBindingContext("internal");
276
201
  oInternalModelContext.setProperty("alpContentView", sSelectedKey);
277
-
278
- var oChart = this._getChart();
202
+ var oChart = this.getChartControl();
279
203
 
280
204
  var oTable = this._getTable();
281
205
 
@@ -321,15 +245,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
321
245
  this.getExtensionAPI().updateAppState();
322
246
  },
323
247
  onFiltersSegmentedButtonPressed: function (oEvent) {
324
- if (oEvent.getParameter("key") === "Compact") {
325
- this._getFilterBarControl().setVisible(true);
248
+ var isCompact = oEvent.getParameter("key") === "Compact";
326
249
 
327
- this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(false);
328
- } else {
329
- this._getFilterBarControl().setVisible(false);
250
+ this._getFilterBarControl().setVisible(isCompact);
330
251
 
331
- this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(true);
332
- }
252
+ this._getVisualFilterBarControl().setVisible(!isCompact);
333
253
  },
334
254
  onStateChange: function () {
335
255
  this.getExtensionAPI().updateAppState();
@@ -347,48 +267,18 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
347
267
  }
348
268
  };
349
269
  _this.formatters = {
350
- /**
351
- * Method to set the message text for the multiple entity sets when fields in the FilterBar need to be ignored.
352
- *
353
- * @param this
354
- * @param aIgnoredFields Array of ignored fields in the FilterBar for the current tab (multiple entity sets)
355
- * @param sTabTitle Tab title
356
- * @param bIsChart Flag that indicates whether the control is a chart or not
357
- * @param oApplySupported ApplySupported for the control
358
- * @returns Message text
359
- */
360
- setTabMessageStrip: function (aIgnoredFields, sTabTitle, bIsChart, oApplySupported) {
270
+ setALPControlMessageStrip: function (aIgnoredFields, bIsChart, oApplySupported) {
361
271
  var sText = "";
362
272
  bIsChart = bIsChart === "true" || bIsChart === true;
363
273
 
364
274
  var oFilterBar = this._getFilterBarControl();
365
275
 
366
- if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && (sTabTitle || bIsChart)) {
367
- var sFilterBarEntityPath = oFilterBar.data("entityType"),
368
- oMetaModel = this.getView().getModel().getMetaModel(),
369
- oResourceBundle = Core.getLibraryResourceBundle("sap.fe.templates"),
370
- aIgnoredLabels = aIgnoredFields.map(function (sProperty) {
371
- var oMacroResourceBundle = Core.getLibraryResourceBundle("sap.fe.macros");
372
-
373
- if (sProperty === "$search") {
374
- return oMacroResourceBundle ? oMacroResourceBundle.getText("M_FILTERBAR_SEARCH") : "";
375
- }
376
-
377
- if (sProperty === "$editState") {
378
- return oMacroResourceBundle ? oMacroResourceBundle.getText("M_COMMON_FILTERBAR_EDITING_STATUS") : "";
379
- }
380
-
381
- var sLabel = oMetaModel.getObject("".concat(sFilterBarEntityPath + sProperty, "@com.sap.vocabularies.Common.v1.Label"));
382
- return DelegateUtil.getLocalizedText(sLabel, oFilterBar);
383
- });
276
+ if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && bIsChart) {
277
+ var aIgnoredLabels = MessageStrip.getLabels(aIgnoredFields, oFilterBar.data("entityType"), oFilterBar, this.oResourceBundle);
384
278
  var bIsSearchIgnored = !oApplySupported.enableSearch;
385
-
386
- if (oResourceBundle) {
387
- sText = CommonUtils.getMessageStripText(this.getView(), aIgnoredLabels, oFilterBar, bIsChart, bIsSearchIgnored, sTabTitle, oResourceBundle, DelegateUtil.getLocalizedText);
388
- }
279
+ sText = bIsChart ? MessageStrip.getALPText(aIgnoredLabels, oFilterBar, bIsSearchIgnored) : MessageStrip.getText(aIgnoredLabels, oFilterBar, "", DelegateUtil.getLocalizedText);
280
+ return sText;
389
281
  }
390
-
391
- return sText;
392
282
  }
393
283
  };
394
284
  return _this;
@@ -405,30 +295,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
405
295
  };
406
296
 
407
297
  _proto.onInit = function onInit() {
408
- var _this5 = this;
409
-
410
298
  PageController.prototype.onInit.apply(this);
411
-
412
- var aControls = this._getControls();
413
-
414
299
  var oInternalModelContext = this.getView().getBindingContext("internal");
415
-
416
- if (this._isMultiMode()) {
417
- var oMultiModeTab = this._getMultiModeControl();
418
-
419
- oInternalModelContext.setProperty("tabs", {
420
- selected: oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey()
421
- });
422
- aControls.forEach(function (oControl) {
423
- var oUpdateCounts = function () {
424
- _this5._updateCounts();
425
- };
426
-
427
- CommonUtils.addEventToBindingInfo(oControl, "dataRequested", oUpdateCounts);
428
- });
429
- } //TODO: This is only a temporary approach and will be removed once app state behaviour is finalized.
430
-
431
-
432
300
  oInternalModelContext.setProperty("hasPendingFilters", true);
433
301
  oInternalModelContext.setProperty("appliedFilters", "");
434
302
  oInternalModelContext.setProperty("hideDraftInfo", false);
@@ -452,19 +320,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
452
320
  this.filterBarConditions = {}; // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
453
321
  // happen after the routeMatch event has been processed (otherwise the router gets broken)
454
322
 
455
- this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation();
456
-
457
- if (this._isMultiMode()) {
458
- this._updateMultiControlHiddenStatus();
459
- } // Configure the initial load settings
460
-
323
+ this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation(); // Configure the initial load settings
461
324
 
462
325
  this._setInitLoad();
463
326
  };
464
327
 
465
328
  _proto.onExit = function onExit() {
466
329
  delete this.filterBarConditions;
467
- delete this._oListReportControl;
468
330
 
469
331
  if (this.extensionAPI) {
470
332
  this.extensionAPI.destroy();
@@ -474,12 +336,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
474
336
  };
475
337
 
476
338
  _proto._onAfterBinding = function _onAfterBinding() {
477
- var _this6 = this;
339
+ var _this5 = this;
478
340
 
479
341
  var aTables = this._getControls("table");
480
342
 
481
343
  if (EditState.isEditStateDirty()) {
482
- var oTableBinding = this._getTableBinding();
344
+ var _this$_getMultiModeCo, _this$_getTable;
345
+
346
+ (_this$_getMultiModeCo = this._getMultiModeControl()) === null || _this$_getMultiModeCo === void 0 ? void 0 : _this$_getMultiModeCo.invalidateContent();
347
+ var oTableBinding = (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.getRowBinding();
483
348
 
484
349
  if (oTableBinding) {
485
350
  if (CommonUtils.getAppComponent(this.getView())._isFclEnabled()) {
@@ -489,22 +354,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
489
354
  if (!this.sUpdateTimer) {
490
355
  this.sUpdateTimer = setTimeout(function () {
491
356
  oTableBinding.refresh();
492
-
493
- if (_this6._isMultiMode()) {
494
- _this6._invalidateMultipleModeContent();
495
-
496
- _this6._setCountsOutDated();
497
-
498
- _this6._updateCounts();
499
- }
500
-
501
- delete _this6.sUpdateTimer;
357
+ delete _this5.sUpdateTimer;
502
358
  }, 0);
503
359
  } // Update action enablement and visibility upon table data update.
504
360
 
505
361
 
506
362
  var fnUpdateTableActions = function () {
507
- _this6._updateTableActions(aTables);
363
+ _this5._updateTableActions(aTables);
508
364
 
509
365
  oTableBinding.detachDataReceived(fnUpdateTableActions);
510
366
  };
@@ -528,16 +384,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
528
384
  };
529
385
 
530
386
  _proto.onAfterRendering = function onAfterRendering() {
531
- var _this7 = this;
387
+ var _this6 = this;
532
388
 
533
389
  this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
534
- _this7.oResourceBundle = response;
390
+ _this6.oResourceBundle = response;
535
391
 
536
- var aControls = _this7._getControls();
392
+ var aControls = _this6._getControls();
537
393
 
538
- var sEntitySet = _this7.getView().getViewData().entitySet;
394
+ var sEntitySet = _this6.getView().getViewData().entitySet;
539
395
 
540
- var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this7.oResourceBundle, undefined, sEntitySet);
396
+ var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this6.oResourceBundle, undefined, sEntitySet);
541
397
  aControls.forEach(function (oControl) {
542
398
  oControl.setNoDataText(sText);
543
399
  });
@@ -609,13 +465,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
609
465
  };
610
466
 
611
467
  _proto.getCurrentEntitySet = function getCurrentEntitySet() {
612
- if (!this._sEntitySet) {
613
- var oDisplayedControl = this._isMultiMode() && this._getCurrentControl() || this._getTable();
468
+ var _this$_getTable2;
614
469
 
615
- this._sEntitySet = oDisplayedControl === null || oDisplayedControl === void 0 ? void 0 : oDisplayedControl.data("targetCollectionPath").slice(1);
616
- }
617
-
618
- return this._sEntitySet;
470
+ return (_this$_getTable2 = this._getTable()) === null || _this$_getTable2 === void 0 ? void 0 : _this$_getTable2.data("targetCollectionPath").slice(1);
619
471
  }
620
472
  /**
621
473
  * This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
@@ -634,7 +486,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
634
486
  var oInternalModelContext = oTable.getBindingContext("internal"),
635
487
  oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
636
488
  aSelectedContexts = oTable.getSelectedContexts();
637
- CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
489
+ ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table");
638
490
  });
639
491
  CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
640
492
  }
@@ -654,19 +506,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
654
506
  };
655
507
 
656
508
  _proto._getPageTitleInformation = function _getPageTitleInformation() {
657
- var oTitleInfo = {
658
- title: "",
659
- subtitle: "",
509
+ var oManifestEntry = this.getAppComponent().getManifestEntry("sap.app");
510
+ return {
511
+ title: oManifestEntry.title,
512
+ subtitle: oManifestEntry.appSubTitle || "",
660
513
  intent: "",
661
514
  icon: ""
662
515
  };
663
- oTitleInfo.title = this.getView().getContent()[0].data().ListReportTitle;
664
- oTitleInfo.subtitle = this.getView().getContent()[0].data().ListReportSubtitle;
665
- return oTitleInfo;
666
- };
667
-
668
- _proto._getPageOrFilterBarVariantManagement = function _getPageOrFilterBarVariantManagement() {
669
- return this.getView().byId("fe::PageVariantManagement") || this.getView().byId("".concat(this._getFilterBarControlId(), "::VariantManagement"));
670
516
  };
671
517
 
672
518
  _proto._getFilterBarControl = function _getFilterBarControl() {
@@ -682,86 +528,68 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
682
528
  };
683
529
 
684
530
  _proto._getSegmentedButton = function _getSegmentedButton(sControl) {
685
- return this.getView().byId(this._getSegmentedButtonId(sControl));
531
+ var _ref;
532
+
533
+ var sSegmentedButtonId = (_ref = sControl === "Chart" ? this.getChartControl() : this._getTable()) === null || _ref === void 0 ? void 0 : _ref.data("segmentedButtonId");
534
+ return this.getView().byId(sSegmentedButtonId);
686
535
  };
687
536
 
688
- _proto._getSegmentedButtonId = function _getSegmentedButtonId(sControl) {
689
- if (sControl === "Chart") {
690
- return this._getChart().data("segmentedButtonId");
691
- } else {
692
- var _this$_getTable;
537
+ _proto._getControlFromPageModelProperty = function _getControlFromPageModelProperty(sPath) {
538
+ var _this$_getPageModel;
693
539
 
694
- return (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.data("segmentedButtonId");
695
- }
540
+ var controlId = (_this$_getPageModel = this._getPageModel()) === null || _this$_getPageModel === void 0 ? void 0 : _this$_getPageModel.getProperty(sPath);
541
+ return controlId && this.getView().byId(controlId);
696
542
  };
697
543
 
698
- _proto._getFilterBarControlId = function _getFilterBarControlId() {
699
- return this.getView().getContent()[0].data("filterBarId");
544
+ _proto._getPageModel = function _getPageModel() {
545
+ var pageComponent = Component.getOwnerComponentFor(this.getView());
546
+ return pageComponent.getModel("_pageModel");
700
547
  };
701
548
 
702
- _proto._getChartControlId = function _getChartControlId() {
703
- return this.getView().getContent()[0].data("singleChartId");
549
+ _proto._getFilterBarControlId = function _getFilterBarControlId() {
550
+ var _this$_getPageModel2;
551
+
552
+ return ((_this$_getPageModel2 = this._getPageModel()) === null || _this$_getPageModel2 === void 0 ? void 0 : _this$_getPageModel2.getProperty("/filterBarId")) || "";
704
553
  };
705
554
 
706
555
  _proto.getChartControl = function getChartControl() {
707
- return this.getView().byId(this._getChartControlId());
556
+ return this._getControlFromPageModelProperty("/singleChartId");
708
557
  };
709
558
 
710
559
  _proto._getVisualFilterBarControl = function _getVisualFilterBarControl() {
711
- return this.getView().byId(this._getVisualFilterBarControlId());
560
+ var sVisualFilterBarId = StableIdHelper.generate(["visualFilter", this._getFilterBarControlId()]);
561
+ return sVisualFilterBarId && this.getView().byId(sVisualFilterBarId);
712
562
  };
713
563
 
714
- _proto._getVisualFilterBarControlId = function _getVisualFilterBarControlId() {
715
- return this.getView().getContent()[0].data("visualFilterBarId");
564
+ _proto._getFilterBarVariantControl = function _getFilterBarVariantControl() {
565
+ return this._getControlFromPageModelProperty("/variantManagement/id");
716
566
  };
717
567
 
718
568
  _proto._getMultiModeControl = function _getMultiModeControl() {
719
- return this.getView().byId("fe::TabMultipleMode");
720
- };
721
-
722
- _proto._getTableControlId = function _getTableControlId() {
723
- return this.getView().getContent()[0].data("singleTableId");
724
- };
725
-
726
- _proto._getCurrentControl = function _getCurrentControl() {
727
- if (!this._oListReportControl) {
728
- var oMultiModeTab = this._getMultiModeControl();
729
-
730
- this._oListReportControl = this.getView().byId(oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey());
731
- }
732
-
733
- return this._oListReportControl;
569
+ return this.getView().byId("fe::TabMultipleMode::Control");
734
570
  };
735
571
 
736
572
  _proto._getTable = function _getTable() {
737
573
  if (this._isMultiMode()) {
738
- var oControl = this._getCurrentControl();
574
+ var _this$_getMultiModeCo2, _this$_getMultiModeCo3;
739
575
 
740
- return oControl && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
576
+ var oControl = (_this$_getMultiModeCo2 = this._getMultiModeControl()) === null || _this$_getMultiModeCo2 === void 0 ? void 0 : (_this$_getMultiModeCo3 = _this$_getMultiModeCo2.getSelectedInnerControl()) === null || _this$_getMultiModeCo3 === void 0 ? void 0 : _this$_getMultiModeCo3.content;
577
+ return oControl !== null && oControl !== void 0 && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
578
+ } else {
579
+ return this._getControlFromPageModelProperty("/singleTableId");
741
580
  }
742
-
743
- return this.getView().byId(this._getTableControlId());
744
- };
745
-
746
- _proto._getChart = function _getChart() {
747
- return this.getView().byId(this._getChartControlId());
748
- };
749
-
750
- _proto._getTableBinding = function _getTableBinding(sTableId) {
751
- var oTableControl = sTableId ? this.getView().byId(sTableId) : this._getTable();
752
- return oTableControl && oTableControl._getRowBinding();
753
581
  };
754
582
 
755
583
  _proto._getControls = function _getControls(sKey) {
756
- var _this8 = this;
584
+ var _this7 = this;
757
585
 
758
586
  if (this._isMultiMode()) {
759
587
  var aControls = [];
760
588
 
761
- var oTabMultiMode = this._getMultiModeControl();
589
+ var oTabMultiMode = this._getMultiModeControl().content;
762
590
 
763
591
  oTabMultiMode.getItems().forEach(function (oItem) {
764
- var oControl = _this8.getView().byId(oItem.getKey());
592
+ var oControl = _this7.getView().byId(oItem.getKey());
765
593
 
766
594
  if (oControl && sKey) {
767
595
  if (oItem.getKey().indexOf("fe::".concat(sKey)) > -1) {
@@ -773,8 +601,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
773
601
  });
774
602
  return aControls;
775
603
  } else if (sKey === "Chart") {
776
- var oChart = this._getChart();
777
-
604
+ var oChart = this.getChartControl();
778
605
  return oChart ? [oChart] : [];
779
606
  } else {
780
607
  var oTable = this._getTable();
@@ -784,7 +611,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
784
611
  };
785
612
 
786
613
  _proto._getDefaultPath = function _getDefaultPath() {
787
- var defaultPath = this.getView().getContent()[0].data("defaultPath");
614
+ var _this$_getPageModel3;
615
+
616
+ var defaultPath = ListReportTemplating.getDefaultPath(((_this$_getPageModel3 = this._getPageModel()) === null || _this$_getPageModel3 === void 0 ? void 0 : _this$_getPageModel3.getProperty("/views")) || []);
788
617
 
789
618
  switch (defaultPath) {
790
619
  case "primary":
@@ -808,11 +637,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
808
637
  ;
809
638
 
810
639
  _proto._isMultiMode = function _isMultiMode() {
811
- if (!this._oListReportControl) {
812
- this._bMultiMode = !!this._getMultiModeControl();
813
- }
640
+ var _this$_getPageModel4;
814
641
 
815
- return this._bMultiMode;
642
+ return !!((_this$_getPageModel4 = this._getPageModel()) !== null && _this$_getPageModel4 !== void 0 && _this$_getPageModel4.getProperty("/multiViewsControl"));
816
643
  }
817
644
  /**
818
645
  * Method to know if ListReport is configured to load data at start up.
@@ -826,22 +653,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
826
653
  _proto._isInitLoadEnabled = function _isInitLoadEnabled() {
827
654
  var initLoadMode = this.getView().getViewData().initialLoad;
828
655
  return initLoadMode === InitialLoadMode.Enabled;
829
- }
830
- /**
831
- * Method to know if ListReport is configured with Multiple EntitySets.
832
- *
833
- * @function
834
- * @name _isMultiEntitySets
835
- * @returns Is Multiple EntitySets configuration?
836
- */
837
- ;
838
-
839
- _proto._isMultiEntitySets = function _isMultiEntitySets() {
840
- return this.getView().getContent()[0].data("isMultiEntitySets") === "true";
841
656
  };
842
657
 
843
658
  _proto._hasMultiVisualizations = function _hasMultiVisualizations() {
844
- return this.getView().getContent()[0].data("hasMultiVisualizations") === "true";
659
+ var _this$_getPageModel5;
660
+
661
+ return (_this$_getPageModel5 = this._getPageModel()) === null || _this$_getPageModel5 === void 0 ? void 0 : _this$_getPageModel5.getProperty("/hasMultiVisualizations");
845
662
  }
846
663
  /**
847
664
  * Method to suspend search on the filter bar. The initial loading of data is disabled based on the manifest configuration InitLoad - Disabled/Auto.
@@ -886,7 +703,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
886
703
  // required to override the user setting 'apply automatically' behaviour if there are no filters
887
704
 
888
705
 
889
- var variantManagement = this._getPageOrFilterBarVariantManagement();
706
+ var variantManagementId = ListReportTemplating.getVariantBackReference(this.getView().getViewData(), this._getPageModel());
707
+ var variantManagement = variantManagementId && this.getView().byId(variantManagementId);
890
708
 
891
709
  if (variantManagement) {
892
710
  variantManagement.registerApplyAutomaticallyOnStandardVariant(this._applyAutomaticallyOnStandardVariant.bind(this));
@@ -921,81 +739,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
921
739
  var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
922
740
  oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
923
741
  }
924
- /**
925
- * Hidden tables must be marked as hidden to avoid sending
926
- * requests when FilterBar is changed or LR is initialized
927
- * Best workflow would be to suspend table binding but
928
- * if the user switch quickly between tabs the batch response of previous
929
- * is received when previous tab is already disabled (binding is suspended) and
930
- * generates error.
931
- * A temporary solution (if we find better workflow) is to set a customData and don't trigger
932
- * rebindTable if this customData is set to true.
933
- */
934
- ;
935
-
936
- _proto._updateMultiControlHiddenStatus = function _updateMultiControlHiddenStatus() {
937
- var oDisplayedControl = this._getCurrentControl();
938
-
939
- if (this._isMultiMode() && oDisplayedControl) {
940
- var sDisplayControlId = oDisplayedControl.getId();
941
-
942
- var aControls = this._getControls();
943
-
944
- aControls.forEach(function (oControl) {
945
- var sControlId = oControl.getId();
946
- oControl.data("controlHidden", sControlId !== sDisplayControlId);
947
- });
948
- }
949
- }
950
- /**
951
- * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the multiple table scenario).
952
- *
953
- * @param oInternalModelContext The internal model context
954
- * @param oFilterBar MDC filter bar
955
- */
956
- ;
957
-
958
- _proto._updateMultiTabNotApplicableFields = function _updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar) {
959
- var _this9 = this;
960
-
961
- var mCache = {};
962
-
963
- var ignoredFields = {},
964
- ignoredFieldsTitle = {},
965
- aTables = this._getControls("table"),
966
- aCharts = this._getControls("Chart");
967
-
968
- aTables.forEach(function (oTable) {
969
- var sTableEntityPath = oTable.data("targetCollectionPath"),
970
- sTableEntitySet = sTableEntityPath.slice(1),
971
- sTabId = oTable.getParent().getParent().getKey(),
972
- sTabTitle = oTable.getParent().getParent().getText(),
973
- sCacheKey = sTableEntitySet + (oTable.data("enableAnalytics") === "true" ? "Analytical" : "Regular");
974
-
975
- if (!mCache[sCacheKey]) {
976
- mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oTable);
977
- }
978
-
979
- ignoredFields[sTabId] = mCache[sCacheKey];
980
- ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
981
- });
982
- aCharts.forEach(function (oChart) {
983
- var sChartEntityPath = oChart.data("targetCollectionPath"),
984
- sChartEntitySet = sChartEntityPath.slice(1),
985
- sTabId = oChart.getParent().getParent().getKey(),
986
- sTabTitle = oChart.getParent().getParent().getText(),
987
- sCacheKey = "".concat(sChartEntitySet, "Chart");
988
-
989
- if (!mCache[sCacheKey]) {
990
- mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
991
- }
992
-
993
- ignoredFields[sTabId] = mCache[sCacheKey];
994
- ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
995
- });
996
- oInternalModelContext.setProperty("tabs/ignoredFields", ignoredFields);
997
- oInternalModelContext.setProperty("tabs/ignoredFieldsTitle", ignoredFieldsTitle);
998
- }
999
742
  /**
1000
743
  * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
1001
744
  *
@@ -1031,102 +774,20 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
1031
774
  oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
1032
775
  };
1033
776
 
1034
- _proto._updateMultiModeSelectedControl = function _updateMultiModeSelectedControl() {
1035
- this._sEntitySet = undefined;
1036
- this._oListReportControl = undefined;
1037
-
1038
- this._getCurrentControl();
1039
- };
1040
-
1041
- _proto._updateCounts = function _updateCounts() {
1042
- this._updateMultiModeCounts();
1043
- }
1044
- /**
1045
- * Method to determine if a tab from the list report is a custom tab.
1046
- *
1047
- * @function
1048
- * @name _isCustomTab
1049
- * @returns Determines if the tab is a custom tab.
1050
- */
1051
- ;
1052
-
1053
- _proto._isCustomTab = function _isCustomTab() {
1054
- var oMultiModeControl = this._getMultiModeControl();
1055
-
1056
- return oMultiModeControl && oMultiModeControl.getSelectedKey().indexOf("::CustomTab::") > -1;
777
+ _proto._isFilterBarHidden = function _isFilterBarHidden() {
778
+ return this.getView().getViewData().hideFilterBar;
1057
779
  };
1058
780
 
1059
- _proto._setCountsOutDated = function _setCountsOutDated() {
1060
- var oMultiModeControl = this._getMultiModeControl();
1061
-
1062
- if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true") {
1063
- var aItems = oMultiModeControl.getItems();
1064
- aItems.forEach(function (oItem) {
1065
- if (oItem.getKey().indexOf("fe::Chart") === -1) {
1066
- oItem.data("outdatedCounts", true);
1067
- }
1068
- });
781
+ _proto._getApplyAutomaticallyOnVariant = function _getApplyAutomaticallyOnVariant(VariantManagement, key) {
782
+ if (!VariantManagement || !key) {
783
+ return false;
1069
784
  }
1070
- };
1071
-
1072
- _proto._invalidateMultipleModeContent = function _invalidateMultipleModeContent() {
1073
- var aControls = this._getControls();
1074
-
1075
- var sDisplayedControlId = this._getCurrentControl().getId();
1076
785
 
1077
- aControls.forEach(function (oControl) {
1078
- oControl.data("outdatedRows", oControl.getId() !== sDisplayedControlId);
786
+ var variants = VariantManagement.getVariants();
787
+ var currentVariant = variants.find(function (variant) {
788
+ return variant && variant.key === key;
1079
789
  });
1080
- };
1081
-
1082
- _proto._updateMultiModeCounts = function _updateMultiModeCounts() {
1083
- var _this10 = this;
1084
-
1085
- var aBindingPromises = [];
1086
-
1087
- var oMultiModeControl = this._getMultiModeControl();
1088
-
1089
- if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true" && !this._isCustomTab()) {
1090
- var oDisplayedControl = this._getCurrentControl();
1091
-
1092
- var sDisplayedControlId = oDisplayedControl.getId();
1093
- var aCompliantTabs = [];
1094
- var aItems = oMultiModeControl.getItems();
1095
- aItems.forEach(function (oItem) {
1096
- if (oItem.getProperty("visible")) {
1097
- var oControl = _this10.getView().byId(oItem.getKey());
1098
-
1099
- if (oControl && !oControl.isA("sap.ui.mdc.Chart") && (oItem.data("outdatedCounts") || oControl.getId() === sDisplayedControlId)) {
1100
- aCompliantTabs.push({
1101
- control: oControl,
1102
- item: oItem
1103
- });
1104
- }
1105
- }
1106
- });
1107
- aBindingPromises = aCompliantTabs.map(function (mTab) {
1108
- mTab.item.setCount("...");
1109
- var oControl = mTab.control;
1110
- var oFilterInfos = TableUtils.getFiltersInfoForSV(oControl, mTab.item.data("selectionVariant"));
1111
- return TableUtils.getListBindingForCount(oControl, _this10.getView().getBindingContext(), {
1112
- batchGroupId: oControl.getId() === sDisplayedControlId ? oControl.data("batchGroupId") : "$auto",
1113
- additionalFilters: oFilterInfos.filters
1114
- });
1115
- });
1116
- Promise.all(aBindingPromises).then(function (aCounts) {
1117
- for (var k in aCounts) {
1118
- var oItem = aCompliantTabs[k].item;
1119
- oItem.setCount(TableUtils.getCountFormatted(aCounts[k]));
1120
- oItem.data("outdatedCounts", false);
1121
- }
1122
- }).catch(function (oError) {
1123
- Log.error("Error while retrieving the values for the icon tab bar", oError);
1124
- });
1125
- }
1126
- };
1127
-
1128
- _proto._isFilterBarHidden = function _isFilterBarHidden() {
1129
- return this.getView().getViewData().hideFilterBar;
790
+ return currentVariant && currentVariant.executeOnSelect || false;
1130
791
  };
1131
792
 
1132
793
  _proto._shouldAutoTriggerSearch = function _shouldAutoTriggerSearch(oVM) {
@@ -1222,4 +883,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUt
1222
883
  }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype)), _class2)) || _class);
1223
884
  return ListReportController;
1224
885
  }, false);
1225
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiVGVtcGxhdGVDb250ZW50VmlldyIsIkNvcmVMaWJyYXJ5IiwiSW5pdGlhbExvYWRNb2RlIiwiTGlzdFJlcG9ydENvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiSW50ZXJuYWxSb3V0aW5nIiwib3ZlcnJpZGUiLCJvbkFmdGVyQmluZGluZyIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiX29uQWZ0ZXJCaW5kaW5nIiwiSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRFbnRpdHlTZXQiLCJiYXNlIiwiZ2V0Q3VycmVudEVudGl0eVNldCIsIlNpZGVFZmZlY3RzIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJTaGFyZSIsIlNoYXJlT3ZlcnJpZGVzIiwiRWRpdEZsb3ciLCJFZGl0Rmxvd092ZXJyaWRlcyIsIlZpZXdTdGF0ZSIsIlZpZXdTdGF0ZU92ZXJyaWRlcyIsIktQSU1hbmFnZW1lbnQiLCJQbGFjZWhvbGRlciIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJwcml2YXRlRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uVGFiTXVsdGlNb2RlQ2hhbmdlIiwib0V2ZW50IiwiX3VwZGF0ZU11bHRpTW9kZVNlbGVjdGVkQ29udHJvbCIsIl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMiLCJvRmlsdGVyQmFyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9EaXNwbGF5ZWRDb250cm9sIiwiX2dldEN1cnJlbnRDb250cm9sIiwib011bHRpTW9kZUNvbnRyb2wiLCJfZ2V0TXVsdGlNb2RlQ29udHJvbCIsInNTZWxlY3RlZEtleSIsImdldFNlbGVjdGVkS2V5Iiwic1ByZXZpb3VzU2VsZWN0ZWRLZXkiLCJtUGFyYW1ldGVycyIsInByZXZpb3VzS2V5IiwidW5kZWZpbmVkIiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eSIsIl9pc0N1c3RvbVRhYiIsIm9GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVyQ29uZGl0aW9ucyIsIm9uVmlld05lZWRzUmVmcmVzaCIsImZpbHRlckNvbmRpdGlvbnMiLCJjdXJyZW50VGFiSWQiLCJyZWZyZXNoQ2F1c2UiLCJpc0EiLCJnZXRSb3dCaW5kaW5nIiwiZGF0YSIsInJlYmluZCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImdldEJpbmRpbmciLCJvSW5uZXJDaGFydCIsImdldEJpbmRpbmdJbmZvIiwic2VsZWN0ZWRLZXkiLCJDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkiLCJhZGQiLCJjaGFuZ2VzIiwiY2hhbmdlU3BlY2lmaWNEYXRhIiwiY2hhbmdlVHlwZSIsImNvbnRlbnQiLCJwcmV2aW91c1NlbGVjdGVkS2V5Iiwic2VsZWN0b3JFbGVtZW50IiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvbkZpbHRlcnNDaGFuZ2VkIiwib25QZW5kaW5nRmlsdGVycyIsImdldEFzc2lnbmVkRmlsdGVyc1RleHQiLCJmaWx0ZXJzVGV4dCIsImdldFBhcmFtZXRlciIsIm9uVmFyaWFudFNlbGVjdGVkIiwib1ZNIiwiZ2V0U291cmNlIiwic2V0VGltZW91dCIsIl9pc011bHRpTW9kZSIsImFwcGx5IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwidHJpZ2dlclNlYXJjaCIsIm9uVmFyaWFudFNhdmVkIiwib25TZWFyY2giLCJvTWRjQ2hhcnQiLCJnZXRDaGFydENvbnRyb2wiLCJiSGlkZURyYWZ0IiwiRmlsdGVyVXRpbHMiLCJnZXRFZGl0U3RhdGVJc0hpZGVEcmFmdCIsImdldENvbmRpdGlvbnMiLCJfc2V0Q291bnRzT3V0RGF0ZWQiLCJfdXBkYXRlTXVsdGlUYWJOb3RBcHBsaWNhYmxlRmllbGRzIiwiX2ludmFsaWRhdGVNdWx0aXBsZU1vZGVDb250ZW50IiwiX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMiLCJvUGFnZUludGVybmFsTW9kZWxDb250ZXh0Iiwic1RlbXBsYXRlQ29udGVudFZpZXciLCJnZXRQYXRoIiwiQ2hhcnQiLCJoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzIiwiVGFibGUiLCJoYXNQZW5kaW5nVGFibGVDaGFuZ2VzIiwiU3RhdGVVdGlsIiwicmV0cmlldmVFeHRlcm5hbFN0YXRlIiwidGhlbiIsIm9FeHRlcm5hbFN0YXRlIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlciIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJnZXRWaWV3RGF0YSIsImxpdmVNb2RlIiwic3lzdGVtIiwicGhvbmUiLCJvRHluYW1pY1BhZ2UiLCJieUlkIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJvQ29udHJvbGxlciIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJnZXRDb250ZW50Iiwib1RhYmxlIiwiX2dldFRhYmxlIiwiYURhdGEiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0IiwiQ2hhcnRVdGlscyIsInNldENoYXJ0RmlsdGVycyIsIm9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsImtleSIsIm9DaGFydCIsIm9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJhSXRlbXMiLCJvU2VnbWVudGVkQnV0dG9uIiwiZ2V0SXRlbXMiLCJmb3JFYWNoIiwib0l0ZW0iLCJnZXRLZXkiLCJmb2N1cyIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJfZ2V0U2VnbWVudGVkQnV0dG9uIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl91cGRhdGVUYWJsZSIsIl91cGRhdGVDaGFydCIsIkh5YnJpZCIsIm9uRmlsdGVyc1NlZ21lbnRlZEJ1dHRvblByZXNzZWQiLCJzZXRWaXNpYmxlIiwib25TdGF0ZUNoYW5nZSIsIm9uRHluYW1pY1BhZ2VUaXRsZVN0YXRlQ2hhbmdlZCIsImZpbHRlckJhciIsImdldFNlZ21lbnRlZEJ1dHRvbiIsImZvcm1hdHRlcnMiLCJzZXRUYWJNZXNzYWdlU3RyaXAiLCJhSWdub3JlZEZpZWxkcyIsInNUYWJUaXRsZSIsImJJc0NoYXJ0Iiwib0FwcGx5U3VwcG9ydGVkIiwic1RleHQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJzRmlsdGVyQmFyRW50aXR5UGF0aCIsIm9NZXRhTW9kZWwiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJhSWdub3JlZExhYmVscyIsIm1hcCIsInNQcm9wZXJ0eSIsIm9NYWNyb1Jlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInNMYWJlbCIsImdldE9iamVjdCIsIkRlbGVnYXRlVXRpbCIsImdldExvY2FsaXplZFRleHQiLCJiSXNTZWFyY2hJZ25vcmVkIiwiZW5hYmxlU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJnZXRNZXNzYWdlU3RyaXBUZXh0IiwiZXh0ZW5zaW9uQVBJIiwiRXh0ZW5zaW9uQVBJIiwib25Jbml0IiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJhQ29udHJvbHMiLCJfZ2V0Q29udHJvbHMiLCJvTXVsdGlNb2RlVGFiIiwic2VsZWN0ZWQiLCJvQ29udHJvbCIsIm9VcGRhdGVDb3VudHMiLCJfdXBkYXRlQ291bnRzIiwiYWRkRXZlbnRUb0JpbmRpbmdJbmZvIiwiX2hhc011bHRpVmlzdWFsaXphdGlvbnMiLCJhbHBDb250ZW50VmlldyIsIl9nZXREZWZhdWx0UGF0aCIsImRlc2t0b3AiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsIl9zZXRJbml0TG9hZCIsIm9uRXhpdCIsIl9vTGlzdFJlcG9ydENvbnRyb2wiLCJkZXN0cm95IiwiYVRhYmxlcyIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJvVGFibGVCaW5kaW5nIiwiX2dldFRhYmxlQmluZGluZyIsIl9pc0ZjbEVuYWJsZWQiLCJyZWZyZXNoIiwic1VwZGF0ZVRpbWVyIiwiZm5VcGRhdGVUYWJsZUFjdGlvbnMiLCJfdXBkYXRlVGFibGVBY3Rpb25zIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwic2V0RWRpdFN0YXRlUHJvY2Vzc2VkIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldFJlc291cmNlQnVuZGxlIiwicmVzcG9uc2UiLCJzRW50aXR5U2V0IiwiZW50aXR5U2V0IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJzZXROb0RhdGFUZXh0Iiwib25QYWdlUmVhZHkiLCJmb3JjZUZvY3VzIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwic2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJfc0VudGl0eVNldCIsInNsaWNlIiwiYUlCTkFjdGlvbnMiLCJnZXRJQk5BY3Rpb25zIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIkNvbW1vbkhlbHBlciIsInBhcnNlQ3VzdG9tRGF0YSIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwib1RpdGxlSW5mbyIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiTGlzdFJlcG9ydFRpdGxlIiwiTGlzdFJlcG9ydFN1YnRpdGxlIiwiX2dldFBhZ2VPckZpbHRlckJhclZhcmlhbnRNYW5hZ2VtZW50IiwiX2dldEZpbHRlckJhckNvbnRyb2xJZCIsIl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCIsImFkYXB0YXRpb25GaWx0ZXJCYXIiLCJnZXRJbmJ1aWx0RmlsdGVyIiwiZ2V0UGFyZW50Iiwic0NvbnRyb2wiLCJfZ2V0U2VnbWVudGVkQnV0dG9uSWQiLCJfZ2V0Q2hhcnRDb250cm9sSWQiLCJfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCIsIl9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sSWQiLCJfZ2V0VGFibGVDb250cm9sSWQiLCJzVGFibGVJZCIsIm9UYWJsZUNvbnRyb2wiLCJfZ2V0Um93QmluZGluZyIsInNLZXkiLCJvVGFiTXVsdGlNb2RlIiwiaW5kZXhPZiIsInB1c2giLCJkZWZhdWx0UGF0aCIsIl9iTXVsdGlNb2RlIiwiX2lzSW5pdExvYWRFbmFibGVkIiwiaW5pdExvYWRNb2RlIiwiaW5pdGlhbExvYWQiLCJFbmFibGVkIiwiX2lzTXVsdGlFbnRpdHlTZXRzIiwiX2Rpc2FibGVJbml0TG9hZCIsInNldFN1c3BlbmRTZWxlY3Rpb24iLCJfYXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQiLCJ2YXJpYW50TWFuYWdlbWVudCIsInJlZ2lzdGVyQXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQiLCJiaW5kIiwiX3NldFNoYXJlTW9kZWwiLCJmbkdldFVzZXIiLCJPYmplY3RQYXRoIiwiZ2V0Iiwib1NoYXJlSW5mbyIsImJvb2ttYXJrVGl0bGUiLCJkb2N1bWVudCIsImJvb2ttYXJrQ3VzdG9tVXJsIiwic0hhc2giLCJoYXNoZXIiLCJnZXRIYXNoIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiaXNTaGFyZUluSmFtQWN0aXZlIiwiaXNKYW1BY3RpdmUiLCJvVGVtcGxhdGVQcml2YXRlTW9kZWwiLCJnZXRPd25lckNvbXBvbmVudCIsInNEaXNwbGF5Q29udHJvbElkIiwiZ2V0SWQiLCJzQ29udHJvbElkIiwibUNhY2hlIiwiaWdub3JlZEZpZWxkcyIsImlnbm9yZWRGaWVsZHNUaXRsZSIsImFDaGFydHMiLCJzVGFibGVFbnRpdHlQYXRoIiwic1RhYmxlRW50aXR5U2V0Iiwic1RhYklkIiwic0NhY2hlS2V5IiwiZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMiLCJjYWxsIiwic0NoYXJ0RW50aXR5UGF0aCIsInNDaGFydEVudGl0eVNldCIsIl91cGRhdGVNdWx0aU1vZGVDb3VudHMiLCJzRGlzcGxheWVkQ29udHJvbElkIiwiYUJpbmRpbmdQcm9taXNlcyIsImFDb21wbGlhbnRUYWJzIiwiY29udHJvbCIsIml0ZW0iLCJtVGFiIiwic2V0Q291bnQiLCJvRmlsdGVySW5mb3MiLCJUYWJsZVV0aWxzIiwiZ2V0RmlsdGVyc0luZm9Gb3JTViIsImdldExpc3RCaW5kaW5nRm9yQ291bnQiLCJiYXRjaEdyb3VwSWQiLCJhZGRpdGlvbmFsRmlsdGVycyIsImZpbHRlcnMiLCJQcm9taXNlIiwiYWxsIiwiYUNvdW50cyIsImsiLCJnZXRDb3VudEZvcm1hdHRlZCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImhpZGVGaWx0ZXJCYXIiLCJBdXRvIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJvQ29uZGl0aW9ucyIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZFZhcmlhbnQiLCJnZXRWYXJpYW50cyIsImZpbmQiLCJ2YXJpYW50IiwiZXhlY3V0ZU9uU2VsZWN0IiwiaXNUYWJsZUJvdW5kIiwiaXNCb3VuZCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FB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QUFDRDtBQUNEO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFQO0FBQ0EsSzs7V0FFRHhOLFksR0FBQSxzQkFBYXRCLE1BQWIsRUFBMEI7QUFDekIsVUFBSSxDQUFDQSxNQUFNLENBQUMrTyxZQUFQLEVBQUQsSUFBMEIsS0FBSzNRLHNCQUFuQyxFQUEyRDtBQUMxRDRCLFFBQUFBLE1BQU0sQ0FBQzFFLE1BQVA7QUFDQSxhQUFLOEMsc0JBQUwsR0FBOEIsS0FBOUI7QUFDQTtBQUNELEs7O1dBRURtRCxZLEdBQUEsc0JBQWFkLE1BQWIsRUFBMEI7QUFDekIsVUFBTS9FLFdBQVcsR0FBRytFLE1BQU0sQ0FBQ2xGLGtCQUFQLEdBQTRCQyxTQUE1QixDQUFzQ2lGLE1BQXRDLENBQXBCOztBQUNBLFVBQUksRUFBRS9FLFdBQVcsSUFBSUEsV0FBVyxDQUFDc1QsT0FBWixDQUFvQixNQUFwQixDQUFqQixLQUFpRCxLQUFLMVEsc0JBQTFELEVBQWtGO0FBQ2pGbUMsUUFBQUEsTUFBTSxDQUFDbEYsa0JBQVAsR0FBNEJELE1BQTVCLENBQW1DbUYsTUFBbkMsRUFBMkMvRSxXQUFXLENBQUNDLGNBQVosQ0FBMkIsTUFBM0IsQ0FBM0M7QUFDQSxhQUFLMkMsc0JBQUwsR0FBOEIsS0FBOUI7QUFDQTtBQUNELEs7OztJQWp2QmlDMEYsYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBNmhDcEJ4TSxvQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IHR5cGUgRHluYW1pY1BhZ2UgZnJvbSBcInNhcC9mL0R5bmFtaWNQYWdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IEtQSU1hbmFnZW1lbnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0tQSU1hbmFnZW1lbnRcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7XG5cdGRlZmluZVVJNUNsYXNzLFxuXHRleHRlbnNpYmxlLFxuXHRmaW5hbEV4dGVuc2lvbixcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uLFxuXHR1c2luZ0V4dGVuc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBFZGl0Rmxvd092ZXJyaWRlcyBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9Sb290Q29udGFpbmVyL292ZXJyaWRlcy9FZGl0Rmxvd1wiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IHR5cGUgSWNvblRhYkJhciBmcm9tIFwic2FwL20vSWNvblRhYkJhclwiO1xuaW1wb3J0IHR5cGUgU2VnbWVudGVkQnV0dG9uIGZyb20gXCJzYXAvbS9TZWdtZW50ZWRCdXR0b25cIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHsgc3lzdGVtIH0gZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkgZnJvbSBcInNhcC91aS9mbC93cml0ZS9hcGkvQ29udHJvbFBlcnNvbmFsaXphdGlvbldyaXRlQVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgaGFzaGVyIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9oYXNoZXJcIjtcbmltcG9ydCB0eXBlIHsgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5jb25zdCBUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gQ29yZUxpYnJhcnkuVGVtcGxhdGVDb250ZW50Vmlldyxcblx0SW5pdGlhbExvYWRNb2RlID0gQ29yZUxpYnJhcnkuSW5pdGlhbExvYWRNb2RlO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuTGlzdFJlcG9ydENvbnRyb2xsZXJcIilcbmNsYXNzIExpc3RSZXBvcnRDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKHtcblx0XHRcdG9uQWZ0ZXJCaW5kaW5nOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxSb3V0aW5nKSB7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLl9vbkFmdGVyQmluZGluZygpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZSh7XG5cdFx0XHRnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gKHRoaXMuYmFzZSBhcyBMaXN0UmVwb3J0Q29udHJvbGxlcikuZ2V0Q3VycmVudEVudGl0eVNldCgpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X2ludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oU2lkZUVmZmVjdHMpXG5cdHNpZGVFZmZlY3RzITogU2lkZUVmZmVjdHM7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihFZGl0Rmxvdy5vdmVycmlkZShFZGl0Rmxvd092ZXJyaWRlcykpXG5cdGVkaXRGbG93ITogRWRpdEZsb3c7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEtQSU1hbmFnZW1lbnQpXG5cdGtwaU1hbmFnZW1lbnQhOiBLUElNYW5hZ2VtZW50O1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdHBsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblx0cHJpdmF0ZSBleHRlbnNpb25BUEk/OiBFeHRlbnNpb25BUEk7XG5cdHByaXZhdGUgX29MaXN0UmVwb3J0Q29udHJvbD86IENvbnRyb2w7XG5cdHByaXZhdGUgZmlsdGVyQmFyQ29uZGl0aW9ucz86IGFueTtcblx0cHJpdmF0ZSBfYk11bHRpTW9kZT86IGJvb2xlYW47XG5cdHByaXZhdGUgc1VwZGF0ZVRpbWVyPzogYW55O1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIF9zRW50aXR5U2V0Pzogc3RyaW5nO1xuXHRwcml2YXRlIGhhc1BlbmRpbmdDaGFydENoYW5nZXM/OiBib29sZWFuO1xuXHRwcml2YXRlIGhhc1BlbmRpbmdUYWJsZUNoYW5nZXM/OiBib29sZWFuO1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRFeHRlbnNpb25BUEkoKTogRXh0ZW5zaW9uQVBJIHtcblx0XHRpZiAoIXRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbkFQSTtcblx0fVxuXG5cdG9uSW5pdCgpIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25Jbml0LmFwcGx5KHRoaXMpO1xuXHRcdGNvbnN0IGFDb250cm9scyA9IHRoaXMuX2dldENvbnRyb2xzKCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZVRhYiA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInRhYnNcIiwge1xuXHRcdFx0XHRzZWxlY3RlZDogb011bHRpTW9kZVRhYi5nZXRTZWxlY3RlZEtleSgpIHx8IChvTXVsdGlNb2RlVGFiLmdldEl0ZW1zKClbMF0gYXMgYW55KS5nZXRLZXkoKVxuXHRcdFx0fSk7XG5cdFx0XHRhQ29udHJvbHMuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvVXBkYXRlQ291bnRzID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNvdW50cygpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRDb21tb25VdGlscy5hZGRFdmVudFRvQmluZGluZ0luZm8ob0NvbnRyb2wsIFwiZGF0YVJlcXVlc3RlZFwiLCBvVXBkYXRlQ291bnRzKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvL1RPRE86IFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBhcHByb2FjaCBhbmQgd2lsbCBiZSByZW1vdmVkIG9uY2UgYXBwIHN0YXRlIGJlaGF2aW91ciBpcyBmaW5hbGl6ZWQuXG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCB0cnVlKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhcHBsaWVkRmlsdGVyc1wiLCBcIlwiKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoaWRlRHJhZnRJbmZvXCIsIGZhbHNlKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJ1b21cIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3Rvck51bWJlclwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3VycmVuY3lcIiwge30pO1xuXG5cdFx0aWYgKHRoaXMuX2hhc011bHRpVmlzdWFsaXphdGlvbnMoKSkge1xuXHRcdFx0bGV0IGFscENvbnRlbnRWaWV3ID0gdGhpcy5fZ2V0RGVmYXVsdFBhdGgoKTtcblx0XHRcdGlmICghc3lzdGVtLmRlc2t0b3AgJiYgYWxwQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuSHlicmlkKSB7XG5cdFx0XHRcdGFscENvbnRlbnRWaWV3ID0gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydDtcblx0XHRcdH1cblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFscENvbnRlbnRWaWV3XCIsIGFscENvbnRlbnRWaWV3KTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBjb25kaXRpb25zIGZyb20gZmlsdGVyIGJhclxuXHRcdC8vIHRoaXMgaXMgbGF0ZXIgdXNlZCBiZWZvcmUgbmF2aWdhdGlvbiB0byBnZXQgY29uZGl0aW9ucyBhcHBsaWVkIG9uIHRoZSBmaWx0ZXIgYmFyXG5cdFx0dGhpcy5maWx0ZXJCYXJDb25kaXRpb25zID0ge307XG5cblx0XHQvLyBBcyBBcHBTdGF0ZUhhbmRsZXIuYXBwbHlBcHBTdGF0ZSB0cmlnZ2VycyBhIG5hdmlnYXRpb24gd2Ugd2FudCB0byBtYWtlIHN1cmUgaXQgd2lsbFxuXHRcdC8vIGhhcHBlbiBhZnRlciB0aGUgcm91dGVNYXRjaCBldmVudCBoYXMgYmVlbiBwcm9jZXNzZWQgKG90aGVyd2lzZSB0aGUgcm91dGVyIGdldHMgYnJva2VuKVxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblxuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHR0aGlzLl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMoKTtcblx0XHR9XG5cblx0XHQvLyBDb25maWd1cmUgdGhlIGluaXRpYWwgbG9hZCBzZXR0aW5nc1xuXHRcdHRoaXMuX3NldEluaXRMb2FkKCk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0ZGVsZXRlIHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucztcblx0XHRkZWxldGUgdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sO1xuXHRcdGlmICh0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5leHRlbnNpb25BUEk7XG5cdH1cblxuXHRfb25BZnRlckJpbmRpbmcoKSB7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIik7XG5cdFx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdGNvbnN0IG9UYWJsZUJpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIHRoZXJlIGlzIGFuIGlzc3VlIGlmIHdlIHVzZSBhIHRpbWVvdXQgd2l0aCBhIGtlcHQgYWxpdmUgY29udGV4dCB1c2VkIG9uIGFub3RoZXIgcGFnZVxuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMuc1VwZGF0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2ludmFsaWRhdGVNdWx0aXBsZU1vZGVDb250ZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0Q291bnRzT3V0RGF0ZWQoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVDb3VudHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zVXBkYXRlVGltZXI7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgdXBvbiB0YWJsZSBkYXRhIHVwZGF0ZS5cblx0XHRcdFx0XHRjb25zdCBmblVwZGF0ZVRhYmxlQWN0aW9ucyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZVByb2Nlc3NlZCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VSZWFkeS53YWl0Rm9yKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0KCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IHJlc3BvbnNlO1xuXHRcdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJUX1RBQkxFX0FORF9DSEFSVF9OT19EQVRBX1RFWFRcIixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdG9Db250cm9sLnNldE5vRGF0YVRleHQoc1RleHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gRW5hYmxpbmcgbWFuZGF0b3J5IGZpbHRlciBmaWVsZHMgbWVzc2FnZSBkaWFsb2cgYW5kIGZvY3VzaW5nIG9uIHRoZW1cblx0XHRpZiAobVBhcmFtZXRlcnMuZm9yY2VGb2N1cykge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblxuXHRcdFx0aWYgKG9GaWx0ZXJCYXIgJiYgIW9GaWx0ZXJCYXIuZ2V0U2hvd01lc3NhZ2VzKCkpIHtcblx0XHRcdFx0b0ZpbHRlckJhci5zZXRTaG93TWVzc2FnZXModHJ1ZSk7XG5cdFx0XHRcdChvRmlsdGVyQmFyIGFzIGFueSkuc2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGhhbmRsZXIgb24gYmFjayBuYXZpZ2F0aW9uIHRoYXQgZGlzcGxheXMgRHJhZnQgY29uZmlybWF0aW9uXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgb2YgYSBsaXN0IHJlcG9ydCB2aWV3IG5lZWRzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogVGhpcyBoYXBwZW5zIGVpdGhlciB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIG9uIHRoZSBGaWx0ZXJCYXIgYW5kIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkLFxuXHQgKiBvciB3aGVuIGEgdGFiIHdpdGggY3VzdG9tIGNvbnRlbnQgaXMgc2VsZWN0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgTWFwIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBjb25kaXRpb25zIG9mIHRoZSBGaWx0ZXJCYXIsIHRoZSBjdXJyZW50VGFiSURcblx0ICogYW5kIHRoZSB2aWV3IHJlZnJlc2ggY2F1c2UgKHRhYkNoYW5nZWQgb3Igc2VhcmNoKS5cblx0ICogVGhlIG1hcCBsb29rcyBsaWtlIHRoaXM6XG5cdCAqIDxjb2RlPjxwcmU+XG5cdCAqIFx0e1xuXHQgKiBcdFx0ZmlsdGVyQ29uZGl0aW9uczoge1xuXHQgKiBcdFx0XHRDb3VudHJ5OiBbXG5cdCAqIFx0XHRcdFx0e1xuXHQgKiBcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHQgKlx0XHRcdFx0XHR2YWxpZGF0ZWQ6IFwiTm90VmFsaWRhdGVkXCJcblx0ICpcdFx0XHRcdFx0dmFsdWVzOiBbXCJHZXJtYW55XCIsIC4uLl1cblx0ICogXHRcdFx0XHR9LFxuXHQgKiBcdFx0XHRcdC4uLlxuXHQgKiBcdFx0XHRdXG5cdCAqIFx0XHRcdC4uLlxuXHQgKiBcdFx0fSxcblx0ICpcdFx0Y3VycmVudFRhYklkOiBcImZlOjpDdXN0b21UYWI6OnRhYjFcIixcblx0ICpcdFx0cmVmcmVzaENhdXNlOiBcInRhYkNoYW5nZWRcIiB8IFwic2VhcmNoXCJcblx0ICpcdH1cblx0ICogPC9wcmU+PC9jb2RlPlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25WaWV3TmVlZHNSZWZyZXNoKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBmaWx0ZXIgb3Igc2VhcmNoIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIEZpbHRlckJhcixcblx0ICogYnV0IGhhcyBub3QgYmVlbiB2YWxpZGF0ZWQgeWV0IGJ5IHRoZSBlbmQgdXNlciAod2l0aCB0aGUgJ0dvJyBvciAnU2VhcmNoJyBidXR0b24pLlxuXHQgKiBUeXBpY2FsbHksIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHRhYiBpcyBncmV5ZWQgb3V0IHVudGlsIHRoZSBmaWx0ZXJzIGFyZSB2YWxpZGF0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGVuZGluZ0ZpbHRlcnMoKSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHRnZXRDdXJyZW50RW50aXR5U2V0KCkge1xuXHRcdGlmICghdGhpcy5fc0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSAodGhpcy5faXNNdWx0aU1vZGUoKSAmJiB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpKSB8fCB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0dGhpcy5fc0VudGl0eVNldCA9IG9EaXNwbGF5ZWRDb250cm9sPy5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIikuc2xpY2UoMSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zRW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYXRlcyB0aGUgdXBkYXRlIG9mIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JJQk4gYnV0dG9ucy5cblx0ICpcblx0ICogQHBhcmFtIGFUYWJsZXMgQXJyYXkgb2YgdGFibGVzIGluIHRoZSBsaXN0IHJlcG9ydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzOiBhbnkpIHtcblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzKTtcblx0XHR9KTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHNjcm9sbHMgdG8gYSBzcGVjaWZpYyByb3cgb24gYWxsIHRoZSBhdmFpbGFibGUgdGFibGVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIjX3Njcm9sbFRhYmxlc1RvUm93XG5cdCAqIEBwYXJhbSBzUm93UGF0aCBUaGUgcGF0aCBvZiB0aGUgdGFibGUgcm93IGNvbnRleHQgdG8gYmUgc2Nyb2xsZWQgdG9cblx0ICovXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKSB7XG5cdFx0dGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0VGFibGVTY3JvbGxlci5zY3JvbGxUYWJsZVRvUm93KG9UYWJsZSwgc1Jvd1BhdGgpO1xuXHRcdH0pO1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9UaXRsZUluZm8gPSB7IHRpdGxlOiBcIlwiLCBzdWJ0aXRsZTogXCJcIiwgaW50ZW50OiBcIlwiLCBpY29uOiBcIlwiIH07XG5cdFx0b1RpdGxlSW5mby50aXRsZSA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKCkuTGlzdFJlcG9ydFRpdGxlO1xuXHRcdG9UaXRsZUluZm8uc3VidGl0bGUgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YSgpLkxpc3RSZXBvcnRTdWJ0aXRsZTtcblx0XHRyZXR1cm4gb1RpdGxlSW5mbztcblx0fVxuXG5cdF9nZXRQYWdlT3JGaWx0ZXJCYXJWYXJpYW50TWFuYWdlbWVudCgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0dGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpQYWdlVmFyaWFudE1hbmFnZW1lbnRcIikgfHwgdGhpcy5nZXRWaWV3KCkuYnlJZChgJHt0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKX06OlZhcmlhbnRNYW5hZ2VtZW50YClcblx0XHQpO1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkpIGFzIEZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHQvLyBJZiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGlzIHBhcnQgb2YgdGhlIERPTSB0cmVlLCB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2cgaXMgb3Blbixcblx0XHQvLyBhbmQgd2UgcmV0dXJuIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgYXMgYW4gYWN0aXZlIGNvbnRyb2wgKHZpc2libGUgZm9yIHRoZSB1c2VyKVxuXHRcdGNvbnN0IGFkYXB0YXRpb25GaWx0ZXJCYXIgPSAodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueSkuZ2V0SW5idWlsdEZpbHRlcigpO1xuXHRcdHJldHVybiBhZGFwdGF0aW9uRmlsdGVyQmFyPy5nZXRQYXJlbnQoKSA/IGFkYXB0YXRpb25GaWx0ZXJCYXIgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0U2VnbWVudGVkQnV0dG9uKHNDb250cm9sOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRTZWdtZW50ZWRCdXR0b25JZChzQ29udHJvbCkpO1xuXHR9XG5cblx0X2dldFNlZ21lbnRlZEJ1dHRvbklkKHNDb250cm9sOiBhbnkpIHtcblx0XHRpZiAoc0NvbnRyb2wgPT09IFwiQ2hhcnRcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldENoYXJ0KCkuZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0VGFibGUoKT8uZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwiZmlsdGVyQmFySWRcIik7XG5cdH1cblxuXHRfZ2V0Q2hhcnRDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwic2luZ2xlQ2hhcnRJZFwiKTtcblx0fVxuXG5cdGdldENoYXJ0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRDaGFydENvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwidmlzdWFsRmlsdGVyQmFySWRcIik7XG5cdH1cblxuXHRfZ2V0TXVsdGlNb2RlQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpUYWJNdWx0aXBsZU1vZGVcIikgYXMgSWNvblRhYkJhcjtcblx0fVxuXG5cdF9nZXRUYWJsZUNvbnRyb2xJZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJzaW5nbGVUYWJsZUlkXCIpO1xuXHR9XG5cblx0X2dldEN1cnJlbnRDb250cm9sKCk6IENvbnRyb2wge1xuXHRcdGlmICghdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sKSB7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlVGFiID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0dGhpcy5fb0xpc3RSZXBvcnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcblx0XHRcdFx0b011bHRpTW9kZVRhYi5nZXRTZWxlY3RlZEtleSgpIHx8IChvTXVsdGlNb2RlVGFiLmdldEl0ZW1zKClbMF0gYXMgYW55KS5nZXRLZXkoKVxuXHRcdFx0KSBhcyBDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sO1xuXHR9XG5cblx0X2dldFRhYmxlKCk6IFRhYmxlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgPyAob0NvbnRyb2wgYXMgVGFibGUpIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRUYWJsZUNvbnRyb2xJZCgpKSBhcyBUYWJsZTtcblx0fVxuXG5cdF9nZXRDaGFydCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRDaGFydENvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRUYWJsZUJpbmRpbmcoc1RhYmxlSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvVGFibGVDb250cm9sID0gc1RhYmxlSWQgPyB0aGlzLmdldFZpZXcoKS5ieUlkKHNUYWJsZUlkKSA6IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0cmV0dXJuIG9UYWJsZUNvbnRyb2wgJiYgKG9UYWJsZUNvbnRyb2wgYXMgYW55KS5fZ2V0Um93QmluZGluZygpO1xuXHR9XG5cblx0X2dldENvbnRyb2xzKHNLZXk/OiBhbnkpIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3QgYUNvbnRyb2xzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3Qgb1RhYk11bHRpTW9kZSA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdG9UYWJNdWx0aU1vZGUuZ2V0SXRlbXMoKS5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChvQ29udHJvbCAmJiBzS2V5KSB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoYGZlOjoke3NLZXl9YCkgPiAtMSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUNvbnRyb2xzO1xuXHRcdH0gZWxzZSBpZiAoc0tleSA9PT0gXCJDaGFydFwiKSB7XG5cdFx0XHRjb25zdCBvQ2hhcnQgPSB0aGlzLl9nZXRDaGFydCgpO1xuXHRcdFx0cmV0dXJuIG9DaGFydCA/IFtvQ2hhcnRdIDogW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRyZXR1cm4gb1RhYmxlID8gW29UYWJsZV0gOiBbXTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0RGVmYXVsdFBhdGgoKSB7XG5cdFx0Y29uc3QgZGVmYXVsdFBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImRlZmF1bHRQYXRoXCIpO1xuXHRcdHN3aXRjaCAoZGVmYXVsdFBhdGgpIHtcblx0XHRcdGNhc2UgXCJwcmltYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0Y2FzZSBcInNlY29uZGFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTtcblx0XHRcdGNhc2UgXCJib3RoXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB3aXRoIE11bHRpcGxlIFRhYmxlIG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNNdWx0aU1vZGVcblx0ICogQHJldHVybnMgSXMgTXVsdGlwbGUgVGFibGUgbW9kZSBzZXQ/XG5cdCAqL1xuXHRfaXNNdWx0aU1vZGUoKSB7XG5cdFx0aWYgKCF0aGlzLl9vTGlzdFJlcG9ydENvbnRyb2wpIHtcblx0XHRcdHRoaXMuX2JNdWx0aU1vZGUgPSAhIXRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2JNdWx0aU1vZGU7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHRvIGxvYWQgZGF0YSBhdCBzdGFydCB1cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc0luaXRMb2FkRGlzYWJsZWRcblx0ICogQHJldHVybnMgSXMgSW5pdExvYWQgZW5hYmxlZD9cblx0ICovXG5cdF9pc0luaXRMb2FkRW5hYmxlZCgpIHtcblx0XHRjb25zdCBpbml0TG9hZE1vZGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmluaXRpYWxMb2FkO1xuXHRcdHJldHVybiBpbml0TG9hZE1vZGUgPT09IEluaXRpYWxMb2FkTW9kZS5FbmFibGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB3aXRoIE11bHRpcGxlIEVudGl0eVNldHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNNdWx0aUVudGl0eVNldHNcblx0ICogQHJldHVybnMgSXMgTXVsdGlwbGUgRW50aXR5U2V0cyBjb25maWd1cmF0aW9uP1xuXHQgKi9cblx0X2lzTXVsdGlFbnRpdHlTZXRzKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImlzTXVsdGlFbnRpdHlTZXRzXCIpID09PSBcInRydWVcIjtcblx0fVxuXG5cdF9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImhhc011bHRpVmlzdWFsaXphdGlvbnNcIikgPT09IFwidHJ1ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzdXNwZW5kIHNlYXJjaCBvbiB0aGUgZmlsdGVyIGJhci4gVGhlIGluaXRpYWwgbG9hZGluZyBvZiBkYXRhIGlzIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIEluaXRMb2FkIC0gRGlzYWJsZWQvQXV0by5cblx0ICogSXQgaXMgZW5hYmxlZCBsYXRlciB3aGVuIHRoZSB2aWV3IHN0YXRlIGlzIHNldCwgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byByZWFsaXplIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnMuXG5cdCAqL1xuXHRfZGlzYWJsZUluaXRMb2FkKCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHQvLyBjaGVjayBmb3IgZmlsdGVyIGJhciBoaWRkZW5cblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRmaWx0ZXJCYXIuc2V0U3VzcGVuZFNlbGVjdGlvbih0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCBieSBmbGV4IHRvIGRldGVybWluZSBpZiB0aGUgYXBwbHlBdXRvbWF0aWNhbGx5IHNldHRpbmcgb24gdGhlIHZhcmlhbnQgaXMgdmFsaWQuXG5cdCAqIENhbGxlZCBvbmx5IGZvciBTdGFuZGFyZCBWYXJpYW50IGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgZGlzcGxheSB0ZXh0IHNldCBmb3IgYXBwbHlBdXRvbWF0aWNhbGx5IChGRSBvbmx5IHNldHMgaXQgZm9yIEF1dG8pLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHRydWUgaWYgZGF0YSBzaG91bGQgYmUgbG9hZGVkIGF1dG9tYXRpY2FsbHksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KCkge1xuXHRcdC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHRha2UgY2FyZSBvZiBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgZm9yIGluaXRpYWwgbG9hZCBiYXNlZCBvblxuXHQgKiAtIG1hbmlmZXN0IHNldHRpbmcgaW5pdExvYWQgLSBFbmFibGVkL0Rpc2FibGVkL0F1dG9cblx0ICogLSB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdmFyaWFudFxuXHQgKiAtIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnNcblx0ICogV2UgZGlzYWJsZSB0aGUgZmlsdGVyIGJhciBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5hYmxlIGl0IHdoZW4gdmlldyBzdGF0ZSBpcyBzZXQuXG5cdCAqL1xuXHRfc2V0SW5pdExvYWQoKSB7XG5cdFx0Ly8gaWYgaW5pdExvYWQgaXMgRGlzYWJsZWQgb3IgQXV0bywgc3dpdGNoIG9mZiBmaWx0ZXIgYmFyIHNlYXJjaCB0ZW1wb3JhcmlseSBhdCBzdGFydFxuXHRcdGlmICghdGhpcy5faXNJbml0TG9hZEVuYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5fZGlzYWJsZUluaXRMb2FkKCk7XG5cdFx0fVxuXHRcdC8vIHNldCBob29rIGZvciBmbGV4IGZvciB3aGVuIHN0YW5kYXJkIHZhcmlhbnQgaXMgc2V0IChhdCBzdGFydCBvciBieSB1c2VyIGF0IHJ1bnRpbWUpXG5cdFx0Ly8gcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIHVzZXIgc2V0dGluZyAnYXBwbHkgYXV0b21hdGljYWxseScgYmVoYXZpb3VyIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzXG5cdFx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQ6IGFueSA9IHRoaXMuX2dldFBhZ2VPckZpbHRlckJhclZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHR2YXJpYW50TWFuYWdlbWVudC5yZWdpc3RlckFwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KHRoaXMuX2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50LmJpbmQodGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdF9zZXRTaGFyZU1vZGVsKCkge1xuXHRcdC8vIFRPRE86IGRlYWN0aXZhdGVkIGZvciBub3cgLSBjdXJyZW50bHkgdGhlcmUgaXMgbm8gX3RlbXBsUHJpdiBhbnltb3JlLCB0byBiZSBkaXNjdXNzZWRcblx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IGNhbGxlZCBhbnltb3JlIGZyb20gdGhlIGluaXQgbWV0aG9kXG5cblx0XHRjb25zdCBmbkdldFVzZXIgPSBPYmplY3RQYXRoLmdldChcInNhcC51c2hlbGwuQ29udGFpbmVyLmdldFVzZXJcIik7XG5cdFx0Ly92YXIgb01hbmlmZXN0ID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC51aVwiKTtcblx0XHQvL3ZhciBzQm9va21hcmtJY29uID0gKG9NYW5pZmVzdCAmJiBvTWFuaWZlc3QuaWNvbnMgJiYgb01hbmlmZXN0Lmljb25zLmljb24pIHx8IFwiXCI7XG5cblx0XHQvL3NoYXJlTW9kZWw6IEhvbGRzIGFsbCB0aGUgc2hhcmluZyByZWxldmFudCBpbmZvcm1hdGlvbiBhbmQgaW5mbyB1c2VkIGluIFhNTCB2aWV3XG5cdFx0Y29uc3Qgb1NoYXJlSW5mbyA9IHtcblx0XHRcdGJvb2ttYXJrVGl0bGU6IGRvY3VtZW50LnRpdGxlLCAvL1RvIG5hbWUgdGhlIGJvb2ttYXJrIGFjY29yZGluZyB0byB0aGUgYXBwIHRpdGxlLlxuXHRcdFx0Ym9va21hcmtDdXN0b21Vcmw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSBoYXNoZXIuZ2V0SGFzaCgpO1xuXHRcdFx0XHRyZXR1cm4gc0hhc2ggPyBgIyR7c0hhc2h9YCA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0fSxcblx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdFRvIGJlIGFjdGl2YXRlZCBvbmNlIHRoZSBGTFAgc2hvd3MgdGhlIGNvdW50IC0gc2VlIGNvbW1lbnQgYWJvdmVcblx0XHRcdFx0XHRcdFx0Ym9va21hcmtTZXJ2aWNlVXJsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHQvL3ZhciBvVGFibGUgPSBvVGFibGUuZ2V0SW5uZXJUYWJsZSgpOyBvVGFibGUgaXMgYWxyZWFkeSB0aGUgc2FwLmZlIHRhYmxlIChidXQgbm90IHRoZSBpbm5lciBvbmUpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHVzZSB0YWJsZS5nZXRMaXN0QmluZGluZ0luZm8gaW5zdGVhZCBvZiB0aGUgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdHZhciBvQmluZGluZyA9IG9UYWJsZS5nZXRCaW5kaW5nKFwicm93c1wiKSB8fCBvVGFibGUuZ2V0QmluZGluZyhcIml0ZW1zXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZyA/IGZuR2V0RG93bmxvYWRVcmwob0JpbmRpbmcpIDogXCJcIjtcblx0XHRcdFx0XHRcdFx0fSwqL1xuXHRcdFx0aXNTaGFyZUluSmFtQWN0aXZlOiAhIWZuR2V0VXNlciAmJiBmbkdldFVzZXIoKS5pc0phbUFjdGl2ZSgpXG5cdFx0fTtcblxuXHRcdGNvbnN0IG9UZW1wbGF0ZVByaXZhdGVNb2RlbCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRNb2RlbChcIl90ZW1wbFByaXZcIikgYXMgSlNPTk1vZGVsO1xuXHRcdG9UZW1wbGF0ZVByaXZhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi9saXN0UmVwb3J0L3NoYXJlXCIsIG9TaGFyZUluZm8pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGRlbiB0YWJsZXMgbXVzdCBiZSBtYXJrZWQgYXMgaGlkZGVuIHRvIGF2b2lkIHNlbmRpbmdcblx0ICogcmVxdWVzdHMgd2hlbiBGaWx0ZXJCYXIgaXMgY2hhbmdlZCBvciBMUiBpcyBpbml0aWFsaXplZFxuXHQgKiBCZXN0IHdvcmtmbG93IHdvdWxkIGJlIHRvIHN1c3BlbmQgdGFibGUgYmluZGluZyBidXRcblx0ICogaWYgdGhlIHVzZXIgc3dpdGNoIHF1aWNrbHkgYmV0d2VlbiB0YWJzIHRoZSBiYXRjaCByZXNwb25zZSBvZiBwcmV2aW91c1xuXHQgKiBpcyByZWNlaXZlZCB3aGVuIHByZXZpb3VzIHRhYiBpcyBhbHJlYWR5IGRpc2FibGVkIChiaW5kaW5nIGlzIHN1c3BlbmRlZCkgYW5kXG5cdCAqIGdlbmVyYXRlcyBlcnJvci5cblx0ICogQSB0ZW1wb3Jhcnkgc29sdXRpb24gKGlmIHdlIGZpbmQgYmV0dGVyIHdvcmtmbG93KSBpcyB0byBzZXQgYSBjdXN0b21EYXRhIGFuZCBkb24ndCB0cmlnZ2VyXG5cdCAqIHJlYmluZFRhYmxlIGlmIHRoaXMgY3VzdG9tRGF0YSBpcyBzZXQgdG8gdHJ1ZS5cblx0ICovXG5cdF91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMoKSB7XG5cdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpICYmIG9EaXNwbGF5ZWRDb250cm9sKSB7XG5cdFx0XHRjb25zdCBzRGlzcGxheUNvbnRyb2xJZCA9IG9EaXNwbGF5ZWRDb250cm9sLmdldElkKCk7XG5cdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdFx0YUNvbnRyb2xzLmZvckVhY2goZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sLmdldElkKCk7XG5cdFx0XHRcdG9Db250cm9sLmRhdGEoXCJjb250cm9sSGlkZGVuXCIsIHNDb250cm9sSWQgIT09IHNEaXNwbGF5Q29udHJvbElkKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBsb2NhbCBVSSBtb2RlbCBvZiB0aGUgcGFnZSB3aXRoIHRoZSBmaWVsZHMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gdGhlIGZpbHRlciBiYXIgKHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIG11bHRpcGxlIHRhYmxlIHNjZW5hcmlvKS5cblx0ICpcblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBUaGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHQgKiBAcGFyYW0gb0ZpbHRlckJhciBNREMgZmlsdGVyIGJhclxuXHQgKi9cblx0X3VwZGF0ZU11bHRpVGFiTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyOiBGaWx0ZXJCYXIpIHtcblx0XHRjb25zdCBtQ2FjaGU6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGlnbm9yZWRGaWVsZHM6IGFueSA9IHt9LFxuXHRcdFx0aWdub3JlZEZpZWxkc1RpdGxlOiBhbnkgPSB7fSxcblx0XHRcdGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpLFxuXHRcdFx0YUNoYXJ0cyA9IHRoaXMuX2dldENvbnRyb2xzKFwiQ2hhcnRcIik7XG5cdFx0YVRhYmxlcy5mb3JFYWNoKChvVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgc1RhYmxlRW50aXR5UGF0aCA9IG9UYWJsZS5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNUYWJsZUVudGl0eVNldCA9IHNUYWJsZUVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNUYWJJZCA9IG9UYWJsZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRLZXkoKSxcblx0XHRcdFx0c1RhYlRpdGxlID0gb1RhYmxlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFRleHQoKSxcblx0XHRcdFx0c0NhY2hlS2V5ID0gc1RhYmxlRW50aXR5U2V0ICsgKG9UYWJsZS5kYXRhKFwiZW5hYmxlQW5hbHl0aWNzXCIpID09PSBcInRydWVcIiA/IFwiQW5hbHl0aWNhbFwiIDogXCJSZWd1bGFyXCIpO1xuXHRcdFx0aWYgKCFtQ2FjaGVbc0NhY2hlS2V5XSkge1xuXHRcdFx0XHRtQ2FjaGVbc0NhY2hlS2V5XSA9IEZpbHRlclV0aWxzLmdldE5vdEFwcGxpY2FibGVGaWx0ZXJzKG9GaWx0ZXJCYXIsIG9UYWJsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZ25vcmVkRmllbGRzW3NUYWJJZF0gPSBtQ2FjaGVbc0NhY2hlS2V5XTtcblx0XHRcdGlnbm9yZWRGaWVsZHNUaXRsZVtzVGFiSWRdID0gdGhpcy5mb3JtYXR0ZXJzLnNldFRhYk1lc3NhZ2VTdHJpcC5jYWxsKHRoaXMsIG1DYWNoZVtzQ2FjaGVLZXldLCBzVGFiVGl0bGUsIFwiZmFsc2VcIiwge30pO1xuXHRcdH0pO1xuXHRcdGFDaGFydHMuZm9yRWFjaCgob0NoYXJ0OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHNDaGFydEVudGl0eVBhdGggPSBvQ2hhcnQuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpLFxuXHRcdFx0XHRzQ2hhcnRFbnRpdHlTZXQgPSBzQ2hhcnRFbnRpdHlQYXRoLnNsaWNlKDEpLFxuXHRcdFx0XHRzVGFiSWQgPSBvQ2hhcnQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0S2V5KCksXG5cdFx0XHRcdHNUYWJUaXRsZSA9IG9DaGFydC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRUZXh0KCksXG5cdFx0XHRcdHNDYWNoZUtleSA9IGAke3NDaGFydEVudGl0eVNldH1DaGFydGA7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc1RhYklkXSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdFx0aWdub3JlZEZpZWxkc1RpdGxlW3NUYWJJZF0gPSB0aGlzLmZvcm1hdHRlcnMuc2V0VGFiTWVzc2FnZVN0cmlwLmNhbGwodGhpcywgbUNhY2hlW3NDYWNoZUtleV0sIHNUYWJUaXRsZSwgXCJmYWxzZVwiLCB7fSk7XG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidGFicy9pZ25vcmVkRmllbGRzXCIsIGlnbm9yZWRGaWVsZHMpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInRhYnMvaWdub3JlZEZpZWxkc1RpdGxlXCIsIGlnbm9yZWRGaWVsZHNUaXRsZSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHVwZGF0ZSB0aGUgbG9jYWwgVUkgbW9kZWwgb2YgdGhlIHBhZ2Ugd2l0aCB0aGUgZmllbGRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBmaWx0ZXIgYmFyICh0aGlzIGlzIHNwZWNpZmljIHRvIHRoZSBBTFAgc2NlbmFyaW8pLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvRmlsdGVyQmFyIE1EQyBmaWx0ZXIgYmFyXG5cdCAqL1xuXHRfdXBkYXRlQUxQTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyOiBGaWx0ZXJCYXIpIHtcblx0XHRjb25zdCBtQ2FjaGU6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGlnbm9yZWRGaWVsZHM6IGFueSA9IHt9LFxuXHRcdFx0YVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIiksXG5cdFx0XHRhQ2hhcnRzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJDaGFydFwiKTtcblxuXHRcdGlmICghYVRhYmxlcy5sZW5ndGggfHwgIWFDaGFydHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5vdCBhIHRhYmxlIGFuZCBhIGNoYXJ0LCB3ZSdyZSBub3QgaW4gdGhlIEFMUCBjYXNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90aGluZyBmb3IgdGFibGVzLi4uXG5cdFx0YUNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0NoYXJ0RW50aXR5UGF0aCA9IG9DaGFydC5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNDaGFydEVudGl0eVNldCA9IHNDaGFydEVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNDYWNoZUtleSA9IGAke3NDaGFydEVudGl0eVNldH1DaGFydGA7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc0NhY2hlS2V5XSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNvbnRyb2xzL2lnbm9yZWRGaWVsZHNcIiwgaWdub3JlZEZpZWxkcyk7XG5cdH1cblxuXHRfdXBkYXRlTXVsdGlNb2RlU2VsZWN0ZWRDb250cm9sKCkge1xuXHRcdHRoaXMuX3NFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5fb0xpc3RSZXBvcnRDb250cm9sID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCk7XG5cdH1cblxuXHRfdXBkYXRlQ291bnRzKCkge1xuXHRcdHRoaXMuX3VwZGF0ZU11bHRpTW9kZUNvdW50cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSB0YWIgZnJvbSB0aGUgbGlzdCByZXBvcnQgaXMgYSBjdXN0b20gdGFiLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2lzQ3VzdG9tVGFiXG5cdCAqIEByZXR1cm5zIERldGVybWluZXMgaWYgdGhlIHRhYiBpcyBhIGN1c3RvbSB0YWIuXG5cdCAqL1xuXHRfaXNDdXN0b21UYWIoKSB7XG5cdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0cmV0dXJuIG9NdWx0aU1vZGVDb250cm9sICYmIG9NdWx0aU1vZGVDb250cm9sLmdldFNlbGVjdGVkS2V5KCkuaW5kZXhPZihcIjo6Q3VzdG9tVGFiOjpcIikgPiAtMTtcblx0fVxuXG5cdF9zZXRDb3VudHNPdXREYXRlZCgpIHtcblx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRpZiAob011bHRpTW9kZUNvbnRyb2wgJiYgb011bHRpTW9kZUNvbnRyb2wuZGF0YShcInNob3dDb3VudHNcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRjb25zdCBhSXRlbXMgPSBvTXVsdGlNb2RlQ29udHJvbC5nZXRJdGVtcygpO1xuXHRcdFx0YUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoXCJmZTo6Q2hhcnRcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0b0l0ZW0uZGF0YShcIm91dGRhdGVkQ291bnRzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0X2ludmFsaWRhdGVNdWx0aXBsZU1vZGVDb250ZW50KCkge1xuXHRcdGNvbnN0IGFDb250cm9scyA9IHRoaXMuX2dldENvbnRyb2xzKCk7XG5cdFx0Y29uc3Qgc0Rpc3BsYXllZENvbnRyb2xJZCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCkuZ2V0SWQoKTtcblx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0b0NvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiLCBvQ29udHJvbC5nZXRJZCgpICE9PSBzRGlzcGxheWVkQ29udHJvbElkKTtcblx0XHR9KTtcblx0fVxuXG5cdF91cGRhdGVNdWx0aU1vZGVDb3VudHMoKSB7XG5cdFx0bGV0IGFCaW5kaW5nUHJvbWlzZXMgPSBbXTtcblx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRpZiAob011bHRpTW9kZUNvbnRyb2wgJiYgb011bHRpTW9kZUNvbnRyb2wuZGF0YShcInNob3dDb3VudHNcIikgPT09IFwidHJ1ZVwiICYmICF0aGlzLl9pc0N1c3RvbVRhYigpKSB7XG5cdFx0XHRjb25zdCBvRGlzcGxheWVkQ29udHJvbCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBzRGlzcGxheWVkQ29udHJvbElkID0gb0Rpc3BsYXllZENvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFDb21wbGlhbnRUYWJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYUl0ZW1zID0gb011bHRpTW9kZUNvbnRyb2wuZ2V0SXRlbXMoKTtcblx0XHRcdGFJdGVtcy5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChvSXRlbS5nZXRQcm9wZXJ0eShcInZpc2libGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQob0l0ZW0uZ2V0S2V5KCkpO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9Db250cm9sICYmXG5cdFx0XHRcdFx0XHQhb0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSAmJlxuXHRcdFx0XHRcdFx0KG9JdGVtLmRhdGEoXCJvdXRkYXRlZENvdW50c1wiKSB8fCBvQ29udHJvbC5nZXRJZCgpID09PSBzRGlzcGxheWVkQ29udHJvbElkKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0YUNvbXBsaWFudFRhYnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2w6IG9Db250cm9sLFxuXHRcdFx0XHRcdFx0XHRpdGVtOiBvSXRlbVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0YUJpbmRpbmdQcm9taXNlcyA9IGFDb21wbGlhbnRUYWJzLm1hcCgobVRhYjogYW55KSA9PiB7XG5cdFx0XHRcdG1UYWIuaXRlbS5zZXRDb3VudChcIi4uLlwiKTtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSBtVGFiLmNvbnRyb2w7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJJbmZvcyA9IFRhYmxlVXRpbHMuZ2V0RmlsdGVyc0luZm9Gb3JTVihvQ29udHJvbCwgbVRhYi5pdGVtLmRhdGEoXCJzZWxlY3Rpb25WYXJpYW50XCIpKSBhcyBhbnk7XG5cdFx0XHRcdHJldHVybiBUYWJsZVV0aWxzLmdldExpc3RCaW5kaW5nRm9yQ291bnQob0NvbnRyb2wsIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksIHtcblx0XHRcdFx0XHRiYXRjaEdyb3VwSWQ6IG9Db250cm9sLmdldElkKCkgPT09IHNEaXNwbGF5ZWRDb250cm9sSWQgPyBvQ29udHJvbC5kYXRhKFwiYmF0Y2hHcm91cElkXCIpIDogXCIkYXV0b1wiLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxGaWx0ZXJzOiBvRmlsdGVySW5mb3MuZmlsdGVyc1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRQcm9taXNlLmFsbChhQmluZGluZ1Byb21pc2VzKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYUNvdW50czogYW55W10pIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGsgaW4gYUNvdW50cykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0l0ZW0gPSBhQ29tcGxpYW50VGFic1trXS5pdGVtO1xuXHRcdFx0XHRcdFx0b0l0ZW0uc2V0Q291bnQoVGFibGVVdGlscy5nZXRDb3VudEZvcm1hdHRlZChhQ291bnRzW2tdKSk7XG5cdFx0XHRcdFx0XHRvSXRlbS5kYXRhKFwib3V0ZGF0ZWRDb3VudHNcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIGljb24gdGFiIGJhclwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfaXNGaWx0ZXJCYXJIaWRkZW4oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaGlkZUZpbHRlckJhcjtcblx0fVxuXG5cdF9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk06IGFueSkge1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaW5pdGlhbExvYWQgPT09IEluaXRpYWxMb2FkTW9kZS5BdXRvICYmXG5cdFx0XHQoIW9WTSB8fCBvVk0uZ2V0U3RhbmRhcmRWYXJpYW50S2V5KCkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9Db25kaXRpb25zID0gb0ZpbHRlckJhci5nZXRDb25kaXRpb25zKCk7XG5cdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvQ29uZGl0aW9ucykge1xuXHRcdFx0XHRcdC8vIGlnbm9yZSBmaWx0ZXJzIHN0YXJ0aW5nIHdpdGggJCAoZS5nLiAkc2VhcmNoLCAkZWRpdFN0YXRlKVxuXHRcdFx0XHRcdGlmICghc0tleS5zdGFydHNXaXRoKFwiJFwiKSAmJiBBcnJheS5pc0FycmF5KG9Db25kaXRpb25zW3NLZXldKSAmJiBvQ29uZGl0aW9uc1tzS2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIGxvYWQgZGF0YSBhcyBwZXIgdXNlcidzIHNldHRpbmcgb2YgYXBwbHlBdXRvbWF0aWNhbGx5IG9uIHRoZSB2YXJpYW50XG5cdFx0XHRcdFx0XHRjb25zdCBzdGFuZGFyZFZhcmlhbnQ6IGFueSA9IG9WTS5nZXRWYXJpYW50cygpLmZpbmQoKHZhcmlhbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFyaWFudC5rZXkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RhbmRhcmRWYXJpYW50ICYmIHN0YW5kYXJkVmFyaWFudC5leGVjdXRlT25TZWxlY3Q7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF91cGRhdGVUYWJsZShvVGFibGU6IGFueSkge1xuXHRcdGlmICghb1RhYmxlLmlzVGFibGVCb3VuZCgpIHx8IHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcykge1xuXHRcdFx0b1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0X3VwZGF0ZUNoYXJ0KG9DaGFydDogYW55KSB7XG5cdFx0Y29uc3Qgb0lubmVyQ2hhcnQgPSBvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkuX2dldENoYXJ0KG9DaGFydCk7XG5cdFx0aWYgKCEob0lubmVyQ2hhcnQgJiYgb0lubmVyQ2hhcnQuaXNCb3VuZChcImRhdGFcIikpIHx8IHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcykge1xuXHRcdFx0b0NoYXJ0LmdldENvbnRyb2xEZWxlZ2F0ZSgpLnJlYmluZChvQ2hhcnQsIG9Jbm5lckNoYXJ0LmdldEJpbmRpbmdJbmZvKFwiZGF0YVwiKSk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHRvblRhYk11bHRpTW9kZUNoYW5nZSh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZU11bHRpTW9kZVNlbGVjdGVkQ29udHJvbCgpO1xuXHRcdFx0dGhpcy5fdXBkYXRlTXVsdGlDb250cm9sSGlkZGVuU3RhdHVzKCk7XG5cblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpIGFzIGFueTtcblx0XHRcdGNvbnN0IG9NdWx0aU1vZGVDb250cm9sID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0Y29uc3Qgc1NlbGVjdGVkS2V5ID0gb011bHRpTW9kZUNvbnRyb2wuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRcdGNvbnN0IHNQcmV2aW91c1NlbGVjdGVkS2V5ID0gb0V2ZW50ICYmIG9FdmVudC5tUGFyYW1ldGVycyA/IG9FdmVudC5tUGFyYW1ldGVycy5wcmV2aW91c0tleSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidGFicy9zZWxlY3RlZFwiLCBzU2VsZWN0ZWRLZXkpO1xuXHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdC8vIE5vIHBlbmRpbmcgZmlsdGVycyBpbnRvIEZpbHRlckJhclxuXHRcdFx0XHRpZiAob0ZpbHRlckJhciAmJiB0aGlzLl9pc0N1c3RvbVRhYigpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnMgPSBvRmlsdGVyQmFyLmdldEZpbHRlckNvbmRpdGlvbnMoKTtcblx0XHRcdFx0XHR0aGlzLm9uVmlld05lZWRzUmVmcmVzaCh7XG5cdFx0XHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zOiBvRmlsdGVyQ29uZGl0aW9ucyxcblx0XHRcdFx0XHRcdGN1cnJlbnRUYWJJZDogc1NlbGVjdGVkS2V5LFxuXHRcdFx0XHRcdFx0cmVmcmVzaENhdXNlOiBcInRhYkNoYW5nZWRcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdCFvRGlzcGxheWVkQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpICYmXG5cdFx0XHRcdFx0KCFvRGlzcGxheWVkQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkgfHwgLy8gZmlyc3QgdGltZSB0aGUgdGFiL3RhYmxlIGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiKSA9PT0gdHJ1ZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gU2VhcmNoIGhhcyBiZWVuIHRyaWdnZXJlZCBvbiBhIGRpZmZlcmVudCB0YWIge31cblx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5yZWJpbmQoKTtcblx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5kYXRhKFwib3V0ZGF0ZWRSb3dzXCIsIGZhbHNlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpICYmXG5cdFx0XHRcdFx0KCFvRGlzcGxheWVkQ29udHJvbC5nZXRDb250cm9sRGVsZWdhdGUoKS5fZ2V0Q2hhcnQob0Rpc3BsYXllZENvbnRyb2wpLmdldEJpbmRpbmcoXCJkYXRhXCIpIHx8IC8vIGZpcnN0IHRpbWUgdGhlIHRhYi9jaGFydCBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmRhdGEoXCJvdXRkYXRlZFJvd3NcIikgPT09IHRydWUpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IG9Jbm5lckNoYXJ0ID0gb0Rpc3BsYXllZENvbnRyb2wuZ2V0Q29udHJvbERlbGVnYXRlKCkuX2dldENoYXJ0KG9EaXNwbGF5ZWRDb250cm9sKTtcblx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5nZXRDb250cm9sRGVsZWdhdGUoKS5yZWJpbmQob0Rpc3BsYXllZENvbnRyb2wsIG9Jbm5lckNoYXJ0LmdldEJpbmRpbmdJbmZvKFwiZGF0YVwiKSk7XG5cdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG9FdmVudCAmJiBvRXZlbnQubVBhcmFtZXRlcnMgJiYgc1ByZXZpb3VzU2VsZWN0ZWRLZXkgIT09IG9FdmVudC5tUGFyYW1ldGVycy5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkuYWRkKHtcblx0XHRcdFx0XHRjaGFuZ2VzOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZVNwZWNpZmljRGF0YToge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZVR5cGU6IFwic2VsZWN0SWNvblRhYkJhckZpbHRlclwiLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGVkS2V5OiBzU2VsZWN0ZWRLZXksXG5cdFx0XHRcdFx0XHRcdFx0XHRwcmV2aW91c1NlbGVjdGVkS2V5OiBzUHJldmlvdXNTZWxlY3RlZEtleVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0b3JFbGVtZW50OiBvTXVsdGlNb2RlQ29udHJvbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdC8vIFBlbmRpbmcgZmlsdGVycyBpbnRvIEZpbHRlckJhciB0byBiZSB1c2VkIGZvciBjdXN0b20gdmlld3Ncblx0XHRcdFx0dGhpcy5vblBlbmRpbmdGaWx0ZXJzKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIG9GaWx0ZXJCYXIuZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCgpLmZpbHRlcnNUZXh0KTtcblx0XHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb25kaXRpb25zQmFzZWRcIikpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvVk0gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHQvLyBzZXRUaW1lb3V0IGNhdXNlIHRoZSB2YXJpYW50IG5lZWRzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGp1ZGdpbmcgdGhlIGF1dG8gc2VhcmNoIG9yIHVwZGF0aW5nIHRoZSBhcHAgc3RhdGVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0XHRcdCh0aGlzLmhhbmRsZXJzIGFzIGFueSkub25UYWJNdWx0aU1vZGVDaGFuZ2UuYXBwbHkodGhpcywgW29FdmVudF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLl9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk0pKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGFwcCBzdGF0ZSB3aWxsIGJlIHVwZGF0ZWQgdmlhIG9uU2VhcmNoIGhhbmRsZXJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpLnRyaWdnZXJTZWFyY2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDApO1xuXHRcdH0sXG5cdFx0b25WYXJpYW50U2F2ZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdC8vVE9ETzogU2hvdWxkIHJlbW92ZSB0aGlzIHNldFRpbWVPdXQgb25jZSBWYXJpYW50IE1hbmFnZW1lbnQgcHJvdmlkZXMgYW4gYXBpIHRvIGZldGNoIHRoZSBjdXJyZW50IHZhcmlhbnQga2V5IG9uIHNhdmUhISFcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9LCAxMDAwKTtcblx0XHR9LFxuXHRcdG9uU2VhcmNoKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBiSGlkZURyYWZ0ID0gRmlsdGVyVXRpbHMuZ2V0RWRpdFN0YXRlSXNIaWRlRHJhZnQob0ZpbHRlckJhci5nZXRDb25kaXRpb25zKCkpO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgZmFsc2UpO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGlkZURyYWZ0SW5mb1wiLCBiSGlkZURyYWZ0KTtcblx0XHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRcdGNvbnN0IG9NdWx0aU1vZGVDb250cm9sID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0XHR0aGlzLl9zZXRDb3VudHNPdXREYXRlZCgpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzQ3VzdG9tVGFiKCkpIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVNdWx0aVRhYk5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdFx0XHQvLyBUaGlzIHNob3VsZCBiZSBkb25lIG91dHNpZGUgdGhlIHNlYXJjaCBldmVudCBoYW5kbGVyIG9mIHRoZSBmaWx0ZXIgYmFyLlxuXHRcdFx0XHRcdC8vIFRoZSBzYW1lIGxvZ2ljIGlzIHJlcXVpcmVkIHdoZW4gZmlsdGVyIGJhciBpcyBoaWRkZW4gYW5kIG11bHRpcGxlIHRhYmxlcyBleGlzdCBvbiB0aGUgTFIuXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBjdXJyZW50bHkgZG9uZSBpbiBMaXN0UmVwb3J0L292ZXJyaWRlcy9WaWV3U3RhdGUuanMjb25BZnRlclN0YXRlQXBwbGllZCgpXG5cdFx0XHRcdFx0dGhpcy5faW52YWxpZGF0ZU11bHRpcGxlTW9kZUNvbnRlbnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvRmlsdGVyQ29uZGl0aW9ucyA9IG9GaWx0ZXJCYXIuZ2V0RmlsdGVyQ29uZGl0aW9ucygpO1xuXHRcdFx0XHRcdHRoaXMub25WaWV3TmVlZHNSZWZyZXNoKHtcblx0XHRcdFx0XHRcdGZpbHRlckNvbmRpdGlvbnM6IG9GaWx0ZXJDb25kaXRpb25zLFxuXHRcdFx0XHRcdFx0Y3VycmVudFRhYklkOiBvTXVsdGlNb2RlQ29udHJvbC5nZXRTZWxlY3RlZEtleSgpLFxuXHRcdFx0XHRcdFx0cmVmcmVzaENhdXNlOiBcInNlYXJjaFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWRjQ2hhcnQpIHtcblx0XHRcdFx0Ly8gZGlzYWJsZSBib3VuZCBhY3Rpb25zIFRPRE86IHRoaXMgY2xlYXJzIGV2ZXJ5dGhpbmcgZm9yIHRoZSBjaGFydD9cblx0XHRcdFx0KG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcIlwiLCB7fSk7XG5cblx0XHRcdFx0Y29uc3Qgb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9hbHBDb250ZW50Vmlld2ApO1xuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHN0b3JlIGZpbHRlciBiYXIgY29uZGl0aW9ucyB0byB1c2UgbGF0ZXIgd2hpbGUgbmF2aWdhdGlvblxuXHRcdFx0U3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvRmlsdGVyQmFyKVxuXHRcdFx0XHQudGhlbigob0V4dGVybmFsU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IG9FeHRlcm5hbFN0YXRlLmZpbHRlcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGV4dGVybmFsIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkubGl2ZU1vZGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN5c3RlbS5waG9uZSkge1xuXHRcdFx0XHRjb25zdCBvRHluYW1pY1BhZ2UgPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6Okxpc3RSZXBvcnRcIikgYXMgRHluYW1pY1BhZ2U7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdFx0c0NyZWF0ZVBhdGg6IHN0cmluZ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZW50KCksXG5cdFx0XHRcdG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCksXG5cdFx0XHRcdGFEYXRhID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImRhdGFcIiksXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoYURhdGEpIHtcblx0XHRcdFx0Ly8gdXBkYXRlIGFjdGlvbiBidXR0b25zIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudFxuXHRcdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdFx0XHQvLyB1cGRhdGUgc2VsZWN0aW9ucyBvbiBzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb25cblx0XHRcdFx0Q2hhcnRVdGlscy5zZXRDaGFydEZpbHRlcnMob01kY0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2FscENvbnRlbnRWaWV3YCk7XG5cdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1RhYmxlKSB7XG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5yZWJpbmQoKTtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvRXZlbnQubVBhcmFtZXRlcnMua2V5ID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA6IG51bGw7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuX2dldENoYXJ0KCk7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlID0ge1xuXHRcdFx0XHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9TZWdtZW50ZWRCdXR0b24uZ2V0SXRlbXMoKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpID09PSBzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0b0l0ZW0uZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnJlbW92ZUV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b24gPSAoXG5cdFx0XHRcdHNTZWxlY3RlZEtleSA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSA/IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIlRhYmxlXCIpIDogdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiQ2hhcnRcIilcblx0XHRcdCkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdFx0aWYgKG9TZWdtZW50ZWRCdXR0b24gIT09IG9FdmVudC5nZXRTb3VyY2UoKSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLmFkZEV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJrZXlcIikgPT09IFwiQ29tcGFjdFwiKSB7XG5cdFx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcInZpc3VhbEZpbHRlckJhcklkXCIpKSBhcyBDb250cm9sKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJ2aXN1YWxGaWx0ZXJCYXJJZFwiKSkgYXMgQ29udHJvbCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uU3RhdGVDaGFuZ2UodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uRHluYW1pY1BhZ2VUaXRsZVN0YXRlQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IGZpbHRlckJhcjogYW55ID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKGZpbHRlckJhciAmJiBmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkpIHtcblx0XHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpc0V4cGFuZGVkXCIpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLmdldFNlZ21lbnRlZEJ1dHRvbigpLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLmdldFNlZ21lbnRlZEJ1dHRvbigpLnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRmb3JtYXR0ZXJzID0ge1xuXHRcdC8qKlxuXHRcdCAqIE1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UgdGV4dCBmb3IgdGhlIG11bHRpcGxlIGVudGl0eSBzZXRzIHdoZW4gZmllbGRzIGluIHRoZSBGaWx0ZXJCYXIgbmVlZCB0byBiZSBpZ25vcmVkLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHRoaXNcblx0XHQgKiBAcGFyYW0gYUlnbm9yZWRGaWVsZHMgQXJyYXkgb2YgaWdub3JlZCBmaWVsZHMgaW4gdGhlIEZpbHRlckJhciBmb3IgdGhlIGN1cnJlbnQgdGFiIChtdWx0aXBsZSBlbnRpdHkgc2V0cylcblx0XHQgKiBAcGFyYW0gc1RhYlRpdGxlIFRhYiB0aXRsZVxuXHRcdCAqIEBwYXJhbSBiSXNDaGFydCBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgYSBjaGFydCBvciBub3Rcblx0XHQgKiBAcGFyYW0gb0FwcGx5U3VwcG9ydGVkIEFwcGx5U3VwcG9ydGVkIGZvciB0aGUgY29udHJvbFxuXHRcdCAqIEByZXR1cm5zIE1lc3NhZ2UgdGV4dFxuXHRcdCAqL1xuXHRcdHNldFRhYk1lc3NhZ2VTdHJpcCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgYUlnbm9yZWRGaWVsZHM6IGFueVtdLCBzVGFiVGl0bGU6IHN0cmluZywgYklzQ2hhcnQ/OiBhbnksIG9BcHBseVN1cHBvcnRlZD86IGFueSkge1xuXHRcdFx0bGV0IHNUZXh0ID0gXCJcIjtcblx0XHRcdGJJc0NoYXJ0ID0gYklzQ2hhcnQgPT09IFwidHJ1ZVwiIHx8IGJJc0NoYXJ0ID09PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyICYmIEFycmF5LmlzQXJyYXkoYUlnbm9yZWRGaWVsZHMpICYmIGFJZ25vcmVkRmllbGRzLmxlbmd0aCA+IDAgJiYgKHNUYWJUaXRsZSB8fCBiSXNDaGFydCkpIHtcblx0XHRcdFx0Y29uc3Qgc0ZpbHRlckJhckVudGl0eVBhdGggPSBvRmlsdGVyQmFyLmRhdGEoXCJlbnRpdHlUeXBlXCIpLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLnRlbXBsYXRlc1wiKSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRhSWdub3JlZExhYmVscyA9IGFJZ25vcmVkRmllbGRzLm1hcChmdW5jdGlvbiAoc1Byb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWFjcm9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLm1hY3Jvc1wiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRcdGlmIChzUHJvcGVydHkgPT09IFwiJHNlYXJjaFwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWFjcm9SZXNvdXJjZUJ1bmRsZSA/IG9NYWNyb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0ZJTFRFUkJBUl9TRUFSQ0hcIikgOiBcIlwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNQcm9wZXJ0eSA9PT0gXCIkZWRpdFN0YXRlXCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NYWNyb1Jlc291cmNlQnVuZGxlID8gb01hY3JvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fQ09NTU9OX0ZJTFRFUkJBUl9FRElUSU5HX1NUQVRVU1wiKSA6IFwiXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBzTGFiZWwgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRmlsdGVyQmFyRW50aXR5UGF0aCArIHNQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsYCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gRGVsZWdhdGVVdGlsLmdldExvY2FsaXplZFRleHQoc0xhYmVsLCBvRmlsdGVyQmFyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgYklzU2VhcmNoSWdub3JlZCA9ICFvQXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoO1xuXHRcdFx0XHRpZiAob1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0c1RleHQgPSBDb21tb25VdGlscy5nZXRNZXNzYWdlU3RyaXBUZXh0KFxuXHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRhSWdub3JlZExhYmVscyxcblx0XHRcdFx0XHRcdG9GaWx0ZXJCYXIsXG5cdFx0XHRcdFx0XHRiSXNDaGFydCxcblx0XHRcdFx0XHRcdGJJc1NlYXJjaElnbm9yZWQsXG5cdFx0XHRcdFx0XHRzVGFiVGl0bGUsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHREZWxlZ2F0ZVV0aWwuZ2V0TG9jYWxpemVkVGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzVGV4dDtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RSZXBvcnRDb250cm9sbGVyO1xuIl19
886
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiQ29yZUxpYnJhcnkiLCJJbml0aWFsTG9hZE1vZGUiLCJMaXN0UmVwb3J0Q29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJJbnRlcm5hbFJvdXRpbmciLCJvdmVycmlkZSIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfb25BZnRlckJpbmRpbmciLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldEVudGl0eVNldCIsImJhc2UiLCJnZXRDdXJyZW50RW50aXR5U2V0IiwiU2lkZUVmZmVjdHMiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIlNoYXJlIiwiU2hhcmVPdmVycmlkZXMiLCJFZGl0RmxvdyIsIkVkaXRGbG93T3ZlcnJpZGVzIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiS1BJTWFuYWdlbWVudCIsIlBsYWNlaG9sZGVyIiwiTWFzc0VkaXQiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25GaWx0ZXJzQ2hhbmdlZCIsIm9FdmVudCIsIm9GaWx0ZXJCYXIiLCJfZ2V0RmlsdGVyQmFyQ29udHJvbCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib25QZW5kaW5nRmlsdGVycyIsInNldFByb3BlcnR5IiwiZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCIsImZpbHRlcnNUZXh0IiwiZ2V0UGFyYW1ldGVyIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvVk0iLCJnZXRTb3VyY2UiLCJjdXJyZW50VmFyaWFudEtleSIsIm9NdWx0aU1vZGVDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJpbnZhbGlkYXRlQ29udGVudCIsInNldEZyZWV6ZUNvbnRlbnQiLCJzZXRUaW1lb3V0IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwidHJpZ2dlclNlYXJjaCIsIl9nZXRBcHBseUF1dG9tYXRpY2FsbHlPblZhcmlhbnQiLCJnZXRFeHRlbnNpb25BUEkiLCJ1cGRhdGVBcHBTdGF0ZSIsIm9uVmFyaWFudFNhdmVkIiwib25TZWFyY2giLCJvTWRjQ2hhcnQiLCJnZXRDaGFydENvbnRyb2wiLCJiSGlkZURyYWZ0IiwiRmlsdGVyVXRpbHMiLCJnZXRFZGl0U3RhdGVJc0hpZGVEcmFmdCIsImdldENvbmRpdGlvbnMiLCJfdXBkYXRlQUxQTm90QXBwbGljYWJsZUZpZWxkcyIsIm9QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzVGVtcGxhdGVDb250ZW50VmlldyIsImdldFByb3BlcnR5IiwiZ2V0UGF0aCIsIkNoYXJ0IiwiaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcyIsIlRhYmxlIiwiaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInRoZW4iLCJvRXh0ZXJuYWxTdGF0ZSIsImZpbHRlckJhckNvbmRpdGlvbnMiLCJmaWx0ZXIiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZ2V0Vmlld0RhdGEiLCJsaXZlTW9kZSIsInN5c3RlbSIsInBob25lIiwib0R5bmFtaWNQYWdlIiwiYnlJZCIsInNldEhlYWRlckV4cGFuZGVkIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib0NvbnRyb2xsZXIiLCJzT3V0Ym91bmRUYXJnZXQiLCJvQ29udGV4dCIsInNDcmVhdGVQYXRoIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkIiwiZ2V0Q29udGVudCIsIm9UYWJsZSIsIl9nZXRUYWJsZSIsImFEYXRhIiwiQ2hhcnRSdW50aW1lIiwiZm5VcGRhdGVDaGFydCIsIkNoYXJ0VXRpbHMiLCJzZXRDaGFydEZpbHRlcnMiLCJyZWJpbmQiLCJvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQiLCJzU2VsZWN0ZWRLZXkiLCJtUGFyYW1ldGVycyIsImtleSIsIm9DaGFydCIsIm9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJhSXRlbXMiLCJvU2VnbWVudGVkQnV0dG9uIiwiZ2V0SXRlbXMiLCJmb3JFYWNoIiwib0l0ZW0iLCJnZXRLZXkiLCJmb2N1cyIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJfZ2V0U2VnbWVudGVkQnV0dG9uIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl91cGRhdGVUYWJsZSIsIl91cGRhdGVDaGFydCIsIkh5YnJpZCIsIm9uRmlsdGVyc1NlZ21lbnRlZEJ1dHRvblByZXNzZWQiLCJpc0NvbXBhY3QiLCJzZXRWaXNpYmxlIiwiX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2wiLCJvblN0YXRlQ2hhbmdlIiwib25EeW5hbWljUGFnZVRpdGxlU3RhdGVDaGFuZ2VkIiwiZmlsdGVyQmFyIiwiZ2V0U2VnbWVudGVkQnV0dG9uIiwiZm9ybWF0dGVycyIsInNldEFMUENvbnRyb2xNZXNzYWdlU3RyaXAiLCJhSWdub3JlZEZpZWxkcyIsImJJc0NoYXJ0Iiwib0FwcGx5U3VwcG9ydGVkIiwic1RleHQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJhSWdub3JlZExhYmVscyIsIk1lc3NhZ2VTdHJpcCIsImdldExhYmVscyIsImRhdGEiLCJvUmVzb3VyY2VCdW5kbGUiLCJiSXNTZWFyY2hJZ25vcmVkIiwiZW5hYmxlU2VhcmNoIiwiZ2V0QUxQVGV4dCIsImdldFRleHQiLCJEZWxlZ2F0ZVV0aWwiLCJnZXRMb2NhbGl6ZWRUZXh0IiwiZXh0ZW5zaW9uQVBJIiwiRXh0ZW5zaW9uQVBJIiwib25Jbml0IiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJhcHBseSIsIl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zIiwiYWxwQ29udGVudFZpZXciLCJfZ2V0RGVmYXVsdFBhdGgiLCJkZXNrdG9wIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJ3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24iLCJfc2V0SW5pdExvYWQiLCJvbkV4aXQiLCJkZXN0cm95IiwiYVRhYmxlcyIsIl9nZXRDb250cm9scyIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJvVGFibGVCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsIkNvbW1vblV0aWxzIiwiX2lzRmNsRW5hYmxlZCIsInJlZnJlc2giLCJzVXBkYXRlVGltZXIiLCJmblVwZGF0ZVRhYmxlQWN0aW9ucyIsIl91cGRhdGVUYWJsZUFjdGlvbnMiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJhdHRhY2hEYXRhUmVjZWl2ZWQiLCJzZXRFZGl0U3RhdGVQcm9jZXNzZWQiLCJwYWdlUmVhZHkiLCJ3YWl0Rm9yIiwiZ2V0QXBwU3RhdGVIYW5kbGVyIiwiYXBwbHlBcHBTdGF0ZSIsIm9uQmVmb3JlUmVuZGVyaW5nIiwiZ2V0TW9kZWwiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsInJlc3BvbnNlIiwiYUNvbnRyb2xzIiwic0VudGl0eVNldCIsImVudGl0eVNldCIsImdldFRyYW5zbGF0ZWRUZXh0IiwidW5kZWZpbmVkIiwib0NvbnRyb2wiLCJzZXROb0RhdGFUZXh0Iiwib25QYWdlUmVhZHkiLCJmb3JjZUZvY3VzIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwic2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvblZpZXdOZWVkc1JlZnJlc2giLCJzbGljZSIsImFJQk5BY3Rpb25zIiwiZ2V0SUJOQWN0aW9ucyIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJKU09OIiwicGFyc2UiLCJDb21tb25IZWxwZXIiLCJwYXJzZUN1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvTWFuaWZlc3RFbnRyeSIsImdldE1hbmlmZXN0RW50cnkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiYXBwU3ViVGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2dldEZpbHRlckJhckNvbnRyb2xJZCIsIl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCIsImFkYXB0YXRpb25GaWx0ZXJCYXIiLCJnZXRJbmJ1aWx0RmlsdGVyIiwiZ2V0UGFyZW50Iiwic0NvbnRyb2wiLCJzU2VnbWVudGVkQnV0dG9uSWQiLCJfZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eSIsInNQYXRoIiwiY29udHJvbElkIiwiX2dldFBhZ2VNb2RlbCIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsInNWaXN1YWxGaWx0ZXJCYXJJZCIsIlN0YWJsZUlkSGVscGVyIiwiZ2VuZXJhdGUiLCJfZ2V0RmlsdGVyQmFyVmFyaWFudENvbnRyb2wiLCJfaXNNdWx0aU1vZGUiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJpc0EiLCJzS2V5Iiwib1RhYk11bHRpTW9kZSIsImluZGV4T2YiLCJwdXNoIiwiZGVmYXVsdFBhdGgiLCJMaXN0UmVwb3J0VGVtcGxhdGluZyIsImdldERlZmF1bHRQYXRoIiwiX2lzSW5pdExvYWRFbmFibGVkIiwiaW5pdExvYWRNb2RlIiwiaW5pdGlhbExvYWQiLCJFbmFibGVkIiwiX2Rpc2FibGVJbml0TG9hZCIsInNldFN1c3BlbmRTZWxlY3Rpb24iLCJfYXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQiLCJ2YXJpYW50TWFuYWdlbWVudElkIiwiZ2V0VmFyaWFudEJhY2tSZWZlcmVuY2UiLCJ2YXJpYW50TWFuYWdlbWVudCIsInJlZ2lzdGVyQXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQiLCJiaW5kIiwiX3NldFNoYXJlTW9kZWwiLCJmbkdldFVzZXIiLCJPYmplY3RQYXRoIiwiZ2V0Iiwib1NoYXJlSW5mbyIsImJvb2ttYXJrVGl0bGUiLCJkb2N1bWVudCIsImJvb2ttYXJrQ3VzdG9tVXJsIiwic0hhc2giLCJoYXNoZXIiLCJnZXRIYXNoIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiaXNTaGFyZUluSmFtQWN0aXZlIiwiaXNKYW1BY3RpdmUiLCJvVGVtcGxhdGVQcml2YXRlTW9kZWwiLCJnZXRPd25lckNvbXBvbmVudCIsIm1DYWNoZSIsImlnbm9yZWRGaWVsZHMiLCJhQ2hhcnRzIiwic0NoYXJ0RW50aXR5UGF0aCIsInNDaGFydEVudGl0eVNldCIsInNDYWNoZUtleSIsImdldE5vdEFwcGxpY2FibGVGaWx0ZXJzIiwiX2lzRmlsdGVyQmFySGlkZGVuIiwiaGlkZUZpbHRlckJhciIsIlZhcmlhbnRNYW5hZ2VtZW50IiwidmFyaWFudHMiLCJnZXRWYXJpYW50cyIsImN1cnJlbnRWYXJpYW50IiwiZmluZCIsInZhcmlhbnQiLCJleGVjdXRlT25TZWxlY3QiLCJBdXRvIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJvQ29uZGl0aW9ucyIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZFZhcmlhbnQiLCJpc1RhYmxlQm91bmQiLCJvSW5uZXJDaGFydCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImlzQm91bmQiLCJnZXRCaW5kaW5nSW5mbyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgdHlwZSBEeW5hbWljUGFnZSBmcm9tIFwic2FwL2YvRHluYW1pY1BhZ2VcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IEtQSU1hbmFnZW1lbnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0tQSU1hbmFnZW1lbnRcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7XG5cdGRlZmluZVVJNUNsYXNzLFxuXHRleHRlbnNpYmxlLFxuXHRmaW5hbEV4dGVuc2lvbixcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uLFxuXHR1c2luZ0V4dGVuc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTWVzc2FnZVN0cmlwIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0ICogYXMgU3RhYmxlSWRIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IE11bHRpcGxlTW9kZUNvbnRyb2wgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9jb250cm9scy9NdWx0aXBsZU1vZGVDb250cm9sXCI7XG5pbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgRWRpdEZsb3dPdmVycmlkZXMgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvUm9vdENvbnRhaW5lci9vdmVycmlkZXMvRWRpdEZsb3dcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFNlZ21lbnRlZEJ1dHRvbiBmcm9tIFwic2FwL20vU2VnbWVudGVkQnV0dG9uXCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvcmVzb3VyY2UvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IGhhc2hlciBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvaGFzaGVyXCI7XG5pbXBvcnQgdHlwZSB7IFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCAqIGFzIExpc3RSZXBvcnRUZW1wbGF0aW5nIGZyb20gXCIuL0xpc3RSZXBvcnRUZW1wbGF0aW5nXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IFNoYXJlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvVmlld1N0YXRlXCI7XG5cbmNvbnN0IFRlbXBsYXRlQ29udGVudFZpZXcgPSBDb3JlTGlicmFyeS5UZW1wbGF0ZUNvbnRlbnRWaWV3LFxuXHRJbml0aWFsTG9hZE1vZGUgPSBDb3JlTGlicmFyeS5Jbml0aWFsTG9hZE1vZGU7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlclwiKVxuY2xhc3MgTGlzdFJlcG9ydENvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoe1xuXHRcdFx0b25BZnRlckJpbmRpbmc6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbFJvdXRpbmcpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBMaXN0UmVwb3J0Q29udHJvbGxlcikuX29uQWZ0ZXJCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldEVudGl0eVNldDogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybiAodGhpcy5iYXNlIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5nZXRDdXJyZW50RW50aXR5U2V0KCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cdEB1c2luZ0V4dGVuc2lvbihTaWRlRWZmZWN0cylcblx0c2lkZUVmZmVjdHMhOiBTaWRlRWZmZWN0cztcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihTaGFyZS5vdmVycmlkZShTaGFyZU92ZXJyaWRlcykpXG5cdHNoYXJlITogU2hhcmU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEVkaXRGbG93Lm92ZXJyaWRlKEVkaXRGbG93T3ZlcnJpZGVzKSlcblx0ZWRpdEZsb3chOiBFZGl0RmxvdztcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oS1BJTWFuYWdlbWVudClcblx0a3BpTWFuYWdlbWVudCE6IEtQSU1hbmFnZW1lbnQ7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1hc3NFZGl0KVxuXHRtYXNzRWRpdCE6IE1hc3NFZGl0O1xuXHRwcml2YXRlIGV4dGVuc2lvbkFQST86IEV4dGVuc2lvbkFQSTtcblx0cHJpdmF0ZSBmaWx0ZXJCYXJDb25kaXRpb25zPzogYW55O1xuXHRwcml2YXRlIHNVcGRhdGVUaW1lcj86IGFueTtcblx0cHJpdmF0ZSBvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblx0cHJpdmF0ZSBoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBoYXNQZW5kaW5nVGFibGVDaGFuZ2VzPzogYm9vbGVhbjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKCk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uSW5pdC5hcHBseSh0aGlzKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYXBwbGllZEZpbHRlcnNcIiwgXCJcIik7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGlkZURyYWZ0SW5mb1wiLCBmYWxzZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidW9tXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3RvclwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JOdW1iZXJcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImN1cnJlbmN5XCIsIHt9KTtcblxuXHRcdGlmICh0aGlzLl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkpIHtcblx0XHRcdGxldCBhbHBDb250ZW50VmlldyA9IHRoaXMuX2dldERlZmF1bHRQYXRoKCk7XG5cdFx0XHRpZiAoIXN5c3RlbS5kZXNrdG9wICYmIGFscENvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZCkge1xuXHRcdFx0XHRhbHBDb250ZW50VmlldyA9IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHR9XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBhbHBDb250ZW50Vmlldyk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgY29uZGl0aW9ucyBmcm9tIGZpbHRlciBiYXJcblx0XHQvLyB0aGlzIGlzIGxhdGVyIHVzZWQgYmVmb3JlIG5hdmlnYXRpb24gdG8gZ2V0IGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgZmlsdGVyIGJhclxuXHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IHt9O1xuXG5cdFx0Ly8gQXMgQXBwU3RhdGVIYW5kbGVyLmFwcGx5QXBwU3RhdGUgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IHdpbGxcblx0XHQvLyBoYXBwZW4gYWZ0ZXIgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIChvdGhlcndpc2UgdGhlIHJvdXRlciBnZXRzIGJyb2tlbilcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBDb25maWd1cmUgdGhlIGluaXRpYWwgbG9hZCBzZXR0aW5nc1xuXHRcdHRoaXMuX3NldEluaXRMb2FkKCk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0ZGVsZXRlIHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucztcblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0X29uQWZ0ZXJCaW5kaW5nKCkge1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpO1xuXHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHR0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk/LmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gdGhpcy5fZ2V0VGFibGUoKT8uZ2V0Um93QmluZGluZygpO1xuXHRcdFx0aWYgKG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlcmUgaXMgYW4gaXNzdWUgaWYgd2UgdXNlIGEgdGltZW91dCB3aXRoIGEga2VwdCBhbGl2ZSBjb250ZXh0IHVzZWQgb24gYW5vdGhlciBwYWdlXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0XHRcdFx0dGhpcy5zVXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnNVcGRhdGVUaW1lcjtcblx0XHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBhY3Rpb24gZW5hYmxlbWVudCBhbmQgdmlzaWJpbGl0eSB1cG9uIHRhYmxlIGRhdGEgdXBkYXRlLlxuXHRcdFx0XHRcdGNvbnN0IGZuVXBkYXRlVGFibGVBY3Rpb25zID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5kZXRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlUHJvY2Vzc2VkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKCkpO1xuXHR9XG5cblx0b25CZWZvcmVSZW5kZXJpbmcoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHRcdGNvbnN0IGFDb250cm9scyA9IHRoaXMuX2dldENvbnRyb2xzKCk7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldDtcblx0XHRcdFx0Y29uc3Qgc1RleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIlRfVEFCTEVfQU5EX0NIQVJUX05PX0RBVEFfVEVYVFwiLFxuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFDb250cm9scy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wuc2V0Tm9EYXRhVGV4dChzVGV4dCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGFnZVJlYWR5KG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvLyBFbmFibGluZyBtYW5kYXRvcnkgZmlsdGVyIGZpZWxkcyBtZXNzYWdlIGRpYWxvZyBhbmQgZm9jdXNpbmcgb24gdGhlbVxuXHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXG5cdFx0XHRpZiAob0ZpbHRlckJhciAmJiAhb0ZpbHRlckJhci5nZXRTaG93TWVzc2FnZXMoKSkge1xuXHRcdFx0XHRvRmlsdGVyQmFyLnNldFNob3dNZXNzYWdlcyh0cnVlKTtcblx0XHRcdFx0KG9GaWx0ZXJCYXIgYXMgYW55KS5zZXRGb2N1c09uRmlyc3RFcnJvbmVvdXNGaWVsZCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgaGFuZGxlciBvbiBiYWNrIG5hdmlnYXRpb24gdGhhdCBkaXNwbGF5cyBEcmFmdCBjb25maXJtYXRpb25cblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih1bmRlZmluZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgY29udGVudCBvZiBhIGxpc3QgcmVwb3J0IHZpZXcgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLlxuXHQgKiBUaGlzIGhhcHBlbnMgZWl0aGVyIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2Ugb24gdGhlIEZpbHRlckJhciBhbmQgdGhlIHNlYXJjaCBpcyB0cmlnZ2VyZWQsXG5cdCAqIG9yIHdoZW4gYSB0YWIgd2l0aCBjdXN0b20gY29udGVudCBpcyBzZWxlY3RlZC5cblx0ICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBpbiBjYXNlIG9mIGN1c3RvbWl6YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBNYXAgY29udGFpbmluZyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgb2YgdGhlIEZpbHRlckJhciwgdGhlIGN1cnJlbnRUYWJJRFxuXHQgKiBhbmQgdGhlIHZpZXcgcmVmcmVzaCBjYXVzZSAodGFiQ2hhbmdlZCBvciBzZWFyY2gpLlxuXHQgKiBUaGUgbWFwIGxvb2tzIGxpa2UgdGhpczpcblx0ICogPGNvZGU+PHByZT5cblx0ICogXHR7XG5cdCAqIFx0XHRmaWx0ZXJDb25kaXRpb25zOiB7XG5cdCAqIFx0XHRcdENvdW50cnk6IFtcblx0ICogXHRcdFx0XHR7XG5cdCAqIFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiXG5cdCAqXHRcdFx0XHRcdHZhbGlkYXRlZDogXCJOb3RWYWxpZGF0ZWRcIlxuXHQgKlx0XHRcdFx0XHR2YWx1ZXM6IFtcIkdlcm1hbnlcIiwgLi4uXVxuXHQgKiBcdFx0XHRcdH0sXG5cdCAqIFx0XHRcdFx0Li4uXG5cdCAqIFx0XHRcdF1cblx0ICogXHRcdFx0Li4uXG5cdCAqIFx0XHR9LFxuXHQgKlx0XHRjdXJyZW50VGFiSWQ6IFwiZmU6OkN1c3RvbVRhYjo6dGFiMVwiLFxuXHQgKlx0XHRyZWZyZXNoQ2F1c2U6IFwidGFiQ2hhbmdlZFwiIHwgXCJzZWFyY2hcIlxuXHQgKlx0fVxuXHQgKiA8L3ByZT48L2NvZGU+XG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvblZpZXdOZWVkc1JlZnJlc2gobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdC8qIFRvIGJlIG92ZXJyaWRlbiAqL1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgd2hlbiBhIGZpbHRlciBvciBzZWFyY2ggdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUgRmlsdGVyQmFyLFxuXHQgKiBidXQgaGFzIG5vdCBiZWVuIHZhbGlkYXRlZCB5ZXQgYnkgdGhlIGVuZCB1c2VyICh3aXRoIHRoZSAnR28nIG9yICdTZWFyY2gnIGJ1dHRvbikuXG5cdCAqIFR5cGljYWxseSwgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgdGFiIGlzIGdyZXllZCBvdXQgdW50aWwgdGhlIGZpbHRlcnMgYXJlIHZhbGlkYXRlZC5cblx0ICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBpbiBjYXNlIG9mIGN1c3RvbWl6YXRpb24uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QZW5kaW5nRmlsdGVycygpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdGdldEN1cnJlbnRFbnRpdHlTZXQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhYmxlKCk/LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKS5zbGljZSgxKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpbml0aWF0ZXMgdGhlIHVwZGF0ZSBvZiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCB0aGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgRGF0YUZpZWxkRm9ySUJOIGJ1dHRvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBhVGFibGVzIEFycmF5IG9mIHRhYmxlcyBpbiB0aGUgbGlzdCByZXBvcnRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF91cGRhdGVUYWJsZUFjdGlvbnMoYVRhYmxlczogYW55KSB7XG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvVGFibGUsIGFJQk5BY3Rpb25zKTtcblx0XHRcdC8vIFVwZGF0ZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgRGF0YUZpZWxkRm9yQWN0aW9uIGJ1dHRvbnMgb24gdGFibGUgdG9vbGJhclxuXHRcdFx0Ly8gVGhlIHNhbWUgaXMgYWxzbyBwZXJmb3JtZWQgb24gVGFibGUgc2VsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSxcblx0XHRcdFx0b0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IEpTT04ucGFyc2UoXG5cdFx0XHRcdFx0Q29tbW9uSGVscGVyLnBhcnNlQ3VzdG9tRGF0YShEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YShvVGFibGUsIFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLnVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2Qgc2Nyb2xscyB0byBhIHNwZWNpZmljIHJvdyBvbiBhbGwgdGhlIGF2YWlsYWJsZSB0YWJsZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHNSb3dQYXRoIFRoZSBwYXRoIG9mIHRoZSB0YWJsZSByb3cgY29udGV4dCB0byBiZSBzY3JvbGxlZCB0b1xuXHQgKi9cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3cob1RhYmxlLCBzUm93UGF0aCk7XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0RW50cnkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogb01hbmlmZXN0RW50cnkudGl0bGUsXG5cdFx0XHRzdWJ0aXRsZTogb01hbmlmZXN0RW50cnkuYXBwU3ViVGl0bGUgfHwgXCJcIixcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkpIGFzIEZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHQvLyBJZiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGlzIHBhcnQgb2YgdGhlIERPTSB0cmVlLCB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2cgaXMgb3Blbixcblx0XHQvLyBhbmQgd2UgcmV0dXJuIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgYXMgYW4gYWN0aXZlIGNvbnRyb2wgKHZpc2libGUgZm9yIHRoZSB1c2VyKVxuXHRcdGNvbnN0IGFkYXB0YXRpb25GaWx0ZXJCYXIgPSAodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueSkuZ2V0SW5idWlsdEZpbHRlcigpO1xuXHRcdHJldHVybiBhZGFwdGF0aW9uRmlsdGVyQmFyPy5nZXRQYXJlbnQoKSA/IGFkYXB0YXRpb25GaWx0ZXJCYXIgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0U2VnbWVudGVkQnV0dG9uKHNDb250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBzU2VnbWVudGVkQnV0dG9uSWQgPSAoc0NvbnRyb2wgPT09IFwiQ2hhcnRcIiA/IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCkgOiB0aGlzLl9nZXRUYWJsZSgpKT8uZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHNTZWdtZW50ZWRCdXR0b25JZCk7XG5cdH1cblxuXHRfZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShzUGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgY29udHJvbElkID0gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KHNQYXRoKTtcblx0XHRyZXR1cm4gY29udHJvbElkICYmIHRoaXMuZ2V0VmlldygpLmJ5SWQoY29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRQYWdlTW9kZWwoKTogSlNPTk1vZGVsIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuZ2V0VmlldygpKSBhcyBhbnk7XG5cdFx0cmV0dXJuIHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2xJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvZmlsdGVyQmFySWRcIikgfHwgXCJcIjtcblx0fVxuXG5cdGdldENoYXJ0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShcIi9zaW5nbGVDaGFydElkXCIpO1xuXHR9XG5cblx0X2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0Y29uc3Qgc1Zpc3VhbEZpbHRlckJhcklkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW1widmlzdWFsRmlsdGVyXCIsIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpXSk7XG5cdFx0cmV0dXJuIHNWaXN1YWxGaWx0ZXJCYXJJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHNWaXN1YWxGaWx0ZXJCYXJJZCk7XG5cdH1cblx0X2dldEZpbHRlckJhclZhcmlhbnRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3ZhcmlhbnRNYW5hZ2VtZW50L2lkXCIpO1xuXHR9XG5cblx0X2dldE11bHRpTW9kZUNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6VGFiTXVsdGlwbGVNb2RlOjpDb250cm9sXCIpIGFzIE11bHRpcGxlTW9kZUNvbnRyb2w7XG5cdH1cblxuXHRfZ2V0VGFibGUoKTogVGFibGUgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKT8uZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKT8uY29udGVudDtcblx0XHRcdHJldHVybiBvQ29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSA/IChvQ29udHJvbCBhcyBUYWJsZSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3NpbmdsZVRhYmxlSWRcIikgYXMgVGFibGU7XG5cdFx0fVxuXHR9XG5cdF9nZXRDb250cm9scyhzS2V5PzogYW55KSB7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IGFDb250cm9sczogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IG9UYWJNdWx0aU1vZGUgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCkuY29udGVudDtcblx0XHRcdG9UYWJNdWx0aU1vZGUuZ2V0SXRlbXMoKS5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChvQ29udHJvbCAmJiBzS2V5KSB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoYGZlOjoke3NLZXl9YCkgPiAtMSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUNvbnRyb2xzO1xuXHRcdH0gZWxzZSBpZiAoc0tleSA9PT0gXCJDaGFydFwiKSB7XG5cdFx0XHRjb25zdCBvQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0cmV0dXJuIG9DaGFydCA/IFtvQ2hhcnRdIDogW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRyZXR1cm4gb1RhYmxlID8gW29UYWJsZV0gOiBbXTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0RGVmYXVsdFBhdGgoKSB7XG5cdFx0Y29uc3QgZGVmYXVsdFBhdGggPSBMaXN0UmVwb3J0VGVtcGxhdGluZy5nZXREZWZhdWx0UGF0aCh0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvdmlld3NcIikgfHwgW10pO1xuXHRcdHN3aXRjaCAoZGVmYXVsdFBhdGgpIHtcblx0XHRcdGNhc2UgXCJwcmltYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0Y2FzZSBcInNlY29uZGFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTtcblx0XHRcdGNhc2UgXCJib3RoXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB3aXRoIE11bHRpcGxlIFRhYmxlIG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNNdWx0aU1vZGVcblx0ICogQHJldHVybnMgSXMgTXVsdGlwbGUgVGFibGUgbW9kZSBzZXQ/XG5cdCAqL1xuXHRfaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL211bHRpVmlld3NDb250cm9sXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB0byBsb2FkIGRhdGEgYXQgc3RhcnQgdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNJbml0TG9hZERpc2FibGVkXG5cdCAqIEByZXR1cm5zIElzIEluaXRMb2FkIGVuYWJsZWQ/XG5cdCAqL1xuXHRfaXNJbml0TG9hZEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaW5pdExvYWRNb2RlID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5pbml0aWFsTG9hZDtcblx0XHRyZXR1cm4gaW5pdExvYWRNb2RlID09PSBJbml0aWFsTG9hZE1vZGUuRW5hYmxlZDtcblx0fVxuXG5cdF9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvaGFzTXVsdGlWaXN1YWxpemF0aW9uc1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gc3VzcGVuZCBzZWFyY2ggb24gdGhlIGZpbHRlciBiYXIuIFRoZSBpbml0aWFsIGxvYWRpbmcgb2YgZGF0YSBpcyBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBJbml0TG9hZCAtIERpc2FibGVkL0F1dG8uXG5cdCAqIEl0IGlzIGVuYWJsZWQgbGF0ZXIgd2hlbiB0aGUgdmlldyBzdGF0ZSBpcyBzZXQsIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gcmVhbGl6ZSBpZiB0aGVyZSBhcmUgZGVmYXVsdCBmaWx0ZXJzLlxuXHQgKi9cblx0X2Rpc2FibGVJbml0TG9hZCgpIHtcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0Ly8gY2hlY2sgZm9yIGZpbHRlciBiYXIgaGlkZGVuXG5cdFx0aWYgKGZpbHRlckJhcikge1xuXHRcdFx0ZmlsdGVyQmFyLnNldFN1c3BlbmRTZWxlY3Rpb24odHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgYnkgZmxleCB0byBkZXRlcm1pbmUgaWYgdGhlIGFwcGx5QXV0b21hdGljYWxseSBzZXR0aW5nIG9uIHRoZSB2YXJpYW50IGlzIHZhbGlkLlxuXHQgKiBDYWxsZWQgb25seSBmb3IgU3RhbmRhcmQgVmFyaWFudCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGRpc3BsYXkgdGV4dCBzZXQgZm9yIGFwcGx5QXV0b21hdGljYWxseSAoRkUgb25seSBzZXRzIGl0IGZvciBBdXRvKS5cblx0ICpcblx0ICogQHJldHVybnMgQm9vbGVhbiB0cnVlIGlmIGRhdGEgc2hvdWxkIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCgpIHtcblx0XHQvLyBXZSBhbHdheXMgcmV0dXJuIGZhbHNlIGFuZCB0YWtlIGNhcmUgb2YgaXQgd2hlbiB2aWV3IHN0YXRlIGlzIHNldFxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25maWd1cmUgdGhlIHNldHRpbmdzIGZvciBpbml0aWFsIGxvYWQgYmFzZWQgb25cblx0ICogLSBtYW5pZmVzdCBzZXR0aW5nIGluaXRMb2FkIC0gRW5hYmxlZC9EaXNhYmxlZC9BdXRvXG5cdCAqIC0gdXNlcidzIHNldHRpbmcgb2YgYXBwbHlBdXRvbWF0aWNhbGx5IG9uIHZhcmlhbnRcblx0ICogLSBpZiB0aGVyZSBhcmUgZGVmYXVsdCBmaWx0ZXJzXG5cdCAqIFdlIGRpc2FibGUgdGhlIGZpbHRlciBiYXIgc2VhcmNoIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuYWJsZSBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0LlxuXHQgKi9cblx0X3NldEluaXRMb2FkKCkge1xuXHRcdC8vIGlmIGluaXRMb2FkIGlzIERpc2FibGVkIG9yIEF1dG8sIHN3aXRjaCBvZmYgZmlsdGVyIGJhciBzZWFyY2ggdGVtcG9yYXJpbHkgYXQgc3RhcnRcblx0XHRpZiAoIXRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuX2Rpc2FibGVJbml0TG9hZCgpO1xuXHRcdH1cblx0XHQvLyBzZXQgaG9vayBmb3IgZmxleCBmb3Igd2hlbiBzdGFuZGFyZCB2YXJpYW50IGlzIHNldCAoYXQgc3RhcnQgb3IgYnkgdXNlciBhdCBydW50aW1lKVxuXHRcdC8vIHJlcXVpcmVkIHRvIG92ZXJyaWRlIHRoZSB1c2VyIHNldHRpbmcgJ2FwcGx5IGF1dG9tYXRpY2FsbHknIGJlaGF2aW91ciBpZiB0aGVyZSBhcmUgbm8gZmlsdGVyc1xuXHRcdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50SWQ6IGFueSA9IExpc3RSZXBvcnRUZW1wbGF0aW5nLmdldFZhcmlhbnRCYWNrUmVmZXJlbmNlKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCksIHRoaXMuX2dldFBhZ2VNb2RlbCgpKTtcblx0XHRjb25zdCB2YXJpYW50TWFuYWdlbWVudCA9IHZhcmlhbnRNYW5hZ2VtZW50SWQgJiYgdGhpcy5nZXRWaWV3KCkuYnlJZCh2YXJpYW50TWFuYWdlbWVudElkKTtcblx0XHRpZiAodmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdHZhcmlhbnRNYW5hZ2VtZW50LnJlZ2lzdGVyQXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQodGhpcy5fYXBwbHlBdXRvbWF0aWNhbGx5T25TdGFuZGFyZFZhcmlhbnQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHR9XG5cblx0X3NldFNoYXJlTW9kZWwoKSB7XG5cdFx0Ly8gVE9ETzogZGVhY3RpdmF0ZWQgZm9yIG5vdyAtIGN1cnJlbnRseSB0aGVyZSBpcyBubyBfdGVtcGxQcml2IGFueW1vcmUsIHRvIGJlIGRpc2N1c3NlZFxuXHRcdC8vIHRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBub3QgY2FsbGVkIGFueW1vcmUgZnJvbSB0aGUgaW5pdCBtZXRob2RcblxuXHRcdGNvbnN0IGZuR2V0VXNlciA9IE9iamVjdFBhdGguZ2V0KFwic2FwLnVzaGVsbC5Db250YWluZXIuZ2V0VXNlclwiKTtcblx0XHQvL3ZhciBvTWFuaWZlc3QgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLnVpXCIpO1xuXHRcdC8vdmFyIHNCb29rbWFya0ljb24gPSAob01hbmlmZXN0ICYmIG9NYW5pZmVzdC5pY29ucyAmJiBvTWFuaWZlc3QuaWNvbnMuaWNvbikgfHwgXCJcIjtcblxuXHRcdC8vc2hhcmVNb2RlbDogSG9sZHMgYWxsIHRoZSBzaGFyaW5nIHJlbGV2YW50IGluZm9ybWF0aW9uIGFuZCBpbmZvIHVzZWQgaW4gWE1MIHZpZXdcblx0XHRjb25zdCBvU2hhcmVJbmZvID0ge1xuXHRcdFx0Ym9va21hcmtUaXRsZTogZG9jdW1lbnQudGl0bGUsIC8vVG8gbmFtZSB0aGUgYm9va21hcmsgYWNjb3JkaW5nIHRvIHRoZSBhcHAgdGl0bGUuXG5cdFx0XHRib29rbWFya0N1c3RvbVVybDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBzSGFzaCA9IGhhc2hlci5nZXRIYXNoKCk7XG5cdFx0XHRcdHJldHVybiBzSGFzaCA/IGAjJHtzSGFzaH1gIDogd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHR9LFxuXHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0VG8gYmUgYWN0aXZhdGVkIG9uY2UgdGhlIEZMUCBzaG93cyB0aGUgY291bnQgLSBzZWUgY29tbWVudCBhYm92ZVxuXHRcdFx0XHRcdFx0XHRib29rbWFya1NlcnZpY2VVcmw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vdmFyIG9UYWJsZSA9IG9UYWJsZS5nZXRJbm5lclRhYmxlKCk7IG9UYWJsZSBpcyBhbHJlYWR5IHRoZSBzYXAuZmUgdGFibGUgKGJ1dCBub3QgdGhlIGlubmVyIG9uZSlcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgdXNlIHRhYmxlLmdldExpc3RCaW5kaW5nSW5mbyBpbnN0ZWFkIG9mIHRoZSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0dmFyIG9CaW5kaW5nID0gb1RhYmxlLmdldEJpbmRpbmcoXCJyb3dzXCIpIHx8IG9UYWJsZS5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gZm5HZXREb3dubG9hZFVybChvQmluZGluZykgOiBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9LCovXG5cdFx0XHRpc1NoYXJlSW5KYW1BY3RpdmU6ICEhZm5HZXRVc2VyICYmIGZuR2V0VXNlcigpLmlzSmFtQWN0aXZlKClcblx0XHR9O1xuXG5cdFx0Y29uc3Qgb1RlbXBsYXRlUHJpdmF0ZU1vZGVsID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiX3RlbXBsUHJpdlwiKSBhcyBKU09OTW9kZWw7XG5cdFx0b1RlbXBsYXRlUHJpdmF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL2xpc3RSZXBvcnQvc2hhcmVcIiwgb1NoYXJlSW5mbyk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHVwZGF0ZSB0aGUgbG9jYWwgVUkgbW9kZWwgb2YgdGhlIHBhZ2Ugd2l0aCB0aGUgZmllbGRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBmaWx0ZXIgYmFyICh0aGlzIGlzIHNwZWNpZmljIHRvIHRoZSBBTFAgc2NlbmFyaW8pLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvRmlsdGVyQmFyIE1EQyBmaWx0ZXIgYmFyXG5cdCAqL1xuXHRfdXBkYXRlQUxQTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyOiBGaWx0ZXJCYXIpIHtcblx0XHRjb25zdCBtQ2FjaGU6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGlnbm9yZWRGaWVsZHM6IGFueSA9IHt9LFxuXHRcdFx0YVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIiksXG5cdFx0XHRhQ2hhcnRzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJDaGFydFwiKTtcblxuXHRcdGlmICghYVRhYmxlcy5sZW5ndGggfHwgIWFDaGFydHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5vdCBhIHRhYmxlIGFuZCBhIGNoYXJ0LCB3ZSdyZSBub3QgaW4gdGhlIEFMUCBjYXNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90aGluZyBmb3IgdGFibGVzLi4uXG5cdFx0YUNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0NoYXJ0RW50aXR5UGF0aCA9IG9DaGFydC5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNDaGFydEVudGl0eVNldCA9IHNDaGFydEVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNDYWNoZUtleSA9IGAke3NDaGFydEVudGl0eVNldH1DaGFydGA7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc0NhY2hlS2V5XSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNvbnRyb2xzL2lnbm9yZWRGaWVsZHNcIiwgaWdub3JlZEZpZWxkcyk7XG5cdH1cblxuXHRfaXNGaWx0ZXJCYXJIaWRkZW4oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaGlkZUZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXRBcHBseUF1dG9tYXRpY2FsbHlPblZhcmlhbnQoVmFyaWFudE1hbmFnZW1lbnQ6IGFueSwga2V5OiBzdHJpbmcpOiBCb29sZWFuIHtcblx0XHRpZiAoIVZhcmlhbnRNYW5hZ2VtZW50IHx8ICFrZXkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgdmFyaWFudHMgPSBWYXJpYW50TWFuYWdlbWVudC5nZXRWYXJpYW50cygpO1xuXHRcdGNvbnN0IGN1cnJlbnRWYXJpYW50ID0gdmFyaWFudHMuZmluZChmdW5jdGlvbiAodmFyaWFudDogYW55KSB7XG5cdFx0XHRyZXR1cm4gdmFyaWFudCAmJiB2YXJpYW50LmtleSA9PT0ga2V5O1xuXHRcdH0pO1xuXHRcdHJldHVybiAoY3VycmVudFZhcmlhbnQgJiYgY3VycmVudFZhcmlhbnQuZXhlY3V0ZU9uU2VsZWN0KSB8fCBmYWxzZTtcblx0fVxuXG5cdF9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk06IGFueSkge1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaW5pdGlhbExvYWQgPT09IEluaXRpYWxMb2FkTW9kZS5BdXRvICYmXG5cdFx0XHQoIW9WTSB8fCBvVk0uZ2V0U3RhbmRhcmRWYXJpYW50S2V5KCkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9Db25kaXRpb25zID0gb0ZpbHRlckJhci5nZXRDb25kaXRpb25zKCk7XG5cdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvQ29uZGl0aW9ucykge1xuXHRcdFx0XHRcdC8vIGlnbm9yZSBmaWx0ZXJzIHN0YXJ0aW5nIHdpdGggJCAoZS5nLiAkc2VhcmNoLCAkZWRpdFN0YXRlKVxuXHRcdFx0XHRcdGlmICghc0tleS5zdGFydHNXaXRoKFwiJFwiKSAmJiBBcnJheS5pc0FycmF5KG9Db25kaXRpb25zW3NLZXldKSAmJiBvQ29uZGl0aW9uc1tzS2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIGxvYWQgZGF0YSBhcyBwZXIgdXNlcidzIHNldHRpbmcgb2YgYXBwbHlBdXRvbWF0aWNhbGx5IG9uIHRoZSB2YXJpYW50XG5cdFx0XHRcdFx0XHRjb25zdCBzdGFuZGFyZFZhcmlhbnQ6IGFueSA9IG9WTS5nZXRWYXJpYW50cygpLmZpbmQoKHZhcmlhbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFyaWFudC5rZXkgPT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RhbmRhcmRWYXJpYW50ICYmIHN0YW5kYXJkVmFyaWFudC5leGVjdXRlT25TZWxlY3Q7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF91cGRhdGVUYWJsZShvVGFibGU6IGFueSkge1xuXHRcdGlmICghb1RhYmxlLmlzVGFibGVCb3VuZCgpIHx8IHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcykge1xuXHRcdFx0b1RhYmxlLnJlYmluZCgpO1xuXHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0X3VwZGF0ZUNoYXJ0KG9DaGFydDogYW55KSB7XG5cdFx0Y29uc3Qgb0lubmVyQ2hhcnQgPSBvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkuX2dldENoYXJ0KG9DaGFydCk7XG5cdFx0aWYgKCEob0lubmVyQ2hhcnQgJiYgb0lubmVyQ2hhcnQuaXNCb3VuZChcImRhdGFcIikpIHx8IHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcykge1xuXHRcdFx0b0NoYXJ0LmdldENvbnRyb2xEZWxlZ2F0ZSgpLnJlYmluZChvQ2hhcnQsIG9Jbm5lckNoYXJ0LmdldEJpbmRpbmdJbmZvKFwiZGF0YVwiKSk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHRvbkZpbHRlcnNDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdC8vIFBlbmRpbmcgZmlsdGVycyBpbnRvIEZpbHRlckJhciB0byBiZSB1c2VkIGZvciBjdXN0b20gdmlld3Ncblx0XHRcdFx0dGhpcy5vblBlbmRpbmdGaWx0ZXJzKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIG9GaWx0ZXJCYXIuZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCgpLmZpbHRlcnNUZXh0KTtcblx0XHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb25kaXRpb25zQmFzZWRcIikpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvVk0gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRjb25zdCBjdXJyZW50VmFyaWFudEtleSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJrZXlcIik7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblxuXHRcdFx0b011bHRpTW9kZUNvbnRyb2w/LmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0XHRvTXVsdGlNb2RlQ29udHJvbD8uc2V0RnJlZXplQ29udGVudCh0cnVlKTtcblx0XHRcdC8vIHNldFRpbWVvdXQgY2F1c2UgdGhlIHZhcmlhbnQgbmVlZHMgdG8gYmUgYXBwbGllZCBiZWZvcmUganVkZ2luZyB0aGUgYXV0byBzZWFyY2ggb3IgdXBkYXRpbmcgdGhlIGFwcCBzdGF0ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk0pKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGFwcCBzdGF0ZSB3aWxsIGJlIHVwZGF0ZWQgdmlhIG9uU2VhcmNoIGhhbmRsZXJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpLnRyaWdnZXJTZWFyY2goKTtcblx0XHRcdFx0fSBlbHNlIGlmICghdGhpcy5fZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50KG9WTSwgY3VycmVudFZhcmlhbnRLZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAwKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlISEhXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSxcblx0XHRvblNlYXJjaCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvTWRjQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgYkhpZGVEcmFmdCA9IEZpbHRlclV0aWxzLmdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0KG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIGZhbHNlKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgYkhpZGVEcmFmdCk7XG5cblx0XHRcdGlmICghdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWRjQ2hhcnQpIHtcblx0XHRcdFx0Ly8gZGlzYWJsZSBib3VuZCBhY3Rpb25zIFRPRE86IHRoaXMgY2xlYXJzIGV2ZXJ5dGhpbmcgZm9yIHRoZSBjaGFydD9cblx0XHRcdFx0KG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcIlwiLCB7fSk7XG5cblx0XHRcdFx0Y29uc3Qgb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9hbHBDb250ZW50Vmlld2ApO1xuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHN0b3JlIGZpbHRlciBiYXIgY29uZGl0aW9ucyB0byB1c2UgbGF0ZXIgd2hpbGUgbmF2aWdhdGlvblxuXHRcdFx0U3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvRmlsdGVyQmFyKVxuXHRcdFx0XHQudGhlbigob0V4dGVybmFsU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IG9FeHRlcm5hbFN0YXRlLmZpbHRlcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGV4dGVybmFsIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkubGl2ZU1vZGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN5c3RlbS5waG9uZSkge1xuXHRcdFx0XHRjb25zdCBvRHluYW1pY1BhZ2UgPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6Okxpc3RSZXBvcnRcIikgYXMgRHluYW1pY1BhZ2U7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdFx0c0NyZWF0ZVBhdGg6IHN0cmluZ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZW50KCksXG5cdFx0XHRcdG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCksXG5cdFx0XHRcdGFEYXRhID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImRhdGFcIiksXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoYURhdGEpIHtcblx0XHRcdFx0Ly8gdXBkYXRlIGFjdGlvbiBidXR0b25zIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudFxuXHRcdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdFx0XHQvLyB1cGRhdGUgc2VsZWN0aW9ucyBvbiBzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb25cblx0XHRcdFx0Q2hhcnRVdGlscy5zZXRDaGFydEZpbHRlcnMob01kY0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2FscENvbnRlbnRWaWV3YCk7XG5cdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1RhYmxlKSB7XG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5yZWJpbmQoKTtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvRXZlbnQubVBhcmFtZXRlcnMua2V5ID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA6IG51bGw7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlID0ge1xuXHRcdFx0XHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9TZWdtZW50ZWRCdXR0b24uZ2V0SXRlbXMoKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpID09PSBzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0b0l0ZW0uZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnJlbW92ZUV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b24gPSAoXG5cdFx0XHRcdHNTZWxlY3RlZEtleSA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSA/IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIlRhYmxlXCIpIDogdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiQ2hhcnRcIilcblx0XHRcdCkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdFx0aWYgKG9TZWdtZW50ZWRCdXR0b24gIT09IG9FdmVudC5nZXRTb3VyY2UoKSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLmFkZEV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgaXNDb21wYWN0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImtleVwiKSA9PT0gXCJDb21wYWN0XCI7XG5cdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkuc2V0VmlzaWJsZShpc0NvbXBhY3QpO1xuXHRcdFx0KHRoaXMuX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSBhcyBDb250cm9sKS5zZXRWaXNpYmxlKCFpc0NvbXBhY3QpO1xuXHRcdH0sXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25EeW5hbWljUGFnZVRpdGxlU3RhdGVDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgZmlsdGVyQmFyOiBhbnkgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAoZmlsdGVyQmFyICYmIGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKSkge1xuXHRcdFx0XHRpZiAob0V2ZW50LmdldFBhcmFtZXRlcihcImlzRXhwYW5kZWRcIikpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGZvcm1hdHRlcnMgPSB7XG5cdFx0c2V0QUxQQ29udHJvbE1lc3NhZ2VTdHJpcCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgYUlnbm9yZWRGaWVsZHM6IGFueVtdLCBiSXNDaGFydDogYW55LCBvQXBwbHlTdXBwb3J0ZWQ/OiBhbnkpIHtcblx0XHRcdGxldCBzVGV4dCA9IFwiXCI7XG5cdFx0XHRiSXNDaGFydCA9IGJJc0NoYXJ0ID09PSBcInRydWVcIiB8fCBiSXNDaGFydCA9PT0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhciAmJiBBcnJheS5pc0FycmF5KGFJZ25vcmVkRmllbGRzKSAmJiBhSWdub3JlZEZpZWxkcy5sZW5ndGggPiAwICYmIGJJc0NoYXJ0KSB7XG5cdFx0XHRcdGNvbnN0IGFJZ25vcmVkTGFiZWxzID0gTWVzc2FnZVN0cmlwLmdldExhYmVscyhcblx0XHRcdFx0XHRhSWdub3JlZEZpZWxkcyxcblx0XHRcdFx0XHRvRmlsdGVyQmFyLmRhdGEoXCJlbnRpdHlUeXBlXCIpLFxuXHRcdFx0XHRcdG9GaWx0ZXJCYXIsXG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgYXMgUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgYklzU2VhcmNoSWdub3JlZCA9ICFvQXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoO1xuXHRcdFx0XHRzVGV4dCA9IGJJc0NoYXJ0XG5cdFx0XHRcdFx0PyBNZXNzYWdlU3RyaXAuZ2V0QUxQVGV4dChhSWdub3JlZExhYmVscywgb0ZpbHRlckJhciwgYklzU2VhcmNoSWdub3JlZClcblx0XHRcdFx0XHQ6IE1lc3NhZ2VTdHJpcC5nZXRUZXh0KGFJZ25vcmVkTGFiZWxzLCBvRmlsdGVyQmFyLCBcIlwiLCBEZWxlZ2F0ZVV0aWwuZ2V0TG9jYWxpemVkVGV4dCk7XG5cdFx0XHRcdHJldHVybiBzVGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RSZXBvcnRDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdEQSxJQUFNQSxtQkFBbUIsR0FBR0MsV0FBVyxDQUFDRCxtQkFBeEM7RUFBQSxJQUNDRSxlQUFlLEdBQUdELFdBQVcsQ0FBQ0MsZUFEL0I7TUFJTUMsb0IsV0FETEMsY0FBYyxDQUFDLGtEQUFELEMsVUFFYkMsY0FBYyxDQUNkQyxlQUFlLENBQUNDLFFBQWhCLENBQXlCO0lBQ3hCQyxjQUFjLEVBQUUsWUFBaUM7TUFDL0MsS0FBS0MsT0FBTCxHQUFlQyxhQUFmLEVBQUQsQ0FBeURDLGVBQXpEO0lBQ0E7RUFIdUIsQ0FBekIsQ0FEYyxDLFVBUWROLGNBQWMsQ0FDZE8sNkJBQTZCLENBQUNMLFFBQTlCLENBQXVDO0lBQ3RDTSxZQUFZLEVBQUUsWUFBK0M7TUFDNUQsT0FBUSxLQUFLQyxJQUFOLENBQW9DQyxtQkFBcEMs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