@sapui5/sap.fe.macros 1.141.1 → 1.142.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 (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Breadcrumbs.js +4 -10
  4. package/src/sap/fe/macros/Breadcrumbs.tsx +2 -8
  5. package/src/sap/fe/macros/Chart.js +34 -23
  6. package/src/sap/fe/macros/Chart.tsx +25 -11
  7. package/src/sap/fe/macros/CollaborativeDraftHandler.js +48 -31
  8. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +51 -26
  9. package/src/sap/fe/macros/CollectionBindingInfo.js +8 -2
  10. package/src/sap/fe/macros/CollectionBindingInfo.ts +11 -6
  11. package/src/sap/fe/macros/CommonHelper.js +14 -24
  12. package/src/sap/fe/macros/CommonHelper.ts +18 -25
  13. package/src/sap/fe/macros/Field.js +30 -13
  14. package/src/sap/fe/macros/Field.ts +60 -30
  15. package/src/sap/fe/macros/FooterContent.js +5 -2
  16. package/src/sap/fe/macros/FooterContent.tsx +6 -3
  17. package/src/sap/fe/macros/KPITag.js +1 -1
  18. package/src/sap/fe/macros/KPITag.tsx +3 -1
  19. package/src/sap/fe/macros/MacroAPI.js +3 -2
  20. package/src/sap/fe/macros/MacroAPI.ts +2 -2
  21. package/src/sap/fe/macros/MessageButton.js +3 -2
  22. package/src/sap/fe/macros/MessageButton.tsx +5 -2
  23. package/src/sap/fe/macros/MicroChart.js +10 -6
  24. package/src/sap/fe/macros/MicroChart.tsx +8 -2
  25. package/src/sap/fe/macros/MultiValueField.js +22 -36
  26. package/src/sap/fe/macros/MultiValueField.tsx +34 -66
  27. package/src/sap/fe/macros/RichTextEditor.js +3 -4
  28. package/src/sap/fe/macros/RichTextEditor.tsx +2 -3
  29. package/src/sap/fe/macros/Status.js +35 -8
  30. package/src/sap/fe/macros/Status.tsx +23 -2
  31. package/src/sap/fe/macros/ValueHelp.js +5 -2
  32. package/src/sap/fe/macros/ValueHelp.tsx +5 -0
  33. package/src/sap/fe/macros/ai/EasyFilterBar.js +7 -34
  34. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +6 -35
  35. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +31 -7
  36. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +33 -6
  37. package/src/sap/fe/macros/chart/Action.js +25 -2
  38. package/src/sap/fe/macros/chart/Action.ts +13 -0
  39. package/src/sap/fe/macros/chart/ActionGroup.js +25 -2
  40. package/src/sap/fe/macros/chart/ActionGroup.ts +13 -0
  41. package/src/sap/fe/macros/chart/ChartDelegate.js +8 -8
  42. package/src/sap/fe/macros/chart/ChartDelegate.ts +17 -12
  43. package/src/sap/fe/macros/chart/MdcChartTemplate.js +54 -11
  44. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +70 -11
  45. package/src/sap/fe/macros/chart/OverflowGroup.js +62 -0
  46. package/src/sap/fe/macros/chart/OverflowGroup.ts +22 -0
  47. package/src/sap/fe/macros/controls/FilterBar.js +39 -3
  48. package/src/sap/fe/macros/controls/FilterBar.ts +42 -1
  49. package/src/sap/fe/macros/controls/RadioButtons.js +18 -5
  50. package/src/sap/fe/macros/controls/RadioButtons.tsx +10 -1
  51. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  52. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  53. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +37 -9
  54. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +45 -6
  55. package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +4 -2
  56. package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +3 -1
  57. package/src/sap/fe/macros/field/FieldFormatOptions.js +3 -3
  58. package/src/sap/fe/macros/field/FieldFormatOptions.ts +1 -1
  59. package/src/sap/fe/macros/field/FieldHelper.js +4 -3
  60. package/src/sap/fe/macros/field/FieldHelper.ts +7 -1
  61. package/src/sap/fe/macros/field/FieldRuntime.js +38 -8
  62. package/src/sap/fe/macros/field/FieldRuntime.ts +65 -7
  63. package/src/sap/fe/macros/field/FieldRuntimeHelper.js +3 -34
  64. package/src/sap/fe/macros/field/FieldRuntimeHelper.ts +28 -53
  65. package/src/sap/fe/macros/field/FieldTemplating.js +5 -4
  66. package/src/sap/fe/macros/field/FieldTemplating.ts +6 -4
  67. package/src/sap/fe/macros/filter/FilterFieldHelper.js +6 -4
  68. package/src/sap/fe/macros/filter/FilterFieldHelper.ts +7 -2
  69. package/src/sap/fe/macros/filter/FilterUtils.js +100 -36
  70. package/src/sap/fe/macros/filter/FilterUtils.ts +127 -39
  71. package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.js +2 -2
  72. package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.ts +1 -1
  73. package/src/sap/fe/macros/filterBar/FilterBar.block.js +4 -3
  74. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +19 -8
  75. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +10 -7
  76. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +31 -16
  77. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +4 -3
  78. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +5 -2
  79. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +4 -3
  80. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +3 -2
  81. package/src/sap/fe/macros/form/Form.block.js +27 -2
  82. package/src/sap/fe/macros/form/Form.block.ts +31 -11
  83. package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -3
  84. package/src/sap/fe/macros/form/FormContainer.block.js +96 -65
  85. package/src/sap/fe/macros/form/FormContainer.block.ts +104 -65
  86. package/src/sap/fe/macros/formatters/TableFormatter.js +13 -10
  87. package/src/sap/fe/macros/formatters/TableFormatter.ts +11 -9
  88. package/src/sap/fe/macros/formatters/VisualFilterFormatter.js +6 -4
  89. package/src/sap/fe/macros/formatters/VisualFilterFormatter.ts +5 -5
  90. package/src/sap/fe/macros/inlineEdit/InlineEdit.js +5 -5
  91. package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +4 -4
  92. package/src/sap/fe/macros/insights/InsightsService.js +3 -2
  93. package/src/sap/fe/macros/insights/InsightsService.ts +2 -1
  94. package/src/sap/fe/macros/internal/DataPoint.js +7 -8
  95. package/src/sap/fe/macros/internal/DataPoint.tsx +6 -9
  96. package/src/sap/fe/macros/internal/field/DisplayStyle.js +8 -6
  97. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +7 -8
  98. package/src/sap/fe/macros/internal/field/EditStyle.js +9 -20
  99. package/src/sap/fe/macros/internal/field/EditStyle.tsx +17 -41
  100. package/src/sap/fe/macros/internal/field/FieldBlockStructure.js +2 -2
  101. package/src/sap/fe/macros/internal/field/FieldBlockStructure.tsx +1 -1
  102. package/src/sap/fe/macros/internal/field/FieldStructure.js +1 -2
  103. package/src/sap/fe/macros/internal/field/FieldStructure.tsx +0 -2
  104. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +7 -7
  105. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +17 -11
  106. package/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +6 -2
  107. package/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +5 -1
  108. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.js +9 -6
  109. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.ts +7 -5
  110. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +4 -4
  111. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +6 -6
  112. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +5 -2
  113. package/src/sap/fe/macros/library.js +3 -3
  114. package/src/sap/fe/macros/library.ts +2 -0
  115. package/src/sap/fe/macros/mdc/adapter/StateHelper.js +15 -5
  116. package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +21 -5
  117. package/src/sap/fe/macros/messagebundle.properties +7 -5
  118. package/src/sap/fe/macros/messagebundle_ar.properties +12 -3
  119. package/src/sap/fe/macros/messagebundle_bg.properties +13 -4
  120. package/src/sap/fe/macros/messagebundle_ca.properties +12 -3
  121. package/src/sap/fe/macros/messagebundle_cnr.properties +12 -3
  122. package/src/sap/fe/macros/messagebundle_cs.properties +11 -2
  123. package/src/sap/fe/macros/messagebundle_cy.properties +12 -3
  124. package/src/sap/fe/macros/messagebundle_da.properties +12 -3
  125. package/src/sap/fe/macros/messagebundle_de.properties +16 -7
  126. package/src/sap/fe/macros/messagebundle_el.properties +13 -4
  127. package/src/sap/fe/macros/messagebundle_en.properties +13 -4
  128. package/src/sap/fe/macros/messagebundle_en_GB.properties +13 -4
  129. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +12 -3
  130. package/src/sap/fe/macros/messagebundle_es.properties +12 -3
  131. package/src/sap/fe/macros/messagebundle_es_MX.properties +12 -3
  132. package/src/sap/fe/macros/messagebundle_et.properties +12 -3
  133. package/src/sap/fe/macros/messagebundle_fi.properties +12 -3
  134. package/src/sap/fe/macros/messagebundle_fr.properties +12 -3
  135. package/src/sap/fe/macros/messagebundle_fr_CA.properties +12 -3
  136. package/src/sap/fe/macros/messagebundle_hi.properties +12 -3
  137. package/src/sap/fe/macros/messagebundle_hr.properties +13 -4
  138. package/src/sap/fe/macros/messagebundle_hu.properties +12 -3
  139. package/src/sap/fe/macros/messagebundle_id.properties +18 -9
  140. package/src/sap/fe/macros/messagebundle_it.properties +12 -3
  141. package/src/sap/fe/macros/messagebundle_iw.properties +12 -3
  142. package/src/sap/fe/macros/messagebundle_ja.properties +12 -3
  143. package/src/sap/fe/macros/messagebundle_kk.properties +11 -2
  144. package/src/sap/fe/macros/messagebundle_ko.properties +13 -4
  145. package/src/sap/fe/macros/messagebundle_lt.properties +12 -3
  146. package/src/sap/fe/macros/messagebundle_lv.properties +12 -3
  147. package/src/sap/fe/macros/messagebundle_mk.properties +12 -3
  148. package/src/sap/fe/macros/messagebundle_ms.properties +12 -3
  149. package/src/sap/fe/macros/messagebundle_nl.properties +12 -3
  150. package/src/sap/fe/macros/messagebundle_no.properties +12 -3
  151. package/src/sap/fe/macros/messagebundle_pl.properties +12 -3
  152. package/src/sap/fe/macros/messagebundle_pt.properties +12 -3
  153. package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -3
  154. package/src/sap/fe/macros/messagebundle_ro.properties +13 -4
  155. package/src/sap/fe/macros/messagebundle_ru.properties +12 -3
  156. package/src/sap/fe/macros/messagebundle_sh.properties +12 -3
  157. package/src/sap/fe/macros/messagebundle_sk.properties +12 -3
  158. package/src/sap/fe/macros/messagebundle_sl.properties +13 -4
  159. package/src/sap/fe/macros/messagebundle_sr.properties +12 -3
  160. package/src/sap/fe/macros/messagebundle_sv.properties +12 -3
  161. package/src/sap/fe/macros/messagebundle_th.properties +11 -2
  162. package/src/sap/fe/macros/messagebundle_tr.properties +12 -3
  163. package/src/sap/fe/macros/messagebundle_uk.properties +12 -3
  164. package/src/sap/fe/macros/messagebundle_vi.properties +13 -4
  165. package/src/sap/fe/macros/messagebundle_zh_CN.properties +12 -3
  166. package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -3
  167. package/src/sap/fe/macros/richtexteditor/ButtonGroup.js +2 -2
  168. package/src/sap/fe/macros/richtexteditor/ButtonGroup.ts +2 -2
  169. package/src/sap/fe/macros/table/Action.js +15 -2
  170. package/src/sap/fe/macros/table/Action.ts +11 -1
  171. package/src/sap/fe/macros/table/ActionGroup.js +15 -2
  172. package/src/sap/fe/macros/table/ActionGroup.ts +8 -0
  173. package/src/sap/fe/macros/table/ActionGroupOverride.js +14 -2
  174. package/src/sap/fe/macros/table/ActionGroupOverride.ts +7 -0
  175. package/src/sap/fe/macros/table/ActionOverride.js +14 -2
  176. package/src/sap/fe/macros/table/ActionOverride.ts +7 -0
  177. package/src/sap/fe/macros/table/ActionsTemplating.js +16 -2
  178. package/src/sap/fe/macros/table/ActionsTemplating.tsx +15 -0
  179. package/src/sap/fe/macros/table/MdcTableTemplate.js +91 -10
  180. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +131 -10
  181. package/src/sap/fe/macros/table/OverflowGroups.js +59 -0
  182. package/src/sap/fe/macros/table/OverflowGroups.ts +27 -0
  183. package/src/sap/fe/macros/table/Table.block.js +70 -29
  184. package/src/sap/fe/macros/table/Table.block.tsx +65 -12
  185. package/src/sap/fe/macros/table/TableAPI.js +169 -131
  186. package/src/sap/fe/macros/table/TableAPI.ts +58 -28
  187. package/src/sap/fe/macros/table/TableDefinition.js +19 -2
  188. package/src/sap/fe/macros/table/TableDefinition.ts +17 -1
  189. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +4 -3
  190. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +8 -9
  191. package/src/sap/fe/macros/table/TableHelper.js +5 -2
  192. package/src/sap/fe/macros/table/TableHelper.ts +5 -2
  193. package/src/sap/fe/macros/table/TableRuntime.js +2 -2
  194. package/src/sap/fe/macros/table/TableRuntime.ts +4 -6
  195. package/src/sap/fe/macros/table/TableSizeHelper.js +4 -4
  196. package/src/sap/fe/macros/table/TableSizeHelper.ts +6 -11
  197. package/src/sap/fe/macros/table/delegates/TableDelegate.js +67 -26
  198. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +108 -118
  199. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +2 -2
  200. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +1 -1
  201. package/src/sap/fe/macros/table/massEdit/MassEditField.js +1 -1
  202. package/src/sap/fe/macros/table/massEdit/MassEditField.tsx +3 -6
  203. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +6 -5
  204. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +10 -4
  205. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +7 -9
  206. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +7 -8
  207. package/src/sap/fe/macros/table/mixin/TableExport.js +1 -1
  208. package/src/sap/fe/macros/table/mixin/TableExport.ts +3 -3
  209. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +4 -4
  210. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.ts +3 -3
  211. package/src/sap/fe/macros/visualfilters/VisualFilter.js +20 -2
  212. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +28 -6
  213. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +6 -3
  214. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +4 -3
  215. package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.js +3 -3
  216. package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.tsx +10 -4
  217. package/src/sap/fe/macros/visualfilters/fragments/InteractiveDonutChart.fragment.xml +1 -1
@@ -35,7 +35,7 @@ import { escapeXMLAttributeValue } from "sap/fe/core/buildingBlocks/templating/B
35
35
  import type { NavigationParameters } from "sap/fe/core/controllerextensions/InternalIntentBasedNavigation";
36
36
  import CommandExecution from "sap/fe/core/controls/CommandExecution";
37
37
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
38
- import type { BaseManifestSettings, ControlConfiguration } from "sap/fe/core/converters/ManifestSettings";
38
+ import type { BaseManifestSettings, ControlConfiguration, OverflowGroupsConfiguration } from "sap/fe/core/converters/ManifestSettings";
39
39
  import { TemplateType } from "sap/fe/core/converters/ManifestSettings";
40
40
  import ManifestWrapper from "sap/fe/core/converters/ManifestWrapper";
41
41
  import { getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
@@ -78,11 +78,14 @@ import OverflowToolbarLayoutData from "sap/m/OverflowToolbarLayoutData";
78
78
  import type { SegmentedButton$SelectionChangeEvent } from "sap/m/SegmentedButton";
79
79
  import SegmentedButton from "sap/m/SegmentedButton";
80
80
  import SegmentedButtonItem from "sap/m/SegmentedButtonItem";
81
+ import ToolbarSeparator from "sap/m/ToolbarSeparator";
81
82
  import type { OverflowToolbarPriority } from "sap/m/library";
82
83
  import Device from "sap/ui/Device";
84
+ import type UI5Event from "sap/ui/base/Event";
83
85
  import type { CommandExecution$ExecuteEvent } from "sap/ui/core/CommandExecution";
84
86
  import CustomData from "sap/ui/core/CustomData";
85
87
  import Element from "sap/ui/core/Element";
88
+ import InvisibleText from "sap/ui/core/InvisibleText";
86
89
  import { Dock } from "sap/ui/core/Popup";
87
90
  import type { VariantManagement$SaveEvent, VariantManagement$SelectEvent } from "sap/ui/fl/variants/VariantManagement";
88
91
  import VariantManagement from "sap/ui/fl/variants/VariantManagement";
@@ -119,7 +122,7 @@ type ChartDelegate = {
119
122
  };
120
123
  export type ActionOrActionGroup = Record<string, Action | ExtendedActionGroup>;
121
124
  export type CustomAndAction = CustomAction & (Action | ActionGroup);
122
- type CustomToolbarMenuAction = {
125
+ export type CustomToolbarMenuAction = {
123
126
  id: string;
124
127
  text: string | undefined;
125
128
  visible: string | undefined;
@@ -130,6 +133,7 @@ type CustomToolbarMenuAction = {
130
133
  actions?: CustomAction;
131
134
  priority?: OverflowToolbarPriority;
132
135
  group?: number;
136
+ overflowGroup?: number;
133
137
  };
134
138
 
135
139
  enum personalizationValues {
@@ -207,6 +211,8 @@ type ActionProperties = {
207
211
  enabled: boolean;
208
212
  position?: object;
209
213
  menu?: string[];
214
+ group?: number;
215
+ overflowGroup?: number;
210
216
  };
211
217
 
212
218
  type ToolbarAction = MenuItem | ActionToolbarAction | undefined;
@@ -258,6 +264,7 @@ function getContentId(macroId: string): string {
258
264
  function getExtraParams(chartBlock: ChartBlock, visualizationPath: string | undefined): Record<string, object> {
259
265
  const extraParams: Record<string, object> = {};
260
266
  const customActions: Record<string, object> = {};
267
+ const actionOverflowGroups: OverflowGroupsConfiguration = {};
261
268
 
262
269
  if (chartBlock.actions) {
263
270
  Object.values(chartBlock.actions)?.forEach((action: Action | ActionGroup) => {
@@ -272,7 +279,9 @@ function getExtraParams(chartBlock: ChartBlock, visualizationPath: string | unde
272
279
  placement: action.placement,
273
280
  anchor: action.anchor
274
281
  },
275
- action.actions.map((_, index) => action.key + "_Menu_" + index)
282
+ action.actions.map((_, index) => action.key + "_Menu_" + index),
283
+ action.group,
284
+ action.overflowGroup
276
285
  );
277
286
 
278
287
  action.actions?.forEach((act: Action, index: number) => {
@@ -295,14 +304,23 @@ function getExtraParams(chartBlock: ChartBlock, visualizationPath: string | unde
295
304
  {
296
305
  placement: action.placement,
297
306
  anchor: action.anchor
298
- }
307
+ },
308
+ undefined,
309
+ action.group,
310
+ action.overflowGroup
299
311
  );
300
312
  }
301
313
  });
302
314
  }
315
+ if (chartBlock.actionOverflowGroups) {
316
+ Object.values(chartBlock.actionOverflowGroups)?.forEach((overflowGroup) => {
317
+ actionOverflowGroups[overflowGroup.overflowGroup.toString()] = { showSeparator: overflowGroup.showSeparator ?? false };
318
+ });
319
+ }
303
320
  if (visualizationPath && chartBlock.actions) {
304
321
  extraParams[visualizationPath] = {
305
- actions: customActions
322
+ actions: customActions,
323
+ overflowGroups: actionOverflowGroups
306
324
  };
307
325
  }
308
326
 
@@ -316,7 +334,9 @@ function getActionProperties(
316
334
  requiresSelection: boolean,
317
335
  enabled: boolean,
318
336
  position?: object,
319
- menu?: string[]
337
+ menu?: string[],
338
+ group?: number,
339
+ overflowGroup?: number
320
340
  ): ActionProperties {
321
341
  const actionProperties: ActionProperties = {
322
342
  key,
@@ -324,7 +344,9 @@ function getActionProperties(
324
344
  __noWrap: true,
325
345
  press,
326
346
  requiresSelection,
327
- enabled
347
+ enabled,
348
+ group,
349
+ overflowGroup
328
350
  };
329
351
 
330
352
  if (position) {
@@ -1064,6 +1086,8 @@ function getActions(chartBlock: ChartBlock): ToolbarAction[] {
1064
1086
  if (action.annotationPath || (action.type === "Menu" && !action.id?.startsWith("CustomAction"))) {
1065
1087
  // Load annotation based actions
1066
1088
  return getAction(action, chartBlock._chartContext, false, chartBlock);
1089
+ } else if (action.type === "Separator") {
1090
+ return getSeparator(action);
1067
1091
  } else if (action.hasOwnProperty("noWrap")) {
1068
1092
  // Load XML or manifest based actions / action groups
1069
1093
  return getCustomActions(action as CustomAndAction, chartBlock._chartContext, chartBlock);
@@ -1181,8 +1205,9 @@ function getActionToolbarMenuAction(
1181
1205
  useDefaultActionOnly={props.useDefaultActionOnly}
1182
1206
  buttonMode={props.buttonMode}
1183
1207
  menuPosition={Dock.BeginBottom}
1184
- defaultAction={"props.defaultAction" as unknown as () => void}
1208
+ defaultAction={props.defaultAction as unknown as (oEvent: UI5Event) => void}
1185
1209
  icon={isAIOperation ? aiIcon : undefined}
1210
+ ariaDescribedBy={isAIOperation ? [`${chartBlock.getId()}--fe::AiAction::AriaText`] : undefined}
1186
1211
  >
1187
1212
  {{
1188
1213
  menu: <Menu>{aMenuItems}</Menu>,
@@ -1213,6 +1238,7 @@ function getAction(action: BaseAction | CustomAction, chartContext: Context, isM
1213
1238
  enabled={action.enabled}
1214
1239
  menuPosition={Dock.BeginBottom}
1215
1240
  icon={action?.isAIOperation === true ? aiIcon : undefined}
1241
+ ariaDescribedBy={action?.isAIOperation === true ? [`${chartBlock.getId()}--fe::AiAction::AriaText`] : undefined}
1216
1242
  >
1217
1243
  {{
1218
1244
  menu: <Menu>{menuItems}</Menu>,
@@ -1225,6 +1251,18 @@ function getAction(action: BaseAction | CustomAction, chartContext: Context, isM
1225
1251
  return undefined;
1226
1252
  }
1227
1253
 
1254
+ function getSeparator(action: BaseAction): ToolbarAction {
1255
+ return (
1256
+ <ActionToolbarAction>
1257
+ <ToolbarSeparator>
1258
+ {{
1259
+ layoutData: <OverflowToolbarLayoutData group={action.group}></OverflowToolbarLayoutData>
1260
+ }}
1261
+ </ToolbarSeparator>
1262
+ </ActionToolbarAction>
1263
+ );
1264
+ }
1265
+
1228
1266
  function getNavigationActions(
1229
1267
  action: BaseAction | CustomAction,
1230
1268
  dataFieldContext: Context,
@@ -1324,7 +1362,8 @@ function getActionToolbarAction(
1324
1362
  controlId: chartBlock._blockId,
1325
1363
  operationAvailableMap: chartOperationAvailableMap,
1326
1364
  model: view.getModel(),
1327
- label: dataField?.Label as string
1365
+ label: dataField?.Label as string,
1366
+ disableStrictHandling: action.disableStrictHandling
1328
1367
  };
1329
1368
  controller.editFlow.invokeAction(dataField?.Action as string, params);
1330
1369
  } else if (action.type === "ForNavigation") {
@@ -1368,6 +1407,7 @@ function buildAction(
1368
1407
  enabled={toolbarAction.enabled}
1369
1408
  visible={toolbarAction.visible}
1370
1409
  icon={action.isAIOperation === true ? aiIcon : undefined}
1410
+ ariaDescribedBy={action?.isAIOperation === true ? [`${chartBlock.getId()}--fe::AiAction::AriaText`] : undefined}
1371
1411
  >
1372
1412
  {{
1373
1413
  layoutData: <OverflowToolbarLayoutData priority={action.priority} group={action.group} />
@@ -1447,7 +1487,8 @@ function getStandardActionPressWithNoCommand(
1447
1487
  controlId: chartBlock?._blockId,
1448
1488
  operationAvailableMap: chartOperationAvailableMap,
1449
1489
  model: view.getModel(),
1450
- label: dataField?.Label as string
1490
+ label: dataField?.Label as string,
1491
+ disableStrictHandling: action.disableStrictHandling
1451
1492
  };
1452
1493
  controller.editFlow.invokeAction(dataField?.Action as string, params);
1453
1494
  } else if (action.type === "ForNavigation") {
@@ -1904,7 +1945,11 @@ export function getMdcChartTemplate(
1904
1945
  >
1905
1946
  {{
1906
1947
  customData: getCustomData(chartBlock),
1907
- dependents: [getDependents(chartBlock, chartBlock._chartContext), getPersistenceProvider(chartBlock)],
1948
+ dependents: [
1949
+ getDependents(chartBlock, chartBlock._chartContext),
1950
+ getPersistenceProvider(chartBlock),
1951
+ getAccAIActionInvisibleText(chartBlock)
1952
+ ],
1908
1953
  items: getItems(chartBlock),
1909
1954
  actions: chartBlock.chartActions ? getToolbarActions(chartBlock) : chartBlock._blockActions,
1910
1955
  variant: createVariantManagement(chartBlock),
@@ -1913,3 +1958,17 @@ export function getMdcChartTemplate(
1913
1958
  </MdcChart>
1914
1959
  );
1915
1960
  }
1961
+
1962
+ /**
1963
+ * This function returns the InvisibleText for the AI Action buttons.
1964
+ * @param chartBlock ChartBlock instance
1965
+ * @returns InvisibleText control
1966
+ */
1967
+ function getAccAIActionInvisibleText(chartBlock: ChartBlock): InvisibleText {
1968
+ const invisibleTextAccAIAction = new InvisibleText({
1969
+ id: `${chartBlock.getId()}--fe::AiAction::AriaText`,
1970
+ text: "{sap.fe.i18n>C_ACCESSIBILITY_AI_ACTION_ARIA_TEXT}"
1971
+ });
1972
+ invisibleTextAccAIAction.toStatic();
1973
+ return invisibleTextAccAIAction;
1974
+ }
@@ -0,0 +1,62 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/base/ClassSupport", "sap/fe/macros/controls/BuildingBlockObjectProperty"], function (ClassSupport, BuildingBlockObjectProperty) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
9
+ var _exports = {};
10
+ var property = ClassSupport.property;
11
+ var defineUI5Class = ClassSupport.defineUI5Class;
12
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
13
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
14
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
15
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
16
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
17
+ /**
18
+ * Definition of an overflow group to be used in the chart toolbar
19
+ * @public
20
+ */
21
+ let OverflowGroup = (_dec = defineUI5Class("sap.fe.macros.chart.OverflowGroup"), _dec2 = property({
22
+ type: "int",
23
+ required: true
24
+ }), _dec3 = property({
25
+ type: "boolean"
26
+ }), _dec(_class = (_class2 = /*#__PURE__*/function (_BuildingBlockObjectP) {
27
+ function OverflowGroup() {
28
+ var _this;
29
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
30
+ args[_key] = arguments[_key];
31
+ }
32
+ _this = _BuildingBlockObjectP.call(this, ...args) || this;
33
+ /**
34
+ * Defines the group of the toolbar separator in the overflow toolbar.
35
+ * @public
36
+ */
37
+ _initializerDefineProperty(_this, "overflowGroup", _descriptor, _this);
38
+ /**
39
+ * Defines if a toolbar separator should be displayed.
40
+ * @public
41
+ */
42
+ _initializerDefineProperty(_this, "showSeparator", _descriptor2, _this);
43
+ return _this;
44
+ }
45
+ _exports = OverflowGroup;
46
+ _inheritsLoose(OverflowGroup, _BuildingBlockObjectP);
47
+ return OverflowGroup;
48
+ }(BuildingBlockObjectProperty), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "overflowGroup", [_dec2], {
49
+ configurable: true,
50
+ enumerable: true,
51
+ writable: true,
52
+ initializer: null
53
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "showSeparator", [_dec3], {
54
+ configurable: true,
55
+ enumerable: true,
56
+ writable: true,
57
+ initializer: null
58
+ }), _class2)) || _class);
59
+ _exports = OverflowGroup;
60
+ return _exports;
61
+ }, false);
62
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPdmVyZmxvd0dyb3VwIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJwcm9wZXJ0eSIsInR5cGUiLCJyZXF1aXJlZCIsIl9kZWMzIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9CdWlsZGluZ0Jsb2NrT2JqZWN0UCIsIl90aGlzIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9leHBvcnRzIiwiX2luaGVyaXRzTG9vc2UiLCJCdWlsZGluZ0Jsb2NrT2JqZWN0UHJvcGVydHkiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwicHJvdG90eXBlIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk92ZXJmbG93R3JvdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEJ1aWxkaW5nQmxvY2tPYmplY3RQcm9wZXJ0eSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9CdWlsZGluZ0Jsb2NrT2JqZWN0UHJvcGVydHlcIjtcbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhbiBvdmVyZmxvdyBncm91cCB0byBiZSB1c2VkIGluIHRoZSBjaGFydCB0b29sYmFyXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5tYWNyb3MuY2hhcnQuT3ZlcmZsb3dHcm91cFwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3ZlcmZsb3dHcm91cCBleHRlbmRzIEJ1aWxkaW5nQmxvY2tPYmplY3RQcm9wZXJ0eSB7XG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBncm91cCBvZiB0aGUgdG9vbGJhciBzZXBhcmF0b3IgaW4gdGhlIG92ZXJmbG93IHRvb2xiYXIuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwiaW50XCIsIHJlcXVpcmVkOiB0cnVlIH0pXG5cdG92ZXJmbG93R3JvdXAhOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgaWYgYSB0b29sYmFyIHNlcGFyYXRvciBzaG91bGQgYmUgZGlzcGxheWVkLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHJvcGVydHkoeyB0eXBlOiBcImJvb2xlYW5cIiB9KVxuXHRzaG93U2VwYXJhdG9yPzogYm9vbGVhbjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztFQUVBO0FBQ0E7QUFDQTtBQUNBO0VBSEEsSUFLcUJBLGFBQWEsSUFBQUMsSUFBQSxHQURqQ0MsY0FBYyxDQUFDLG1DQUFtQyxDQUFDLEVBQUFDLEtBQUEsR0FNbERDLFFBQVEsQ0FBQztJQUFFQyxJQUFJLEVBQUUsS0FBSztJQUFFQyxRQUFRLEVBQUU7RUFBSyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQU96Q0gsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRTtFQUFVLENBQUMsQ0FBQyxFQUFBSixJQUFBLENBQUFPLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMscUJBQUE7SUFBQSxTQUFBVixjQUFBO01BQUEsSUFBQVcsS0FBQTtNQUFBLFNBQUFDLElBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQUFDLElBQUEsT0FBQUMsS0FBQSxDQUFBSixJQUFBLEdBQUFLLElBQUEsTUFBQUEsSUFBQSxHQUFBTCxJQUFBLEVBQUFLLElBQUE7UUFBQUYsSUFBQSxDQUFBRSxJQUFBLElBQUFKLFNBQUEsQ0FBQUksSUFBQTtNQUFBO01BQUFOLEtBQUEsR0FBQUQscUJBQUEsQ0FBQVEsSUFBQSxVQUFBSCxJQUFBO01BWDlCO0FBQ0Q7QUFDQTtBQUNBO01BSENJLDBCQUFBLENBQUFSLEtBQUEsbUJBQUFTLFdBQUEsRUFBQVQsS0FBQTtNQU9BO0FBQ0Q7QUFDQTtBQUNBO01BSENRLDBCQUFBLENBQUFSLEtBQUEsbUJBQUFVLFlBQUEsRUFBQVYsS0FBQTtNQUFBLE9BQUFBLEtBQUE7SUFBQTtJQUFBVyxRQUFBLEdBQUF0QixhQUFBO0lBQUF1QixjQUFBLENBQUF2QixhQUFBLEVBQUFVLHFCQUFBO0lBQUEsT0FBQVYsYUFBQTtFQUFBLEVBUjBDd0IsMkJBQTJCLEdBQUFKLFdBQUEsR0FBQUsseUJBQUEsQ0FBQWhCLE9BQUEsQ0FBQWlCLFNBQUEsb0JBQUF2QixLQUFBO0lBQUF3QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQVQsWUFBQSxHQUFBSSx5QkFBQSxDQUFBaEIsT0FBQSxDQUFBaUIsU0FBQSxvQkFBQW5CLEtBQUE7SUFBQW9CLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBckIsT0FBQSxNQUFBRCxNQUFBO0VBQUFjLFFBQUEsR0FBQXRCLGFBQUE7RUFBQSxPQUFBc0IsUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,22 @@
1
+ import { defineUI5Class, property } from "sap/fe/base/ClassSupport";
2
+ import BuildingBlockObjectProperty from "sap/fe/macros/controls/BuildingBlockObjectProperty";
3
+ /**
4
+ * Definition of an overflow group to be used in the chart toolbar
5
+ * @public
6
+ */
7
+ @defineUI5Class("sap.fe.macros.chart.OverflowGroup")
8
+ export default class OverflowGroup extends BuildingBlockObjectProperty {
9
+ /**
10
+ * Defines the group of the toolbar separator in the overflow toolbar.
11
+ * @public
12
+ */
13
+ @property({ type: "int", required: true })
14
+ overflowGroup!: number;
15
+
16
+ /**
17
+ * Defines if a toolbar separator should be displayed.
18
+ * @public
19
+ */
20
+ @property({ type: "boolean" })
21
+ showSeparator?: boolean;
22
+ }
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/macros/controls/filterbar/FilterContainer", "sap/fe/macros/controls/filterbar/VisualFilterContainer", "sap/ui/core/Element", "sap/ui/mdc/FilterBar", "sap/ui/mdc/filterbar/aligned/FilterItemLayout", "./filterbar/utils/VisualFilterUtils"], function (Log, ClassSupport, FilterContainer, VisualFilterContainer, Element, MdcFilterBar, FilterItemLayout, VisualFilterUtils) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/helpers/PromiseKeeper", "sap/fe/macros/controls/filterbar/FilterContainer", "sap/fe/macros/controls/filterbar/VisualFilterContainer", "sap/ui/core/Element", "sap/ui/mdc/FilterBar", "sap/ui/mdc/filterbar/aligned/FilterItemLayout", "./filterbar/utils/VisualFilterUtils"], function (Log, ClassSupport, PromiseKeeper, FilterContainer, VisualFilterContainer, Element, MdcFilterBar, FilterItemLayout, VisualFilterUtils) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor, _descriptor2, _descriptor3;
@@ -44,11 +44,47 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/macros/contro
44
44
  _inheritsLoose(FilterBar, _MdcFilterBar);
45
45
  var _proto = FilterBar.prototype;
46
46
  _proto._initializeStatus = async function _initializeStatus() {
47
- await this.waitForInitialization();
47
+ // Promise keeper to hold the process.
48
+ this._initializedPromiseKeeper = new PromiseKeeper();
49
+
50
+ // Awaits
51
+ await this.initializedWithMetadata();
52
+ await this.waitForModelToBeSet();
53
+ this._initializedPromiseKeeper.resolve();
48
54
  this._isInitialized = true;
49
55
  };
56
+ _proto.waitForModelToBeSet = async function waitForModelToBeSet() {
57
+ if (this.getModel()) {
58
+ return;
59
+ }
60
+ // wait for deafault model to be set.
61
+ const modelIsSetPromiseKeeper = new PromiseKeeper();
62
+ const fnCheckAndReset = e => {
63
+ const filterbar = e.getSource();
64
+ if (filterbar.getModel()) {
65
+ // default model is set.
66
+ filterbar.detachModelContextChange(fnCheckAndReset);
67
+ modelIsSetPromiseKeeper?.resolve();
68
+ }
69
+ };
70
+ this.attachModelContextChange(fnCheckAndReset);
71
+ return modelIsSetPromiseKeeper.promise;
72
+ }
73
+
74
+ /**
75
+ * Checks if the FilterBar is fully initialized.
76
+ * @returns True if the FilterBar is initialized, false otherwise.
77
+ */;
50
78
  _proto.isInitialized = function isInitialized() {
51
79
  return !!this._isInitialized;
80
+ }
81
+
82
+ /**
83
+ * Async equivalent of 'isInitialized' to perform filter bar interactions after the filter bar is ready.
84
+ * @returns Promise that resolves when the filter bar is initialized.
85
+ */;
86
+ _proto.whenInitialized = async function whenInitialized() {
87
+ return this._initializedPromiseKeeper?.promise;
52
88
  };
53
89
  _proto.setToggleControl = function setToggleControl(vToggle) {
54
90
  if (typeof vToggle === "string") {
@@ -239,4 +275,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/macros/contro
239
275
  }), _class2)) || _class);
240
276
  return FilterBar;
241
277
  }, false);
242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWSVNVQUxfRklMVEVSX0NPTlRBSU5FUiIsIkZJTFRFUl9DT05UQUlORVIiLCJGaWx0ZXJCYXIiLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsInByb3BlcnR5IiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsIl9kZWMzIiwiX2RlYzQiLCJhc3NvY2lhdGlvbiIsIm11bHRpcGxlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9NZGNGaWx0ZXJCYXIiLCJpZE9yUHJvcHMiLCJzZXR0aW5ncyIsIl90aGlzIiwicHJvcGVydHlJbmZvIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfaXNJbml0aWFsaXplZCIsIl9pbml0aWFsaXplU3RhdHVzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJ3YWl0Rm9ySW5pdGlhbGl6YXRpb24iLCJpc0luaXRpYWxpemVkIiwic2V0VG9nZ2xlQ29udHJvbCIsInZUb2dnbGUiLCJfb1NlZ21lbnRlZEJ1dHRvbiIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInRvZ2dsZUNvbnRyb2wiLCJkZXRhY2hFdmVudCIsIl90b2dnbGVMYXlvdXQiLCJiaW5kIiwiYXR0YWNoRXZlbnQiLCJzZXRBc3NvY2lhdGlvbiIsInRoZW4iLCJ0YXJnZXRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIl9vRmlsdGVyQmFyTGF5b3V0IiwiaXNBIiwiX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQiLCJWaXN1YWxGaWx0ZXJDb250YWluZXIiLCJzZXRTaG93QWRhcHRGaWx0ZXJzQnV0dG9uIiwib0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQiLCJvRmlsdGVySXRlbXMiLCJnZXRGaWx0ZXJJdGVtcyIsImFGaWx0ZXJGaWVsZHMiLCJnZXRBbGxGaWx0ZXJGaWVsZHMiLCJhU29ydGVkRmlsdGVyRmllbGRzIiwiZ2V0U29ydGVkRmlsdGVyRmllbGRzIiwiYUJ1dHRvbnMiLCJnZXRBbGxCdXR0b25zIiwiYVZpc3VhbEZpbHRlckZpZWxkcyIsImdldEFsbFZpc3VhbEZpbHRlckZpZWxkcyIsInNldEFsbEZpbHRlckZpZWxkcyIsImZvckVhY2giLCJvRmlsdGVyRmllbGQiLCJpSW5kZXgiLCJyZW1vdmVGaWx0ZXJGaWVsZCIsImluc2VydEZpbHRlckZpZWxkIiwib0J1dHRvbiIsInJlbW92ZUJ1dHRvbiIsImFkZEJ1dHRvbiIsInNldEFnZ3JlZ2F0aW9uIiwiaW52YWxpZGF0ZSIsImNhdGNoIiwiZXJyb3IiLCJMb2ciLCJhRmlsdGVySXRlbXMiLCJhRmlsdGVySWRzIiwib0ZpbHRlckl0ZW0iLCJwdXNoIiwiZ2V0SWQiLCJzb3J0IiwiYUZpcnN0SXRlbSIsImFTZWNvbmRJdGVtIiwic0ZpcnN0SXRlbVZGSWQiLCJzU2Vjb25kSXRlbVZGSWQiLCJnZXRDb250ZW50Iiwib0lubmVyQ29udHJvbCIsImluZGV4T2YiLCJfY3JlYXRlSW5uZXJMYXlvdXQiLCJGaWx0ZXJDb250YWluZXIiLCJfY0xheW91dEl0ZW0iLCJGaWx0ZXJJdGVtTGF5b3V0IiwiZ2V0SW5uZXIiLCJhZGRTdHlsZUNsYXNzIiwiX2FkZEJ1dHRvbnMiLCJvSW5uZXJMYXlvdXQiLCJvRmlsdGVyQ29udGFpbmVySW5uZXJMYXlvdXRFdmVudERlbGVnYXRlIiwib25CZWZvcmVSZW5kZXJpbmciLCJpbml0aWFsTGF5b3V0IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJleGl0IiwiZ2V0U2VnbWVudGVkQnV0dG9uIiwiZW5hYmxlUmVxdWVzdHMiLCJlbmFibGUiLCJkaWZmU3RhdGUiLCJzZXRTdXNwZW5kU2VsZWN0aW9uIiwiX2VuYWJsZVZpc3VhbEZpbHRlckNoYXJ0QmluZGluZ3MiLCJfZ2V0RmlsdGVyTGF5b3V0QnlUeXBlIiwibGF5b3V0Q2xhc3NOYW1lIiwicmV0RmlsdGVyTGF5b3V0IiwidW5kZWZpbmVkIiwidmlzdWFsRmlsdGVyTGF5b3V0IiwiZW5hYmxlQ2hhcnRCaW5kaW5nIiwiY29tcGFjdEZpbHRlckxheW91dCIsInZpc3VhbEZpbHRlcnMiLCJWaXN1YWxGaWx0ZXJVdGlscyIsIk1kY0ZpbHRlckJhciIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRmlsdGVyQmFyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhc3NvY2lhdGlvbiwgZGVmaW5lVUk1Q2xhc3MsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEZpbHRlckNvbnRhaW5lciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9maWx0ZXJiYXIvRmlsdGVyQ29udGFpbmVyXCI7XG5pbXBvcnQgVmlzdWFsRmlsdGVyQ29udGFpbmVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL2ZpbHRlcmJhci9WaXN1YWxGaWx0ZXJDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIFZpc3VhbEZpbHRlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy92aXN1YWxmaWx0ZXJzL1Zpc3VhbEZpbHRlclwiO1xuaW1wb3J0IHR5cGUgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCB0eXBlIFNlZ21lbnRlZEJ1dHRvbiBmcm9tIFwic2FwL20vU2VnbWVudGVkQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEVsZW1lbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgeyAkRmlsdGVyQmFyU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBNZGNGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgSUZpbHRlckNvbnRhaW5lciBmcm9tIFwic2FwL3VpL21kYy9maWx0ZXJiYXIvSUZpbHRlckNvbnRhaW5lclwiO1xuaW1wb3J0IEZpbHRlckl0ZW1MYXlvdXQgZnJvbSBcInNhcC91aS9tZGMvZmlsdGVyYmFyL2FsaWduZWQvRmlsdGVySXRlbUxheW91dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlcm5hbFN0YXRlVHlwZSB9IGZyb20gXCIuLi92YWx1ZWhlbHAvVmFsdWVIZWxwRGVsZWdhdGVcIjtcbmltcG9ydCBWaXN1YWxGaWx0ZXJVdGlscyBmcm9tIFwiLi9maWx0ZXJiYXIvdXRpbHMvVmlzdWFsRmlsdGVyVXRpbHNcIjtcblxuY29uc3QgVklTVUFMX0ZJTFRFUl9DT05UQUlORVIgPSBcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclwiLFxuXHRGSUxURVJfQ09OVEFJTkVSID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLmZpbHRlcmJhci5GaWx0ZXJDb250YWluZXJcIjtcbnR5cGUgQ29udGFpbmVyVHlwZSA9IHR5cGVvZiBWSVNVQUxfRklMVEVSX0NPTlRBSU5FUiB8IHR5cGVvZiBGSUxURVJfQ09OVEFJTkVSO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLkZpbHRlckJhclwiKVxuY2xhc3MgRmlsdGVyQmFyIGV4dGVuZHMgTWRjRmlsdGVyQmFyIHtcblx0QHByb3BlcnR5KHsgdHlwZTogXCJzdHJpbmdcIiwgZGVmYXVsdFZhbHVlOiBcImNvbXBhY3RcIiB9KVxuXHRpbml0aWFsTGF5b3V0ITogc3RyaW5nO1xuXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwiYm9vbGVhblwiLCBkZWZhdWx0VmFsdWU6IGZhbHNlIH0pXG5cdGRpc2FibGVEcmFmdEVkaXRTdGF0ZUZpbHRlciE6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIENvbnRyb2wgd2hpY2ggYWxsb3dzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB2aXN1YWwgYW5kIG5vcm1hbCBmaWx0ZXIgbGF5b3V0c1xuXHQgKi9cblx0QGFzc29jaWF0aW9uKHtcblx0XHR0eXBlOiBcInNhcC5tLlNlZ21lbnRlZEJ1dHRvblwiLFxuXHRcdG11bHRpcGxlOiBmYWxzZVxuXHR9KVxuXHR0b2dnbGVDb250cm9sITogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JQcm9wcz86IFByb3BlcnRpZXNPZjxGaWx0ZXJCYXI+ICYgJEZpbHRlckJhclNldHRpbmdzLCBzZXR0aW5ncz86IFByb3BlcnRpZXNPZjxGaWx0ZXJCYXI+ICYgJEZpbHRlckJhclNldHRpbmdzKSB7XG5cdFx0ZGVsZXRlIGlkT3JQcm9wcz8ucHJvcGVydHlJbmZvO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncz8ucHJvcGVydHlJbmZvO1xuXHRcdHN1cGVyKGlkT3JQcm9wcyBhcyB1bmtub3duIGFzIHN0cmluZywgc2V0dGluZ3MpO1xuXHRcdHRoaXMuX2luaXRpYWxpemVTdGF0dXMoKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgX2luaXRpYWxpemVTdGF0dXMoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5pdGlhbGl6YXRpb24oKTtcblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblx0fVxuXG5cdGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5faXNJbml0aWFsaXplZDtcblx0fVxuXG5cdHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuXHRwcml2YXRlIF9vU2VnbWVudGVkQnV0dG9uPzogU2VnbWVudGVkQnV0dG9uO1xuXG5cdHByaXZhdGUgX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQ/OiBJRmlsdGVyQ29udGFpbmVyO1xuXG5cdHByaXZhdGUgX29GaWx0ZXJCYXJMYXlvdXQhOiBJRmlsdGVyQ29udGFpbmVyO1xuXG5cdHByaXZhdGUgX2NMYXlvdXRJdGVtOiB0eXBlb2YgRmlsdGVySXRlbUxheW91dDtcblxuXHRzZXRUb2dnbGVDb250cm9sKHZUb2dnbGU6IHN0cmluZyB8IFNlZ21lbnRlZEJ1dHRvbik6IHZvaWQge1xuXHRcdGlmICh0eXBlb2YgdlRvZ2dsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dGhpcy5fb1NlZ21lbnRlZEJ1dHRvbiA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQodlRvZ2dsZSkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vU2VnbWVudGVkQnV0dG9uID0gdlRvZ2dsZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50b2dnbGVDb250cm9sICYmIHRoaXMuX29TZWdtZW50ZWRCdXR0b24pIHtcblx0XHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24uZGV0YWNoRXZlbnQoXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5fdG9nZ2xlTGF5b3V0LmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fb1NlZ21lbnRlZEJ1dHRvbikge1xuXHRcdFx0dGhpcy5fb1NlZ21lbnRlZEJ1dHRvbi5hdHRhY2hFdmVudChcInNlbGVjdGlvbkNoYW5nZVwiLCB0aGlzLl90b2dnbGVMYXlvdXQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHRcdHRoaXMuc2V0QXNzb2NpYXRpb24oXCJ0b2dnbGVDb250cm9sXCIsIHZUb2dnbGUsIHRydWUpO1xuXHR9XG5cblx0X3RvZ2dsZUxheW91dCgpOiB2b2lkIHtcblx0XHQvLyBTaW5jZSBwcmltYXJ5IGxheW91dCBpcyBhbHdheXMgY29tcGFjdFxuXHRcdC8vIGhlbmNlIHNldCB0aGUgc2Vjb25kYXJ5IGxheW91dCBhcyB2aXN1YWwgZmlsdGVyIG9ubHkgZm9yIHRoZSBmaXJzdCB0aW1lIG9ubHlcblx0XHR0aGlzLndhaXRGb3JJbml0aWFsaXphdGlvbigpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldEtleSA9IHRoaXMuX29TZWdtZW50ZWRCdXR0b24/LmdldFNlbGVjdGVkS2V5KCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQodGFyZ2V0S2V5ID09PSBcInZpc3VhbFwiICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9vRmlsdGVyQmFyTGF5b3V0Py5pc0E8VmlzdWFsRmlsdGVyQ29udGFpbmVyPihcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclwiKSkgfHxcblx0XHRcdFx0XHQodGFyZ2V0S2V5ID09PSBcImNvbXBhY3RcIiAmJlxuXHRcdFx0XHRcdFx0IXRoaXMuX29GaWx0ZXJCYXJMYXlvdXQ/LmlzQTxWaXN1YWxGaWx0ZXJDb250YWluZXI+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXCIpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0KSB7XG5cdFx0XHRcdFx0dGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dCA9IG5ldyBWaXN1YWxGaWx0ZXJDb250YWluZXIoKSBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250YWluZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBkbyBub3Qgc2hvdyBBZGFwdCBGaWx0ZXJzIEJ1dHRvbiBmb3IgdmlzdWFsIGxheW91dFxuXHRcdFx0XHRpZiAodGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dD8uaXNBPFZpc3VhbEZpbHRlckNvbnRhaW5lcj4oXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLmZpbHRlcmJhci5WaXN1YWxGaWx0ZXJDb250YWluZXJcIikpIHtcblx0XHRcdFx0XHR0aGlzLnNldFNob3dBZGFwdEZpbHRlcnNCdXR0b24oZmFsc2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2V0U2hvd0FkYXB0RmlsdGVyc0J1dHRvbih0cnVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGdldCBhbGwgZmlsdGVyIGZpZWxkcyBhbmQgYnV0dG9uIG9mIHRoZSBjdXJyZW50IGxheW91dFxuXHRcdFx0XHRjb25zdCBvQ3VycmVudEZpbHRlckJhckxheW91dCA9IHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQ7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJJdGVtcyA9IHRoaXMuZ2V0RmlsdGVySXRlbXMoKTtcblx0XHRcdFx0Y29uc3QgYUZpbHRlckZpZWxkcyA9IG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0LmdldEFsbEZpbHRlckZpZWxkcygpO1xuXHRcdFx0XHRjb25zdCBhU29ydGVkRmlsdGVyRmllbGRzID0gdGhpcy5nZXRTb3J0ZWRGaWx0ZXJGaWVsZHMob0ZpbHRlckl0ZW1zLCBhRmlsdGVyRmllbGRzKTtcblx0XHRcdFx0Y29uc3QgYUJ1dHRvbnMgPSBvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxCdXR0b25zKCk7XG5cdFx0XHRcdGNvbnN0IGFWaXN1YWxGaWx0ZXJGaWVsZHMgPVxuXHRcdFx0XHRcdG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0LmdldEFsbFZpc3VhbEZpbHRlckZpZWxkcyAmJlxuXHRcdFx0XHRcdChvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxWaXN1YWxGaWx0ZXJGaWVsZHMoKSBhcyBSZWNvcmQ8c3RyaW5nLCBWaXN1YWxGaWx0ZXI+IHwgdW5kZWZpbmVkKTtcblx0XHRcdFx0aWYgKHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQ/LmlzQTxWaXN1YWxGaWx0ZXJDb250YWluZXI+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dC5zZXRBbGxGaWx0ZXJGaWVsZHMoYVNvcnRlZEZpbHRlckZpZWxkcywgYVZpc3VhbEZpbHRlckZpZWxkcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdXNlIHNlY29uZGFyeSBmaWx0ZXIgYmFyIGxheW91dCBhcyBuZXcgbGF5b3V0XG5cdFx0XHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQgPSB0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0ITtcblxuXHRcdFx0XHQvLyBpbnNlcnQgYWxsIGZpbHRlciBmaWVsZHMgZnJvbSBjdXJyZW50IGxheW91dCB0byBuZXcgbGF5b3V0XG5cdFx0XHRcdGFGaWx0ZXJGaWVsZHMuZm9yRWFjaCgob0ZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCwgaUluZGV4OiBudW1iZXIpID0+IHtcblx0XHRcdFx0XHRvQ3VycmVudEZpbHRlckJhckxheW91dC5yZW1vdmVGaWx0ZXJGaWVsZChvRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuaW5zZXJ0RmlsdGVyRmllbGQob0ZpbHRlckZpZWxkLCBpSW5kZXgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly8gaW5zZXJ0IGFsbCBidXR0b25zIGZyb20gdGhlIGN1cnJlbnQgbGF5b3V0IHRvIHRoZSBuZXcgbGF5b3V0XG5cdFx0XHRcdGFCdXR0b25zLmZvckVhY2goKG9CdXR0b246IEJ1dHRvbikgPT4ge1xuXHRcdFx0XHRcdG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0LnJlbW92ZUJ1dHRvbihvQnV0dG9uKTtcblx0XHRcdFx0XHR0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LmFkZEJ1dHRvbihvQnV0dG9uKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gc2V0IHRoZSBjdXJyZW50IGZpbHRlciBiYXIgbGF5b3V0IHRvIHRoZSBzZWNvbmRhcnkgb25lXG5cdFx0XHRcdHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQgPSBvQ3VycmVudEZpbHRlckJhckxheW91dDtcblxuXHRcdFx0XHQvLyB1cGRhdGUgdGhlIGxheW91dCBhZ2dyZWdhdGlvbiBvZiB0aGUgZmlsdGVyIGJhciBhbmQgcmVyZW5kZXIgdGhlIHNhbWUuXG5cdFx0XHRcdHRoaXMuc2V0QWdncmVnYXRpb24oXCJsYXlvdXRcIiwgdGhpcy5fb0ZpbHRlckJhckxheW91dCwgdHJ1ZSk7XG5cdFx0XHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRnZXRTb3J0ZWRGaWx0ZXJGaWVsZHMoYUZpbHRlckl0ZW1zOiBGaWx0ZXJGaWVsZFtdLCBhRmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdKTogRmlsdGVyRmllbGRbXSB7XG5cdFx0Y29uc3QgYUZpbHRlcklkczogc3RyaW5nW10gPSBbXTtcblx0XHRhRmlsdGVySXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0ZpbHRlckl0ZW06IEZpbHRlckZpZWxkKSB7XG5cdFx0XHRhRmlsdGVySWRzLnB1c2gob0ZpbHRlckl0ZW0uZ2V0SWQoKSk7XG5cdFx0fSk7XG5cdFx0YUZpbHRlckZpZWxkcy5zb3J0KGZ1bmN0aW9uIChhRmlyc3RJdGVtOiBGaWx0ZXJGaWVsZCwgYVNlY29uZEl0ZW06IEZpbHRlckZpZWxkKSB7XG5cdFx0XHRsZXQgc0ZpcnN0SXRlbVZGSWQsIHNTZWNvbmRJdGVtVkZJZDtcblx0XHRcdChhRmlyc3RJdGVtLmdldENvbnRlbnQoKSBhcyB1bmtub3duIGFzIENvbnRyb2xbXSkuZm9yRWFjaChmdW5jdGlvbiAob0lubmVyQ29udHJvbDogQ29udHJvbCkge1xuXHRcdFx0XHRpZiAob0lubmVyQ29udHJvbC5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRcdHNGaXJzdEl0ZW1WRklkID0gb0lubmVyQ29udHJvbC5nZXRJZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdChhU2Vjb25kSXRlbS5nZXRDb250ZW50KCkgYXMgdW5rbm93biBhcyBDb250cm9sW10pLmZvckVhY2goZnVuY3Rpb24gKG9Jbm5lckNvbnRyb2w6IENvbnRyb2wpIHtcblx0XHRcdFx0aWYgKG9Jbm5lckNvbnRyb2wuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikpIHtcblx0XHRcdFx0XHRzU2Vjb25kSXRlbVZGSWQgPSBvSW5uZXJDb250cm9sLmdldElkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFGaWx0ZXJJZHMuaW5kZXhPZihzRmlyc3RJdGVtVkZJZCA/PyBcIlwiKSAtIGFGaWx0ZXJJZHMuaW5kZXhPZihzU2Vjb25kSXRlbVZGSWQgPz8gXCJcIik7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaWx0ZXJGaWVsZHM7XG5cdH1cblxuXHRfY3JlYXRlSW5uZXJMYXlvdXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb0ZpbHRlckJhckxheW91dCA9IG5ldyBGaWx0ZXJDb250YWluZXIoKTtcblx0XHR0aGlzLl9jTGF5b3V0SXRlbSA9IEZpbHRlckl0ZW1MYXlvdXQ7XG5cdFx0dGhpcy5fb0ZpbHRlckJhckxheW91dC5nZXRJbm5lcigpLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaU1kY0ZpbHRlckJhckJhc2VBRkxheW91dFwiKTtcblx0XHR0aGlzLl9hZGRCdXR0b25zKCk7XG5cblx0XHQvLyBUT0RPOiBDaGVjayB3aXRoIE1EQyBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gbG9hZCB2aXN1YWwgZmlsdGVyIG9uIHRoZSBiYXNpcyBvZiBjb250cm9sIHByb3BlcnR5XG5cdFx0Ly8gX2NyZWF0ZUlubmVyTGF5b3V0IGlzIGNhbGxlZCBvbiBJbml0IGJ5IHRoZSBmaWx0ZXIgYmFyIGJhc2UuXG5cdFx0Ly8gVGhpcyBtZWFuIHRoYXQgd2UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBjb250cm9sIHByb3BlcnRpZXMgeWV0XG5cdFx0Ly8gYW5kIGhlbmNlIHdlIGNhbm5vdCBkZWNpZGUgb24gdGhlIGJhc2lzIG9mIGNvbnRyb2wgcHJvcGVydGllcyB3aGV0aGVyIGluaXRpYWwgbGF5b3V0IHNob3VsZCBiZSBjb21wYWN0IG9yIHZpc3VhbFxuXHRcdC8vIEFzIGEgcmVzdWx0IHdlIGhhdmUgdG8gZG8gdGhpcyB3b3JrYXJvdW5kIHRvIGFsd2F5cyBsb2FkIHRoZSBjb21wYWN0IGxheW91dCBieSBkZWZhdWx0XG5cdFx0Ly8gQW5kIHRvb2dsZSB0aGUgc2FtZSBpbiBjYXNlIHRoZSBpbml0aWFsTGF5b3V0IHdhcyBzdXBwb3NlZCB0byBiZSB2aXN1YWwgZmlsdGVycy5cblx0XHRjb25zdCBvSW5uZXJMYXlvdXQgPSB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LmdldElubmVyKCk7XG5cdFx0Y29uc3Qgb0ZpbHRlckNvbnRhaW5lcklubmVyTGF5b3V0RXZlbnREZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlUmVuZGVyaW5nOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmluaXRpYWxMYXlvdXQgPT09IFwidmlzdWFsXCIpIHtcblx0XHRcdFx0XHR0aGlzLl90b2dnbGVMYXlvdXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvSW5uZXJMYXlvdXQucmVtb3ZlRXZlbnREZWxlZ2F0ZShvRmlsdGVyQ29udGFpbmVySW5uZXJMYXlvdXRFdmVudERlbGVnYXRlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9Jbm5lckxheW91dC5hZGRFdmVudERlbGVnYXRlKG9GaWx0ZXJDb250YWluZXJJbm5lckxheW91dEV2ZW50RGVsZWdhdGUpO1xuXG5cdFx0dGhpcy5zZXRBZ2dyZWdhdGlvbihcImxheW91dFwiLCB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LCB0cnVlKTtcblx0fVxuXG5cdGV4aXQoKTogdm9pZCB7XG5cdFx0c3VwZXIuZXhpdCgpO1xuXHRcdC8vIFNvbWV0aW1lcyB1cG9uIGV4dGVybmFsIG5hdmlnYXRpb24gdGhpcy5fU2VnbWVudGVkQnV0dG9uIGlzIGFscmVhZHkgZGVzdHJveWVkXG5cdFx0Ly8gc28gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCB0aGVuIG9ubHkgcmVtb3ZlIHN0dWZmXG5cdFx0aWYgKHRoaXMuX29TZWdtZW50ZWRCdXR0b24pIHtcblx0XHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24uZGV0YWNoRXZlbnQoXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5fdG9nZ2xlTGF5b3V0KTtcblx0XHRcdGRlbGV0ZSB0aGlzLl9vU2VnbWVudGVkQnV0dG9uO1xuXHRcdH1cblx0fVxuXG5cdGdldFNlZ21lbnRlZEJ1dHRvbigpOiBTZWdtZW50ZWRCdXR0b24gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9vU2VnbWVudGVkQnV0dG9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZSBvciBkaXNhYmxlIHJlcXVlc3RzIHRoYXQgYXJlIGluaXRpYXRlZCBieSB0aGUgRmlsdGVyQmFyLlxuXHQgKlxuXHQgKiBUbyBiZSB1c2VkIHRvIHN1c3BlbmQgb3IgcmVzdW1lIHJlcXVlc3RzKHRhYmxlIG9yIHZpc3VhbCBmaWx0ZXJzKSB3aGVuIHRoZSBmaWx0ZXIgYmFyIGlzIGJlaW5nIG1vZGlmaWVkIG9yIHdoZW4gdGhlIHVzZXIgaXMgcHJvZ3JhbW1hdGljYWxseSBpbnRlcmFjdGluZyB3aXRoIHRoZSBmaWx0ZXIgY29udHJvbHMuXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHZpc3VhbCBmaWx0ZXIgY2hhcnQgYmluZGluZyBzaG91bGQgYmUgcmVzdW1lZC9zdXNwZW5kZWQgYmFzZWQgb24gdGhlIGRpZmYgc3RhdGUsIGFuZCByZXN1bWVkIGFmdGVyIGNvbmRpdG9uIG1vZGVsIHVwZGF0ZS5cblx0ICogQHBhcmFtIGVuYWJsZSBFbmFibGUgb3IgZGlzYWJsZSByZXF1ZXN0c1xuXHQgKiBAcGFyYW0gZGlmZlN0YXRlIElmIHRoZXJlIGlzIGEgZGlmZmVybmNlIGluIHRoZSBleHRlcm5hbCBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHZpc3VhbCBmaWx0ZXIgaW4tcGFyYW1ldGVyc1xuXHQgKi9cblx0ZW5hYmxlUmVxdWVzdHMoZW5hYmxlOiBib29sZWFuLCBkaWZmU3RhdGU/OiBFeHRlcm5hbFN0YXRlVHlwZSk6IHZvaWQge1xuXHRcdHRoaXMuc2V0U3VzcGVuZFNlbGVjdGlvbighZW5hYmxlKTtcblx0XHQvLyBXZSBuZWVkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSB2aXN1YWwgZmlsdGVyIGNoYXJ0IGJpbmRpbmdzIGJhc2VkIG9uIGRpZmYgc3RhdGUuXG5cdFx0dGhpcy5fZW5hYmxlVmlzdWFsRmlsdGVyQ2hhcnRCaW5kaW5ncyhlbmFibGUsIGRpZmZTdGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaWx0ZXIgbGF5b3V0IGJ5IGl0cyB0eXBlLlxuXHQgKiBAcGFyYW0gbGF5b3V0Q2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmaWx0ZXIgbGF5b3V0IHRvIGJlIHJldHVybmVkLlxuXHQgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyIGxheW91dCB0byBiZSByZXR1cm5lZC5cblx0ICogQHR5cGVkZWYge0lGaWx0ZXJDb250YWluZXJ9IFQgVGhlIHR5cGUgb2YgdGhlIGZpbHRlciBsYXlvdXQgdG8gYmUgcmV0dXJuZWRcblx0ICogQHJldHVybnMgQ29ycmVzcG9uZGluZyBmaWx0ZXIgbGF5b3V0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cblx0ICovXG5cdF9nZXRGaWx0ZXJMYXlvdXRCeVR5cGU8VCBleHRlbmRzIElGaWx0ZXJDb250YWluZXI+KGxheW91dENsYXNzTmFtZTogQ29udGFpbmVyVHlwZSk6IFQgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHJldEZpbHRlckxheW91dCA9IHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuaXNBPFQ+KGxheW91dENsYXNzTmFtZSkgPyB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0IDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiAhcmV0RmlsdGVyTGF5b3V0ICYmIHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQ/LmlzQTxUPihsYXlvdXRDbGFzc05hbWUpXG5cdFx0XHQ/IHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXRcblx0XHRcdDogcmV0RmlsdGVyTGF5b3V0O1xuXHR9XG5cblx0X2VuYWJsZVZpc3VhbEZpbHRlckNoYXJ0QmluZGluZ3MoZW5hYmxlOiBib29sZWFuLCBkaWZmU3RhdGU/OiBFeHRlcm5hbFN0YXRlVHlwZSk6IHZvaWQge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0Y29uc3QgdmlzdWFsRmlsdGVyTGF5b3V0ID0gdGhpcy5fZ2V0RmlsdGVyTGF5b3V0QnlUeXBlPFZpc3VhbEZpbHRlckNvbnRhaW5lcj4oVklTVUFMX0ZJTFRFUl9DT05UQUlORVIpO1xuXHRcdGlmICh2aXN1YWxGaWx0ZXJMYXlvdXQpIHtcblx0XHRcdHZpc3VhbEZpbHRlckxheW91dC5lbmFibGVDaGFydEJpbmRpbmcoZW5hYmxlLCBkaWZmU3RhdGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIGluaXRpYWwgbGF5b3V0IGlzIGNvbXBhY3QsIHdlIGRvbid0IGhhdmUgdGhlIHZpc3VhbCBmaWx0ZXIgbGF5b3V0KGNvbnRhaW5lcikgYXZhaWxhYmxlIHlldCB1bnRpbCB0aGUgdXNlciB0b2dnbGVzIHRvIHZpc3VhbCBmaWx0ZXIgbGF5b3V0LlxuXHRcdC8vIFNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNvbXBhY3QgZmlsdGVyIGxheW91dCBoYXMgdmlzdWFsIGZpbHRlcnMgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSBjaGFydCBiaW5kaW5nIGZvciB0aG9zZSB2aXN1YWwgZmlsdGVycy5cblx0XHRjb25zdCBjb21wYWN0RmlsdGVyTGF5b3V0ID0gdGhpcy5fZ2V0RmlsdGVyTGF5b3V0QnlUeXBlPEZpbHRlckNvbnRhaW5lcj4oRklMVEVSX0NPTlRBSU5FUik7XG5cdFx0aWYgKGNvbXBhY3RGaWx0ZXJMYXlvdXQpIHtcblx0XHRcdGNvbnN0IHZpc3VhbEZpbHRlcnMgPSBjb21wYWN0RmlsdGVyTGF5b3V0LmdldEFsbFZpc3VhbEZpbHRlckZpZWxkcygpO1xuXHRcdFx0aWYgKHZpc3VhbEZpbHRlcnMpIHtcblx0XHRcdFx0VmlzdWFsRmlsdGVyVXRpbHMuZW5hYmxlQ2hhcnRCaW5kaW5nKHZpc3VhbEZpbHRlcnMsIGVuYWJsZSwgZGlmZlN0YXRlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmludGVyZmFjZSBGaWx0ZXJCYXIge1xuXHRfYWRkQnV0dG9ucygpOiB2b2lkO1xufVxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyQmFyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0VBa0JBLE1BQU1BLHVCQUF1QixHQUFHLHdEQUF3RDtJQUN2RkMsZ0JBQWdCLEdBQUcsa0RBQWtEO0VBQUMsSUFJakVDLFNBQVMsSUFBQUMsSUFBQSxHQURkQyxjQUFjLENBQUMsa0NBQWtDLENBQUMsRUFBQUMsS0FBQSxHQUVqREMsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRSxRQUFRO0lBQUVDLFlBQVksRUFBRTtFQUFVLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBR3JESCxRQUFRLENBQUM7SUFBRUMsSUFBSSxFQUFFLFNBQVM7SUFBRUMsWUFBWSxFQUFFO0VBQU0sQ0FBQyxDQUFDLEVBQUFFLEtBQUEsR0FNbERDLFdBQVcsQ0FBQztJQUNaSixJQUFJLEVBQUUsdUJBQXVCO0lBQzdCSyxRQUFRLEVBQUU7RUFDWCxDQUFDLENB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R2tFLFNBQVM7TUFDM0csT0FBTyxDQUFDRCxlQUFlLElBQUksSUFBSSxDQUFDL0QsMEJBQTBCLEVBQUVELEdBQUcsQ0FBSStELGVBQWUsQ0FBQyxHQUNoRixJQUFJLENBQUM5RCwwQkFBMEIsR0FDL0IrRCxlQUFlO0lBQ25CLENBQUM7SUFBQW5GLE1BQUEsQ0FFRGdGLGdDQUFnQyxHQUFoQyxTQUFBQSxnQ0FBZ0NBLENBQUNILE1BQWUsRUFBRUMsU0FBNkIsRUFBUTtNQUN0RjtNQUNBO01BQ0EsTUFBTU8sa0JBQWtCLEdBQUcsSUFBSSxDQUFDSixzQkFBc0IsQ0FBd0I3Ryx1QkFBdUIsQ0FBQztNQUN0RyxJQUFJaUgsa0JBQWtCLEVBQUU7UUFDdkJBLGtCQUFrQixDQUFDQyxrQkFBa0IsQ0FBQ1QsTUFBTSxFQUFFQyxTQUFTLENBQUM7UUFDeEQ7TUFDRDs7TUFFQTtNQUNBO01BQ0EsTUFBTVMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDTixzQkFBc0IsQ0FBa0I1RyxnQkFBZ0IsQ0FBQztNQUMxRixJQUFJa0gsbUJBQW1CLEVBQUU7UUFDeEIsTUFBTUMsYUFBYSxHQUFHRCxtQkFBbUIsQ0FBQ3RELHdCQUF3QixDQUFDLENBQUM7UUFDcEUsSUFBSXVELGFBQWEsRUFBRTtVQUNsQkMsaUJBQWlCLENBQUNILGtCQUFrQixDQUFDRSxhQUFhLEVBQUVYLE1BQU0sRUFBRUMsU0FBUyxDQUFDO1FBQ3ZFO01BQ0Q7SUFDRCxDQUFDO0lBQUEsT0FBQXhHLFNBQUE7RUFBQSxFQXRPc0JvSCxZQUFZLEdBQUFoRyxXQUFBLEdBQUFpRyx5QkFBQSxDQUFBekcsT0FBQSxDQUFBZSxTQUFBLG9CQUFBeEIsS0FBQTtJQUFBbUgsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFwRyxZQUFBLEdBQUFnRyx5QkFBQSxDQUFBekcsT0FBQSxDQUFBZSxTQUFBLGtDQUFBcEIsS0FBQTtJQUFBK0csWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFuRyxZQUFBLEdBQUErRix5QkFBQSxDQUFBekcsT0FBQSxDQUFBZSxTQUFBLG9CQUFBbkIsS0FBQTtJQUFBOEcsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUE3RyxPQUFBLE1BQUFELE1BQUE7RUFBQSxPQTJPckJYLFNBQVM7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
278
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWSVNVQUxfRklMVEVSX0NPTlRBSU5FUiIsIkZJTFRFUl9DT05UQUlORVIiLCJGaWx0ZXJCYXIiLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsInByb3BlcnR5IiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsIl9kZWMzIiwiX2RlYzQiLCJhc3NvY2lhdGlvbiIsIm11bHRpcGxlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9NZGNGaWx0ZXJCYXIiLCJpZE9yUHJvcHMiLCJzZXR0aW5ncyIsIl90aGlzIiwicHJvcGVydHlJbmZvIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfaXNJbml0aWFsaXplZCIsIl9pbml0aWFsaXplU3RhdHVzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJfaW5pdGlhbGl6ZWRQcm9taXNlS2VlcGVyIiwiUHJvbWlzZUtlZXBlciIsImluaXRpYWxpemVkV2l0aE1ldGFkYXRhIiwid2FpdEZvck1vZGVsVG9CZVNldCIsInJlc29sdmUiLCJnZXRNb2RlbCIsIm1vZGVsSXNTZXRQcm9taXNlS2VlcGVyIiwiZm5DaGVja0FuZFJlc2V0IiwiZSIsImZpbHRlcmJhciIsImdldFNvdXJjZSIsImRldGFjaE1vZGVsQ29udGV4dENoYW5nZSIsImF0dGFjaE1vZGVsQ29udGV4dENoYW5nZSIsInByb21pc2UiLCJpc0luaXRpYWxpemVkIiwid2hlbkluaXRpYWxpemVkIiwic2V0VG9nZ2xlQ29udHJvbCIsInZUb2dnbGUiLCJfb1NlZ21lbnRlZEJ1dHRvbiIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInRvZ2dsZUNvbnRyb2wiLCJkZXRhY2hFdmVudCIsIl90b2dnbGVMYXlvdXQiLCJiaW5kIiwiYXR0YWNoRXZlbnQiLCJzZXRBc3NvY2lhdGlvbiIsIndhaXRGb3JJbml0aWFsaXphdGlvbiIsInRoZW4iLCJ0YXJnZXRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIl9vRmlsdGVyQmFyTGF5b3V0IiwiaXNBIiwiX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQiLCJWaXN1YWxGaWx0ZXJDb250YWluZXIiLCJzZXRTaG93QWRhcHRGaWx0ZXJzQnV0dG9uIiwib0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQiLCJvRmlsdGVySXRlbXMiLCJnZXRGaWx0ZXJJdGVtcyIsImFGaWx0ZXJGaWVsZHMiLCJnZXRBbGxGaWx0ZXJGaWVsZHMiLCJhU29ydGVkRmlsdGVyRmllbGRzIiwiZ2V0U29ydGVkRmlsdGVyRmllbGRzIiwiYUJ1dHRvbnMiLCJnZXRBbGxCdXR0b25zIiwiYVZpc3VhbEZpbHRlckZpZWxkcyIsImdldEFsbFZpc3VhbEZpbHRlckZpZWxkcyIsInNldEFsbEZpbHRlckZpZWxkcyIsImZvckVhY2giLCJvRmlsdGVyRmllbGQiLCJpSW5kZXgiLCJyZW1vdmVGaWx0ZXJGaWVsZCIsImluc2VydEZpbHRlckZpZWxkIiwib0J1dHRvbiIsInJlbW92ZUJ1dHRvbiIsImFkZEJ1dHRvbiIsInNldEFnZ3JlZ2F0aW9uIiwiaW52YWxpZGF0ZSIsImNhdGNoIiwiZXJyb3IiLCJMb2ciLCJhRmlsdGVySXRlbXMiLCJhRmlsdGVySWRzIiwib0ZpbHRlckl0ZW0iLCJwdXNoIiwiZ2V0SWQiLCJzb3J0IiwiYUZpcnN0SXRlbSIsImFTZWNvbmRJdGVtIiwic0ZpcnN0SXRlbVZGSWQiLCJzU2Vjb25kSXRlbVZGSWQiLCJnZXRDb250ZW50Iiwib0lubmVyQ29udHJvbCIsImluZGV4T2YiLCJfY3JlYXRlSW5uZXJMYXlvdXQiLCJGaWx0ZXJDb250YWluZXIiLCJfY0xheW91dEl0ZW0iLCJGaWx0ZXJJdGVtTGF5b3V0IiwiZ2V0SW5uZXIiLCJhZGRTdHlsZUNsYXNzIiwiX2FkZEJ1dHRvbnMiLCJvSW5uZXJMYXlvdXQiLCJvRmlsdGVyQ29udGFpbmVySW5uZXJMYXlvdXRFdmVudERlbGVnYXRlIiwib25CZWZvcmVSZW5kZXJpbmciLCJpbml0aWFsTGF5b3V0IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJleGl0IiwiZ2V0U2VnbWVudGVkQnV0dG9uIiwiZW5hYmxlUmVxdWVzdHMiLCJlbmFibGUiLCJkaWZmU3RhdGUiLCJzZXRTdXNwZW5kU2VsZWN0aW9uIiwiX2VuYWJsZVZpc3VhbEZpbHRlckNoYXJ0QmluZGluZ3MiLCJfZ2V0RmlsdGVyTGF5b3V0QnlUeXBlIiwibGF5b3V0Q2xhc3NOYW1lIiwicmV0RmlsdGVyTGF5b3V0IiwidW5kZWZpbmVkIiwidmlzdWFsRmlsdGVyTGF5b3V0IiwiZW5hYmxlQ2hhcnRCaW5kaW5nIiwiY29tcGFjdEZpbHRlckxheW91dCIsInZpc3VhbEZpbHRlcnMiLCJWaXN1YWxGaWx0ZXJVdGlscyIsIk1kY0ZpbHRlckJhciIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRmlsdGVyQmFyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhc3NvY2lhdGlvbiwgZGVmaW5lVUk1Q2xhc3MsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IEZpbHRlckNvbnRhaW5lciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9maWx0ZXJiYXIvRmlsdGVyQ29udGFpbmVyXCI7XG5pbXBvcnQgVmlzdWFsRmlsdGVyQ29udGFpbmVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL2ZpbHRlcmJhci9WaXN1YWxGaWx0ZXJDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIFZpc3VhbEZpbHRlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy92aXN1YWxmaWx0ZXJzL1Zpc3VhbEZpbHRlclwiO1xuaW1wb3J0IHR5cGUgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCB0eXBlIFNlZ21lbnRlZEJ1dHRvbiBmcm9tIFwic2FwL20vU2VnbWVudGVkQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3QkTW9kZWxDb250ZXh0Q2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIHsgJEZpbHRlckJhclNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgTWRjRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyRmllbGRcIjtcbmltcG9ydCB0eXBlIElGaWx0ZXJDb250YWluZXIgZnJvbSBcInNhcC91aS9tZGMvZmlsdGVyYmFyL0lGaWx0ZXJDb250YWluZXJcIjtcbmltcG9ydCBGaWx0ZXJJdGVtTGF5b3V0IGZyb20gXCJzYXAvdWkvbWRjL2ZpbHRlcmJhci9hbGlnbmVkL0ZpbHRlckl0ZW1MYXlvdXRcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZXJuYWxTdGF0ZVR5cGUgfSBmcm9tIFwiLi4vdmFsdWVoZWxwL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgVmlzdWFsRmlsdGVyVXRpbHMgZnJvbSBcIi4vZmlsdGVyYmFyL3V0aWxzL1Zpc3VhbEZpbHRlclV0aWxzXCI7XG5cbmNvbnN0IFZJU1VBTF9GSUxURVJfQ09OVEFJTkVSID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLmZpbHRlcmJhci5WaXN1YWxGaWx0ZXJDb250YWluZXJcIixcblx0RklMVEVSX0NPTlRBSU5FUiA9IFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5maWx0ZXJiYXIuRmlsdGVyQ29udGFpbmVyXCI7XG50eXBlIENvbnRhaW5lclR5cGUgPSB0eXBlb2YgVklTVUFMX0ZJTFRFUl9DT05UQUlORVIgfCB0eXBlb2YgRklMVEVSX0NPTlRBSU5FUjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5GaWx0ZXJCYXJcIilcbmNsYXNzIEZpbHRlckJhciBleHRlbmRzIE1kY0ZpbHRlckJhciB7XG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwic3RyaW5nXCIsIGRlZmF1bHRWYWx1ZTogXCJjb21wYWN0XCIgfSlcblx0aW5pdGlhbExheW91dCE6IHN0cmluZztcblxuXHRAcHJvcGVydHkoeyB0eXBlOiBcImJvb2xlYW5cIiwgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KVxuXHRkaXNhYmxlRHJhZnRFZGl0U3RhdGVGaWx0ZXIhOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBDb250cm9sIHdoaWNoIGFsbG93cyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gdmlzdWFsIGFuZCBub3JtYWwgZmlsdGVyIGxheW91dHNcblx0ICovXG5cdEBhc3NvY2lhdGlvbih7XG5cdFx0dHlwZTogXCJzYXAubS5TZWdtZW50ZWRCdXR0b25cIixcblx0XHRtdWx0aXBsZTogZmFsc2Vcblx0fSlcblx0dG9nZ2xlQ29udHJvbCE6IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvcihpZE9yUHJvcHM/OiBQcm9wZXJ0aWVzT2Y8RmlsdGVyQmFyPiAmICRGaWx0ZXJCYXJTZXR0aW5ncywgc2V0dGluZ3M/OiBQcm9wZXJ0aWVzT2Y8RmlsdGVyQmFyPiAmICRGaWx0ZXJCYXJTZXR0aW5ncykge1xuXHRcdGRlbGV0ZSBpZE9yUHJvcHM/LnByb3BlcnR5SW5mbztcblx0XHRkZWxldGUgc2V0dGluZ3M/LnByb3BlcnR5SW5mbztcblx0XHRzdXBlcihpZE9yUHJvcHMgYXMgdW5rbm93biBhcyBzdHJpbmcsIHNldHRpbmdzKTtcblx0XHR0aGlzLl9pbml0aWFsaXplU3RhdHVzKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIF9pbml0aWFsaXplU3RhdHVzKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFByb21pc2Uga2VlcGVyIHRvIGhvbGQgdGhlIHByb2Nlc3MuXG5cdFx0dGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8dm9pZD4oKTtcblxuXHRcdC8vIEF3YWl0c1xuXHRcdGF3YWl0IHRoaXMuaW5pdGlhbGl6ZWRXaXRoTWV0YWRhdGEoKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JNb2RlbFRvQmVTZXQoKTtcblxuXHRcdHRoaXMuX2luaXRpYWxpemVkUHJvbWlzZUtlZXBlci5yZXNvbHZlKCk7XG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHdhaXRGb3JNb2RlbFRvQmVTZXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuZ2V0TW9kZWwoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyB3YWl0IGZvciBkZWFmYXVsdCBtb2RlbCB0byBiZSBzZXQuXG5cdFx0Y29uc3QgbW9kZWxJc1NldFByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjx2b2lkPigpO1xuXHRcdGNvbnN0IGZuQ2hlY2tBbmRSZXNldCA9IChlOiBNYW5hZ2VkT2JqZWN0JE1vZGVsQ29udGV4dENoYW5nZUV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBmaWx0ZXJiYXIgPSBlLmdldFNvdXJjZSgpO1xuXHRcdFx0aWYgKGZpbHRlcmJhci5nZXRNb2RlbCgpKSB7XG5cdFx0XHRcdC8vIGRlZmF1bHQgbW9kZWwgaXMgc2V0LlxuXHRcdFx0XHRmaWx0ZXJiYXIuZGV0YWNoTW9kZWxDb250ZXh0Q2hhbmdlKGZuQ2hlY2tBbmRSZXNldCk7XG5cdFx0XHRcdG1vZGVsSXNTZXRQcm9taXNlS2VlcGVyPy5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aGlzLmF0dGFjaE1vZGVsQ29udGV4dENoYW5nZShmbkNoZWNrQW5kUmVzZXQpO1xuXHRcdHJldHVybiBtb2RlbElzU2V0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgRmlsdGVyQmFyIGlzIGZ1bGx5IGluaXRpYWxpemVkLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBGaWx0ZXJCYXIgaXMgaW5pdGlhbGl6ZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5faXNJbml0aWFsaXplZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBc3luYyBlcXVpdmFsZW50IG9mICdpc0luaXRpYWxpemVkJyB0byBwZXJmb3JtIGZpbHRlciBiYXIgaW50ZXJhY3Rpb25zIGFmdGVyIHRoZSBmaWx0ZXIgYmFyIGlzIHJlYWR5LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsdGVyIGJhciBpcyBpbml0aWFsaXplZC5cblx0ICovXG5cdGFzeW5jIHdoZW5Jbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWRQcm9taXNlS2VlcGVyPy5wcm9taXNlO1xuXHR9XG5cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZWRQcm9taXNlS2VlcGVyPzogUHJvbWlzZUtlZXBlcjx2b2lkPjtcblxuXHRwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBfb1NlZ21lbnRlZEJ1dHRvbj86IFNlZ21lbnRlZEJ1dHRvbjtcblxuXHRwcml2YXRlIF9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0PzogSUZpbHRlckNvbnRhaW5lcjtcblxuXHRwcml2YXRlIF9vRmlsdGVyQmFyTGF5b3V0ITogSUZpbHRlckNvbnRhaW5lcjtcblxuXHRwcml2YXRlIF9jTGF5b3V0SXRlbTogdHlwZW9mIEZpbHRlckl0ZW1MYXlvdXQ7XG5cblx0c2V0VG9nZ2xlQ29udHJvbCh2VG9nZ2xlOiBzdHJpbmcgfCBTZWdtZW50ZWRCdXR0b24pOiB2b2lkIHtcblx0XHRpZiAodHlwZW9mIHZUb2dnbGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24gPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHZUb2dnbGUpIGFzIFNlZ21lbnRlZEJ1dHRvbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb1NlZ21lbnRlZEJ1dHRvbiA9IHZUb2dnbGU7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudG9nZ2xlQ29udHJvbCAmJiB0aGlzLl9vU2VnbWVudGVkQnV0dG9uKSB7XG5cdFx0XHR0aGlzLl9vU2VnbWVudGVkQnV0dG9uLmRldGFjaEV2ZW50KFwic2VsZWN0aW9uQ2hhbmdlXCIsIHRoaXMuX3RvZ2dsZUxheW91dC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuX29TZWdtZW50ZWRCdXR0b24pIHtcblx0XHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24uYXR0YWNoRXZlbnQoXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5fdG9nZ2xlTGF5b3V0LmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHR0aGlzLnNldEFzc29jaWF0aW9uKFwidG9nZ2xlQ29udHJvbFwiLCB2VG9nZ2xlLCB0cnVlKTtcblx0fVxuXG5cdF90b2dnbGVMYXlvdXQoKTogdm9pZCB7XG5cdFx0Ly8gU2luY2UgcHJpbWFyeSBsYXlvdXQgaXMgYWx3YXlzIGNvbXBhY3Rcblx0XHQvLyBoZW5jZSBzZXQgdGhlIHNlY29uZGFyeSBsYXlvdXQgYXMgdmlzdWFsIGZpbHRlciBvbmx5IGZvciB0aGUgZmlyc3QgdGltZSBvbmx5XG5cdFx0dGhpcy53YWl0Rm9ySW5pdGlhbGl6YXRpb24oKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRLZXkgPSB0aGlzLl9vU2VnbWVudGVkQnV0dG9uPy5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0KHRhcmdldEtleSA9PT0gXCJ2aXN1YWxcIiAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fb0ZpbHRlckJhckxheW91dD8uaXNBPFZpc3VhbEZpbHRlckNvbnRhaW5lcj4oXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLmZpbHRlcmJhci5WaXN1YWxGaWx0ZXJDb250YWluZXJcIikpIHx8XG5cdFx0XHRcdFx0KHRhcmdldEtleSA9PT0gXCJjb21wYWN0XCIgJiZcblx0XHRcdFx0XHRcdCF0aGlzLl9vRmlsdGVyQmFyTGF5b3V0Py5pc0E8VmlzdWFsRmlsdGVyQ29udGFpbmVyPihcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclwiKSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dCkge1xuXHRcdFx0XHRcdHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQgPSBuZXcgVmlzdWFsRmlsdGVyQ29udGFpbmVyKCkgYXMgdW5rbm93biBhcyBJRmlsdGVyQ29udGFpbmVyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZG8gbm90IHNob3cgQWRhcHQgRmlsdGVycyBCdXR0b24gZm9yIHZpc3VhbCBsYXlvdXRcblx0XHRcdFx0aWYgKHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQ/LmlzQTxWaXN1YWxGaWx0ZXJDb250YWluZXI+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRTaG93QWRhcHRGaWx0ZXJzQnV0dG9uKGZhbHNlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNldFNob3dBZGFwdEZpbHRlcnNCdXR0b24odHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBnZXQgYWxsIGZpbHRlciBmaWVsZHMgYW5kIGJ1dHRvbiBvZiB0aGUgY3VycmVudCBsYXlvdXRcblx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQgPSB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0O1xuXHRcdFx0XHRjb25zdCBvRmlsdGVySXRlbXMgPSB0aGlzLmdldEZpbHRlckl0ZW1zKCk7XG5cdFx0XHRcdGNvbnN0IGFGaWx0ZXJGaWVsZHMgPSBvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxGaWx0ZXJGaWVsZHMoKTtcblx0XHRcdFx0Y29uc3QgYVNvcnRlZEZpbHRlckZpZWxkcyA9IHRoaXMuZ2V0U29ydGVkRmlsdGVyRmllbGRzKG9GaWx0ZXJJdGVtcywgYUZpbHRlckZpZWxkcyk7XG5cdFx0XHRcdGNvbnN0IGFCdXR0b25zID0gb0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQuZ2V0QWxsQnV0dG9ucygpO1xuXHRcdFx0XHRjb25zdCBhVmlzdWFsRmlsdGVyRmllbGRzID1cblx0XHRcdFx0XHRvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxWaXN1YWxGaWx0ZXJGaWVsZHMgJiZcblx0XHRcdFx0XHQob0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQuZ2V0QWxsVmlzdWFsRmlsdGVyRmllbGRzKCkgYXMgUmVjb3JkPHN0cmluZywgVmlzdWFsRmlsdGVyPiB8IHVuZGVmaW5lZCk7XG5cdFx0XHRcdGlmICh0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0Py5pc0E8VmlzdWFsRmlsdGVyQ29udGFpbmVyPihcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclwiKSkge1xuXHRcdFx0XHRcdHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQuc2V0QWxsRmlsdGVyRmllbGRzKGFTb3J0ZWRGaWx0ZXJGaWVsZHMsIGFWaXN1YWxGaWx0ZXJGaWVsZHMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHVzZSBzZWNvbmRhcnkgZmlsdGVyIGJhciBsYXlvdXQgYXMgbmV3IGxheW91dFxuXHRcdFx0XHR0aGlzLl9vRmlsdGVyQmFyTGF5b3V0ID0gdGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dCE7XG5cblx0XHRcdFx0Ly8gaW5zZXJ0IGFsbCBmaWx0ZXIgZmllbGRzIGZyb20gY3VycmVudCBsYXlvdXQgdG8gbmV3IGxheW91dFxuXHRcdFx0XHRhRmlsdGVyRmllbGRzLmZvckVhY2goKG9GaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQsIGlJbmRleDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0b0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQucmVtb3ZlRmlsdGVyRmllbGQob0ZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR0aGlzLl9vRmlsdGVyQmFyTGF5b3V0Lmluc2VydEZpbHRlckZpZWxkKG9GaWx0ZXJGaWVsZCwgaUluZGV4KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIGluc2VydCBhbGwgYnV0dG9ucyBmcm9tIHRoZSBjdXJyZW50IGxheW91dCB0byB0aGUgbmV3IGxheW91dFxuXHRcdFx0XHRhQnV0dG9ucy5mb3JFYWNoKChvQnV0dG9uOiBCdXR0b24pID0+IHtcblx0XHRcdFx0XHRvQ3VycmVudEZpbHRlckJhckxheW91dC5yZW1vdmVCdXR0b24ob0J1dHRvbik7XG5cdFx0XHRcdFx0dGhpcy5fb0ZpbHRlckJhckxheW91dC5hZGRCdXR0b24ob0J1dHRvbik7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIHNldCB0aGUgY3VycmVudCBmaWx0ZXIgYmFyIGxheW91dCB0byB0aGUgc2Vjb25kYXJ5IG9uZVxuXHRcdFx0XHR0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0ID0gb0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQ7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIHRoZSBsYXlvdXQgYWdncmVnYXRpb24gb2YgdGhlIGZpbHRlciBiYXIgYW5kIHJlcmVuZGVyIHRoZSBzYW1lLlxuXHRcdFx0XHR0aGlzLnNldEFnZ3JlZ2F0aW9uKFwibGF5b3V0XCIsIHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQsIHRydWUpO1xuXHRcdFx0XHR0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LmludmFsaWRhdGUoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Z2V0U29ydGVkRmlsdGVyRmllbGRzKGFGaWx0ZXJJdGVtczogRmlsdGVyRmllbGRbXSwgYUZpbHRlckZpZWxkczogRmlsdGVyRmllbGRbXSk6IEZpbHRlckZpZWxkW10ge1xuXHRcdGNvbnN0IGFGaWx0ZXJJZHM6IHN0cmluZ1tdID0gW107XG5cdFx0YUZpbHRlckl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9GaWx0ZXJJdGVtOiBGaWx0ZXJGaWVsZCkge1xuXHRcdFx0YUZpbHRlcklkcy5wdXNoKG9GaWx0ZXJJdGVtLmdldElkKCkpO1xuXHRcdH0pO1xuXHRcdGFGaWx0ZXJGaWVsZHMuc29ydChmdW5jdGlvbiAoYUZpcnN0SXRlbTogRmlsdGVyRmllbGQsIGFTZWNvbmRJdGVtOiBGaWx0ZXJGaWVsZCkge1xuXHRcdFx0bGV0IHNGaXJzdEl0ZW1WRklkLCBzU2Vjb25kSXRlbVZGSWQ7XG5cdFx0XHQoYUZpcnN0SXRlbS5nZXRDb250ZW50KCkgYXMgdW5rbm93biBhcyBDb250cm9sW10pLmZvckVhY2goZnVuY3Rpb24gKG9Jbm5lckNvbnRyb2w6IENvbnRyb2wpIHtcblx0XHRcdFx0aWYgKG9Jbm5lckNvbnRyb2wuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikpIHtcblx0XHRcdFx0XHRzRmlyc3RJdGVtVkZJZCA9IG9Jbm5lckNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQoYVNlY29uZEl0ZW0uZ2V0Q29udGVudCgpIGFzIHVua25vd24gYXMgQ29udHJvbFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChvSW5uZXJDb250cm9sOiBDb250cm9sKSB7XG5cdFx0XHRcdGlmIChvSW5uZXJDb250cm9sLmlzQTxGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0c1NlY29uZEl0ZW1WRklkID0gb0lubmVyQ29udHJvbC5nZXRJZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhRmlsdGVySWRzLmluZGV4T2Yoc0ZpcnN0SXRlbVZGSWQgPz8gXCJcIikgLSBhRmlsdGVySWRzLmluZGV4T2Yoc1NlY29uZEl0ZW1WRklkID8/IFwiXCIpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhRmlsdGVyRmllbGRzO1xuXHR9XG5cblx0X2NyZWF0ZUlubmVyTGF5b3V0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQgPSBuZXcgRmlsdGVyQ29udGFpbmVyKCk7XG5cdFx0dGhpcy5fY0xheW91dEl0ZW0gPSBGaWx0ZXJJdGVtTGF5b3V0O1xuXHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuZ2V0SW5uZXIoKS5hZGRTdHlsZUNsYXNzKFwic2FwVWlNZGNGaWx0ZXJCYXJCYXNlQUZMYXlvdXRcIik7XG5cdFx0dGhpcy5fYWRkQnV0dG9ucygpO1xuXG5cdFx0Ly8gVE9ETzogQ2hlY2sgd2l0aCBNREMgaWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5IHRvIGxvYWQgdmlzdWFsIGZpbHRlciBvbiB0aGUgYmFzaXMgb2YgY29udHJvbCBwcm9wZXJ0eVxuXHRcdC8vIF9jcmVhdGVJbm5lckxheW91dCBpcyBjYWxsZWQgb24gSW5pdCBieSB0aGUgZmlsdGVyIGJhciBiYXNlLlxuXHRcdC8vIFRoaXMgbWVhbiB0aGF0IHdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgY29udHJvbCBwcm9wZXJ0aWVzIHlldFxuXHRcdC8vIGFuZCBoZW5jZSB3ZSBjYW5ub3QgZGVjaWRlIG9uIHRoZSBiYXNpcyBvZiBjb250cm9sIHByb3BlcnRpZXMgd2hldGhlciBpbml0aWFsIGxheW91dCBzaG91bGQgYmUgY29tcGFjdCBvciB2aXN1YWxcblx0XHQvLyBBcyBhIHJlc3VsdCB3ZSBoYXZlIHRvIGRvIHRoaXMgd29ya2Fyb3VuZCB0byBhbHdheXMgbG9hZCB0aGUgY29tcGFjdCBsYXlvdXQgYnkgZGVmYXVsdFxuXHRcdC8vIEFuZCB0b29nbGUgdGhlIHNhbWUgaW4gY2FzZSB0aGUgaW5pdGlhbExheW91dCB3YXMgc3VwcG9zZWQgdG8gYmUgdmlzdWFsIGZpbHRlcnMuXG5cdFx0Y29uc3Qgb0lubmVyTGF5b3V0ID0gdGhpcy5fb0ZpbHRlckJhckxheW91dC5nZXRJbm5lcigpO1xuXHRcdGNvbnN0IG9GaWx0ZXJDb250YWluZXJJbm5lckxheW91dEV2ZW50RGVsZWdhdGUgPSB7XG5cdFx0XHRvbkJlZm9yZVJlbmRlcmluZzogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5pbml0aWFsTGF5b3V0ID09PSBcInZpc3VhbFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5fdG9nZ2xlTGF5b3V0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0lubmVyTGF5b3V0LnJlbW92ZUV2ZW50RGVsZWdhdGUob0ZpbHRlckNvbnRhaW5lcklubmVyTGF5b3V0RXZlbnREZWxlZ2F0ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvSW5uZXJMYXlvdXQuYWRkRXZlbnREZWxlZ2F0ZShvRmlsdGVyQ29udGFpbmVySW5uZXJMYXlvdXRFdmVudERlbGVnYXRlKTtcblxuXHRcdHRoaXMuc2V0QWdncmVnYXRpb24oXCJsYXlvdXRcIiwgdGhpcy5fb0ZpbHRlckJhckxheW91dCwgdHJ1ZSk7XG5cdH1cblxuXHRleGl0KCk6IHZvaWQge1xuXHRcdHN1cGVyLmV4aXQoKTtcblx0XHQvLyBTb21ldGltZXMgdXBvbiBleHRlcm5hbCBuYXZpZ2F0aW9uIHRoaXMuX1NlZ21lbnRlZEJ1dHRvbiBpcyBhbHJlYWR5IGRlc3Ryb3llZFxuXHRcdC8vIHNvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgdGhlbiBvbmx5IHJlbW92ZSBzdHVmZlxuXHRcdGlmICh0aGlzLl9vU2VnbWVudGVkQnV0dG9uKSB7XG5cdFx0XHR0aGlzLl9vU2VnbWVudGVkQnV0dG9uLmRldGFjaEV2ZW50KFwic2VsZWN0aW9uQ2hhbmdlXCIsIHRoaXMuX3RvZ2dsZUxheW91dCk7XG5cdFx0XHRkZWxldGUgdGhpcy5fb1NlZ21lbnRlZEJ1dHRvbjtcblx0XHR9XG5cdH1cblxuXHRnZXRTZWdtZW50ZWRCdXR0b24oKTogU2VnbWVudGVkQnV0dG9uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fb1NlZ21lbnRlZEJ1dHRvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmFibGUgb3IgZGlzYWJsZSByZXF1ZXN0cyB0aGF0IGFyZSBpbml0aWF0ZWQgYnkgdGhlIEZpbHRlckJhci5cblx0ICpcblx0ICogVG8gYmUgdXNlZCB0byBzdXNwZW5kIG9yIHJlc3VtZSByZXF1ZXN0cyh0YWJsZSBvciB2aXN1YWwgZmlsdGVycykgd2hlbiB0aGUgZmlsdGVyIGJhciBpcyBiZWluZyBtb2RpZmllZCBvciB3aGVuIHRoZSB1c2VyIGlzIHByb2dyYW1tYXRpY2FsbHkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZmlsdGVyIGNvbnRyb2xzLlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB2aXN1YWwgZmlsdGVyIGNoYXJ0IGJpbmRpbmcgc2hvdWxkIGJlIHJlc3VtZWQvc3VzcGVuZGVkIGJhc2VkIG9uIHRoZSBkaWZmIHN0YXRlLCBhbmQgcmVzdW1lZCBhZnRlciBjb25kaXRvbiBtb2RlbCB1cGRhdGUuXG5cdCAqIEBwYXJhbSBlbmFibGUgRW5hYmxlIG9yIGRpc2FibGUgcmVxdWVzdHNcblx0ICogQHBhcmFtIGRpZmZTdGF0ZSBJZiB0aGVyZSBpcyBhIGRpZmZlcm5jZSBpbiB0aGUgZXh0ZXJuYWwgc3RhdGUgdGhhdCBuZWVkcyB0byBiZSBjb25zaWRlcmVkIGZvciB2aXN1YWwgZmlsdGVyIGluLXBhcmFtZXRlcnNcblx0ICovXG5cdGVuYWJsZVJlcXVlc3RzKGVuYWJsZTogYm9vbGVhbiwgZGlmZlN0YXRlPzogRXh0ZXJuYWxTdGF0ZVR5cGUpOiB2b2lkIHtcblx0XHR0aGlzLnNldFN1c3BlbmRTZWxlY3Rpb24oIWVuYWJsZSk7XG5cdFx0Ly8gV2UgbmVlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgdmlzdWFsIGZpbHRlciBjaGFydCBiaW5kaW5ncyBiYXNlZCBvbiBkaWZmIHN0YXRlLlxuXHRcdHRoaXMuX2VuYWJsZVZpc3VhbEZpbHRlckNoYXJ0QmluZGluZ3MoZW5hYmxlLCBkaWZmU3RhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZmlsdGVyIGxheW91dCBieSBpdHMgdHlwZS5cblx0ICogQHBhcmFtIGxheW91dENsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZmlsdGVyIGxheW91dCB0byBiZSByZXR1cm5lZC5cblx0ICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGZpbHRlciBsYXlvdXQgdG8gYmUgcmV0dXJuZWQuXG5cdCAqIEB0eXBlZGVmIHtJRmlsdGVyQ29udGFpbmVyfSBUIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIgbGF5b3V0IHRvIGJlIHJldHVybmVkXG5cdCAqIEByZXR1cm5zIENvcnJlc3BvbmRpbmcgZmlsdGVyIGxheW91dCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB1bmRlZmluZWQuXG5cdCAqL1xuXHRfZ2V0RmlsdGVyTGF5b3V0QnlUeXBlPFQgZXh0ZW5kcyBJRmlsdGVyQ29udGFpbmVyPihsYXlvdXRDbGFzc05hbWU6IENvbnRhaW5lclR5cGUpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCByZXRGaWx0ZXJMYXlvdXQgPSB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LmlzQTxUPihsYXlvdXRDbGFzc05hbWUpID8gdGhpcy5fb0ZpbHRlckJhckxheW91dCA6IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gIXJldEZpbHRlckxheW91dCAmJiB0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0Py5pc0E8VD4obGF5b3V0Q2xhc3NOYW1lKVxuXHRcdFx0PyB0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0XG5cdFx0XHQ6IHJldEZpbHRlckxheW91dDtcblx0fVxuXG5cdF9lbmFibGVWaXN1YWxGaWx0ZXJDaGFydEJpbmRpbmdzKGVuYWJsZTogYm9vbGVhbiwgZGlmZlN0YXRlPzogRXh0ZXJuYWxTdGF0ZVR5cGUpOiB2b2lkIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGNvbnN0IHZpc3VhbEZpbHRlckxheW91dCA9IHRoaXMuX2dldEZpbHRlckxheW91dEJ5VHlwZTxWaXN1YWxGaWx0ZXJDb250YWluZXI+KFZJU1VBTF9GSUxURVJfQ09OVEFJTkVSKTtcblx0XHRpZiAodmlzdWFsRmlsdGVyTGF5b3V0KSB7XG5cdFx0XHR2aXN1YWxGaWx0ZXJMYXlvdXQuZW5hYmxlQ2hhcnRCaW5kaW5nKGVuYWJsZSwgZGlmZlN0YXRlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiBpbml0aWFsIGxheW91dCBpcyBjb21wYWN0LCB3ZSBkb24ndCBoYXZlIHRoZSB2aXN1YWwgZmlsdGVyIGxheW91dChjb250YWluZXIpIGF2YWlsYWJsZSB5ZXQgdW50aWwgdGhlIHVzZXIgdG9nZ2xlcyB0byB2aXN1YWwgZmlsdGVyIGxheW91dC5cblx0XHQvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjb21wYWN0IGZpbHRlciBsYXlvdXQgaGFzIHZpc3VhbCBmaWx0ZXJzIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgY2hhcnQgYmluZGluZyBmb3IgdGhvc2UgdmlzdWFsIGZpbHRlcnMuXG5cdFx0Y29uc3QgY29tcGFjdEZpbHRlckxheW91dCA9IHRoaXMuX2dldEZpbHRlckxheW91dEJ5VHlwZTxGaWx0ZXJDb250YWluZXI+KEZJTFRFUl9DT05UQUlORVIpO1xuXHRcdGlmIChjb21wYWN0RmlsdGVyTGF5b3V0KSB7XG5cdFx0XHRjb25zdCB2aXN1YWxGaWx0ZXJzID0gY29tcGFjdEZpbHRlckxheW91dC5nZXRBbGxWaXN1YWxGaWx0ZXJGaWVsZHMoKTtcblx0XHRcdGlmICh2aXN1YWxGaWx0ZXJzKSB7XG5cdFx0XHRcdFZpc3VhbEZpbHRlclV0aWxzLmVuYWJsZUNoYXJ0QmluZGluZyh2aXN1YWxGaWx0ZXJzLCBlbmFibGUsIGRpZmZTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5pbnRlcmZhY2UgRmlsdGVyQmFyIHtcblx0X2FkZEJ1dHRvbnMoKTogdm9pZDtcbn1cbmV4cG9ydCBkZWZhdWx0IEZpbHRlckJhcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztFQW9CQSxNQUFNQSx1QkFBdUIsR0FBRyx3REFBd0Q7SUFDdkZDLGdCQUFnQixHQUFHLGtEQUFrRDtFQUFDLElBSWpFQyxTQUFTLElBQUFDLElBQUEsR0FEZEMsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLEVBQUFDLEtBQUEsR0FFakRDLFFBQVEsQ0FBQztJQUFFQyxJQUFJLEVBQUUsUUFBUTtJQUFFQyxZQUFZLEVBQUU7RUFBVSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUdyREgsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRSxTQUFTO0lBQUVDLFlBQVksRUFBRTtFQUFNLENBQUMsQ0FBQyxFQUFBRSxLQUFBLEdBTWxEQyxXQUFXLENBQUM7SUFDWkosSUFBSSxFQUFFLHVCQUF1QjtJQUM3QkssUUFBUSxFQUFFO0VBQ1gsQ0FBQyxDQUFDLEVBQUFULElBQUEsQ0FBQVUsTUFBQSxJQUFB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
@@ -1,11 +1,13 @@
1
1
  import Log from "sap/base/Log";
2
2
  import type { PropertiesOf } from "sap/fe/base/ClassSupport";
3
3
  import { association, defineUI5Class, property } from "sap/fe/base/ClassSupport";
4
+ import PromiseKeeper from "sap/fe/core/helpers/PromiseKeeper";
4
5
  import FilterContainer from "sap/fe/macros/controls/filterbar/FilterContainer";
5
6
  import VisualFilterContainer from "sap/fe/macros/controls/filterbar/VisualFilterContainer";
6
7
  import type VisualFilter from "sap/fe/macros/visualfilters/VisualFilter";
7
8
  import type Button from "sap/m/Button";
8
9
  import type SegmentedButton from "sap/m/SegmentedButton";
10
+ import type { ManagedObject$ModelContextChangeEvent } from "sap/ui/base/ManagedObject";
9
11
  import type Control from "sap/ui/core/Control";
10
12
  import { default as Element } from "sap/ui/core/Element";
11
13
  import type { $FilterBarSettings } from "sap/ui/mdc/FilterBar";
@@ -45,14 +47,53 @@ class FilterBar extends MdcFilterBar {
45
47
  }
46
48
 
47
49
  private async _initializeStatus(): Promise<void> {
48
- await this.waitForInitialization();
50
+ // Promise keeper to hold the process.
51
+ this._initializedPromiseKeeper = new PromiseKeeper<void>();
52
+
53
+ // Awaits
54
+ await this.initializedWithMetadata();
55
+ await this.waitForModelToBeSet();
56
+
57
+ this._initializedPromiseKeeper.resolve();
49
58
  this._isInitialized = true;
50
59
  }
51
60
 
61
+ private async waitForModelToBeSet(): Promise<void> {
62
+ if (this.getModel()) {
63
+ return;
64
+ }
65
+ // wait for deafault model to be set.
66
+ const modelIsSetPromiseKeeper = new PromiseKeeper<void>();
67
+ const fnCheckAndReset = (e: ManagedObject$ModelContextChangeEvent): void => {
68
+ const filterbar = e.getSource();
69
+ if (filterbar.getModel()) {
70
+ // default model is set.
71
+ filterbar.detachModelContextChange(fnCheckAndReset);
72
+ modelIsSetPromiseKeeper?.resolve();
73
+ }
74
+ };
75
+ this.attachModelContextChange(fnCheckAndReset);
76
+ return modelIsSetPromiseKeeper.promise;
77
+ }
78
+
79
+ /**
80
+ * Checks if the FilterBar is fully initialized.
81
+ * @returns True if the FilterBar is initialized, false otherwise.
82
+ */
52
83
  isInitialized(): boolean {
53
84
  return !!this._isInitialized;
54
85
  }
55
86
 
87
+ /**
88
+ * Async equivalent of 'isInitialized' to perform filter bar interactions after the filter bar is ready.
89
+ * @returns Promise that resolves when the filter bar is initialized.
90
+ */
91
+ async whenInitialized(): Promise<void> {
92
+ return this._initializedPromiseKeeper?.promise;
93
+ }
94
+
95
+ private _initializedPromiseKeeper?: PromiseKeeper<void>;
96
+
56
97
  private _isInitialized = false;
57
98
 
58
99
  private _oSegmentedButton?: SegmentedButton;