@sapui5/sap.fe.macros 1.138.0 → 1.139.1

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 (210) 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 +269 -0
  4. package/src/sap/fe/macros/Breadcrumbs.tsx +243 -0
  5. package/src/sap/fe/macros/Chart.js +1 -1
  6. package/src/sap/fe/macros/Chart.tsx +1 -1
  7. package/src/sap/fe/macros/CommonHelper.js +2 -2
  8. package/src/sap/fe/macros/CommonHelper.ts +1 -1
  9. package/src/sap/fe/macros/Field.js +21 -4
  10. package/src/sap/fe/macros/Field.ts +21 -3
  11. package/src/sap/fe/macros/FooterContent.js +40 -10
  12. package/src/sap/fe/macros/FooterContent.tsx +44 -8
  13. package/src/sap/fe/macros/FormElement.js +2 -2
  14. package/src/sap/fe/macros/FormElement.ts +1 -2
  15. package/src/sap/fe/macros/MultiValueField.js +17 -4
  16. package/src/sap/fe/macros/MultiValueField.tsx +7 -2
  17. package/src/sap/fe/macros/RichTextEditor.js +30 -6
  18. package/src/sap/fe/macros/RichTextEditor.tsx +34 -7
  19. package/src/sap/fe/macros/Share.js +73 -40
  20. package/src/sap/fe/macros/Share.tsx +29 -1
  21. package/src/sap/fe/macros/ValueHelp.js +4 -29
  22. package/src/sap/fe/macros/ValueHelp.tsx +2 -43
  23. package/src/sap/fe/macros/ai/EasyFillButton.js +10 -4
  24. package/src/sap/fe/macros/ai/EasyFillButton.tsx +8 -1
  25. package/src/sap/fe/macros/ai/EasyFillDialog.js +25 -10
  26. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +32 -23
  27. package/src/sap/fe/macros/ai/EasyFilterBar.js +30 -30
  28. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +40 -43
  29. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +11 -5
  30. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +14 -5
  31. package/src/sap/fe/macros/chart/ChartDelegate.js +4 -4
  32. package/src/sap/fe/macros/chart/ChartDelegate.ts +3 -3
  33. package/src/sap/fe/macros/chart/MdcChartTemplate.js +20 -6
  34. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +16 -8
  35. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +5 -1
  36. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +4 -0
  37. package/src/sap/fe/macros/controls/FieldWrapper.js +9 -3
  38. package/src/sap/fe/macros/controls/FieldWrapper.ts +11 -2
  39. package/src/sap/fe/macros/controls/FilterBar.js +86 -3
  40. package/src/sap/fe/macros/controls/FilterBar.ts +97 -2
  41. package/src/sap/fe/macros/controls/RequiredFlexBox.js +62 -0
  42. package/src/sap/fe/macros/controls/RequiredFlexBox.tsx +20 -0
  43. package/src/sap/fe/macros/controls/Section.js +3 -2
  44. package/src/sap/fe/macros/controls/Section.ts +2 -1
  45. package/src/sap/fe/macros/controls/filterbar/VisualFilter.js +21 -11
  46. package/src/sap/fe/macros/controls/filterbar/VisualFilter.ts +25 -11
  47. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.js +11 -2
  48. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.ts +12 -1
  49. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.js +18 -1
  50. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.ts +20 -0
  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/designtime/Designtime.helper.js +12 -2
  54. package/src/sap/fe/macros/designtime/Designtime.helper.ts +12 -0
  55. package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +16 -5
  56. package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +6 -1
  57. package/src/sap/fe/macros/field/FieldBaseDelegate.js +20 -8
  58. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +34 -9
  59. package/src/sap/fe/macros/field/FieldFormatOptions.js +73 -44
  60. package/src/sap/fe/macros/field/FieldFormatOptions.ts +20 -2
  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/filter/FilterUtils.js +7 -1
  64. package/src/sap/fe/macros/filter/FilterUtils.ts +7 -0
  65. package/src/sap/fe/macros/filterBar/FilterBar.block.js +8 -2
  66. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +2 -5
  67. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +8 -8
  68. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +8 -8
  69. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.js +3 -1
  70. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.ts +2 -0
  71. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +1 -1
  72. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +1 -1
  73. package/src/sap/fe/macros/form/Form.block.js +6 -2
  74. package/src/sap/fe/macros/form/Form.block.ts +4 -1
  75. package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -2
  76. package/src/sap/fe/macros/form/FormContainer.fragment.xml +40 -0
  77. package/src/sap/fe/macros/form/FormContainerAPI.js +14 -16
  78. package/src/sap/fe/macros/form/FormContainerAPI.ts +13 -15
  79. package/src/sap/fe/macros/form/FormDelegate.js +20 -1
  80. package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
  81. package/src/sap/fe/macros/formatters/TableFormatter.js +10 -1
  82. package/src/sap/fe/macros/formatters/TableFormatter.ts +14 -5
  83. package/src/sap/fe/macros/inlineEdit/InlineEdit.js +15 -3
  84. package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +14 -2
  85. package/src/sap/fe/macros/internal/DataPoint.js +2 -1
  86. package/src/sap/fe/macros/internal/DataPoint.tsx +1 -0
  87. package/src/sap/fe/macros/internal/DataPointFormatOptions.js +11 -2
  88. package/src/sap/fe/macros/internal/DataPointFormatOptions.ts +3 -0
  89. package/src/sap/fe/macros/internal/FilterField.block.js +4 -2
  90. package/src/sap/fe/macros/internal/FilterField.block.ts +3 -1
  91. package/src/sap/fe/macros/internal/field/CheckBoxGroup.fragment.xml +25 -0
  92. package/src/sap/fe/macros/internal/field/DisplayStyle.js +52 -12
  93. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +54 -5
  94. package/src/sap/fe/macros/internal/field/EditStyle.js +5 -1
  95. package/src/sap/fe/macros/internal/field/EditStyle.tsx +4 -0
  96. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +9 -2
  97. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +10 -0
  98. package/src/sap/fe/macros/internal/field/FieldStyles.js +1 -1
  99. package/src/sap/fe/macros/internal/field/FieldStyles.tsx +2 -1
  100. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +4 -4
  101. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +3 -3
  102. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -0
  103. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +11 -3
  104. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +12 -7
  105. package/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +1 -0
  106. package/src/sap/fe/macros/library.js +1 -1
  107. package/src/sap/fe/macros/mdc/adapter/StateHelper.js +11 -6
  108. package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +12 -7
  109. package/src/sap/fe/macros/messagebundle.properties +37 -29
  110. package/src/sap/fe/macros/messagebundle_ar.properties +5 -3
  111. package/src/sap/fe/macros/messagebundle_bg.properties +6 -4
  112. package/src/sap/fe/macros/messagebundle_ca.properties +8 -6
  113. package/src/sap/fe/macros/messagebundle_cnr.properties +5 -3
  114. package/src/sap/fe/macros/messagebundle_cs.properties +4 -2
  115. package/src/sap/fe/macros/messagebundle_cy.properties +7 -5
  116. package/src/sap/fe/macros/messagebundle_da.properties +6 -4
  117. package/src/sap/fe/macros/messagebundle_de.properties +11 -9
  118. package/src/sap/fe/macros/messagebundle_el.properties +7 -5
  119. package/src/sap/fe/macros/messagebundle_en.properties +8 -6
  120. package/src/sap/fe/macros/messagebundle_en_GB.properties +8 -6
  121. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +8 -6
  122. package/src/sap/fe/macros/messagebundle_es.properties +6 -4
  123. package/src/sap/fe/macros/messagebundle_es_MX.properties +6 -4
  124. package/src/sap/fe/macros/messagebundle_et.properties +5 -3
  125. package/src/sap/fe/macros/messagebundle_fi.properties +8 -6
  126. package/src/sap/fe/macros/messagebundle_fr.properties +6 -4
  127. package/src/sap/fe/macros/messagebundle_fr_CA.properties +8 -6
  128. package/src/sap/fe/macros/messagebundle_hi.properties +6 -4
  129. package/src/sap/fe/macros/messagebundle_hr.properties +6 -4
  130. package/src/sap/fe/macros/messagebundle_hu.properties +4 -2
  131. package/src/sap/fe/macros/messagebundle_id.properties +8 -6
  132. package/src/sap/fe/macros/messagebundle_it.properties +4 -2
  133. package/src/sap/fe/macros/messagebundle_iw.properties +5 -3
  134. package/src/sap/fe/macros/messagebundle_ja.properties +5 -3
  135. package/src/sap/fe/macros/messagebundle_kk.properties +5 -3
  136. package/src/sap/fe/macros/messagebundle_ko.properties +4 -2
  137. package/src/sap/fe/macros/messagebundle_lt.properties +6 -4
  138. package/src/sap/fe/macros/messagebundle_lv.properties +5 -3
  139. package/src/sap/fe/macros/messagebundle_mk.properties +5 -3
  140. package/src/sap/fe/macros/messagebundle_ms.properties +8 -6
  141. package/src/sap/fe/macros/messagebundle_nl.properties +7 -5
  142. package/src/sap/fe/macros/messagebundle_no.properties +6 -4
  143. package/src/sap/fe/macros/messagebundle_pl.properties +6 -4
  144. package/src/sap/fe/macros/messagebundle_pt.properties +7 -5
  145. package/src/sap/fe/macros/messagebundle_pt_PT.properties +6 -4
  146. package/src/sap/fe/macros/messagebundle_ro.properties +7 -5
  147. package/src/sap/fe/macros/messagebundle_ru.properties +4 -2
  148. package/src/sap/fe/macros/messagebundle_sh.properties +5 -3
  149. package/src/sap/fe/macros/messagebundle_sk.properties +5 -3
  150. package/src/sap/fe/macros/messagebundle_sl.properties +6 -4
  151. package/src/sap/fe/macros/messagebundle_sr.properties +5 -3
  152. package/src/sap/fe/macros/messagebundle_sv.properties +5 -3
  153. package/src/sap/fe/macros/messagebundle_th.properties +4 -2
  154. package/src/sap/fe/macros/messagebundle_tr.properties +4 -2
  155. package/src/sap/fe/macros/messagebundle_uk.properties +10 -8
  156. package/src/sap/fe/macros/messagebundle_vi.properties +6 -4
  157. package/src/sap/fe/macros/messagebundle_zh_CN.properties +5 -3
  158. package/src/sap/fe/macros/messagebundle_zh_TW.properties +5 -3
  159. package/src/sap/fe/macros/messages/MessageButton.js +17 -19
  160. package/src/sap/fe/macros/messages/MessageButton.ts +24 -22
  161. package/src/sap/fe/macros/table/Action.js +24 -2
  162. package/src/sap/fe/macros/table/Action.ts +13 -0
  163. package/src/sap/fe/macros/table/ActionGroup.js +24 -2
  164. package/src/sap/fe/macros/table/ActionGroup.ts +13 -0
  165. package/src/sap/fe/macros/table/ActionGroupOverride.js +24 -2
  166. package/src/sap/fe/macros/table/ActionGroupOverride.ts +13 -0
  167. package/src/sap/fe/macros/table/ActionOverride.js +24 -2
  168. package/src/sap/fe/macros/table/ActionOverride.ts +13 -0
  169. package/src/sap/fe/macros/table/ActionsTemplating.js +73 -12
  170. package/src/sap/fe/macros/table/ActionsTemplating.tsx +69 -13
  171. package/src/sap/fe/macros/table/Column.js +3 -3
  172. package/src/sap/fe/macros/table/Column.ts +2 -2
  173. package/src/sap/fe/macros/table/MdcTableTemplate.js +20 -8
  174. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +32 -6
  175. package/src/sap/fe/macros/table/QuickFilterSelector.js +35 -14
  176. package/src/sap/fe/macros/table/QuickFilterSelector.tsx +22 -3
  177. package/src/sap/fe/macros/table/Table.block.js +137 -108
  178. package/src/sap/fe/macros/table/Table.block.tsx +29 -2
  179. package/src/sap/fe/macros/table/Table.js +7 -1
  180. package/src/sap/fe/macros/table/Table.tsx +7 -1
  181. package/src/sap/fe/macros/table/TableAPI.js +150 -133
  182. package/src/sap/fe/macros/table/TableAPI.ts +20 -3
  183. package/src/sap/fe/macros/table/TableDefinition.js +4 -2
  184. package/src/sap/fe/macros/table/TableDefinition.ts +3 -1
  185. package/src/sap/fe/macros/table/TableRuntime.js +3 -3
  186. package/src/sap/fe/macros/table/TableRuntime.ts +2 -2
  187. package/src/sap/fe/macros/table/TableSizeHelper.js +3 -3
  188. package/src/sap/fe/macros/table/TableSizeHelper.ts +5 -2
  189. package/src/sap/fe/macros/table/TreeTable.js +7 -1
  190. package/src/sap/fe/macros/table/TreeTable.tsx +7 -1
  191. package/src/sap/fe/macros/table/delegates/TableDelegate.js +27 -20
  192. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +35 -26
  193. package/src/sap/fe/macros/table/designtime/Table.designtime.js +3 -1
  194. package/src/sap/fe/macros/table/designtime/Table.designtime.ts +2 -0
  195. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +10 -10
  196. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +11 -9
  197. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +8 -8
  198. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +7 -6
  199. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.js +3 -1
  200. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.ts +2 -1
  201. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -1
  202. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +1 -0
  203. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +4 -1
  204. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +3 -0
  205. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +37 -8
  206. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +47 -16
  207. package/src/sap/fe/macros/visualfilters/VisualFilter.js +95 -6
  208. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +93 -2
  209. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +15 -3
  210. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +17 -2
@@ -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/core/CommonUtils", "sap/fe/core/converters/MetaModelConverter", "sap/ui/core/Element", "sap/ui/mdc/field/FieldBaseDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/mdc/p13n/StateUtil", "sap/ui/model/Filter", "../CommonHelper"], function (Log, CommonUtils, MetaModelConverter, Element, FieldBaseDelegate, TypeMap, StateUtil, Filter, CommonHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConverter", "sap/ui/core/Component", "sap/ui/core/Element", "sap/ui/mdc/field/FieldBaseDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/mdc/p13n/StateUtil", "sap/ui/model/Filter", "../CommonHelper", "../valuehelp/ValueHelpDelegate"], function (Log, CommonUtils, MetaModelConverter, Component, Element, FieldBaseDelegate, TypeMap, StateUtil, Filter, CommonHelper, ValueHelpDelegate) {
6
6
  "use strict";
7
7
 
8
8
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
@@ -198,17 +198,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
198
198
  * @param config Configuration Object
199
199
  * @returns Object containing description, key, and payload. If it is not available right now (must be requested), a <code>Promise</code> is returned
200
200
  */
201
- getItemForValue: function (field, valueHelp, config) {
201
+ getItemForValue: async function (field, valueHelp, config) {
202
202
  //BCP: 2270162887 . The MDC field should not try to get the item when the field is emptied
203
203
  // JIRA: FIORITECHP1-25361 - Improve the type-ahead behavior for missinng text annotation or constraints violations of the existing text annotation
204
204
  if (config.value === "") {
205
205
  return;
206
206
  }
207
207
  if (config.checkDescription) {
208
- const valuehelpPayload = valueHelp.getPayload();
209
- const descriptionPath = valuehelpPayload.valueHelpDescriptionPath;
210
- const maxLength = valuehelpPayload?.maxLength;
211
- const valueLength = config.value !== null && config.value !== undefined ? config.value.toString().length : 0;
208
+ const container = valueHelp.getTypeahead();
209
+ const payload = valueHelp.getPayload();
210
+ const selectedContent = container.getSelectedContent();
211
+ const contentId = selectedContent && selectedContent.getId();
212
+ // In cases where getItemForValue is called before showValueList, the description may not be available.
213
+ // Therefore, this retrieveContent method is used to update the description.
214
+ await ValueHelpDelegate.retrieveContent(valueHelp, container, contentId);
215
+ const maxLength = payload.maxLength;
216
+ const valueLength = config.value?.toString().length || 0;
217
+ const descriptionPath = payload.valueHelpDescriptionPath;
212
218
  if (descriptionPath === "") {
213
219
  // In case the property value help collection has no text annotation (descriptionPath is empty) the description check shouldn´t occur.
214
220
  // In such a case the method getDescription will be called by MDC and within this method a SideEffect is requested to retrieve the text from the text property of the main entity
@@ -256,7 +262,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
256
262
  * @param _type Type of the value
257
263
  * @returns Description for the key or object containing a description, key and payload. If the description is not available right away (it must be requested), a <code>Promise</code> is returned
258
264
  */
259
- getDescription: async function (field, valueHelp, key, _conditionIn, _conditionOut, bindingContext, _ConditionModel, _conditionModelName, conditionPayload, control, _type) {
265
+ getDescription: async function (field, valueHelp, key, _conditionIn, _conditionOut, bindingContext, _ConditionModel, _conditionModelName, conditionPayload, control, _type, emptyAllowed) {
260
266
  //JIRA: FIORITECHP1-22022 . The MDC field should not tries to determine description with the initial GET of the data.
261
267
  // it should rely on the data we already received from the backend
262
268
  // But The getDescription function is also called in the FilterField case if a variant is loaded.
@@ -272,6 +278,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
272
278
  }
273
279
  if (payload?.retrieveTextFromValueList === true || payload?.isFilterField === true) {
274
280
  const dataModel = valueHelp.getModel();
281
+ const owner = Component.getOwnerComponentFor(valueHelp);
282
+ // If neither dataModel nor owner is defined, the valueHelp cannot be an FE control.
283
+ // This occurs in cases of a standard MDC controls (e.g., default ValueHelp for boolean values).
284
+ if (!dataModel && !owner) {
285
+ return FieldBaseDelegate.getDescription(field, valueHelp, key, _conditionIn, _conditionOut, bindingContext, undefined, undefined, conditionPayload, control, _type, emptyAllowed);
286
+ }
275
287
  const metaModel = dataModel ? dataModel.getMetaModel() : CommonUtils.getAppComponent(valueHelp).getModel().getMetaModel();
276
288
  const valuehelpPayload = valueHelp.getPayload();
277
289
  const valuehelpConditionPayload = conditionPayload?.[valuehelpPayload.valueHelpQualifier];
@@ -350,4 +362,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
350
362
  }
351
363
  });
352
364
  }, false);
353
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJGaWVsZEJhc2VEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nIiwiZmllbGQiLCJ0eXBlIiwidmFsdWUiLCJyZXN1bHQiLCJpc0EiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJmb3JtYXRWYWx1ZSIsImJUeXBlSW5pdGlhbGl6ZWQiLCJtQ3VzdG9tVW5pdHMiLCJpbml0aWFsaXplSW50ZXJuYWxVbml0VHlwZSIsInR5cGVJbml0aWFsaXphdGlvbiIsImVuaGFuY2VWYWx1ZUZvclVuaXQiLCJ2YWx1ZXMiLCJwdXNoIiwiZ2V0RGVmYXVsdFZhbHVlSGVscERlbGVnYXRlIiwiX2ZpZWxkIiwibmFtZSIsInBheWxvYWQiLCJnZXRUeXBlTWFwIiwiVHlwZU1hcCIsIl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIiLCJ2YWx1ZUxpc3RJbmZvIiwicHJvcGVydHlOYW1lIiwiUGFyYW1ldGVycyIsImZpbHRlciIsImVudHJ5IiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiX2dldEZpbHRlciIsInZhbHVlTGlzdCIsInZhbHVlSGVscFByb3BlcnR5Iiwia2V5VmFsdWUiLCJ2YWx1ZWhlbHBQYXlsb2FkIiwidmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCIsImJpbmRpbmdDb250ZXh0IiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlcnMiLCJwYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwiJFR5cGUiLCJWYWx1ZUxpc3RQcm9wZXJ0eSIsImZpbHRlclZhbHVlIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJhcGRGaWVsZFBhdGgiLCJhcGRGaWVsZCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldFZhbHVlIiwic291cmNlUGF0aCIsImNvbmRpdGlvblBheWxvYWQiLCJnZXRPYmplY3QiLCJjb25kaXRpb24iLCJvcGVyYXRvciIsIkZpbHRlciIsInBhdGgiLCJ2YWx1ZTEiLCJjb25jYXQiLCJfZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzIiwiJG1vZGVsIiwidmFsdWVMaXN0TW9kZWwiLCJDb2xsZWN0aW9uUGF0aCIsImNvbGxlY3Rpb25QYXRoIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRNZXRhQ29udGV4dCIsImVudGl0eVR5cGUiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWxsTG9jYWxEYXRhUHJvcGVydGllcyIsInJlZHVjZSIsImFyciIsImFsbFJlbWFpbmluZ0tleXMiLCJrZXlzIiwiX3JlZiIsImtleU5hbWUiLCJpbmNsdWRlcyIsImhhc093blByb3BlcnR5Iiwia2V5Iiwia2V5Q29udGV4dCIsIkNvbW1vbkhlbHBlciIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwiZ2V0SXRlbUZvclZhbHVlIiwidmFsdWVIZWxwIiwiY29uZmlnIiwiY2hlY2tEZXNjcmlwdGlvbiIsImdldFBheWxvYWQiLCJkZXNjcmlwdGlvblBhdGgiLCJ2YWx1ZUhlbHBEZXNjcmlwdGlvblBhdGgiLCJtYXhMZW5ndGgiLCJ2YWx1ZUxlbmd0aCIsInRvU3RyaW5nIiwiX2dldEZpbHRlckJhciIsImZpbHRlckJhckFQSSIsImdldFBhcmVudCIsImdldENvbnRlbnQiLCJnZXREZXNjcmlwdGlvbiIsIl9jb25kaXRpb25JbiIsIl9jb25kaXRpb25PdXQiLCJfQ29uZGl0aW9uTW9kZWwiLCJfY29uZGl0aW9uTW9kZWxOYW1lIiwiY29udHJvbCIsIl90eXBlIiwiZ2V0RGlzcGxheSIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJpc0ZpbHRlckZpZWxkIiwiZGF0YU1vZGVsIiwiZ2V0TW9kZWwiLCJtZXRhTW9kZWwiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsInZhbHVlSGVscFF1YWxpZmllciIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5RGVzY3JpcHRpb25QYXRoIiwidGV4dFByb3BlcnR5IiwicmVxdWVzdFZhbHVlTGlzdEluZm8iLCJmaWx0ZXJCYXIiLCJmaWx0ZXJDb25kaXRpb25zIiwiZmlsdGVyU3RhdGUiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ2YWx1ZUhlbHBQYXJhbWV0ZXJzIiwiRXJyb3IiLCJ0ZXh0QW5ub3RhdGlvbiIsIiRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiRzZWxlY3QiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwic2lkZUVmZmVjdFBhdGgiLCJzdWJzdHJpbmciLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJMb2ciLCJ3YXJuaW5nIiwiZXh0ZXJuYWxJZFBhdGgiLCJleHRlcm5hbElkRnVsbFBhdGgiLCJyZXBsYWNlIiwiZXh0ZXJuYWxJZE5hbWUiLCJleHRlcm5hbElkRGVzY3JpcHRpb25QYXRoIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwiU3RyaW5nIiwibXNnIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJGaWVsZEJhc2VEZWxlZ2F0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsIFZhbHVlSGVscFBheWxvYWQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCB0eXBlIHsgSXRlbUZvclZhbHVlQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHsgdHlwZSBDb25kaXRpb25PYmplY3QgfSBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb25kaXRpb25Nb2RlbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uTW9kZWxcIjtcbmltcG9ydCB0eXBlIEZpZWxkQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VcIjtcbmltcG9ydCBGaWVsZEJhc2VEZWxlZ2F0ZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgU2ltcGxlVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL1NpbXBsZVR5cGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwiLi4vQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcIi4uL2NvbnRyb2xzL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyQVBJIGZyb20gXCIuLi9maWx0ZXJCYXIvRmlsdGVyQmFyQVBJXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvblBheWxvYWRNYXAsIENvbmRpdGlvblBheWxvYWRUeXBlLCBFeHRlcm5hbFN0YXRlVHlwZSB9IGZyb20gXCIuLi92YWx1ZWhlbHAvVmFsdWVIZWxwRGVsZWdhdGVcIjtcblxuZXhwb3J0IHR5cGUgRmllbGRQYXlsb2FkID0ge1xuXHRyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0PzogYm9vbGVhbjtcblx0aXNGaWx0ZXJGaWVsZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBWYWx1ZSA9IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgVHlwZUluaXRpYWxpemF0aW9uID0ge1xuXHRiVHlwZUluaXRpYWxpemVkPzogYm9vbGVhbjtcblx0bUN1c3RvbVVuaXRzPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnID0ge1xuXHR2YWx1ZTogVmFsdWU7XG5cdHBhcnNlZFZhbHVlOiBWYWx1ZTtcblx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQ7XG5cdGNoZWNrS2V5OiBib29sZWFuO1xuXHRjaGVja0Rlc2NyaXB0aW9uOiBib29sZWFuO1xuXHRjb25kaXRpb25Nb2RlbD86IENvbmRpdGlvbk1vZGVsO1xuXHRjb25kaXRpb25Nb2RlbE5hbWU/OiBzdHJpbmc7XG5cdGNvbnRyb2w/OiBvYmplY3Q7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKHt9LCBGaWVsZEJhc2VEZWxlZ2F0ZSwge1xuXHRhcGlWZXJzaW9uOiAyLFxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgPGNvZGU+RmllbGQ8L2NvZGU+IGNvbnRyb2wgaXMgdXNlZCwgdGhlIHVzZWQgZGF0YSB0eXBlIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYmluZGluZy5cblx0ICogSW4gVjQtdW5pdCBvciBjdXJyZW5jeSBjYXNlIGl0IG1pZ2h0IG5lZWQgdG8gYmUgZm9ybWF0dGVkIG9uY2UuXG5cdCAqIFRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIHR5cGUgbGF0ZXIgb24sIHRoZSBjdXJyZW5jaWVzIG11c3QgYmUgcmV0dXJuZWQuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB0eXBlIFR5cGUgZnJvbSBiaW5kaW5nXG5cdCAqIEBwYXJhbSB2YWx1ZSBHaXZlbiB2YWx1ZVxuXHQgKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBpbnRlcm5hbCB0eXBlIChuZWVkcyB0byBzZXQgYlR5cGVJbml0aWFsaXplZCB0byB0cnVlIGlmIGluaXRpYWxpemVkKVxuXHQgKi9cblx0aW5pdGlhbGl6ZVR5cGVGcm9tQmluZGluZzogZnVuY3Rpb24gKGZpZWxkOiBGaWVsZCwgdHlwZTogU2ltcGxlVHlwZSB8IHVuZGVmaW5lZCwgdmFsdWU6IFZhbHVlIHwgVmFsdWVbXSkge1xuXHRcdC8vIFY0IFVuaXQgYW5kIEN1cnJlbmN5IHR5cGVzIGhhdmUgYSBtYXAgd2l0aCB2YWxpZCB1bml0cyBhbmQgY3JlYXRlIGFuIGludGVybmFsIGN1c3RvbWl6aW5nIGZvciBpdC5cblx0XHQvLyBUaGUgRmllbGQgbmVlZHMgdG8ga2VlcCB0aGlzIGN1c3RvbWl6aW5nIGxvZ2ljIHdoZW4gY3JlYXRpbmcgdGhlIGludGVybmFsIHR5cGUuXG5cdFx0Ly8gKEFzIGV4dGVybmFsIFJBVyBiaW5kaW5nIGlzIHVzZWQgdGhlcmUgaXMgbm8gZm9ybWF0dGluZyBvbiBwYXJzaW5nLilcblxuXHRcdGNvbnN0IHJlc3VsdDogVHlwZUluaXRpYWxpemF0aW9uID0ge307XG5cdFx0aWYgKFxuXHRcdFx0dHlwZSAmJlxuXHRcdFx0dHlwZS5pc0EoW1wic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiLCBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCJdKSAmJlxuXHRcdFx0QXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+IDIgJiZcblx0XHRcdHZhbHVlWzJdICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdC8vIGZvcm1hdCBvbmNlIHRvIHNldCBpbnRlcm5hbCBjdXN0b21pemluZy4gQWxsb3cgbnVsbCBhcyB2YWxpZCB2YWx1ZXMgZm9yIGN1c3RvbSB1bml0c1xuXHRcdFx0dHlwZS5mb3JtYXRWYWx1ZSh2YWx1ZSwgXCJzdHJpbmdcIik7XG5cdFx0XHRyZXN1bHQuYlR5cGVJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0XHRyZXN1bHQubUN1c3RvbVVuaXRzID0gdmFsdWVbMl0gYXMgc3RyaW5nOyAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBwcm92aWRlIGN1c3RvbSB1bml0cyB0byBpbnRlcm5hbCB0eXBlXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdW5pdCB0eXBlLlxuXHQgKiBJZiB0aGUgPGNvZGU+RmllbGQ8L2NvZGU+IGNvbnRyb2wgaXMgdXNlZCwgdGhlIHVzZWQgZGF0YSB0eXBlIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYmluZGluZy5cblx0ICogSWYgdGhlIHR5cGUgaXMgYSBWNCB1bml0IG9yIGN1cnJlbmN5LCBpdCBtaWdodCBuZWVkIHRvIGJlIGZvcm1hdHRlZCBvbmNlLlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdHlwZSBUeXBlIGZyb20gYmluZGluZ1xuXHQgKiBAcGFyYW0gdHlwZUluaXRpYWxpemF0aW9uIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGVcblx0ICovXG5cdGluaXRpYWxpemVJbnRlcm5hbFVuaXRUeXBlOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB0eXBlOiBTaW1wbGVUeXBlLCB0eXBlSW5pdGlhbGl6YXRpb24/OiBUeXBlSW5pdGlhbGl6YXRpb24pIHtcblx0XHRpZiAodHlwZUluaXRpYWxpemF0aW9uPy5tQ3VzdG9tVW5pdHMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gaWYgYWxyZWFkeSBpbml0aWFsaXplZCBpbml0aWFsaXplIG5ldyB0eXBlIHRvby5cblx0XHRcdHR5cGUuZm9ybWF0VmFsdWUoW251bGwsIG51bGwsIHR5cGVJbml0aWFsaXphdGlvbi5tQ3VzdG9tVW5pdHNdLCBcInN0cmluZ1wiKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gZW5oYW5jZXMgdGhlIHZhbHVlIHdpdGggdW5pdCBvciBjdXJyZW5jeSBpbmZvcm1hdGlvbiBpZiBuZWVkZWQgYnkgdGhlIGRhdGEgdHlwZS5cblx0ICogQHBhcmFtIGZpZWxkIFRoZSA8Y29kZT5GaWVsZDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtICB2YWx1ZXMgVmFsdWVzXG5cdCAqIEBwYXJhbSAgdHlwZUluaXRpYWxpemF0aW9uIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGVcblx0ICogQHJldHVybnMgVmFsdWVzXG5cdCAqL1xuXHRlbmhhbmNlVmFsdWVGb3JVbml0OiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB2YWx1ZXM6IFZhbHVlW10sIHR5cGVJbml0aWFsaXphdGlvbj86IFR5cGVJbml0aWFsaXphdGlvbikge1xuXHRcdGlmICh0eXBlSW5pdGlhbGl6YXRpb24/LmJUeXBlSW5pdGlhbGl6ZWQgPT09IHRydWUgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0dmFsdWVzLnB1c2godHlwZUluaXRpYWxpemF0aW9uLm1DdXN0b21Vbml0cyk7XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGljaCA8Y29kZT5WYWx1ZUhlbHBEZWxlZ2F0ZTwvY29kZT4gaXMgdXNlZFxuXHQgKiBpZiBhIGRlZmF1bHQgZmllbGQgaGVscCAoZm9yIGV4YW1wbGUsIGZvciBkZWZpbmluZyBjb25kaXRpb25zIGluIDwvY29kZT5GaWx0ZXJGaWVsZDwvY29kZT4pXG5cdCAqIGlzIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBfZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcmV0dXJucyBEZWxlZ2F0ZSBvYmplY3Qgd2l0aCBuYW1lIGFuZCBwYXlsb2FkXG5cdCAqL1xuXHRnZXREZWZhdWx0VmFsdWVIZWxwRGVsZWdhdGU6IGZ1bmN0aW9uIChfZmllbGQ6IEZpZWxkKSB7XG5cdFx0cmV0dXJuIHsgbmFtZTogXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1ZhbHVlSGVscERlbGVnYXRlXCIsIHBheWxvYWQ6IHt9IH07XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF9maWVsZDogRmllbGQpIHtcblx0XHRyZXR1cm4gVHlwZU1hcDtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIGFsbCBwYXJhbWV0ZXJzIGluIGEgdmFsdWUgaGVscCB0aGF0IHVzZSBhIHNwZWNpZmljIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0SW5mbyBWYWx1ZSBsaXN0IGluZm9cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBMaXN0IG9mIGFsbCBmb3VuZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfZ2V0VmFsdWVMaXN0UGFyYW1ldGVyOiBmdW5jdGlvbiAodmFsdWVMaXN0SW5mbzogQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly9kZXRlcm1pbmUgcGF0aCB0byB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdFx0cmV0dXJuIHZhbHVlTGlzdEluZm8uUGFyYW1ldGVycy5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG5cdFx0XHRpZiAoZW50cnkuTG9jYWxEYXRhUHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIGVudHJ5LkxvY2FsRGF0YVByb3BlcnR5LiRQcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIEJ1aWxkIGZpbHRlcnMgZm9yIGVhY2ggcmVsZXZhbnQgcGFyYW1ldGVyLlxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0IFZhbHVlIGxpc3QgaW5mb1xuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBQcm9wZXJ0eSBOYW1lIG9mIHRoZSB2YWx1ZSBoZWxwIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBrZXlWYWx1ZSBWYWx1ZSBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHZhbHVlaGVscFBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCBBZGRpdGlvbmFsIGNvbmRpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBrZXlcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmdDb250ZXh0IG9mIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBMaXN0IG9mIGZpbHRlcnNcblx0ICovXG5cdF9nZXRGaWx0ZXI6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUxpc3Q6IEFubm90YXRpb25WYWx1ZUxpc3RUeXBlLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHZhbHVlSGVscFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0a2V5VmFsdWU6IHN0cmluZyxcblx0XHR2YWx1ZWhlbHBQYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlW10gfCB1bmRlZmluZWQsXG5cdFx0YmluZGluZ0NvbnRleHQ/OiBDb250ZXh0LFxuXHRcdGZpbHRlckJhckNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT5cblx0KSB7XG5cdFx0bGV0IGZpbHRlcnM6IEZpbHRlcltdID0gW107XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IHZhbHVlTGlzdC5QYXJhbWV0ZXJzLmZpbHRlcihmdW5jdGlvbiAocGFyYW1ldGVyKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRwYXJhbWV0ZXIuJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5WYWx1ZUxpc3RQYXJhbWV0ZXJJbiB8fFxuXHRcdFx0XHRwYXJhbWV0ZXIuJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5WYWx1ZUxpc3RQYXJhbWV0ZXJJbk91dCB8fFxuXHRcdFx0XHQocGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eU5hbWUgJiYgcGFyYW1ldGVyLlZhbHVlTGlzdFByb3BlcnR5ID09PSB2YWx1ZUhlbHBQcm9wZXJ0eSlcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0Zm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgcGFyYW1ldGVycykge1xuXHRcdFx0bGV0IGZpbHRlclZhbHVlO1xuXHRcdFx0aWYgKHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdGZpbHRlclZhbHVlID0ga2V5VmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlaGVscFBheWxvYWQ/LmlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nID09PSB0cnVlKSB7XG5cdFx0XHRcdGNvbnN0IGFwZEZpZWxkUGF0aCA9IGBBUERfOjoke3BhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRjb25zdCBhcGRGaWVsZCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXBkRmllbGRQYXRoKSBhcyBGaWVsZDtcblx0XHRcdFx0ZmlsdGVyVmFsdWUgPSBhcGRGaWVsZD8uZ2V0VmFsdWUoKTtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHk7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWQgPSB2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkPy5bMF07XG5cdFx0XHRcdGZpbHRlclZhbHVlID0gc291cmNlUGF0aCAmJiBjb25kaXRpb25QYXlsb2FkPy5bc291cmNlUGF0aF07XG5cdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdC8vIGlmIHRoZSB2YWx1ZSBoZWxwIGlzIG5vdCB1c2VkIHRyeSBnZXR0aW5nIHRoZSBmaWx0ZXIgdmFsdWUgZnJvbSB0aGUgYmluZGluZyBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGZpbHRlclZhbHVlID0gYmluZGluZ0NvbnRleHQuZ2V0T2JqZWN0KHNvdXJjZVBhdGgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWZpbHRlclZhbHVlICYmIGZpbHRlckJhckNvbmRpdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uID0gZmlsdGVyQmFyQ29uZGl0aW9ucz8uW3BhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eV07XG5cdFx0XHRcdGlmIChjb25kaXRpb24/Lmxlbmd0aCA9PT0gMSAmJiBjb25kaXRpb25bMF0/Lm9wZXJhdG9yID09PSBcIkVRXCIpIHtcblx0XHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGNvbmRpdGlvblswXT8udmFsdWVzWzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvKiBBZGQgdmFsdWUgdG8gdGhlIGZpbHRlciBmb3IgdGhlIHRleHQgZGV0ZXJtaW5hdGlvbiAqL1xuXHRcdFx0aWYgKGZpbHRlclZhbHVlICE9PSBudWxsICYmIGZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHksIG9wZXJhdG9yOiBcIkVRXCIsIHZhbHVlMTogZmlsdGVyVmFsdWUgfSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZD8uWzBdKSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIG11bHRpcGxlIGtleXMgZm9yIHRoZSB2YWx1ZWxpc3QgY29sbGVjdGlvbiwgdGhlIG1haW4gVmFsdWVMaXN0UHJvcGVydHkgbWlnaHQgbm90IGJlIHVuaXF1ZSB0byBnZXQgZXhhY3QgdmFsdWUgbGlzdCBzZWxlY3Rpb24uXG5cdFx0XHQvLyBTbywgd2UgYWRkIGZpbHRlcnMgZm9yIGtleSBwcm9wZXJ0aWVzIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQuXG5cdFx0XHRmaWx0ZXJzID0gZmlsdGVycy5jb25jYXQodGhpcy5fZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzKHZhbHVlaGVscENvbmRpdGlvblBheWxvYWRbMF0sIHZhbHVlTGlzdCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmlsdGVycztcblx0fSxcblxuXHQvKipcblx0ICogR2V0IG1vZGVsIGZpbHRlcnMgdG8gZW5zdXJlIGEgcHJlY2lzZSBzZWxlY3Rpb24gZnJvbSB0aGUgY29uZGl0aW9uIHBheWxvYWQuXG5cdCAqIEBwYXJhbSBjb25kaXRpb25QYXlsb2FkIEFkZGl0aW9uYWwgY29uZGl0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGtleVxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0IFZhbHVlIGxpc3QgaW5mb3JtYXRpb25cblx0ICogQHJldHVybnMgTGlzdCBvZiBmaWx0ZXJzXG5cdCAqL1xuXHRfZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzKGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlLCB2YWx1ZUxpc3Q6IEFubm90YXRpb25WYWx1ZUxpc3RUeXBlKTogRmlsdGVyW10ge1xuXHRcdGNvbnN0IHsgJG1vZGVsOiB2YWx1ZUxpc3RNb2RlbCwgQ29sbGVjdGlvblBhdGg6IGNvbGxlY3Rpb25QYXRoLCBQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH0gPSB2YWx1ZUxpc3Q7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSB2YWx1ZUxpc3RNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChgLyR7Y29sbGVjdGlvblBhdGh9YCk7XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBhbGxMb2NhbERhdGFQcm9wZXJ0aWVzID0gcGFyYW1ldGVycy5yZWR1Y2UoKGFyciwgcGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRpZiAocGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGFyci5wdXNoKHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fSwgW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGFsbFJlbWFpbmluZ0tleXMgPSBlbnRpdHlUeXBlLmtleXMucmVkdWNlKChhcnIsIHsgbmFtZToga2V5TmFtZSB9KSA9PiB7XG5cdFx0XHRpZiAoIWFsbExvY2FsRGF0YVByb3BlcnRpZXMuaW5jbHVkZXMoa2V5TmFtZSkgJiYgY29uZGl0aW9uUGF5bG9hZC5oYXNPd25Qcm9wZXJ0eShrZXlOYW1lKSkge1xuXHRcdFx0XHRhcnIucHVzaChrZXlOYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fSwgW10gYXMgc3RyaW5nW10pO1xuXHRcdGlmIChhbGxSZW1haW5pbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBhbGxSZW1haW5pbmdLZXlzLnJlZHVjZSgoZmlsdGVyczogRmlsdGVyW10sIGtleTogc3RyaW5nKTogRmlsdGVyW10gPT4ge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgbWV0YW1vZGVsIG9wZXJhdGlvbi4gVGhlIG9yaWdpbmFsIGlzUHJvcGVydHlGaWx0ZXJhYmxlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCBsYXRlci5cblx0XHRcdFx0Y29uc3Qga2V5Q29udGV4dCA9IHZhbHVlTGlzdE1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGAvJHtjb2xsZWN0aW9uUGF0aH0vJHtrZXl9YCk7XG5cdFx0XHRcdGlmIChDb21tb25IZWxwZXIuaXNQcm9wZXJ0eUZpbHRlcmFibGUoa2V5Q29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKSkge1xuXHRcdFx0XHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDoga2V5LCBvcGVyYXRvcjogXCJFUVwiLCB2YWx1ZTE6IGNvbmRpdGlvblBheWxvYWRba2V5XSB9KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpbHRlcnM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUga2V5LCBkZXNjcmlwdGlvbiwgYW5kIHBheWxvYWQgb2YgYSB1c2VyIGlucHV0LlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFZhbHVlIGhlbHAgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIE9iamVjdFxuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkZXNjcmlwdGlvbiwga2V5LCBhbmQgcGF5bG9hZC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSByaWdodCBub3cgKG11c3QgYmUgcmVxdWVzdGVkKSwgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBpcyByZXR1cm5lZFxuXHQgKi9cblx0Z2V0SXRlbUZvclZhbHVlOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29uZmlnOiBJdGVtRm9yVmFsdWVDb25maWd1cmF0aW9uKSB7XG5cdFx0Ly9CQ1A6IDIyNzAxNjI4ODcgLiBUaGUgTURDIGZpZWxkIHNob3VsZCBub3QgdHJ5IHRvIGdldCB0aGUgaXRlbSB3aGVuIHRoZSBmaWVsZCBpcyBlbXB0aWVkXG5cdFx0Ly8gSklSQTogRklPUklURUNIUDEtMjUzNjEgLSBJbXByb3ZlIHRoZSB0eXBlLWFoZWFkIGJlaGF2aW9yIGZvciBtaXNzaW5uZyB0ZXh0IGFubm90YXRpb24gb3IgY29uc3RyYWludHMgdmlvbGF0aW9ucyBvZiB0aGUgZXhpc3RpbmcgdGV4dCBhbm5vdGF0aW9uXG5cdFx0aWYgKGNvbmZpZy52YWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb25maWcuY2hlY2tEZXNjcmlwdGlvbikge1xuXHRcdFx0Y29uc3QgdmFsdWVoZWxwUGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uUGF0aCA9IHZhbHVlaGVscFBheWxvYWQudmFsdWVIZWxwRGVzY3JpcHRpb25QYXRoO1xuXHRcdFx0Y29uc3QgbWF4TGVuZ3RoID0gdmFsdWVoZWxwUGF5bG9hZD8ubWF4TGVuZ3RoO1xuXHRcdFx0Y29uc3QgdmFsdWVMZW5ndGggPSBjb25maWcudmFsdWUgIT09IG51bGwgJiYgY29uZmlnLnZhbHVlICE9PSB1bmRlZmluZWQgPyBjb25maWcudmFsdWUudG9TdHJpbmcoKS5sZW5ndGggOiAwO1xuXHRcdFx0aWYgKGRlc2NyaXB0aW9uUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBoZWxwIGNvbGxlY3Rpb24gaGFzIG5vIHRleHQgYW5ub3RhdGlvbiAoZGVzY3JpcHRpb25QYXRoIGlzIGVtcHR5KSB0aGUgZGVzY3JpcHRpb24gY2hlY2sgc2hvdWxkbsK0dCBvY2N1ci5cblx0XHRcdFx0Ly8gSW4gc3VjaCBhIGNhc2UgdGhlIG1ldGhvZCBnZXREZXNjcmlwdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBNREMgYW5kIHdpdGhpbiB0aGlzIG1ldGhvZCBhIFNpZGVFZmZlY3QgaXMgcmVxdWVzdGVkIHRvIHJldHJpZXZlIHRoZSB0ZXh0IGZyb20gdGhlIHRleHQgcHJvcGVydHkgb2YgdGhlIG1haW4gZW50aXR5XG5cdFx0XHRcdGNvbmZpZy5jaGVja0Rlc2NyaXB0aW9uID0gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKG1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG5cdFx0XHRcdC8vdmFsdWUgbGVuZ3RoIGlzID4gdGV4dCBwcm9lcGVydHkgbGVuZ3RoIGNvbnN0cmFpbnRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gRmllbGRCYXNlRGVsZWdhdGUuZ2V0SXRlbUZvclZhbHVlKGZpZWxkLCB2YWx1ZUhlbHAsIGNvbmZpZyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgZmlsdGVyIGJhciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZCBGaWVsZCBDb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXIgYmFyIGluc3RhbmNlXG5cdCAqL1xuXHRfZ2V0RmlsdGVyQmFyOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkIHwgbnVsbCk6IEZpbHRlckJhciB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGZpbHRlckJhckFQSTtcblx0XHRpZiAoZmllbGQ/LmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikpIHtcblx0XHRcdHdoaWxlIChmaWVsZCkge1xuXHRcdFx0XHRpZiAoZmllbGQ/LmlzQTxGaWx0ZXJCYXJBUEk+KFwic2FwLmZlLm1hY3Jvcy5maWx0ZXJCYXIuRmlsdGVyQmFyQVBJXCIpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyQVBJID0gZmllbGQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZmllbGQgPSBmaWVsZD8uZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBGaWVsZDtcblx0XHRcdH1cblx0XHRcdGlmIChmaWx0ZXJCYXJBUEk/LmdldENvbnRlbnQoKT8uaXNBKFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5GaWx0ZXJCYXJcIikpIHtcblx0XHRcdFx0cmV0dXJuIGZpbHRlckJhckFQSS5nZXRDb250ZW50KCkgYXMgRmlsdGVyQmFyO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBrZXkuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgRmllbGQgaGVscCBhc3NpZ25lZCB0byB0aGUgPGNvZGU+RmllbGQ8L2NvZGU+IG9yIDxjb2RlPkZpbHRlckZpZWxkPC9jb2RlPiBjb250cm9sXG5cdCAqIEBwYXJhbSBrZXkgS2V5IHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gX2NvbmRpdGlvbkluIEluIHBhcmFtZXRlcnMgZm9yIHRoZSBrZXkgKG5vIGxvbmdlciBzdXBwb3J0ZWQpXG5cdCAqIEBwYXJhbSBfY29uZGl0aW9uT3V0IE91dCBwYXJhbWV0ZXJzIGZvciB0aGUga2V5IChubyBsb25nZXIgc3VwcG9ydGVkKVxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZ0NvbnRleHQgPGNvZGU+QmluZGluZ0NvbnRleHQ8L2NvZGU+IG9mIHRoZSBjaGVja2VkIGZpZWxkLiBJbnNpZGUgYSB0YWJsZSwgdGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gZWxlbWVudCBjYW4gYmUgY29ubmVjdGVkIHRvIGEgZGlmZmVyZW50IHJvd1xuXHQgKiBAcGFyYW0gX0NvbmRpdGlvbk1vZGVsIENvbmRpdGlvbk1vZGVsPC9jb2RlPiwgaWYgYm91bmQgdG8gb25lXG5cdCAqIEBwYXJhbSBfY29uZGl0aW9uTW9kZWxOYW1lIE5hbWUgb2YgdGhlIDxjb2RlPkNvbmRpdGlvbk1vZGVsPC9jb2RlPiwgaWYgYm91bmQgdG8gb25lXG5cdCAqIEBwYXJhbSBjb25kaXRpb25QYXlsb2FkIEFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBrZXlcblx0ICogQHBhcmFtIGNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAcGFyYW0gX3R5cGUgVHlwZSBvZiB0aGUgdmFsdWVcblx0ICogQHJldHVybnMgRGVzY3JpcHRpb24gZm9yIHRoZSBrZXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiwga2V5IGFuZCBwYXlsb2FkLiBJZiB0aGUgZGVzY3JpcHRpb24gaXMgbm90IGF2YWlsYWJsZSByaWdodCBhd2F5IChpdCBtdXN0IGJlIHJlcXVlc3RlZCksIGEgPGNvZGU+UHJvbWlzZTwvY29kZT4gaXMgcmV0dXJuZWRcblx0ICovXG5cdGdldERlc2NyaXB0aW9uOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0ZmllbGQ6IEZpZWxkIHwgbnVsbCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRrZXk6IHN0cmluZyxcblx0XHRfY29uZGl0aW9uSW46IG9iamVjdCxcblx0XHRfY29uZGl0aW9uT3V0OiBvYmplY3QsXG5cdFx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0X0NvbmRpdGlvbk1vZGVsOiBDb25kaXRpb25Nb2RlbCxcblx0XHRfY29uZGl0aW9uTW9kZWxOYW1lOiBzdHJpbmcsXG5cdFx0Y29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRjb250cm9sOiBDb250cm9sLFxuXHRcdF90eXBlOiB1bmtub3duXG5cdCkge1xuXHRcdC8vSklSQTogRklPUklURUNIUDEtMjIwMjIgLiBUaGUgTURDIGZpZWxkIHNob3VsZCBub3QgIHRyaWVzIHRvIGRldGVybWluZSBkZXNjcmlwdGlvbiB3aXRoIHRoZSBpbml0aWFsIEdFVCBvZiB0aGUgZGF0YS5cblx0XHQvLyBpdCBzaG91bGQgcmVseSBvbiB0aGUgZGF0YSB3ZSBhbHJlYWR5IHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmRcblx0XHQvLyBCdXQgVGhlIGdldERlc2NyaXB0aW9uIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGluIHRoZSBGaWx0ZXJGaWVsZCBjYXNlIGlmIGEgdmFyaWFudCBpcyBsb2FkZWQuXG5cdFx0Ly8gQXMgdGhlIGRlc2NyaXB0aW9uIHRleHQgY291bGQgYmUgbGFuZ3VhZ2UgZGVwZW5kZW50IGl0IGlzIG5vdCBzdG9yZWQgaW4gdGhlIHZhcmlhbnQsIHNvIGl0IG5lZWRzIHRvIGJlIHJlYWQgb24gcmVuZGVyaW5nLlxuXG5cdFx0bGV0IHBheWxvYWQgPSBmaWVsZD8uZ2V0UGF5bG9hZCgpIGFzIEZpZWxkUGF5bG9hZDtcblxuXHRcdC8qIFJldHJpZXZlIHRleHQgZnJvbSB2YWx1ZSBoZWxwLCBpZiB2YWx1ZSB3YXMgc2V0IGJ5IG91dC1wYXJhbWV0ZXIgKEJDUCAyMjcwMTYwNjMzKSAqL1xuXHRcdGlmICghcGF5bG9hZCAmJiAoY29udHJvbCBhcyBGaWVsZEJhc2UpPy5nZXREaXNwbGF5KCkuaW5jbHVkZXMoXCJEZXNjcmlwdGlvblwiKSkge1xuXHRcdFx0cGF5bG9hZCA9IHtcblx0XHRcdFx0cmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdDogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAocGF5bG9hZD8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCA9PT0gdHJ1ZSB8fCBwYXlsb2FkPy5pc0ZpbHRlckZpZWxkID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBkYXRhTW9kZWwgPSB2YWx1ZUhlbHAuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gZGF0YU1vZGVsXG5cdFx0XHRcdD8gZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZhbHVlSGVscCBhcyB1bmtub3duIGFzIENvbnRyb2wpXG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgdmFsdWVoZWxwUGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdGNvbnN0IHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQgPSBjb25kaXRpb25QYXlsb2FkPy5bdmFsdWVoZWxwUGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gdmFsdWVoZWxwUGF5bG9hZC5wcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aCA9IHZhbHVlaGVscFBheWxvYWQ/LnByb3BlcnR5RGVzY3JpcHRpb25QYXRoO1xuXHRcdFx0bGV0IHRleHRQcm9wZXJ0eTogc3RyaW5nO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvKiBSZXF1ZXN0IHZhbHVlIGhlbHAgbWV0YWRhdGEgKi9cblx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IGF3YWl0IG1ldGFNb2RlbC5yZXF1ZXN0VmFsdWVMaXN0SW5mbyhwcm9wZXJ0eVBhdGgsIHRydWUsIGJpbmRpbmdDb250ZXh0KTtcblxuXHRcdFx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXIoZmllbGQpO1xuXHRcdFx0XHRsZXQgZmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyU3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIpO1xuXHRcdFx0XHRcdGZpbHRlckNvbmRpdGlvbnMgPSBmaWx0ZXJTdGF0ZS5maWx0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3Byb3BlcnR5UGF0aH1Ac2FwdWkubmFtZWApIGFzIHN0cmluZztcblx0XHRcdFx0Ly8gdGFrZSB0aGUgZmlyc3QgdmFsdWUgbGlzdCBhbm5vdGF0aW9uIC0gYWx0ZXJuYXRpdmVseSB0YWtlIHRoZSBvbmUgd2l0aG91dCBxdWFsaWZpZXIgb3IgdGhlIGZpcnN0IG9uZVxuXHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUxpc3RJbmZvW09iamVjdC5rZXlzKHZhbHVlTGlzdEluZm8pWzBdXTtcblx0XHRcdFx0Y29uc3QgdmFsdWVIZWxwUGFyYW1ldGVycyA9IHRoaXMuX2dldFZhbHVlTGlzdFBhcmFtZXRlcih2YWx1ZUxpc3QsIHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdGNvbnN0IHZhbHVlSGVscFByb3BlcnR5ID0gdmFsdWVIZWxwUGFyYW1ldGVycz8uWzBdPy5WYWx1ZUxpc3RQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKCF2YWx1ZUhlbHBQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHRocm93IEVycm9yKGBJbmNvbnNpc3RlbnQgdmFsdWUgaGVscCBhbm5vdGF0aW9uIGZvciAke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBnZXQgdGV4dCBhbm5vdGF0aW9uIGZvciB0aGlzIHZhbHVlIGxpc3QgcHJvcGVydHlcblx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0TW9kZWwgPSB2YWx1ZUxpc3QuJG1vZGVsO1xuXHRcdFx0XHRjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IHZhbHVlTGlzdE1vZGVsXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE9iamVjdChgLyR7dmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRofS8ke3ZhbHVlSGVscFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dGApO1xuXHRcdFx0XHRpZiAodGV4dEFubm90YXRpb24gJiYgdGV4dEFubm90YXRpb24uJFBhdGgpIHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHkgPSB0ZXh0QW5ub3RhdGlvbi4kUGF0aDtcblx0XHRcdFx0XHQvKiBCdWlsZCB0aGUgZmlsdGVyIGZvciB0aGUgcmVsZXZhbnQgcGFyYW1ldGVycyAqL1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9nZXRGaWx0ZXIoXG5cdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdFx0XHR2YWx1ZUhlbHBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGtleSxcblx0XHRcdFx0XHRcdHZhbHVlaGVscFBheWxvYWQsXG5cdFx0XHRcdFx0XHR2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkLFxuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBsaXN0QmluZGluZyA9IHZhbHVlTGlzdE1vZGVsLmJpbmRMaXN0KGAvJHt2YWx1ZUxpc3QuQ29sbGVjdGlvblBhdGh9YCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZpbHRlcnMsIHtcblx0XHRcdFx0XHRcdCRzZWxlY3Q6IHRleHRQcm9wZXJ0eVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdC8qIFJlcXVlc3QgZGVzY3JpcHRpb24gZm9yIGdpdmVuIGtleSBmcm9tIHZhbHVlIGxpc3QgZW50aXR5ICovXG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmxlbmd0aCA/IGNvbnRleHRzWzBdLmdldE9iamVjdCh0ZXh0UHJvcGVydHkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmdDb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgcHJvcGVydHlEZXNjcmlwdGlvblBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0SW5kZXggPSBwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gcHJvcGVydHlEZXNjcmlwdGlvblBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiBwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aDtcblx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmFsdWVIZWxwIGFzIHVua25vd24gYXMgQ29udHJvbCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdFx0YXdhaXQgc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdLCBiaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRgUmVxdWVzdFNpZGVFZmZlY3RzIGlzIHRyaWdnZXJlZCBiZWNhdXNlIHRoZSB0ZXh0IGFubm90YXRpb24gZm9yICR7dmFsdWVIZWxwUHJvcGVydHl9IGlzIG5vdCBkZWZpbmVkIGF0IHRoZSBDb2xsZWN0aW9uUGF0aCBvZiB0aGUgdmFsdWUgaGVscGBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyogRVhURVJOQWxJRCAqL1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQYXRoID0gbWV0YU1vZGVsPy5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRgJHt2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkV4dGVybmFsSURgXG5cdFx0XHRcdFx0KT8uJFBhdGg7XG5cdFx0XHRcdFx0aWYgKGV4dGVybmFsSWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkRnVsbFBhdGggPSB2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aC5yZXBsYWNlKHByb3BlcnR5TmFtZSwgZXh0ZXJuYWxJZFBhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZE5hbWUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2V4dGVybmFsSWRGdWxsUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZERlc2NyaXB0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke2V4dGVybmFsSWRGdWxsUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRgKVxuXHRcdFx0XHRcdFx0XHQ/LiRQYXRoO1xuXHRcdFx0XHRcdFx0Y29uc3QgZmlsdGVycyA9IFtdO1xuXHRcdFx0XHRcdFx0ZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBleHRlcm5hbElkTmFtZSwgb3BlcmF0b3I6IFwiRVFcIiwgdmFsdWUxOiBrZXkgfSkpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB2YWx1ZUxpc3RNb2RlbC5iaW5kTGlzdChgLyR7dmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXJzLCB7XG5cdFx0XHRcdFx0XHRcdCRzZWxlY3Q6IGAke2V4dGVybmFsSWROYW1lfSwke2V4dGVybmFsSWREZXNjcmlwdGlvblBhdGh9YFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKTtcblx0XHRcdFx0XHRcdGlmIChjb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChleHRlcm5hbElkRGVzY3JpcHRpb25QYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBUZXh0IEFubm90YXRpb24gZm9yICR7dmFsdWVIZWxwUHJvcGVydHl9IGlzIG5vdCBkZWZpbmVkYCk7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3Qgc3RhdHVzID0gZXJyb3IgPyAoZXJyb3IgYXMgWE1MSHR0cFJlcXVlc3QpLnN0YXR1cyA6IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdFx0Y29uc3QgbXNnID0gc3RhdHVzID09PSA0MDQgPyBgTWV0YWRhdGEgbm90IGZvdW5kICgke3N0YXR1c30pIGZvciB2YWx1ZSBoZWxwIG9mIHByb3BlcnR5ICR7cHJvcGVydHlQYXRofWAgOiBtZXNzYWdlO1xuXHRcdFx0XHRMb2cuZXJyb3IobXNnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O1NBZ0RlQSxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUMsaUJBQWlCLEVBQUU7SUFDbkRDLFVBQVUsRUFBRSxDQUFDO0lBRWI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHlCQUF5QixFQUFFLFNBQUFBLENBQVVDLEtBQVksRUFBRUMsSUFBNEIsRUFBRUMsS0FBc0IsRUFBRTtNQUN4RztNQUNBO01BQ0E7O01BRUEsTUFBTUMsTUFBMEIsR0FBRyxDQUFDLENBQUM7TUFDckMsSUFDQ0YsSUFBSSxJQUNKQSxJQUFJLENBQUNHLEdBQUcsQ0FBQyxDQUFDLDhCQUE4QixFQUFFLGtDQUFrQyxDQUFDLENBQUMsSUFDOUVDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSixLQUFLLENBQUMsSUFDcEJBLEtBQUssQ0FBQ0ssTUFBTSxHQUFHLENBQUMsSUFDaEJMLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBS00sU0FBUyxFQUNyQjtRQUNEO1FBQ0FQLElBQUksQ0FBQ1EsV0FBVyxDQUFDUCxLQUFLLEVBQUUsUUFBUSxDQUFDO1FBQ2pDQyxNQUFNLENBQUNPLGdCQUFnQixHQUFHLElBQUk7UUFDOUJQLE1BQU0sQ0FBQ1EsWUFBWSxHQUFHVCxLQUFLLENBQUMsQ0FBQyxDQUFXLENBQUMsQ0FBQztNQUMzQztNQUVBLE9BQU9DLE1BQU07SUFDZCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDUywwQkFBMEIsRUFBRSxTQUFBQSxDQUFVWixLQUFZLEVBQUVDLElBQWdCLEVBQUVZLGtCQUF1QyxFQUFFO01BQzlHLElBQUlBLGtCQUFrQixFQUFFRixZQUFZLEtBQUtILFNBQVMsRUFBRTtRQUNuRDtRQUNBUCxJQUFJLENBQUNRLFdBQVcs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
365
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJGaWVsZEJhc2VEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nIiwiZmllbGQiLCJ0eXBlIiwidmFsdWUiLCJyZXN1bHQiLCJpc0EiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJmb3JtYXRWYWx1ZSIsImJUeXBlSW5pdGlhbGl6ZWQiLCJtQ3VzdG9tVW5pdHMiLCJpbml0aWFsaXplSW50ZXJuYWxVbml0VHlwZSIsInR5cGVJbml0aWFsaXphdGlvbiIsImVuaGFuY2VWYWx1ZUZvclVuaXQiLCJ2YWx1ZXMiLCJwdXNoIiwiZ2V0RGVmYXVsdFZhbHVlSGVscERlbGVnYXRlIiwiX2ZpZWxkIiwibmFtZSIsInBheWxvYWQiLCJnZXRUeXBlTWFwIiwiVHlwZU1hcCIsIl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIiLCJ2YWx1ZUxpc3RJbmZvIiwicHJvcGVydHlOYW1lIiwiUGFyYW1ldGVycyIsImZpbHRlciIsImVudHJ5IiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiX2dldEZpbHRlciIsInZhbHVlTGlzdCIsInZhbHVlSGVscFByb3BlcnR5Iiwia2V5VmFsdWUiLCJ2YWx1ZWhlbHBQYXlsb2FkIiwidmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCIsImJpbmRpbmdDb250ZXh0IiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlcnMiLCJwYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwiJFR5cGUiLCJWYWx1ZUxpc3RQcm9wZXJ0eSIsImZpbHRlclZhbHVlIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJhcGRGaWVsZFBhdGgiLCJhcGRGaWVsZCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldFZhbHVlIiwic291cmNlUGF0aCIsImNvbmRpdGlvblBheWxvYWQiLCJnZXRPYmplY3QiLCJjb25kaXRpb24iLCJvcGVyYXRvciIsIkZpbHRlciIsInBhdGgiLCJ2YWx1ZTEiLCJjb25jYXQiLCJfZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzIiwiJG1vZGVsIiwidmFsdWVMaXN0TW9kZWwiLCJDb2xsZWN0aW9uUGF0aCIsImNvbGxlY3Rpb25QYXRoIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRNZXRhQ29udGV4dCIsImVudGl0eVR5cGUiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWxsTG9jYWxEYXRhUHJvcGVydGllcyIsInJlZHVjZSIsImFyciIsImFsbFJlbWFpbmluZ0tleXMiLCJrZXlzIiwiX3JlZiIsImtleU5hbWUiLCJpbmNsdWRlcyIsImhhc093blByb3BlcnR5Iiwia2V5Iiwia2V5Q29udGV4dCIsIkNvbW1vbkhlbHBlciIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwiZ2V0SXRlbUZvclZhbHVlIiwidmFsdWVIZWxwIiwiY29uZmlnIiwiY2hlY2tEZXNjcmlwdGlvbiIsImNvbnRhaW5lciIsImdldFR5cGVhaGVhZCIsImdldFBheWxvYWQiLCJzZWxlY3RlZENvbnRlbnQiLCJnZXRTZWxlY3RlZENvbnRlbnQiLCJjb250ZW50SWQiLCJnZXRJZCIsIlZhbHVlSGVscERlbGVnYXRlIiwicmV0cmlldmVDb250ZW50IiwibWF4TGVuZ3RoIiwidmFsdWVMZW5ndGgiLCJ0b1N0cmluZyIsImRlc2NyaXB0aW9uUGF0aCIsInZhbHVlSGVscERlc2NyaXB0aW9uUGF0aCIsIl9nZXRGaWx0ZXJCYXIiLCJmaWx0ZXJCYXJBUEkiLCJnZXRQYXJlbnQiLCJnZXRDb250ZW50IiwiZ2V0RGVzY3JpcHRpb24iLCJfY29uZGl0aW9uSW4iLCJfY29uZGl0aW9uT3V0IiwiX0NvbmRpdGlvbk1vZGVsIiwiX2NvbmRpdGlvbk1vZGVsTmFtZSIsImNvbnRyb2wiLCJfdHlwZSIsImVtcHR5QWxsb3dlZCIsImdldERpc3BsYXkiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiaXNGaWx0ZXJGaWVsZCIsImRhdGFNb2RlbCIsImdldE1vZGVsIiwib3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIm1ldGFNb2RlbCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwidmFsdWVIZWxwUXVhbGlmaWVyIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlEZXNjcmlwdGlvblBhdGgiLCJ0ZXh0UHJvcGVydHkiLCJyZXF1ZXN0VmFsdWVMaXN0SW5mbyIsImZpbHRlckJhciIsImZpbHRlckNvbmRpdGlvbnMiLCJmaWx0ZXJTdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInZhbHVlSGVscFBhcmFtZXRlcnMiLCJFcnJvciIsInRleHRBbm5vdGF0aW9uIiwiJFBhdGgiLCJsaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJHNlbGVjdCIsImNvbnRleHRzIiwicmVxdWVzdENvbnRleHRzIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJzaWRlRWZmZWN0UGF0aCIsInN1YnN0cmluZyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIkxvZyIsIndhcm5pbmciLCJleHRlcm5hbElkUGF0aCIsImV4dGVybmFsSWRGdWxsUGF0aCIsInJlcGxhY2UiLCJleHRlcm5hbElkTmFtZSIsImV4dGVybmFsSWREZXNjcmlwdGlvblBhdGgiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJTdHJpbmciLCJtc2ciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZpZWxkQmFzZURlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVmFsdWVMaXN0VHlwZSwgVmFsdWVIZWxwUGF5bG9hZCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHAgZnJvbSBcInNhcC91aS9tZGMvVmFsdWVIZWxwXCI7XG5pbXBvcnQgdHlwZSB7IEl0ZW1Gb3JWYWx1ZUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCB7IHR5cGUgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IHR5cGUgQ29uZGl0aW9uTW9kZWwgZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvbk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlXCI7XG5pbXBvcnQgRmllbGRCYXNlRGVsZWdhdGUgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlRGVsZWdhdGVcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIFNpbXBsZVR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9TaW1wbGVUeXBlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcIi4uL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCIuLi9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhckFQSSBmcm9tIFwiLi4vZmlsdGVyQmFyL0ZpbHRlckJhckFQSVwiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25QYXlsb2FkTWFwLCBDb25kaXRpb25QYXlsb2FkVHlwZSwgRXh0ZXJuYWxTdGF0ZVR5cGUgfSBmcm9tIFwiLi4vdmFsdWVoZWxwL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgVmFsdWVIZWxwRGVsZWdhdGUgZnJvbSBcIi4uL3ZhbHVlaGVscC9WYWx1ZUhlbHBEZWxlZ2F0ZVwiO1xuXG5leHBvcnQgdHlwZSBGaWVsZFBheWxvYWQgPSB7XG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q/OiBib29sZWFuO1xuXHRpc0ZpbHRlckZpZWxkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFZhbHVlID0gc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBUeXBlSW5pdGlhbGl6YXRpb24gPSB7XG5cdGJUeXBlSW5pdGlhbGl6ZWQ/OiBib29sZWFuO1xuXHRtQ3VzdG9tVW5pdHM/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25maWcgPSB7XG5cdHZhbHVlOiBWYWx1ZTtcblx0cGFyc2VkVmFsdWU6IFZhbHVlO1xuXHRiaW5kaW5nQ29udGV4dDogQ29udGV4dDtcblx0Y2hlY2tLZXk6IGJvb2xlYW47XG5cdGNoZWNrRGVzY3JpcHRpb246IGJvb2xlYW47XG5cdGNvbmRpdGlvbk1vZGVsPzogQ29uZGl0aW9uTW9kZWw7XG5cdGNvbmRpdGlvbk1vZGVsTmFtZT86IHN0cmluZztcblx0Y29udHJvbD86IG9iamVjdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIEZpZWxkQmFzZURlbGVnYXRlLCB7XG5cdGFwaVZlcnNpb246IDIsXG5cblx0LyoqXG5cdCAqIElmIHRoZSA8Y29kZT5GaWVsZDwvY29kZT4gY29udHJvbCBpcyB1c2VkLCB0aGUgdXNlZCBkYXRhIHR5cGUgbWlnaHQgY29tZSBmcm9tIHRoZSBiaW5kaW5nLlxuXHQgKiBJbiBWNC11bml0IG9yIGN1cnJlbmN5IGNhc2UgaXQgbWlnaHQgbmVlZCB0byBiZSBmb3JtYXR0ZWQgb25jZS5cblx0ICogVG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgdHlwZSBsYXRlciBvbiwgdGhlIGN1cnJlbmNpZXMgbXVzdCBiZSByZXR1cm5lZC5cblx0ICogQHBhcmFtIGZpZWxkIFRoZSA8Y29kZT5GaWVsZDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIHR5cGUgVHlwZSBmcm9tIGJpbmRpbmdcblx0ICogQHBhcmFtIHZhbHVlIEdpdmVuIHZhbHVlXG5cdCAqIEByZXR1cm5zIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGUgKG5lZWRzIHRvIHNldCBiVHlwZUluaXRpYWxpemVkIHRvIHRydWUgaWYgaW5pdGlhbGl6ZWQpXG5cdCAqL1xuXHRpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB0eXBlOiBTaW1wbGVUeXBlIHwgdW5kZWZpbmVkLCB2YWx1ZTogVmFsdWUgfCBWYWx1ZVtdKSB7XG5cdFx0Ly8gVjQgVW5pdCBhbmQgQ3VycmVuY3kgdHlwZXMgaGF2ZSBhIG1hcCB3aXRoIHZhbGlkIHVuaXRzIGFuZCBjcmVhdGUgYW4gaW50ZXJuYWwgY3VzdG9taXppbmcgZm9yIGl0LlxuXHRcdC8vIFRoZSBGaWVsZCBuZWVkcyB0byBrZWVwIHRoaXMgY3VzdG9taXppbmcgbG9naWMgd2hlbiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgdHlwZS5cblx0XHQvLyAoQXMgZXh0ZXJuYWwgUkFXIGJpbmRpbmcgaXMgdXNlZCB0aGVyZSBpcyBubyBmb3JtYXR0aW5nIG9uIHBhcnNpbmcuKVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBUeXBlSW5pdGlhbGl6YXRpb24gPSB7fTtcblx0XHRpZiAoXG5cdFx0XHR0eXBlICYmXG5cdFx0XHR0eXBlLmlzQShbXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIsIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIl0pICYmXG5cdFx0XHRBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuXHRcdFx0dmFsdWUubGVuZ3RoID4gMiAmJlxuXHRcdFx0dmFsdWVbMl0gIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Ly8gZm9ybWF0IG9uY2UgdG8gc2V0IGludGVybmFsIGN1c3RvbWl6aW5nLiBBbGxvdyBudWxsIGFzIHZhbGlkIHZhbHVlcyBmb3IgY3VzdG9tIHVuaXRzXG5cdFx0XHR0eXBlLmZvcm1hdFZhbHVlKHZhbHVlLCBcInN0cmluZ1wiKTtcblx0XHRcdHJlc3VsdC5iVHlwZUluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHRcdHJlc3VsdC5tQ3VzdG9tVW5pdHMgPSB2YWx1ZVsyXSBhcyBzdHJpbmc7IC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIHByb3ZpZGUgY3VzdG9tIHVuaXRzIHRvIGludGVybmFsIHR5cGVcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB1bml0IHR5cGUuXG5cdCAqIElmIHRoZSA8Y29kZT5GaWVsZDwvY29kZT4gY29udHJvbCBpcyB1c2VkLCB0aGUgdXNlZCBkYXRhIHR5cGUgbWlnaHQgY29tZSBmcm9tIHRoZSBiaW5kaW5nLlxuXHQgKiBJZiB0aGUgdHlwZSBpcyBhIFY0IHVuaXQgb3IgY3VycmVuY3ksIGl0IG1pZ2h0IG5lZWQgdG8gYmUgZm9ybWF0dGVkIG9uY2UuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB0eXBlIFR5cGUgZnJvbSBiaW5kaW5nXG5cdCAqIEBwYXJhbSB0eXBlSW5pdGlhbGl6YXRpb24gSW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgdHlwZVxuXHQgKi9cblx0aW5pdGlhbGl6ZUludGVybmFsVW5pdFR5cGU6IGZ1bmN0aW9uIChmaWVsZDogRmllbGQsIHR5cGU6IFNpbXBsZVR5cGUsIHR5cGVJbml0aWFsaXphdGlvbj86IFR5cGVJbml0aWFsaXphdGlvbikge1xuXHRcdGlmICh0eXBlSW5pdGlhbGl6YXRpb24/Lm1DdXN0b21Vbml0cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBpZiBhbHJlYWR5IGluaXRpYWxpemVkIGluaXRpYWxpemUgbmV3IHR5cGUgdG9vLlxuXHRcdFx0dHlwZS5mb3JtYXRWYWx1ZShbbnVsbCwgbnVsbCwgdHlwZUluaXRpYWxpemF0aW9uLm1DdXN0b21Vbml0c10sIFwic3RyaW5nXCIpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBlbmhhbmNlcyB0aGUgdmFsdWUgd2l0aCB1bml0IG9yIGN1cnJlbmN5IGluZm9ybWF0aW9uIGlmIG5lZWRlZCBieSB0aGUgZGF0YSB0eXBlLlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gIHZhbHVlcyBWYWx1ZXNcblx0ICogQHBhcmFtICB0eXBlSW5pdGlhbGl6YXRpb24gSW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgdHlwZVxuXHQgKiBAcmV0dXJucyBWYWx1ZXNcblx0ICovXG5cdGVuaGFuY2VWYWx1ZUZvclVuaXQ6IGZ1bmN0aW9uIChmaWVsZDogRmllbGQsIHZhbHVlczogVmFsdWVbXSwgdHlwZUluaXRpYWxpemF0aW9uPzogVHlwZUluaXRpYWxpemF0aW9uKSB7XG5cdFx0aWYgKHR5cGVJbml0aWFsaXphdGlvbj8uYlR5cGVJbml0aWFsaXplZCA9PT0gdHJ1ZSAmJiB2YWx1ZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHR2YWx1ZXMucHVzaCh0eXBlSW5pdGlhbGl6YXRpb24ubUN1c3RvbVVuaXRzKTtcblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoaWNoIDxjb2RlPlZhbHVlSGVscERlbGVnYXRlPC9jb2RlPiBpcyB1c2VkXG5cdCAqIGlmIGEgZGVmYXVsdCBmaWVsZCBoZWxwIChmb3IgZXhhbXBsZSwgZm9yIGRlZmluaW5nIGNvbmRpdGlvbnMgaW4gPC9jb2RlPkZpbHRlckZpZWxkPC9jb2RlPilcblx0ICogaXMgY3JlYXRlZC5cblx0ICogQHBhcmFtIF9maWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIERlbGVnYXRlIG9iamVjdCB3aXRoIG5hbWUgYW5kIHBheWxvYWRcblx0ICovXG5cdGdldERlZmF1bHRWYWx1ZUhlbHBEZWxlZ2F0ZTogZnVuY3Rpb24gKF9maWVsZDogRmllbGQpIHtcblx0XHRyZXR1cm4geyBuYW1lOiBcInNhcC91aS9tZGMvb2RhdGEvdjQvVmFsdWVIZWxwRGVsZWdhdGVcIiwgcGF5bG9hZDoge30gfTtcblx0fSxcblxuXHRnZXRUeXBlTWFwOiBmdW5jdGlvbiAoX2ZpZWxkOiBGaWVsZCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgYWxsIHBhcmFtZXRlcnMgaW4gYSB2YWx1ZSBoZWxwIHRoYXQgdXNlIGEgc3BlY2lmaWMgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RJbmZvIFZhbHVlIGxpc3QgaW5mb1xuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIExpc3Qgb2YgYWxsIGZvdW5kIHBhcmFtZXRlcnNcblx0ICovXG5cdF9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXI6IGZ1bmN0aW9uICh2YWx1ZUxpc3RJbmZvOiBBbm5vdGF0aW9uVmFsdWVMaXN0VHlwZSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHQvL2RldGVybWluZSBwYXRoIHRvIHZhbHVlIGxpc3QgcHJvcGVydHlcblx0XHRyZXR1cm4gdmFsdWVMaXN0SW5mby5QYXJhbWV0ZXJzLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcblx0XHRcdGlmIChlbnRyeS5Mb2NhbERhdGFQcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gZW50cnkuTG9jYWxEYXRhUHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlOYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQnVpbGQgZmlsdGVycyBmb3IgZWFjaCByZWxldmFudCBwYXJhbWV0ZXIuXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3QgVmFsdWUgbGlzdCBpbmZvXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgTmFtZSBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHZhbHVlSGVscFByb3BlcnR5IE5hbWUgb2YgdGhlIHZhbHVlIGhlbHAgcHJvcGVydHlcblx0ICogQHBhcmFtIGtleVZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gdmFsdWVoZWxwUGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkIEFkZGl0aW9uYWwgY29uZGl0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGtleVxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZ0NvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIExpc3Qgb2YgZmlsdGVyc1xuXHQgKi9cblx0X2dldEZpbHRlcjogZnVuY3Rpb24gKFxuXHRcdHZhbHVlTGlzdDogQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0dmFsdWVIZWxwUHJvcGVydHk6IHN0cmluZyxcblx0XHRrZXlWYWx1ZTogc3RyaW5nLFxuXHRcdHZhbHVlaGVscFBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0dmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGVbXSB8IHVuZGVmaW5lZCxcblx0XHRiaW5kaW5nQ29udGV4dD86IENvbnRleHQsXG5cdFx0ZmlsdGVyQmFyQ29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPlxuXHQpIHtcblx0XHRsZXQgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gdmFsdWVMaXN0LlBhcmFtZXRlcnMuZmlsdGVyKGZ1bmN0aW9uIChwYXJhbWV0ZXIpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHBhcmFtZXRlci4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlZhbHVlTGlzdFBhcmFtZXRlckluIHx8XG5cdFx0XHRcdHBhcmFtZXRlci4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlZhbHVlTGlzdFBhcmFtZXRlckluT3V0IHx8XG5cdFx0XHRcdChwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZSAmJiBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHkgPT09IHZhbHVlSGVscFByb3BlcnR5KVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG5cdFx0XHRsZXQgZmlsdGVyVmFsdWU7XG5cdFx0XHRpZiAocGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0ZmlsdGVyVmFsdWUgPSBrZXlWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWVoZWxwUGF5bG9hZD8uaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgYXBkRmllbGRQYXRoID0gYEFQRF86OiR7cGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdGNvbnN0IGFwZEZpZWxkID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChhcGRGaWVsZFBhdGgpIGFzIEZpZWxkO1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGFwZEZpZWxkPy5nZXRWYWx1ZSgpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3Qgc291cmNlUGF0aCA9IHBhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eTtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZCA9IHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQ/LlswXTtcblx0XHRcdFx0ZmlsdGVyVmFsdWUgPSBzb3VyY2VQYXRoICYmIGNvbmRpdGlvblBheWxvYWQ/Lltzb3VyY2VQYXRoXTtcblx0XHRcdH0gZWxzZSBpZiAoYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHZhbHVlIGhlbHAgaXMgbm90IHVzZWQgdHJ5IGdldHRpbmcgdGhlIGZpbHRlciB2YWx1ZSBmcm9tIHRoZSBiaW5kaW5nIGNvbnRleHRcblx0XHRcdFx0Y29uc3Qgc291cmNlUGF0aCA9IHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0ZmlsdGVyVmFsdWUgPSBiaW5kaW5nQ29udGV4dC5nZXRPYmplY3Qoc291cmNlUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZpbHRlclZhbHVlICYmIGZpbHRlckJhckNvbmRpdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uID0gZmlsdGVyQmFyQ29uZGl0aW9ucz8uW3BhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eV07XG5cdFx0XHRcdGlmIChjb25kaXRpb24/Lmxlbmd0aCA9PT0gMSAmJiBjb25kaXRpb25bMF0/Lm9wZXJhdG9yID09PSBcIkVRXCIpIHtcblx0XHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGNvbmRpdGlvblswXT8udmFsdWVzWzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvKiBBZGQgdmFsdWUgdG8gdGhlIGZpbHRlciBmb3IgdGhlIHRleHQgZGV0ZXJtaW5hdGlvbiAqL1xuXHRcdFx0aWYgKGZpbHRlclZhbHVlICE9PSBudWxsICYmIGZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHksIG9wZXJhdG9yOiBcIkVRXCIsIHZhbHVlMTogZmlsdGVyVmFsdWUgfSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZD8uWzBdKSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIG11bHRpcGxlIGtleXMgZm9yIHRoZSB2YWx1ZWxpc3QgY29sbGVjdGlvbiwgdGhlIG1haW4gVmFsdWVMaXN0UHJvcGVydHkgbWlnaHQgbm90IGJlIHVuaXF1ZSB0byBnZXQgZXhhY3QgdmFsdWUgbGlzdCBzZWxlY3Rpb24uXG5cdFx0XHQvLyBTbywgd2UgYWRkIGZpbHRlcnMgZm9yIGtleSBwcm9wZXJ0aWVzIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQuXG5cdFx0XHRmaWx0ZXJzID0gZmlsdGVycy5jb25jYXQodGhpcy5fZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzKHZhbHVlaGVscENvbmRpdGlvblBheWxvYWRbMF0sIHZhbHVlTGlzdCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmlsdGVycztcblx0fSxcblxuXHQvKipcblx0ICogR2V0IG1vZGVsIGZpbHRlcnMgdG8gZW5zdXJlIGEgcHJlY2lzZSBzZWxlY3Rpb24gZnJvbSB0aGUgY29uZGl0aW9uIHBheWxvYWQuXG5cdCAqIEBwYXJhbSBjb25kaXRpb25QYXlsb2FkIEFkZGl0aW9uYWwgY29uZGl0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGtleVxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0IFZhbHVlIGxpc3QgaW5mb3JtYXRpb25cblx0ICogQHJldHVybnMgTGlzdCBvZiBmaWx0ZXJzXG5cdCAqL1xuXHRfZ2V0UmVtYWluaW5nS2V5VmFsdWVGaWx0ZXJzKGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlLCB2YWx1ZUxpc3Q6IEFubm90YXRpb25WYWx1ZUxpc3RUeXBlKTogRmlsdGVyW10ge1xuXHRcdGNvbnN0IHsgJG1vZGVsOiB2YWx1ZUxpc3RNb2RlbCwgQ29sbGVjdGlvblBhdGg6IGNvbGxlY3Rpb25QYXRoLCBQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH0gPSB2YWx1ZUxpc3Q7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSB2YWx1ZUxpc3RNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChgLyR7Y29sbGVjdGlvblBhdGh9YCk7XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBhbGxMb2NhbERhdGFQcm9wZXJ0aWVzID0gcGFyYW1ldGVycy5yZWR1Y2UoKGFyciwgcGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRpZiAocGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGFyci5wdXNoKHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fSwgW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGFsbFJlbWFpbmluZ0tleXMgPSBlbnRpdHlUeXBlLmtleXMucmVkdWNlKChhcnIsIHsgbmFtZToga2V5TmFtZSB9KSA9PiB7XG5cdFx0XHRpZiAoIWFsbExvY2FsRGF0YVByb3BlcnRpZXMuaW5jbHVkZXMoa2V5TmFtZSkgJiYgY29uZGl0aW9uUGF5bG9hZC5oYXNPd25Qcm9wZXJ0eShrZXlOYW1lKSkge1xuXHRcdFx0XHRhcnIucHVzaChrZXlOYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fSwgW10gYXMgc3RyaW5nW10pO1xuXHRcdGlmIChhbGxSZW1haW5pbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBhbGxSZW1haW5pbmdLZXlzLnJlZHVjZSgoZmlsdGVyczogRmlsdGVyW10sIGtleTogc3RyaW5nKTogRmlsdGVyW10gPT4ge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgbWV0YW1vZGVsIG9wZXJhdGlvbi4gVGhlIG9yaWdpbmFsIGlzUHJvcGVydHlGaWx0ZXJhYmxlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCBsYXRlci5cblx0XHRcdFx0Y29uc3Qga2V5Q29udGV4dCA9IHZhbHVlTGlzdE1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGAvJHtjb2xsZWN0aW9uUGF0aH0vJHtrZXl9YCk7XG5cdFx0XHRcdGlmIChDb21tb25IZWxwZXIuaXNQcm9wZXJ0eUZpbHRlcmFibGUoa2V5Q29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKSkge1xuXHRcdFx0XHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDoga2V5LCBvcGVyYXRvcjogXCJFUVwiLCB2YWx1ZTE6IGNvbmRpdGlvblBheWxvYWRba2V5XSB9KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpbHRlcnM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUga2V5LCBkZXNjcmlwdGlvbiwgYW5kIHBheWxvYWQgb2YgYSB1c2VyIGlucHV0LlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFZhbHVlIGhlbHAgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIE9iamVjdFxuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkZXNjcmlwdGlvbiwga2V5LCBhbmQgcGF5bG9hZC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSByaWdodCBub3cgKG11c3QgYmUgcmVxdWVzdGVkKSwgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBpcyByZXR1cm5lZFxuXHQgKi9cblx0Z2V0SXRlbUZvclZhbHVlOiBhc3luYyBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29uZmlnOiBJdGVtRm9yVmFsdWVDb25maWd1cmF0aW9uKSB7XG5cdFx0Ly9CQ1A6IDIyNzAxNjI4ODcgLiBUaGUgTURDIGZpZWxkIHNob3VsZCBub3QgdHJ5IHRvIGdldCB0aGUgaXRlbSB3aGVuIHRoZSBmaWVsZCBpcyBlbXB0aWVkXG5cdFx0Ly8gSklSQTogRklPUklURUNIUDEtMjUzNjEgLSBJbXByb3ZlIHRoZSB0eXBlLWFoZWFkIGJlaGF2aW9yIGZvciBtaXNzaW5uZyB0ZXh0IGFubm90YXRpb24gb3IgY29uc3RyYWludHMgdmlvbGF0aW9ucyBvZiB0aGUgZXhpc3RpbmcgdGV4dCBhbm5vdGF0aW9uXG5cdFx0aWYgKGNvbmZpZy52YWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb25maWcuY2hlY2tEZXNjcmlwdGlvbikge1xuXHRcdFx0Y29uc3QgY29udGFpbmVyID0gdmFsdWVIZWxwLmdldFR5cGVhaGVhZCgpO1xuXHRcdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IGNvbnRhaW5lci5nZXRTZWxlY3RlZENvbnRlbnQoKTtcblx0XHRcdGNvbnN0IGNvbnRlbnRJZCA9IHNlbGVjdGVkQ29udGVudCAmJiBzZWxlY3RlZENvbnRlbnQuZ2V0SWQoKTtcblx0XHRcdC8vIEluIGNhc2VzIHdoZXJlIGdldEl0ZW1Gb3JWYWx1ZSBpcyBjYWxsZWQgYmVmb3JlIHNob3dWYWx1ZUxpc3QsIHRoZSBkZXNjcmlwdGlvbiBtYXkgbm90IGJlIGF2YWlsYWJsZS5cblx0XHRcdC8vIFRoZXJlZm9yZSwgdGhpcyByZXRyaWV2ZUNvbnRlbnQgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdGlvbi5cblx0XHRcdGF3YWl0IFZhbHVlSGVscERlbGVnYXRlLnJldHJpZXZlQ29udGVudCh2YWx1ZUhlbHAsIGNvbnRhaW5lciwgY29udGVudElkKTtcblx0XHRcdGNvbnN0IG1heExlbmd0aCA9IHBheWxvYWQubWF4TGVuZ3RoO1xuXHRcdFx0Y29uc3QgdmFsdWVMZW5ndGggPSBjb25maWcudmFsdWU/LnRvU3RyaW5nKCkubGVuZ3RoIHx8IDA7XG5cdFx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGggPSBwYXlsb2FkLnZhbHVlSGVscERlc2NyaXB0aW9uUGF0aDtcblx0XHRcdGlmIChkZXNjcmlwdGlvblBhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgcHJvcGVydHkgdmFsdWUgaGVscCBjb2xsZWN0aW9uIGhhcyBubyB0ZXh0IGFubm90YXRpb24gKGRlc2NyaXB0aW9uUGF0aCBpcyBlbXB0eSkgdGhlIGRlc2NyaXB0aW9uIGNoZWNrIHNob3VsZG7CtHQgb2NjdXIuXG5cdFx0XHRcdC8vIEluIHN1Y2ggYSBjYXNlIHRoZSBtZXRob2QgZ2V0RGVzY3JpcHRpb24gd2lsbCBiZSBjYWxsZWQgYnkgTURDIGFuZCB3aXRoaW4gdGhpcyBtZXRob2QgYSBTaWRlRWZmZWN0IGlzIHJlcXVlc3RlZCB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSB0ZXh0IHByb3BlcnR5IG9mIHRoZSBtYWluIGVudGl0eVxuXHRcdFx0XHRjb25maWcuY2hlY2tEZXNjcmlwdGlvbiA9IGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZUxlbmd0aCA+IG1heExlbmd0aCkge1xuXHRcdFx0XHQvL3ZhbHVlIGxlbmd0aCBpcyA+IHRleHQgcHJvZXBlcnR5IGxlbmd0aCBjb25zdHJhaW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIEZpZWxkQmFzZURlbGVnYXRlLmdldEl0ZW1Gb3JWYWx1ZShmaWVsZCwgdmFsdWVIZWxwLCBjb25maWcpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGZpbHRlciBiYXIgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGZpZWxkLlxuXHQgKiBAcGFyYW0gZmllbGQgRmllbGQgQ29udHJvbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGJhciBpbnN0YW5jZVxuXHQgKi9cblx0X2dldEZpbHRlckJhcjogZnVuY3Rpb24gKGZpZWxkOiBGaWVsZCB8IG51bGwpOiBGaWx0ZXJCYXIgfCB1bmRlZmluZWQge1xuXHRcdGxldCBmaWx0ZXJCYXJBUEk7XG5cdFx0aWYgKGZpZWxkPy5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHR3aGlsZSAoZmllbGQpIHtcblx0XHRcdFx0aWYgKGZpZWxkPy5pc0E8RmlsdGVyQmFyQVBJPihcInNhcC5mZS5tYWNyb3MuZmlsdGVyQmFyLkZpbHRlckJhckFQSVwiKSkge1xuXHRcdFx0XHRcdGZpbHRlckJhckFQSSA9IGZpZWxkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZpZWxkID0gZmllbGQ/LmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgRmllbGQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZmlsdGVyQmFyQVBJPy5nZXRDb250ZW50KCk/LmlzQShcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuRmlsdGVyQmFyXCIpKSB7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJCYXJBUEkuZ2V0Q29udGVudCgpIGFzIEZpbHRlckJhcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4ga2V5LlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIEZpZWxkIGhlbHAgYXNzaWduZWQgdG8gdGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBvciA8Y29kZT5GaWx0ZXJGaWVsZDwvY29kZT4gY29udHJvbFxuXHQgKiBAcGFyYW0ga2V5IEtleSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb25cblx0ICogQHBhcmFtIF9jb25kaXRpb25JbiBJbiBwYXJhbWV0ZXJzIGZvciB0aGUga2V5IChubyBsb25nZXIgc3VwcG9ydGVkKVxuXHQgKiBAcGFyYW0gX2NvbmRpdGlvbk91dCBPdXQgcGFyYW1ldGVycyBmb3IgdGhlIGtleSAobm8gbG9uZ2VyIHN1cHBvcnRlZClcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmdDb250ZXh0IDxjb2RlPkJpbmRpbmdDb250ZXh0PC9jb2RlPiBvZiB0aGUgY2hlY2tlZCBmaWVsZC4gSW5zaWRlIGEgdGFibGUsIHRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGVsZW1lbnQgY2FuIGJlIGNvbm5lY3RlZCB0byBhIGRpZmZlcmVudCByb3dcblx0ICogQHBhcmFtIF9Db25kaXRpb25Nb2RlbCBDb25kaXRpb25Nb2RlbDwvY29kZT4sIGlmIGJvdW5kIHRvIG9uZVxuXHQgKiBAcGFyYW0gX2NvbmRpdGlvbk1vZGVsTmFtZSBOYW1lIG9mIHRoZSA8Y29kZT5Db25kaXRpb25Nb2RlbDwvY29kZT4sIGlmIGJvdW5kIHRvIG9uZVxuXHQgKiBAcGFyYW0gY29uZGl0aW9uUGF5bG9hZCBBZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIHRoaXMga2V5XG5cdCAqIEBwYXJhbSBjb250cm9sIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0ICogQHBhcmFtIF90eXBlIFR5cGUgb2YgdGhlIHZhbHVlXG5cdCAqIEByZXR1cm5zIERlc2NyaXB0aW9uIGZvciB0aGUga2V5IG9yIG9iamVjdCBjb250YWluaW5nIGEgZGVzY3JpcHRpb24sIGtleSBhbmQgcGF5bG9hZC4gSWYgdGhlIGRlc2NyaXB0aW9uIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgYXdheSAoaXQgbXVzdCBiZSByZXF1ZXN0ZWQpLCBhIDxjb2RlPlByb21pc2U8L2NvZGU+IGlzIHJldHVybmVkXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGZpZWxkOiBGaWVsZCB8IG51bGwsXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0X2NvbmRpdGlvbkluOiBvYmplY3QsXG5cdFx0X2NvbmRpdGlvbk91dDogb2JqZWN0LFxuXHRcdGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdF9Db25kaXRpb25Nb2RlbDogQ29uZGl0aW9uTW9kZWwsXG5cdFx0X2NvbmRpdGlvbk1vZGVsTmFtZTogc3RyaW5nLFxuXHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAsXG5cdFx0Y29udHJvbDogQ29udHJvbCxcblx0XHRfdHlwZTogdW5rbm93bixcblx0XHRlbXB0eUFsbG93ZWQ6IGJvb2xlYW5cblx0KSB7XG5cdFx0Ly9KSVJBOiBGSU9SSVRFQ0hQMS0yMjAyMiAuIFRoZSBNREMgZmllbGQgc2hvdWxkIG5vdCAgdHJpZXMgdG8gZGV0ZXJtaW5lIGRlc2NyaXB0aW9uIHdpdGggdGhlIGluaXRpYWwgR0VUIG9mIHRoZSBkYXRhLlxuXHRcdC8vIGl0IHNob3VsZCByZWx5IG9uIHRoZSBkYXRhIHdlIGFscmVhZHkgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZFxuXHRcdC8vIEJ1dCBUaGUgZ2V0RGVzY3JpcHRpb24gZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgaW4gdGhlIEZpbHRlckZpZWxkIGNhc2UgaWYgYSB2YXJpYW50IGlzIGxvYWRlZC5cblx0XHQvLyBBcyB0aGUgZGVzY3JpcHRpb24gdGV4dCBjb3VsZCBiZSBsYW5ndWFnZSBkZXBlbmRlbnQgaXQgaXMgbm90IHN0b3JlZCBpbiB0aGUgdmFyaWFudCwgc28gaXQgbmVlZHMgdG8gYmUgcmVhZCBvbiByZW5kZXJpbmcuXG5cblx0XHRsZXQgcGF5bG9hZCA9IGZpZWxkPy5nZXRQYXlsb2FkKCkgYXMgRmllbGRQYXlsb2FkO1xuXG5cdFx0LyogUmV0cmlldmUgdGV4dCBmcm9tIHZhbHVlIGhlbHAsIGlmIHZhbHVlIHdhcyBzZXQgYnkgb3V0LXBhcmFtZXRlciAoQkNQIDIyNzAxNjA2MzMpICovXG5cdFx0aWYgKCFwYXlsb2FkICYmIChjb250cm9sIGFzIEZpZWxkQmFzZSk/LmdldERpc3BsYXkoKS5pbmNsdWRlcyhcIkRlc2NyaXB0aW9uXCIpKSB7XG5cdFx0XHRwYXlsb2FkID0ge1xuXHRcdFx0XHRyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0OiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChwYXlsb2FkPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID09PSB0cnVlIHx8IHBheWxvYWQ/LmlzRmlsdGVyRmllbGQgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IGRhdGFNb2RlbCA9IHZhbHVlSGVscC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBvd25lciA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih2YWx1ZUhlbHAgYXMgdW5rbm93biBhcyBDb250cm9sKTtcblx0XHRcdC8vIElmIG5laXRoZXIgZGF0YU1vZGVsIG5vciBvd25lciBpcyBkZWZpbmVkLCB0aGUgdmFsdWVIZWxwIGNhbm5vdCBiZSBhbiBGRSBjb250cm9sLlxuXHRcdFx0Ly8gVGhpcyBvY2N1cnMgaW4gY2FzZXMgb2YgYSBzdGFuZGFyZCBNREMgY29udHJvbHMgKGUuZy4sIGRlZmF1bHQgVmFsdWVIZWxwIGZvciBib29sZWFuIHZhbHVlcykuXG5cdFx0XHRpZiAoIWRhdGFNb2RlbCAmJiAhb3duZXIpIHtcblx0XHRcdFx0cmV0dXJuIEZpZWxkQmFzZURlbGVnYXRlLmdldERlc2NyaXB0aW9uKFxuXHRcdFx0XHRcdGZpZWxkIGFzIEZpZWxkQmFzZSxcblx0XHRcdFx0XHR2YWx1ZUhlbHAsXG5cdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdF9jb25kaXRpb25Jbixcblx0XHRcdFx0XHRfY29uZGl0aW9uT3V0LFxuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0IGFzIENvbnRleHQsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRjb25kaXRpb25QYXlsb2FkLFxuXHRcdFx0XHRcdGNvbnRyb2wsXG5cdFx0XHRcdFx0X3R5cGUsXG5cdFx0XHRcdFx0ZW1wdHlBbGxvd2VkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBkYXRhTW9kZWxcblx0XHRcdFx0PyBkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmFsdWVIZWxwIGFzIHVua25vd24gYXMgQ29udHJvbClcblx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCB2YWx1ZWhlbHBQYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0Y29uc3QgdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCA9IGNvbmRpdGlvblBheWxvYWQ/Llt2YWx1ZWhlbHBQYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSB2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGVzY3JpcHRpb25QYXRoID0gdmFsdWVoZWxwUGF5bG9hZD8ucHJvcGVydHlEZXNjcmlwdGlvblBhdGg7XG5cdFx0XHRsZXQgdGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8qIFJlcXVlc3QgdmFsdWUgaGVscCBtZXRhZGF0YSAqL1xuXHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gYXdhaXQgbWV0YU1vZGVsLnJlcXVlc3RWYWx1ZUxpc3RJbmZvKHByb3BlcnR5UGF0aCwgdHJ1ZSwgYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXIoZmllbGQpO1xuXHRcdFx0XHRsZXQgZmlsdGVyQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyU3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIpO1xuXHRcdFx0XHRcdGZpbHRlckNvbmRpdGlvbnMgPSBmaWx0ZXJTdGF0ZS5maWx0ZXI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtwcm9wZXJ0eVBhdGh9QHNhcHVpLm5hbWVgKSBhcyBzdHJpbmc7XG5cdFx0XHRcdC8vIHRha2UgdGhlIGZpcnN0IHZhbHVlIGxpc3QgYW5ub3RhdGlvbiAtIGFsdGVybmF0aXZlbHkgdGFrZSB0aGUgb25lIHdpdGhvdXQgcXVhbGlmaWVyIG9yIHRoZSBmaXJzdCBvbmVcblx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0ID0gdmFsdWVMaXN0SW5mb1tPYmplY3Qua2V5cyh2YWx1ZUxpc3RJbmZvKVswXV07XG5cdFx0XHRcdGNvbnN0IHZhbHVlSGVscFBhcmFtZXRlcnMgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIodmFsdWVMaXN0LCBwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRjb25zdCB2YWx1ZUhlbHBQcm9wZXJ0eSA9IHZhbHVlSGVscFBhcmFtZXRlcnM/LlswXT8uVmFsdWVMaXN0UHJvcGVydHk7XG5cdFx0XHRcdGlmICghdmFsdWVIZWxwUHJvcGVydHkpIHtcblx0XHRcdFx0XHR0aHJvdyBFcnJvcihgSW5jb25zaXN0ZW50IHZhbHVlIGhlbHAgYW5ub3RhdGlvbiBmb3IgJHtwcm9wZXJ0eU5hbWV9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZ2V0IHRleHQgYW5ub3RhdGlvbiBmb3IgdGhpcyB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdFx0XHRcdGNvbnN0IHZhbHVlTGlzdE1vZGVsID0gdmFsdWVMaXN0LiRtb2RlbDtcblx0XHRcdFx0Y29uc3QgdGV4dEFubm90YXRpb24gPSB2YWx1ZUxpc3RNb2RlbFxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRPYmplY3QoYC8ke3ZhbHVlTGlzdC5Db2xsZWN0aW9uUGF0aH0vJHt2YWx1ZUhlbHBQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRgKTtcblx0XHRcdFx0aWYgKHRleHRBbm5vdGF0aW9uICYmIHRleHRBbm5vdGF0aW9uLiRQYXRoKSB7XG5cdFx0XHRcdFx0dGV4dFByb3BlcnR5ID0gdGV4dEFubm90YXRpb24uJFBhdGg7XG5cdFx0XHRcdFx0LyogQnVpbGQgdGhlIGZpbHRlciBmb3IgdGhlIHJlbGV2YW50IHBhcmFtZXRlcnMgKi9cblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJzID0gdGhpcy5fZ2V0RmlsdGVyKFxuXHRcdFx0XHRcdFx0dmFsdWVMaXN0LFxuXHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0dmFsdWVIZWxwUHJvcGVydHksXG5cdFx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdFx0XHR2YWx1ZWhlbHBQYXlsb2FkLFxuXHRcdFx0XHRcdFx0dmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmlsdGVyQ29uZGl0aW9uc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB2YWx1ZUxpc3RNb2RlbC5iaW5kTGlzdChgLyR7dmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXJzLCB7XG5cdFx0XHRcdFx0XHQkc2VsZWN0OiB0ZXh0UHJvcGVydHlcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvKiBSZXF1ZXN0IGRlc2NyaXB0aW9uIGZvciBnaXZlbiBrZXkgZnJvbSB2YWx1ZSBsaXN0IGVudGl0eSAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIDIpO1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5sZW5ndGggPyBjb250ZXh0c1swXS5nZXRPYmplY3QodGV4dFByb3BlcnR5KSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nQ29udGV4dCAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5RGVzY3JpcHRpb25QYXRoKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gcHJvcGVydHlEZXNjcmlwdGlvblBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHByb3BlcnR5RGVzY3JpcHRpb25QYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogcHJvcGVydHlEZXNjcmlwdGlvblBhdGg7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNTZXJ2aWNlID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZhbHVlSGVscCBhcyB1bmtub3duIGFzIENvbnRyb2wpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdFx0XHRcdGF3YWl0IHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSwgYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0YFJlcXVlc3RTaWRlRWZmZWN0cyBpcyB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgdGV4dCBhbm5vdGF0aW9uIGZvciAke3ZhbHVlSGVscFByb3BlcnR5fSBpcyBub3QgZGVmaW5lZCBhdCB0aGUgQ29sbGVjdGlvblBhdGggb2YgdGhlIHZhbHVlIGhlbHBgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qIEVYVEVSTkFsSUQgKi9cblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUGF0aCA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0YCR7dmFsdWVoZWxwUGF5bG9hZC5wcm9wZXJ0eVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FeHRlcm5hbElEYFxuXHRcdFx0XHRcdCk/LiRQYXRoO1xuXHRcdFx0XHRcdGlmIChleHRlcm5hbElkUGF0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZEZ1bGxQYXRoID0gdmFsdWVoZWxwUGF5bG9hZC5wcm9wZXJ0eVBhdGgucmVwbGFjZShwcm9wZXJ0eU5hbWUsIGV4dGVybmFsSWRQYXRoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWROYW1lID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtleHRlcm5hbElkRnVsbFBhdGh9QHNhcHVpLm5hbWVgKTtcblx0XHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWREZXNjcmlwdGlvblBhdGggPSBtZXRhTW9kZWw/LmdldE9iamVjdChgJHtleHRlcm5hbElkRnVsbFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YClcblx0XHRcdFx0XHRcdFx0Py4kUGF0aDtcblx0XHRcdFx0XHRcdGNvbnN0IGZpbHRlcnMgPSBbXTtcblx0XHRcdFx0XHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDogZXh0ZXJuYWxJZE5hbWUsIG9wZXJhdG9yOiBcIkVRXCIsIHZhbHVlMToga2V5IH0pKTtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdmFsdWVMaXN0TW9kZWwuYmluZExpc3QoYC8ke3ZhbHVlTGlzdC5Db2xsZWN0aW9uUGF0aH1gLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmlsdGVycywge1xuXHRcdFx0XHRcdFx0XHQkc2VsZWN0OiBgJHtleHRlcm5hbElkTmFtZX0sJHtleHRlcm5hbElkRGVzY3JpcHRpb25QYXRofWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0XHRpZiAoY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0c1swXS5nZXRPYmplY3QoZXh0ZXJuYWxJZERlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihgVGV4dCBBbm5vdGF0aW9uIGZvciAke3ZhbHVlSGVscFByb3BlcnR5fSBpcyBub3QgZGVmaW5lZGApO1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IHN0YXR1cyA9IGVycm9yID8gKGVycm9yIGFzIFhNTEh0dHBSZXF1ZXN0KS5zdGF0dXMgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHN0YXR1cyA9PT0gNDA0ID8gYE1ldGFkYXRhIG5vdCBmb3VuZCAoJHtzdGF0dXN9KSBmb3IgdmFsdWUgaGVscCBvZiBwcm9wZXJ0eSAke3Byb3BlcnR5UGF0aH1gIDogbWVzc2FnZTtcblx0XHRcdFx0TG9nLmVycm9yKG1zZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztTQWtEZUEsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGlCQUFpQixFQUFFO0lBQ25EQyxVQUFVLEVBQUUsQ0FBQztJQUViO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx5QkFBeUIsRUFBRSxTQUFBQSxDQUFVQyxLQUFZLEVBQUVDLElBQTRCLEVBQUVDLEtBQXNCLEVBQUU7TUFDeEc7TUFDQTtNQUNBOztNQUVBLE1BQU1DLE1BQTBCLEdBQUcsQ0FBQyxDQUFDO01BQ3JDLElBQ0NGLElBQUksSUFDSkEsSUFBSSxDQUFDRyxHQUFHLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxrQ0FB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
@@ -3,6 +3,7 @@ import Log from "sap/base/Log";
3
3
  import CommonUtils from "sap/fe/core/CommonUtils";
4
4
  import { getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
5
5
  import type { AnnotationValueListType, ValueHelpPayload } from "sap/fe/macros/internal/valuehelp/ValueListHelper";
6
+ import Component from "sap/ui/core/Component";
6
7
  import type Control from "sap/ui/core/Control";
7
8
  import Element from "sap/ui/core/Element";
8
9
  import type Field from "sap/ui/mdc/Field";
@@ -22,6 +23,7 @@ import CommonHelper from "../CommonHelper";
22
23
  import type FilterBar from "../controls/FilterBar";
23
24
  import type FilterBarAPI from "../filterBar/FilterBarAPI";
24
25
  import type { ConditionPayloadMap, ConditionPayloadType, ExternalStateType } from "../valuehelp/ValueHelpDelegate";
26
+ import ValueHelpDelegate from "../valuehelp/ValueHelpDelegate";
25
27
 
26
28
  export type FieldPayload = {
27
29
  retrieveTextFromValueList?: boolean;
@@ -188,7 +190,6 @@ export default Object.assign({}, FieldBaseDelegate, {
188
190
  const sourcePath = parameter.LocalDataProperty?.$PropertyPath;
189
191
  filterValue = bindingContext.getObject(sourcePath);
190
192
  }
191
-
192
193
  if (!filterValue && filterBarConditions) {
193
194
  const condition = filterBarConditions?.[parameter.ValueListProperty];
194
195
  if (condition?.length === 1 && condition[0]?.operator === "EQ") {
@@ -250,7 +251,7 @@ export default Object.assign({}, FieldBaseDelegate, {
250
251
  * @param config Configuration Object
251
252
  * @returns Object containing description, key, and payload. If it is not available right now (must be requested), a <code>Promise</code> is returned
252
253
  */
253
- getItemForValue: function (field: Field, valueHelp: ValueHelp, config: ItemForValueConfiguration) {
254
+ getItemForValue: async function (field: Field, valueHelp: ValueHelp, config: ItemForValueConfiguration) {
254
255
  //BCP: 2270162887 . The MDC field should not try to get the item when the field is emptied
255
256
  // JIRA: FIORITECHP1-25361 - Improve the type-ahead behavior for missinng text annotation or constraints violations of the existing text annotation
256
257
  if (config.value === "") {
@@ -258,10 +259,16 @@ export default Object.assign({}, FieldBaseDelegate, {
258
259
  }
259
260
 
260
261
  if (config.checkDescription) {
261
- const valuehelpPayload = valueHelp.getPayload() as ValueHelpPayload;
262
- const descriptionPath = valuehelpPayload.valueHelpDescriptionPath;
263
- const maxLength = valuehelpPayload?.maxLength;
264
- const valueLength = config.value !== null && config.value !== undefined ? config.value.toString().length : 0;
262
+ const container = valueHelp.getTypeahead();
263
+ const payload = valueHelp.getPayload() as ValueHelpPayload;
264
+ const selectedContent = container.getSelectedContent();
265
+ const contentId = selectedContent && selectedContent.getId();
266
+ // In cases where getItemForValue is called before showValueList, the description may not be available.
267
+ // Therefore, this retrieveContent method is used to update the description.
268
+ await ValueHelpDelegate.retrieveContent(valueHelp, container, contentId);
269
+ const maxLength = payload.maxLength;
270
+ const valueLength = config.value?.toString().length || 0;
271
+ const descriptionPath = payload.valueHelpDescriptionPath;
265
272
  if (descriptionPath === "") {
266
273
  // In case the property value help collection has no text annotation (descriptionPath is empty) the description check shouldn´t occur.
267
274
  // In such a case the method getDescription will be called by MDC and within this method a SideEffect is requested to retrieve the text from the text property of the main entity
@@ -322,7 +329,8 @@ export default Object.assign({}, FieldBaseDelegate, {
322
329
  _conditionModelName: string,
323
330
  conditionPayload: ConditionPayloadMap,
324
331
  control: Control,
325
- _type: unknown
332
+ _type: unknown,
333
+ emptyAllowed: boolean
326
334
  ) {
327
335
  //JIRA: FIORITECHP1-22022 . The MDC field should not tries to determine description with the initial GET of the data.
328
336
  // it should rely on the data we already received from the backend
@@ -340,6 +348,25 @@ export default Object.assign({}, FieldBaseDelegate, {
340
348
 
341
349
  if (payload?.retrieveTextFromValueList === true || payload?.isFilterField === true) {
342
350
  const dataModel = valueHelp.getModel() as ODataModel | undefined;
351
+ const owner = Component.getOwnerComponentFor(valueHelp as unknown as Control);
352
+ // If neither dataModel nor owner is defined, the valueHelp cannot be an FE control.
353
+ // This occurs in cases of a standard MDC controls (e.g., default ValueHelp for boolean values).
354
+ if (!dataModel && !owner) {
355
+ return FieldBaseDelegate.getDescription(
356
+ field as FieldBase,
357
+ valueHelp,
358
+ key,
359
+ _conditionIn,
360
+ _conditionOut,
361
+ bindingContext as Context,
362
+ undefined,
363
+ undefined,
364
+ conditionPayload,
365
+ control,
366
+ _type,
367
+ emptyAllowed
368
+ );
369
+ }
343
370
  const metaModel = dataModel
344
371
  ? dataModel.getMetaModel()
345
372
  : CommonUtils.getAppComponent(valueHelp as unknown as Control)
@@ -354,14 +381,12 @@ export default Object.assign({}, FieldBaseDelegate, {
354
381
  try {
355
382
  /* Request value help metadata */
356
383
  const valueListInfo = await metaModel.requestValueListInfo(propertyPath, true, bindingContext);
357
-
358
384
  const filterBar = this._getFilterBar(field);
359
385
  let filterConditions: Record<string, ConditionObject[]> | undefined;
360
386
  if (filterBar) {
361
387
  const filterState: ExternalStateType = await StateUtil.retrieveExternalState(filterBar);
362
388
  filterConditions = filterState.filter;
363
389
  }
364
-
365
390
  const propertyName = metaModel.getObject(`${propertyPath}@sapui.name`) as string;
366
391
  // take the first value list annotation - alternatively take the one without qualifier or the first one
367
392
  const valueList = valueListInfo[Object.keys(valueListInfo)[0]];