@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
@@ -78,7 +78,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/fe/core/CommonUti
78
78
  const propertyPath = getTargetObjectPath(dataModelPropertyPath, true);
79
79
  const textAnnotation = property.annotations?.Common?.Text,
80
80
  textArrangement = textAnnotation?.annotations?.UI?.TextArrangement?.toString(),
81
- displayMode = textAnnotation && textArrangement && getDisplayMode(property);
81
+ displayMode = textAnnotation && textArrangement && getDisplayMode(property, dataModelPropertyPath.targetEntityType);
82
82
  if (displayMode === "Description") {
83
83
  relatedProperties[additionalPropertyPath] = additionalProperty;
84
84
  } else if (displayMode && displayMode !== "Value" || !textAnnotation) {
@@ -133,8 +133,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/fe/core/CommonUti
133
133
  } else {
134
134
  propertyInfo.path = columnDef.path;
135
135
  propertyInfo.dataType = typeConfig.className;
136
- propertyInfo.constraints = columnDef.constraints;
137
- propertyInfo.formatOptions = columnDef.formatOptions;
136
+ propertyInfo.constraints = typeConfig.typeInstance.oConstraints;
137
+ propertyInfo.formatOptions = typeConfig.typeInstance.oFormatOptions;
138
138
  propertyInfo.sortable = isSortableProperty(sortRestrictionsInfo, columnDef);
139
139
  propertyInfo.filterable = isFilterableProperty(filterRestrictionsInfo, columnDef);
140
140
  propertyInfo.maxConditions = getPropertyMaxConditions(filterRestrictionsInfo, columnDef);
@@ -428,4 +428,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepEqual", "sap/fe/core/CommonUti
428
428
  }
429
429
  return ODataTableDelegate;
430
430
  }, false);
431
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPRGF0YVRhYmxlRGVsZWdhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJUYWJsZURlbGVnYXRlIiwiZmV0Y2hQcm9wZXJ0aWVzIiwidGFibGUiLCJtb2RlbCIsIl9nZXRNb2RlbCIsInByb3BlcnRpZXMiLCJfY3JlYXRlUHJvcGVydHlJbmZvcyIsImNyZWF0ZUludGVybmFsQmluZGluZ0NvbnRleHQiLCJNYWNyb3NEZWxlZ2F0ZVV0aWwiLCJzZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzZXRQcm9wZXJ0eSIsImRpYWxvZyIsImlzQSIsImdldFBhcmVudCIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsImludGVybmFsQmluZGluZ0NvbnRleHQiLCJuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0UGF0aCIsImdldFBhdGgiLCJnZXRJZCIsImdldFByb3BlcnR5IiwibmV3SW50ZXJuYWxCaW5kaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJkYXRhTW9kZWxQcm9wZXJ0eVBhdGgiLCJkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHlQYXRoIiwiZ2V0QWRkaXRpb25hbFByb3BlcnR5IiwicmVsYXRlZFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJhZGRpdGlvbmFsUHJvcGVydHlQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidGV4dEFubm90YXRpb24iLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJ0ZXh0QXJyYW5nZW1lbnQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsInRvU3RyaW5nIiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsIm1ldGFkYXRhSW5mbyIsImdldERlbGVnYXRlIiwicGF5bG9hZCIsImVudGl0eVNldFBhdGgiLCJjb2xsZWN0aW9uTmFtZSIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlcXVlc3RPYmplY3QiLCJ0aGVuIiwiZW50aXR5U2V0QW5ub3RhdGlvbnMiLCJzb3J0UmVzdHJpY3Rpb25zSW5mbyIsImdldFNvcnRSZXN0cmljdGlvbnNJbmZvIiwiZmlsdGVyUmVzdHJpY3Rpb25zIiwiZmlsdGVyUmVzdHJpY3Rpb25zSW5mbyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0luZm8iLCJmaWx0ZXJGdW5jdGlvbnMiLCJjYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJjdXN0b21EYXRhRm9yQ29sdW1ucyIsImdldEN1c3RvbURhdGEiLCJwcm9wZXJ0aWVzVG9CZUNyZWF0ZWQiLCJkYXRhTW9kZWxFbnRpdHlQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0Q29udGV4dCIsImN1c3RvbURhdGEiLCJmb3JFYWNoIiwiY29sdW1uRGVmIiwidHlwZUNvbmZpZyIsImlzVHlwZUZpbHRlcmFibGUiLCIkVHlwZSIsImdldFR5cGVNYXAiLCJnZXRUeXBlQ29uZmlnIiwiVHlwZU1hcCIsInByb3BlcnR5SW5mbyIsImtleSIsInBhdGgiLCJsYWJlbCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGFyZ2V0UHJvcGVydHlQYXRoIiwidHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImZvcm1hdE9wdGlvbnMiLCJjb25zdHJhaW50cyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsInJlbGF0ZWRQcm9wZXJ0eVBhdGhzIiwia2V5cyIsImxlbmd0aCIsInByb3BlcnR5SW5mb3MiLCJmaW5kIiwiZGF0YVR5cGUiLCJjbGFzc05hbWUiLCJzb3J0YWJsZSIsImlzU29ydGFibGVQcm9wZXJ0eSIsImZpbHRlcmFibGUiLCJpc0ZpbHRlcmFibGVQcm9wZXJ0eSIsIm1heENvbmRpdGlvbnMiLCJnZXRQcm9wZXJ0eU1heENvbmRpdGlvbnMiLCJwdXNoIiwicmVsYXRlZENvbHVtbnMiLCJjcmVhdGVSZWxhdGVkUHJvcGVydGllcyIsImNvbmNhdCIsInVwZGF0ZUJpbmRpbmdJbmZvIiwibWRjVGFibGUiLCJiaW5kaW5nSW5mbyIsImFwcGx5IiwiY29sbGVjdGlvblBhdGgiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyQmFyIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0RmlsdGVyIiwiaXNGaWx0ZXJFbmFibGVkIiwiaXNGaWx0ZXJpbmdFbmFibGVkIiwiY29uZGl0aW9ucyIsImlubmVyRmlsdGVySW5mbyIsIm91dGVyRmlsdGVySW5mbyIsImZpbHRlcnMiLCJ0YWJsZVByb3BlcnRpZXMiLCJnZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0Q29uZGl0aW9ucyIsIkZpbHRlclV0aWwiLCJnZXRGaWx0ZXJJbmZvIiwiaXNUcmVlVGFibGUiLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCIkJGFnZ3JlZ2F0aW9uIiwiZXhwYW5kVG8iLCJpbml0aWFsRXhwYW5zaW9uTGV2ZWwiLCJwYXJhbWV0ZXJOYW1lcyIsIkRlbGVnYXRlVXRpbCIsImdldFBhcmFtZXRlck5hbWVzIiwiX3VwZGF0ZVByb3BlcnR5SW5mbyIsInBhcmFtZXRlclBhdGgiLCJnZXRQYXJhbWV0ZXJzSW5mbyIsIiRzZWFyY2giLCJDb21tb25VdGlscyIsIm5vcm1hbGl6ZVNlYXJjaFRlcm0iLCJnZXRTZWFyY2giLCJ1bmRlZmluZWQiLCJzZWFyY2giLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiJCRzaGFyZWRSZXF1ZXN0IiwiX2FwcGx5RGVmYXVsdFNvcnRpbmciLCIkc2VsZWN0IiwicmVkdWNlIiwicXVlcnkiLCJpbmNsdWRlcyIsIiRjb3VudCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJGaWx0ZXIiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhdHRhY2hFdmVudE9uY2UiLCJzb3J0ZXIiLCJkZWZhdWx0U29ydFByb3BlcnR5TmFtZSIsIlNvcnRlciIsImFUYWJsZVByb3BlcnRpZXMiLCJvTURDVGFibGUiLCJtQ29uZGl0aW9ucyIsIm9NZXRhZGF0YUluZm8iLCJhQ29uZGl0aW9uS2V5Iiwib01ldGFNb2RlbCIsImNvbmRpdGlvbktleSIsImNvbmRpdGlvbktleVR5cGUiLCJnZXRPYmplY3QiLCJ0YWJsZVByb3BlcnR5IiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJvQ29sdW1uRGVmIiwidHlwZUluc3RhbmNlIiwiYmFzZVR5cGUiLCJvRm9ybWF0T3B0aW9ucyIsIm9Db25zdHJhaW50cyIsInVwZGF0ZUJpbmRpbmciLCJvVGFibGUiLCJvQmluZGluZ0luZm8iLCJvQmluZGluZyIsImJOZWVkTWFudWFsUmVmcmVzaCIsIm9JbnRlcm5hbEJpbmRpbmdDb250ZXh0Iiwic01hbnVhbFVwZGF0ZVByb3BlcnR5S2V5Iiwic0xhc3RTZWFyY2giLCJzTGFzdEZpbHRlciIsImJQZW5kaW5nTWFudWFsVXBkYXRlIiwibGFzdFNlYXJjaCIsImxhc3RGaWx0ZXIiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJkZWVwRXF1YWwiLCJyZXF1ZXN0UmVmcmVzaCIsImdldEdyb3VwSWQiLCJmaW5hbGx5IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImZpcmVFdmVudCIsImV4aXN0aW5nQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJyZWxhdGVkQ29sdW1uIiwiY29sdW1uIiwibmV3TmFtZSIsInZhbHVlSGVscENvbHVtblR5cGVDb25maWciLCJ2YWx1ZUhlbHBUYWJsZUNvbHVtbiIsImdldExhYmVsIiwibWFwIiwiY29sdW1uTmFtZSIsImhhc093blByb3BlcnR5IiwiaXNNdWx0aVZhbHVlRmlsdGVyRXhwcmVzc2lvbiIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eVBhdGgiLCJkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRhYmxlRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBFcXVhbFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRUeXBlQ29uZmlnIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL3RhYmxlL0NvbHVtbnNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyUmVzdHJpY3Rpb25zSW5mb1R5cGUsIFNvcnRSZXN0cmljdGlvbnNJbmZvVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBnZXRGaWx0ZXJSZXN0cmljdGlvbnNJbmZvLCBnZXRTb3J0UmVzdHJpY3Rpb25zSW5mbywgaXNNdWx0aVZhbHVlRmlsdGVyRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0TGFiZWxcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG5pbXBvcnQgeyBpc1R5cGVGaWx0ZXJhYmxlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb25CaW5kaW5nSW5mbywgRmlsdGVySW5mbyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbGxlY3Rpb25CaW5kaW5nSW5mb1wiO1xuaW1wb3J0IE1hY3Jvc0RlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyQ29uZGl0aW9ucyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlckJhci9GaWx0ZXJIZWxwZXJcIjtcbmltcG9ydCB7IGdldFBhdGgsIGlzRmlsdGVyYWJsZVByb3BlcnR5LCBpc1NvcnRhYmxlUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVGFibGVEZWxlZ2F0ZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IFRhYmxlRGVsZWdhdGUgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVGFibGVEZWxlZ2F0ZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC91dGlsL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWwgZnJvbSBcInNhcC91aS9tZGMvdXRpbC9GaWx0ZXJVdGlsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBTb3J0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9Tb3J0ZXJcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcblxudHlwZSBDb21wbGV4UHJvcGVydHlNYXAgPSBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cbnR5cGUgTWRjVGFibGVEZWxlZ2F0ZSA9IHsgbmFtZTogc3RyaW5nOyBwYXlsb2FkOiBQYXlsb2FkIH07XG5cbnR5cGUgUGF5bG9hZCA9IHtcblx0Y29sbGVjdGlvbk5hbWU/OiBzdHJpbmc7XG5cdGNvbGxlY3Rpb25QYXRoPzogc3RyaW5nO1xuXHRkZWZhdWx0U29ydFByb3BlcnR5TmFtZT86IHN0cmluZztcblx0aGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nO1xuXHRpbml0aWFsRXhwYW5zaW9uTGV2ZWw/OiBudW1iZXI7XG59O1xuLyoqXG4gKiBUZXN0IGRlbGVnYXRlIGZvciBPRGF0YSBWNC5cbiAqL1xuY29uc3QgT0RhdGFUYWJsZURlbGVnYXRlID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGVEZWxlZ2F0ZSk7XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIHRoZSB0YWJsZSBhbmQgcmV0dXJucyBwcm9wZXJ0eSBpbmZvIGFycmF5LlxuICogQHBhcmFtIHRhYmxlIEluc3RhbmNlIG9mIHRoZSBNREN0YWJsZVxuICogQHJldHVybnMgQXJyYXkgb2YgcHJvcGVydHkgaW5mb1xuICovXG5PRGF0YVRhYmxlRGVsZWdhdGUuZmV0Y2hQcm9wZXJ0aWVzID0gYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8UHJvcGVydHlJbmZvPiB7XG5cdGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5fZ2V0TW9kZWwodGFibGUpO1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5fY3JlYXRlUHJvcGVydHlJbmZvcyh0YWJsZSwgbW9kZWwpO1xuXHRPRGF0YVRhYmxlRGVsZWdhdGUuY3JlYXRlSW50ZXJuYWxCaW5kaW5nQ29udGV4dCh0YWJsZSk7XG5cdE1hY3Jvc0RlbGVnYXRlVXRpbC5zZXRDYWNoZWRQcm9wZXJ0aWVzKHRhYmxlLCBwcm9wZXJ0aWVzKTtcblx0KHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgQ29udGV4dCkuc2V0UHJvcGVydHkoXCJ0YWJsZVByb3BlcnRpZXNBdmFpbGFibGVcIiwgdHJ1ZSk7XG5cdHJldHVybiBwcm9wZXJ0aWVzO1xufTtcblxuT0RhdGFUYWJsZURlbGVnYXRlLmNyZWF0ZUludGVybmFsQmluZGluZ0NvbnRleHQgPSBmdW5jdGlvbiAodGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdGxldCBkaWFsb2c6IE1hbmFnZWRPYmplY3QgfCBudWxsID0gdGFibGU7XG5cdHdoaWxlIChkaWFsb2cgJiYgIWRpYWxvZy5pc0EoXCJzYXAudWkubWRjLnZhbHVlaGVscC5EaWFsb2dcIikpIHtcblx0XHRkaWFsb2cgPSAoZGlhbG9nIGFzIE1hbmFnZWRPYmplY3QpLmdldFBhcmVudCgpO1xuXHR9XG5cblx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRhYmxlLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdGlmIChkaWFsb2cgJiYgaW50ZXJuYWxNb2RlbCkge1xuXHRcdGNvbnN0IGludGVybmFsQmluZGluZ0NvbnRleHQgPSBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRsZXQgbmV3SW50ZXJuYWxCaW5kaW5nQ29udGV4dFBhdGg7XG5cdFx0aWYgKGludGVybmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG5ld0ludGVybmFsQmluZGluZ0NvbnRleHRQYXRoID0gaW50ZXJuYWxCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkgKyBgOjpWSERpYWxvZzo6JHtkaWFsb2cuZ2V0SWQoKX06OnRhYmxlYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3SW50ZXJuYWxCaW5kaW5nQ29udGV4dFBhdGggPSBgL2J1aWxkaW5nYmxvY2tzLyR7dGFibGUuZ2V0SWQoKX1gO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9idWlsZGluZ2Jsb2Nrc1wiLCB7IC4uLmludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvYnVpbGRpbmdibG9ja3NcIikgfSk7XG5cdFx0fVxuXHRcdGNvbnN0IG5ld0ludGVybmFsQmluZGluZ0NvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0KG5ld0ludGVybmFsQmluZGluZ0NvbnRleHRQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR0YWJsZS5zZXRCaW5kaW5nQ29udGV4dChuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0LCBcImludGVybmFsXCIpO1xuXHR9XG59O1xuXG4vKipcbiAqIENvbGxlY3QgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSdzIGFubm90YXRpb25zLlxuICogQHBhcmFtIGRhdGFNb2RlbFByb3BlcnR5UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyB0aGF0IHdlcmUgaWRlbnRpZmllZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhkYXRhTW9kZWxQcm9wZXJ0eVBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+KTogQ29tcGxleFByb3BlcnR5TWFwIHtcblx0Y29uc3QgZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5UGF0aCA9IGdldEFkZGl0aW9uYWxQcm9wZXJ0eShkYXRhTW9kZWxQcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5TWFwID0ge307XG5cdGlmIChkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHlQYXRoPy50YXJnZXRPYmplY3QpIHtcblx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHkgPSBkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdDtcblx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHlQYXRoLCB0cnVlKTtcblxuXHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgdHJ1ZSk7XG5cblx0XHRjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQsXG5cdFx0XHR0ZXh0QXJyYW5nZW1lbnQgPSB0ZXh0QW5ub3RhdGlvbj8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQ/LnRvU3RyaW5nKCksXG5cdFx0XHRkaXNwbGF5TW9kZSA9IHRleHRBbm5vdGF0aW9uICYmIHRleHRBcnJhbmdlbWVudCAmJiBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSk7XG5cblx0XHRpZiAoZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5UGF0aF0gPSBhZGRpdGlvbmFsUHJvcGVydHk7XG5cdFx0fSBlbHNlIGlmICgoZGlzcGxheU1vZGUgJiYgZGlzcGxheU1vZGUgIT09IFwiVmFsdWVcIikgfHwgIXRleHRBbm5vdGF0aW9uKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllc1twcm9wZXJ0eVBhdGhdID0gcHJvcGVydHk7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlQYXRoXSA9IGFkZGl0aW9uYWxQcm9wZXJ0eTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG5PRGF0YVRhYmxlRGVsZWdhdGUuX2NyZWF0ZVByb3BlcnR5SW5mb3MgPSBhc3luYyBmdW5jdGlvbiAodGFibGU6IFRhYmxlLCBtb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8UHJvcGVydHlJbmZvW10+IHtcblx0Y29uc3QgbWV0YWRhdGFJbmZvID0gKHRhYmxlLmdldERlbGVnYXRlKCkgYXMgeyBwYXlsb2FkOiBQYXlsb2FkIH0pLnBheWxvYWQ7XG5cdGNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnR5SW5mb1tdID0gW107XG5cdGNvbnN0IGVudGl0eVNldFBhdGggPSBgLyR7bWV0YWRhdGFJbmZvLmNvbGxlY3Rpb25OYW1lfWA7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdHJldHVybiBtZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtlbnRpdHlTZXRQYXRofUBgKS50aGVuKGZ1bmN0aW9uIChlbnRpdHlTZXRBbm5vdGF0aW9uczogTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNJbmZvID0gZ2V0U29ydFJlc3RyaWN0aW9uc0luZm8oZW50aXR5U2V0QW5ub3RhdGlvbnMpO1xuXHRcdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9ucyA9IGVudGl0eVNldEFubm90YXRpb25zW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zXCJdO1xuXHRcdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0luZm8gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnNJbmZvKGZpbHRlclJlc3RyaWN0aW9ucyk7XG5cdFx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zID0gZW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJGdW5jdGlvbnNcIl07XG5cdFx0Y29uc3QgY2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShtZXRhTW9kZWwsIGZpbHRlckZ1bmN0aW9ucyk7XG5cdFx0Y29uc3QgY3VzdG9tRGF0YUZvckNvbHVtbnMgPSBNYWNyb3NEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YTx7XG5cdFx0XHRjdXN0b21EYXRhOiAoUHJvcGVydHlJbmZvICYgeyAkVHlwZToga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSB9KVtdO1xuXHRcdH0+KHRhYmxlLCBcImNvbHVtbnNcIikhO1xuXHRcdGNvbnN0IHByb3BlcnRpZXNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+ID0ge307XG5cdFx0Y29uc3QgZGF0YU1vZGVsRW50aXR5UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cygodGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKS5nZXRDb250ZXh0KGVudGl0eVNldFBhdGgpKTtcblx0XHRjdXN0b21EYXRhRm9yQ29sdW1ucy5jdXN0b21EYXRhLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbkRlZjogUHJvcGVydHlJbmZvICYgeyAkVHlwZToga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSB9KSB7XG5cdFx0XHRsZXQgdHlwZUNvbmZpZyA9IGlzVHlwZUZpbHRlcmFibGUoY29sdW1uRGVmLiRUeXBlKVxuXHRcdFx0XHQ/IHRhYmxlLmdldFR5cGVNYXAoKS5nZXRUeXBlQ29uZmlnKGNvbHVtbkRlZi4kVHlwZSlcblx0XHRcdFx0OiBUeXBlTWFwLmdldFR5cGVDb25maWcoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIik7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbyA9IHtcblx0XHRcdFx0a2V5OiBjb2x1bW5EZWYucGF0aCEsXG5cdFx0XHRcdGxhYmVsOiBjb2x1bW5EZWYubGFiZWxcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGRhdGFNb2RlbFByb3BlcnR5UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxFbnRpdHlQYXRoLCBjb2x1bW5EZWYucGF0aCk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAocHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0UHJvcGVydHlQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIHRydWUpO1xuXHRcdFx0XHRpZiAoaXNUeXBlRmlsdGVyYWJsZShwcm9wZXJ0eS50eXBlIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0dHlwZUNvbmZpZyA9XG5cdFx0XHRcdFx0XHRUeXBlTWFwLmdldFR5cGVDb25maWcoXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID8/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdFx0XHRcdCkgPz8gdHlwZUNvbmZpZztcblx0XHRcdFx0fVxuXHRcdFx0XHQvL0NoZWNrIGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcHJvcGVydHkgbGlua2VkIHRvIHRoZSBwcm9wZXJ0eSBhcyBhIFVuaXQsIEN1cnJlbmN5LCBUaW1lem9uZSBvciB0ZXh0QXJyYW5nZW1lbnRcblx0XHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKGRhdGFNb2RlbFByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHByb3BlcnR5SW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5UGF0aHM7XG5cdFx0XHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydHlQYXRocy5mb3JFYWNoKChwYXRoKSA9PiB7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9CZUNyZWF0ZWRbcGF0aF0gPSByZWxhdGVkUHJvcGVydGllc0luZm9bcGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8gQWxzbyBhZGQgcHJvcGVydHkgZm9yIHRoZSBpbk91dCBQYXJhbWV0ZXJzIG9uIHRoZSBWYWx1ZUhlbHAgd2hlbiB0ZXh0QXJyYW5nZW1lbnQgaXMgc2V0IHRvICNUZXh0T25seVxuXHRcdFx0XHRcdC8vIEl0IHdpbGwgbm90IGJlIGxpbmtlZCB0byB0aGUgY29tcGxleCBQcm9wZXJ0eSAoQkNQIDIyNzAxNDExNTQpXG5cdFx0XHRcdFx0aWYgKCFyZWxhdGVkUHJvcGVydHlQYXRocy5maW5kKChwYXRoKSA9PiByZWxhdGVkUHJvcGVydGllc0luZm9bcGF0aF0gPT09IHByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1RvQmVDcmVhdGVkW3RhcmdldFByb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLnBhdGggPSBjb2x1bW5EZWYucGF0aDtcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uZGF0YVR5cGUgPSB0eXBlQ29uZmlnLmNsYXNzTmFtZTtcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uY29uc3RyYWludHMgPSBjb2x1bW5EZWYuY29uc3RyYWludHM7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLmZvcm1hdE9wdGlvbnMgPSBjb2x1bW5EZWYuZm9ybWF0T3B0aW9ucztcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uc29ydGFibGUgPSBpc1NvcnRhYmxlUHJvcGVydHkoc29ydFJlc3RyaWN0aW9uc0luZm8sIGNvbHVtbkRlZik7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLmZpbHRlcmFibGUgPSBpc0ZpbHRlcmFibGVQcm9wZXJ0eShmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLCBjb2x1bW5EZWYpO1xuXHRcdFx0XHRcdHByb3BlcnR5SW5mby5tYXhDb25kaXRpb25zID0gZ2V0UHJvcGVydHlNYXhDb25kaXRpb25zKGZpbHRlclJlc3RyaWN0aW9uc0luZm8sIGNvbHVtbkRlZik7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm9wZXJ0eUluZm8ucGF0aCA9IGNvbHVtbkRlZi5wYXRoO1xuXHRcdFx0XHRwcm9wZXJ0eUluZm8uY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG5cdFx0XHRcdHByb3BlcnR5SW5mby5kYXRhVHlwZSA9IHR5cGVDb25maWcuY2xhc3NOYW1lO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydGllcy5wdXNoKHByb3BlcnR5SW5mbyk7XG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBjcmVhdGVSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdHByb3BlcnRpZXNUb0JlQ3JlYXRlZCxcblx0XHRcdHByb3BlcnRpZXMsXG5cdFx0XHRzb3J0UmVzdHJpY3Rpb25zSW5mbyxcblx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0luZm8sXG5cdFx0XHRjYXNlU2Vuc2l0aXZlXG5cdFx0KTtcblx0XHRyZXR1cm4gcHJvcGVydGllcy5jb25jYXQocmVsYXRlZENvbHVtbnMpO1xuXHR9KTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgYmluZGluZyBpbmZvIHdpdGggdGhlIHJlbGV2YW50IHBhdGggYW5kIG1vZGVsIGZyb20gdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1kY1RhYmxlIFRoZSBNRENUYWJsZSBpbnN0YW5jZVxuICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nSW5mbyBvZiB0aGUgdGFibGVcbiAqL1xuT0RhdGFUYWJsZURlbGVnYXRlLnVwZGF0ZUJpbmRpbmdJbmZvID0gZnVuY3Rpb24gKG1kY1RhYmxlOiBUYWJsZSwgYmluZGluZ0luZm86IENvbGxlY3Rpb25CaW5kaW5nSW5mbyk6IHZvaWQge1xuXHRUYWJsZURlbGVnYXRlLnVwZGF0ZUJpbmRpbmdJbmZvLmFwcGx5KHRoaXMsIFttZGNUYWJsZSwgYmluZGluZ0luZm9dKTtcblxuXHRjb25zdCBtZXRhZGF0YUluZm8gPSAobWRjVGFibGUuZ2V0RGVsZWdhdGUoKSBhcyBNZGNUYWJsZURlbGVnYXRlKS5wYXlsb2FkO1xuXG5cdGlmIChtZXRhZGF0YUluZm8pIHtcblx0XHRiaW5kaW5nSW5mby5wYXRoID0gYmluZGluZ0luZm8/LnBhdGggfHwgbWV0YWRhdGFJbmZvLmNvbGxlY3Rpb25QYXRoIHx8IGAvJHttZXRhZGF0YUluZm8uY29sbGVjdGlvbk5hbWV9YDtcblx0fVxuXG5cdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgPSBiaW5kaW5nSW5mby5wYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGNvbnN0IGZpbHRlckJhciA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQobWRjVGFibGUuZ2V0RmlsdGVyKCkpIGFzIEZpbHRlckJhcixcblx0XHRpc0ZpbHRlckVuYWJsZWQgPSBtZGNUYWJsZS5pc0ZpbHRlcmluZ0VuYWJsZWQoKTtcblx0bGV0IGNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckNvbmRpdGlvbnNbXT47XG5cdGxldCBpbm5lckZpbHRlckluZm8sIG91dGVyRmlsdGVySW5mbzogRmlsdGVySW5mbztcblx0Y29uc3QgZmlsdGVycyA9IFtdO1xuXHRjb25zdCB0YWJsZVByb3BlcnRpZXMgPSBNYWNyb3NEZWxlZ2F0ZVV0aWwuZ2V0Q2FjaGVkUHJvcGVydGllcyhtZGNUYWJsZSkgYXMgdW5rbm93biBhcyBQcm9wZXJ0eUluZm9bXTtcblxuXHQvL1RPRE86IGNvbnNpZGVyIGEgbWVjaGFuaXNtICgnRmlsdGVyTWVyZ2VVdGlsJyBvciBlbmhhbmNlICdGaWx0ZXJVdGlsJykgdG8gYWxsb3cgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBkaWZmZXJlbnQgZmlsdGVycylcblx0aWYgKGlzRmlsdGVyRW5hYmxlZCkge1xuXHRcdGNvbmRpdGlvbnMgPSBtZGNUYWJsZS5nZXRDb25kaXRpb25zKCk7XG5cdFx0aW5uZXJGaWx0ZXJJbmZvID0gRmlsdGVyVXRpbC5nZXRGaWx0ZXJJbmZvKG1kY1RhYmxlLCBjb25kaXRpb25zLCB0YWJsZVByb3BlcnRpZXMhLCBbXSkgYXMgRmlsdGVySW5mbztcblx0XHRpZiAoaW5uZXJGaWx0ZXJJbmZvLmZpbHRlcnMpIHtcblx0XHRcdGZpbHRlcnMucHVzaChpbm5lckZpbHRlckluZm8uZmlsdGVycyk7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzVHJlZVRhYmxlID0gISFtZXRhZGF0YUluZm8/LmhpZXJhcmNoeVF1YWxpZmllcjtcblx0aWYgKGlzVHJlZVRhYmxlKSB7XG5cdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kJGFnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0aGllcmFyY2h5UXVhbGlmaWVyOiBtZXRhZGF0YUluZm8uaGllcmFyY2h5UXVhbGlmaWVyLFxuXHRcdFx0ZXhwYW5kVG86IG1ldGFkYXRhSW5mby5pbml0aWFsRXhwYW5zaW9uTGV2ZWxcblx0XHR9O1xuXHR9XG5cdGlmIChmaWx0ZXJCYXIpIHtcblx0XHRjb25kaXRpb25zID0gZmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKTtcblx0XHRpZiAoY29uZGl0aW9ucykge1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVyTmFtZXMgPSBEZWxlZ2F0ZVV0aWwuZ2V0UGFyYW1ldGVyTmFtZXMoZmlsdGVyQmFyKTtcblx0XHRcdC8vIFRoZSB0YWJsZSBwcm9wZXJ0aWVzIG5lZWRzIHRvIHVwZGF0ZWQgd2l0aCB0aGUgZmlsdGVyIGZpZWxkIGlmIG5vIFNlbGVjdGlvbmZpZWxkcyBhcmUgYW5ub3RhdGVkIGFuZCBub3QgcGFydCBhcyB2YWx1ZSBoZWxwIHBhcmFtZXRlclxuXHRcdFx0T0RhdGFUYWJsZURlbGVnYXRlLl91cGRhdGVQcm9wZXJ0eUluZm8odGFibGVQcm9wZXJ0aWVzLCBtZGNUYWJsZSwgY29uZGl0aW9ucywgbWV0YWRhdGFJbmZvKTtcblx0XHRcdG91dGVyRmlsdGVySW5mbyA9IEZpbHRlclV0aWwuZ2V0RmlsdGVySW5mbyhmaWx0ZXJCYXIsIGNvbmRpdGlvbnMsIHRhYmxlUHJvcGVydGllcyEsIHBhcmFtZXRlck5hbWVzKTtcblxuXHRcdFx0aWYgKG91dGVyRmlsdGVySW5mby5maWx0ZXJzKSB7XG5cdFx0XHRcdGZpbHRlcnMucHVzaChvdXRlckZpbHRlckluZm8uZmlsdGVycyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHBhcmFtZXRlclBhdGggPSBEZWxlZ2F0ZVV0aWwuZ2V0UGFyYW1ldGVyc0luZm8oZmlsdGVyQmFyLCBjb25kaXRpb25zKTtcblx0XHRcdGlmIChwYXJhbWV0ZXJQYXRoKSB7XG5cdFx0XHRcdGJpbmRpbmdJbmZvLnBhdGggPSBwYXJhbWV0ZXJQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIWlzVHJlZVRhYmxlKSB7XG5cdFx0XHQvLyBnZXQgdGhlIGJhc2ljIHNlYXJjaFxuXHRcdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kc2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybShmaWx0ZXJCYXIuZ2V0U2VhcmNoKCkpIHx8IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKGZpbHRlckJhci5nZXRTZWFyY2goKSkge1xuXHRcdFx0aWYgKCFiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24pIHtcblx0XHRcdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kJGFnZ3JlZ2F0aW9uID0ge307XG5cdFx0XHR9XG5cdFx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24uc2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybShmaWx0ZXJCYXIuZ2V0U2VhcmNoKCkpO1xuXHRcdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kJGFnZ3JlZ2F0aW9uLmV4cGFuZFRvID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cdFx0fVxuXHR9XG5cdC8vIEJDUDogMjM3MDA3ODY2MCAtIHNoYXJlZFJlcXVlc3QgaXMgc2V0IHRvIGZhbHNlIGluIG9yZGVyIHRvIGF2b2lkIGRlYWRsb2NrIHNpdHVhdGlvbiB3aGVyZSB0aGUgdGhlIG9EYXRhXG5cdC8vIG1vZGVsIGNhY2hlIGlzIG5laXRoZXIgY2hhbmdlYWJsZSAocmVzdWx0IG9mIExpc3RCaW5kaW5nLiQkc2hhcmVkUmVxdWVzdCA9IHRydWUpIG5vciBkZWxldGFibGVcblx0Ly8gKHJlc3VsdCBvZiBDb250ZXh0LnNldFNlbGVjdGVkKHRydWUpIC0+IExpc3RCaW5kaW5nLmtlZXBBbGl2ZSlcblx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kJHNoYXJlZFJlcXVlc3QgPSBmYWxzZTtcblxuXHR0aGlzLl9hcHBseURlZmF1bHRTb3J0aW5nKGJpbmRpbmdJbmZvLCAobWRjVGFibGUuZ2V0RGVsZWdhdGUoKSBhcyBNZGNUYWJsZURlbGVnYXRlKS5wYXlsb2FkKTtcblx0Ly8gYWRkIHNlbGVjdCB0byBiaW5kaW5nSW5mbyAoQkNQIDIxNzAxNjMwMTIpXG5cdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJHNlbGVjdCA9IHRhYmxlUHJvcGVydGllcz8ucmVkdWNlKGZ1bmN0aW9uIChxdWVyeTogc3RyaW5nLCBwcm9wZXJ0eTogUHJvcGVydHlJbmZvKSB7XG5cdFx0Ly8gTmF2aWdhdGlvbiBwcm9wZXJ0aWVzIChyZXByZXNlbnRlZCBieSBYL1kpIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gJHNlbGVjdC5cblx0XHQvLyBUb0RvIDogVGhleSBzaG91bGQgYmUgYWRkZWQgYXMgJGV4cGFuZD1YKCRzZWxlY3Q9WSkgaW5zdGVhZFxuXHRcdGlmIChwcm9wZXJ0eS5wYXRoICYmICFwcm9wZXJ0eS5wYXRoLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0cXVlcnkgPSBxdWVyeSA/IGAke3F1ZXJ5fSwke3Byb3BlcnR5LnBhdGh9YCA6IHByb3BlcnR5LnBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiBxdWVyeTtcblx0fSwgXCJcIik7XG5cblx0Ly8gQWRkICRjb3VudFxuXHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiRjb3VudCA9IHRydWU7XG5cblx0Ly9JZiB0aGUgZW50aXR5IGlzIERyYWZ0RW5hYmxlZCBhZGQgYSBEcmFmdEZpbHRlclxuXHRpZiAoYmluZGluZ0luZm8ucGF0aCAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1kY1RhYmxlLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLCBiaW5kaW5nSW5mby5wYXRoKSkge1xuXHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgRmlsdGVyT3BlcmF0b3IuRVEsIHRydWUpKTtcblx0fVxuXHRiaW5kaW5nSW5mby5maWx0ZXJzID0gbmV3IEZpbHRlcihmaWx0ZXJzIGFzIEZpbHRlcltdLCB0cnVlKTtcbn07XG5cbk9EYXRhVGFibGVEZWxlZ2F0ZS5nZXRUeXBlTWFwID0gZnVuY3Rpb24gKCk6IG9iamVjdCB7XG5cdHJldHVybiBUeXBlTWFwO1xufTtcblxuLyoqXG4gKiBHZXQgdGFibGUgTW9kZWwuXG4gKiBAcGFyYW0gdGFibGUgSW5zdGFuY2Ugb2YgdGhlIE1EQ3RhYmxlXG4gKiBAcmV0dXJucyBNb2RlbFxuICovXG5PRGF0YVRhYmxlRGVsZWdhdGUuX2dldE1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8TW9kZWw+IHtcblx0Y29uc3QgbWV0YWRhdGFJbmZvID0gKHRhYmxlLmdldERlbGVnYXRlKCkgYXMgeyBwYXlsb2FkOiB7IG1vZGVsOiBzdHJpbmcgfSB9KS5wYXlsb2FkO1xuXHRsZXQgbW9kZWw6IE1vZGVsID0gdGFibGUuZ2V0TW9kZWwobWV0YWRhdGFJbmZvLm1vZGVsKSE7XG5cdGlmICghbW9kZWwpIHtcblx0XHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGFibGUuYXR0YWNoRXZlbnRPbmNlKFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIHJlc29sdmUpO1xuXHRcdH0pO1xuXHRcdG1vZGVsID0gdGFibGUuZ2V0TW9kZWwobWV0YWRhdGFJbmZvLm1vZGVsKSE7XG5cdH1cblx0cmV0dXJuIG1vZGVsO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIGEgZGVmYXVsdCBzb3J0IG9yZGVyIGlmIG5lZWRlZC4gVGhpcyBpcyBvbmx5IHRoZSBjYXNlIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBhICRzZWFyY2ggcmVxdWVzdFxuICogKG1lYW5zIHRoZSBwYXJhbWV0ZXIgJHNlYXJjaCBvZiB0aGUgYmluZGluZ0luZm8gaXMgdW5kZWZpbmVkKSBhbmQgaWYgYSBzb3J0IG9yZGVyIGhhcyBub3QgYmVlbiBzZXQgYWxyZWFkeSxcbiAqIGZvciBleGFtcGxlLCB1c2luZyBhIHByZXNlbnRhdGlvbiB2YXJpYW50IG9yIG1hbnVhbGx5IHNldCBieSB0aGUgdXNlci5cbiAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZ0luZm8gb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcGF5bG9hZCBUaGUgcGF5bG9hZCBvZiB0aGUgVGFibGVEZWxlZ2F0ZVxuICovXG5PRGF0YVRhYmxlRGVsZWdhdGUuX2FwcGx5RGVmYXVsdFNvcnRpbmcgPSBmdW5jdGlvbiAoYmluZGluZ0luZm86IENvbGxlY3Rpb25CaW5kaW5nSW5mbywgcGF5bG9hZDogUGF5bG9hZCk6IHZvaWQge1xuXHRpZiAoXG5cdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycyAmJlxuXHRcdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJHNlYXJjaCA9PSB1bmRlZmluZWQgJiZcblx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24/LnNlYXJjaCA9PSB1bmRlZmluZWQgJiZcblx0XHRiaW5kaW5nSW5mby5zb3J0ZXIgJiZcblx0XHRiaW5kaW5nSW5mby5zb3J0ZXIubGVuZ3RoID09IDBcblx0KSB7XG5cdFx0Y29uc3QgZGVmYXVsdFNvcnRQcm9wZXJ0eU5hbWUgPSBwYXlsb2FkID8gcGF5bG9hZC5kZWZhdWx0U29ydFByb3BlcnR5TmFtZSA6IHVuZGVmaW5lZDtcblx0XHRpZiAoZGVmYXVsdFNvcnRQcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGJpbmRpbmdJbmZvLnNvcnRlci5wdXNoKG5ldyBTb3J0ZXIoZGVmYXVsdFNvcnRQcm9wZXJ0eU5hbWUsIGZhbHNlKSk7XG5cdFx0fVxuXHR9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRhYmxlIHByb3BlcnRpZXMgd2l0aCBmaWx0ZXIgZmllbGQgaW5mb3MuXG4gKiBAcGFyYW0gYVRhYmxlUHJvcGVydGllcyBBcnJheSB3aXRoIHRhYmxlIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBvTURDVGFibGUgVGhlIE1EQ1RhYmxlIGluc3RhbmNlXG4gKiBAcGFyYW0gbUNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gb01ldGFkYXRhSW5mbyBUaGUgbWV0YWRhdGEgaW5mbyBvZiB0aGUgZmlsdGVyIGZpZWxkXG4gKi9cbk9EYXRhVGFibGVEZWxlZ2F0ZS5fdXBkYXRlUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKFxuXHRhVGFibGVQcm9wZXJ0aWVzOiBQcm9wZXJ0eUluZm9bXSxcblx0b01EQ1RhYmxlOiBUYWJsZSxcblx0bUNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPixcblx0b01ldGFkYXRhSW5mbzogUGF5bG9hZFxuKTogdm9pZCB7XG5cdGNvbnN0IGFDb25kaXRpb25LZXkgPSBPYmplY3Qua2V5cyhtQ29uZGl0aW9ucyksXG5cdFx0b01ldGFNb2RlbCA9IChvTURDVGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSE7XG5cdGFDb25kaXRpb25LZXkuZm9yRWFjaChmdW5jdGlvbiAoY29uZGl0aW9uS2V5OiBzdHJpbmcpIHtcblx0XHQvLyBUaGUgdHlwZUNvbmZpZyBpcyBub3Qgc2V0IGluIHRoZSB0YWJsZSBwcm9wZXJ0eUluZm9zLCBidXQgd2UgbmVlZCB0byBzZXQgaXQgZm9yIHRoZSBmaWx0ZXIgZmllbGRzXG5cdFx0Y29uc3QgY29uZGl0aW9uS2V5VHlwZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtvTWV0YWRhdGFJbmZvLmNvbGxlY3Rpb25OYW1lfS8ke2NvbmRpdGlvbktleX1gKT8uJFR5cGUgPz8gXCJFZG0uU3RyaW5nXCI7XG5cdFx0Y29uc3QgdHlwZUNvbmZpZyA9IG9NRENUYWJsZS5nZXRUeXBlTWFwKCkuZ2V0VHlwZUNvbmZpZyhjb25kaXRpb25LZXlUeXBlKTtcblx0XHRhVGFibGVQcm9wZXJ0aWVzLmZvckVhY2goKHRhYmxlUHJvcGVydHksIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAodGFibGVQcm9wZXJ0eS5wYXRoID09PSBjb25kaXRpb25LZXkpIHtcblx0XHRcdFx0KGFUYWJsZVByb3BlcnRpZXNbaW5kZXhdIGFzIFByb3BlcnR5SW5mbyAmIHsgdHlwZUNvbmZpZzogb2JqZWN0IH0pLnR5cGVDb25maWcgPSB0eXBlQ29uZmlnO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChcblx0XHRcdGFUYWJsZVByb3BlcnRpZXMuZmluZEluZGV4KGZ1bmN0aW9uICh0YWJsZVByb3BlcnR5OiBQcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0cmV0dXJuIHRhYmxlUHJvcGVydHkucGF0aCA9PT0gY29uZGl0aW9uS2V5O1xuXHRcdFx0fSkgPT09IC0xXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvQ29sdW1uRGVmOiBQcm9wZXJ0eUluZm8gPSB7XG5cdFx0XHRcdGtleTogY29uZGl0aW9uS2V5LFxuXHRcdFx0XHRsYWJlbDogY29uZGl0aW9uS2V5LFxuXHRcdFx0XHRwYXRoOiBjb25kaXRpb25LZXksXG5cdFx0XHRcdGRhdGFUeXBlOiB0eXBlQ29uZmlnLnR5cGVJbnN0YW5jZS5iYXNlVHlwZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogdHlwZUNvbmZpZy50eXBlSW5zdGFuY2U/Lm9Gb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRjb25zdHJhaW50czogdHlwZUNvbmZpZy50eXBlSW5zdGFuY2U/Lm9Db25zdHJhaW50c1xuXHRcdFx0fTtcblx0XHRcdGFUYWJsZVByb3BlcnRpZXMucHVzaChvQ29sdW1uRGVmKTtcblx0XHR9XG5cdH0pO1xufTtcblxuT0RhdGFUYWJsZURlbGVnYXRlLnVwZGF0ZUJpbmRpbmcgPSBmdW5jdGlvbiAoXG5cdG9UYWJsZTogVGFibGUsXG5cdG9CaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gJiB7XG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0JHNlYXJjaD86IHN0cmluZztcblx0XHR9O1xuXHR9LFxuXHRvQmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuKTogdm9pZCB7XG5cdGxldCBiTmVlZE1hbnVhbFJlZnJlc2ggPSBmYWxzZTtcblx0Y29uc3Qgb0ludGVybmFsQmluZGluZ0NvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0Y29uc3Qgc01hbnVhbFVwZGF0ZVByb3BlcnR5S2V5ID0gXCJwZW5kaW5nTWFudWFsQmluZGluZ1VwZGF0ZVwiO1xuXHRjb25zdCBzTGFzdFNlYXJjaCA9IFwibGFzdFNlYXJjaFwiO1xuXHRjb25zdCBzTGFzdEZpbHRlciA9IFwibGFzdEZpbHRlclwiO1xuXHRjb25zdCBiUGVuZGluZ01hbnVhbFVwZGF0ZSA9IG9JbnRlcm5hbEJpbmRpbmdDb250ZXh0Py5nZXRQcm9wZXJ0eShzTWFudWFsVXBkYXRlUHJvcGVydHlLZXkpO1xuXHRjb25zdCBsYXN0U2VhcmNoID0gb0ludGVybmFsQmluZGluZ0NvbnRleHQ/LmdldFByb3BlcnR5KHNMYXN0U2VhcmNoKTtcblx0Y29uc3QgbGFzdEZpbHRlciA9IG9JbnRlcm5hbEJpbmRpbmdDb250ZXh0Py5nZXRQcm9wZXJ0eShzTGFzdEZpbHRlcik7XG5cdGxldCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cblx0Ly9vQmluZGluZz1udWxsIG1lYW5zIHRoYXQgYSByZWJpbmRpbmcgbmVlZHMgdG8gYmUgZm9yY2VkIHZpYSB1cGRhdGVCaW5kaW5nIGluIG1kYyBUYWJsZURlbGVnYXRlXG5cdFRhYmxlRGVsZWdhdGUudXBkYXRlQmluZGluZy5hcHBseShPRGF0YVRhYmxlRGVsZWdhdGUsIFtvVGFibGUsIG9CaW5kaW5nSW5mbywgb0JpbmRpbmddKTtcblx0Ly9nZXQgcm93IGJpbmRpbmcgYWZ0ZXIgcmViaW5kIGZyb20gVGFibGVEZWxlZ2F0ZS51cGRhdGVCaW5kaW5nIGluIGNhc2Ugb0JpbmRpbmcgd2FzIG51bGxcblx0aWYgKCFvUm93QmluZGluZykge1xuXHRcdG9Sb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0fVxuXHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHQvKipcblx0XHQgKiBNYW51YWwgcmVmcmVzaCBpZiBmaWx0ZXJzIGFyZSBub3QgY2hhbmdlZCBieSBiaW5kaW5nLnJlZnJlc2goKSBzaW5jZSB1cGRhdGluZyB0aGUgYmluZGluZ0luZm9cblx0XHQgKiBpcyBub3QgZW5vdWdoIHRvIHRyaWdnZXIgYSBiYXRjaCByZXF1ZXN0LlxuXHRcdCAqIEluIGNhc2UgdGhlcmUgaXMgbm8gaW50ZXJuYWxCaW5kaW5nQ29udGV4dCAoc2VlIEJDUCAyMjgwMTYxNTI0KSB3ZSBjYW4gbm90IGRldGVybWluZSBpZiBhIG1hbnVhbFxuXHRcdCAqIHJlZnJlc2ggaXMgbmVlZGVkIG9yIG5vdC4gVGhlcmVmb3JlLCB3ZSBhbHdheXMgcmVmcmVzaCBpbiB0aGlzIHNwZWNpYWwgY2FzZVxuXHRcdCAqL1xuXHRcdGJOZWVkTWFudWFsUmVmcmVzaCA9IG9JbnRlcm5hbEJpbmRpbmdDb250ZXh0XG5cdFx0XHQ/IGRlZXBFcXVhbChvQmluZGluZ0luZm8uZmlsdGVycywgbGFzdEZpbHRlcikgJiYgb0JpbmRpbmdJbmZvLnBhcmFtZXRlcnM/LiRzZWFyY2ggPT09IGxhc3RTZWFyY2ggJiYgIWJQZW5kaW5nTWFudWFsVXBkYXRlXG5cdFx0XHQ6IHRydWU7XG5cdH1cblx0b0ludGVybmFsQmluZGluZ0NvbnRleHQ/LnNldFByb3BlcnR5KHNMYXN0U2VhcmNoLCBvQmluZGluZ0luZm8ucGFyYW1ldGVycz8uJHNlYXJjaCk7XG5cdG9JbnRlcm5hbEJpbmRpbmdDb250ZXh0Py5zZXRQcm9wZXJ0eShzTGFzdEZpbHRlciwgb0JpbmRpbmdJbmZvLmZpbHRlcnMpO1xuXG5cdGlmIChiTmVlZE1hbnVhbFJlZnJlc2ggJiYgb1RhYmxlLmdldEZpbHRlcigpKSB7XG5cdFx0b0ludGVybmFsQmluZGluZ0NvbnRleHQ/LnNldFByb3BlcnR5KHNNYW51YWxVcGRhdGVQcm9wZXJ0eUtleSwgdHJ1ZSk7XG5cdFx0b1Jvd0JpbmRpbmdcblx0XHRcdC5yZXF1ZXN0UmVmcmVzaChvUm93QmluZGluZy5nZXRHcm91cElkKCkpXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdG9JbnRlcm5hbEJpbmRpbmdDb250ZXh0Py5zZXRQcm9wZXJ0eShzTWFudWFsVXBkYXRlUHJvcGVydHlLZXksIGZhbHNlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIGEgZmlsdGVyQmFyIFZIIHRhYmxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblx0b1RhYmxlLmZpcmVFdmVudChcImJpbmRpbmdVcGRhdGVkXCIpO1xuXHQvL25vIG5lZWQgdG8gY2hlY2sgZm9yIHNlbWFudGljIHRhcmdldHMgaGVyZSBzaW5jZSB3ZSBhcmUgaW4gYSBWSCBhbmQgZG9uJ3Qgd2FudCB0byBhbGxvdyBmdXJ0aGVyIG5hdmlnYXRpb25cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbXBsZSBwcm9wZXJ0eSBmb3IgZWFjaCBpZGVudGlmaWVkIGNvbXBsZXggcHJvcGVydHkuXG4gKiBAcGFyYW0gcHJvcGVydGllc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBwcm9wZXJ0aWVzIGRlZmluZWQgb24gdGhlIFZhbHVlIExpc3QuXG4gKiBAcGFyYW0gc29ydFJlc3RyaWN0aW9uc0luZm8gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNvcnQgcmVzdHJpY3Rpb24gaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBmaWx0ZXJSZXN0cmljdGlvbnNJbmZvIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb24gaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBwcm9wZXJ0aWVzIGNyZWF0ZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWxhdGVkUHJvcGVydGllcyhcblx0cHJvcGVydGllc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogUHJvcGVydHlJbmZvW10sXG5cdHNvcnRSZXN0cmljdGlvbnNJbmZvOiBTb3J0UmVzdHJpY3Rpb25zSW5mb1R5cGUsXG5cdGZpbHRlclJlc3RyaWN0aW9uc0luZm86IEZpbHRlclJlc3RyaWN0aW9uc0luZm9UeXBlLFxuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhblxuKTogUHJvcGVydHlJbmZvW10ge1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG5cdFx0cmVsYXRlZENvbHVtbnM6IFByb3BlcnR5SW5mb1tdID0gW107XG5cdE9iamVjdC5rZXlzKHByb3BlcnRpZXNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgocGF0aCkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllc1RvQmVDcmVhdGVkW3BhdGhdLFxuXHRcdFx0cmVsYXRlZENvbHVtbiA9IGV4aXN0aW5nQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5wYXRoID09PSBwYXRoKTsgLy8gQ29tcGxleCBwcm9wZXJ0aWVzIGRvZXNuJ3QgaGF2ZSBwYXRoIHNvIG9ubHkgc2ltcGxlIGNvbHVtbiBhcmUgZm91bmRcblx0XHRpZiAoIXJlbGF0ZWRDb2x1bW4pIHtcblx0XHRcdGNvbnN0IG5ld05hbWUgPSBgUHJvcGVydHk6OiR7cGF0aH1gO1xuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwYXRoXSA9IG5ld05hbWU7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHZhbHVlSGVscENvbHVtblR5cGVDb25maWcgPSBUeXBlTWFwLmdldFR5cGVDb25maWcoXG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID8/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIsXG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB2YWx1ZUhlbHBUYWJsZUNvbHVtbjogUHJvcGVydHlJbmZvID0ge1xuXHRcdFx0XHRrZXk6IG5ld05hbWUsXG5cdFx0XHRcdGxhYmVsOiBnZXRMYWJlbChwcm9wZXJ0eSksXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBpc1NvcnRhYmxlUHJvcGVydHkoc29ydFJlc3RyaWN0aW9uc0luZm8sIHByb3BlcnR5KSxcblx0XHRcdFx0ZmlsdGVyYWJsZTogaXNGaWx0ZXJhYmxlUHJvcGVydHkoZmlsdGVyUmVzdHJpY3Rpb25zSW5mbywgcHJvcGVydHkpLFxuXHRcdFx0XHRkYXRhVHlwZTogdmFsdWVIZWxwQ29sdW1uVHlwZUNvbmZpZy5jbGFzc05hbWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGlzVHlwZUZpbHRlcmFibGUocHJvcGVydHkudHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKVxuXHRcdFx0XHRcdD8gcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0Y29uc3RyYWludHM6IGlzVHlwZUZpbHRlcmFibGUocHJvcGVydHkudHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKVxuXHRcdFx0XHRcdD8gcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmVcblx0XHRcdH07XG5cdFx0XHR2YWx1ZUhlbHBUYWJsZUNvbHVtbi5tYXhDb25kaXRpb25zID0gZ2V0UHJvcGVydHlNYXhDb25kaXRpb25zKGZpbHRlclJlc3RyaWN0aW9uc0luZm8sIHZhbHVlSGVscFRhYmxlQ29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2godmFsdWVIZWxwVGFibGVDb2x1bW4pO1xuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAna2V5JyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRpZiAoY29sdW1uLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdGNvbHVtbi5wcm9wZXJ0eUluZm9zID0gY29sdW1uLnByb3BlcnR5SW5mb3M/Lm1hcCgoY29sdW1uTmFtZSkgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtjb2x1bW5OYW1lXSA/PyBjb2x1bW5OYW1lKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgbWF4Q29uZGl0aW9ucyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBmaWx0ZXJSZXN0cmljdGlvbnNJbmZvIFRoZSBmaWx0ZXIgcmVzdHJpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzdHJpY3Rpb24gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgdGFyZ2V0IHByb3BlcnR5LlxuICogQHJldHVybnMgYC0xYCBvciBgMWAgaWYgdGhlIHByb3BlcnR5IGlzIGEgTXVsdGlWYWx1ZUZpbHRlckV4cHJlc3Npb24uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5TWF4Q29uZGl0aW9ucyhmaWx0ZXJSZXN0cmljdGlvbnNJbmZvOiBGaWx0ZXJSZXN0cmljdGlvbnNJbmZvVHlwZSwgcHJvcGVydHk6IFByb3BlcnR5SW5mbyB8IFByb3BlcnR5KTogbnVtYmVyIHtcblx0Y29uc3QgcHJvcGVydHlQYXRoID0gZ2V0UGF0aChwcm9wZXJ0eSk7XG5cdHJldHVybiBwcm9wZXJ0eVBhdGggJiZcblx0XHRmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLnByb3BlcnR5SW5mbz8uaGFzT3duUHJvcGVydHkocHJvcGVydHlQYXRoKSAmJlxuXHRcdGlzTXVsdGlWYWx1ZUZpbHRlckV4cHJlc3Npb24oZmlsdGVyUmVzdHJpY3Rpb25zSW5mby5wcm9wZXJ0eUluZm9bcHJvcGVydHlQYXRoXSBhcyB1bmtub3duIGFzIHN0cmluZylcblx0XHQ/IC0xXG5cdFx0OiAxO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIGFkZGl0aW9uYWwgcHJvcGVydHkgd2hpY2ggcmVmZXJlbmNlcyB0byB0aGUgdW5pdCwgdGltZXpvbmUsIHRleHRBcnJhbmdlbWVudCBvciBjdXJyZW5jeS5cbiAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBhZGRpdGlvbmFsIHByb3BlcnR5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFByb3BlcnR5KGRhdGFNb2RlbFByb3BlcnR5UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4pOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHByb3BlcnR5ID0gZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdDtcblx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5UGF0aCA9XG5cdFx0cHJvcGVydHkgJiZcblx0XHQoZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpIHx8XG5cdFx0XHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgocHJvcGVydHkpIHx8XG5cdFx0XHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHxcblx0XHRcdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5UGF0aChwcm9wZXJ0eSkpO1xuXHRpZiAoIWFkZGl0aW9uYWxQcm9wZXJ0eVBhdGgpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IGRhdGFNb2RlbEFkZGl0aW9uYWxQcm9wZXJ0eSA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIGFkZGl0aW9uYWxQcm9wZXJ0eVBhdGgpO1xuXG5cdC8vQWRkaXRpb25hbCBQcm9wZXJ0eSBjb3VsZCByZWZlciB0byBhIG5hdmlnYXRpb24gcHJvcGVydHksIGtlZXAgdGhlIGtleSBhbmQgcGF0aCBhcyBuYXZpZ2F0aW9uIHByb3BlcnR5XG5cdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eSA9IGRhdGFNb2RlbEFkZGl0aW9uYWxQcm9wZXJ0eS50YXJnZXRPYmplY3Q7XG5cdGlmICghYWRkaXRpb25hbFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPRGF0YVRhYmxlRGVsZWdhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTBEQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSxrQkFBa0IsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGFBQWEsQ0FBQzs7RUFFM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBSCxrQkFBa0IsQ0FBQ0ksZUFBZSxH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
431
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPRGF0YVRhYmxlRGVsZWdhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJUYWJsZURlbGVnYXRlIiwiZmV0Y2hQcm9wZXJ0aWVzIiwidGFibGUiLCJtb2RlbCIsIl9nZXRNb2RlbCIsInByb3BlcnRpZXMiLCJfY3JlYXRlUHJvcGVydHlJbmZvcyIsImNyZWF0ZUludGVybmFsQmluZGluZ0NvbnRleHQiLCJNYWNyb3NEZWxlZ2F0ZVV0aWwiLCJzZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzZXRQcm9wZXJ0eSIsImRpYWxvZyIsImlzQSIsImdldFBhcmVudCIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsImludGVybmFsQmluZGluZ0NvbnRleHQiLCJuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0UGF0aCIsImdldFBhdGgiLCJnZXRJZCIsImdldFByb3BlcnR5IiwibmV3SW50ZXJuYWxCaW5kaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJkYXRhTW9kZWxQcm9wZXJ0eVBhdGgiLCJkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHlQYXRoIiwiZ2V0QWRkaXRpb25hbFByb3BlcnR5IiwicmVsYXRlZFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJhZGRpdGlvbmFsUHJvcGVydHlQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidGV4dEFubm90YXRpb24iLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJ0ZXh0QXJyYW5nZW1lbnQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsInRvU3RyaW5nIiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsInRhcmdldEVudGl0eVR5cGUiLCJtZXRhZGF0YUluZm8iLCJnZXREZWxlZ2F0ZSIsInBheWxvYWQiLCJlbnRpdHlTZXRQYXRoIiwiY29sbGVjdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJyZXF1ZXN0T2JqZWN0IiwidGhlbiIsImVudGl0eVNldEFubm90YXRpb25zIiwic29ydFJlc3RyaWN0aW9uc0luZm8iLCJnZXRTb3J0UmVzdHJpY3Rpb25zSW5mbyIsImZpbHRlclJlc3RyaWN0aW9ucyIsImZpbHRlclJlc3RyaWN0aW9uc0luZm8iLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNJbmZvIiwiZmlsdGVyRnVuY3Rpb25zIiwiY2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiY3VzdG9tRGF0YUZvckNvbHVtbnMiLCJnZXRDdXN0b21EYXRhIiwicHJvcGVydGllc1RvQmVDcmVhdGVkIiwiZGF0YU1vZGVsRW50aXR5UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJjdXN0b21EYXRhIiwiZm9yRWFjaCIsImNvbHVtbkRlZiIsInR5cGVDb25maWciLCJpc1R5cGVGaWx0ZXJhYmxlIiwiJFR5cGUiLCJnZXRUeXBlTWFwIiwiZ2V0VHlwZUNvbmZpZyIsIlR5cGVNYXAiLCJwcm9wZXJ0eUluZm8iLCJrZXkiLCJwYXRoIiwibGFiZWwiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInRhcmdldFByb3BlcnR5UGF0aCIsInR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJmb3JtYXRPcHRpb25zIiwiY29uc3RyYWludHMiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJyZWxhdGVkUHJvcGVydHlQYXRocyIsImtleXMiLCJsZW5ndGgiLCJwcm9wZXJ0eUluZm9zIiwiZmluZCIsImRhdGFUeXBlIiwiY2xhc3NOYW1lIiwidHlwZUluc3RhbmNlIiwib0NvbnN0cmFpbnRzIiwib0Zvcm1hdE9wdGlvbnMiLCJzb3J0YWJsZSIsImlzU29ydGFibGVQcm9wZXJ0eSIsImZpbHRlcmFibGUiLCJpc0ZpbHRlcmFibGVQcm9wZXJ0eSIsIm1heENvbmRpdGlvbnMiLCJnZXRQcm9wZXJ0eU1heENvbmRpdGlvbnMiLCJwdXNoIiwicmVsYXRlZENvbHVtbnMiLCJjcmVhdGVSZWxhdGVkUHJvcGVydGllcyIsImNvbmNhdCIsInVwZGF0ZUJpbmRpbmdJbmZvIiwibWRjVGFibGUiLCJiaW5kaW5nSW5mbyIsImFwcGx5IiwiY29sbGVjdGlvblBhdGgiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyQmFyIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0RmlsdGVyIiwiaXNGaWx0ZXJFbmFibGVkIiwiaXNGaWx0ZXJpbmdFbmFibGVkIiwiY29uZGl0aW9ucyIsImlubmVyRmlsdGVySW5mbyIsIm91dGVyRmlsdGVySW5mbyIsImZpbHRlcnMiLCJ0YWJsZVByb3BlcnRpZXMiLCJnZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0Q29uZGl0aW9ucyIsIkZpbHRlclV0aWwiLCJnZXRGaWx0ZXJJbmZvIiwiaXNUcmVlVGFibGUiLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCIkJGFnZ3JlZ2F0aW9uIiwiZXhwYW5kVG8iLCJpbml0aWFsRXhwYW5zaW9uTGV2ZWwiLCJwYXJhbWV0ZXJOYW1lcyIsIkRlbGVnYXRlVXRpbCIsImdldFBhcmFtZXRlck5hbWVzIiwiX3VwZGF0ZVByb3BlcnR5SW5mbyIsInBhcmFtZXRlclBhdGgiLCJnZXRQYXJhbWV0ZXJzSW5mbyIsIiRzZWFyY2giLCJDb21tb25VdGlscyIsIm5vcm1hbGl6ZVNlYXJjaFRlcm0iLCJnZXRTZWFyY2giLCJ1bmRlZmluZWQiLCJzZWFyY2giLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiJCRzaGFyZWRSZXF1ZXN0IiwiX2FwcGx5RGVmYXVsdFNvcnRpbmciLCIkc2VsZWN0IiwicmVkdWNlIiwicXVlcnkiLCJpbmNsdWRlcyIsIiRjb3VudCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJGaWx0ZXIiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhdHRhY2hFdmVudE9uY2UiLCJzb3J0ZXIiLCJkZWZhdWx0U29ydFByb3BlcnR5TmFtZSIsIlNvcnRlciIsImFUYWJsZVByb3BlcnRpZXMiLCJvTURDVGFibGUiLCJtQ29uZGl0aW9ucyIsIm9NZXRhZGF0YUluZm8iLCJhQ29uZGl0aW9uS2V5Iiwib01ldGFNb2RlbCIsImNvbmRpdGlvbktleSIsImNvbmRpdGlvbktleVR5cGUiLCJnZXRPYmplY3QiLCJ0YWJsZVByb3BlcnR5IiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJvQ29sdW1uRGVmIiwiYmFzZVR5cGUiLCJ1cGRhdGVCaW5kaW5nIiwib1RhYmxlIiwib0JpbmRpbmdJbmZvIiwib0JpbmRpbmciLCJiTmVlZE1hbnVhbFJlZnJlc2giLCJvSW50ZXJuYWxCaW5kaW5nQ29udGV4dCIsInNNYW51YWxVcGRhdGVQcm9wZXJ0eUtleSIsInNMYXN0U2VhcmNoIiwic0xhc3RGaWx0ZXIiLCJiUGVuZGluZ01hbnVhbFVwZGF0ZSIsImxhc3RTZWFyY2giLCJsYXN0RmlsdGVyIiwib1Jvd0JpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiZGVlcEVxdWFsIiwicmVxdWVzdFJlZnJlc2giLCJnZXRHcm91cElkIiwiZmluYWxseSIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJmaXJlRXZlbnQiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwicmVsYXRlZENvbHVtbiIsImNvbHVtbiIsIm5ld05hbWUiLCJ2YWx1ZUhlbHBDb2x1bW5UeXBlQ29uZmlnIiwidmFsdWVIZWxwVGFibGVDb2x1bW4iLCJnZXRMYWJlbCIsIm1hcCIsImNvbHVtbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImlzTXVsdGlWYWx1ZUZpbHRlckV4cHJlc3Npb24iLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHlQYXRoIiwiZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUYWJsZURlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0VHlwZUNvbmZpZyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi90YWJsZS9Db2x1bW5zXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclJlc3RyaWN0aW9uc0luZm9UeXBlLCBTb3J0UmVzdHJpY3Rpb25zSW5mb1R5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHsgZ2V0RmlsdGVyUmVzdHJpY3Rpb25zSW5mbywgZ2V0U29ydFJlc3RyaWN0aW9uc0luZm8sIGlzTXVsdGlWYWx1ZUZpbHRlckV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBlbmhhbmNlRGF0YU1vZGVsUGF0aCwgZ2V0VGFyZ2V0T2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGdldExhYmVsXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERlZmF1bHRUeXBlRm9yRWRtVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IHsgaXNUeXBlRmlsdGVyYWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQmluZGluZ0luZm8sIEZpbHRlckluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db2xsZWN0aW9uQmluZGluZ0luZm9cIjtcbmltcG9ydCBNYWNyb3NEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvRGVsZWdhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckNvbmRpdGlvbnMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXJCYXIvRmlsdGVySGVscGVyXCI7XG5pbXBvcnQgeyBnZXRQYXRoLCBpc0ZpbHRlcmFibGVQcm9wZXJ0eSwgaXNTb3J0YWJsZVByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1RhYmxlRGVsZWdhdGVIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IE1EQ1RhYmxlUHJvcGVydHlJbmZvIGFzIFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBUYWJsZURlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1RhYmxlRGVsZWdhdGVcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCBEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvdXRpbC9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBGaWx0ZXJVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3V0aWwvRmlsdGVyVXRpbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbnR5cGUgQ29tcGxleFByb3BlcnR5TWFwID0gUmVjb3JkPHN0cmluZywgUHJvcGVydHk+O1xuXG50eXBlIE1kY1RhYmxlRGVsZWdhdGUgPSB7IG5hbWU6IHN0cmluZzsgcGF5bG9hZDogUGF5bG9hZCB9O1xuXG50eXBlIFBheWxvYWQgPSB7XG5cdGNvbGxlY3Rpb25OYW1lPzogc3RyaW5nO1xuXHRjb2xsZWN0aW9uUGF0aD86IHN0cmluZztcblx0ZGVmYXVsdFNvcnRQcm9wZXJ0eU5hbWU/OiBzdHJpbmc7XG5cdGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZztcblx0aW5pdGlhbEV4cGFuc2lvbkxldmVsPzogbnVtYmVyO1xufTtcbi8qKlxuICogVGVzdCBkZWxlZ2F0ZSBmb3IgT0RhdGEgVjQuXG4gKi9cbmNvbnN0IE9EYXRhVGFibGVEZWxlZ2F0ZSA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlRGVsZWdhdGUpO1xuXG4vKipcbiAqIEZldGNoZXMgdGhlIHJlbGV2YW50IG1ldGFkYXRhIGZvciB0aGUgdGFibGUgYW5kIHJldHVybnMgcHJvcGVydHkgaW5mbyBhcnJheS5cbiAqIEBwYXJhbSB0YWJsZSBJbnN0YW5jZSBvZiB0aGUgTURDdGFibGVcbiAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IGluZm9cbiAqL1xuT0RhdGFUYWJsZURlbGVnYXRlLmZldGNoUHJvcGVydGllcyA9IGFzeW5jIGZ1bmN0aW9uICh0YWJsZTogVGFibGUpOiBQcm9taXNlPFByb3BlcnR5SW5mbz4ge1xuXHRjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuX2dldE1vZGVsKHRhYmxlKTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGF3YWl0IHRoaXMuX2NyZWF0ZVByb3BlcnR5SW5mb3ModGFibGUsIG1vZGVsKTtcblx0T0RhdGFUYWJsZURlbGVnYXRlLmNyZWF0ZUludGVybmFsQmluZGluZ0NvbnRleHQodGFibGUpO1xuXHRNYWNyb3NEZWxlZ2F0ZVV0aWwuc2V0Q2FjaGVkUHJvcGVydGllcyh0YWJsZSwgcHJvcGVydGllcyk7XG5cdCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIENvbnRleHQpLnNldFByb3BlcnR5KFwidGFibGVQcm9wZXJ0aWVzQXZhaWxhYmxlXCIsIHRydWUpO1xuXHRyZXR1cm4gcHJvcGVydGllcztcbn07XG5cbk9EYXRhVGFibGVEZWxlZ2F0ZS5jcmVhdGVJbnRlcm5hbEJpbmRpbmdDb250ZXh0ID0gZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSk6IHZvaWQge1xuXHRsZXQgZGlhbG9nOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCA9IHRhYmxlO1xuXHR3aGlsZSAoZGlhbG9nICYmICFkaWFsb2cuaXNBKFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuRGlhbG9nXCIpKSB7XG5cdFx0ZGlhbG9nID0gKGRpYWxvZyBhcyBNYW5hZ2VkT2JqZWN0KS5nZXRQYXJlbnQoKTtcblx0fVxuXG5cdGNvbnN0IGludGVybmFsTW9kZWwgPSB0YWJsZS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRpZiAoZGlhbG9nICYmIGludGVybmFsTW9kZWwpIHtcblx0XHRjb25zdCBpbnRlcm5hbEJpbmRpbmdDb250ZXh0ID0gZGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0bGV0IG5ld0ludGVybmFsQmluZGluZ0NvbnRleHRQYXRoO1xuXHRcdGlmIChpbnRlcm5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0UGF0aCA9IGludGVybmFsQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpICsgYDo6VkhEaWFsb2c6OiR7ZGlhbG9nLmdldElkKCl9Ojp0YWJsZWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld0ludGVybmFsQmluZGluZ0NvbnRleHRQYXRoID0gYC9idWlsZGluZ2Jsb2Nrcy8ke3RhYmxlLmdldElkKCl9YDtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvYnVpbGRpbmdibG9ja3NcIiwgeyAuLi5pbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL2J1aWxkaW5nYmxvY2tzXCIpIH0pO1xuXHRcdH1cblx0XHRjb25zdCBuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0ID0gaW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dChuZXdJbnRlcm5hbEJpbmRpbmdDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0dGFibGUuc2V0QmluZGluZ0NvbnRleHQobmV3SW50ZXJuYWxCaW5kaW5nQ29udGV4dCwgXCJpbnRlcm5hbFwiKTtcblx0fVxufTtcblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGlkZW50aWZpZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik6IENvbXBsZXhQcm9wZXJ0eU1hcCB7XG5cdGNvbnN0IGRhdGFNb2RlbEFkZGl0aW9uYWxQcm9wZXJ0eVBhdGggPSBnZXRBZGRpdGlvbmFsUHJvcGVydHkoZGF0YU1vZGVsUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eU1hcCA9IHt9O1xuXHRpZiAoZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5UGF0aD8udGFyZ2V0T2JqZWN0KSB7XG5cdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5ID0gZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5UGF0aCwgdHJ1ZSk7XG5cblx0XHRjb25zdCBwcm9wZXJ0eSA9IGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIHRydWUpO1xuXG5cdFx0Y29uc3QgdGV4dEFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LFxuXHRcdFx0dGV4dEFycmFuZ2VtZW50ID0gdGV4dEFubm90YXRpb24/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50Py50b1N0cmluZygpLFxuXHRcdFx0ZGlzcGxheU1vZGUgPSB0ZXh0QW5ub3RhdGlvbiAmJiB0ZXh0QXJyYW5nZW1lbnQgJiYgZ2V0RGlzcGxheU1vZGUocHJvcGVydHksIGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRFbnRpdHlUeXBlKTtcblxuXHRcdGlmIChkaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlQYXRoXSA9IGFkZGl0aW9uYWxQcm9wZXJ0eTtcblx0XHR9IGVsc2UgaWYgKChkaXNwbGF5TW9kZSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB8fCAhdGV4dEFubm90YXRpb24pIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eVBhdGhdID0gYWRkaXRpb25hbFByb3BlcnR5O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbk9EYXRhVGFibGVEZWxlZ2F0ZS5fY3JlYXRlUHJvcGVydHlJbmZvcyA9IGFzeW5jIGZ1bmN0aW9uICh0YWJsZTogVGFibGUsIG1vZGVsOiBPRGF0YU1vZGVsKTogUHJvbWlzZTxQcm9wZXJ0eUluZm9bXT4ge1xuXHRjb25zdCBtZXRhZGF0YUluZm8gPSAodGFibGUuZ2V0RGVsZWdhdGUoKSBhcyB7IHBheWxvYWQ6IFBheWxvYWQgfSkucGF5bG9hZDtcblx0Y29uc3QgcHJvcGVydGllczogUHJvcGVydHlJbmZvW10gPSBbXTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IGAvJHttZXRhZGF0YUluZm8uY29sbGVjdGlvbk5hbWV9YDtcblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0cmV0dXJuIG1ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9QGApLnRoZW4oZnVuY3Rpb24gKGVudGl0eVNldEFubm90YXRpb25zOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0luZm8gPSBnZXRTb3J0UmVzdHJpY3Rpb25zSW5mbyhlbnRpdHlTZXRBbm5vdGF0aW9ucyk7XG5cdFx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zID0gZW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNcIl07XG5cdFx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zSW5mbyA9IGdldEZpbHRlclJlc3RyaWN0aW9uc0luZm8oZmlsdGVyUmVzdHJpY3Rpb25zKTtcblx0XHRjb25zdCBmaWx0ZXJGdW5jdGlvbnMgPSBlbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlckZ1bmN0aW9uc1wiXTtcblx0XHRjb25zdCBjYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG1ldGFNb2RlbCwgZmlsdGVyRnVuY3Rpb25zKTtcblx0XHRjb25zdCBjdXN0b21EYXRhRm9yQ29sdW1ucyA9IE1hY3Jvc0RlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhPHtcblx0XHRcdGN1c3RvbURhdGE6IChQcm9wZXJ0eUluZm8gJiB7ICRUeXBlOiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0pW107XG5cdFx0fT4odGFibGUsIFwiY29sdW1uc1wiKSE7XG5cdFx0Y29uc3QgcHJvcGVydGllc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fTtcblx0XHRjb25zdCBkYXRhTW9kZWxFbnRpdHlQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKCh0YWJsZS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldENvbnRleHQoZW50aXR5U2V0UGF0aCkpO1xuXHRcdGN1c3RvbURhdGFGb3JDb2x1bW5zLmN1c3RvbURhdGEuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uRGVmOiBQcm9wZXJ0eUluZm8gJiB7ICRUeXBlOiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0pIHtcblx0XHRcdGxldCB0eXBlQ29uZmlnID0gaXNUeXBlRmlsdGVyYWJsZShjb2x1bW5EZWYuJFR5cGUpXG5cdFx0XHRcdD8gdGFibGUuZ2V0VHlwZU1hcCgpLmdldFR5cGVDb25maWcoY29sdW1uRGVmLiRUeXBlKVxuXHRcdFx0XHQ6IFR5cGVNYXAuZ2V0VHlwZUNvbmZpZyhcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvID0ge1xuXHRcdFx0XHRrZXk6IGNvbHVtbkRlZi5wYXRoISxcblx0XHRcdFx0bGFiZWw6IGNvbHVtbkRlZi5sYWJlbFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgZGF0YU1vZGVsUHJvcGVydHlQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbEVudGl0eVBhdGgsIGNvbHVtbkRlZi5wYXRoKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0XHRcdGlmIChwcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eVBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgdHJ1ZSk7XG5cdFx0XHRcdGlmIChpc1R5cGVGaWx0ZXJhYmxlKHByb3BlcnR5LnR5cGUgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSkpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5KTtcblx0XHRcdFx0XHR0eXBlQ29uZmlnID1cblx0XHRcdFx0XHRcdFR5cGVNYXAuZ2V0VHlwZUNvbmZpZyhcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPz8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdFx0XHRcdFx0KSA/PyB0eXBlQ29uZmlnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSBsaW5rZWQgdG8gdGhlIHByb3BlcnR5IGFzIGEgVW5pdCwgQ3VycmVuY3ksIFRpbWV6b25lIG9yIHRleHRBcnJhbmdlbWVudFxuXHRcdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoZGF0YU1vZGVsUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5UGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlQYXRocztcblx0XHRcdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eVBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNUb0JlQ3JlYXRlZFtwYXRoXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mb1twYXRoXTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvLyBBbHNvIGFkZCBwcm9wZXJ0eSBmb3IgdGhlIGluT3V0IFBhcmFtZXRlcnMgb24gdGhlIFZhbHVlSGVscCB3aGVuIHRleHRBcnJhbmdlbWVudCBpcyBzZXQgdG8gI1RleHRPbmx5XG5cdFx0XHRcdFx0Ly8gSXQgd2lsbCBub3QgYmUgbGlua2VkIHRvIHRoZSBjb21wbGV4IFByb3BlcnR5IChCQ1AgMjI3MDE0MTE1NClcblx0XHRcdFx0XHRpZiAoIXJlbGF0ZWRQcm9wZXJ0eVBhdGhzLmZpbmQoKHBhdGgpID0+IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mb1twYXRoXSA9PT0gcHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9CZUNyZWF0ZWRbdGFyZ2V0UHJvcGVydHlQYXRoXSA9IHByb3BlcnR5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8ucGF0aCA9IGNvbHVtbkRlZi5wYXRoO1xuXHRcdFx0XHRcdHByb3BlcnR5SW5mby5kYXRhVHlwZSA9IHR5cGVDb25maWcuY2xhc3NOYW1lO1xuXHRcdFx0XHRcdHByb3BlcnR5SW5mby5jb25zdHJhaW50cyA9IHR5cGVDb25maWcudHlwZUluc3RhbmNlLm9Db25zdHJhaW50cztcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uZm9ybWF0T3B0aW9ucyA9IHR5cGVDb25maWcudHlwZUluc3RhbmNlLm9Gb3JtYXRPcHRpb25zO1xuXHRcdFx0XHRcdHByb3BlcnR5SW5mby5zb3J0YWJsZSA9IGlzU29ydGFibGVQcm9wZXJ0eShzb3J0UmVzdHJpY3Rpb25zSW5mbywgY29sdW1uRGVmKTtcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uZmlsdGVyYWJsZSA9IGlzRmlsdGVyYWJsZVByb3BlcnR5KGZpbHRlclJlc3RyaWN0aW9uc0luZm8sIGNvbHVtbkRlZik7XG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvLm1heENvbmRpdGlvbnMgPSBnZXRQcm9wZXJ0eU1heENvbmRpdGlvbnMoZmlsdGVyUmVzdHJpY3Rpb25zSW5mbywgY29sdW1uRGVmKTtcblx0XHRcdFx0XHRwcm9wZXJ0eUluZm8uY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHByb3BlcnR5SW5mby5wYXRoID0gY29sdW1uRGVmLnBhdGg7XG5cdFx0XHRcdHByb3BlcnR5SW5mby5jYXNlU2Vuc2l0aXZlID0gY2FzZVNlbnNpdGl2ZTtcblx0XHRcdFx0cHJvcGVydHlJbmZvLmRhdGFUeXBlID0gdHlwZUNvbmZpZy5jbGFzc05hbWU7XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlJbmZvKTtcblx0XHR9KTtcblx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IGNyZWF0ZVJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0cHJvcGVydGllc1RvQmVDcmVhdGVkLFxuXHRcdFx0cHJvcGVydGllcyxcblx0XHRcdHNvcnRSZXN0cmljdGlvbnNJbmZvLFxuXHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zSW5mbyxcblx0XHRcdGNhc2VTZW5zaXRpdmVcblx0XHQpO1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG5cdH0pO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBiaW5kaW5nIGluZm8gd2l0aCB0aGUgcmVsZXZhbnQgcGF0aCBhbmQgbW9kZWwgZnJvbSB0aGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0gbWRjVGFibGUgVGhlIE1EQ1RhYmxlIGluc3RhbmNlXG4gKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmdJbmZvIG9mIHRoZSB0YWJsZVxuICovXG5PRGF0YVRhYmxlRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8gPSBmdW5jdGlvbiAobWRjVGFibGU6IFRhYmxlLCBiaW5kaW5nSW5mbzogQ29sbGVjdGlvbkJpbmRpbmdJbmZvKTogdm9pZCB7XG5cdFRhYmxlRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8uYXBwbHkodGhpcywgW21kY1RhYmxlLCBiaW5kaW5nSW5mb10pO1xuXG5cdGNvbnN0IG1ldGFkYXRhSW5mbyA9IChtZGNUYWJsZS5nZXREZWxlZ2F0ZSgpIGFzIE1kY1RhYmxlRGVsZWdhdGUpLnBheWxvYWQ7XG5cblx0aWYgKG1ldGFkYXRhSW5mbykge1xuXHRcdGJpbmRpbmdJbmZvLnBhdGggPSBiaW5kaW5nSW5mbz8ucGF0aCB8fCBtZXRhZGF0YUluZm8uY29sbGVjdGlvblBhdGggfHwgYC8ke21ldGFkYXRhSW5mby5jb2xsZWN0aW9uTmFtZX1gO1xuXHR9XG5cblx0YmluZGluZ0luZm8ucGFyYW1ldGVycyA9IGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgfHwge307XG5cblx0Y29uc3QgZmlsdGVyQmFyID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZGNUYWJsZS5nZXRGaWx0ZXIoKSkgYXMgRmlsdGVyQmFyLFxuXHRcdGlzRmlsdGVyRW5hYmxlZCA9IG1kY1RhYmxlLmlzRmlsdGVyaW5nRW5hYmxlZCgpO1xuXHRsZXQgY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgRmlsdGVyQ29uZGl0aW9uc1tdPjtcblx0bGV0IGlubmVyRmlsdGVySW5mbywgb3V0ZXJGaWx0ZXJJbmZvOiBGaWx0ZXJJbmZvO1xuXHRjb25zdCBmaWx0ZXJzID0gW107XG5cdGNvbnN0IHRhYmxlUHJvcGVydGllcyA9IE1hY3Jvc0RlbGVnYXRlVXRpbC5nZXRDYWNoZWRQcm9wZXJ0aWVzKG1kY1RhYmxlKSBhcyB1bmtub3duIGFzIFByb3BlcnR5SW5mb1tdO1xuXG5cdC8vVE9ETzogY29uc2lkZXIgYSBtZWNoYW5pc20gKCdGaWx0ZXJNZXJnZVV0aWwnIG9yIGVuaGFuY2UgJ0ZpbHRlclV0aWwnKSB0byBhbGxvdyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBmaWx0ZXJzKVxuXHRpZiAoaXNGaWx0ZXJFbmFibGVkKSB7XG5cdFx0Y29uZGl0aW9ucyA9IG1kY1RhYmxlLmdldENvbmRpdGlvbnMoKTtcblx0XHRpbm5lckZpbHRlckluZm8gPSBGaWx0ZXJVdGlsLmdldEZpbHRlckluZm8obWRjVGFibGUsIGNvbmRpdGlvbnMsIHRhYmxlUHJvcGVydGllcyEsIFtdKSBhcyBGaWx0ZXJJbmZvO1xuXHRcdGlmIChpbm5lckZpbHRlckluZm8uZmlsdGVycykge1xuXHRcdFx0ZmlsdGVycy5wdXNoKGlubmVyRmlsdGVySW5mby5maWx0ZXJzKTtcblx0XHR9XG5cdH1cblx0Y29uc3QgaXNUcmVlVGFibGUgPSAhIW1ldGFkYXRhSW5mbz8uaGllcmFyY2h5UXVhbGlmaWVyO1xuXHRpZiAoaXNUcmVlVGFibGUpIHtcblx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24gPSB7XG5cdFx0XHRoaWVyYXJjaHlRdWFsaWZpZXI6IG1ldGFkYXRhSW5mby5oaWVyYXJjaHlRdWFsaWZpZXIsXG5cdFx0XHRleHBhbmRUbzogbWV0YWRhdGFJbmZvLmluaXRpYWxFeHBhbnNpb25MZXZlbFxuXHRcdH07XG5cdH1cblx0aWYgKGZpbHRlckJhcikge1xuXHRcdGNvbmRpdGlvbnMgPSBmaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpO1xuXHRcdGlmIChjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJOYW1lcyA9IERlbGVnYXRlVXRpbC5nZXRQYXJhbWV0ZXJOYW1lcyhmaWx0ZXJCYXIpO1xuXHRcdFx0Ly8gVGhlIHRhYmxlIHByb3BlcnRpZXMgbmVlZHMgdG8gdXBkYXRlZCB3aXRoIHRoZSBmaWx0ZXIgZmllbGQgaWYgbm8gU2VsZWN0aW9uZmllbGRzIGFyZSBhbm5vdGF0ZWQgYW5kIG5vdCBwYXJ0IGFzIHZhbHVlIGhlbHAgcGFyYW1ldGVyXG5cdFx0XHRPRGF0YVRhYmxlRGVsZWdhdGUuX3VwZGF0ZVByb3BlcnR5SW5mbyh0YWJsZVByb3BlcnRpZXMsIG1kY1RhYmxlLCBjb25kaXRpb25zLCBtZXRhZGF0YUluZm8pO1xuXHRcdFx0b3V0ZXJGaWx0ZXJJbmZvID0gRmlsdGVyVXRpbC5nZXRGaWx0ZXJJbmZvKGZpbHRlckJhciwgY29uZGl0aW9ucywgdGFibGVQcm9wZXJ0aWVzISwgcGFyYW1ldGVyTmFtZXMpO1xuXG5cdFx0XHRpZiAob3V0ZXJGaWx0ZXJJbmZvLmZpbHRlcnMpIHtcblx0XHRcdFx0ZmlsdGVycy5wdXNoKG91dGVyRmlsdGVySW5mby5maWx0ZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcGFyYW1ldGVyUGF0aCA9IERlbGVnYXRlVXRpbC5nZXRQYXJhbWV0ZXJzSW5mbyhmaWx0ZXJCYXIsIGNvbmRpdGlvbnMpO1xuXHRcdFx0aWYgKHBhcmFtZXRlclBhdGgpIHtcblx0XHRcdFx0YmluZGluZ0luZm8ucGF0aCA9IHBhcmFtZXRlclBhdGg7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghaXNUcmVlVGFibGUpIHtcblx0XHRcdC8vIGdldCB0aGUgYmFzaWMgc2VhcmNoXG5cdFx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiRzZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKGZpbHRlckJhci5nZXRTZWFyY2goKSkgfHwgdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoZmlsdGVyQmFyLmdldFNlYXJjaCgpKSB7XG5cdFx0XHRpZiAoIWJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJCRhZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJCRhZ2dyZWdhdGlvbi5zZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKGZpbHRlckJhci5nZXRTZWFyY2goKSk7XG5cdFx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkYWdncmVnYXRpb24uZXhwYW5kVG8gPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblx0XHR9XG5cdH1cblx0Ly8gQkNQOiAyMzcwMDc4NjYwIC0gc2hhcmVkUmVxdWVzdCBpcyBzZXQgdG8gZmFsc2UgaW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2sgc2l0dWF0aW9uIHdoZXJlIHRoZSB0aGUgb0RhdGFcblx0Ly8gbW9kZWwgY2FjaGUgaXMgbmVpdGhlciBjaGFuZ2VhYmxlIChyZXN1bHQgb2YgTGlzdEJpbmRpbmcuJCRzaGFyZWRSZXF1ZXN0ID0gdHJ1ZSkgbm9yIGRlbGV0YWJsZVxuXHQvLyAocmVzdWx0IG9mIENvbnRleHQuc2V0U2VsZWN0ZWQodHJ1ZSkgLT4gTGlzdEJpbmRpbmcua2VlcEFsaXZlKVxuXHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzLiQkc2hhcmVkUmVxdWVzdCA9IGZhbHNlO1xuXG5cdHRoaXMuX2FwcGx5RGVmYXVsdFNvcnRpbmcoYmluZGluZ0luZm8sIChtZGNUYWJsZS5nZXREZWxlZ2F0ZSgpIGFzIE1kY1RhYmxlRGVsZWdhdGUpLnBheWxvYWQpO1xuXHQvLyBhZGQgc2VsZWN0IHRvIGJpbmRpbmdJbmZvIChCQ1AgMjE3MDE2MzAxMilcblx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kc2VsZWN0ID0gdGFibGVQcm9wZXJ0aWVzPy5yZWR1Y2UoZnVuY3Rpb24gKHF1ZXJ5OiBzdHJpbmcsIHByb3BlcnR5OiBQcm9wZXJ0eUluZm8pIHtcblx0XHQvLyBOYXZpZ2F0aW9uIHByb3BlcnRpZXMgKHJlcHJlc2VudGVkIGJ5IFgvWSkgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byAkc2VsZWN0LlxuXHRcdC8vIFRvRG8gOiBUaGV5IHNob3VsZCBiZSBhZGRlZCBhcyAkZXhwYW5kPVgoJHNlbGVjdD1ZKSBpbnN0ZWFkXG5cdFx0aWYgKHByb3BlcnR5LnBhdGggJiYgIXByb3BlcnR5LnBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRxdWVyeSA9IHF1ZXJ5ID8gYCR7cXVlcnl9LCR7cHJvcGVydHkucGF0aH1gIDogcHJvcGVydHkucGF0aDtcblx0XHR9XG5cdFx0cmV0dXJuIHF1ZXJ5O1xuXHR9LCBcIlwiKTtcblxuXHQvLyBBZGQgJGNvdW50XG5cdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJGNvdW50ID0gdHJ1ZTtcblxuXHQvL0lmIHRoZSBlbnRpdHkgaXMgRHJhZnRFbmFibGVkIGFkZCBhIERyYWZ0RmlsdGVyXG5cdGlmIChiaW5kaW5nSW5mby5wYXRoICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWRjVGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsIGJpbmRpbmdJbmZvLnBhdGgpKSB7XG5cdFx0ZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoXCJJc0FjdGl2ZUVudGl0eVwiLCBGaWx0ZXJPcGVyYXRvci5FUSwgdHJ1ZSkpO1xuXHR9XG5cdGJpbmRpbmdJbmZvLmZpbHRlcnMgPSBuZXcgRmlsdGVyKGZpbHRlcnMgYXMgRmlsdGVyW10sIHRydWUpO1xufTtcblxuT0RhdGFUYWJsZURlbGVnYXRlLmdldFR5cGVNYXAgPSBmdW5jdGlvbiAoKTogb2JqZWN0IHtcblx0cmV0dXJuIFR5cGVNYXA7XG59O1xuXG4vKipcbiAqIEdldCB0YWJsZSBNb2RlbC5cbiAqIEBwYXJhbSB0YWJsZSBJbnN0YW5jZSBvZiB0aGUgTURDdGFibGVcbiAqIEByZXR1cm5zIE1vZGVsXG4gKi9cbk9EYXRhVGFibGVEZWxlZ2F0ZS5fZ2V0TW9kZWwgPSBhc3luYyBmdW5jdGlvbiAodGFibGU6IFRhYmxlKTogUHJvbWlzZTxNb2RlbD4ge1xuXHRjb25zdCBtZXRhZGF0YUluZm8gPSAodGFibGUuZ2V0RGVsZWdhdGUoKSBhcyB7IHBheWxvYWQ6IHsgbW9kZWw6IHN0cmluZyB9IH0pLnBheWxvYWQ7XG5cdGxldCBtb2RlbDogTW9kZWwgPSB0YWJsZS5nZXRNb2RlbChtZXRhZGF0YUluZm8ubW9kZWwpITtcblx0aWYgKCFtb2RlbCkge1xuXHRcdGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0YWJsZS5hdHRhY2hFdmVudE9uY2UoXCJtb2RlbENvbnRleHRDaGFuZ2VcIiwgcmVzb2x2ZSk7XG5cdFx0fSk7XG5cdFx0bW9kZWwgPSB0YWJsZS5nZXRNb2RlbChtZXRhZGF0YUluZm8ubW9kZWwpITtcblx0fVxuXHRyZXR1cm4gbW9kZWw7XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgYSBkZWZhdWx0IHNvcnQgb3JkZXIgaWYgbmVlZGVkLiBUaGlzIGlzIG9ubHkgdGhlIGNhc2UgaWYgdGhlIHJlcXVlc3QgaXMgbm90IGEgJHNlYXJjaCByZXF1ZXN0XG4gKiAobWVhbnMgdGhlIHBhcmFtZXRlciAkc2VhcmNoIG9mIHRoZSBiaW5kaW5nSW5mbyBpcyB1bmRlZmluZWQpIGFuZCBpZiBhIHNvcnQgb3JkZXIgaGFzIG5vdCBiZWVuIHNldCBhbHJlYWR5LFxuICogZm9yIGV4YW1wbGUsIHVzaW5nIGEgcHJlc2VudGF0aW9uIHZhcmlhbnQgb3IgbWFudWFsbHkgc2V0IGJ5IHRoZSB1c2VyLlxuICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nSW5mbyBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkIG9mIHRoZSBUYWJsZURlbGVnYXRlXG4gKi9cbk9EYXRhVGFibGVEZWxlZ2F0ZS5fYXBwbHlEZWZhdWx0U29ydGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nSW5mbzogQ29sbGVjdGlvbkJpbmRpbmdJbmZvLCBwYXlsb2FkOiBQYXlsb2FkKTogdm9pZCB7XG5cdGlmIChcblx0XHRiaW5kaW5nSW5mby5wYXJhbWV0ZXJzICYmXG5cdFx0YmluZGluZ0luZm8ucGFyYW1ldGVycy4kc2VhcmNoID09IHVuZGVmaW5lZCAmJlxuXHRcdGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMuJCRhZ2dyZWdhdGlvbj8uc2VhcmNoID09IHVuZGVmaW5lZCAmJlxuXHRcdGJpbmRpbmdJbmZvLnNvcnRlciAmJlxuXHRcdGJpbmRpbmdJbmZvLnNvcnRlci5sZW5ndGggPT0gMFxuXHQpIHtcblx0XHRjb25zdCBkZWZhdWx0U29ydFByb3BlcnR5TmFtZSA9IHBheWxvYWQgPyBwYXlsb2FkLmRlZmF1bHRTb3J0UHJvcGVydHlOYW1lIDogdW5kZWZpbmVkO1xuXHRcdGlmIChkZWZhdWx0U29ydFByb3BlcnR5TmFtZSkge1xuXHRcdFx0YmluZGluZ0luZm8uc29ydGVyLnB1c2gobmV3IFNvcnRlcihkZWZhdWx0U29ydFByb3BlcnR5TmFtZSwgZmFsc2UpKTtcblx0XHR9XG5cdH1cbn07XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdGFibGUgcHJvcGVydGllcyB3aXRoIGZpbHRlciBmaWVsZCBpbmZvcy5cbiAqIEBwYXJhbSBhVGFibGVQcm9wZXJ0aWVzIEFycmF5IHdpdGggdGFibGUgcHJvcGVydGllc1xuICogQHBhcmFtIG9NRENUYWJsZSBUaGUgTURDVGFibGUgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29uZGl0aW9ucyBUaGUgY29uZGl0aW9ucyBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSBvTWV0YWRhdGFJbmZvIFRoZSBtZXRhZGF0YSBpbmZvIG9mIHRoZSBmaWx0ZXIgZmllbGRcbiAqL1xuT0RhdGFUYWJsZURlbGVnYXRlLl91cGRhdGVQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoXG5cdGFUYWJsZVByb3BlcnRpZXM6IFByb3BlcnR5SW5mb1tdLFxuXHRvTURDVGFibGU6IFRhYmxlLFxuXHRtQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+LFxuXHRvTWV0YWRhdGFJbmZvOiBQYXlsb2FkXG4pOiB2b2lkIHtcblx0Y29uc3QgYUNvbmRpdGlvbktleSA9IE9iamVjdC5rZXlzKG1Db25kaXRpb25zKSxcblx0XHRvTWV0YU1vZGVsID0gKG9NRENUYWJsZS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpITtcblx0YUNvbmRpdGlvbktleS5mb3JFYWNoKGZ1bmN0aW9uIChjb25kaXRpb25LZXk6IHN0cmluZykge1xuXHRcdC8vIFRoZSB0eXBlQ29uZmlnIGlzIG5vdCBzZXQgaW4gdGhlIHRhYmxlIHByb3BlcnR5SW5mb3MsIGJ1dCB3ZSBuZWVkIHRvIHNldCBpdCBmb3IgdGhlIGZpbHRlciBmaWVsZHNcblx0XHRjb25zdCBjb25kaXRpb25LZXlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke29NZXRhZGF0YUluZm8uY29sbGVjdGlvbk5hbWV9LyR7Y29uZGl0aW9uS2V5fWApPy4kVHlwZSA/PyBcIkVkbS5TdHJpbmdcIjtcblx0XHRjb25zdCB0eXBlQ29uZmlnID0gb01EQ1RhYmxlLmdldFR5cGVNYXAoKS5nZXRUeXBlQ29uZmlnKGNvbmRpdGlvbktleVR5cGUpO1xuXHRcdGFUYWJsZVByb3BlcnRpZXMuZm9yRWFjaCgodGFibGVQcm9wZXJ0eSwgaW5kZXgpID0+IHtcblx0XHRcdGlmICh0YWJsZVByb3BlcnR5LnBhdGggPT09IGNvbmRpdGlvbktleSkge1xuXHRcdFx0XHQoYVRhYmxlUHJvcGVydGllc1tpbmRleF0gYXMgUHJvcGVydHlJbmZvICYgeyB0eXBlQ29uZmlnOiBvYmplY3QgfSkudHlwZUNvbmZpZyA9IHR5cGVDb25maWc7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKFxuXHRcdFx0YVRhYmxlUHJvcGVydGllcy5maW5kSW5kZXgoZnVuY3Rpb24gKHRhYmxlUHJvcGVydHk6IFByb3BlcnR5SW5mbykge1xuXHRcdFx0XHRyZXR1cm4gdGFibGVQcm9wZXJ0eS5wYXRoID09PSBjb25kaXRpb25LZXk7XG5cdFx0XHR9KSA9PT0gLTFcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9Db2x1bW5EZWY6IFByb3BlcnR5SW5mbyA9IHtcblx0XHRcdFx0a2V5OiBjb25kaXRpb25LZXksXG5cdFx0XHRcdGxhYmVsOiBjb25kaXRpb25LZXksXG5cdFx0XHRcdHBhdGg6IGNvbmRpdGlvbktleSxcblx0XHRcdFx0ZGF0YVR5cGU6IHR5cGVDb25maWcudHlwZUluc3RhbmNlLmJhc2VUeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB0eXBlQ29uZmlnLnR5cGVJbnN0YW5jZT8ub0Zvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGNvbnN0cmFpbnRzOiB0eXBlQ29uZmlnLnR5cGVJbnN0YW5jZT8ub0NvbnN0cmFpbnRzXG5cdFx0XHR9O1xuXHRcdFx0YVRhYmxlUHJvcGVydGllcy5wdXNoKG9Db2x1bW5EZWYpO1xuXHRcdH1cblx0fSk7XG59O1xuXG5PRGF0YVRhYmxlRGVsZWdhdGUudXBkYXRlQmluZGluZyA9IGZ1bmN0aW9uIChcblx0b1RhYmxlOiBUYWJsZSxcblx0b0JpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyAmIHtcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHQkc2VhcmNoPzogc3RyaW5nO1xuXHRcdH07XG5cdH0sXG5cdG9CaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG4pOiB2b2lkIHtcblx0bGV0IGJOZWVkTWFudWFsUmVmcmVzaCA9IGZhbHNlO1xuXHRjb25zdCBvSW50ZXJuYWxCaW5kaW5nQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRjb25zdCBzTWFudWFsVXBkYXRlUHJvcGVydHlLZXkgPSBcInBlbmRpbmdNYW51YWxCaW5kaW5nVXBkYXRlXCI7XG5cdGNvbnN0IHNMYXN0U2VhcmNoID0gXCJsYXN0U2VhcmNoXCI7XG5cdGNvbnN0IHNMYXN0RmlsdGVyID0gXCJsYXN0RmlsdGVyXCI7XG5cdGNvbnN0IGJQZW5kaW5nTWFudWFsVXBkYXRlID0gb0ludGVybmFsQmluZGluZ0NvbnRleHQ/LmdldFByb3BlcnR5KHNNYW51YWxVcGRhdGVQcm9wZXJ0eUtleSk7XG5cdGNvbnN0IGxhc3RTZWFyY2ggPSBvSW50ZXJuYWxCaW5kaW5nQ29udGV4dD8uZ2V0UHJvcGVydHkoc0xhc3RTZWFyY2gpO1xuXHRjb25zdCBsYXN0RmlsdGVyID0gb0ludGVybmFsQmluZGluZ0NvbnRleHQ/LmdldFByb3BlcnR5KHNMYXN0RmlsdGVyKTtcblx0bGV0IG9Sb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblxuXHQvL29CaW5kaW5nPW51bGwgbWVhbnMgdGhhdCBhIHJlYmluZGluZyBuZWVkcyB0byBiZSBmb3JjZWQgdmlhIHVwZGF0ZUJpbmRpbmcgaW4gbWRjIFRhYmxlRGVsZWdhdGVcblx0VGFibGVEZWxlZ2F0ZS51cGRhdGVCaW5kaW5nLmFwcGx5KE9EYXRhVGFibGVEZWxlZ2F0ZSwgW29UYWJsZSwgb0JpbmRpbmdJbmZvLCBvQmluZGluZ10pO1xuXHQvL2dldCByb3cgYmluZGluZyBhZnRlciByZWJpbmQgZnJvbSBUYWJsZURlbGVnYXRlLnVwZGF0ZUJpbmRpbmcgaW4gY2FzZSBvQmluZGluZyB3YXMgbnVsbFxuXHRpZiAoIW9Sb3dCaW5kaW5nKSB7XG5cdFx0b1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHR9XG5cdGlmIChvUm93QmluZGluZykge1xuXHRcdC8qKlxuXHRcdCAqIE1hbnVhbCByZWZyZXNoIGlmIGZpbHRlcnMgYXJlIG5vdCBjaGFuZ2VkIGJ5IGJpbmRpbmcucmVmcmVzaCgpIHNpbmNlIHVwZGF0aW5nIHRoZSBiaW5kaW5nSW5mb1xuXHRcdCAqIGlzIG5vdCBlbm91Z2ggdG8gdHJpZ2dlciBhIGJhdGNoIHJlcXVlc3QuXG5cdFx0ICogSW4gY2FzZSB0aGVyZSBpcyBubyBpbnRlcm5hbEJpbmRpbmdDb250ZXh0IChzZWUgQkNQIDIyODAxNjE1MjQpIHdlIGNhbiBub3QgZGV0ZXJtaW5lIGlmIGEgbWFudWFsXG5cdFx0ICogcmVmcmVzaCBpcyBuZWVkZWQgb3Igbm90LiBUaGVyZWZvcmUsIHdlIGFsd2F5cyByZWZyZXNoIGluIHRoaXMgc3BlY2lhbCBjYXNlXG5cdFx0ICovXG5cdFx0Yk5lZWRNYW51YWxSZWZyZXNoID0gb0ludGVybmFsQmluZGluZ0NvbnRleHRcblx0XHRcdD8gZGVlcEVxdWFsKG9CaW5kaW5nSW5mby5maWx0ZXJzLCBsYXN0RmlsdGVyKSAmJiBvQmluZGluZ0luZm8ucGFyYW1ldGVycz8uJHNlYXJjaCA9PT0gbGFzdFNlYXJjaCAmJiAhYlBlbmRpbmdNYW51YWxVcGRhdGVcblx0XHRcdDogdHJ1ZTtcblx0fVxuXHRvSW50ZXJuYWxCaW5kaW5nQ29udGV4dD8uc2V0UHJvcGVydHkoc0xhc3RTZWFyY2gsIG9CaW5kaW5nSW5mby5wYXJhbWV0ZXJzPy4kc2VhcmNoKTtcblx0b0ludGVybmFsQmluZGluZ0NvbnRleHQ/LnNldFByb3BlcnR5KHNMYXN0RmlsdGVyLCBvQmluZGluZ0luZm8uZmlsdGVycyk7XG5cblx0aWYgKGJOZWVkTWFudWFsUmVmcmVzaCAmJiBvVGFibGUuZ2V0RmlsdGVyKCkpIHtcblx0XHRvSW50ZXJuYWxCaW5kaW5nQ29udGV4dD8uc2V0UHJvcGVydHkoc01hbnVhbFVwZGF0ZVByb3BlcnR5S2V5LCB0cnVlKTtcblx0XHRvUm93QmluZGluZ1xuXHRcdFx0LnJlcXVlc3RSZWZyZXNoKG9Sb3dCaW5kaW5nLmdldEdyb3VwSWQoKSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0b0ludGVybmFsQmluZGluZ0NvbnRleHQ/LnNldFByb3BlcnR5KHNNYW51YWxVcGRhdGVQcm9wZXJ0eUtleSwgZmFsc2UpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgYSBmaWx0ZXJCYXIgVkggdGFibGVcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxuXHRvVGFibGUuZmlyZUV2ZW50KFwiYmluZGluZ1VwZGF0ZWRcIik7XG5cdC8vbm8gbmVlZCB0byBjaGVjayBmb3Igc2VtYW50aWMgdGFyZ2V0cyBoZXJlIHNpbmNlIHdlIGFyZSBpbiBhIFZIIGFuZCBkb24ndCB3YW50IHRvIGFsbG93IGZ1cnRoZXIgbmF2aWdhdGlvblxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2ltcGxlIHByb3BlcnR5IGZvciBlYWNoIGlkZW50aWZpZWQgY29tcGxleCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIHByb3BlcnRpZXMgZGVmaW5lZCBvbiB0aGUgVmFsdWUgTGlzdC5cbiAqIEBwYXJhbSBzb3J0UmVzdHJpY3Rpb25zSW5mbyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgc29ydCByZXN0cmljdGlvbiBpbmZvcm1hdGlvblxuICogQHBhcmFtIGZpbHRlclJlc3RyaWN0aW9uc0luZm8gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbHRlciByZXN0cmljdGlvbiBpbmZvcm1hdGlvblxuICogQHJldHVybnMgVGhlIGFycmF5IG9mIHByb3BlcnRpZXMgY3JlYXRlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwcm9wZXJ0aWVzVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBQcm9wZXJ0eUluZm9bXSxcblx0c29ydFJlc3RyaWN0aW9uc0luZm86IFNvcnRSZXN0cmljdGlvbnNJbmZvVHlwZSxcblx0ZmlsdGVyUmVzdHJpY3Rpb25zSW5mbzogRmlsdGVyUmVzdHJpY3Rpb25zSW5mb1R5cGUsXG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuXG4pOiBQcm9wZXJ0eUluZm9bXSB7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcblx0XHRyZWxhdGVkQ29sdW1uczogUHJvcGVydHlJbmZvW10gPSBbXTtcblx0T2JqZWN0LmtleXMocHJvcGVydGllc1RvQmVDcmVhdGVkKS5mb3JFYWNoKChwYXRoKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0aWVzVG9CZUNyZWF0ZWRbcGF0aF0sXG5cdFx0XHRyZWxhdGVkQ29sdW1uID0gZXhpc3RpbmdDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLnBhdGggPT09IHBhdGgpOyAvLyBDb21wbGV4IHByb3BlcnRpZXMgZG9lc24ndCBoYXZlIHBhdGggc28gb25seSBzaW1wbGUgY29sdW1uIGFyZSBmb3VuZFxuXHRcdGlmICghcmVsYXRlZENvbHVtbikge1xuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGBQcm9wZXJ0eTo6JHtwYXRofWA7XG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW3BhdGhdID0gbmV3TmFtZTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdmFsdWVIZWxwQ29sdW1uVHlwZUNvbmZpZyA9IFR5cGVNYXAuZ2V0VHlwZUNvbmZpZyhcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPz8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIixcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHZhbHVlSGVscFRhYmxlQ29sdW1uOiBQcm9wZXJ0eUluZm8gPSB7XG5cdFx0XHRcdGtleTogbmV3TmFtZSxcblx0XHRcdFx0bGFiZWw6IGdldExhYmVsKHByb3BlcnR5KSxcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0c29ydGFibGU6IGlzU29ydGFibGVQcm9wZXJ0eShzb3J0UmVzdHJpY3Rpb25zSW5mbywgcHJvcGVydHkpLFxuXHRcdFx0XHRmaWx0ZXJhYmxlOiBpc0ZpbHRlcmFibGVQcm9wZXJ0eShmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLCBwcm9wZXJ0eSksXG5cdFx0XHRcdGRhdGFUeXBlOiB2YWx1ZUhlbHBDb2x1bW5UeXBlQ29uZmlnLmNsYXNzTmFtZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogaXNUeXBlRmlsdGVyYWJsZShwcm9wZXJ0eS50eXBlIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHRjb25zdHJhaW50czogaXNUeXBlRmlsdGVyYWJsZShwcm9wZXJ0eS50eXBlIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlSGVscFRhYmxlQ29sdW1uLm1heENvbmRpdGlvbnMgPSBnZXRQcm9wZXJ0eU1heENvbmRpdGlvbnMoZmlsdGVyUmVzdHJpY3Rpb25zSW5mbywgdmFsdWVIZWxwVGFibGVDb2x1bW4pO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaCh2YWx1ZUhlbHBUYWJsZUNvbHVtbik7XG5cdFx0fVxuXHR9KTtcblx0Ly8gVGhlIHByb3BlcnR5ICdrZXknIGhhcyBiZWVuIHByZWZpeGVkIHdpdGggJ1Byb3BlcnR5OjonIGZvciB1bmlxdWVuZXNzLlxuXHQvLyBVcGRhdGUgdGhlIHNhbWUgaW4gb3RoZXIgcHJvcGVydHlJbmZvc1tdIHJlZmVyZW5jZXMgd2hpY2ggcG9pbnQgdG8gdGhpcyBwcm9wZXJ0eS5cblx0ZXhpc3RpbmdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdGlmIChjb2x1bW4ucHJvcGVydHlJbmZvcykge1xuXHRcdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChjb2x1bW5OYW1lKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW2NvbHVtbk5hbWVdID8/IGNvbHVtbk5hbWUpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSBtYXhDb25kaXRpb25zIGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICogQHBhcmFtIGZpbHRlclJlc3RyaWN0aW9uc0luZm8gVGhlIGZpbHRlciByZXN0cmljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXN0cmljdGlvbiBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKiBAcmV0dXJucyBgLTFgIG9yIGAxYCBpZiB0aGUgcHJvcGVydHkgaXMgYSBNdWx0aVZhbHVlRmlsdGVyRXhwcmVzc2lvbi5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHlNYXhDb25kaXRpb25zKGZpbHRlclJlc3RyaWN0aW9uc0luZm86IEZpbHRlclJlc3RyaWN0aW9uc0luZm9UeXBlLCBwcm9wZXJ0eTogUHJvcGVydHlJbmZvIHwgUHJvcGVydHkpOiBudW1iZXIge1xuXHRjb25zdCBwcm9wZXJ0eVBhdGggPSBnZXRQYXRoKHByb3BlcnR5KTtcblx0cmV0dXJuIHByb3BlcnR5UGF0aCAmJlxuXHRcdGZpbHRlclJlc3RyaWN0aW9uc0luZm8ucHJvcGVydHlJbmZvPy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eVBhdGgpICYmXG5cdFx0aXNNdWx0aVZhbHVlRmlsdGVyRXhwcmVzc2lvbihmaWx0ZXJSZXN0cmljdGlvbnNJbmZvLnByb3BlcnR5SW5mb1twcm9wZXJ0eVBhdGhdIGFzIHVua25vd24gYXMgc3RyaW5nKVxuXHRcdD8gLTFcblx0XHQ6IDE7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgYWRkaXRpb25hbCBwcm9wZXJ0eSB3aGljaCByZWZlcmVuY2VzIHRvIHRoZSB1bml0LCB0aW1lem9uZSwgdGV4dEFycmFuZ2VtZW50IG9yIGN1cnJlbmN5LlxuICogQHBhcmFtIGRhdGFNb2RlbFByb3BlcnR5UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgVGhlIGFkZGl0aW9uYWwgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUHJvcGVydHkoZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcHJvcGVydHkgPSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0T2JqZWN0O1xuXHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlQYXRoID1cblx0XHRwcm9wZXJ0eSAmJlxuXHRcdChnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHxcblx0XHRcdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHxcblx0XHRcdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fFxuXHRcdFx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHlQYXRoKHByb3BlcnR5KSk7XG5cdGlmICghYWRkaXRpb25hbFByb3BlcnR5UGF0aCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Y29uc3QgZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5ID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgYWRkaXRpb25hbFByb3BlcnR5UGF0aCk7XG5cblx0Ly9BZGRpdGlvbmFsIFByb3BlcnR5IGNvdWxkIHJlZmVyIHRvIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSwga2VlcCB0aGUga2V5IGFuZCBwYXRoIGFzIG5hdmlnYXRpb24gcHJvcGVydHlcblx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5ID0gZGF0YU1vZGVsQWRkaXRpb25hbFByb3BlcnR5LnRhcmdldE9iamVjdDtcblx0aWYgKCFhZGRpdGlvbmFsUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBkYXRhTW9kZWxBZGRpdGlvbmFsUHJvcGVydHk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9EYXRhVGFibGVEZWxlZ2F0ZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMERBO0FBQ0E7QUFDQTtFQUNBLE1BQU1BLGtCQUFrQixHQUFHQyxNQUFNLENBQUND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
@@ -115,7 +115,7 @@ function collectRelatedProperties(dataModelPropertyPath: DataModelObjectPath<Pro
115
115
 
116
116
  const textAnnotation = property.annotations?.Common?.Text,
117
117
  textArrangement = textAnnotation?.annotations?.UI?.TextArrangement?.toString(),
118
- displayMode = textAnnotation && textArrangement && getDisplayMode(property);
118
+ displayMode = textAnnotation && textArrangement && getDisplayMode(property, dataModelPropertyPath.targetEntityType);
119
119
 
120
120
  if (displayMode === "Description") {
121
121
  relatedProperties[additionalPropertyPath] = additionalProperty;
@@ -184,8 +184,8 @@ ODataTableDelegate._createPropertyInfos = async function (table: Table, model: O
184
184
  } else {
185
185
  propertyInfo.path = columnDef.path;
186
186
  propertyInfo.dataType = typeConfig.className;
187
- propertyInfo.constraints = columnDef.constraints;
188
- propertyInfo.formatOptions = columnDef.formatOptions;
187
+ propertyInfo.constraints = typeConfig.typeInstance.oConstraints;
188
+ propertyInfo.formatOptions = typeConfig.typeInstance.oFormatOptions;
189
189
  propertyInfo.sortable = isSortableProperty(sortRestrictionsInfo, columnDef);
190
190
  propertyInfo.filterable = isFilterableProperty(filterRestrictionsInfo, columnDef);
191
191
  propertyInfo.maxConditions = getPropertyMaxConditions(filterRestrictionsInfo, columnDef);
@@ -55,6 +55,7 @@
55
55
  vhIdPrefix="FieldValueHelp"
56
56
  >
57
57
  <formatOptions
58
+ showEmptyIndicator="false"
58
59
  displayMode="{= ValueHelpTemplating.getValueHelpTableDisplayMode(${property>@@Property.getPropertyObjectPath})}"
59
60
  />
60
61
  </macro:Field>