@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/base/util/ObjectPath", "sap/base/util/deepEqual", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/TypeGuards", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/internal/valuehelp/ValueListHelper", "sap/m/inputUtils/highlightDOMElements", "sap/ui/core/message/MessageType", "sap/ui/mdc/ValueHelpDelegate", "sap/ui/mdc/condition/Condition", "sap/ui/mdc/enums/ConditionValidated", "sap/ui/mdc/enums/RequestShowContainerReason", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/mdc/p13n/StateUtil", "sap/ui/model/FilterType", "../internal/valuehelp/AdditionalValueHelper"], function (Log, ObjectPath, deepEqual, CommonUtils, CollaborationCommon, MetaModelConverter, TypeGuards, FilterUtils, ValueListHelper, highlightDOMElements, MessageType, ValueHelpDelegate, Condition, ConditionValidated, RequestShowContainerReason, TypeMap, StateUtil, FilterType, AdditionalValueHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/TypeGuards", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/internal/valuehelp/ValueListHelper", "sap/m/inputUtils/highlightDOMElements", "sap/ui/core/message/MessageType", "sap/ui/mdc/ValueHelpDelegate", "sap/ui/mdc/condition/Condition", "sap/ui/mdc/enums/ConditionValidated", "sap/ui/mdc/enums/RequestShowContainerReason", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/mdc/p13n/StateUtil", "sap/ui/model/FilterType", "../internal/valuehelp/AdditionalValueHelper"], function (Log, ObjectPath, CommonUtils, CollaborationCommon, MetaModelConverter, TypeGuards, FilterUtils, ValueListHelper, highlightDOMElements, MessageType, ValueHelpDelegate, Condition, ConditionValidated, RequestShowContainerReason, TypeMap, StateUtil, FilterType, AdditionalValueHelper) {
6
6
  "use strict";
7
7
 
8
8
  var additionalValueHelper = AdditionalValueHelper.additionalValueHelper;
@@ -53,6 +53,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
53
53
  const appComponent = CommonUtils.getAppComponent(CommonUtils.getTargetView(control));
54
54
  return appComponent.getValueHelpHistoryService();
55
55
  },
56
+ /**
57
+ * Compares two condition objects for equality based on operator and values.
58
+ * @param oldCondition First condition to compare
59
+ * @param newCondition Second condition to compare
60
+ * @returns True if conditions are equal, false otherwise
61
+ */
62
+ checkConditionsEqual(oldCondition, newCondition) {
63
+ // Compare operators
64
+ if (oldCondition.operator !== newCondition.operator) {
65
+ return false;
66
+ }
67
+
68
+ // Compare values arrays
69
+ const values1 = oldCondition.values ?? [];
70
+ const values2 = newCondition.values ?? [];
71
+ if (values1.length !== values2.length) {
72
+ return false;
73
+ }
74
+
75
+ // Sort values for comparison to handle order differences
76
+ const sortedValues1 = [...values1].sort((firstValue, secondValue) => String(firstValue).localeCompare(String(secondValue)));
77
+ const sortedValues2 = [...values2].sort((firstValue, secondValue) => String(firstValue).localeCompare(String(secondValue)));
78
+ return sortedValues1.every((value, index) => value === sortedValues2[index]);
79
+ },
56
80
  /**
57
81
  * Get the history data for the value list property from the history service.
58
82
  * No history data is fetched for fields annotated with IsPotentiallySensitive.
@@ -312,7 +336,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
312
336
  const conditionPath = filterBarProperty.conditionPath;
313
337
  const conditionAlreadyExists = state.filter[conditionPath]?.find(testCondition => {
314
338
  delete testCondition.filtered;
315
- if (deepEqual(testCondition, newCondition)) {
339
+ if (this.checkConditionsEqual(testCondition, newCondition)) {
316
340
  return true;
317
341
  }
318
342
  // reset filtered to false
@@ -362,14 +386,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
362
386
  const outParameterSources = [];
363
387
  for (const outParameter of outParameters) {
364
388
  /* Updated property via out-parameter if value changed */
365
- if (context.getProperty(outParameter.source) !== outValues[outParameter.helpPath]) {
366
- this._updatePropertyViaOutParameter(convertedMetadata, rootPath, outValues, outParameter, context, contextCanRequestSideEffects);
367
- }
389
+ this._updatePropertyViaOutParameter(convertedMetadata, rootPath, outValues, outParameter, context, contextCanRequestSideEffects);
368
390
  outParameterSources.push(outParameter.source);
369
391
  }
370
392
  const view = CommonUtils.getTargetView(valueHelp);
371
393
  const collaborativeDraft = view.getController().collaborativeDraft;
372
- if (collaborativeDraft.isConnected()) {
394
+ if (collaborativeDraft.isConnected() && outParameterSources.length > 0) {
373
395
  // we determine the binding that sends the request
374
396
  let binding;
375
397
  if (context.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")) {
@@ -406,7 +428,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
406
428
  /* The fast creation row is only used by SD */
407
429
  /* The group ID (third argument of setProperty described api documentation of the Context) is used for the PATCH request, if not specified, the update group ID for the context's binding is used, 'null' to prevent the PATCH request */
408
430
  /* The Transient context cannot request SideEffects and cannot patch via group 'null' */
409
- context.setProperty(outParameter.source, outValues[outParameter.helpPath]);
431
+ const currentVal = context.getProperty(outParameter.source);
432
+ const newVal = outValues[outParameter.helpPath];
433
+ if (currentVal !== newVal) {
434
+ context.setProperty(outParameter.source, null);
435
+ context.setProperty(outParameter.source, outValues[outParameter.helpPath]);
436
+ }
410
437
  }
411
438
  /* If the key gets updated via out-parameter, then the description needs also retrieved with requestSideEffects */
412
439
  const textPath = isPathAnnotationExpression(targetProperty?.annotations?.Common?.Text) ? targetProperty?.annotations?.Common?.Text.path : undefined;
@@ -735,6 +762,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
735
762
  const value = context.getObject(vhKey);
736
763
  if (value != null) {
737
764
  entry[vhKey] = value?.length === 0 ? "" : value;
765
+ } else {
766
+ entry[vhKey] = null; // null value is also valid
738
767
  }
739
768
  });
740
769
  if (Object.keys(entry).length) {
@@ -1039,4 +1068,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
1039
1068
  }
1040
1069
  });
1041
1070
  }, false);
1042
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiX2dldEhpc3RvcnlEYXRhIiwicGF5bG9hZCIsImhpc3RvcnkiLCJlbmFibGVkIiwiaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsInZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlIiwiZmllbGREYXRhIiwiZ2V0RmllbGREYXRhIiwicHJvcGVydHlQYXRoIiwidmFsdWVIZWxwUXVhbGlmaWVyIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJfc2V0SGlzdG9yeURhdGEiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwidmFsdWVMaXN0UHJvcGVydHkiLCJfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllciIsImNvbmRpdGlvbiIsImlzVW5pdFZhbHVlSGVscCIsInZhbGlkYXRlZCIsIkNvbmRpdGlvblZhbGlkYXRlZCIsIlZhbGlkYXRlZCIsImNvbmRpdGlvblBheWxvYWRNYXAiLCJfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QiLCJwdXNoIiwiY29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdCIsInNldEZpZWxkRGF0YSIsImNvbmRpdGlvblBheWxvYWQiLCJuZXN0ZWRPYmplY3QiLCJrZXkiLCJPYmplY3RQYXRoIiwic2V0Iiwic3BsaXQiLCJfaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJ2YWx1ZSIsImlzRGlnaXRTZXF1ZW5jZSIsImlzRW1wdHlEaWdpdFNlcXVlbmNlIiwiZXZlcnkiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwidmFsdWVzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJjb25kaXRpb25QYXRoIiwiZmlsdGVyZWQiLCJuZXdDb25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJjb25kaXRpb25BbHJlYWR5RXhpc3RzIiwidGVzdENvbmRpdGlvbiIsImRlZXBFcXVhbCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsImNvbnRleHRQYXRoIiwiZmlsdGVyVGFyZ2V0Iiwic291cmNlIiwicG9wIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJmaWx0ZXJUYXJnZXRQYXRoIiwic3Vic3RyaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRSZWR1Y2VkUGF0aCIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJvdXRWYWx1ZXMiLCJ3YXJuaW5nIiwiX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eSIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwicm9vdFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsImdldFByb3BlcnR5IiwiX3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyIiwidmlldyIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImdldENvbnRyb2xsZXIiLCJpc0Nvbm5lY3RlZCIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJzZW5kIiwiYWN0aW9uIiwiQWN0aXZpdHkiLCJDaGFuZ2UiLCJtYXAiLCJ0YXJnZXRQcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZmllbGRDb250cm9sIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJGaWVsZENvbnRyb2wiLCJkeW5hbWljUmVhZE9ubHkiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJzaWRlRWZmZWN0UGF0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNldFByb3BlcnR5IiwidGV4dFBhdGgiLCJUZXh0IiwiZ2V0RmlsdGVyQ29uZGl0aW9ucyIsImNvbmZpZyIsImdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zIiwib25Db25kaXRpb25Qcm9wYWdhdGlvbiIsInJlYXNvbiIsIl9jb25maWciLCJpc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCIsInF1YWxpZmllciIsImdldE91dFBhcmFtZXRlcnMiLCJmaWVsZFBhcmVudCIsImdldFBhcmVudCIsImdldENvbmRpdGlvbnMiLCJpc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyIsInByb3BlcnR5TmFtZSIsInBheWxvYWRLZXlzIiwicGF5bG9hZEtleSIsImNvbmRpdGlvblZhbHVla2V5cyIsImNvbmRpdGlvblZhbHVla2V5IiwidmFsdWVLZXkiLCJrZXlWYWx1ZSIsIl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uIiwiaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCIsIl9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21CaW5kaW5nIiwiaW5Db25kaXRpb25zIiwiaW5QYXJhbWV0ZXJzIiwiYmluZGluZ0NvbnRleHQiLCJnZXRNZXRhUGF0aCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJpblBhcmFtZXRlciIsIm1ldGFEYXRhRXJyb3IiLCJuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnR5IiwicmVwbGFjZSIsIiRQYXJ0bmVyIiwiJGtpbmQiLCJfYnVpbGRQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiY29udGV4dFVuZGVyQ3JlYXRpb24iLCJnZXRVcGRhdGVHcm91cElkIiwic3RhcnRzV2l0aCIsImVycm9yTWVzc2FnZXNJbkNvbnRleHQiLCJnZXRNZXNzYWdlcyIsImdldFR5cGUiLCJNZXNzYWdlVHlwZSIsImNyZWF0ZWQiLCJyZXF1ZXN0UHJvcGVydHkiLCJpIiwibWV0YU1vZGVsQ29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwicmVsYXRpdmVQYXRoUGFydHMiLCJzbGljZSIsInBhcnQiLCJwYXJ0bmVyIiwibG9jYWxEYXRhUGF0aCIsImxvY2FsRGF0YVBhcnRzIiwibWF0Y2hDb3VudCIsImZpbmRJbmRleCIsImluZGV4IiwiY29uY2F0Iiwiam9pbiIsIl9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21GaWx0ZXJCYXIiLCJzb3VyY2VGaWVsZCIsIl9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyIiwiX3BhcnRpdGlvbkluUGFyYW1ldGVycyIsImluUGFyYW1ldGVyTWFwIiwiY29uc3RhbnQiLCJjb25zdGFudFZhbHVlIiwiaW5kZXhPZiIsIl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJzcmNDb250cm9sIiwidGFibGVDZWxsc0RvbVJlZnMiLCIkIiwibWRjTVRhYmxlIiwiaGlnaGxpZ2h0RE9NRWxlbWVudHMiLCJwb3BvdmVyVGFibGUiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsImdldEluUGFyYW1ldGVycyIsImlzT2JqZWN0UGFnZSIsImNyZWF0ZUNvbmRpdGlvblBheWxvYWQiLCJfdmFsdWVzIiwiZW50cnkiLCJpc011bHRpVmFsdWVGaWVsZCIsImV4dGVybmFsSWRQYXRoIiwidmhLZXlQcm9wZXJ0eSIsInZoS2V5VmFsdWUiLCJ2aFByb3BlcnRpZXMiLCJ2aEtleSIsImZpbmRDb25kaXRpb25zRm9yQ29udGV4dCIsImtleVBhdGgiLCJnZXRLZXlQYXRoIiwiZmluZENvbmRpdGlvbiIsImNvbmRpdGlvblNlbGVjdGVkUm93IiwidXNlTXVsdGlWYWx1ZUZpZWxkIiwiY29udGV4dEtleXMiLCJzZWxlY3RlZENvbmRpdGlvbiIsIl91cGRhdGVCaW5kaW5nQXR0cmlidXRlcyIsInJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEiLCJyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsIm90aGVyc1ZhbHVlc0NvbnRleHREYXRhIiwiX2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJzb3J0IiwiaGFzUmVsZXZhbnREYXRhIiwicmVzZXRDaGFuZ2VzIiwiZGVidWciLCJhZGRpdGlvbmFsVmFsdWVIZWxwZXIiLCJjcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwicm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInN1c3BlbmQiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJjaGFuZ2VQYXJhbWV0ZXJzIiwicmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyIsInJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEiLCJnZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwicmVwbGFjZUFsbCIsImdldFJlbGV2YW50T3RoZXJzVmFsdWVzQ29udGV4dERhdGEiLCJmaWx0ZXJzIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwic29ydGVyIiwicmVzdW1lIiwiX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzIiwiY2hlY2tSZWNvbW1lbmRhdGlvbnMiLCJhcmd1bWVudHMiLCJyZWNvbW1lbmRhdGlvblZhbHVlcyIsInJlY2VudFZhbHVlcyIsImNvbnRlbnRNb2RlbCIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nQ29udGV4dFBhdGgiLCJmaWVsZFBhdGgiLCJpbnB1dFZhbHVlcyIsInR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50Iiwic2hvd0l0IiwidHlwZUFoZWFkQ29udGVudCIsImdldENvbnRlbnQiLCJmaWx0ZXJWYWx1ZSIsImZpZWxkVGV4dFZhbHVlIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwiY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIiLCJwYXJlbnRDb250cm9sIiwiZmllbGRJZCIsImdldElkIiwiaXNWaXN1YWxGaWx0ZXIiLCJ2YWx1ZUhlbHBUYWJsZSIsImdldFBhcmVudERpYWxvZyIsImlubmVyQ29udGVudCIsImdldERvbVJlZiIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaWQiLCJnZXRJbml0aWFsRm9jdXMiLCJjaGVja0hpc3RvcnlFbmFibGVkIiwicmVxdWVzdFNob3dDb250YWluZXIiLCJyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uIiwiVGFiIiwiVGFwIiwiVHlwaW5nIiwiRmlsdGVyIiwiVmFsdWVIZWxwUmVxdWVzdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmFsdWVIZWxwRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvRmlsdGVyQmFyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGREYXRhVHlwZSwgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IElGaWx0ZXJDb250cm9sIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEluT3V0UGFyYW1ldGVyLCBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgaGlnaGxpZ2h0RE9NRWxlbWVudHMgZnJvbSBcInNhcC9tL2lucHV0VXRpbHMvaGlnaGxpZ2h0RE9NRWxlbWVudHNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBGaWVsZCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFZhbHVlSGVscERlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9SZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvblwiO1xuaW1wb3J0IHR5cGUgRmllbGRCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL0ZpZWxkQmFzZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWx0ZXJiYXIvRmlsdGVyQmFyQmFzZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgTURDUG9wb3ZlciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvUG9wb3ZlclwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250ZW50XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJhYmxlTGlzdENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvRmlsdGVyYWJsZUxpc3RDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTVRhYmxlXCI7XG5pbXBvcnQgRmlsdGVyVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclR5cGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gXCIuLi9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBBZGRpdGlvbmFsVmFsdWVUeXBlLCBCaW5kaW5nSW5mb1BhcmFtZXRlcnMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXksIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLkZpbHRlckJhclwiO1xuY29uc3QgQW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZSA9IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uT2JqZWN0TWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+O1xuXG5leHBvcnQgdHlwZSBFeHRlcm5hbFN0YXRlVHlwZSA9IHtcblx0aXRlbXM6IHsgbmFtZTogc3RyaW5nIH1bXTtcblx0ZmlsdGVyOiBDb25kaXRpb25PYmplY3RNYXA7XG59O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25QYXlsb2FkVHlwZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4+O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25QYXlsb2FkTWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uUGF5bG9hZFR5cGVbXT47XG5cbnR5cGUgTURDQ29uZmlnVHlwZSA9IHtcblx0dmFsdWU6IHVua25vd247XG5cdHBhcnNlZFZhbHVlOiB1bmtub3duO1xuXHRjb250ZXh0OiBvYmplY3Q7XG5cdGNvbnRyb2w6IENvbnRyb2w7IC8vIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0YmluZGluZ0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xuXHRjaGVja0tleTogYm9vbGVhbjtcblx0Y2hlY2tEZXNjcmlwdGlvbjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIFZhbHVlSGVscERlbGVnYXRlLCB7XG5cdGFwaVZlcnNpb246IDIsXG5cdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXM6IG5ldyBXZWFrTWFwPG9iamVjdCwgUHJvbWlzZTx2b2lkPj4oKSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IHN1cHBvcnRzICRTZWFyY2guXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCBlbGVtZW50XG5cdCAqIEBwYXJhbSBfbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiAkc2VhcmNoIGlzIHN1cHBvcnRlZFxuXHQgKi9cblx0aXNTZWFyY2hTdXBwb3J0ZWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBfbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHRyZXR1cm4gISFjb250ZW50LmRhdGEoXCJzZWFyY2hTdXBwb3J0ZWRcIik7XG5cdH0sXG5cblx0Lypcblx0ICogQWRqdXN0YWJsZSBmaWx0ZXJpbmcgZm9yIGxpc3QtYmFzZWQgY29udGVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICovXG5cdHVwZGF0ZUJpbmRpbmdJbmZvOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCwgYmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0VmFsdWVIZWxwRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8odmFsdWVIZWxwLCBjb250ZW50LCBiaW5kaW5nSW5mbyk7XG5cblx0XHRpZiAoY29udGVudC5kYXRhKFwic2VhcmNoU3VwcG9ydGVkXCIpKSB7XG5cdFx0XHRjb25zdCBzZWFyY2ggPSBjb250ZW50LmdldEZpbHRlclZhbHVlKCk7XG5cdFx0XHRjb25zdCBub3JtYWxpemVkU2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybShzZWFyY2gpOyAvLyBhZGp1c3RTZWFyY2hcblxuXHRcdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0KGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLiRzZWFyY2ggPSBub3JtYWxpemVkU2VhcmNoIHx8IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmFsdWUgaGVscCBoaXN0b3J5IHNlcnZpY2UgZnJvbSB0aGUgYXBwIGNvbXBvbmVudC5cblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlXG5cdCAqL1xuXHRfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbDogQ29udHJvbCk6IFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIHtcblx0XHQvLyBGb3Igc29tZSByZWFzb24gd2UgY2Fubm90IHVzZSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQoY29udHJvbCkgaGVyZSBidXQgbmVlZCB0byBnZXQgdGhlIFZpZXcgZmlyc3QuXG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoY29udHJvbCkpO1xuXHRcdHJldHVybiBhcHBDb21wb25lbnQuZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSBoaXN0b3J5IGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5IGZyb20gdGhlIGhpc3Rvcnkgc2VydmljZS5cblx0ICogTm8gaGlzdG9yeSBkYXRhIGlzIGZldGNoZWQgZm9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCBJc1BvdGVudGlhbGx5U2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBWYWx1ZUhlbHBcblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50LCBlLmcuIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHRvIGEgbGlzdCBvZiBmaWVsZCBkYXRhIGZvciB0aGUgdmFsdWUgbGlzdCBwcm9wZXJ0eVxuXHQgKi9cblx0X2dldEhpc3RvcnlEYXRhOiBhc3luYyBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY29udHJvbDogQ29udHJvbCk6IFByb21pc2U8RmllbGREYXRhVHlwZVtdPiB7XG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCAmJiBwYXlsb2FkLmlzUG90ZW50aWFsbHlTZW5zaXRpdmUgIT09IHRydWUpIHtcblx0XHRcdGNvbnN0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlID0gdGhpcy5fZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbCk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBmaWVsZERhdGEgPSBhd2FpdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZS5nZXRGaWVsZERhdGEocGF5bG9hZC5wcm9wZXJ0eVBhdGggKyBcIi9cIiArIHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyKTtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5LmRhdGEgPSBmaWVsZERhdGE7XG5cdFx0XHRcdHJldHVybiBmaWVsZERhdGE7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogU2V0IHRoZSBoaXN0b3J5IGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5IGluIHRoZSBoaXN0b3J5IHNlcnZpY2UuXG5cdCAqIE5vIGhpc3RvcnkgZGF0YSBpcyBzdG9yZWQgZm9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCBJc1BvdGVudGlhbGx5U2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBWYWx1ZUhlbHBcblx0ICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbiBvYmplY3QgdG8gZ2V0IHRoZSBzZWxlY3RlZCBkYXRhIGZyb21cblx0ICogQHBhcmFtIGNvbnRyb2wgQ29udHJvbCB0byBmaW5kIHRoZSBhcHAgY29tcG9uZW50LCBlLmcuIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGluIHRoZSBoaXN0b3J5IHNlcnZpY2Vcblx0ICovXG5cdF9zZXRIaXN0b3J5RGF0YTogYXN5bmMgZnVuY3Rpb24gKHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsIGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLCBjb250cm9sOiBDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCAmJiBwYXlsb2FkLmlzUG90ZW50aWFsbHlTZW5zaXRpdmUgIT09IHRydWUgJiYgY29uZGl0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHZhbHVlTGlzdFByb3BlcnR5ID0gdGhpcy5fZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcihwYXlsb2FkKTtcblx0XHRcdGlmICh2YWx1ZUxpc3RQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBkYXRhOiBGaWVsZERhdGFUeXBlW10gPSBbXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRcdFx0aWYgKHBheWxvYWQuaXNVbml0VmFsdWVIZWxwIHx8IGNvbmRpdGlvbi52YWxpZGF0ZWQgPT09IENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSB0aGlzLl9nZXRDb25kaXRpb25QYXlsb2FkTGlzdChjb25kaXRpb24pPy5bMF07XG5cdFx0XHRcdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRcdFx0XHRkYXRhLnB1c2godGhpcy5jb252ZXJ0Q29uZGl0aW9uUGF5bG9hZFRvTmVzdGVkT2JqZWN0KGNvbmRpdGlvblBheWxvYWRNYXApKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSA9IHRoaXMuX2dldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlKGNvbnRyb2wpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlLnNldEZpZWxkRGF0YShwYXlsb2FkLnByb3BlcnR5UGF0aCArIFwiL1wiICsgcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIsIGRhdGEpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0aW5nIHRoZSBjb25kaXRpb24gcGF5bG9hZCB0byBhIG5lc3RlZCBvYmplY3QuXG5cdCAqIEBwYXJhbSBjb25kaXRpb25QYXlsb2FkIFRoZSBjb25kaXRpb24gcGF5bG9hZCBvYmplY3QgdG8gYmUgY29udmVydGVkXG5cdCAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbmVzdGVkIG9iamVjdFxuXHQgKi9cblx0Y29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdDogZnVuY3Rpb24gKGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlKTogQ29uZGl0aW9uUGF5bG9hZFR5cGUge1xuXHRcdGNvbnN0IG5lc3RlZE9iamVjdDogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBjb25kaXRpb25QYXlsb2FkKSB7XG5cdFx0XHRPYmplY3RQYXRoLnNldChrZXkuc3BsaXQoXCIvXCIpLCBjb25kaXRpb25QYXlsb2FkW2tleV0sIG5lc3RlZE9iamVjdCk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXN0ZWRPYmplY3Q7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIHZhbHVlIGlzIGRpZ2l0IHNlcXVlbmNlIHdpdGggbm8gdmFsdWUuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcblx0ICogQHBhcmFtIGlzRGlnaXRTZXF1ZW5jZSBJbmRpY2F0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGEgZGlnaXQgc2VxdWVuY2Vcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gZW1wdHkgZGlnaXQgc2VxdWVuY2UsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2lzRW1wdHlEaWdpdFNlcXVlbmNlOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcblx0XHRsZXQgaXNFbXB0eURpZ2l0U2VxdWVuY2UgPSBmYWxzZTtcblx0XHRpZiAoaXNEaWdpdFNlcXVlbmNlKSB7XG5cdFx0XHRpc0VtcHR5RGlnaXRTZXF1ZW5jZSA9XG5cdFx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdD8gdmFsdWUuc3BsaXQoXCJcIikuZXZlcnkoKGNoYXIpID0+IGNoYXIgPT09IFwiMFwiKSA/PyB2YWx1ZSA9PT0gXCJcIlxuXHRcdFx0XHRcdDogdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIGlzRW1wdHlEaWdpdFNlcXVlbmNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgZmllbGQgaXMgcmVjb21tZW5kYXRpb24gcmVsZXZhbnQgYW5kIGNhbGxzIGVpdGhlciBfdXBkYXRlQmluZGluZyBvciBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqL1xuXHR1cGRhdGVCaW5kaW5nOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGNvbnRlbnQ6IE1UYWJsZVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBsaXN0QmluZGluZyBzaG91bGQgYmUgb2YgdHlwZSBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vV2UgZmV0Y2ggdGhlIHZhbHVlbGlzdCBwcm9wZXJ0eSBmcm9tIHRoZSBwYXlsb2FkIHRvIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBwcm9wZXJ0eSB3aGlsZSBtYWtpbmcgYSBjYWxsIG9uIHZhbHVlbGlzdCBlbnRpdHkgc2V0XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAoY29udGVudC5pc1R5cGVhaGVhZCgpKSB7XG5cdFx0XHRsZXQgdXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBjcmVhdGUgYSBwcm9taXNlIHRvIG1ha2Ugc3VyZSBjaGVja0xpc3RCaW5kaW5nUGVuZGluZyBpcyBvbmx5IGNvbXBsZXRlZCBvbmNlIHRoaXMgcHJvbWlzZSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlID0gdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmdldChsaXN0QmluZGluZyk7XG5cdFx0XHQvL2J1aWxkIGEgcHJvbWlzZSBjaGFpbiBpZiBuZWNlc3Nhcnlcblx0XHRcdHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5zZXQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRleGlzdGluZ1VwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSA/IGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlLnRoZW4oYXN5bmMgKCkgPT4gbmV3UHJvbWlzZSkgOiBuZXdQcm9taXNlXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9IHRoaXMuX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIocGF5bG9hZCk7XG5cdFx0XHRjb25zdCBmaWVsZCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpIGFzIEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQ7XG5cdFx0XHRjb25zdCBpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkID1cblx0XHRcdFx0ZmllbGQuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgZmllbGQuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAhaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCAmJiBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdID0gW107XG5cblx0XHRcdC8vIFdlIG5lZWQgdG8gc2hvdyByZWNvbW1lbmRhdGlvbnMgb25seSB3aGVuIHRoZSBmaWVsZCBoYXMgZW1wdHkgdmFsdWUgb3Igd2hlbiB1c2VyIGlzIHR5cGluZyBhIHZhbHVlLiBPdGhlciB0aW1lcyB3ZSBzaG91bGQgbm90IHNob3cgcmVjb21tZW5kYXRpb25zLlxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGZpZWxkIGhhcyBhbnkgcGVuZGluZyB1c2VyIGlucHV0IGFuZCBpZiBpdCBpcyB0aGVuIHdlIHNob3cgcmVjb21tZW5kYXRpb25zIGlmIGFueS5cblx0XHRcdGNvbnN0IGlzRGlnaXRTZXF1ZW5jZSA9XG5cdFx0XHRcdChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH0ke0Fubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2V9YCkgPz8gZmFsc2U7XG5cdFx0XHRpZiAoIWZpZWxkVmFsdWUgfHwgZmllbGQuaGFzUGVuZGluZ1VzZXJJbnB1dCgpIHx8IHRoaXMuX2lzRW1wdHlEaWdpdFNlcXVlbmNlKGZpZWxkVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZSkpIHtcblx0XHRcdFx0Ly9nZXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgbW9kZWxcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50LCBwYXlsb2FkKTtcblxuXHRcdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiBjcmVhdGUgYWRkaXRpb25hbCB2YWx1ZSBzdHJ1Y3R1cmUgYW5kIGNhbGwgX3VwZGF0ZUJpbmRpbmdGb3JSZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0aWYgKHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLnB1c2goeyBwcm9wZXJ0eVBhdGg6IHZhbHVlTGlzdFByb3BlcnR5LCB2YWx1ZXMsIGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbiB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB0YWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdGNvbnN0IHNvcnRlcnNDdXN0b21EYXRhID0gdGFibGUuZ2V0Q3VzdG9tRGF0YSgpLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5nZXRLZXkoKSA9PT0gXCJzb3J0ZXJzXCIpO1xuXHRcdFx0bGV0IHNvcnRlcnM6IFNvcnRlclR5cGVbXSA9IFtdO1xuXHRcdFx0aWYgKHNvcnRlcnNDdXN0b21EYXRhLmxlbmd0aCkgc29ydGVycyA9IHNvcnRlcnNDdXN0b21EYXRhWzBdLmdldFZhbHVlKCkuc29ydGVycztcblxuXHRcdFx0YXdhaXQgdGhpcy5fdXBkYXRlQmluZGluZ1dpdGhUcmFuc2llbnRDb250ZXh0cyhcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdHNvcnRlcnMsXG5cdFx0XHRcdHRhYmxlXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUpIHtcblx0XHRcdFx0Ly9yZXNvbHZlIHRoZSBwcm9taXNlIGFzIGV2ZXJ5dGhpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9jYWxsIF91cGRhdGVCaW5kaW5nIGlmIHRoZXJlIGFyZSBubyByZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0XHRcdHRoaXMuX3VwZGF0ZUJpbmRpbmcobGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGZpbHRlciBpbiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPi5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSByZXF1ZXN0ZWRJdGVtcyBOdW1iZXIgb2YgcmVxdWVzdGVkIGl0ZW1zXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBpZiBzZWFyY2ggaXMgZXhlY3V0ZWRcblx0ICovXG5cdGV4ZWN1dGVGaWx0ZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHJlcXVlc3RlZEl0ZW1zOiBudW1iZXIpIHtcblx0XHRsaXN0QmluZGluZy5nZXRDb250ZXh0cygwLCByZXF1ZXN0ZWRJdGVtcyk7XG5cblx0XHRhd2FpdCB0aGlzLmNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nKHZhbHVlSGVscCwgbGlzdEJpbmRpbmcsIHJlcXVlc3RlZEl0ZW1zKTtcblx0XHRyZXR1cm4gbGlzdEJpbmRpbmc7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IGlzIHdhaXRpbmcgZm9yIGFuIHVwZGF0ZS5cblx0ICogQXMgbG9uZyBhcyB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gc2V0IGZvciA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4sXG5cdCAqIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gbmVlZHMgdG8gd2FpdC5cblx0ICogQHBhcmFtIF92YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nIHRvIGNoZWNrXG5cdCAqIEBwYXJhbSByZXF1ZXN0ZWRJdGVtcyBOdW1iZXIgb2YgcmVxdWVzdGVkIGl0ZW1zXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvbmNlIExpc3RCaW5kaW5nIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICovXG5cdGNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nOiBhc3luYyBmdW5jdGlvbiAoX3ZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxldCBpc1BlbmRpbmcgPSBmYWxzZTtcblx0XHRpZiAobGlzdEJpbmRpbmcgJiYgdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmhhcyhsaXN0QmluZGluZykpIHtcblx0XHRcdGF3YWl0IHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5nZXQobGlzdEJpbmRpbmcpO1xuXHRcdH1cblx0XHRpZiAobGlzdEJpbmRpbmcgJiYgIWxpc3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblx0XHRcdFx0aXNQZW5kaW5nID0gY29udGV4dHMubGVuZ3RoID09PSAwO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0aWYgKGVycm9yICYmIChlcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KT8uY2FuY2VsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXNQZW5kaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaXNQZW5kaW5nO1xuXHR9LFxuXG5cdGdldFR5cGVNYXA6IGZ1bmN0aW9uIChfdmFsdWVIZWxwOiBWYWx1ZUhlbHApIHtcblx0XHRyZXR1cm4gVHlwZU1hcDtcblx0fSxcblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIGNvbnRlbnQgb2YgdGhlIHZhbHVlIGhlbHAuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIGhlbHAgaXMgb3BlbmVkIG9yIGEga2V5IG9yIGRlc2NyaXB0aW9uIGlzIHJlcXVlc3RlZC5cblx0ICpcblx0ICogU28sIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgaGVscCBjb250ZW50IHVzZWQsIGFsbCBjb250ZW50IGNvbnRyb2xzIGFuZCBkYXRhIG5lZWQgdG8gYmUgYXNzaWduZWQuXG5cdCAqIE9uY2UgdGhleSBhcmUgYXNzaWduZWQgYW5kIHRoZSBkYXRhIGlzIHNldCwgdGhlIHJldHVybmVkIDxjb2RlPlByb21pc2U8L2NvZGU+IG5lZWRzIHRvIGJlIHJlc29sdmVkLlxuXHQgKiBPbmx5IHRoZW4gZG9lcyB0aGUgdmFsdWUgaGVscCBjb250aW51ZSBvcGVuaW5nIG9yIHJlYWRpbmcgZGF0YS5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGFpbmVyIENvbnRhaW5lciBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudElkIElkIG9mIHRoZSBjb250ZW50IHNob3duIGFmdGVyIHRoaXMgY2FsbCB0byByZXRyaWV2ZUNvbnRlbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIGFsbCBjb250ZW50IGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0cmV0cmlldmVDb250ZW50OiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRhaW5lcjogQ29udGFpbmVyLCBjb250ZW50SWQ6IHN0cmluZykge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0cmV0dXJuIFZhbHVlTGlzdEhlbHBlci5zaG93VmFsdWVMaXN0KHBheWxvYWQsIGNvbnRhaW5lciwgY29udGVudElkKTtcblx0fSxcblxuXHRfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3Q6IGZ1bmN0aW9uIChjb25kaXRpb246IENvbmRpdGlvbk9iamVjdCkge1xuXHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXAsXG5cdFx0XHR2YWx1ZUhlbHBRdWFsaWZpZXJzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uUGF5bG9hZE1hcCksXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkTGlzdCA9IHZhbHVlSGVscFF1YWxpZmllcnMubGVuZ3RoID8gY29uZGl0aW9uUGF5bG9hZE1hcFt2YWx1ZUhlbHBRdWFsaWZpZXJzWzBdXSA6IFtdO1xuXG5cdFx0cmV0dXJuIGNvbmRpdGlvblBheWxvYWRMaXN0O1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eSBmcm9tIFBheWxvYWQgYmFzZWQgb24gZGF0YSBmcm9tIHBheWxvYWQga2V5cyBhbmQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHJldHVybnMgVmFsdWVMaXN0UHJvcGVydHlcblx0ICovXG5cdF9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyOiBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0/LnZoUGFyYW1ldGVycyB8fCBbXTtcblx0XHRjb25zdCBrZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BlcnR5S2V5UGF0aCA9IHBheWxvYWQudmFsdWVIZWxwS2V5UGF0aDtcblx0XHRsZXQgZmlsdGVyZWRLZXlzOiBzdHJpbmdbXSA9IFsuLi5rZXlzXTtcblx0XHRjb25zdCBoZWxwUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2NyZWF0ZSBoZWxwUGF0aHMgYXJyYXkgd2hpY2ggd2lsbCBvbmx5IGNvbnNpc3Qgb2YgcGFyYW1zIGhlbHBwYXRoXG5cdFx0XHRwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW06IEluT3V0UGFyYW1ldGVyKSB7XG5cdFx0XHRcdGhlbHBQYXRocy5wdXNoKHBhcmFtLmhlbHBQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly9maWx0ZXIgdGhlIGtleXMgYmFzZWQgb24gaGVscFBhdGhzLiBJZiBrZXkgaXMgbm90IHByZXNlbnQgaW4gaGVscFBhdGggdGhlbiBpdCBpcyB2YWx1ZWxpc3Rwcm9wZXJ0eVxuXHRcdFx0ZmlsdGVyZWRLZXlzID0ga2V5cy5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhaGVscFBhdGhzLmluY2x1ZGVzKGtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBmcm9tIGZpbHRlcmVkS2V5cyByZXR1cm4gdGhlIGtleSB0aGF0IG1hdGNoZXMgdGhlIHByb3BlcnR5IG5hbWVcblx0XHRyZXR1cm4gcHJvcGVydHlLZXlQYXRoICYmIGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eUtleVBhdGgpID8gcHJvcGVydHlLZXlQYXRoIDogXCJcIjtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRmaWx0ZXJCYXI6IEZpbHRlckJhcixcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RSZXBvcnRGaWx0ZXJCYXI6IEZpbHRlckJhclxuXHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShsaXN0UmVwb3J0RmlsdGVyQmFyKTtcblx0XHRcdGNvbnN0IHN0YXRlSXRlbXMgPSBzdGF0ZS5pdGVtczsgLy8gVmlzaWJsZSBGaWx0ZXJJdGVtcyBpbiB0aGUgTFItRmlsdGVyQmFyXG5cdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0aWVzID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyUHJvcGVydHlJbmZvKGZpbHRlckJhciBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGZpbHRlckJhci5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdC8vIExSIEZpbHRlckJhciBvciBMUiBBZGFwdEZpbHRlclxuXHRcdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChmaWx0ZXJCYXJQcm9wZXJ0eSAmJiBzdGF0ZUl0ZW1zPy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGZpbHRlckJhclByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRcdFx0LyogUmVzZXQgdGhlIGNvbmRpdGlvbnMgYmVmb3JlIGNyZWF0ZSBuZXcgY29uZGl0aW9ucyBvdGhlcndpc2UgaXQgZ2V0cyBub3QgdXBkYXRlZCAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRzdGF0ZS5maWx0ZXJbY29uZGl0aW9uUGF0aF0/LmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uZGl0aW9uLmZpbHRlcmVkID0gZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIGZvciBlYWNoIGNvbmRpdGlvbnNcblx0XHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZExpc3QgPSB0aGlzLl9nZXRDb25kaXRpb25QYXlsb2FkTGlzdChjb25kaXRpb24pO1xuXHRcdFx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyQmFyUHJvcGVydHkgPSB0aGlzLl9maW5kRmlsdGVyQmFyUHJvcGVydHlCeUFubm90YXRpb25QYXRoKFxuXHRcdFx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHQvLyBQcm9wYWdhdGUgT1VUIHBhcmFtZXRlciBvbmx5IGlmIHRoZSBmaWx0ZXIgZmllbGQgaXMgdmlzaWJsZSBpbiB0aGUgTFIgZmlsdGVyYmFyXG5cdFx0XHRcdFx0Ly8gTFIgRmlsdGVyQmFyIG9yIExSIEFkYXB0RmlsdGVyXG5cdFx0XHRcdFx0aWYgKGZpbHRlckJhclByb3BlcnR5ICYmIHN0YXRlSXRlbXM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gZmlsdGVyQmFyUHJvcGVydHkubmFtZSkpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29uZGl0aW9uUGF5bG9hZCBvZiBjb25kaXRpb25QYXlsb2FkTGlzdCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdDb25kaXRpb24gPSBDb25kaXRpb24uY3JlYXRlQ29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XHRbY29uZGl0aW9uUGF5bG9hZFtvdXRQYXJhbWV0ZXIuaGVscFBhdGhdXSxcblx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0Q29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXRoID0gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCBhcyBzdHJpbmc7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbkFscmVhZHlFeGlzdHMgPSBzdGF0ZS5maWx0ZXJbY29uZGl0aW9uUGF0aF0/LmZpbmQoKHRlc3RDb25kaXRpb24pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgdGVzdENvbmRpdGlvbi5maWx0ZXJlZDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZGVlcEVxdWFsKHRlc3RDb25kaXRpb24sIG5ld0NvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyByZXNldCBmaWx0ZXJlZCB0byBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RDb25kaXRpb24uZmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNvbmRpdGlvbkFscmVhZHlFeGlzdHMpIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5maWx0ZXJbY29uZGl0aW9uUGF0aF0gfHw9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXS5wdXNoKG5ld0NvbmRpdGlvbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIEFwcGx5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIEZpbHRlckZpZWxkXG5cdFx0XHRTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKGZpbHRlckJhciwgc3RhdGUpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcblx0XHRcdExvZy5lcnJvcihgVmFsdWVIZWxwRGVsZWdhdGU6ICR7bWVzc2FnZX1gKTtcblx0XHR9XG5cdH0sXG5cblx0X2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGg6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0ZmlsdGVyQmFyUHJvcGVydGllczogUHJvcGVydHlJbmZvW11cblx0KSB7XG5cdFx0Y29uc3QgY29udGV4dFBhdGggPSBgLyR7cHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVsxXX1gO1xuXHRcdGNvbnN0IGZpbHRlclRhcmdldCA9IG91dFBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdGNvbnN0IGxhc3RJbmRleCA9IHByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0Y29uc3QgZmlsdGVyVGFyZ2V0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBgJHtwcm9wZXJ0eVBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCl9LyR7ZmlsdGVyVGFyZ2V0fWAgOiBmaWx0ZXJUYXJnZXQ7XG5cdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBtZXRhTW9kZWw/LmdldFJlZHVjZWRQYXRoKGZpbHRlclRhcmdldFBhdGgsIGNvbnRleHRQYXRoKTtcblx0XHRyZXR1cm4gZmlsdGVyQmFyUHJvcGVydGllcy5maW5kKChpdGVtKSA9PiBpdGVtLmFubm90YXRpb25QYXRoID09PSBhbm5vdGF0aW9uUGF0aCk7XG5cdH0sXG5cblx0X29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0JpbmRpbmdDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbiksXG5cdFx0XHRcdG91dFZhbHVlcyA9IGNvbmRpdGlvblBheWxvYWRMaXN0Lmxlbmd0aCA9PT0gMSA/IGNvbmRpdGlvblBheWxvYWRMaXN0WzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZhbHVlSGVscERlbGVnYXRlOiBQYXJhbWV0ZXJPdXQgaW4gbXVsdGktdmFsdWUtZmllbGQgbm90IHN1cHBvcnRlZFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRWYWx1ZXMpIHtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5KG1ldGFNb2RlbCwgb3V0VmFsdWVzLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5OiBmdW5jdGlvbiAoXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRvdXRWYWx1ZXM6IENvbmRpdGlvblBheWxvYWRUeXBlLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHBcblx0KSB7XG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKTtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMgPSBjb250ZXh0LmlzVHJhbnNpZW50KCkgIT09IHRydWUgJiYgIWNvbnRleHQuaXNJbmFjdGl2ZSgpO1xuXHRcdGNvbnN0IG91dFBhcmFtZXRlclNvdXJjZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0XHRpZiAoY29udGV4dC5nZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlKSAhPT0gb3V0VmFsdWVzW291dFBhcmFtZXRlci5oZWxwUGF0aF0pIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUHJvcGVydHlWaWFPdXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0Y29udmVydGVkTWV0YWRhdGEsXG5cdFx0XHRcdFx0cm9vdFBhdGgsXG5cdFx0XHRcdFx0b3V0VmFsdWVzLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcixcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG91dFBhcmFtZXRlclNvdXJjZXMucHVzaChvdXRQYXJhbWV0ZXIuc291cmNlKTtcblx0XHR9XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcodmFsdWVIZWxwKTtcblx0XHRjb25zdCBjb2xsYWJvcmF0aXZlRHJhZnQgPSB2aWV3LmdldENvbnRyb2xsZXIoKS5jb2xsYWJvcmF0aXZlRHJhZnQ7XG5cdFx0aWYgKGNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHQvLyB3ZSBkZXRlcm1pbmUgdGhlIGJpbmRpbmcgdGhhdCBzZW5kcyB0aGUgcmVxdWVzdFxuXHRcdFx0bGV0IGJpbmRpbmc7XG5cdFx0XHRpZiAoY29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0YmluZGluZyA9IGNvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmluZGluZyA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdFx0XHRcdFx0IFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRjb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHM6IGJvb2xlYW5cblx0KSB7XG5cdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYCR7cm9vdFBhdGh9LyR7b3V0UGFyYW1ldGVyLnNvdXJjZX1gO1xuXHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gY29udmVydGVkTWV0YWRhdGEucmVzb2x2ZVBhdGg8UHJvcGVydHk+KHByb3BlcnR5UGF0aCkudGFyZ2V0O1xuXHRcdGNvbnN0IGZpZWxkQ29udHJvbCA9IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWVsZENvbnRyb2w7XG5cdFx0Y29uc3QgZHluYW1pY1JlYWRPbmx5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRDb250cm9sKSA/IGNvbnRleHQuZ2V0UHJvcGVydHkoZmllbGRDb250cm9sLnBhdGgpID09PSAxIDogZmFsc2U7XG5cdFx0aWYgKGR5bmFtaWNSZWFkT25seSAmJiBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHQvKiBOb24tVHJhbnNpZW50IGFuZCBhY3RpdmUgY29udGV4dCAqL1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBvdXRQYXJhbWV0ZXIuc291cmNlLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogb3V0UGFyYW1ldGVyLnNvdXJjZTtcblx0XHRcdC8qIFdlIHNlbmQgWzxwcm9wZXJ0eU5hbWU+XSBpbiBjYXNlIG9mIGEgcHJvcGVydHkgcGF0aCB3aXRob3V0IGFueSBuYXZpZ2F0aW9uIGludm9sdmVkICovXG5cdFx0XHQvKiBJbiBjYXNlIG9mIGEgcGF0aCBpbnZvbHZpbmcgbmF2aWdhdGlvbnMsIHdlIHNlbmQgWzxuYXZpZ2F0aW9uUGF0aD5dIGVuZGluZyB3aXRoIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgbm90IHdpdGggYSBwcm9wZXJ0eSAqL1xuXHRcdFx0Y29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyAodHJhbnNpZW50IGNvbnRleHQpIGNhbsK0dCBoYXZlIGluc3RhbnQgc3BlY2lmaWMgKGR5bmFtaWMpIHJlYWQtb25seSBmaWVsZHMsIHRoZXJlZm9yZSB3ZSBkb27CtHQgbmVlZCB0byBoYW5kbGUvY29uc2lkZXIgdGhpcyBjYXNlIHNwZWNpZmljYWxseSAqL1xuXHRcdFx0LyogQWRkaXRpb25hbCBpbmZvczogKi9cblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyBpcyBvbmx5IHVzZWQgYnkgU0QgKi9cblx0XHRcdC8qIFRoZSBncm91cCBJRCAodGhpcmQgYXJndW1lbnQgb2Ygc2V0UHJvcGVydHkgZGVzY3JpYmVkIGFwaSBkb2N1bWVudGF0aW9uIG9mIHRoZSBDb250ZXh0KSBpcyB1c2VkIGZvciB0aGUgUEFUQ0ggcmVxdWVzdCwgaWYgbm90IHNwZWNpZmllZCwgdGhlIHVwZGF0ZSBncm91cCBJRCBmb3IgdGhlIGNvbnRleHQncyBiaW5kaW5nIGlzIHVzZWQsICdudWxsJyB0byBwcmV2ZW50IHRoZSBQQVRDSCByZXF1ZXN0ICovXG5cdFx0XHQvKiBUaGUgVHJhbnNpZW50IGNvbnRleHQgY2Fubm90IHJlcXVlc3QgU2lkZUVmZmVjdHMgYW5kICBjYW5ub3QgcGF0Y2ggdmlhIGdyb3VwICdudWxsJyAqL1xuXHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSk7XG5cdFx0fVxuXHRcdC8qIElmIHRoZSBrZXkgZ2V0cyB1cGRhdGVkIHZpYSBvdXQtcGFyYW1ldGVyLCB0aGVuIHRoZSBkZXNjcmlwdGlvbiBuZWVkcyBhbHNvIHJldHJpZXZlZCB3aXRoIHJlcXVlc3RTaWRlRWZmZWN0cyAqL1xuXHRcdGNvbnN0IHRleHRQYXRoID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpXG5cdFx0XHQ/IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LnBhdGhcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmICh0ZXh0UGF0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHRleHRQYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogdGV4dFBhdGg7XG5cdFx0XHQvKiBUaGUgc2lkZUVmZmVjdFBhdGggY2FuIGJlIFs8cHJvcGVydHlOYW1lPl0gb3IgWzxuYXZpZ2F0aW9uUGF0aD5dICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgbWFwIG9mIGNvbmRpdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczpcblx0ICogSW5pdGlhbCBzZXQgb2YgY29uZGl0aW9ucyBhcHBsaWVkIGV2ZXJ5IHRpbWUgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSBvcGVuaW5nIGl0cyBjb250YWluZXIuXG5cdCAqIERldGFpbGVkIHNldCBvZiBjb25kaXRpb25zIGluIGdldEl0ZW1Gb3JWYWx1ZSBzY2VuYXJpb3MgdGhhdCBhbGxvdyB5b3UgdG8gZmluZCBhIHNwZWNpZmljIHZhbHVlIGhlbHAgaXRlbSAoaW5kaWNhdGVkIGJ5IGNvbmZpZyBhdmFpbGFiaWxpdHkpLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byBhIG1hcCBvZiBjb25kaXRpb25zXG5cdCAqL1xuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbmZpZz86IE1EQ0NvbmZpZ1R5cGUpIHtcblx0XHRpZiAodGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnModmFsdWVIZWxwLCBjb250ZW50LCAoY29uZmlnICYmIGNvbmZpZy5jb250cm9sKSB8fCAoY29udGVudCAmJiBjb250ZW50LmdldENvbnRyb2woKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4ge307XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIGludm9rZWQgZXZlcnkgdGltZSBhIHtAbGluayBzYXAudWkubWRjLlZhbHVlSGVscCBWYWx1ZUhlbHB9IGZpcmVzIGEgc2VsZWN0IGV2ZW50IG9yIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBjaGFuZ2VzXG5cdCAqIFRoaXMgY2FsbGJhY2sgbWF5IGJlIHVzZWQgdG8gdXBkYXRlIGV4dGVybmFsIGZpZWxkcy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZSByZWNlaXZpbmcgdGhlIDxjb2RlPmNvbnRyb2xDaGFuZ2U8L2NvZGU+XG5cdCAqIEBwYXJhbSByZWFzb24gUmVhc29uIHdoeSB0aGUgbWV0aG9kIHdhcyBpbnZva2VkXG5cdCAqIEBwYXJhbSBfY29uZmlnIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRvbkNvbmRpdGlvblByb3BhZ2F0aW9uOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIHJlYXNvbjogc3RyaW5nLCBfY29uZmlnOiB1bmtub3duKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAocmVhc29uICE9PSBcIkNvbnRyb2xDaGFuZ2VcIiB8fCBwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHQvLyBoYW5kbGUgb25seSBDb250cm9sQ2hhbmdlIHJlYXNvblxuXHRcdFx0Ly8gYWxzbyBkb24ndCBoYW5kbGUgZm9yIGRlZmluZSBjb25kaXRpb24gdmFsdWUgaGVscCBhcyBwcm9wYWdhdGluZyBjb25kaXRpb25zIG9uIHRoZSB2YWx1ZSBoZWxwXG5cdFx0XHQvLyB0byBkZWZpbmUgY29uZGl0aW9ucyBkb2VzIG5vdCBtYWtlIHNlbnNlIGJ1dCB3b3VsZCBvbmx5IGNvbmZ1c2UgdXNlcnMgYnkgYWxsb3dpbmcgcmVjdXJzaXZlIHVzZVxuXHRcdFx0Ly8gb2YgdGhlIGNvbmRpdGlvbiB2YWx1ZSBoZWxwXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyhxdWFsaWZpZXIudmhQYXJhbWV0ZXJzKSA6IFtdLFxuXHRcdFx0ZmllbGQgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpIGFzIEZpZWxkQmFzZSxcblx0XHRcdGZpZWxkUGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7XG5cblx0XHRsZXQgY29uZGl0aW9ucyA9IGZpZWxkLmdldENvbmRpdGlvbnMoKSBhcyBDb25kaXRpb25PYmplY3RbXTtcblx0XHRpZiAoIXBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdHRoaXMuX3NldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbmRpdGlvbnMsIGZpZWxkKTtcblx0XHR9XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7IC8vIENvbnRyb2wgZS5nLiBGb3JtQ29udGFpbmVyXG5cdFx0aWYgKGxpc3RSZXBvcnRGaWx0ZXJCYXIuaXNBKEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyKSAmJiBvdXRQYXJhbWV0ZXJzLmxlbmd0aCAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Ly8gUHJvcGFnYXRlIHRoZSB2YWx1ZSBvbmx5IGlmIHRoZSBGaWx0ZXJGaWVsZCBpcyBwYXJ0IG9mIHRoZSBMUi1GaWx0ZXJCYXIgYWxzbyBpbnNpZGUgaW4gQWRhcHQgRmlsdGVycyBkaWFsb2dcblx0XHRcdGF3YWl0IHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0ZpbHRlckJhcihcblx0XHRcdFx0Y29uZGl0aW9ucyxcblx0XHRcdFx0b3V0UGFyYW1ldGVycyxcblx0XHRcdFx0ZmllbGRQYXJlbnQgYXMgRmlsdGVyQmFyLFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0UmVwb3J0RmlsdGVyQmFyIGFzIEZpbHRlckJhclxuXHRcdFx0KTtcblx0XHRcdC8vIExSIFNldHRpbmdzIERpYWxvZyBvciBPUCBTZXR0aW5ncyBEaWFsb2cgc2hhbGwgbm90IHByb3BhZ2F0ZSB2YWx1ZSB0byB0aGUgZGlhbG9nIGZpbHRlcmZpZWxkcyBvciBjb250ZXh0XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9iamVjdCBQYWdlXG5cdFx0XHQvKiBUbyBhdm9pZCB0aW1pbmcgaXNzdWUgd2UgdXNlIHRoZSBCaW5kaW5nQ29udGV4dCBvZiB0aGUgY29udHJvbCBpbnN0ZWFkIG9mIHRoZSBWYWx1ZUhlbHAgKEJDUCAyMzgwMDU3MjI3KSAqL1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofUBzYXB1aS5uYW1lYCk7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGNvbmRpdGlvbnNbMF0gOiAoe30gYXMgQ29uZGl0aW9uT2JqZWN0KTtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZEtleXMgPSBjb25kaXRpb24/LnBheWxvYWQgPyBPYmplY3Qua2V5cyhjb25kaXRpb24ucGF5bG9hZCkgOiBbXTtcblx0XHRcdFx0cGF5bG9hZEtleXMuZm9yRWFjaCgocGF5bG9hZEtleSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWQgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bcGF5bG9hZEtleV0/LlswXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkKTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleSA9IGNvbmRpdGlvblZhbHVla2V5cy5maW5kKCh2YWx1ZUtleSkgPT4gdmFsdWVLZXkuaW5jbHVkZXMoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpO1xuXHRcdFx0XHRcdGlmIChjb25kaXRpb25WYWx1ZWtleSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5VmFsdWUgPSBjb25kaXRpb25QYXlsb2FkW2NvbmRpdGlvblZhbHVla2V5XTtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBrZXlWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQoY29uZGl0aW9ucywgb3V0UGFyYW1ldGVycywgY29udGV4dCwgdmFsdWVIZWxwKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5pdGlhbCBmaWx0ZXIgY29uZGl0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICogQHBhcmFtIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICovXG5cdF9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50OiBib29sZWFuKSB7XG5cdFx0bGV0IGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy5lcnJvcihcIlZhbHVlSGVscERlbGVnYXRlOiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlcXVlc3RlZFwiKTtcblx0XHR9IGVsc2UgaWYgKCh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCkge1xuXHRcdFx0Y29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcIkVtcHR5XCIsIFtdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFwiXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IE5vIEJpbmRpbmdDb250ZXh0XCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udHJvbC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGxldCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbWV0ZXIpID0+IGluUGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0LyogSW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIsIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBpbi1wYXJhbWV0ZXJzLiAqL1xuXHRcdC8qIFdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgaW4tcGFyYW1ldGVyIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgYmluZGluZyBjb250ZXh0LlxuSW4gc29tZSBjYXNlcyAoZS5nLiBtdWx0aSB2YWx1ZSBmaWVsZCksIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3QgcG9pbnQgdG8gdGhlXG5WSCBhbm5vdGF0aW9uIHRhcmdldCwgdGh1cyB3ZSBpZGVudGlmeSB0aGUgbmVlZGVkIG5hdmlnYXRpb24gcmVsYXRpb24gYnlcbnJlZHVjaW5nIHRoZSBwYXlsb2FkLnByb3BlcnR5UGF0aCBieSB0aGUgcGF0aCBkZXJpdmVkIGZyb20gYmluZGluZyBjb250ZXh0LlxuVGhpcyBjYW5ub3QgaGFwcGVuIGluIGNhc2Ugb2YgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXRoIFwiJFBhcmFtZXRlclwiLlxuKi9cblxuXHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIGZpbHRlciBwcm9wZXJ0eSB3aXRoIG5hdmlnYXRpb24gcGF0aCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbWV0YWRhdGEgYXJlIG5vdCB3ZWxsIGRlZmluZWRcblx0XHRsZXQgbWV0YURhdGFFcnJvciA9IGZhbHNlO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHBheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdFx0Ly9Gb3IgYSBWSCBvbiBhbiBhY3Rpb24gZGlhbG9nIHBhcmFtZXRlciB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZmlsbCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0Ly93aXRoIHRoZSBhY3Rpb24gZXZlbiB0aG91Z2ggbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBleGlzdHMgLT4gbGVhdmUgbmF2aWdhdGlvblByb3BlcnR5UGF0aCBlbXB0eVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IHBheWxvYWQucHJvcGVydHlQYXRoLnJlcGxhY2UoYC8ke3Byb3BlcnR5TmFtZX1gLCBcIlwiKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QobmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikgJiYgbmF2aWdhdGlvblByb3BlcnR5ICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4kUGFydG5lciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL0Nhc2UgbWRjLk11bHRpVmFsdWVGaWVsZDogdGhlICRQYXJ0bmVyIChhc3NvY2lhdGlvbiB0byBvbmUpIGlzIGEgcHJlY29uZGl0aW9uIHRvIHJlcXVlc3QgdGhlIGZpbHRlciB2YWx1ZVxuXHRcdFx0Ly9FeGNlcHRpb246IFdoZW4gdGhlIE11bHRpVmFsdWVGaWVsZCBpcyBhbiBhY3Rpb24gcGFyYW1ldGVyIHRoZW4gdGhlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBpcyB1c2VkIHRvIGZpbGwgdGhlIGluIHBhcmFtZXRlciBhbmRcblx0XHRcdC8vbm8gJFBhcnRuZXIgYXNzb2NpYXRpb24gaXMgbmVlZGVkLiBGb3Igc3VjaCBjYXNlcyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGlzIG5vIGZpbGxlZFxuXHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRgVmFsdWVIZWxwRGVsZWdhdGU6IEJlY2F1c2Ugb2YgbWlzc2luZyBwYXJ0bmVyIGRlZmluaXRpb24sIHRoZSBmaWx0ZXIgdmFsdWUgZm9yIFZhbHVlTGlzdFBhcmFtZXRlckluIHByb3BlcnR5IGNhbiBub3QgcmVxdWVzdGVkLmBcblx0XHRcdCk7XG5cdFx0XHRtZXRhRGF0YUVycm9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRQYXJ0bmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QgPSB0aGlzLl9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3QocHJvcGVydGllc1RvUmVxdWVzdCwgcm9vdFBhdGgsIG1ldGFNb2RlbCwgcGF5bG9hZC5wcm9wZXJ0eVBhdGgpO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFEYXRhRXJyb3IpIHtcblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgJGF1dG8gaXMgdXNlZCBpbiBjYXNlIG9mIGNyZWF0aW9uIHJvdy5cblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgc3VibWl0TGF0ZXIgaW4gY2FzZSBvZiBjcmVhdGUgZGlhbG9nLlxuXHRcdFx0Ly8gV2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FzZSBvZiBpc0luYWN0aXZlIGNvbnRleHQsIHdoaWNoIGlzIG5vdCB5ZXQgY3JlYXRlZC5cblx0XHRcdGNvbnN0IGNvbnRleHRVbmRlckNyZWF0aW9uID1cblx0XHRcdFx0YmluZGluZ0NvbnRleHQuaXNUcmFuc2llbnQoKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHQhYmluZGluZ0NvbnRleHQuaXNJbmFjdGl2ZSgpICYmXG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKT8uc3RhcnRzV2l0aChcIiRhdXRvXCIpO1xuXHRcdFx0bGV0IGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSBbXTtcblx0XHRcdGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSAoYmluZGluZ0NvbnRleHQuZ2V0TWVzc2FnZXMoKSA/PyBbXSkuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdFx0XHR9KTtcblx0XHRcdC8vIFdlIGF3YWl0IGNyZWF0aW9uIGlmIGl0IGlzIHN0aWxsIGluIHByb2Nlc3MuXG5cdFx0XHRpZiAoY29udGV4dFVuZGVyQ3JlYXRpb24gJiYgIWVycm9yTWVzc2FnZXNJbkNvbnRleHQ/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBiaW5kaW5nQ29udGV4dD8uY3JlYXRlZCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWNjb3JkaW5nIHRvIG9kYXRhIHY0IGFwaSBkb2N1bWVudGF0aW9uIGZvciByZXF1ZXN0UHJvcGVydHk6IFByb3BlcnR5IHZhbHVlcyB0aGF0IGFyZSBub3QgY2FjaGVkIHlldCBhcmUgcmVxdWVzdGVkIGZyb20gdGhlIGJhY2sgZW5kXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGluUGFyYW1ldGVyID0gaW5QYXJhbWV0ZXJzW2ldO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKHZhbHVlc1tpXSwgaW5QYXJhbWV0ZXIuaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCk7XG5cblx0XHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFx0XHRUaGUgaW5QYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uLCBpLmUuIHRoZWlyIHNvdXJjZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0IChvciBtb3JlIHByZWNpc2VseSB0aGUgRW50aXR5U2V0IHRoZSBhbm5vdGF0aW9uIHRhcmdldCBiZWxvbmdzIHRvKS4gVGhlIGFubm90YXRpb24gdGFyZ2V0IGlzIHRoZSBwcm9wZXJ0eSB0aGUgdmFsdWUgaGVscCBpcyBkZWZpbmVkIGZvci5cblx0XHRcdFx0VG8gcmVxdWVzdCB0aGUgdmFsdWVzIGZvciB0aGUgaW5QYXJhbWV0ZXJzIGZyb20gdGhlIGJpbmRpbmdDb250ZXh0ICh0aGUgY29udHJvbCBpcyBib3VuZCB0byksIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoaXMgdG8gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nQ29udGV4dC4gVGhpcyBkaWZmZXJzLCBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQgZm9yIGEgZGlyZWN0IHByb3BlcnR5LCBidXQgd2l0aCBhIHBhdGggY29udGFpbmluZyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgKGVzcC4gbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aSB2YWx1ZSBmaWVsZHMpLlxuXHRcdFx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFx0XHRTbyBmYXIsIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggb2YgdGhlIGJpbmRpbmdDb250ZXh0IGZyb20gdGhlIGxlZnQgc2lkZSwgYW5kIHRoZSBsYXN0IHNlZ21lbnQgKHRoZSBwcm9wZXJ0eSBpdHNlbGYpIGZyb20gdGhlIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwcm9wZXJ0eVBhdGggcHJvdmlkZWQgaW4gdGhlIHBheWxvYWQsIHRvIGdldCBhIG1ldGFQYXRoIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dCB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQuXG5cdFx0XHRcdElmIHRoaXMgbWV0YVBhdGggY29udGFpbnMgMTpuLW5hdmlnYXRpb25zICh3aGljaCBjYW5ub3QgYmUgdHJhbnNsYXRlZCBiYWNrIHRvIGEgcGF0aCwgYXMgdGhpcyB3b3VsZCBtZWFuIHRvIGFkZCBjb3JyZXNwb25kaW5nIGtleXMsIHdoaWNoIGFyZSBub3Qga25vd24pLCB0aGUgc291cmNlIHBhdGggaW4gdGhlIGluUGFyYW1ldGVyIGRlZmluaXRpb24gb2YgdGhlIHZhbHVlIG5lZWRzIHRvIHBvaW50IGJhY2sgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcGFydG5lciBuYXZpZ2F0aW9uKHMpIHRvIGF2b2lkIGFtYmlndW91cyBkZWZpbml0aW9uIG9mIGhvdyB0byBnZXQgaXRzIHZhbHVlLlxuXHRcdFx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0XHRcdElmIHRoaXMgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwgd2UgY2FuIGNvbWJpbmUgdGhlIGFuZCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIGJpbmRpbmcgY29udGV4dC4gSWYgbm90LCB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IHRvIHJldHJpZXZlIHRoZSBpblBhcmFtZXRlcnMgdmFsdWUgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5LCBpLnQuIHRoZSB2YWx1ZSBoZWxwIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS5cblx0XHRcdFx0Ki9cblx0XHQvLyBjb21tb24gZm9yIGFsbCBpblBhcmFtZXRlcnNcblx0XHRsZXQgbWV0YU1vZGVsQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChyb290UGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFydDogcGFydCxcblx0XHRcdFx0XHRwYXJ0bmVyOiBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLiRQYXJ0bmVyXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHQvLyBhY3R1YWwgcmVkdWN0aW9uIHBlciBpblBhcmFtZXRlclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzVG9SZXF1ZXN0Lm1hcCgobG9jYWxEYXRhUGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgbG9jYWxEYXRhUGFydHMgPSBsb2NhbERhdGFQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5maW5kSW5kZXgoXG5cdFx0XHRcdChcblx0XHRcdFx0XHRwYXJ0LFxuXHRcdFx0XHRcdGluZGV4IC8vIGZpbmQgZmlyc3Qgbm9uLW1hdGNoaW5nIGluZGV4XG5cdFx0XHRcdCkgPT4gcmVsYXRpdmVQYXRoUGFydHNbLWluZGV4XT8ucGFydG5lciAhPT0gcGFydFxuXHRcdFx0KTsgLy8gcmVsYXRpdmVQYXRoUGFydHMgdG8gbWF0Y2ggZnJvbSB0aGUgZW5kICg9PiBcIi1pbmRleFwiKSB0byBsb2NhbERhdGFQYXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmdcblx0XHRcdC8vIGxhc3QgcGFydCBvZiBsb2NhbERhdGEgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aHVzIGl0IGNhbm5vdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoQ291bnQgY291bGQgYmUgLTEgaWYgZXZlcnl0aGluZyBtYXRjaGVzXG5cdFx0XHQvLyAoaWYgd2Ugd2FudCB0byBhZGRpdGlvbmFsbHkgc2VjdXJlIGFnYWluc3QgdGhpcyBzaXR1YXRpb24sIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdvdWxkIGJlIHRvIHNldCBtYXRjaENvdW50ID0gbG9jYWxEYXRhUGFydHMubGVuZ3RoIOKAkyAxKVxuXHRcdFx0cmV0dXJuIHJlbGF0aXZlUGF0aFBhcnRzXG5cdFx0XHRcdC5zbGljZSgwLCAtbWF0Y2hDb3VudCkgLy8gcmVtb3ZlIGFsbCBtYXRjaGVkIHBhcnRzIChmcm9tIHRoZSBlbmQpXG5cdFx0XHRcdC5tYXAoKHBhcnQpID0+IHBhcnQucGFydClcblx0XHRcdFx0LmNvbmNhdChsb2NhbERhdGFQYXJ0cy5zbGljZShtYXRjaENvdW50KSkgLy8gcmVtb3ZlIHRoZSBtYXRjaGVkIHBhcnRzIGZyb20gbG9jYWxEYXRhIChmcm9tIHRoZSBiZWdpbm5pbmcpXG5cdFx0XHRcdC5qb2luKFwiL1wiKTsgLy8gdHJhbnNmZXIgYmFjayB0byBzdHJpbmcgKGJ1dCBvbmx5IG9uY2UgYXQgdGhlIGVuZCA7KSApXG5cdFx0fSk7XG5cdH0sXG5cblx0X2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmlsdGVyQmFyLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0aW5QYXJhbWV0ZXIsXG5cdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlckJhclByb3BlcnR5ID8gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCA6IGluUGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpO1xuXG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihzb3VyY2VGaWVsZCBhcyBzdHJpbmcsIHN0YXRlKTtcblx0XHRcdGlmIChjb25kaXRpb25zKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBjb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgY29uZGl0aW9ucy5cblx0ICogUmVnYXJkaW5nIGEgbmF2aWdhdGlvbiBwYXRoIGluIHRoZSBJbk91dCBwYXJhbWV0ZXJzIGFuZCBkaXNyZWdhcmRpbmcgcHJlZml4ZXMgaW4gdGhlIG5hdmlnYXRpb24gcGF0aCBsaWtlIGUuZy4gJyRmaWx0ZXJzPi9jb25kaXRpb25zLycgb3IgJ293bmVyJy5cblx0ICogQHBhcmFtIHNvdXJjZUZpZWxkIEluUGFyYW1ldGVyIHByb3BlcnR5IG9mIHRoZSBmaWx0ZXIgZmllbGQgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc3RhdGUgVGhlIGV4dGVybmFsIGZpbHRlciBzdGF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnNcblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdF9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyOiBmdW5jdGlvbiAoc291cmNlRmllbGQ6IHN0cmluZywgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IGtleSA9PT0gc291cmNlRmllbGQpOyAvLyBjb25kaXRpb24gcGF0aCBvZiB0aGUgZmlsdGVyIGZpZWxkXG5cdFx0cmV0dXJuIGtleSAmJiBzdGF0ZS5maWx0ZXJba2V5XTtcblx0fSxcblxuXHRfcGFydGl0aW9uSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoaW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdKSB7XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIEluT3V0UGFyYW1ldGVyW10+ID0ge1xuXHRcdFx0Y29uc3RhbnQ6IFtdLFxuXHRcdFx0YmluZGluZzogW10sXG5cdFx0XHRmaWx0ZXI6IFtdXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoaW5QYXJhbWV0ZXIuY29uc3RhbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmNvbnN0YW50LnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIGlmIChpblBhcmFtZXRlci5zb3VyY2UuaW5kZXhPZihcIiRmaWx0ZXJcIikgPT09IDApIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuZmlsdGVyLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuYmluZGluZy5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluUGFyYW1ldGVyTWFwO1xuXHR9LFxuXG5cdF90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGU6IHtcblx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmdW5jdGlvbiAoZXZlbnQ6IGpRdWVyeS5FdmVudCAmIHsgc3JjQ29udHJvbDogQ29udHJvbCB9KSB7XG5cdFx0XHRjb25zdCB0YWJsZSA9IGV2ZW50LnNyY0NvbnRyb2wsIC8vIG0uVGFibGVcblx0XHRcdFx0dGFibGVDZWxsc0RvbVJlZnMgPSB0YWJsZS4kKCkuZmluZChcInRib2R5IC5zYXBNVGV4dFwiKSxcblx0XHRcdFx0bWRjTVRhYmxlID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgTVRhYmxlO1xuXG5cdFx0XHRoaWdobGlnaHRET01FbGVtZW50cyh0YWJsZUNlbGxzRG9tUmVmcywgbWRjTVRhYmxlLmdldEZpbHRlclZhbHVlKCksIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYW4gaW5pdGlhbCBjb25kaXRpb24gY29uZmlndXJhdGlvbiBldmVyeXRpbWUgYSB2YWx1ZSBoZWxwIGNvbnRlbnQgaXMgc2hvd24uXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgbWFwIG9mIGNvbmRpdGlvbnMgc3VpdGFibGUgZm9yIGEgc2FwLnVpLm1kYy5GaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0Z2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogQ29udGVudCwgY29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIGhpZ2hsaWdodCB0ZXh0IGluIFZhbHVlSGVscCBwb3BvdmVyXG5cdFx0aWYgKGNvbnRlbnQ/LmlzQTxNVGFibGU+KFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKGVudHJ5KS5sZW5ndGgpIHtcblx0XHRcdC8qIHZoIHF1YWxpZmllciBhcyBrZXkgZm9yIHJlbGV2YW50IGNvbmRpdGlvbiAqL1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH1cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZDtcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGN1c3RvbWl6ZSBzZWxlY3Rpb25zIGluICdTZWxlY3QgZnJvbSBsaXN0JyBzY2VuYXJpb3MuXG5cdCAqIEJ5IGRlZmF1bHQsIG9ubHkgY29uZGl0aW9uIGtleXMgYXJlIGNvbnNpZGVyZWQuIFRoaXMgbWF5IGJlIGV4dGVuZGVkIHdpdGggcGF5bG9hZCBkZXBlbmRlbnQgZmlsdGVycy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBzZWxlY3RlZCBpdGVtXG5cdCAqIEBwYXJhbSBjb25kaXRpb25zIEN1cnJlbnQgY29uZGl0aW9uc1xuXHQgKiBAcmV0dXJucyBDb25kaXRpb25zIG9yIFtdXG5cdCAqL1xuXHRmaW5kQ29uZGl0aW9uc0ZvckNvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W11cblx0KSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHQvKiBEbyBub3QgY29uc2lkZXIgXCJOb3RWYWxpZGF0ZWRcIiBjb25kaXRpb25zICovXG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKChjb25kaXRpb24pID0+IGNvbmRpdGlvbi52YWxpZGF0ZWQgPT09IENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXG5cdFx0Y29uc3QgdmhLZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IGtleVBhdGggPSBjb250ZW50LmdldEtleVBhdGgoKTtcblx0XHRjb25zdCB2YWx1ZUhlbHBRdWFsaWZpZXIgPSBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciB8fCBcIlwiO1xuXHRcdGNvbnN0IGZpbmRDb25kaXRpb24gPSAoY29uZGl0aW9uUGF5bG9hZE1hcDogQ29uZGl0aW9uUGF5bG9hZE1hcCwgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pOiBib29sZWFuID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblNlbGVjdGVkUm93ID0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXSB8fCB7fTtcblx0XHRcdGlmICh2aEtleXMubGVuZ3RoID09PSAxIHx8IHBheWxvYWQ/LnVzZU11bHRpVmFsdWVGaWVsZCB8fCAhY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSB2YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoY29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdHJldHVybiB2aEtleXMuZXZlcnkoZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFjb250ZXh0S2V5cy5pbmNsdWRlcyh2aEtleSkgfHwgY29udGV4dD8uZ2V0T2JqZWN0KHZoS2V5KSA9PT0gY29uZGl0aW9uU2VsZWN0ZWRSb3dbdmhLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHNlbGVjdGVkQ29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwO1xuXHRcdFx0aWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXT8uW2tleVBhdGhdKSB7XG5cdFx0XHRcdHJldHVybiBmaW5kQ29uZGl0aW9uKGNvbmRpdGlvblBheWxvYWRNYXAsIGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0/LltrZXlQYXRoXSk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uPy52YWx1ZXNbMF0pIHtcblx0XHRcdFx0cmV0dXJuIGZpbmRDb25kaXRpb24oY29uZGl0aW9uUGF5bG9hZE1hcCwgY29uZGl0aW9uPy52YWx1ZXNbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29uZGl0aW9uID8gW3NlbGVjdGVkQ29uZGl0aW9uXSA6IFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGNvbnRleHRzIGZvciBhZGRpdGlvbmFsIHZhbHVlcyBhbmQgcmVzdW1lcyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ1dpdGhUcmFuc2llbnRDb250ZXh0czogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGZpZWxkOiBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXSxcblx0XHR0YWJsZTogVGFibGVcblx0KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzKGxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbywgc29ydGVycyk7XG5cblx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgcmVjZW50VmFsdWVzQ29udGV4dERhdGEsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIH0gPVxuXHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhKFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHRzb3J0ZXJzLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIG5vIGdyb3VwaW5nIHNob3VsZCBiZSBzaG93biBpbiB0aGUgc3VnZ2VzdGlvbiBsaXN0IGlmIHRoZSBzZWFyY2ggcmVzdWx0IG9ubHkgY29udGFpbnMgdmFsdWVzIGZyb20gdGhlICdPdGhlcnMnIGdyb3VwXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDAgJiYgcmVjZW50VmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnNvcnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBheWxvYWQ/Lmhpc3Rvcnk/LmVuYWJsZWQpIHtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSA9IHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCAhPT0gMDtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIE5vdyB3ZSBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIGxpc3RiaW5kaW5nLCBiZWZvcmUgdGhlIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgY3JlYXRlZFxuXHRcdFx0XHRhd2FpdCBsaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgY2xlYXJpbmcgdGhlIGxpc3QgYmluZGluZzogJHtlcnJvcn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIGFkZCB0cmFuc2llbnQgY29udGV4dCB0byBsaXN0IGJpbmRpbmcgYWZ0ZXIgYmFja2VuZCBxdWVyeSBpcyBkb25lXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRsaXN0QmluZGluZ1xuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9EbyBub3RoaW5nIGFzIHdlIGtub3cgdGhhdCByZXNldCBjaGFuZ2VzIHdvdWxkIHRocm93IGFuIGVycm9yIGluIGNvbnNvbGUgYW5kIHRoaXMgd2lsbCBwaWxlIHVwIGEgbG90IG9mIGNvbnNvbGUgZXJyb3JzXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdmFsdWUgaGVscCwgc3VjaCBhcyBzb3J0LCBmaWx0ZXIsIHBhcmFtZXRlcnMgZXRjLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSB8fCBsaXN0QmluZGluZztcblx0XHRpZiAoIXJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnN1c3BlbmQoKTtcblx0XHR9XG5cdFx0Ly9zb3J0IGFuZCBmaWx0ZXIgdmFsdWUgaGVscCBiaW5kaW5nIHRvIG1ha2Ugc3VyZSB3ZSByZW5kZXIgb3RoZXJzIGdyb3VwXG5cdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLnNvcnRBbmRGaWx0ZXJMaXN0QmluZGluZyhsaXN0QmluZGluZywgc29ydGVycyk7XG5cdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdGxpc3RCaW5kaW5nLmNoYW5nZVBhcmFtZXRlcnMoYmluZGluZ0luZm8ucGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vcmVzdW1lIHRoZSBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRhd2FpdCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIucmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyhsaXN0QmluZGluZyk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIGxpc3Qgb2YgYWxsIHR5cGVzIG9mIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhIChyZWNvbW1lbmRhdGlvbiwgcmVjZW50bHkgdXNlZCBhbmQgb3RoZXJzKSB0byBiZSB1c2VkLlxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBBZGRpdGlvbmFsVmFsdWVzXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aGljaCBjb250YWlucyByZWNvbW1lbmRhdGlvbnMsIHJlY2VudGx5IHVzZWQsIGFuZCBvdGhlcnMgY29udGV4dCBkYXRhLlxuXHQgKi9cblx0X2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyxcblx0XHRmaWVsZDogRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFByb21pc2U8e1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdH0+IHtcblx0XHRsZXQgeyByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSB9ID0gYXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHNvcnRlcnMsXG5cdFx0XHR0YWJsZVxuXHRcdCk7XG5cblx0XHQvLyBhcHBseSBzZWFyY2ggYW5kIGZpbHRlcnMgdG8gYWRkaXRpb25hbCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdFx0Y29uc3QgdmFsdWVIZWxwS2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0udmhLZXlzIHx8IFtdO1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXNbMF0/LnZhbHVlcyxcblx0XHRcdHZhbHVlTGlzdFByb3BlcnR5XG5cdFx0KTtcblxuXHRcdGxldCByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cdFx0aWYgKCFwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHQvLyBubyBoaXN0b3J5IGZvciB2YWx1ZXMgbGlzdHMgd2l0aCBmaXhlZCB2YWx1ZXMgKHRoZXkgYXJlIHVzdWFsbHkgc2hvcnQpXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IGF3YWl0IHRoaXMuX2dldEhpc3RvcnlEYXRhKHBheWxvYWQsIGZpZWxkKTtcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjZW50VmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0dmFsdWVIZWxwS2V5cyxcblx0XHRcdFx0KGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoPy5yZXBsYWNlQWxsKCdcIicsIFwiXCIpLFxuXHRcdFx0XHRiaW5kaW5nSW5mb1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHR2YWx1ZUhlbHBLZXlzXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGZpbHRlciBpbiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPiBhbmQgcmVzdW1lcyBpdCwgaWYgc3VzcGVuZGVkLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZzogZnVuY3Rpb24gKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHRsaXN0QmluZGluZy5maWx0ZXIoYmluZGluZ0luZm8uZmlsdGVycywgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cdFx0bGlzdEJpbmRpbmcuc29ydChiaW5kaW5nSW5mby5zb3J0ZXIpO1xuXG5cdFx0aWYgKHJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc3VtZSgpO1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGlmIGFkZGl0aW9uYWx2YWx1ZXMgZXhpc3RzIHdoaWNoIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgRGVmaW5lcyBpZiB3ZSBzaGFsbCBjaGVjayBmb3IgcmVjb21tZW5kYXRpb25zXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWVcblx0ICovXG5cdF9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0czogYXN5bmMgZnVuY3Rpb24gKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY2hlY2tSZWNvbW1lbmRhdGlvbnMgPSB0cnVlKSB7XG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBcImludGVybmFsXCIgbW9kZWwgaXMgbm90IGF2YWlsYWJsZS5cblx0XHRpZiAocGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzID0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgPyB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpIDogW107XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uVmFsdWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiByZXR1cm4gdHJ1ZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCkge1xuXHRcdFx0Ly8gbm93IGNoZWNrIGZvciByZWNlbnQgdmFsdWVzXG5cdFx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVjZW50VmFsdWVzID0gYXdhaXQgdGhpcy5fZ2V0SGlzdG9yeURhdGEocGF5bG9hZCwgY29udGVudC5nZXRDb250cm9sKCkpO1xuXHRcdFx0aWYgKHJlY2VudFZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgcmV0dXJuIHRydWVcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBSZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0ICovXG5cdGdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuXHRcdGxldCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcblx0XHRjb25zdCBpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkID1cblx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgY29udGVudC5nZXRDb250cm9sKCkuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cblx0XHRpZiAoIWlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRNb2RlbCA9IGNvbnRlbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsICYgeyBnZXRMb2NhbEFubm90YXRpb25Nb2RlbDogRnVuY3Rpb24gfTtcblx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY29udGVudE1vZGVsLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsICYmIGNvbnRlbnRNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0aWYgKGxvY2FsQW5ub3RhdGlvbk1vZGVsKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgZmllbGRQYXRoID0gY29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZyhcInZhbHVlXCIpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdHZhbHVlcyA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldE9iamVjdChgJHtiaW5kaW5nQ29udGV4dFBhdGh9LyR7ZmllbGRQYXRofUAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy50eXBlQWhlYWRWYWx1ZXNgKSA/PyBbXTtcblx0XHRcdH1cblx0XHRcdGlmICghdmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBpbnB1dFZhbHVlcyA9IChjb250ZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5nZXRQcm9wZXJ0eShcIi9yZWNvbW1lbmRhdGlvbnNEYXRhXCIpIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0dmFsdWVzID1cblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdFx0XHRpbnB1dFZhbHVlcyxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKVxuXHRcdFx0XHRcdCkgfHwgW107XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIHdoaWNoIHdpbGwgdGVsbCB3aGV0aGVyIHR5cGVhaGVhZCBzaG91bGQgYmUgb3BlbmVkIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdoZXRoZXIgdG8gc2hvdyB0eXBlYWhlYWQgb3Igbm90XG5cdCAqL1xuXHR0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudDogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNRENQb3BvdmVyKSB7XG5cdFx0bGV0IHNob3dJdCA9IHRydWU7XG5cdFx0Y29uc3QgdHlwZUFoZWFkQ29udGVudCA9IGNvbnRlbnQ/LmdldENvbnRlbnQoKVswXSBhcyBNVGFibGU7XG5cdFx0Y29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZUhlbHA/LmdldEZpbHRlclZhbHVlKCk7XG5cdFx0Y29uc3QgZmllbGQgPSB0eXBlQWhlYWRDb250ZW50LmdldENvbnRyb2woKSBhcyBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkO1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cblx0XHRpZiAoZmllbGQuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgZmllbGQuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0aWYgKCFmaWx0ZXJWYWx1ZSkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcmVjb21tZW5kYXRpb24gVVggd2UgZG9uJ3QgY2hlY2sgZm9yIHJlY29tbWVuZGF0aW9ucyBidXQgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgb25seVxuXHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgZmllbGRUZXh0VmFsdWUgPSBmaWVsZC5nZXRBZGRpdGlvbmFsVmFsdWUoKTtcblx0XHRcdGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVGV4dFZhbHVlKSB7XG5cdFx0XHRcdC8vIHZhbHVlaGVscCBoYWQgc29tZSB2YWx1ZSwgYnV0IHVzZXIgY2xlYXJlZCB0aGUgdmFsdWVcblx0XHRcdFx0Ly8gaW4gc3VjaCBjYXNlIHdlIGdldCBpbnB1dCB2YWx1ZSBhcyAnJyBhbmQgd2Ugd2lsbCByZXR1cm4gZmFsc2Vcblx0XHRcdFx0Ly9Ob3RlOiBJbiBTRHMgdXNlY2FzZSB3ZSB3YW50ZWQgdG8gb3BlbiB0aGUgdHlwZUFoZWFkIGlmIHRoZXJlIGFyZSByZWNvbW1lbmRhdGlvbnMgYW5kIHZhbHVlIGlzIGJsYW5rLCB0aGV5IHNob3VsZCBwYXNzIHVzIGEgZmxhZyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhpcyBhY2NvcmRpbmdseVxuXHRcdFx0XHRjb25zdCBpc0RpZ2l0U2VxdWVuY2UgPVxuXHRcdFx0XHRcdChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH0ke0Fubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2V9YCkgPz9cblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0aWYgKGZpZWxkLmhhc1BlbmRpbmdVc2VySW5wdXQoKSB8fCB0aGlzLl9pc0VtcHR5RGlnaXRTZXF1ZW5jZShmaWVsZFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2UpKSB7XG5cdFx0XHRcdFx0c2hvd0l0ID0gZmlsdGVyVmFsdWUgIT09IFwiXCIgfHwgKGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBjaGVjayByZWNlbnRseSB1c2VkIG9ubHlcblx0XHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIWZpbHRlclZhbHVlKSB7XG5cdFx0XHRcdHNob3dJdCA9IGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpO1xuXHRcdFx0XHQvLyBlbHNlOiB0aGUgdXNlciB0eXBlcywgd2Ugc2hhbGwgYWx3YXlzIHNob3cgdGhlIG90aGVyIHZhbHVlc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2hvd0l0O1xuXHR9LFxuXG5cdGNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IE1EQ1BvcG92ZXIpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHZhbHVlSGVscC5nZXRDb250cm9sKCk7XG5cdFx0XHRpZiAocGFyZW50Q29udHJvbCAmJiBwYXJlbnRDb250cm9sPy5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRjb25zdCBmaWVsZElkID0gcGFyZW50Q29udHJvbC5nZXRDb250ZW50KCk/LmdldElkKCk7XG5cdFx0XHRcdGNvbnN0IGlzVmlzdWFsRmlsdGVyID0gZmllbGRJZCA/IGZpZWxkSWQuaW5jbHVkZXMoXCJWaXN1YWxGaWx0ZXJcIikgOiBmYWxzZTtcblx0XHRcdFx0Ly9WaXN1YWwgRmlsdGVyIGNvbnRhaW5pbmcgdmFsdWVIZWxwIHNob3VsZCBub3Qgb3BlbiBvbiBmb2N1cyBmb3IgcmVjZW50bHkgc2VsZWN0ZWQgdmFsdWVzIG8gciByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0aWYgKGlzVmlzdWFsRmlsdGVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHZhbHVlSGVscFRhYmxlID0gY29udGVudD8uZ2V0Q29udGVudCgpWzBdIGFzIE1UYWJsZTtcblx0XHRcdGxldCBjb250cm9sOiBVSTVFbGVtZW50IHwgRGlhbG9nIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZ2V0UGFyZW50RGlhbG9nID0gZnVuY3Rpb24gKGlubmVyQ29udGVudDogVUk1RWxlbWVudCk6IERpYWxvZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRcdGNvbnRyb2wgPSBpbm5lckNvbnRlbnQ/LmdldFBhcmVudCgpIGFzIFVJNUVsZW1lbnQ7XG5cdFx0XHRcdGlmIChjb250cm9sICYmIGNvbnRyb2wuaXNBPERpYWxvZz4oXCJzYXAubS5EaWFsb2dcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sID09PSB1bmRlZmluZWQgfHwgY29udHJvbCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFBhcmVudERpYWxvZyhjb250cm9sKTtcblx0XHRcdH07XG5cdFx0XHRjb250cm9sID0gZ2V0UGFyZW50RGlhbG9nKGNvbnRlbnQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb250cm9sICYmXG5cdFx0XHRcdGNvbnRyb2wuZGF0YShcImZlX0luaXRpYWxUeXBlQWhlYWRGb2N1c0RvbmVcIikgPT09IG51bGwgJiZcblx0XHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuZ2V0RG9tUmVmKCk/LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF0uaWQgPT09IChjb250cm9sIGFzIERpYWxvZykuZ2V0SW5pdGlhbEZvY3VzKClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250cm9sLmRhdGEoXCJmZV9Jbml0aWFsVHlwZUFoZWFkRm9jdXNEb25lXCIsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkgPSBwYXlsb2FkLmhpc3RvcnkgfHwge307XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgPSB1bmRlZmluZWQ7IC8vIG5lZWRzIHRvIGJlIGluaXRpYWxpemVcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5LmVuYWJsZWQgPSBwYXlsb2FkLmhpc3RvcnkuZW5hYmxlZCA/PyBWYWx1ZUxpc3RIZWxwZXIuY2hlY2tIaXN0b3J5RW5hYmxlZCh2YWx1ZUhlbHAsIHBheWxvYWQpO1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModmFsdWVIZWxwVGFibGUsIHBheWxvYWQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYm9vbGVhbiB2YWx1ZSBkZXRlcm1pbmluZyBpZiByZXF1ZXN0U2hvd0NvbnRhaW5lciBzaGFsbCBvcGVuIHRoZSBwb3BvdmVyIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGFpbmVyIEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEBwYXJhbSByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBFbnVtIGRlZmluaW5nIHRoZSByZWFzb24gZm9yIHBvc3NpYmxlIHRyaWdnZXJcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZVxuXHQgKi9cblx0cmVxdWVzdFNob3dDb250YWluZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBNRENQb3BvdmVyLCByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbjogc3RyaW5nKSB7XG5cdFx0Ly8gRW5zdXJlIHRoZSB2YWx1ZSBoZWxwIHBvcG92ZXIgb3BlbnMgZm9yIHR5cGluZywgZmlsdGVyLCB0YXAgZXZlbnRzIGFuZCB0YWIgbmF2aWdhdGlvblxuXHRcdGlmIChbUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVGFiLCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UYXBdLmluY2x1ZGVzKHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIodmFsdWVIZWxwLCBjb250YWluZXIpO1xuXHRcdH0gZWxzZSBpZiAoW1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlR5cGluZywgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uRmlsdGVyXS5pbmNsdWRlcyhyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbikpIHtcblx0XHRcdHJldHVybiB0aGlzLnR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50KHZhbHVlSGVscCwgY29udGFpbmVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlZhbHVlSGVscFJlcXVlc3QgPT09IHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uO1xuXHR9XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBbURBLE1BQU1BLHVCQUF1QixHQUFHLGtDQUFrQztFQUNsRSxNQUFNQyx5QkFBeUIsR0FBRyxpREFBaUQ7RUFBQyxPQXVCckVDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFQyxpQkFBaUIsRUFBRTtJQUNuREMsVUFBVSxFQUFFLENBQUM7SUFDYkMseUJBQXlCLEVBQUUsSUFBSUMsT0FBTyxDQUF3QixDQUFDO0lBRS9EO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGlCQUFpQixFQUFFLFNBQUFBLENBQVVDLFNBQW9CLEVBQUVDLE9BQThCLEVBQUVDLFlBQThCLEVBQUU7TUFDbEgsT0FBTyxDQUFDLENBQUNELE9BQU8sQ0FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ3pDLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxpQkFBaUIsRUFBRSxTQUFBQSxDQUFVSixTQUFvQixFQUFFQyxPQUE4QixFQUFFSSxXQUF1QyxFQUFFO01BQzNIVixpQkFBaUIsQ0FBQ1MsaUJBQWlCLENB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
1071
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiY2hlY2tDb25kaXRpb25zRXF1YWwiLCJvbGRDb25kaXRpb24iLCJuZXdDb25kaXRpb24iLCJvcGVyYXRvciIsInZhbHVlczEiLCJ2YWx1ZXMiLCJ2YWx1ZXMyIiwibGVuZ3RoIiwic29ydGVkVmFsdWVzMSIsInNvcnQiLCJmaXJzdFZhbHVlIiwic2Vjb25kVmFsdWUiLCJTdHJpbmciLCJsb2NhbGVDb21wYXJlIiwic29ydGVkVmFsdWVzMiIsImV2ZXJ5IiwidmFsdWUiLCJpbmRleCIsIl9nZXRIaXN0b3J5RGF0YSIsInBheWxvYWQiLCJoaXN0b3J5IiwiZW5hYmxlZCIsImlzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJ2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSIsImZpZWxkRGF0YSIsImdldEZpZWxkRGF0YSIsInByb3BlcnR5UGF0aCIsInZhbHVlSGVscFF1YWxpZmllciIsImVyciIsIkxvZyIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiX3NldEhpc3RvcnlEYXRhIiwiY29uZGl0aW9ucyIsInZhbHVlTGlzdFByb3BlcnR5IiwiX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIiLCJjb25kaXRpb24iLCJpc1VuaXRWYWx1ZUhlbHAiLCJ2YWxpZGF0ZWQiLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJjb25kaXRpb25QYXlsb2FkTWFwIiwiX2dldENvbmRpdGlvblBheWxvYWRMaXN0IiwicHVzaCIsImNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QiLCJzZXRGaWVsZERhdGEiLCJjb25kaXRpb25QYXlsb2FkIiwibmVzdGVkT2JqZWN0Iiwia2V5IiwiT2JqZWN0UGF0aCIsInNldCIsInNwbGl0IiwiX2lzRW1wdHlEaWdpdFNlcXVlbmNlIiwiaXNEaWdpdFNlcXVlbmNlIiwiaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJjb25kaXRpb25QYXRoIiwiZmlsdGVyZWQiLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJjb25kaXRpb25BbHJlYWR5RXhpc3RzIiwidGVzdENvbmRpdGlvbiIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsImNvbnRleHRQYXRoIiwiZmlsdGVyVGFyZ2V0Iiwic291cmNlIiwicG9wIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJmaWx0ZXJUYXJnZXRQYXRoIiwic3Vic3RyaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRSZWR1Y2VkUGF0aCIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJvdXRWYWx1ZXMiLCJ3YXJuaW5nIiwiX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eSIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwicm9vdFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsInZpZXciLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRDb250cm9sbGVyIiwiaXNDb25uZWN0ZWQiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJnZXRQcm9wZXJ0eSIsInBhdGgiLCJzaWRlRWZmZWN0UGF0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImN1cnJlbnRWYWwiLCJuZXdWYWwiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJjb25maWciLCJnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyIsIm9uQ29uZGl0aW9uUHJvcGFnYXRpb24iLCJyZWFzb24iLCJfY29uZmlnIiwiaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHAiLCJxdWFsaWZpZXIiLCJnZXRPdXRQYXJhbWV0ZXJzIiwiZmllbGRQYXJlbnQiLCJnZXRQYXJlbnQiLCJnZXRDb25kaXRpb25zIiwiaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMiLCJwcm9wZXJ0eU5hbWUiLCJwYXlsb2FkS2V5cyIsInBheWxvYWRLZXkiLCJjb25kaXRpb25WYWx1ZWtleXMiLCJjb25kaXRpb25WYWx1ZWtleSIsInZhbHVlS2V5Iiwia2V5VmFsdWUiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsImluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiaW5QYXJhbWV0ZXIiLCJtZXRhRGF0YUVycm9yIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlcGxhY2UiLCIkUGFydG5lciIsIiRraW5kIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsImNvbnRleHRVbmRlckNyZWF0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJlcnJvck1lc3NhZ2VzSW5Db250ZXh0IiwiZ2V0TWVzc2FnZXMiLCJnZXRUeXBlIiwiTWVzc2FnZVR5cGUiLCJjcmVhdGVkIiwicmVxdWVzdFByb3BlcnR5IiwiaSIsIm1ldGFNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInJlbGF0aXZlUGF0aFBhcnRzIiwic2xpY2UiLCJwYXJ0IiwicGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJjb25jYXQiLCJqb2luIiwiX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhciIsInNvdXJjZUZpZWxkIiwiX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIiLCJfcGFydGl0aW9uSW5QYXJhbWV0ZXJzIiwiaW5QYXJhbWV0ZXJNYXAiLCJjb25zdGFudCIsImNvbnN0YW50VmFsdWUiLCJpbmRleE9mIiwiX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJldmVudCIsInNyY0NvbnRyb2wiLCJ0YWJsZUNlbGxzRG9tUmVmcyIsIiQiLCJtZGNNVGFibGUiLCJoaWdobGlnaHRET01FbGVtZW50cyIsInBvcG92ZXJUYWJsZSIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJhZGRFdmVudERlbGVnYXRlIiwiZ2V0SW5QYXJhbWV0ZXJzIiwiaXNPYmplY3RQYWdlIiwiY3JlYXRlQ29uZGl0aW9uUGF5bG9hZCIsIl92YWx1ZXMiLCJlbnRyeSIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiZXh0ZXJuYWxJZFBhdGgiLCJ2aEtleVByb3BlcnR5IiwidmhLZXlWYWx1ZSIsInZoUHJvcGVydGllcyIsInZoS2V5IiwiZmluZENvbmRpdGlvbnNGb3JDb250ZXh0Iiwia2V5UGF0aCIsImdldEtleVBhdGgiLCJmaW5kQ29uZGl0aW9uIiwiY29uZGl0aW9uU2VsZWN0ZWRSb3ciLCJ1c2VNdWx0aVZhbHVlRmllbGQiLCJjb250ZXh0S2V5cyIsInNlbGVjdGVkQ29uZGl0aW9uIiwiX3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwib3RoZXJzVmFsdWVzQ29udGV4dERhdGEiLCJfZ2V0UmVsZXZhbnRBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImhhc1JlbGV2YW50RGF0YSIsInJlc2V0Q2hhbmdlcyIsImRlYnVnIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzdXNwZW5kIiwic29ydEFuZEZpbHRlckxpc3RCaW5kaW5nIiwiY2hhbmdlUGFyYW1ldGVycyIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJ2YWx1ZUhlbHBLZXlzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsInJlcGxhY2VBbGwiLCJnZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhIiwiZmlsdGVycyIsIkZpbHRlclR5cGUiLCJBcHBsaWNhdGlvbiIsInNvcnRlciIsInJlc3VtZSIsIl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyIsImNoZWNrUmVjb21tZW5kYXRpb25zIiwiYXJndW1lbnRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJyZWNlbnRWYWx1ZXMiLCJjb250ZW50TW9kZWwiLCJsb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwiYmluZGluZ0NvbnRleHRQYXRoIiwiZmllbGRQYXRoIiwiaW5wdXRWYWx1ZXMiLCJ0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudCIsInNob3dJdCIsInR5cGVBaGVhZENvbnRlbnQiLCJnZXRDb250ZW50IiwiZmlsdGVyVmFsdWUiLCJmaWVsZFRleHRWYWx1ZSIsImdldEFkZGl0aW9uYWxWYWx1ZSIsImNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyIiwicGFyZW50Q29udHJvbCIsImZpZWxkSWQiLCJnZXRJZCIsImlzVmlzdWFsRmlsdGVyIiwidmFsdWVIZWxwVGFibGUiLCJnZXRQYXJlbnREaWFsb2ciLCJpbm5lckNvbnRlbnQiLCJnZXREb21SZWYiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImlkIiwiZ2V0SW5pdGlhbEZvY3VzIiwiY2hlY2tIaXN0b3J5RW5hYmxlZCIsInJlcXVlc3RTaG93Q29udGFpbmVyIiwicmVxdWVzdFNob3dDb250YWluZXJSZWFzb24iLCJSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlRhYiIsIlRhcCIsIlR5cGluZyIsIkZpbHRlciIsIlZhbHVlSGVscFJlcXVlc3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZhbHVlSGVscERlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvRmlsdGVyQmFyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGREYXRhVHlwZSwgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IElGaWx0ZXJDb250cm9sIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEluT3V0UGFyYW1ldGVyLCBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgaGlnaGxpZ2h0RE9NRWxlbWVudHMgZnJvbSBcInNhcC9tL2lucHV0VXRpbHMvaGlnaGxpZ2h0RE9NRWxlbWVudHNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBGaWVsZCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFZhbHVlSGVscERlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9SZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvblwiO1xuaW1wb3J0IHR5cGUgRmllbGRCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL0ZpZWxkQmFzZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWx0ZXJiYXIvRmlsdGVyQmFyQmFzZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgTURDUG9wb3ZlciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvUG9wb3ZlclwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250ZW50XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJhYmxlTGlzdENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvRmlsdGVyYWJsZUxpc3RDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTVRhYmxlXCI7XG5pbXBvcnQgRmlsdGVyVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclR5cGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gXCIuLi9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBBZGRpdGlvbmFsVmFsdWVUeXBlLCBCaW5kaW5nSW5mb1BhcmFtZXRlcnMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXksIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLkZpbHRlckJhclwiO1xuY29uc3QgQW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZSA9IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uT2JqZWN0TWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+O1xuXG5leHBvcnQgdHlwZSBFeHRlcm5hbFN0YXRlVHlwZSA9IHtcblx0aXRlbXM6IHsgbmFtZTogc3RyaW5nIH1bXTtcblx0ZmlsdGVyOiBDb25kaXRpb25PYmplY3RNYXA7XG59O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25QYXlsb2FkVHlwZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uUGF5bG9hZE1hcCA9IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvblBheWxvYWRUeXBlW10+O1xuXG50eXBlIE1EQ0NvbmZpZ1R5cGUgPSB7XG5cdHZhbHVlOiB1bmtub3duO1xuXHRwYXJzZWRWYWx1ZTogdW5rbm93bjtcblx0Y29udGV4dDogb2JqZWN0O1xuXHRjb250cm9sOiBDb250cm9sOyAvLyBJbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBjb250cm9sXG5cdGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblx0Y2hlY2tLZXk6IGJvb2xlYW47XG5cdGNoZWNrRGVzY3JpcHRpb246IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKHt9LCBWYWx1ZUhlbHBEZWxlZ2F0ZSwge1xuXHRhcGlWZXJzaW9uOiAyLFxuXHR1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzOiBuZXcgV2Vha01hcDxvYmplY3QsIFByb21pc2U8dm9pZD4+KCksXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPiBzdXBwb3J0cyAkU2VhcmNoLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgZWxlbWVudFxuXHQgKiBAcGFyYW0gX2xpc3RCaW5kaW5nXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgJHNlYXJjaCBpcyBzdXBwb3J0ZWRcblx0ICovXG5cdGlzU2VhcmNoU3VwcG9ydGVkOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCwgX2xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdFx0cmV0dXJuICEhY29udGVudC5kYXRhKFwic2VhcmNoU3VwcG9ydGVkXCIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkanVzdGFibGUgZmlsdGVyaW5nIGZvciBsaXN0LWJhc2VkIGNvbnRlbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IHJlcXVlc3RpbmcgY29uZGl0aW9ucyBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHR1cGRhdGVCaW5kaW5nSW5mbzogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbykge1xuXHRcdFZhbHVlSGVscERlbGVnYXRlLnVwZGF0ZUJpbmRpbmdJbmZvKHZhbHVlSGVscCwgY29udGVudCwgYmluZGluZ0luZm8pO1xuXG5cdFx0aWYgKGNvbnRlbnQuZGF0YShcInNlYXJjaFN1cHBvcnRlZFwiKSkge1xuXHRcdFx0Y29uc3Qgc2VhcmNoID0gY29udGVudC5nZXRGaWx0ZXJWYWx1ZSgpO1xuXHRcdFx0Y29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IENvbW1vblV0aWxzLm5vcm1hbGl6ZVNlYXJjaFRlcm0oc2VhcmNoKTsgLy8gYWRqdXN0U2VhcmNoXG5cblx0XHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS4kc2VhcmNoID0gbm9ybWFsaXplZFNlYXJjaCB8fCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHZhbHVlIGhlbHAgaGlzdG9yeSBzZXJ2aWNlIGZyb20gdGhlIGFwcCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgdG8gZmluZCB0aGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBWYWx1ZUhlbHBIaXN0b3J5U2VydmljZVxuXHQgKi9cblx0X2dldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlKGNvbnRyb2w6IENvbnRyb2wpOiBWYWx1ZUhlbHBIaXN0b3J5U2VydmljZSB7XG5cdFx0Ly8gRm9yIHNvbWUgcmVhc29uIHdlIGNhbm5vdCB1c2UgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KGNvbnRyb2wpIGhlcmUgYnV0IG5lZWQgdG8gZ2V0IHRoZSBWaWV3IGZpcnN0LlxuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KGNvbnRyb2wpKTtcblx0XHRyZXR1cm4gYXBwQ29tcG9uZW50LmdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbXBhcmVzIHR3byBjb25kaXRpb24gb2JqZWN0cyBmb3IgZXF1YWxpdHkgYmFzZWQgb24gb3BlcmF0b3IgYW5kIHZhbHVlcy5cblx0ICogQHBhcmFtIG9sZENvbmRpdGlvbiBGaXJzdCBjb25kaXRpb24gdG8gY29tcGFyZVxuXHQgKiBAcGFyYW0gbmV3Q29uZGl0aW9uIFNlY29uZCBjb25kaXRpb24gdG8gY29tcGFyZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGNvbmRpdGlvbnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGNoZWNrQ29uZGl0aW9uc0VxdWFsKG9sZENvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0LCBuZXdDb25kaXRpb246IENvbmRpdGlvbk9iamVjdCk6IGJvb2xlYW4ge1xuXHRcdC8vIENvbXBhcmUgb3BlcmF0b3JzXG5cdFx0aWYgKG9sZENvbmRpdGlvbi5vcGVyYXRvciAhPT0gbmV3Q29uZGl0aW9uLm9wZXJhdG9yKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcGFyZSB2YWx1ZXMgYXJyYXlzXG5cdFx0Y29uc3QgdmFsdWVzMSA9IG9sZENvbmRpdGlvbi52YWx1ZXMgPz8gW107XG5cdFx0Y29uc3QgdmFsdWVzMiA9IG5ld0NvbmRpdGlvbi52YWx1ZXMgPz8gW107XG5cblx0XHRpZiAodmFsdWVzMS5sZW5ndGggIT09IHZhbHVlczIubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gdG8gaGFuZGxlIG9yZGVyIGRpZmZlcmVuY2VzXG5cdFx0Y29uc3Qgc29ydGVkVmFsdWVzMSA9IFsuLi52YWx1ZXMxXS5zb3J0KChmaXJzdFZhbHVlLCBzZWNvbmRWYWx1ZSkgPT4gU3RyaW5nKGZpcnN0VmFsdWUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHNlY29uZFZhbHVlKSkpO1xuXHRcdGNvbnN0IHNvcnRlZFZhbHVlczIgPSBbLi4udmFsdWVzMl0uc29ydCgoZmlyc3RWYWx1ZSwgc2Vjb25kVmFsdWUpID0+IFN0cmluZyhmaXJzdFZhbHVlKS5sb2NhbGVDb21wYXJlKFN0cmluZyhzZWNvbmRWYWx1ZSkpKTtcblxuXHRcdHJldHVybiBzb3J0ZWRWYWx1ZXMxLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBzb3J0ZWRWYWx1ZXMyW2luZGV4XSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgaGlzdG9yeSBkYXRhIGZvciB0aGUgdmFsdWUgbGlzdCBwcm9wZXJ0eSBmcm9tIHRoZSBoaXN0b3J5IHNlcnZpY2UuXG5cdCAqIE5vIGhpc3RvcnkgZGF0YSBpcyBmZXRjaGVkIGZvciBmaWVsZHMgYW5ub3RhdGVkIHdpdGggSXNQb3RlbnRpYWxseVNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgVmFsdWVIZWxwXG5cdCAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgdG8gZmluZCB0aGUgYXBwIGNvbXBvbmVudCwgZS5nLiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCB0byBhIGxpc3Qgb2YgZmllbGQgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHlcblx0ICovXG5cdF9nZXRIaXN0b3J5RGF0YTogYXN5bmMgZnVuY3Rpb24gKHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsIGNvbnRyb2w6IENvbnRyb2wpOiBQcm9taXNlPEZpZWxkRGF0YVR5cGVbXT4ge1xuXHRcdGlmIChwYXlsb2FkLmhpc3Rvcnk/LmVuYWJsZWQgJiYgcGF5bG9hZC5pc1BvdGVudGlhbGx5U2Vuc2l0aXZlICE9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZSA9IHRoaXMuX2dldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlKGNvbnRyb2wpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZmllbGREYXRhID0gYXdhaXQgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2UuZ2V0RmllbGREYXRhKHBheWxvYWQucHJvcGVydHlQYXRoICsgXCIvXCIgKyBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcik7XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5kYXRhID0gZmllbGREYXRhO1xuXHRcdFx0XHRyZXR1cm4gZmllbGREYXRhO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaGlzdG9yeSBkYXRhIGZvciB0aGUgdmFsdWUgbGlzdCBwcm9wZXJ0eSBpbiB0aGUgaGlzdG9yeSBzZXJ2aWNlLlxuXHQgKiBObyBoaXN0b3J5IGRhdGEgaXMgc3RvcmVkIGZvciBmaWVsZHMgYW5ub3RhdGVkIHdpdGggSXNQb3RlbnRpYWxseVNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgVmFsdWVIZWxwXG5cdCAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb24gb2JqZWN0IHRvIGdldCB0aGUgc2VsZWN0ZWQgZGF0YSBmcm9tXG5cdCAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgdG8gZmluZCB0aGUgYXBwIGNvbXBvbmVudCwgZS5nLiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCB3aGVuIHRoZSBkYXRhIGlzIHNldCBpbiB0aGUgaGlzdG9yeSBzZXJ2aWNlXG5cdCAqL1xuXHRfc2V0SGlzdG9yeURhdGE6IGFzeW5jIGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLCBjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSwgY29udHJvbDogQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXlsb2FkLmhpc3Rvcnk/LmVuYWJsZWQgJiYgcGF5bG9hZC5pc1BvdGVudGlhbGx5U2Vuc2l0aXZlICE9PSB0cnVlICYmIGNvbmRpdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9IHRoaXMuX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIocGF5bG9hZCk7XG5cdFx0XHRpZiAodmFsdWVMaXN0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0XHRcdGlmIChwYXlsb2FkLmlzVW5pdFZhbHVlSGVscCB8fCBjb25kaXRpb24udmFsaWRhdGVkID09PSBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKT8uWzBdO1xuXHRcdFx0XHRcdFx0aWYgKGNvbmRpdGlvblBheWxvYWRNYXApIHtcblx0XHRcdFx0XHRcdFx0ZGF0YS5wdXNoKHRoaXMuY29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdChjb25kaXRpb25QYXlsb2FkTWFwKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB2YWx1ZUxpc3RIaXN0b3J5U2VydmljZS5zZXRGaWVsZERhdGEocGF5bG9hZC5wcm9wZXJ0eVBhdGggKyBcIi9cIiArIHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyLCBkYXRhKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ29udmVydGluZyB0aGUgY29uZGl0aW9uIHBheWxvYWQgdG8gYSBuZXN0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gY29uZGl0aW9uUGF5bG9hZCBUaGUgY29uZGl0aW9uIHBheWxvYWQgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZFxuXHQgKiBAcmV0dXJucyBUaGUgY29udmVydGVkIG5lc3RlZCBvYmplY3Rcblx0ICovXG5cdGNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3Q6IGZ1bmN0aW9uIChjb25kaXRpb25QYXlsb2FkOiBDb25kaXRpb25QYXlsb2FkVHlwZSk6IENvbmRpdGlvblBheWxvYWRUeXBlIHtcblx0XHRjb25zdCBuZXN0ZWRPYmplY3Q6IENvbmRpdGlvblBheWxvYWRUeXBlID0ge307XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gY29uZGl0aW9uUGF5bG9hZCkge1xuXHRcdFx0T2JqZWN0UGF0aC5zZXQoa2V5LnNwbGl0KFwiL1wiKSwgY29uZGl0aW9uUGF5bG9hZFtrZXldLCBuZXN0ZWRPYmplY3QpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmVzdGVkT2JqZWN0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB2YWx1ZSBpcyBkaWdpdCBzZXF1ZW5jZSB3aXRoIG5vIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG5cdCAqIEBwYXJhbSBpc0RpZ2l0U2VxdWVuY2UgSW5kaWNhdGVzIGlmIHRoZSB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhIGRpZ2l0IHNlcXVlbmNlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IGRpZ2l0IHNlcXVlbmNlLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9pc0VtcHR5RGlnaXRTZXF1ZW5jZTogZnVuY3Rpb24gKHZhbHVlOiBWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlOiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0bGV0IGlzRW1wdHlEaWdpdFNlcXVlbmNlID0gZmFsc2U7XG5cdFx0aWYgKGlzRGlnaXRTZXF1ZW5jZSkge1xuXHRcdFx0aXNFbXB0eURpZ2l0U2VxdWVuY2UgPVxuXHRcdFx0XHR0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHQ/IHZhbHVlLnNwbGl0KFwiXCIpLmV2ZXJ5KChjaGFyKSA9PiBjaGFyID09PSBcIjBcIikgPz8gdmFsdWUgPT09IFwiXCJcblx0XHRcdFx0XHQ6IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IDA7XG5cdFx0fVxuXHRcdHJldHVybiBpc0VtcHR5RGlnaXRTZXF1ZW5jZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGZpZWxkIGlzIHJlY29tbWVuZGF0aW9uIHJlbGV2YW50IGFuZCBjYWxscyBlaXRoZXIgX3VwZGF0ZUJpbmRpbmcgb3IgX3VwZGF0ZUJpbmRpbmdGb3JSZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKi9cblx0dXBkYXRlQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRjb250ZW50OiBNVGFibGVcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gbGlzdEJpbmRpbmcgc2hvdWxkIGJlIG9mIHR5cGUgT0RhdGFMaXN0QmluZGluZ1xuXHRcdGlmICghbGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvL1dlIGZldGNoIHRoZSB2YWx1ZWxpc3QgcHJvcGVydHkgZnJvbSB0aGUgcGF5bG9hZCB0byBtYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmlnaHQgcHJvcGVydHkgd2hpbGUgbWFraW5nIGEgY2FsbCBvbiB2YWx1ZWxpc3QgZW50aXR5IHNldFxuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKGNvbnRlbnQuaXNUeXBlYWhlYWQoKSkge1xuXHRcdFx0bGV0IHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmU6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gY3JlYXRlIGEgcHJvbWlzZSB0byBtYWtlIHN1cmUgY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcgaXMgb25seSBjb21wbGV0ZWQgb25jZSB0aGlzIHByb21pc2UgaXMgcmVzb2x2ZWRcblx0XHRcdGNvbnN0IG5ld1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHR1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBleGlzdGluZ1VwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSA9IHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5nZXQobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly9idWlsZCBhIHByb21pc2UgY2hhaW4gaWYgbmVjZXNzYXJ5XG5cdFx0XHR0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuc2V0KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0ZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UgPyBleGlzdGluZ1VwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZS50aGVuKGFzeW5jICgpID0+IG5ld1Byb21pc2UpIDogbmV3UHJvbWlzZVxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgdmFsdWVMaXN0UHJvcGVydHkgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyKHBheWxvYWQpO1xuXHRcdFx0Y29uc3QgZmllbGQgPSBjb250ZW50LmdldENvbnRyb2woKSBhcyBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkO1xuXHRcdFx0Y29uc3QgaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCA9XG5cdFx0XHRcdGZpZWxkLmlzQTxGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGZpZWxkLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gIWlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQgJiYgZmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSA9IFtdO1xuXG5cdFx0XHQvLyBXZSBuZWVkIHRvIHNob3cgcmVjb21tZW5kYXRpb25zIG9ubHkgd2hlbiB0aGUgZmllbGQgaGFzIGVtcHR5IHZhbHVlIG9yIHdoZW4gdXNlciBpcyB0eXBpbmcgYSB2YWx1ZS4gT3RoZXIgdGltZXMgd2Ugc2hvdWxkIG5vdCBzaG93IHJlY29tbWVuZGF0aW9ucy5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBmaWVsZCBoYXMgYW55IHBlbmRpbmcgdXNlciBpbnB1dCBhbmQgaWYgaXQgaXMgdGhlbiB3ZSBzaG93IHJlY29tbWVuZGF0aW9ucyBpZiBhbnkuXG5cdFx0XHRjb25zdCBpc0RpZ2l0U2VxdWVuY2UgPVxuXHRcdFx0XHQoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoYCR7cGF5bG9hZC5wcm9wZXJ0eVBhdGh9JHtBbm5vdGF0aW9uSXNEaWdpdFNlcXVlbmNlfWApID8/IGZhbHNlO1xuXHRcdFx0aWYgKCFmaWVsZFZhbHVlIHx8IGZpZWxkLmhhc1BlbmRpbmdVc2VySW5wdXQoKSB8fCB0aGlzLl9pc0VtcHR5RGlnaXRTZXF1ZW5jZShmaWVsZFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2UpKSB7XG5cdFx0XHRcdC8vZ2V0IHRoZSByZWNvbW1lbmRhdGlvbiBkYXRhIGZyb20gdGhlIGludGVybmFsIG1vZGVsXG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoY29udGVudCwgcGF5bG9hZCk7XG5cblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIHRoZW4gY3JlYXRlIGFkZGl0aW9uYWwgdmFsdWUgc3RydWN0dXJlIGFuZCBjYWxsIF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zXG5cdFx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlcy5wdXNoKHsgcHJvcGVydHlQYXRoOiB2YWx1ZUxpc3RQcm9wZXJ0eSwgdmFsdWVzLCBncm91cEtleTogQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24gfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdGFibGUgPSBjb250ZW50LmdldFRhYmxlKCk7XG5cdFx0XHRjb25zdCBzb3J0ZXJzQ3VzdG9tRGF0YSA9IHRhYmxlLmdldEN1c3RvbURhdGEoKS5maWx0ZXIoKGRhdGEpID0+IGRhdGEuZ2V0S2V5KCkgPT09IFwic29ydGVyc1wiKTtcblx0XHRcdGxldCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10gPSBbXTtcblx0XHRcdGlmIChzb3J0ZXJzQ3VzdG9tRGF0YS5sZW5ndGgpIHNvcnRlcnMgPSBzb3J0ZXJzQ3VzdG9tRGF0YVswXS5nZXRWYWx1ZSgpLnNvcnRlcnM7XG5cblx0XHRcdGF3YWl0IHRoaXMuX3VwZGF0ZUJpbmRpbmdXaXRoVHJhbnNpZW50Q29udGV4dHMoXG5cdFx0XHRcdHBheWxvYWQsXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRiaW5kaW5nSW5mbyxcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlcyxcblx0XHRcdFx0dmFsdWVMaXN0UHJvcGVydHksXG5cdFx0XHRcdGZpZWxkLFxuXHRcdFx0XHRzb3J0ZXJzLFxuXHRcdFx0XHR0YWJsZVxuXHRcdFx0KTtcblx0XHRcdGlmICh1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlKSB7XG5cdFx0XHRcdC8vcmVzb2x2ZSB0aGUgcHJvbWlzZSBhcyBldmVyeXRoaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHR1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vY2FsbCBfdXBkYXRlQmluZGluZyBpZiB0aGVyZSBhcmUgbm8gcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zXG5cdFx0XHR0aGlzLl91cGRhdGVCaW5kaW5nKGxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbyk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRXhlY3V0ZXMgYSBmaWx0ZXIgaW4gYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4uXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gcmVxdWVzdGVkSXRlbXMgTnVtYmVyIG9mIHJlcXVlc3RlZCBpdGVtc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgc2VhcmNoIGlzIGV4ZWN1dGVkXG5cdCAqL1xuXHRleGVjdXRlRmlsdGVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCByZXF1ZXN0ZWRJdGVtczogbnVtYmVyKSB7XG5cdFx0bGlzdEJpbmRpbmcuZ2V0Q29udGV4dHMoMCwgcmVxdWVzdGVkSXRlbXMpO1xuXG5cdFx0YXdhaXQgdGhpcy5jaGVja0xpc3RCaW5kaW5nUGVuZGluZyh2YWx1ZUhlbHAsIGxpc3RCaW5kaW5nLCByZXF1ZXN0ZWRJdGVtcyk7XG5cdFx0cmV0dXJuIGxpc3RCaW5kaW5nO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPiBpcyB3YWl0aW5nIGZvciBhbiB1cGRhdGUuXG5cdCAqIEFzIGxvbmcgYXMgdGhlIGNvbnRleHQgaGFzIG5vdCBiZWVuIHNldCBmb3IgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LFxuXHQgKiA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IG5lZWRzIHRvIHdhaXQuXG5cdCAqIEBwYXJhbSBfdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0QmluZGluZyB0byBjaGVja1xuXHQgKiBAcGFyYW0gcmVxdWVzdGVkSXRlbXMgTnVtYmVyIG9mIHJlcXVlc3RlZCBpdGVtc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSBMaXN0QmluZGluZyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqL1xuXHRjaGVja0xpc3RCaW5kaW5nUGVuZGluZzogYXN5bmMgZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQsIHJlcXVlc3RlZEl0ZW1zOiBudW1iZXIpIHtcblx0XHRsZXQgaXNQZW5kaW5nID0gZmFsc2U7XG5cdFx0aWYgKGxpc3RCaW5kaW5nICYmIHRoaXMudXBkYXRlQmluZGluZ0RvbmVQcm9taXNlcy5oYXMobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuZ2V0KGxpc3RCaW5kaW5nKTtcblx0XHR9XG5cdFx0aWYgKGxpc3RCaW5kaW5nICYmICFsaXN0QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCByZXF1ZXN0ZWRJdGVtcyk7XG5cdFx0XHRcdGlzUGVuZGluZyA9IGNvbnRleHRzLmxlbmd0aCA9PT0gMDtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdGlmIChlcnJvciAmJiAoZXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSk/LmNhbmNlbGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGlzUGVuZGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGlzUGVuZGluZztcblx0fSxcblxuXHRnZXRUeXBlTWFwOiBmdW5jdGlvbiAoX3ZhbHVlSGVscDogVmFsdWVIZWxwKSB7XG5cdFx0cmV0dXJuIFR5cGVNYXA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBjb250ZW50IG9mIHRoZSB2YWx1ZSBoZWxwLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBoZWxwIGlzIG9wZW5lZCBvciBhIGtleSBvciBkZXNjcmlwdGlvbiBpcyByZXF1ZXN0ZWQuXG5cdCAqXG5cdCAqIFNvLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIGhlbHAgY29udGVudCB1c2VkLCBhbGwgY29udGVudCBjb250cm9scyBhbmQgZGF0YSBuZWVkIHRvIGJlIGFzc2lnbmVkLlxuXHQgKiBPbmNlIHRoZXkgYXJlIGFzc2lnbmVkIGFuZCB0aGUgZGF0YSBpcyBzZXQsIHRoZSByZXR1cm5lZCA8Y29kZT5Qcm9taXNlPC9jb2RlPiBuZWVkcyB0byBiZSByZXNvbHZlZC5cblx0ICogT25seSB0aGVuIGRvZXMgdGhlIHZhbHVlIGhlbHAgY29udGludWUgb3BlbmluZyBvciByZWFkaW5nIGRhdGEuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRhaW5lciBDb250YWluZXIgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnRJZCBJZCBvZiB0aGUgY29udGVudCBzaG93biBhZnRlciB0aGlzIGNhbGwgdG8gcmV0cmlldmVDb250ZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBpZiBhbGwgY29udGVudCBpcyBhdmFpbGFibGVcblx0ICovXG5cdHJldHJpZXZlQ29udGVudDogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250YWluZXI6IENvbnRhaW5lciwgY29udGVudElkOiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdHJldHVybiBWYWx1ZUxpc3RIZWxwZXIuc2hvd1ZhbHVlTGlzdChwYXlsb2FkLCBjb250YWluZXIsIGNvbnRlbnRJZCk7XG5cdH0sXG5cblx0X2dldENvbmRpdGlvblBheWxvYWRMaXN0OiBmdW5jdGlvbiAoY29uZGl0aW9uOiBDb25kaXRpb25PYmplY3QpIHtcblx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gKGNvbmRpdGlvbi5wYXlsb2FkIHx8IHt9KSBhcyBDb25kaXRpb25QYXlsb2FkTWFwLFxuXHRcdFx0dmFsdWVIZWxwUXVhbGlmaWVycyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvblBheWxvYWRNYXApLFxuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZExpc3QgPSB2YWx1ZUhlbHBRdWFsaWZpZXJzLmxlbmd0aCA/IGNvbmRpdGlvblBheWxvYWRNYXBbdmFsdWVIZWxwUXVhbGlmaWVyc1swXV0gOiBbXTtcblxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkTGlzdDtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgVmFsdWVMaXN0UHJvcGVydHkgZnJvbSBQYXlsb2FkIGJhc2VkIG9uIGRhdGEgZnJvbSBwYXlsb2FkIGtleXMgYW5kIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEByZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5XG5cdCAqL1xuXHRfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcjogZnVuY3Rpb24gKHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQpIHtcblx0XHRjb25zdCBwYXJhbXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aFBhcmFtZXRlcnMgfHwgW107XG5cdFx0Y29uc3Qga2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0/LnZoS2V5cyB8fCBbXTtcblx0XHRjb25zdCBwcm9wZXJ0eUtleVBhdGggPSBwYXlsb2FkLnZhbHVlSGVscEtleVBhdGg7XG5cdFx0bGV0IGZpbHRlcmVkS2V5czogc3RyaW5nW10gPSBbLi4ua2V5c107XG5cdFx0Y29uc3QgaGVscFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChwYXJhbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jcmVhdGUgaGVscFBhdGhzIGFycmF5IHdoaWNoIHdpbGwgb25seSBjb25zaXN0IG9mIHBhcmFtcyBoZWxwcGF0aFxuXHRcdFx0cGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtOiBJbk91dFBhcmFtZXRlcikge1xuXHRcdFx0XHRoZWxwUGF0aHMucHVzaChwYXJhbS5oZWxwUGF0aCk7XG5cdFx0XHR9KTtcblx0XHRcdC8vZmlsdGVyIHRoZSBrZXlzIGJhc2VkIG9uIGhlbHBQYXRocy4gSWYga2V5IGlzIG5vdCBwcmVzZW50IGluIGhlbHBQYXRoIHRoZW4gaXQgaXMgdmFsdWVsaXN0cHJvcGVydHlcblx0XHRcdGZpbHRlcmVkS2V5cyA9IGtleXMuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gIWhlbHBQYXRocy5pbmNsdWRlcyhrZXkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gZnJvbSBmaWx0ZXJlZEtleXMgcmV0dXJuIHRoZSBrZXkgdGhhdCBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBuYW1lXG5cdFx0cmV0dXJuIHByb3BlcnR5S2V5UGF0aCAmJiBmaWx0ZXJlZEtleXMuaW5jbHVkZXMocHJvcGVydHlLZXlQYXRoKSA/IHByb3BlcnR5S2V5UGF0aCA6IFwiXCI7XG5cdH0sXG5cblx0X29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0ZpbHRlckJhcjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRsaXN0UmVwb3J0RmlsdGVyQmFyOiBGaWx0ZXJCYXJcblx0KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUobGlzdFJlcG9ydEZpbHRlckJhcik7XG5cdFx0XHRjb25zdCBzdGF0ZUl0ZW1zID0gc3RhdGUuaXRlbXM7IC8vIFZpc2libGUgRmlsdGVySXRlbXMgaW4gdGhlIExSLUZpbHRlckJhclxuXHRcdFx0Y29uc3QgZmlsdGVyQmFyUHJvcGVydGllcyA9IEZpbHRlclV0aWxzLmdldEZpbHRlclByb3BlcnR5SW5mbyhmaWx0ZXJCYXIgYXMgdW5rbm93biBhcyBJRmlsdGVyQ29udHJvbCk7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBmaWx0ZXJCYXIuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHQvLyBQcm9wYWdhdGUgT1VUIHBhcmFtZXRlciBvbmx5IGlmIHRoZSBmaWx0ZXIgZmllbGQgaXMgdmlzaWJsZSBpbiB0aGUgTFIgZmlsdGVyYmFyXG5cdFx0XHQvLyBMUiBGaWx0ZXJCYXIgb3IgTFIgQWRhcHRGaWx0ZXJcblx0XHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyQmFyUHJvcGVydHkgPSB0aGlzLl9maW5kRmlsdGVyQmFyUHJvcGVydHlCeUFubm90YXRpb25QYXRoKFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcixcblx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdFx0ZmlsdGVyQmFyUHJvcGVydGllc1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoZmlsdGVyQmFyUHJvcGVydHkgJiYgc3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdC8qIFJlc2V0IHRoZSBjb25kaXRpb25zIGJlZm9yZSBjcmVhdGUgbmV3IGNvbmRpdGlvbnMgb3RoZXJ3aXNlIGl0IGdldHMgbm90IHVwZGF0ZWQgKi9cblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXRoID0gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCBhcyBzdHJpbmc7XG5cdFx0XHRcdFx0c3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdPy5mb3JFYWNoKChjb25kaXRpb24pID0+IHtcblx0XHRcdFx0XHRcdGNvbmRpdGlvbi5maWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBQcm9wYWdhdGUgT1VUIHBhcmFtZXRlciBmb3IgZWFjaCBjb25kaXRpb25zXG5cdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKTtcblx0XHRcdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0XHRcdG91dFBhcmFtZXRlcixcblx0XHRcdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0ZmlsdGVyQmFyUHJvcGVydGllc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0XHRcdC8vIExSIEZpbHRlckJhciBvciBMUiBBZGFwdEZpbHRlclxuXHRcdFx0XHRcdGlmIChmaWx0ZXJCYXJQcm9wZXJ0eSAmJiBzdGF0ZUl0ZW1zPy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGZpbHRlckJhclByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvblBheWxvYWQgb2YgY29uZGl0aW9uUGF5bG9hZExpc3QpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFx0W2NvbmRpdGlvblBheWxvYWRbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXV0sXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF0aCA9IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggYXMgc3RyaW5nO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25BbHJlYWR5RXhpc3RzID0gc3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdPy5maW5kKCh0ZXN0Q29uZGl0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRlc3RDb25kaXRpb24uZmlsdGVyZWQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuY2hlY2tDb25kaXRpb25zRXF1YWwodGVzdENvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIHJlc2V0IGZpbHRlcmVkIHRvIGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0dGVzdENvbmRpdGlvbi5maWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uQWxyZWFkeUV4aXN0cykge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXSB8fD0gW107XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdLnB1c2gobmV3Q29uZGl0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQXBwbHkgdG8gdGhlIHBhcmVudCBvZiB0aGUgRmlsdGVyRmllbGRcblx0XHRcdFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyLCBzdGF0ZSk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0TG9nLmVycm9yKGBWYWx1ZUhlbHBEZWxlZ2F0ZTogJHttZXNzYWdlfWApO1xuXHRcdH1cblx0fSxcblxuXHRfZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aDogZnVuY3Rpb24gKFxuXHRcdG91dFBhcmFtZXRlcjogSW5PdXRQYXJhbWV0ZXIsXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzOiBQcm9wZXJ0eUluZm9bXVxuXHQpIHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGAvJHtwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzFdfWA7XG5cdFx0Y29uc3QgZmlsdGVyVGFyZ2V0ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpIHx8IFwiXCI7XG5cdFx0Y29uc3QgbGFzdEluZGV4ID0gcHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRjb25zdCBmaWx0ZXJUYXJnZXRQYXRoID0gbGFzdEluZGV4ID4gMCA/IGAke3Byb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KX0vJHtmaWx0ZXJUYXJnZXR9YCA6IGZpbHRlclRhcmdldDtcblx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0UmVkdWNlZFBhdGgoZmlsdGVyVGFyZ2V0UGF0aCwgY29udGV4dFBhdGgpO1xuXHRcdHJldHVybiBmaWx0ZXJCYXJQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uYW5ub3RhdGlvblBhdGggPT09IGFubm90YXRpb25QYXRoKTtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwXG5cdCkge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKSxcblx0XHRcdFx0b3V0VmFsdWVzID0gY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID09PSAxID8gY29uZGl0aW9uUGF5bG9hZExpc3RbMF0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTGlzdC5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiVmFsdWVIZWxwRGVsZWdhdGU6IFBhcmFtZXRlck91dCBpbiBtdWx0aS12YWx1ZS1maWVsZCBub3Qgc3VwcG9ydGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG91dFZhbHVlcykge1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkobWV0YU1vZGVsLCBvdXRWYWx1ZXMsIG91dFBhcmFtZXRlcnMsIGNvbnRleHQsIHZhbHVlSGVscCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdG91dFZhbHVlczogQ29uZGl0aW9uUGF5bG9hZFR5cGUsXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyA9IGNvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdHJ1ZSAmJiAhY29udGV4dC5pc0luYWN0aXZlKCk7XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRcdHRoaXMuX3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyKFxuXHRcdFx0XHRjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0cm9vdFBhdGgsXG5cdFx0XHRcdG91dFZhbHVlcyxcblx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzXG5cdFx0XHQpO1xuXHRcdFx0b3V0UGFyYW1ldGVyU291cmNlcy5wdXNoKG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdH1cblx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh2YWx1ZUhlbHApO1xuXHRcdGNvbnN0IGNvbGxhYm9yYXRpdmVEcmFmdCA9IHZpZXcuZ2V0Q29udHJvbGxlcigpLmNvbGxhYm9yYXRpdmVEcmFmdDtcblx0XHRpZiAoY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgb3V0UGFyYW1ldGVyU291cmNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyB3ZSBkZXRlcm1pbmUgdGhlIGJpbmRpbmcgdGhhdCBzZW5kcyB0aGUgcmVxdWVzdFxuXHRcdFx0bGV0IGJpbmRpbmc7XG5cdFx0XHRpZiAoY29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0YmluZGluZyA9IGNvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmluZGluZyA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdFx0XHRcdFx0IFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRjb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHM6IGJvb2xlYW5cblx0KSB7XG5cdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYCR7cm9vdFBhdGh9LyR7b3V0UGFyYW1ldGVyLnNvdXJjZX1gO1xuXHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gY29udmVydGVkTWV0YWRhdGEucmVzb2x2ZVBhdGg8UHJvcGVydHk+KHByb3BlcnR5UGF0aCkudGFyZ2V0O1xuXHRcdGNvbnN0IGZpZWxkQ29udHJvbCA9IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWVsZENvbnRyb2w7XG5cdFx0Y29uc3QgZHluYW1pY1JlYWRPbmx5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRDb250cm9sKSA/IGNvbnRleHQuZ2V0UHJvcGVydHkoZmllbGRDb250cm9sLnBhdGgpID09PSAxIDogZmFsc2U7XG5cdFx0aWYgKGR5bmFtaWNSZWFkT25seSAmJiBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHQvKiBOb24tVHJhbnNpZW50IGFuZCBhY3RpdmUgY29udGV4dCAqL1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBvdXRQYXJhbWV0ZXIuc291cmNlLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogb3V0UGFyYW1ldGVyLnNvdXJjZTtcblx0XHRcdC8qIFdlIHNlbmQgWzxwcm9wZXJ0eU5hbWU+XSBpbiBjYXNlIG9mIGEgcHJvcGVydHkgcGF0aCB3aXRob3V0IGFueSBuYXZpZ2F0aW9uIGludm9sdmVkICovXG5cdFx0XHQvKiBJbiBjYXNlIG9mIGEgcGF0aCBpbnZvbHZpbmcgbmF2aWdhdGlvbnMsIHdlIHNlbmQgWzxuYXZpZ2F0aW9uUGF0aD5dIGVuZGluZyB3aXRoIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgbm90IHdpdGggYSBwcm9wZXJ0eSAqL1xuXHRcdFx0Y29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyAodHJhbnNpZW50IGNvbnRleHQpIGNhbsK0dCBoYXZlIGluc3RhbnQgc3BlY2lmaWMgKGR5bmFtaWMpIHJlYWQtb25seSBmaWVsZHMsIHRoZXJlZm9yZSB3ZSBkb27CtHQgbmVlZCB0byBoYW5kbGUvY29uc2lkZXIgdGhpcyBjYXNlIHNwZWNpZmljYWxseSAqL1xuXHRcdFx0LyogQWRkaXRpb25hbCBpbmZvczogKi9cblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyBpcyBvbmx5IHVzZWQgYnkgU0QgKi9cblx0XHRcdC8qIFRoZSBncm91cCBJRCAodGhpcmQgYXJndW1lbnQgb2Ygc2V0UHJvcGVydHkgZGVzY3JpYmVkIGFwaSBkb2N1bWVudGF0aW9uIG9mIHRoZSBDb250ZXh0KSBpcyB1c2VkIGZvciB0aGUgUEFUQ0ggcmVxdWVzdCwgaWYgbm90IHNwZWNpZmllZCwgdGhlIHVwZGF0ZSBncm91cCBJRCBmb3IgdGhlIGNvbnRleHQncyBiaW5kaW5nIGlzIHVzZWQsICdudWxsJyB0byBwcmV2ZW50IHRoZSBQQVRDSCByZXF1ZXN0ICovXG5cdFx0XHQvKiBUaGUgVHJhbnNpZW50IGNvbnRleHQgY2Fubm90IHJlcXVlc3QgU2lkZUVmZmVjdHMgYW5kICBjYW5ub3QgcGF0Y2ggdmlhIGdyb3VwICdudWxsJyAqL1xuXHRcdFx0Y29uc3QgY3VycmVudFZhbCA9IGNvbnRleHQuZ2V0UHJvcGVydHkob3V0UGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0XHRjb25zdCBuZXdWYWwgPSBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXTtcblx0XHRcdGlmIChjdXJyZW50VmFsICE9PSBuZXdWYWwpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBudWxsKTtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qIElmIHRoZSBrZXkgZ2V0cyB1cGRhdGVkIHZpYSBvdXQtcGFyYW1ldGVyLCB0aGVuIHRoZSBkZXNjcmlwdGlvbiBuZWVkcyBhbHNvIHJldHJpZXZlZCB3aXRoIHJlcXVlc3RTaWRlRWZmZWN0cyAqL1xuXHRcdGNvbnN0IHRleHRQYXRoID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpXG5cdFx0XHQ/IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LnBhdGhcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmICh0ZXh0UGF0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHRleHRQYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogdGV4dFBhdGg7XG5cdFx0XHQvKiBUaGUgc2lkZUVmZmVjdFBhdGggY2FuIGJlIFs8cHJvcGVydHlOYW1lPl0gb3IgWzxuYXZpZ2F0aW9uUGF0aD5dICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgbWFwIG9mIGNvbmRpdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczpcblx0ICogSW5pdGlhbCBzZXQgb2YgY29uZGl0aW9ucyBhcHBsaWVkIGV2ZXJ5IHRpbWUgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSBvcGVuaW5nIGl0cyBjb250YWluZXIuXG5cdCAqIERldGFpbGVkIHNldCBvZiBjb25kaXRpb25zIGluIGdldEl0ZW1Gb3JWYWx1ZSBzY2VuYXJpb3MgdGhhdCBhbGxvdyB5b3UgdG8gZmluZCBhIHNwZWNpZmljIHZhbHVlIGhlbHAgaXRlbSAoaW5kaWNhdGVkIGJ5IGNvbmZpZyBhdmFpbGFiaWxpdHkpLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byBhIG1hcCBvZiBjb25kaXRpb25zXG5cdCAqL1xuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbmZpZz86IE1EQ0NvbmZpZ1R5cGUpIHtcblx0XHRpZiAodGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnModmFsdWVIZWxwLCBjb250ZW50LCAoY29uZmlnICYmIGNvbmZpZy5jb250cm9sKSB8fCAoY29udGVudCAmJiBjb250ZW50LmdldENvbnRyb2woKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4ge307XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIGludm9rZWQgZXZlcnkgdGltZSBhIHtAbGluayBzYXAudWkubWRjLlZhbHVlSGVscCBWYWx1ZUhlbHB9IGZpcmVzIGEgc2VsZWN0IGV2ZW50IG9yIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBjaGFuZ2VzXG5cdCAqIFRoaXMgY2FsbGJhY2sgbWF5IGJlIHVzZWQgdG8gdXBkYXRlIGV4dGVybmFsIGZpZWxkcy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZSByZWNlaXZpbmcgdGhlIDxjb2RlPmNvbnRyb2xDaGFuZ2U8L2NvZGU+XG5cdCAqIEBwYXJhbSByZWFzb24gUmVhc29uIHdoeSB0aGUgbWV0aG9kIHdhcyBpbnZva2VkXG5cdCAqIEBwYXJhbSBfY29uZmlnIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRvbkNvbmRpdGlvblByb3BhZ2F0aW9uOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIHJlYXNvbjogc3RyaW5nLCBfY29uZmlnOiB1bmtub3duKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAocmVhc29uICE9PSBcIkNvbnRyb2xDaGFuZ2VcIiB8fCBwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHQvLyBoYW5kbGUgb25seSBDb250cm9sQ2hhbmdlIHJlYXNvblxuXHRcdFx0Ly8gYWxzbyBkb24ndCBoYW5kbGUgZm9yIGRlZmluZSBjb25kaXRpb24gdmFsdWUgaGVscCBhcyBwcm9wYWdhdGluZyBjb25kaXRpb25zIG9uIHRoZSB2YWx1ZSBoZWxwXG5cdFx0XHQvLyB0byBkZWZpbmUgY29uZGl0aW9ucyBkb2VzIG5vdCBtYWtlIHNlbnNlIGJ1dCB3b3VsZCBvbmx5IGNvbmZ1c2UgdXNlcnMgYnkgYWxsb3dpbmcgcmVjdXJzaXZlIHVzZVxuXHRcdFx0Ly8gb2YgdGhlIGNvbmRpdGlvbiB2YWx1ZSBoZWxwXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyhxdWFsaWZpZXIudmhQYXJhbWV0ZXJzKSA6IFtdLFxuXHRcdFx0ZmllbGQgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpIGFzIEZpZWxkQmFzZSxcblx0XHRcdGZpZWxkUGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7XG5cblx0XHRsZXQgY29uZGl0aW9ucyA9IGZpZWxkLmdldENvbmRpdGlvbnMoKSBhcyBDb25kaXRpb25PYmplY3RbXTtcblx0XHRpZiAoIXBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdHRoaXMuX3NldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbmRpdGlvbnMsIGZpZWxkKTtcblx0XHR9XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7IC8vIENvbnRyb2wgZS5nLiBGb3JtQ29udGFpbmVyXG5cdFx0aWYgKGxpc3RSZXBvcnRGaWx0ZXJCYXIuaXNBKEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyKSAmJiBvdXRQYXJhbWV0ZXJzLmxlbmd0aCAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Ly8gUHJvcGFnYXRlIHRoZSB2YWx1ZSBvbmx5IGlmIHRoZSBGaWx0ZXJGaWVsZCBpcyBwYXJ0IG9mIHRoZSBMUi1GaWx0ZXJCYXIgYWxzbyBpbnNpZGUgaW4gQWRhcHQgRmlsdGVycyBkaWFsb2dcblx0XHRcdGF3YWl0IHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0ZpbHRlckJhcihcblx0XHRcdFx0Y29uZGl0aW9ucyxcblx0XHRcdFx0b3V0UGFyYW1ldGVycyxcblx0XHRcdFx0ZmllbGRQYXJlbnQgYXMgRmlsdGVyQmFyLFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0UmVwb3J0RmlsdGVyQmFyIGFzIEZpbHRlckJhclxuXHRcdFx0KTtcblx0XHRcdC8vIExSIFNldHRpbmdzIERpYWxvZyBvciBPUCBTZXR0aW5ncyBEaWFsb2cgc2hhbGwgbm90IHByb3BhZ2F0ZSB2YWx1ZSB0byB0aGUgZGlhbG9nIGZpbHRlcmZpZWxkcyBvciBjb250ZXh0XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9iamVjdCBQYWdlXG5cdFx0XHQvKiBUbyBhdm9pZCB0aW1pbmcgaXNzdWUgd2UgdXNlIHRoZSBCaW5kaW5nQ29udGV4dCBvZiB0aGUgY29udHJvbCBpbnN0ZWFkIG9mIHRoZSBWYWx1ZUhlbHAgKEJDUCAyMzgwMDU3MjI3KSAqL1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofUBzYXB1aS5uYW1lYCk7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGNvbmRpdGlvbnNbMF0gOiAoe30gYXMgQ29uZGl0aW9uT2JqZWN0KTtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZEtleXMgPSBjb25kaXRpb24/LnBheWxvYWQgPyBPYmplY3Qua2V5cyhjb25kaXRpb24ucGF5bG9hZCkgOiBbXTtcblx0XHRcdFx0cGF5bG9hZEtleXMuZm9yRWFjaCgocGF5bG9hZEtleSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWQgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bcGF5bG9hZEtleV0/LlswXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkKTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleSA9IGNvbmRpdGlvblZhbHVla2V5cy5maW5kKCh2YWx1ZUtleSkgPT4gdmFsdWVLZXkuaW5jbHVkZXMoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpO1xuXHRcdFx0XHRcdGlmIChjb25kaXRpb25WYWx1ZWtleSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5VmFsdWUgPSBjb25kaXRpb25QYXlsb2FkW2NvbmRpdGlvblZhbHVla2V5XTtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBrZXlWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQoY29uZGl0aW9ucywgb3V0UGFyYW1ldGVycywgY29udGV4dCwgdmFsdWVIZWxwKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5pdGlhbCBmaWx0ZXIgY29uZGl0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICogQHBhcmFtIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICovXG5cdF9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50OiBib29sZWFuKSB7XG5cdFx0bGV0IGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy5lcnJvcihcIlZhbHVlSGVscERlbGVnYXRlOiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlcXVlc3RlZFwiKTtcblx0XHR9IGVsc2UgaWYgKCh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCkge1xuXHRcdFx0Y29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcIkVtcHR5XCIsIFtdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFwiXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IE5vIEJpbmRpbmdDb250ZXh0XCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udHJvbC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGxldCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbWV0ZXIpID0+IGluUGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0LyogSW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIsIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBpbi1wYXJhbWV0ZXJzLiAqL1xuXHRcdC8qIFdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgaW4tcGFyYW1ldGVyIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgYmluZGluZyBjb250ZXh0LlxuSW4gc29tZSBjYXNlcyAoZS5nLiBtdWx0aSB2YWx1ZSBmaWVsZCksIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3QgcG9pbnQgdG8gdGhlXG5WSCBhbm5vdGF0aW9uIHRhcmdldCwgdGh1cyB3ZSBpZGVudGlmeSB0aGUgbmVlZGVkIG5hdmlnYXRpb24gcmVsYXRpb24gYnlcbnJlZHVjaW5nIHRoZSBwYXlsb2FkLnByb3BlcnR5UGF0aCBieSB0aGUgcGF0aCBkZXJpdmVkIGZyb20gYmluZGluZyBjb250ZXh0LlxuVGhpcyBjYW5ub3QgaGFwcGVuIGluIGNhc2Ugb2YgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXRoIFwiJFBhcmFtZXRlclwiLlxuKi9cblxuXHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIGZpbHRlciBwcm9wZXJ0eSB3aXRoIG5hdmlnYXRpb24gcGF0aCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbWV0YWRhdGEgYXJlIG5vdCB3ZWxsIGRlZmluZWRcblx0XHRsZXQgbWV0YURhdGFFcnJvciA9IGZhbHNlO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHBheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdFx0Ly9Gb3IgYSBWSCBvbiBhbiBhY3Rpb24gZGlhbG9nIHBhcmFtZXRlciB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZmlsbCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0Ly93aXRoIHRoZSBhY3Rpb24gZXZlbiB0aG91Z2ggbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBleGlzdHMgLT4gbGVhdmUgbmF2aWdhdGlvblByb3BlcnR5UGF0aCBlbXB0eVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IHBheWxvYWQucHJvcGVydHlQYXRoLnJlcGxhY2UoYC8ke3Byb3BlcnR5TmFtZX1gLCBcIlwiKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QobmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikgJiYgbmF2aWdhdGlvblByb3BlcnR5ICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4kUGFydG5lciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL0Nhc2UgbWRjLk11bHRpVmFsdWVGaWVsZDogdGhlICRQYXJ0bmVyIChhc3NvY2lhdGlvbiB0byBvbmUpIGlzIGEgcHJlY29uZGl0aW9uIHRvIHJlcXVlc3QgdGhlIGZpbHRlciB2YWx1ZVxuXHRcdFx0Ly9FeGNlcHRpb246IFdoZW4gdGhlIE11bHRpVmFsdWVGaWVsZCBpcyBhbiBhY3Rpb24gcGFyYW1ldGVyIHRoZW4gdGhlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBpcyB1c2VkIHRvIGZpbGwgdGhlIGluIHBhcmFtZXRlciBhbmRcblx0XHRcdC8vbm8gJFBhcnRuZXIgYXNzb2NpYXRpb24gaXMgbmVlZGVkLiBGb3Igc3VjaCBjYXNlcyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGlzIG5vIGZpbGxlZFxuXHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRgVmFsdWVIZWxwRGVsZWdhdGU6IEJlY2F1c2Ugb2YgbWlzc2luZyBwYXJ0bmVyIGRlZmluaXRpb24sIHRoZSBmaWx0ZXIgdmFsdWUgZm9yIFZhbHVlTGlzdFBhcmFtZXRlckluIHByb3BlcnR5IGNhbiBub3QgcmVxdWVzdGVkLmBcblx0XHRcdCk7XG5cdFx0XHRtZXRhRGF0YUVycm9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRQYXJ0bmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QgPSB0aGlzLl9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3QocHJvcGVydGllc1RvUmVxdWVzdCwgcm9vdFBhdGgsIG1ldGFNb2RlbCwgcGF5bG9hZC5wcm9wZXJ0eVBhdGgpO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFEYXRhRXJyb3IpIHtcblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgJGF1dG8gaXMgdXNlZCBpbiBjYXNlIG9mIGNyZWF0aW9uIHJvdy5cblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgc3VibWl0TGF0ZXIgaW4gY2FzZSBvZiBjcmVhdGUgZGlhbG9nLlxuXHRcdFx0Ly8gV2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FzZSBvZiBpc0luYWN0aXZlIGNvbnRleHQsIHdoaWNoIGlzIG5vdCB5ZXQgY3JlYXRlZC5cblx0XHRcdGNvbnN0IGNvbnRleHRVbmRlckNyZWF0aW9uID1cblx0XHRcdFx0YmluZGluZ0NvbnRleHQuaXNUcmFuc2llbnQoKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHQhYmluZGluZ0NvbnRleHQuaXNJbmFjdGl2ZSgpICYmXG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKT8uc3RhcnRzV2l0aChcIiRhdXRvXCIpO1xuXHRcdFx0bGV0IGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSBbXTtcblx0XHRcdGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSAoYmluZGluZ0NvbnRleHQuZ2V0TWVzc2FnZXMoKSA/PyBbXSkuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdFx0XHR9KTtcblx0XHRcdC8vIFdlIGF3YWl0IGNyZWF0aW9uIGlmIGl0IGlzIHN0aWxsIGluIHByb2Nlc3MuXG5cdFx0XHRpZiAoY29udGV4dFVuZGVyQ3JlYXRpb24gJiYgIWVycm9yTWVzc2FnZXNJbkNvbnRleHQ/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBiaW5kaW5nQ29udGV4dD8uY3JlYXRlZCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWNjb3JkaW5nIHRvIG9kYXRhIHY0IGFwaSBkb2N1bWVudGF0aW9uIGZvciByZXF1ZXN0UHJvcGVydHk6IFByb3BlcnR5IHZhbHVlcyB0aGF0IGFyZSBub3QgY2FjaGVkIHlldCBhcmUgcmVxdWVzdGVkIGZyb20gdGhlIGJhY2sgZW5kXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGluUGFyYW1ldGVyID0gaW5QYXJhbWV0ZXJzW2ldO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKHZhbHVlc1tpXSwgaW5QYXJhbWV0ZXIuaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCk7XG5cblx0XHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFx0XHRUaGUgaW5QYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uLCBpLmUuIHRoZWlyIHNvdXJjZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0IChvciBtb3JlIHByZWNpc2VseSB0aGUgRW50aXR5U2V0IHRoZSBhbm5vdGF0aW9uIHRhcmdldCBiZWxvbmdzIHRvKS4gVGhlIGFubm90YXRpb24gdGFyZ2V0IGlzIHRoZSBwcm9wZXJ0eSB0aGUgdmFsdWUgaGVscCBpcyBkZWZpbmVkIGZvci5cblx0XHRcdFx0VG8gcmVxdWVzdCB0aGUgdmFsdWVzIGZvciB0aGUgaW5QYXJhbWV0ZXJzIGZyb20gdGhlIGJpbmRpbmdDb250ZXh0ICh0aGUgY29udHJvbCBpcyBib3VuZCB0byksIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoaXMgdG8gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nQ29udGV4dC4gVGhpcyBkaWZmZXJzLCBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQgZm9yIGEgZGlyZWN0IHByb3BlcnR5LCBidXQgd2l0aCBhIHBhdGggY29udGFpbmluZyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgKGVzcC4gbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aSB2YWx1ZSBmaWVsZHMpLlxuXHRcdFx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFx0XHRTbyBmYXIsIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggb2YgdGhlIGJpbmRpbmdDb250ZXh0IGZyb20gdGhlIGxlZnQgc2lkZSwgYW5kIHRoZSBsYXN0IHNlZ21lbnQgKHRoZSBwcm9wZXJ0eSBpdHNlbGYpIGZyb20gdGhlIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwcm9wZXJ0eVBhdGggcHJvdmlkZWQgaW4gdGhlIHBheWxvYWQsIHRvIGdldCBhIG1ldGFQYXRoIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dCB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQuXG5cdFx0XHRcdElmIHRoaXMgbWV0YVBhdGggY29udGFpbnMgMTpuLW5hdmlnYXRpb25zICh3aGljaCBjYW5ub3QgYmUgdHJhbnNsYXRlZCBiYWNrIHRvIGEgcGF0aCwgYXMgdGhpcyB3b3VsZCBtZWFuIHRvIGFkZCBjb3JyZXNwb25kaW5nIGtleXMsIHdoaWNoIGFyZSBub3Qga25vd24pLCB0aGUgc291cmNlIHBhdGggaW4gdGhlIGluUGFyYW1ldGVyIGRlZmluaXRpb24gb2YgdGhlIHZhbHVlIG5lZWRzIHRvIHBvaW50IGJhY2sgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcGFydG5lciBuYXZpZ2F0aW9uKHMpIHRvIGF2b2lkIGFtYmlndW91cyBkZWZpbml0aW9uIG9mIGhvdyB0byBnZXQgaXRzIHZhbHVlLlxuXHRcdFx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0XHRcdElmIHRoaXMgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwgd2UgY2FuIGNvbWJpbmUgdGhlIGFuZCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIGJpbmRpbmcgY29udGV4dC4gSWYgbm90LCB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IHRvIHJldHJpZXZlIHRoZSBpblBhcmFtZXRlcnMgdmFsdWUgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5LCBpLnQuIHRoZSB2YWx1ZSBoZWxwIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS5cblx0XHRcdFx0Ki9cblx0XHQvLyBjb21tb24gZm9yIGFsbCBpblBhcmFtZXRlcnNcblx0XHRsZXQgbWV0YU1vZGVsQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChyb290UGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFydDogcGFydCxcblx0XHRcdFx0XHRwYXJ0bmVyOiBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLiRQYXJ0bmVyXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHQvLyBhY3R1YWwgcmVkdWN0aW9uIHBlciBpblBhcmFtZXRlclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzVG9SZXF1ZXN0Lm1hcCgobG9jYWxEYXRhUGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgbG9jYWxEYXRhUGFydHMgPSBsb2NhbERhdGFQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5maW5kSW5kZXgoXG5cdFx0XHRcdChcblx0XHRcdFx0XHRwYXJ0LFxuXHRcdFx0XHRcdGluZGV4IC8vIGZpbmQgZmlyc3Qgbm9uLW1hdGNoaW5nIGluZGV4XG5cdFx0XHRcdCkgPT4gcmVsYXRpdmVQYXRoUGFydHNbLWluZGV4XT8ucGFydG5lciAhPT0gcGFydFxuXHRcdFx0KTsgLy8gcmVsYXRpdmVQYXRoUGFydHMgdG8gbWF0Y2ggZnJvbSB0aGUgZW5kICg9PiBcIi1pbmRleFwiKSB0byBsb2NhbERhdGFQYXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmdcblx0XHRcdC8vIGxhc3QgcGFydCBvZiBsb2NhbERhdGEgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aHVzIGl0IGNhbm5vdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoQ291bnQgY291bGQgYmUgLTEgaWYgZXZlcnl0aGluZyBtYXRjaGVzXG5cdFx0XHQvLyAoaWYgd2Ugd2FudCB0byBhZGRpdGlvbmFsbHkgc2VjdXJlIGFnYWluc3QgdGhpcyBzaXR1YXRpb24sIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdvdWxkIGJlIHRvIHNldCBtYXRjaENvdW50ID0gbG9jYWxEYXRhUGFydHMubGVuZ3RoIOKAkyAxKVxuXHRcdFx0cmV0dXJuIHJlbGF0aXZlUGF0aFBhcnRzXG5cdFx0XHRcdC5zbGljZSgwLCAtbWF0Y2hDb3VudCkgLy8gcmVtb3ZlIGFsbCBtYXRjaGVkIHBhcnRzIChmcm9tIHRoZSBlbmQpXG5cdFx0XHRcdC5tYXAoKHBhcnQpID0+IHBhcnQucGFydClcblx0XHRcdFx0LmNvbmNhdChsb2NhbERhdGFQYXJ0cy5zbGljZShtYXRjaENvdW50KSkgLy8gcmVtb3ZlIHRoZSBtYXRjaGVkIHBhcnRzIGZyb20gbG9jYWxEYXRhIChmcm9tIHRoZSBiZWdpbm5pbmcpXG5cdFx0XHRcdC5qb2luKFwiL1wiKTsgLy8gdHJhbnNmZXIgYmFjayB0byBzdHJpbmcgKGJ1dCBvbmx5IG9uY2UgYXQgdGhlIGVuZCA7KSApXG5cdFx0fSk7XG5cdH0sXG5cblx0X2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmlsdGVyQmFyLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0aW5QYXJhbWV0ZXIsXG5cdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlckJhclByb3BlcnR5ID8gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCA6IGluUGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpO1xuXG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihzb3VyY2VGaWVsZCBhcyBzdHJpbmcsIHN0YXRlKTtcblx0XHRcdGlmIChjb25kaXRpb25zKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBjb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgY29uZGl0aW9ucy5cblx0ICogUmVnYXJkaW5nIGEgbmF2aWdhdGlvbiBwYXRoIGluIHRoZSBJbk91dCBwYXJhbWV0ZXJzIGFuZCBkaXNyZWdhcmRpbmcgcHJlZml4ZXMgaW4gdGhlIG5hdmlnYXRpb24gcGF0aCBsaWtlIGUuZy4gJyRmaWx0ZXJzPi9jb25kaXRpb25zLycgb3IgJ293bmVyJy5cblx0ICogQHBhcmFtIHNvdXJjZUZpZWxkIEluUGFyYW1ldGVyIHByb3BlcnR5IG9mIHRoZSBmaWx0ZXIgZmllbGQgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc3RhdGUgVGhlIGV4dGVybmFsIGZpbHRlciBzdGF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnNcblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdF9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyOiBmdW5jdGlvbiAoc291cmNlRmllbGQ6IHN0cmluZywgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IGtleSA9PT0gc291cmNlRmllbGQpOyAvLyBjb25kaXRpb24gcGF0aCBvZiB0aGUgZmlsdGVyIGZpZWxkXG5cdFx0cmV0dXJuIGtleSAmJiBzdGF0ZS5maWx0ZXJba2V5XTtcblx0fSxcblxuXHRfcGFydGl0aW9uSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoaW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdKSB7XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIEluT3V0UGFyYW1ldGVyW10+ID0ge1xuXHRcdFx0Y29uc3RhbnQ6IFtdLFxuXHRcdFx0YmluZGluZzogW10sXG5cdFx0XHRmaWx0ZXI6IFtdXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoaW5QYXJhbWV0ZXIuY29uc3RhbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmNvbnN0YW50LnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIGlmIChpblBhcmFtZXRlci5zb3VyY2UuaW5kZXhPZihcIiRmaWx0ZXJcIikgPT09IDApIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuZmlsdGVyLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuYmluZGluZy5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluUGFyYW1ldGVyTWFwO1xuXHR9LFxuXG5cdF90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGU6IHtcblx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmdW5jdGlvbiAoZXZlbnQ6IGpRdWVyeS5FdmVudCAmIHsgc3JjQ29udHJvbDogQ29udHJvbCB9KSB7XG5cdFx0XHRjb25zdCB0YWJsZSA9IGV2ZW50LnNyY0NvbnRyb2wsIC8vIG0uVGFibGVcblx0XHRcdFx0dGFibGVDZWxsc0RvbVJlZnMgPSB0YWJsZS4kKCkuZmluZChcInRib2R5IC5zYXBNVGV4dFwiKSxcblx0XHRcdFx0bWRjTVRhYmxlID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgTVRhYmxlO1xuXG5cdFx0XHRoaWdobGlnaHRET01FbGVtZW50cyh0YWJsZUNlbGxzRG9tUmVmcywgbWRjTVRhYmxlLmdldEZpbHRlclZhbHVlKCksIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYW4gaW5pdGlhbCBjb25kaXRpb24gY29uZmlndXJhdGlvbiBldmVyeXRpbWUgYSB2YWx1ZSBoZWxwIGNvbnRlbnQgaXMgc2hvd24uXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgbWFwIG9mIGNvbmRpdGlvbnMgc3VpdGFibGUgZm9yIGEgc2FwLnVpLm1kYy5GaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0Z2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogQ29udGVudCwgY29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIGhpZ2hsaWdodCB0ZXh0IGluIFZhbHVlSGVscCBwb3BvdmVyXG5cdFx0aWYgKGNvbnRlbnQ/LmlzQTxNVGFibGU+KFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRyeVt2aEtleV0gPSBudWxsOyAvLyBudWxsIHZhbHVlIGlzIGFsc28gdmFsaWRcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gY3VzdG9taXplIHNlbGVjdGlvbnMgaW4gJ1NlbGVjdCBmcm9tIGxpc3QnIHNjZW5hcmlvcy5cblx0ICogQnkgZGVmYXVsdCwgb25seSBjb25kaXRpb24ga2V5cyBhcmUgY29uc2lkZXJlZC4gVGhpcyBtYXkgYmUgZXh0ZW5kZWQgd2l0aCBwYXlsb2FkIGRlcGVuZGVudCBmaWx0ZXJzLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIHNlbGVjdGVkIGl0ZW1cblx0ICogQHBhcmFtIGNvbmRpdGlvbnMgQ3VycmVudCBjb25kaXRpb25zXG5cdCAqIEByZXR1cm5zIENvbmRpdGlvbnMgb3IgW11cblx0ICovXG5cdGZpbmRDb25kaXRpb25zRm9yQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXVxuXHQpIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdC8qIERvIG5vdCBjb25zaWRlciBcIk5vdFZhbGlkYXRlZFwiIGNvbmRpdGlvbnMgKi9cblx0XHRjb25kaXRpb25zID0gY29uZGl0aW9ucy5maWx0ZXIoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cblx0XHRjb25zdCB2aEtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aEtleXMgfHwgW107XG5cdFx0Y29uc3Qga2V5UGF0aCA9IGNvbnRlbnQuZ2V0S2V5UGF0aCgpO1xuXHRcdGNvbnN0IHZhbHVlSGVscFF1YWxpZmllciA9IHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyIHx8IFwiXCI7XG5cdFx0Y29uc3QgZmluZENvbmRpdGlvbiA9IChjb25kaXRpb25QYXlsb2FkTWFwOiBDb25kaXRpb25QYXlsb2FkTWFwLCB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpOiBib29sZWFuID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblNlbGVjdGVkUm93ID0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXSB8fCB7fTtcblx0XHRcdGlmICh2aEtleXMubGVuZ3RoID09PSAxIHx8IHBheWxvYWQ/LnVzZU11bHRpVmFsdWVGaWVsZCB8fCAhY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSB2YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoY29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdHJldHVybiB2aEtleXMuZXZlcnkoZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFjb250ZXh0S2V5cy5pbmNsdWRlcyh2aEtleSkgfHwgY29udGV4dD8uZ2V0T2JqZWN0KHZoS2V5KSA9PT0gY29uZGl0aW9uU2VsZWN0ZWRSb3dbdmhLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHNlbGVjdGVkQ29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwO1xuXHRcdFx0aWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXT8uW2tleVBhdGhdKSB7XG5cdFx0XHRcdHJldHVybiBmaW5kQ29uZGl0aW9uKGNvbmRpdGlvblBheWxvYWRNYXAsIGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0/LltrZXlQYXRoXSk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uPy52YWx1ZXNbMF0pIHtcblx0XHRcdFx0cmV0dXJuIGZpbmRDb25kaXRpb24oY29uZGl0aW9uUGF5bG9hZE1hcCwgY29uZGl0aW9uPy52YWx1ZXNbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29uZGl0aW9uID8gW3NlbGVjdGVkQ29uZGl0aW9uXSA6IFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGNvbnRleHRzIGZvciBhZGRpdGlvbmFsIHZhbHVlcyBhbmQgcmVzdW1lcyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ1dpdGhUcmFuc2llbnRDb250ZXh0czogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGZpZWxkOiBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXSxcblx0XHR0YWJsZTogVGFibGVcblx0KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzKGxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbywgc29ydGVycyk7XG5cblx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgcmVjZW50VmFsdWVzQ29udGV4dERhdGEsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIH0gPVxuXHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhKFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHRzb3J0ZXJzLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIG5vIGdyb3VwaW5nIHNob3VsZCBiZSBzaG93biBpbiB0aGUgc3VnZ2VzdGlvbiBsaXN0IGlmIHRoZSBzZWFyY2ggcmVzdWx0IG9ubHkgY29udGFpbnMgdmFsdWVzIGZyb20gdGhlICdPdGhlcnMnIGdyb3VwXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDAgJiYgcmVjZW50VmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnNvcnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBheWxvYWQ/Lmhpc3Rvcnk/LmVuYWJsZWQpIHtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSA9IHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCAhPT0gMDtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIE5vdyB3ZSBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIGxpc3RiaW5kaW5nLCBiZWZvcmUgdGhlIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgY3JlYXRlZFxuXHRcdFx0XHRhd2FpdCBsaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgY2xlYXJpbmcgdGhlIGxpc3QgYmluZGluZzogJHtlcnJvcn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIGFkZCB0cmFuc2llbnQgY29udGV4dCB0byBsaXN0IGJpbmRpbmcgYWZ0ZXIgYmFja2VuZCBxdWVyeSBpcyBkb25lXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRsaXN0QmluZGluZ1xuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9EbyBub3RoaW5nIGFzIHdlIGtub3cgdGhhdCByZXNldCBjaGFuZ2VzIHdvdWxkIHRocm93IGFuIGVycm9yIGluIGNvbnNvbGUgYW5kIHRoaXMgd2lsbCBwaWxlIHVwIGEgbG90IG9mIGNvbnNvbGUgZXJyb3JzXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdmFsdWUgaGVscCwgc3VjaCBhcyBzb3J0LCBmaWx0ZXIsIHBhcmFtZXRlcnMgZXRjLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSB8fCBsaXN0QmluZGluZztcblx0XHRpZiAoIXJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnN1c3BlbmQoKTtcblx0XHR9XG5cdFx0Ly9zb3J0IGFuZCBmaWx0ZXIgdmFsdWUgaGVscCBiaW5kaW5nIHRvIG1ha2Ugc3VyZSB3ZSByZW5kZXIgb3RoZXJzIGdyb3VwXG5cdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLnNvcnRBbmRGaWx0ZXJMaXN0QmluZGluZyhsaXN0QmluZGluZywgc29ydGVycyk7XG5cdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdGxpc3RCaW5kaW5nLmNoYW5nZVBhcmFtZXRlcnMoYmluZGluZ0luZm8ucGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vcmVzdW1lIHRoZSBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRhd2FpdCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIucmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyhsaXN0QmluZGluZyk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIGxpc3Qgb2YgYWxsIHR5cGVzIG9mIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhIChyZWNvbW1lbmRhdGlvbiwgcmVjZW50bHkgdXNlZCBhbmQgb3RoZXJzKSB0byBiZSB1c2VkLlxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBBZGRpdGlvbmFsVmFsdWVzXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aGljaCBjb250YWlucyByZWNvbW1lbmRhdGlvbnMsIHJlY2VudGx5IHVzZWQsIGFuZCBvdGhlcnMgY29udGV4dCBkYXRhLlxuXHQgKi9cblx0X2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyxcblx0XHRmaWVsZDogRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFByb21pc2U8e1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdH0+IHtcblx0XHRsZXQgeyByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSB9ID0gYXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHNvcnRlcnMsXG5cdFx0XHR0YWJsZVxuXHRcdCk7XG5cblx0XHQvLyBhcHBseSBzZWFyY2ggYW5kIGZpbHRlcnMgdG8gYWRkaXRpb25hbCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdFx0Y29uc3QgdmFsdWVIZWxwS2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0udmhLZXlzIHx8IFtdO1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXNbMF0/LnZhbHVlcyxcblx0XHRcdHZhbHVlTGlzdFByb3BlcnR5XG5cdFx0KTtcblxuXHRcdGxldCByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cdFx0aWYgKCFwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHQvLyBubyBoaXN0b3J5IGZvciB2YWx1ZXMgbGlzdHMgd2l0aCBmaXhlZCB2YWx1ZXMgKHRoZXkgYXJlIHVzdWFsbHkgc2hvcnQpXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IGF3YWl0IHRoaXMuX2dldEhpc3RvcnlEYXRhKHBheWxvYWQsIGZpZWxkKTtcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjZW50VmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0dmFsdWVIZWxwS2V5cyxcblx0XHRcdFx0KGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoPy5yZXBsYWNlQWxsKCdcIicsIFwiXCIpLFxuXHRcdFx0XHRiaW5kaW5nSW5mb1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHR2YWx1ZUhlbHBLZXlzXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGZpbHRlciBpbiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPiBhbmQgcmVzdW1lcyBpdCwgaWYgc3VzcGVuZGVkLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZzogZnVuY3Rpb24gKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHRsaXN0QmluZGluZy5maWx0ZXIoYmluZGluZ0luZm8uZmlsdGVycywgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cdFx0bGlzdEJpbmRpbmcuc29ydChiaW5kaW5nSW5mby5zb3J0ZXIpO1xuXG5cdFx0aWYgKHJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc3VtZSgpO1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGlmIGFkZGl0aW9uYWx2YWx1ZXMgZXhpc3RzIHdoaWNoIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgRGVmaW5lcyBpZiB3ZSBzaGFsbCBjaGVjayBmb3IgcmVjb21tZW5kYXRpb25zXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWVcblx0ICovXG5cdF9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0czogYXN5bmMgZnVuY3Rpb24gKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY2hlY2tSZWNvbW1lbmRhdGlvbnMgPSB0cnVlKSB7XG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBcImludGVybmFsXCIgbW9kZWwgaXMgbm90IGF2YWlsYWJsZS5cblx0XHRpZiAocGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzID0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgPyB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpIDogW107XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uVmFsdWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiByZXR1cm4gdHJ1ZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCkge1xuXHRcdFx0Ly8gbm93IGNoZWNrIGZvciByZWNlbnQgdmFsdWVzXG5cdFx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVjZW50VmFsdWVzID0gYXdhaXQgdGhpcy5fZ2V0SGlzdG9yeURhdGEocGF5bG9hZCwgY29udGVudC5nZXRDb250cm9sKCkpO1xuXHRcdFx0aWYgKHJlY2VudFZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgcmV0dXJuIHRydWVcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBSZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0ICovXG5cdGdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuXHRcdGxldCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcblx0XHRjb25zdCBpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkID1cblx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgY29udGVudC5nZXRDb250cm9sKCkuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cblx0XHRpZiAoIWlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRNb2RlbCA9IGNvbnRlbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsICYgeyBnZXRMb2NhbEFubm90YXRpb25Nb2RlbDogRnVuY3Rpb24gfTtcblx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY29udGVudE1vZGVsLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsICYmIGNvbnRlbnRNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0aWYgKGxvY2FsQW5ub3RhdGlvbk1vZGVsKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgZmllbGRQYXRoID0gY29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZyhcInZhbHVlXCIpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdHZhbHVlcyA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldE9iamVjdChgJHtiaW5kaW5nQ29udGV4dFBhdGh9LyR7ZmllbGRQYXRofUAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy50eXBlQWhlYWRWYWx1ZXNgKSA/PyBbXTtcblx0XHRcdH1cblx0XHRcdGlmICghdmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBpbnB1dFZhbHVlcyA9IChjb250ZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5nZXRQcm9wZXJ0eShcIi9yZWNvbW1lbmRhdGlvbnNEYXRhXCIpIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0dmFsdWVzID1cblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdFx0XHRpbnB1dFZhbHVlcyxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKVxuXHRcdFx0XHRcdCkgfHwgW107XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIHdoaWNoIHdpbGwgdGVsbCB3aGV0aGVyIHR5cGVhaGVhZCBzaG91bGQgYmUgb3BlbmVkIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdoZXRoZXIgdG8gc2hvdyB0eXBlYWhlYWQgb3Igbm90XG5cdCAqL1xuXHR0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudDogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNRENQb3BvdmVyKSB7XG5cdFx0bGV0IHNob3dJdCA9IHRydWU7XG5cdFx0Y29uc3QgdHlwZUFoZWFkQ29udGVudCA9IGNvbnRlbnQ/LmdldENvbnRlbnQoKVswXSBhcyBNVGFibGU7XG5cdFx0Y29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZUhlbHA/LmdldEZpbHRlclZhbHVlKCk7XG5cdFx0Y29uc3QgZmllbGQgPSB0eXBlQWhlYWRDb250ZW50LmdldENvbnRyb2woKSBhcyBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkO1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cblx0XHRpZiAoZmllbGQuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgZmllbGQuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0aWYgKCFmaWx0ZXJWYWx1ZSkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcmVjb21tZW5kYXRpb24gVVggd2UgZG9uJ3QgY2hlY2sgZm9yIHJlY29tbWVuZGF0aW9ucyBidXQgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgb25seVxuXHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgZmllbGRUZXh0VmFsdWUgPSBmaWVsZC5nZXRBZGRpdGlvbmFsVmFsdWUoKTtcblx0XHRcdGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVGV4dFZhbHVlKSB7XG5cdFx0XHRcdC8vIHZhbHVlaGVscCBoYWQgc29tZSB2YWx1ZSwgYnV0IHVzZXIgY2xlYXJlZCB0aGUgdmFsdWVcblx0XHRcdFx0Ly8gaW4gc3VjaCBjYXNlIHdlIGdldCBpbnB1dCB2YWx1ZSBhcyAnJyBhbmQgd2Ugd2lsbCByZXR1cm4gZmFsc2Vcblx0XHRcdFx0Ly9Ob3RlOiBJbiBTRHMgdXNlY2FzZSB3ZSB3YW50ZWQgdG8gb3BlbiB0aGUgdHlwZUFoZWFkIGlmIHRoZXJlIGFyZSByZWNvbW1lbmRhdGlvbnMgYW5kIHZhbHVlIGlzIGJsYW5rLCB0aGV5IHNob3VsZCBwYXNzIHVzIGEgZmxhZyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhpcyBhY2NvcmRpbmdseVxuXHRcdFx0XHRjb25zdCBpc0RpZ2l0U2VxdWVuY2UgPVxuXHRcdFx0XHRcdChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH0ke0Fubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2V9YCkgPz9cblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0aWYgKGZpZWxkLmhhc1BlbmRpbmdVc2VySW5wdXQoKSB8fCB0aGlzLl9pc0VtcHR5RGlnaXRTZXF1ZW5jZShmaWVsZFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2UpKSB7XG5cdFx0XHRcdFx0c2hvd0l0ID0gZmlsdGVyVmFsdWUgIT09IFwiXCIgfHwgKGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBjaGVjayByZWNlbnRseSB1c2VkIG9ubHlcblx0XHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIWZpbHRlclZhbHVlKSB7XG5cdFx0XHRcdHNob3dJdCA9IGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpO1xuXHRcdFx0XHQvLyBlbHNlOiB0aGUgdXNlciB0eXBlcywgd2Ugc2hhbGwgYWx3YXlzIHNob3cgdGhlIG90aGVyIHZhbHVlc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2hvd0l0O1xuXHR9LFxuXG5cdGNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IE1EQ1BvcG92ZXIpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHZhbHVlSGVscC5nZXRDb250cm9sKCk7XG5cdFx0XHRpZiAocGFyZW50Q29udHJvbCAmJiBwYXJlbnRDb250cm9sPy5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRjb25zdCBmaWVsZElkID0gcGFyZW50Q29udHJvbC5nZXRDb250ZW50KCk/LmdldElkKCk7XG5cdFx0XHRcdGNvbnN0IGlzVmlzdWFsRmlsdGVyID0gZmllbGRJZCA/IGZpZWxkSWQuaW5jbHVkZXMoXCJWaXN1YWxGaWx0ZXJcIikgOiBmYWxzZTtcblx0XHRcdFx0Ly9WaXN1YWwgRmlsdGVyIGNvbnRhaW5pbmcgdmFsdWVIZWxwIHNob3VsZCBub3Qgb3BlbiBvbiBmb2N1cyBmb3IgcmVjZW50bHkgc2VsZWN0ZWQgdmFsdWVzIG8gciByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0aWYgKGlzVmlzdWFsRmlsdGVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHZhbHVlSGVscFRhYmxlID0gY29udGVudD8uZ2V0Q29udGVudCgpWzBdIGFzIE1UYWJsZTtcblx0XHRcdGxldCBjb250cm9sOiBVSTVFbGVtZW50IHwgRGlhbG9nIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZ2V0UGFyZW50RGlhbG9nID0gZnVuY3Rpb24gKGlubmVyQ29udGVudDogVUk1RWxlbWVudCk6IERpYWxvZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRcdGNvbnRyb2wgPSBpbm5lckNvbnRlbnQ/LmdldFBhcmVudCgpIGFzIFVJNUVsZW1lbnQ7XG5cdFx0XHRcdGlmIChjb250cm9sICYmIGNvbnRyb2wuaXNBPERpYWxvZz4oXCJzYXAubS5EaWFsb2dcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sID09PSB1bmRlZmluZWQgfHwgY29udHJvbCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFBhcmVudERpYWxvZyhjb250cm9sKTtcblx0XHRcdH07XG5cdFx0XHRjb250cm9sID0gZ2V0UGFyZW50RGlhbG9nKGNvbnRlbnQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb250cm9sICYmXG5cdFx0XHRcdGNvbnRyb2wuZGF0YShcImZlX0luaXRpYWxUeXBlQWhlYWRGb2N1c0RvbmVcIikgPT09IG51bGwgJiZcblx0XHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuZ2V0RG9tUmVmKCk/LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF0uaWQgPT09IChjb250cm9sIGFzIERpYWxvZykuZ2V0SW5pdGlhbEZvY3VzKClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250cm9sLmRhdGEoXCJmZV9Jbml0aWFsVHlwZUFoZWFkRm9jdXNEb25lXCIsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkgPSBwYXlsb2FkLmhpc3RvcnkgfHwge307XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgPSB1bmRlZmluZWQ7IC8vIG5lZWRzIHRvIGJlIGluaXRpYWxpemVcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5LmVuYWJsZWQgPSBwYXlsb2FkLmhpc3RvcnkuZW5hYmxlZCA/PyBWYWx1ZUxpc3RIZWxwZXIuY2hlY2tIaXN0b3J5RW5hYmxlZCh2YWx1ZUhlbHAsIHBheWxvYWQpO1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModmFsdWVIZWxwVGFibGUsIHBheWxvYWQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYm9vbGVhbiB2YWx1ZSBkZXRlcm1pbmluZyBpZiByZXF1ZXN0U2hvd0NvbnRhaW5lciBzaGFsbCBvcGVuIHRoZSBwb3BvdmVyIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGFpbmVyIEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEBwYXJhbSByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBFbnVtIGRlZmluaW5nIHRoZSByZWFzb24gZm9yIHBvc3NpYmxlIHRyaWdnZXJcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZVxuXHQgKi9cblx0cmVxdWVzdFNob3dDb250YWluZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBNRENQb3BvdmVyLCByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbjogc3RyaW5nKSB7XG5cdFx0Ly8gRW5zdXJlIHRoZSB2YWx1ZSBoZWxwIHBvcG92ZXIgb3BlbnMgZm9yIHR5cGluZywgZmlsdGVyLCB0YXAgZXZlbnRzIGFuZCB0YWIgbmF2aWdhdGlvblxuXHRcdGlmIChbUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVGFiLCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UYXBdLmluY2x1ZGVzKHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIodmFsdWVIZWxwLCBjb250YWluZXIpO1xuXHRcdH0gZWxzZSBpZiAoW1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlR5cGluZywgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uRmlsdGVyXS5pbmNsdWRlcyhyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbikpIHtcblx0XHRcdHJldHVybiB0aGlzLnR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50KHZhbHVlSGVscCwgY29udGFpbmVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlZhbHVlSGVscFJlcXVlc3QgPT09IHJl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