@sapui5/sap.fe.macros 1.142.0 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/CollaborativeDraftHandler.js +1 -7
  4. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +0 -6
  5. package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
  6. package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
  7. package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
  8. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
  9. package/src/sap/fe/macros/Field.js +5 -5
  10. package/src/sap/fe/macros/Field.ts +5 -3
  11. package/src/sap/fe/macros/FooterContent.js +3 -2
  12. package/src/sap/fe/macros/FooterContent.tsx +2 -10
  13. package/src/sap/fe/macros/KPITag.js +6 -6
  14. package/src/sap/fe/macros/KPITag.tsx +5 -5
  15. package/src/sap/fe/macros/MacroAPI.js +2 -2
  16. package/src/sap/fe/macros/MacroAPI.ts +1 -1
  17. package/src/sap/fe/macros/MessageButton.js +3 -3
  18. package/src/sap/fe/macros/MessageButton.tsx +3 -2
  19. package/src/sap/fe/macros/MicroChart.js +3 -2
  20. package/src/sap/fe/macros/MicroChart.tsx +1 -1
  21. package/src/sap/fe/macros/Share.js +7 -7
  22. package/src/sap/fe/macros/Share.tsx +9 -6
  23. package/src/sap/fe/macros/Status.js +6 -5
  24. package/src/sap/fe/macros/Status.tsx +3 -4
  25. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  26. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  27. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  28. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  29. package/src/sap/fe/macros/chart/ChartDelegate.js +22 -1
  30. package/src/sap/fe/macros/chart/ChartDelegate.ts +29 -2
  31. package/src/sap/fe/macros/chart/MdcChartTemplate.js +5 -2
  32. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -2
  33. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
  34. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
  35. package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
  36. package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
  37. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
  38. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
  39. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  40. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  41. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +4 -4
  42. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +3 -3
  43. package/src/sap/fe/macros/field/FieldFormatOptions.js +2 -2
  44. package/src/sap/fe/macros/field/FieldFormatOptions.ts +1 -1
  45. package/src/sap/fe/macros/field/FieldRuntime.js +7 -2
  46. package/src/sap/fe/macros/field/FieldRuntime.ts +7 -1
  47. package/src/sap/fe/macros/filter/FilterUtils.js +31 -5
  48. package/src/sap/fe/macros/filter/FilterUtils.ts +40 -6
  49. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +6 -3
  50. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +5 -1
  51. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +19 -9
  52. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +76 -61
  53. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
  54. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
  55. package/src/sap/fe/macros/form/FormContainer.block.js +22 -6
  56. package/src/sap/fe/macros/form/FormContainer.block.ts +24 -6
  57. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
  58. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
  59. package/src/sap/fe/macros/library.js +5 -6
  60. package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
  61. package/src/sap/fe/macros/messagebundle.properties +6 -0
  62. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
  63. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  64. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  65. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
  66. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
  67. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  68. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  69. package/src/sap/fe/macros/table/Action.js +7 -4
  70. package/src/sap/fe/macros/table/Action.ts +3 -3
  71. package/src/sap/fe/macros/table/Column.js +3 -2
  72. package/src/sap/fe/macros/table/Column.ts +1 -1
  73. package/src/sap/fe/macros/table/MdcTableTemplate.js +6 -9
  74. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +5 -7
  75. package/src/sap/fe/macros/table/Table.block.js +6 -3
  76. package/src/sap/fe/macros/table/Table.block.tsx +13 -3
  77. package/src/sap/fe/macros/table/TableAPI.js +13 -8
  78. package/src/sap/fe/macros/table/TableAPI.ts +10 -3
  79. package/src/sap/fe/macros/table/TableDefinition.js +2 -2
  80. package/src/sap/fe/macros/table/TableDefinition.ts +1 -1
  81. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +3 -1
  82. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +4 -0
  83. package/src/sap/fe/macros/table/TableRuntime.js +24 -12
  84. package/src/sap/fe/macros/table/TableRuntime.ts +27 -11
  85. package/src/sap/fe/macros/table/Utils.js +9 -3
  86. package/src/sap/fe/macros/table/Utils.ts +14 -8
  87. package/src/sap/fe/macros/table/delegates/TableDelegate.js +6 -4
  88. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +6 -5
  89. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  90. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  91. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -5
  92. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +13 -4
  93. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
  94. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
  95. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +37 -10
  96. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +39 -15
  97. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
  98. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
  99. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
  100. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
  101. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
  102. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
@@ -0,0 +1,376 @@
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/core/CommonUtils", "sap/fe/core/helpers/ResourceModelHelper", "sap/ui/core/Element", "sap/ui/core/Messaging", "sap/ui/core/message/ControlMessageProcessor", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/mdc/enums/FilterBarValidationStatus", "../DelegateUtil", "../filter/FilterUtils"], function (CommonUtils, ResourceModelHelper, UI5Element, Messaging, ControlMessageProcessor, Message, MessageType, FilterBarValidationStatus, DelegateUtil, FilterUtils) {
6
+ "use strict";
7
+
8
+ /**
9
+ * UOMValidationDelegate
10
+ *
11
+ * A FilterBarDelegate extension that adds UOM validation behavior to MDC FilterBars including adaptation and personalization variants used in the Table and Chart or FilterBar P13n.
12
+ *
13
+ * The delegate inspects filter fields for an associated Measures or ISOCurrency or Unit annotation and enforces
14
+ * when a value is entered for the leading (measure) field, a corresponding UOM value
15
+ * either exists or is requested from the user. It updates the FilterField value states and required
16
+ * flags, manages message suppression for live searches, and can reorder the visible UOM field next to
17
+ * its leading field in personalization state when required.
18
+ *
19
+ * Key behaviors:
20
+ * - Works with three FilterBar contexts:
21
+ * - Main (normal) FilterBar
22
+ * - FilterBar P13n (adaptation UI for FilterBar)
23
+ * - Table or Chart P13n (adaptation UI for Table or Chart FilterBar)
24
+ * - Discovers UOM relationships using the converted filter field metadata and the Measures.ISOCurrency or Measures.Unit
25
+ * annotation on the corresponding property.
26
+ * - Determines the validation trigger by inspecting the FilterBar "reason" such as Enter or Go and live mode.
27
+ * - Sets the value state and value state text on the leading (measure) field and marks the UOM FilterField
28
+ * as required when the leading field has a value but no UOM.
29
+ * - Resets value states when no relevant conditions are present.
30
+ *
31
+ * Usage:
32
+ * - The delegate exposes determineValidationState(filterBar, validationType) which returns a Promise
33
+ * resolving to a FilterBarValidationStatus. This method is intended to be invoked by the FilterBar
34
+ * validation lifecycle to decide whether a search should be triggered or whether missing values
35
+ * should be presented to the user.
36
+ */
37
+ // Type alias representing possible adaptation control element types (FilterBar | Table | Chart)
38
+
39
+ const UOMValidationDelegate = {
40
+ /**
41
+ * Function which determines the validation state of the FilterFields on a given FilterBar control.
42
+ * @param filterBar FilterBar control which can be a P13n FilterBar or a regular one
43
+ * @param _mValidation String which consists which type of validation is happening
44
+ * @returns A Promise with a Validation Status which determines if the search is triggered or not
45
+ */
46
+ determineValidationState: async function (filterBar, _mValidation) {
47
+ const adaptationControlElement = UI5Element.getElementById(filterBar.getAssociation("adaptationControl", null));
48
+ const filterType = getFilterBarType(filterBar, adaptationControlElement);
49
+ const {
50
+ hasError,
51
+ hasWarning
52
+ } = await UOMValidationDelegate.validateAllUOMFields(filterBar, filterBar._sReason, filterType, adaptationControlElement);
53
+ if (!hasError && !hasWarning) {
54
+ return new Promise(resolve => {
55
+ //After discussions with MDC we need to use this as a temporary workaround to solve the timing issues related to setting the messages to the filterfield and update of the filterfield valuestate
56
+ //TODO: Remove this workaround once MDC provides an API to set the messages to the filterbar. Will be tracked via BLI.
57
+ setTimeout(() => {
58
+ resolve(filterBar.checkFilters());
59
+ }, 0);
60
+ });
61
+ }
62
+ //if warning or liveMode, we don't open message box
63
+ filterBar.setShowMessages(!hasWarning && !filterBar.getLiveMode());
64
+ return hasError ? FilterBarValidationStatus.FieldInErrorState : filterBar.checkFilters();
65
+ },
66
+ validateAllUOMFields: async function (filterBar, reason, filterType, adaptationControlElement) {
67
+ let hasError = false,
68
+ hasWarning = false;
69
+ let entityTypePath;
70
+ let controlForMetaModel;
71
+ adaptationControlElement = adaptationControlElement ?? UI5Element.getElementById(filterBar.getAssociation("adaptationControl", null));
72
+ filterType = filterType ?? getFilterBarType(filterBar, adaptationControlElement);
73
+ if (filterType === FilterType.FILTERBAR_P13N || filterType === FilterType.TABLE_CHART_P13N) {
74
+ entityTypePath = DelegateUtil.getCustomData(adaptationControlElement, "entityType");
75
+ controlForMetaModel = adaptationControlElement;
76
+ } else {
77
+ entityTypePath = DelegateUtil.getCustomData(filterBar, "entityType");
78
+ controlForMetaModel = filterBar;
79
+ }
80
+ const view = CommonUtils.getTargetView(controlForMetaModel);
81
+ const appComponent = view && CommonUtils.getAppComponent(view);
82
+ const disableStrictUomFiltering = appComponent?.getManifestEntry("sap.fe")?.app?.disableStrictUomFiltering;
83
+ if (disableStrictUomFiltering === true) {
84
+ return {
85
+ hasError: false,
86
+ hasWarning: false
87
+ };
88
+ }
89
+ const internalModel = controlForMetaModel?.getModel("internal");
90
+ const filterBarId = filterBar.getId();
91
+ const allUomValidationMessages = internalModel?.getProperty("/uomValidationMessages") || {};
92
+ const filterBarUomValidationMessages = allUomValidationMessages[filterBarId] || {};
93
+
94
+ // Clear existing UOM validation messages for this filterBar from the message model
95
+ removeMessages(internalModel, filterBarId, filterBarUomValidationMessages);
96
+ const model = await DelegateUtil.fetchModel(controlForMetaModel);
97
+ const metaModel = model?.getMetaModel();
98
+ const resourceModel = ResourceModelHelper.getResourceModel(controlForMetaModel);
99
+ const allUOMProperties = getUOMProperties(entityTypePath, filterBar, metaModel);
100
+ if (!allUOMProperties.length || !allUOMProperties.some(uomProp => filterBar?.getConditions()?.[uomProp?.field?.fieldKey]?.length > 0)) {
101
+ uomStateMap = {};
102
+ return {
103
+ hasError: false,
104
+ hasWarning: false
105
+ };
106
+ }
107
+ for (const {
108
+ field,
109
+ uomProperty
110
+ } of allUOMProperties) {
111
+ if (uomProperty) {
112
+ const {
113
+ hasError: fieldHasError,
114
+ hasWarning: fieldHasWarning
115
+ } = validateFilterField(filterBar, field, uomProperty, filterType, resourceModel, adaptationControlElement, reason, internalModel);
116
+ if (fieldHasError) hasError = true;
117
+ if (fieldHasWarning) hasWarning = true;
118
+ }
119
+ }
120
+ uomStateMap = {};
121
+ return {
122
+ hasError,
123
+ hasWarning
124
+ };
125
+ }
126
+ };
127
+ /**
128
+ * Interface representing a unit of measure (UOM) property and its associated field.
129
+ * Used to track relationships between measure fields and their corresponding UOM fields.
130
+ * @interface
131
+ */
132
+ /**
133
+ * Enumeration of possible FilterBar types in the application.
134
+ * Used to determine the validation behavior based on the context where the filter is being used.
135
+ * @enum {string}
136
+ */
137
+ var FilterType = /*#__PURE__*/function (FilterType) {
138
+ /** Regular FilterBar instance (not in personalization mode) */
139
+ FilterType["MAIN"] = "Main";
140
+ /** FilterBar in personalization mode for filter adaptation */
141
+ FilterType["FILTERBAR_P13N"] = "FilterP13n";
142
+ /** FilterBar in personalization mode for Table or Chart adaptation */
143
+ FilterType["TABLE_CHART_P13N"] = "TableChartP13n";
144
+ return FilterType;
145
+ }(FilterType || {});
146
+ let uomStateMap = {};
147
+ let controlMessageProcessor;
148
+ /**
149
+ * Determines the FilterType for a given FilterBar and an optional adaptation control element.
150
+ *
151
+ * The function classifies the filter bar into one of three FilterType values:
152
+ * - FilterType.MAIN: When the provided filterBar is not an adaptation such when it is not an AdaptationFilterBar.
153
+ * - FilterType.FILTERBAR_P13N: When the provided filterBar is an AdaptationFilterBar but the adaptationControlElement
154
+ * is not a Table or Chart.
155
+ * - FilterType.TABLE_CHART_P13N: When the provided filterBar is an AdaptationFilterBar and the
156
+ * adaptationControlElement is a Table or Chart.
157
+ * @param filterBar The FilterBar instance to inspect. Expected to implement isA().
158
+ * @param adaptationControlElement The control associated with the adaptation workflow which may be a FilterBar, Table, or Chart. Used to distinguish table or chart personalization from general filter bar personalization.
159
+ * @returns The resolved FilterType enum value representing how the filter bar should be treated.
160
+ */
161
+ function getFilterBarType(filterBar, adaptationControlElement) {
162
+ if (filterBar.isA("sap.ui.mdc.filterbar.p13n.AdaptationFilterBar")) {
163
+ if (adaptationControlElement?.isA("sap.ui.mdc.Table") || adaptationControlElement?.isA("sap.ui.mdc.Chart")) {
164
+ return FilterType.TABLE_CHART_P13N;
165
+ }
166
+ return FilterType.FILTERBAR_P13N;
167
+ }
168
+ return FilterType.MAIN;
169
+ }
170
+
171
+ /**
172
+ * Determines whether an error state check should be performed based on the triggering reason,
173
+ * the type of filter context, and the filter bar's configuration.
174
+ *
175
+ * The function returns true for explicit user actions (for example, "Enter", "Go", or "Variant"),
176
+ * when the filter bar is of the table or chart personalization type, or when the filter bar
177
+ * personalization is active and the filter bar is in live mode.
178
+ * @param reason A string describing the event or user action that triggered validation. For example, "Enter", "Go", or "Variant".
179
+ * @param filterType The FilterType enum value indicating the current filter context which is used to detect personalization contexts.
180
+ * @param filterBar Optional FilterBar instance. When provided, its live mode is consulted for certain personalization types.
181
+ * @returns True if an error state should be checked given the inputs. Otherwise, false.
182
+ */
183
+ function shouldCheckErrorState(reason, filterType, filterBar) {
184
+ return reason === "Enter" || reason === "Go" || reason === "Variant" || filterBar?.getLiveMode() || filterType === FilterType.TABLE_CHART_P13N;
185
+ }
186
+
187
+ /**
188
+ * Removes existing UOM validation messages for a specific filterBar from the message model
189
+ * and clears the uomValidationMessages property in the internal model.
190
+ * @param internalModel The internal JSONModel containing the validation messages
191
+ * @param filterBarId The ID of the filterBar whose messages should be removed
192
+ * @param filterBarUomValidationMessages The current UOM validation messages for this filterBar
193
+ */
194
+ function removeMessages(internalModel, filterBarId, filterBarUomValidationMessages) {
195
+ if (Object.keys(filterBarUomValidationMessages).length > 0) {
196
+ const allMessages = Messaging.getMessageModel().getData();
197
+ const messagesToRemove = allMessages.filter(m => Object.values(filterBarUomValidationMessages).includes(m.getId()));
198
+ if (messagesToRemove.length) {
199
+ Messaging.removeMessages(messagesToRemove);
200
+ }
201
+ // Clear the uomValidationMessages property for this specific filterBar
202
+ if (internalModel) {
203
+ const allUomValidationMessages = internalModel.getProperty("/uomValidationMessages") || {};
204
+ const updatedMessages = {
205
+ ...allUomValidationMessages
206
+ };
207
+ delete updatedMessages[filterBarId];
208
+ internalModel.setProperty("/uomValidationMessages", updatedMessages);
209
+ }
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Function to validate the fields.
215
+ * @param filterBar The control on which the fields exist and whose ID will be used as message storage key
216
+ * @param field The field to be evaluated which has a fieldKey and label
217
+ * @param field.fieldKey
218
+ * @param field.label
219
+ * @param uomProperty The UOM property if any exists for the field
220
+ * @param uomProperty.path
221
+ * @param uomProperty.label
222
+ * @param filterType The type of the filterBar
223
+ * @param resourceModel
224
+ * @param adaptationControlElement
225
+ * @param reason
226
+ * @param internalModel The internal JSONModel for message storage
227
+ * @returns An object consisting of whether we have an error or a warning state
228
+ */
229
+ function validateFilterField(filterBar, field, uomProperty, filterType, resourceModel, adaptationControlElement, reason, internalModel) {
230
+ const {
231
+ fieldKey,
232
+ label
233
+ } = field;
234
+ const associatedUOMPropertyPath = uomProperty.path;
235
+ const filterBarConditions = filterBar.getConditions();
236
+ const isFieldNameInConditions = !!filterBarConditions?.[fieldKey]?.length;
237
+ const isUOMInConditions = associatedUOMPropertyPath ? filterBarConditions?.[associatedUOMPropertyPath]?.length === 1 : false;
238
+ const doesUOMHaveMultipleConditions = associatedUOMPropertyPath ? filterBarConditions?.[associatedUOMPropertyPath]?.length > 1 : false;
239
+ const leadingFilterField = filterBar.getFilterItems().find(item => item.getPropertyKey() === fieldKey);
240
+ const uomFilterField = filterBar.getFilterItems().find(item => item.getPropertyKey() === associatedUOMPropertyPath);
241
+ const messageText = doesUOMHaveMultipleConditions ? resourceModel?.getText?.("FILTERFIELD_VALUE_UOM_MULTIPLE", [uomFilterField?.getLabel() ?? uomProperty?.label]) : resourceModel?.getText?.("FILTERFIELD_VALUE_NO_UOM", [leadingFilterField?.getLabel() ?? label, uomFilterField?.getLabel() ?? uomProperty?.label]);
242
+ if (!isFieldNameInConditions || isFieldNameInConditions && isUOMInConditions) {
243
+ return {
244
+ hasError: false,
245
+ hasWarning: false
246
+ };
247
+ }
248
+ const isError = shouldCheckErrorState(reason, filterType, filterType === FilterType.FILTERBAR_P13N ? adaptationControlElement : filterBar);
249
+ setMessages(leadingFilterField, uomFilterField, isError ? MessageType.Error : MessageType.Warning, messageText, internalModel, filterBar);
250
+ return {
251
+ hasError: isError,
252
+ hasWarning: !isError
253
+ };
254
+ }
255
+
256
+ /**
257
+ * Updates the UI state for a leading filter field and its associated UOM filter field.
258
+ * Sets the ValueState and optional ValueStateText on the leading filter (if present),
259
+ * and sets the required flag as well as ValueState and ValueStateText on the UOM filter (if present).
260
+ * @param leadingFilterField The primary (leading) MDCFilterField to update. Only its value state and text are modified.
261
+ * @param uomFilterField The UOM MDCFilterField to update. Its required flag, value state, and text are modified.
262
+ * @param messageType The ValueState to apply such as None, Warning, Error, or Success.
263
+ * @param message Optional descriptive text to display for the value state.
264
+ * @param internalModel The internal JSONModel for message storage.
265
+ * @param filterBar The FilterBar whose ID will be used as the key for message storage in the internal model.
266
+ */
267
+ function setMessages(leadingFilterField, uomFilterField, messageType, message, internalModel, filterBar) {
268
+ const messages = [];
269
+ controlMessageProcessor ??= new ControlMessageProcessor();
270
+
271
+ // Get current UOM validation messages from internal model
272
+ const filterBarId = filterBar?.getId() ?? "";
273
+ const allUomValidationMessages = internalModel?.getProperty("/uomValidationMessages") || {};
274
+ const filterBarUomValidationMessages = allUomValidationMessages[filterBarId] || {};
275
+ let leadingMsg;
276
+ if (leadingFilterField) {
277
+ const fieldId = leadingFilterField.getId();
278
+ // Check if message already exists for this field in this filterBar's context
279
+ if (!filterBarUomValidationMessages[fieldId]) {
280
+ leadingMsg = new Message({
281
+ message: message,
282
+ processor: controlMessageProcessor,
283
+ type: messageType,
284
+ target: fieldId + "/conditions"
285
+ });
286
+ messages.push(leadingMsg);
287
+ // Store message ID in filterBar's validation messages
288
+ filterBarUomValidationMessages[fieldId] = leadingMsg.getId();
289
+ }
290
+ }
291
+ if (uomFilterField && uomStateMap[uomFilterField.getId()] !== undefined) {
292
+ if (uomStateMap[uomFilterField.getId()]?.messageType === MessageType.None) {
293
+ setMessageForUOMField(uomFilterField, messageType, message, messages, filterBarUomValidationMessages);
294
+ }
295
+ } else if (uomFilterField) {
296
+ setMessageForUOMField(uomFilterField, messageType, message, messages, filterBarUomValidationMessages);
297
+ }
298
+
299
+ // Update internal model with new messages for this filterBar
300
+ if (internalModel) {
301
+ const updatedAllMessages = {
302
+ ...allUomValidationMessages
303
+ };
304
+ updatedAllMessages[filterBarId] = filterBarUomValidationMessages;
305
+ internalModel.setProperty("/uomValidationMessages", updatedAllMessages);
306
+ }
307
+ if (messages.length) {
308
+ Messaging.addMessages(messages);
309
+ }
310
+ }
311
+ function setMessageForUOMField(uomField, messageType, message, messages, uomValidationMessages) {
312
+ const fieldId = uomField.getId();
313
+ // Check if message already exists for this field
314
+ if (uomValidationMessages[fieldId]) {
315
+ return undefined;
316
+ }
317
+ const msg = new Message({
318
+ message: message,
319
+ processor: controlMessageProcessor,
320
+ type: messageType,
321
+ target: fieldId + "/conditions"
322
+ });
323
+ messages.push(msg);
324
+ uomStateMap[fieldId] = {
325
+ messageType
326
+ };
327
+
328
+ // Store message ID in uomValidationMessages
329
+ uomValidationMessages[fieldId] = msg.getId();
330
+ return msg;
331
+ }
332
+
333
+ /**
334
+ * Retrieves UOM-related properties from a filter control's metadata.
335
+ * Processes filter fields to identify measure fields with associated UOM fields
336
+ * through ISOCurrency or Unit annotations.
337
+ * @param entityTypePath Path to the entity type containing the filter fields
338
+ * @param filterControl The filter control to inspect for UOM properties
339
+ * @param metaModel ODataMetaModel
340
+ * @returns Array of UOMProperty objects containing measure field information
341
+ * and their associated UOM field details
342
+ */
343
+ function getUOMProperties(entityTypePath, filterControl, metaModel) {
344
+ const includeHidden = filterControl.isA("sap.ui.mdc.filterbar.vh.FilterBar") ? true : undefined;
345
+ const filterFields = FilterUtils.getConvertedFilterFields(filterControl, entityTypePath, includeHidden, metaModel);
346
+ const converterContext = FilterUtils.createConverterContext(filterControl, entityTypePath, metaModel);
347
+ return filterFields.map(filterFieldInfo => {
348
+ const annotationPath = filterFieldInfo.annotationPath;
349
+ if (annotationPath) {
350
+ const propertyAnnotations = converterContext.getConvertedTypes().resolvePath(annotationPath).target;
351
+ const uomProperty = propertyAnnotations?.annotations.Measures;
352
+ if (uomProperty?.ISOCurrency || uomProperty?.Unit) {
353
+ let uomPropertyObject;
354
+ const uomPath = uomProperty?.ISOCurrency?.path || uomProperty?.Unit?.path;
355
+ if (uomPath) {
356
+ const uomLabel = filterFields.find(ff => ff.key === uomPath)?.label;
357
+ uomPropertyObject = {
358
+ path: uomPath,
359
+ label: uomLabel ?? uomProperty?.ISOCurrency?.$target?.annotations?.Common?.Label ?? uomProperty?.Unit?.$target?.annotations?.Common?.Label
360
+ };
361
+ }
362
+ return {
363
+ field: {
364
+ fieldKey: filterFieldInfo.key ?? "",
365
+ label: filterFieldInfo.label ?? ""
366
+ },
367
+ uomProperty: uomPropertyObject
368
+ };
369
+ }
370
+ }
371
+ return null;
372
+ }).filter(Boolean);
373
+ }
374
+ return UOMValidationDelegate;
375
+ }, false);
376
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVT01WYWxpZGF0aW9uRGVsZWdhdGUiLCJkZXRlcm1pbmVWYWxpZGF0aW9uU3RhdGUiLCJmaWx0ZXJCYXIiLCJfbVZhbGlkYXRpb24iLCJhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQiLCJVSTVFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBc3NvY2lhdGlvbiIsImZpbHRlclR5cGUiLCJnZXRGaWx0ZXJCYXJUeXBlIiwiaGFzRXJyb3IiLCJoYXNXYXJuaW5nIiwidmFsaWRhdGVBbGxVT01GaWVsZHMiLCJfc1JlYXNvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImNoZWNrRmlsdGVycyIsInNldFNob3dNZXNzYWdlcyIsImdldExpdmVNb2RlIiwiRmlsdGVyQmFyVmFsaWRhdGlvblN0YXR1cyIsIkZpZWxkSW5FcnJvclN0YXRlIiwicmVhc29uIiwiZW50aXR5VHlwZVBhdGgiLCJjb250cm9sRm9yTWV0YU1vZGVsIiwiRmlsdGVyVHlwZSIsIkZJTFRFUkJBUl9QMTNOIiwiVEFCTEVfQ0hBUlRfUDEzTiIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJ2aWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRUYXJnZXRWaWV3IiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZGlzYWJsZVN0cmljdFVvbUZpbHRlcmluZyIsImdldE1hbmlmZXN0RW50cnkiLCJhcHAiLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJmaWx0ZXJCYXJJZCIsImdldElkIiwiYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiZ2V0UHJvcGVydHkiLCJmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXMiLCJyZW1vdmVNZXNzYWdlcyIsIm1vZGVsIiwiZmV0Y2hNb2RlbCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc291cmNlTW9kZWwiLCJSZXNvdXJjZU1vZGVsSGVscGVyIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImFsbFVPTVByb3BlcnRpZXMiLCJnZXRVT01Qcm9wZXJ0aWVzIiwibGVuZ3RoIiwic29tZSIsInVvbVByb3AiLCJnZXRDb25kaXRpb25zIiwiZmllbGQiLCJmaWVsZEtleSIsInVvbVN0YXRlTWFwIiwidW9tUHJvcGVydHkiLCJmaWVsZEhhc0Vycm9yIiwiZmllbGRIYXNXYXJuaW5nIiwidmFsaWRhdGVGaWx0ZXJGaWVsZCIsImNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIiwiaXNBIiwiTUFJTiIsInNob3VsZENoZWNrRXJyb3JTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJhbGxNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJtZXNzYWdlc1RvUmVtb3ZlIiwiZmlsdGVyIiwibSIsInZhbHVlcyIsImluY2x1ZGVzIiwidXBkYXRlZE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJsYWJlbCIsImFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGgiLCJwYXRoIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImlzRmllbGROYW1lSW5Db25kaXRpb25zIiwiaXNVT01JbkNvbmRpdGlvbnMiLCJkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9ucyIsImxlYWRpbmdGaWx0ZXJGaWVsZCIsImdldEZpbHRlckl0ZW1zIiwiZmluZCIsIml0ZW0iLCJnZXRQcm9wZXJ0eUtleSIsInVvbUZpbHRlckZpZWxkIiwibWVzc2FnZVRleHQiLCJnZXRUZXh0IiwiZ2V0TGFiZWwiLCJpc0Vycm9yIiwic2V0TWVzc2FnZXMiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIm1lc3NhZ2VUeXBlIiwibWVzc2FnZSIsIm1lc3NhZ2VzIiwiQ29udHJvbE1lc3NhZ2VQcm9jZXNzb3IiLCJsZWFkaW5nTXNnIiwiZmllbGRJZCIsIk1lc3NhZ2UiLCJwcm9jZXNzb3IiLCJ0eXBlIiwidGFyZ2V0IiwicHVzaCIsInVuZGVmaW5lZCIsIk5vbmUiLCJzZXRNZXNzYWdlRm9yVU9NRmllbGQiLCJ1cGRhdGVkQWxsTWVzc2FnZXMiLCJhZGRNZXNzYWdlcyIsInVvbUZpZWxkIiwidW9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwibXNnIiwiZmlsdGVyQ29udHJvbCIsImluY2x1ZGVIaWRkZW4iLCJmaWx0ZXJGaWVsZHMiLCJGaWx0ZXJVdGlscyIsImdldENvbnZlcnRlZEZpbHRlckZpZWxkcyIsImNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0IiwibWFwIiwiZmlsdGVyRmllbGRJbmZvIiwiYW5ub3RhdGlvblBhdGgiLCJwcm9wZXJ0eUFubm90YXRpb25zIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJyZXNvbHZlUGF0aCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ1b21Qcm9wZXJ0eU9iamVjdCIsInVvbVBhdGgiLCJ1b21MYWJlbCIsImZmIiwia2V5IiwiJHRhcmdldCIsIkNvbW1vbiIsIkxhYmVsIiwiQm9vbGVhbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVU9NVmFsaWRhdGlvbkRlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVU9NVmFsaWRhdGlvbkRlbGVnYXRlXG4gKlxuICogQSBGaWx0ZXJCYXJEZWxlZ2F0ZSBleHRlbnNpb24gdGhhdCBhZGRzIFVPTSB2YWxpZGF0aW9uIGJlaGF2aW9yIHRvIE1EQyBGaWx0ZXJCYXJzIGluY2x1ZGluZyBhZGFwdGF0aW9uIGFuZCBwZXJzb25hbGl6YXRpb24gdmFyaWFudHMgdXNlZCBpbiB0aGUgVGFibGUgYW5kIENoYXJ0IG9yIEZpbHRlckJhciBQMTNuLlxuICpcbiAqIFRoZSBkZWxlZ2F0ZSBpbnNwZWN0cyBmaWx0ZXIgZmllbGRzIGZvciBhbiBhc3NvY2lhdGVkIE1lYXN1cmVzIG9yIElTT0N1cnJlbmN5IG9yIFVuaXQgYW5ub3RhdGlvbiBhbmQgZW5mb3JjZXNcbiAqIHdoZW4gYSB2YWx1ZSBpcyBlbnRlcmVkIGZvciB0aGUgbGVhZGluZyAobWVhc3VyZSkgZmllbGQsIGEgY29ycmVzcG9uZGluZyBVT00gdmFsdWVcbiAqIGVpdGhlciBleGlzdHMgb3IgaXMgcmVxdWVzdGVkIGZyb20gdGhlIHVzZXIuIEl0IHVwZGF0ZXMgdGhlIEZpbHRlckZpZWxkIHZhbHVlIHN0YXRlcyBhbmQgcmVxdWlyZWRcbiAqIGZsYWdzLCBtYW5hZ2VzIG1lc3NhZ2Ugc3VwcHJlc3Npb24gZm9yIGxpdmUgc2VhcmNoZXMsIGFuZCBjYW4gcmVvcmRlciB0aGUgdmlzaWJsZSBVT00gZmllbGQgbmV4dCB0b1xuICogaXRzIGxlYWRpbmcgZmllbGQgaW4gcGVyc29uYWxpemF0aW9uIHN0YXRlIHdoZW4gcmVxdWlyZWQuXG4gKlxuICogS2V5IGJlaGF2aW9yczpcbiAqIC0gV29ya3Mgd2l0aCB0aHJlZSBGaWx0ZXJCYXIgY29udGV4dHM6XG4gKiAgIC0gTWFpbiAobm9ybWFsKSBGaWx0ZXJCYXJcbiAqICAgLSBGaWx0ZXJCYXIgUDEzbiAoYWRhcHRhdGlvbiBVSSBmb3IgRmlsdGVyQmFyKVxuICogICAtIFRhYmxlIG9yIENoYXJ0IFAxM24gKGFkYXB0YXRpb24gVUkgZm9yIFRhYmxlIG9yIENoYXJ0IEZpbHRlckJhcilcbiAqIC0gRGlzY292ZXJzIFVPTSByZWxhdGlvbnNoaXBzIHVzaW5nIHRoZSBjb252ZXJ0ZWQgZmlsdGVyIGZpZWxkIG1ldGFkYXRhIGFuZCB0aGUgTWVhc3VyZXMuSVNPQ3VycmVuY3kgb3IgTWVhc3VyZXMuVW5pdFxuICogICBhbm5vdGF0aW9uIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5LlxuICogLSBEZXRlcm1pbmVzIHRoZSB2YWxpZGF0aW9uIHRyaWdnZXIgYnkgaW5zcGVjdGluZyB0aGUgRmlsdGVyQmFyIFwicmVhc29uXCIgc3VjaCBhcyBFbnRlciBvciBHbyBhbmQgbGl2ZSBtb2RlLlxuICogLSBTZXRzIHRoZSB2YWx1ZSBzdGF0ZSBhbmQgdmFsdWUgc3RhdGUgdGV4dCBvbiB0aGUgbGVhZGluZyAobWVhc3VyZSkgZmllbGQgYW5kIG1hcmtzIHRoZSBVT00gRmlsdGVyRmllbGRcbiAqICAgYXMgcmVxdWlyZWQgd2hlbiB0aGUgbGVhZGluZyBmaWVsZCBoYXMgYSB2YWx1ZSBidXQgbm8gVU9NLlxuICogLSBSZXNldHMgdmFsdWUgc3RhdGVzIHdoZW4gbm8gcmVsZXZhbnQgY29uZGl0aW9ucyBhcmUgcHJlc2VudC5cbiAqXG4gKiBVc2FnZTpcbiAqIC0gVGhlIGRlbGVnYXRlIGV4cG9zZXMgZGV0ZXJtaW5lVmFsaWRhdGlvblN0YXRlKGZpbHRlckJhciwgdmFsaWRhdGlvblR5cGUpIHdoaWNoIHJldHVybnMgYSBQcm9taXNlXG4gKiAgIHJlc29sdmluZyB0byBhIEZpbHRlckJhclZhbGlkYXRpb25TdGF0dXMuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIEZpbHRlckJhclxuICogICB2YWxpZGF0aW9uIGxpZmVjeWNsZSB0byBkZWNpZGUgd2hldGhlciBhIHNlYXJjaCBzaG91bGQgYmUgdHJpZ2dlcmVkIG9yIHdoZXRoZXIgbWlzc2luZyB2YWx1ZXNcbiAqICAgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAqL1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZpZWxkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCAqIGFzIFJlc291cmNlTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IENvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL0NvbnRyb2xNZXNzYWdlUHJvY2Vzc29yXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIENoYXJ0IGZyb20gXCJzYXAvdWkvbWRjL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBNRENGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBGaWx0ZXJCYXJWYWxpZGF0aW9uU3RhdHVzIGZyb20gXCJzYXAvdWkvbWRjL2VudW1zL0ZpbHRlckJhclZhbGlkYXRpb25TdGF0dXNcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCIuLi9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwiLi4vZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcIi4uL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuXG4vLyBUeXBlIGFsaWFzIHJlcHJlc2VudGluZyBwb3NzaWJsZSBhZGFwdGF0aW9uIGNvbnRyb2wgZWxlbWVudCB0eXBlcyAoRmlsdGVyQmFyIHwgVGFibGUgfCBDaGFydClcbnR5cGUgQWRhcHRhdGlvbkVsZW1lbnQgPSBGaWx0ZXJCYXIgfCBUYWJsZSB8IENoYXJ0O1xuXG5jb25zdCBVT01WYWxpZGF0aW9uRGVsZWdhdGUgPSB7XG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3aGljaCBkZXRlcm1pbmVzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG9mIHRoZSBGaWx0ZXJGaWVsZHMgb24gYSBnaXZlbiBGaWx0ZXJCYXIgY29udHJvbC5cblx0ICogQHBhcmFtIGZpbHRlckJhciBGaWx0ZXJCYXIgY29udHJvbCB3aGljaCBjYW4gYmUgYSBQMTNuIEZpbHRlckJhciBvciBhIHJlZ3VsYXIgb25lXG5cdCAqIEBwYXJhbSBfbVZhbGlkYXRpb24gU3RyaW5nIHdoaWNoIGNvbnNpc3RzIHdoaWNoIHR5cGUgb2YgdmFsaWRhdGlvbiBpcyBoYXBwZW5pbmdcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHdpdGggYSBWYWxpZGF0aW9uIFN0YXR1cyB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkIG9yIG5vdFxuXHQgKi9cblx0ZGV0ZXJtaW5lVmFsaWRhdGlvblN0YXRlOiBhc3luYyBmdW5jdGlvbiAoZmlsdGVyQmFyOiBGaWx0ZXJCYXIsIF9tVmFsaWRhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxGaWx0ZXJCYXJWYWxpZGF0aW9uU3RhdHVzPiB7XG5cdFx0Y29uc3QgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50ID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChmaWx0ZXJCYXIuZ2V0QXNzb2NpYXRpb24oXCJhZGFwdGF0aW9uQ29udHJvbFwiLCBudWxsKSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IGZpbHRlclR5cGUgPSBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhciwgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEFkYXB0YXRpb25FbGVtZW50KTtcblx0XHRjb25zdCB7IGhhc0Vycm9yLCBoYXNXYXJuaW5nIH0gPSBhd2FpdCBVT01WYWxpZGF0aW9uRGVsZWdhdGUudmFsaWRhdGVBbGxVT01GaWVsZHMoXG5cdFx0XHRmaWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJCYXIuX3NSZWFzb24sXG5cdFx0XHRmaWx0ZXJUeXBlLFxuXHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50XG5cdFx0KTtcblx0XHRpZiAoIWhhc0Vycm9yICYmICFoYXNXYXJuaW5nKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdFx0Ly9BZnRlciBkaXNjdXNzaW9ucyB3aXRoIE1EQyB3ZSBuZWVkIHRvIHVzZSB0aGlzIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gc29sdmUgdGhlIHRpbWluZyBpc3N1ZXMgcmVsYXRlZCB0byBzZXR0aW5nIHRoZSBtZXNzYWdlcyB0byB0aGUgZmlsdGVyZmllbGQgYW5kIHVwZGF0ZSBvZiB0aGUgZmlsdGVyZmllbGQgdmFsdWVzdGF0ZVxuXHRcdFx0XHQvL1RPRE86IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZSBNREMgcHJvdmlkZXMgYW4gQVBJIHRvIHNldCB0aGUgbWVzc2FnZXMgdG8gdGhlIGZpbHRlcmJhci4gV2lsbCBiZSB0cmFja2VkIHZpYSBCTEkuXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHJlc29sdmUoZmlsdGVyQmFyLmNoZWNrRmlsdGVycygpKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly9pZiB3YXJuaW5nIG9yIGxpdmVNb2RlLCB3ZSBkb24ndCBvcGVuIG1lc3NhZ2UgYm94XG5cdFx0ZmlsdGVyQmFyLnNldFNob3dNZXNzYWdlcyghaGFzV2FybmluZyAmJiAhZmlsdGVyQmFyLmdldExpdmVNb2RlKCkpO1xuXHRcdHJldHVybiBoYXNFcnJvciA/IEZpbHRlckJhclZhbGlkYXRpb25TdGF0dXMuRmllbGRJbkVycm9yU3RhdGUgOiBmaWx0ZXJCYXIuY2hlY2tGaWx0ZXJzKCk7XG5cdH0sXG5cdHZhbGlkYXRlQWxsVU9NRmllbGRzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdFx0cmVhc29uPzogc3RyaW5nLFxuXHRcdGZpbHRlclR5cGU/OiBGaWx0ZXJUeXBlLFxuXHRcdGFkYXB0YXRpb25Db250cm9sRWxlbWVudD86IFVJNUVsZW1lbnRcblx0KTogUHJvbWlzZTx7IGhhc0Vycm9yOiBib29sZWFuOyBoYXNXYXJuaW5nOiBib29sZWFuIH0+IHtcblx0XHRsZXQgaGFzRXJyb3IgPSBmYWxzZSxcblx0XHRcdGhhc1dhcm5pbmcgPSBmYWxzZTtcblx0XHRsZXQgZW50aXR5VHlwZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRsZXQgY29udHJvbEZvck1ldGFNb2RlbDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgPVxuXHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50ID8/IFVJNUVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlsdGVyQmFyLmdldEFzc29jaWF0aW9uKFwiYWRhcHRhdGlvbkNvbnRyb2xcIiwgbnVsbCkgYXMgc3RyaW5nKTtcblx0XHRmaWx0ZXJUeXBlID0gZmlsdGVyVHlwZSA/PyBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhciwgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEFkYXB0YXRpb25FbGVtZW50KTtcblx0XHRpZiAoZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5GSUxURVJCQVJfUDEzTiB8fCBmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRBQkxFX0NIQVJUX1AxM04pIHtcblx0XHRcdGVudGl0eVR5cGVQYXRoID0gRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGE8c3RyaW5nPihhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgYXMgRmlsdGVyQmFyLCBcImVudGl0eVR5cGVcIikgYXMgc3RyaW5nO1xuXHRcdFx0Y29udHJvbEZvck1ldGFNb2RlbCA9IGFkYXB0YXRpb25Db250cm9sRWxlbWVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZW50aXR5VHlwZVBhdGggPSBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YTxzdHJpbmc+KGZpbHRlckJhciwgXCJlbnRpdHlUeXBlXCIpIGFzIHN0cmluZztcblx0XHRcdGNvbnRyb2xGb3JNZXRhTW9kZWwgPSBmaWx0ZXJCYXI7XG5cdFx0fVxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KGNvbnRyb2xGb3JNZXRhTW9kZWwgYXMgQ29udHJvbCk7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdmlldyAmJiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0Y29uc3QgZGlzYWJsZVN0cmljdFVvbUZpbHRlcmluZyA9IGFwcENvbXBvbmVudD8uZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKT8uYXBwPy5kaXNhYmxlU3RyaWN0VW9tRmlsdGVyaW5nO1xuXHRcdGlmIChkaXNhYmxlU3RyaWN0VW9tRmlsdGVyaW5nID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2xGb3JNZXRhTW9kZWw/LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0Y29uc3QgZmlsdGVyQmFySWQgPSBmaWx0ZXJCYXIuZ2V0SWQoKTtcblx0XHRjb25zdCBhbGxVb21WYWxpZGF0aW9uTWVzc2FnZXMgPSBpbnRlcm5hbE1vZGVsPy5nZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIikgfHwge307XG5cdFx0Y29uc3QgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpbHRlckJhcklkXSB8fCB7fTtcblxuXHRcdC8vIENsZWFyIGV4aXN0aW5nIFVPTSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGlzIGZpbHRlckJhciBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsXG5cdFx0cmVtb3ZlTWVzc2FnZXMoaW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwsIGZpbHRlckJhcklkLCBmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdGNvbnN0IG1vZGVsID0gYXdhaXQgRGVsZWdhdGVVdGlsLmZldGNoTW9kZWwoY29udHJvbEZvck1ldGFNb2RlbCBhcyBBZGFwdGF0aW9uRWxlbWVudCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWw/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwoY29udHJvbEZvck1ldGFNb2RlbCBhcyBDb250cm9sKTtcblx0XHRjb25zdCBhbGxVT01Qcm9wZXJ0aWVzID0gZ2V0VU9NUHJvcGVydGllcyhlbnRpdHlUeXBlUGF0aCwgZmlsdGVyQmFyIGFzIElGaWx0ZXJDb250cm9sLCBtZXRhTW9kZWwpO1xuXHRcdGlmIChcblx0XHRcdCFhbGxVT01Qcm9wZXJ0aWVzLmxlbmd0aCB8fFxuXHRcdFx0IWFsbFVPTVByb3BlcnRpZXMuc29tZSgodW9tUHJvcDogVU9NUHJvcGVydHkpID0+IGZpbHRlckJhcj8uZ2V0Q29uZGl0aW9ucygpPy5bdW9tUHJvcD8uZmllbGQ/LmZpZWxkS2V5XT8ubGVuZ3RoID4gMClcblx0XHQpIHtcblx0XHRcdHVvbVN0YXRlTWFwID0ge307XG5cdFx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgeyBmaWVsZCwgdW9tUHJvcGVydHkgfSBvZiBhbGxVT01Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRpZiAodW9tUHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgeyBoYXNFcnJvcjogZmllbGRIYXNFcnJvciwgaGFzV2FybmluZzogZmllbGRIYXNXYXJuaW5nIH0gPSB2YWxpZGF0ZUZpbHRlckZpZWxkKFxuXHRcdFx0XHRcdGZpbHRlckJhcixcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHR1b21Qcm9wZXJ0eSxcblx0XHRcdFx0XHRmaWx0ZXJUeXBlLFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50LFxuXHRcdFx0XHRcdHJlYXNvbiBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoZmllbGRIYXNFcnJvcikgaGFzRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRpZiAoZmllbGRIYXNXYXJuaW5nKSBoYXNXYXJuaW5nID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dW9tU3RhdGVNYXAgPSB7fTtcblx0XHRyZXR1cm4geyBoYXNFcnJvciwgaGFzV2FybmluZyB9O1xuXHR9XG59O1xuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgdW5pdCBvZiBtZWFzdXJlIChVT00pIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCBmaWVsZC5cbiAqIFVzZWQgdG8gdHJhY2sgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG1lYXN1cmUgZmllbGRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFVPTSBmaWVsZHMuXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBVT01Qcm9wZXJ0eSB7XG5cdC8qKlxuXHQgKiBUaGUgbWFpbiBtZWFzdXJlIGZpZWxkIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRmaWVsZDoge1xuXHRcdC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZpZWxkICovXG5cdFx0ZmllbGRLZXk6IHN0cmluZztcblx0XHQvKiogRGlzcGxheSBsYWJlbCBmb3IgdGhlIGZpZWxkICovXG5cdFx0bGFiZWw6IHN0cmluZztcblx0fTtcblx0LyoqXG5cdCAqIE9wdGlvbmFsIGFzc29jaWF0ZWQgdW5pdCBvZiBtZWFzdXJlIChVT00pIGZpZWxkIGluZm9ybWF0aW9uXG5cdCAqL1xuXHR1b21Qcm9wZXJ0eT86IHtcblx0XHQvKiogUGF0aCB0byB0aGUgVU9NIGZpZWxkICovXG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgVU9NIGZpZWxkICovXG5cdFx0bGFiZWw6IHN0cmluZztcblx0fTtcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBGaWx0ZXJCYXIgdHlwZXMgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkYXRpb24gYmVoYXZpb3IgYmFzZWQgb24gdGhlIGNvbnRleHQgd2hlcmUgdGhlIGZpbHRlciBpcyBiZWluZyB1c2VkLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZW51bSBGaWx0ZXJUeXBlIHtcblx0LyoqIFJlZ3VsYXIgRmlsdGVyQmFyIGluc3RhbmNlIChub3QgaW4gcGVyc29uYWxpemF0aW9uIG1vZGUpICovXG5cdE1BSU4gPSBcIk1haW5cIixcblx0LyoqIEZpbHRlckJhciBpbiBwZXJzb25hbGl6YXRpb24gbW9kZSBmb3IgZmlsdGVyIGFkYXB0YXRpb24gKi9cblx0RklMVEVSQkFSX1AxM04gPSBcIkZpbHRlclAxM25cIixcblx0LyoqIEZpbHRlckJhciBpbiBwZXJzb25hbGl6YXRpb24gbW9kZSBmb3IgVGFibGUgb3IgQ2hhcnQgYWRhcHRhdGlvbiAqL1xuXHRUQUJMRV9DSEFSVF9QMTNOID0gXCJUYWJsZUNoYXJ0UDEzblwiXG59XG5cbmxldCB1b21TdGF0ZU1hcDogUmVjb3JkPHN0cmluZywgeyBtZXNzYWdlVHlwZT86IE1lc3NhZ2VUeXBlIH0+ID0ge307XG5sZXQgY29udHJvbE1lc3NhZ2VQcm9jZXNzb3I6IENvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBGaWx0ZXJUeXBlIGZvciBhIGdpdmVuIEZpbHRlckJhciBhbmQgYW4gb3B0aW9uYWwgYWRhcHRhdGlvbiBjb250cm9sIGVsZW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIGNsYXNzaWZpZXMgdGhlIGZpbHRlciBiYXIgaW50byBvbmUgb2YgdGhyZWUgRmlsdGVyVHlwZSB2YWx1ZXM6XG4gKiAtIEZpbHRlclR5cGUuTUFJTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIG5vdCBhbiBhZGFwdGF0aW9uIHN1Y2ggd2hlbiBpdCBpcyBub3QgYW4gQWRhcHRhdGlvbkZpbHRlckJhci5cbiAqIC0gRmlsdGVyVHlwZS5GSUxURVJCQVJfUDEzTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIGFuIEFkYXB0YXRpb25GaWx0ZXJCYXIgYnV0IHRoZSBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnRcbiAqICAgaXMgbm90IGEgVGFibGUgb3IgQ2hhcnQuXG4gKiAtIEZpbHRlclR5cGUuVEFCTEVfQ0hBUlRfUDEzTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIGFuIEFkYXB0YXRpb25GaWx0ZXJCYXIgYW5kIHRoZVxuICogICBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgaXMgYSBUYWJsZSBvciBDaGFydC5cbiAqIEBwYXJhbSBmaWx0ZXJCYXIgVGhlIEZpbHRlckJhciBpbnN0YW5jZSB0byBpbnNwZWN0LiBFeHBlY3RlZCB0byBpbXBsZW1lbnQgaXNBKCkuXG4gKiBAcGFyYW0gYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IFRoZSBjb250cm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRhcHRhdGlvbiB3b3JrZmxvdyB3aGljaCBtYXkgYmUgYSBGaWx0ZXJCYXIsIFRhYmxlLCBvciBDaGFydC4gVXNlZCB0byBkaXN0aW5ndWlzaCB0YWJsZSBvciBjaGFydCBwZXJzb25hbGl6YXRpb24gZnJvbSBnZW5lcmFsIGZpbHRlciBiYXIgcGVyc29uYWxpemF0aW9uLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIEZpbHRlclR5cGUgZW51bSB2YWx1ZSByZXByZXNlbnRpbmcgaG93IHRoZSBmaWx0ZXIgYmFyIHNob3VsZCBiZSB0cmVhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhcjogRmlsdGVyQmFyLCBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQ6IEZpbHRlckJhciB8IFRhYmxlIHwgQ2hhcnQpOiBGaWx0ZXJUeXBlIHtcblx0aWYgKGZpbHRlckJhci5pc0EoXCJzYXAudWkubWRjLmZpbHRlcmJhci5wMTNuLkFkYXB0YXRpb25GaWx0ZXJCYXJcIikpIHtcblx0XHRpZiAoKGFkYXB0YXRpb25Db250cm9sRWxlbWVudCBhcyBUYWJsZSk/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgfHwgKGFkYXB0YXRpb25Db250cm9sRWxlbWVudCBhcyBDaGFydCk/LmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRcdHJldHVybiBGaWx0ZXJUeXBlLlRBQkxFX0NIQVJUX1AxM047XG5cdFx0fVxuXHRcdHJldHVybiBGaWx0ZXJUeXBlLkZJTFRFUkJBUl9QMTNOO1xuXHR9XG5cdHJldHVybiBGaWx0ZXJUeXBlLk1BSU47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIHN0YXRlIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgYmFzZWQgb24gdGhlIHRyaWdnZXJpbmcgcmVhc29uLFxuICogdGhlIHR5cGUgb2YgZmlsdGVyIGNvbnRleHQsIGFuZCB0aGUgZmlsdGVyIGJhcidzIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZXhwbGljaXQgdXNlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgXCJFbnRlclwiLCBcIkdvXCIsIG9yIFwiVmFyaWFudFwiKSxcbiAqIHdoZW4gdGhlIGZpbHRlciBiYXIgaXMgb2YgdGhlIHRhYmxlIG9yIGNoYXJ0IHBlcnNvbmFsaXphdGlvbiB0eXBlLCBvciB3aGVuIHRoZSBmaWx0ZXIgYmFyXG4gKiBwZXJzb25hbGl6YXRpb24gaXMgYWN0aXZlIGFuZCB0aGUgZmlsdGVyIGJhciBpcyBpbiBsaXZlIG1vZGUuXG4gKiBAcGFyYW0gcmVhc29uIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGV2ZW50IG9yIHVzZXIgYWN0aW9uIHRoYXQgdHJpZ2dlcmVkIHZhbGlkYXRpb24uIEZvciBleGFtcGxlLCBcIkVudGVyXCIsIFwiR29cIiwgb3IgXCJWYXJpYW50XCIuXG4gKiBAcGFyYW0gZmlsdGVyVHlwZSBUaGUgRmlsdGVyVHlwZSBlbnVtIHZhbHVlIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgZmlsdGVyIGNvbnRleHQgd2hpY2ggaXMgdXNlZCB0byBkZXRlY3QgcGVyc29uYWxpemF0aW9uIGNvbnRleHRzLlxuICogQHBhcmFtIGZpbHRlckJhciBPcHRpb25hbCBGaWx0ZXJCYXIgaW5zdGFuY2UuIFdoZW4gcHJvdmlkZWQsIGl0cyBsaXZlIG1vZGUgaXMgY29uc3VsdGVkIGZvciBjZXJ0YWluIHBlcnNvbmFsaXphdGlvbiB0eXBlcy5cbiAqIEByZXR1cm5zIFRydWUgaWYgYW4gZXJyb3Igc3RhdGUgc2hvdWxkIGJlIGNoZWNrZWQgZ2l2ZW4gdGhlIGlucHV0cy4gT3RoZXJ3aXNlLCBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkQ2hlY2tFcnJvclN0YXRlKHJlYXNvbjogc3RyaW5nLCBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLCBmaWx0ZXJCYXI6IEZpbHRlckJhciB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHJlYXNvbiA9PT0gXCJFbnRlclwiIHx8XG5cdFx0cmVhc29uID09PSBcIkdvXCIgfHxcblx0XHRyZWFzb24gPT09IFwiVmFyaWFudFwiIHx8XG5cdFx0KGZpbHRlckJhcj8uZ2V0TGl2ZU1vZGUoKSBhcyBib29sZWFuKSB8fFxuXHRcdGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuVEFCTEVfQ0hBUlRfUDEzTlxuXHQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXhpc3RpbmcgVU9NIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIGEgc3BlY2lmaWMgZmlsdGVyQmFyIGZyb20gdGhlIG1lc3NhZ2UgbW9kZWxcbiAqIGFuZCBjbGVhcnMgdGhlIHVvbVZhbGlkYXRpb25NZXNzYWdlcyBwcm9wZXJ0eSBpbiB0aGUgaW50ZXJuYWwgbW9kZWwuXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgaW50ZXJuYWwgSlNPTk1vZGVsIGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAqIEBwYXJhbSBmaWx0ZXJCYXJJZCBUaGUgSUQgb2YgdGhlIGZpbHRlckJhciB3aG9zZSBtZXNzYWdlcyBzaG91bGQgYmUgcmVtb3ZlZFxuICogQHBhcmFtIGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlcyBUaGUgY3VycmVudCBVT00gdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhpcyBmaWx0ZXJCYXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTWVzc2FnZXMoXG5cdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCB8IHVuZGVmaW5lZCxcblx0ZmlsdGVyQmFySWQ6IHN0cmluZyxcblx0ZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlcykubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGFsbE1lc3NhZ2VzOiBNZXNzYWdlW10gPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzVG9SZW1vdmUgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG0pID0+IE9iamVjdC52YWx1ZXMoZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKS5pbmNsdWRlcyhtLmdldElkKCkpKTtcblx0XHRpZiAobWVzc2FnZXNUb1JlbW92ZS5sZW5ndGgpIHtcblx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhtZXNzYWdlc1RvUmVtb3ZlKTtcblx0XHR9XG5cdFx0Ly8gQ2xlYXIgdGhlIHVvbVZhbGlkYXRpb25NZXNzYWdlcyBwcm9wZXJ0eSBmb3IgdGhpcyBzcGVjaWZpYyBmaWx0ZXJCYXJcblx0XHRpZiAoaW50ZXJuYWxNb2RlbCkge1xuXHRcdFx0Y29uc3QgYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIikgfHwge307XG5cdFx0XHRjb25zdCB1cGRhdGVkTWVzc2FnZXMgPSB7IC4uLmFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyB9O1xuXHRcdFx0ZGVsZXRlIHVwZGF0ZWRNZXNzYWdlc1tmaWx0ZXJCYXJJZF07XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3VvbVZhbGlkYXRpb25NZXNzYWdlc1wiLCB1cGRhdGVkTWVzc2FnZXMpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBmaWVsZHMuXG4gKiBAcGFyYW0gZmlsdGVyQmFyIFRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBmaWVsZHMgZXhpc3QgYW5kIHdob3NlIElEIHdpbGwgYmUgdXNlZCBhcyBtZXNzYWdlIHN0b3JhZ2Uga2V5XG4gKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIHRvIGJlIGV2YWx1YXRlZCB3aGljaCBoYXMgYSBmaWVsZEtleSBhbmQgbGFiZWxcbiAqIEBwYXJhbSBmaWVsZC5maWVsZEtleVxuICogQHBhcmFtIGZpZWxkLmxhYmVsXG4gKiBAcGFyYW0gdW9tUHJvcGVydHkgVGhlIFVPTSBwcm9wZXJ0eSBpZiBhbnkgZXhpc3RzIGZvciB0aGUgZmllbGRcbiAqIEBwYXJhbSB1b21Qcm9wZXJ0eS5wYXRoXG4gKiBAcGFyYW0gdW9tUHJvcGVydHkubGFiZWxcbiAqIEBwYXJhbSBmaWx0ZXJUeXBlIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXJCYXJcbiAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG4gKiBAcGFyYW0gYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50XG4gKiBAcGFyYW0gcmVhc29uXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgaW50ZXJuYWwgSlNPTk1vZGVsIGZvciBtZXNzYWdlIHN0b3JhZ2VcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHdoZXRoZXIgd2UgaGF2ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgc3RhdGVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXJGaWVsZChcblx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdGZpZWxkOiB7IGZpZWxkS2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSxcblx0dW9tUHJvcGVydHk6IHsgcGF0aDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0sXG5cdGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdGFkYXB0YXRpb25Db250cm9sRWxlbWVudDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCxcblx0cmVhc29uOiBzdHJpbmcsXG5cdGludGVybmFsTW9kZWw/OiBKU09OTW9kZWxcbik6IHsgaGFzRXJyb3I6IGJvb2xlYW47IGhhc1dhcm5pbmc6IGJvb2xlYW4gfSB7XG5cdGNvbnN0IHsgZmllbGRLZXksIGxhYmVsIH0gPSBmaWVsZDtcblx0Y29uc3QgYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aCA9IHVvbVByb3BlcnR5LnBhdGg7XG5cdGNvbnN0IGZpbHRlckJhckNvbmRpdGlvbnMgPSBmaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpO1xuXHRjb25zdCBpc0ZpZWxkTmFtZUluQ29uZGl0aW9ucyA9ICEhZmlsdGVyQmFyQ29uZGl0aW9ucz8uW2ZpZWxkS2V5XT8ubGVuZ3RoO1xuXHRjb25zdCBpc1VPTUluQ29uZGl0aW9ucyA9IGFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGggPyBmaWx0ZXJCYXJDb25kaXRpb25zPy5bYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aF0/Lmxlbmd0aCA9PT0gMSA6IGZhbHNlO1xuXHRjb25zdCBkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9ucyA9IGFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGggPyBmaWx0ZXJCYXJDb25kaXRpb25zPy5bYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aF0/Lmxlbmd0aCA+IDEgOiBmYWxzZTtcblx0Y29uc3QgbGVhZGluZ0ZpbHRlckZpZWxkID0gZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5nZXRQcm9wZXJ0eUtleSgpID09PSBmaWVsZEtleSk7XG5cdGNvbnN0IHVvbUZpbHRlckZpZWxkID0gZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5nZXRQcm9wZXJ0eUtleSgpID09PSBhc3NvY2lhdGVkVU9NUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbWVzc2FnZVRleHQgPSBkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9uc1xuXHRcdD8gcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dD8uKFwiRklMVEVSRklFTERfVkFMVUVfVU9NX01VTFRJUExFXCIsIFt1b21GaWx0ZXJGaWVsZD8uZ2V0TGFiZWwoKSA/PyB1b21Qcm9wZXJ0eT8ubGFiZWxdKVxuXHRcdDogcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dD8uKFwiRklMVEVSRklFTERfVkFMVUVfTk9fVU9NXCIsIFtcblx0XHRcdFx0bGVhZGluZ0ZpbHRlckZpZWxkPy5nZXRMYWJlbCgpID8/IGxhYmVsLFxuXHRcdFx0XHR1b21GaWx0ZXJGaWVsZD8uZ2V0TGFiZWwoKSA/PyB1b21Qcm9wZXJ0eT8ubGFiZWxcblx0XHQgIF0pO1xuXHRpZiAoIWlzRmllbGROYW1lSW5Db25kaXRpb25zIHx8IChpc0ZpZWxkTmFtZUluQ29uZGl0aW9ucyAmJiBpc1VPTUluQ29uZGl0aW9ucykpIHtcblx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdH1cblxuXHRjb25zdCBpc0Vycm9yID0gc2hvdWxkQ2hlY2tFcnJvclN0YXRlKFxuXHRcdHJlYXNvbixcblx0XHRmaWx0ZXJUeXBlLFxuXHRcdGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRklMVEVSQkFSX1AxM04gPyAoYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEZpbHRlckJhcikgOiBmaWx0ZXJCYXJcblx0KTtcblx0c2V0TWVzc2FnZXMoXG5cdFx0bGVhZGluZ0ZpbHRlckZpZWxkLFxuXHRcdHVvbUZpbHRlckZpZWxkLFxuXHRcdGlzRXJyb3IgPyBNZXNzYWdlVHlwZS5FcnJvciA6IE1lc3NhZ2VUeXBlLldhcm5pbmcsXG5cdFx0bWVzc2FnZVRleHQsXG5cdFx0aW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwsXG5cdFx0ZmlsdGVyQmFyXG5cdCk7XG5cdHJldHVybiB7IGhhc0Vycm9yOiBpc0Vycm9yLCBoYXNXYXJuaW5nOiAhaXNFcnJvciB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIFVJIHN0YXRlIGZvciBhIGxlYWRpbmcgZmlsdGVyIGZpZWxkIGFuZCBpdHMgYXNzb2NpYXRlZCBVT00gZmlsdGVyIGZpZWxkLlxuICogU2V0cyB0aGUgVmFsdWVTdGF0ZSBhbmQgb3B0aW9uYWwgVmFsdWVTdGF0ZVRleHQgb24gdGhlIGxlYWRpbmcgZmlsdGVyIChpZiBwcmVzZW50KSxcbiAqIGFuZCBzZXRzIHRoZSByZXF1aXJlZCBmbGFnIGFzIHdlbGwgYXMgVmFsdWVTdGF0ZSBhbmQgVmFsdWVTdGF0ZVRleHQgb24gdGhlIFVPTSBmaWx0ZXIgKGlmIHByZXNlbnQpLlxuICogQHBhcmFtIGxlYWRpbmdGaWx0ZXJGaWVsZCBUaGUgcHJpbWFyeSAobGVhZGluZykgTURDRmlsdGVyRmllbGQgdG8gdXBkYXRlLiBPbmx5IGl0cyB2YWx1ZSBzdGF0ZSBhbmQgdGV4dCBhcmUgbW9kaWZpZWQuXG4gKiBAcGFyYW0gdW9tRmlsdGVyRmllbGQgVGhlIFVPTSBNRENGaWx0ZXJGaWVsZCB0byB1cGRhdGUuIEl0cyByZXF1aXJlZCBmbGFnLCB2YWx1ZSBzdGF0ZSwgYW5kIHRleHQgYXJlIG1vZGlmaWVkLlxuICogQHBhcmFtIG1lc3NhZ2VUeXBlIFRoZSBWYWx1ZVN0YXRlIHRvIGFwcGx5IHN1Y2ggYXMgTm9uZSwgV2FybmluZywgRXJyb3IsIG9yIFN1Y2Nlc3MuXG4gKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIHRoZSB2YWx1ZSBzdGF0ZS5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBpbnRlcm5hbCBKU09OTW9kZWwgZm9yIG1lc3NhZ2Ugc3RvcmFnZS5cbiAqIEBwYXJhbSBmaWx0ZXJCYXIgVGhlIEZpbHRlckJhciB3aG9zZSBJRCB3aWxsIGJlIHVzZWQgYXMgdGhlIGtleSBmb3IgbWVzc2FnZSBzdG9yYWdlIGluIHRoZSBpbnRlcm5hbCBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2FnZXMoXG5cdGxlYWRpbmdGaWx0ZXJGaWVsZDogTURDRmlsdGVyRmllbGQgfCB1bmRlZmluZWQsXG5cdHVvbUZpbHRlckZpZWxkOiBNRENGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlLFxuXHRtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGludGVybmFsTW9kZWw/OiBKU09OTW9kZWwsXG5cdGZpbHRlckJhcj86IEZpbHRlckJhclxuKTogdm9pZCB7XG5cdGNvbnN0IG1lc3NhZ2VzOiBNZXNzYWdlIHwgTWVzc2FnZVtdID0gW107XG5cdGNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yID8/PSBuZXcgQ29udHJvbE1lc3NhZ2VQcm9jZXNzb3IoKTtcblxuXHQvLyBHZXQgY3VycmVudCBVT00gdmFsaWRhdGlvbiBtZXNzYWdlcyBmcm9tIGludGVybmFsIG1vZGVsXG5cdGNvbnN0IGZpbHRlckJhcklkID0gZmlsdGVyQmFyPy5nZXRJZCgpID8/IFwiXCI7XG5cdGNvbnN0IGFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyA9IGludGVybmFsTW9kZWw/LmdldFByb3BlcnR5KFwiL3VvbVZhbGlkYXRpb25NZXNzYWdlc1wiKSB8fCB7fTtcblx0Y29uc3QgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpbHRlckJhcklkXSB8fCB7fTtcblxuXHRsZXQgbGVhZGluZ01zZzogTWVzc2FnZSB8IHVuZGVmaW5lZDtcblx0aWYgKGxlYWRpbmdGaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnN0IGZpZWxkSWQgPSBsZWFkaW5nRmlsdGVyRmllbGQuZ2V0SWQoKTtcblx0XHQvLyBDaGVjayBpZiBtZXNzYWdlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGZpZWxkIGluIHRoaXMgZmlsdGVyQmFyJ3MgY29udGV4dFxuXHRcdGlmICghZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpZWxkSWRdKSB7XG5cdFx0XHRsZWFkaW5nTXNnID0gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdFx0XHRwcm9jZXNzb3I6IGNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yLFxuXHRcdFx0XHR0eXBlOiBtZXNzYWdlVHlwZSxcblx0XHRcdFx0dGFyZ2V0OiBmaWVsZElkICsgXCIvY29uZGl0aW9uc1wiXG5cdFx0XHR9KTtcblx0XHRcdG1lc3NhZ2VzLnB1c2gobGVhZGluZ01zZyk7XG5cdFx0XHQvLyBTdG9yZSBtZXNzYWdlIElEIGluIGZpbHRlckJhcidzIHZhbGlkYXRpb24gbWVzc2FnZXNcblx0XHRcdGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlc1tmaWVsZElkXSA9IGxlYWRpbmdNc2cuZ2V0SWQoKTtcblx0XHR9XG5cdH1cblx0aWYgKHVvbUZpbHRlckZpZWxkICYmIHVvbVN0YXRlTWFwW3VvbUZpbHRlckZpZWxkLmdldElkKCldICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodW9tU3RhdGVNYXBbdW9tRmlsdGVyRmllbGQuZ2V0SWQoKV0/Lm1lc3NhZ2VUeXBlID09PSBNZXNzYWdlVHlwZS5Ob25lKSB7XG5cdFx0XHRzZXRNZXNzYWdlRm9yVU9NRmllbGQodW9tRmlsdGVyRmllbGQsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlLCBtZXNzYWdlcywgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodW9tRmlsdGVyRmllbGQpIHtcblx0XHRzZXRNZXNzYWdlRm9yVU9NRmllbGQodW9tRmlsdGVyRmllbGQsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlLCBtZXNzYWdlcywgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0fVxuXG5cdC8vIFVwZGF0ZSBpbnRlcm5hbCBtb2RlbCB3aXRoIG5ldyBtZXNzYWdlcyBmb3IgdGhpcyBmaWx0ZXJCYXJcblx0aWYgKGludGVybmFsTW9kZWwpIHtcblx0XHRjb25zdCB1cGRhdGVkQWxsTWVzc2FnZXMgPSB7IC4uLmFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyB9O1xuXHRcdHVwZGF0ZWRBbGxNZXNzYWdlc1tmaWx0ZXJCYXJJZF0gPSBmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXM7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIiwgdXBkYXRlZEFsbE1lc3NhZ2VzKTtcblx0fVxuXHRpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKG1lc3NhZ2VzKTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXRNZXNzYWdlRm9yVU9NRmllbGQoXG5cdHVvbUZpZWxkOiBNRENGaWx0ZXJGaWVsZCxcblx0bWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlLFxuXHRtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1lc3NhZ2VzOiBNZXNzYWdlW10sXG5cdHVvbVZhbGlkYXRpb25NZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGZpZWxkSWQgPSB1b21GaWVsZC5nZXRJZCgpO1xuXHQvLyBDaGVjayBpZiBtZXNzYWdlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGZpZWxkXG5cdGlmICh1b21WYWxpZGF0aW9uTWVzc2FnZXNbZmllbGRJZF0pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IG1zZyA9IG5ldyBNZXNzYWdlKHtcblx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdHByb2Nlc3NvcjogY29udHJvbE1lc3NhZ2VQcm9jZXNzb3IsXG5cdFx0dHlwZTogbWVzc2FnZVR5cGUsXG5cdFx0dGFyZ2V0OiBmaWVsZElkICsgXCIvY29uZGl0aW9uc1wiXG5cdH0pO1xuXHRtZXNzYWdlcy5wdXNoKG1zZyk7XG5cdHVvbVN0YXRlTWFwW2ZpZWxkSWRdID0geyBtZXNzYWdlVHlwZSB9O1xuXG5cdC8vIFN0b3JlIG1lc3NhZ2UgSUQgaW4gdW9tVmFsaWRhdGlvbk1lc3NhZ2VzXG5cdHVvbVZhbGlkYXRpb25NZXNzYWdlc1tmaWVsZElkXSA9IG1zZy5nZXRJZCgpO1xuXHRyZXR1cm4gbXNnO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBVT00tcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBmaWx0ZXIgY29udHJvbCdzIG1ldGFkYXRhLlxuICogUHJvY2Vzc2VzIGZpbHRlciBmaWVsZHMgdG8gaWRlbnRpZnkgbWVhc3VyZSBmaWVsZHMgd2l0aCBhc3NvY2lhdGVkIFVPTSBmaWVsZHNcbiAqIHRocm91Z2ggSVNPQ3VycmVuY3kgb3IgVW5pdCBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlUGF0aCBQYXRoIHRvIHRoZSBlbnRpdHkgdHlwZSBjb250YWluaW5nIHRoZSBmaWx0ZXIgZmllbGRzXG4gKiBAcGFyYW0gZmlsdGVyQ29udHJvbCBUaGUgZmlsdGVyIGNvbnRyb2wgdG8gaW5zcGVjdCBmb3IgVU9NIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNZXRhTW9kZWxcbiAqIEByZXR1cm5zIEFycmF5IG9mIFVPTVByb3BlcnR5IG9iamVjdHMgY29udGFpbmluZyBtZWFzdXJlIGZpZWxkIGluZm9ybWF0aW9uXG4gKiBhbmQgdGhlaXIgYXNzb2NpYXRlZCBVT00gZmllbGQgZGV0YWlsc1xuICovXG5mdW5jdGlvbiBnZXRVT01Qcm9wZXJ0aWVzKFxuXHRlbnRpdHlUeXBlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRmaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbCxcblx0bWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWRcbik6IFVPTVByb3BlcnR5W10ge1xuXHRjb25zdCBpbmNsdWRlSGlkZGVuID0gZmlsdGVyQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLmZpbHRlcmJhci52aC5GaWx0ZXJCYXJcIikgPyB0cnVlIDogdW5kZWZpbmVkO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHMgPSBGaWx0ZXJVdGlscy5nZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMoZmlsdGVyQ29udHJvbCwgZW50aXR5VHlwZVBhdGgsIGluY2x1ZGVIaWRkZW4sIG1ldGFNb2RlbCk7XG5cdGNvbnN0IGNvbnZlcnRlckNvbnRleHQgPSBGaWx0ZXJVdGlscy5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0KGZpbHRlckNvbnRyb2wsIGVudGl0eVR5cGVQYXRoLCBtZXRhTW9kZWwpO1xuXHRyZXR1cm4gZmlsdGVyRmllbGRzXG5cdFx0Lm1hcCgoZmlsdGVyRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCkgPT4ge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBmaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cdFx0XHRpZiAoYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKS5yZXNvbHZlUGF0aDxQcm9wZXJ0eT4oYW5ub3RhdGlvblBhdGgpLnRhcmdldDtcblx0XHRcdFx0Y29uc3QgdW9tUHJvcGVydHkgPSBwcm9wZXJ0eUFubm90YXRpb25zPy5hbm5vdGF0aW9ucy5NZWFzdXJlcztcblx0XHRcdFx0aWYgKHVvbVByb3BlcnR5Py5JU09DdXJyZW5jeSB8fCB1b21Qcm9wZXJ0eT8uVW5pdCkge1xuXHRcdFx0XHRcdGxldCB1b21Qcm9wZXJ0eU9iamVjdDtcblx0XHRcdFx0XHRjb25zdCB1b21QYXRoID1cblx0XHRcdFx0XHRcdCh1b21Qcm9wZXJ0eSBhcyB7IElTT0N1cnJlbmN5PzogeyBwYXRoOiBzdHJpbmcgfSB9KT8uSVNPQ3VycmVuY3k/LnBhdGggfHxcblx0XHRcdFx0XHRcdCh1b21Qcm9wZXJ0eSBhcyB7IFVuaXQ/OiB7IHBhdGg6IHN0cmluZyB9IH0pPy5Vbml0Py5wYXRoO1xuXHRcdFx0XHRcdGlmICh1b21QYXRoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB1b21MYWJlbCA9IGZpbHRlckZpZWxkcy5maW5kKChmZikgPT4gZmYua2V5ID09PSB1b21QYXRoKT8ubGFiZWw7XG5cdFx0XHRcdFx0XHR1b21Qcm9wZXJ0eU9iamVjdCA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogdW9tUGF0aCxcblx0XHRcdFx0XHRcdFx0bGFiZWw6XG5cdFx0XHRcdFx0XHRcdFx0dW9tTGFiZWwgPz9cblx0XHRcdFx0XHRcdFx0XHQodW9tUHJvcGVydHk/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgUHJvcGVydHlQYXRoKT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwgPz9cblx0XHRcdFx0XHRcdFx0XHQodW9tUHJvcGVydHk/LlVuaXQgYXMgdW5rbm93biBhcyBQcm9wZXJ0eVBhdGgpPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGZpZWxkOiB7IGZpZWxkS2V5OiBmaWx0ZXJGaWVsZEluZm8ua2V5ID8/IFwiXCIsIGxhYmVsOiBmaWx0ZXJGaWVsZEluZm8ubGFiZWwgPz8gXCJcIiB9LFxuXHRcdFx0XHRcdFx0dW9tUHJvcGVydHk6IHVvbVByb3BlcnR5T2JqZWN0XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSlcblx0XHQuZmlsdGVyKEJvb2xlYW4pIGFzIFVPTVByb3BlcnR5W107XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVPTVZhbGlkYXRpb25EZWxlZ2F0ZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUF1QkE7O0VBR0EsTUFBTUEscUJBQXFCLEdBQUc7SUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHdCQUF3QixFQUFFLGVBQUFBLENBQWdCQyxTQUFvQixFQUFFQyxZQUFvQixFQUFzQztNQUN6SCxNQUFNQyx3QkFBd0IsR0FBR0MsVUFBVSxDQUFDQyxjQUFjLENBQUNKLFNBQVMsQ0FBQ0ssY0FBYyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBVyxDQUFDO01BQ3pILE1BQU1DLFVBQVUsR0FBR0MsZ0JBQWdCLENBQUNQLFNBQVMsRUFBRUUsd0JBQTZDLENBQUM7TUFDN0YsTUFBTTtRQUFFTSxRQUFRO1FBQUVDO01BQVcsQ0FBQyxHQUFHLE1BQU1YLHFCQUFxQixDQUFDWSxvQkFBb0IsQ0FDaEZWLFNBQVMsRUFDVEEs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