@sapui5/sap.fe.core 1.141.2 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +78 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +91 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +91 -8
  7. package/src/sap/fe/core/AppStateHandler.js +7 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +9 -8
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -11
  14. package/src/sap/fe/core/ExtensionAPI.ts +3 -16
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +12 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +16 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -3
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +5 -2
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -44
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +92 -59
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +87 -50
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +4 -4
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +3 -6
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +49 -21
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +64 -24
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +6 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +21 -15
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +18 -15
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  75. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  76. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  77. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +3 -2
  78. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +2 -1
  79. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
  85. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  86. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  87. package/src/sap/fe/core/converters/common/AnnotationConverter.js +118 -39
  88. package/src/sap/fe/core/converters/controls/Common/Action.js +58 -21
  89. package/src/sap/fe/core/converters/controls/Common/Action.ts +72 -22
  90. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  91. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  92. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  93. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  94. package/src/sap/fe/core/converters/controls/Common/Table.js +87 -22
  95. package/src/sap/fe/core/converters/controls/Common/Table.ts +112 -21
  96. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  97. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  99. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +174 -79
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  102. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  104. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  105. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  106. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  107. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  108. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  109. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +10 -5
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +13 -1
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  114. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  115. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  116. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  117. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  118. package/src/sap/fe/core/flexibility/AppComponent.flexibility.js +55 -0
  119. package/src/sap/fe/core/flexibility/AppComponent.flexibility.ts +65 -0
  120. package/src/sap/fe/core/flexibility/XMLTools.js +71 -0
  121. package/src/sap/fe/core/flexibility/XMLTools.ts +61 -0
  122. package/src/sap/fe/core/fpm/manifest.json +2 -2
  123. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  124. package/src/sap/fe/core/helpers/AppStartupHelper.ts +92 -32
  125. package/src/sap/fe/core/helpers/DeleteHelper.js +13 -13
  126. package/src/sap/fe/core/helpers/DeleteHelper.ts +17 -15
  127. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  128. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  129. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  130. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  131. package/src/sap/fe/core/helpers/ModelHelper.js +47 -11
  132. package/src/sap/fe/core/helpers/ModelHelper.ts +62 -15
  133. package/src/sap/fe/core/helpers/PasteHelper.js +6 -2
  134. package/src/sap/fe/core/helpers/PasteHelper.ts +5 -7
  135. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  136. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  137. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  138. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  139. package/src/sap/fe/core/library.js +33 -3
  140. package/src/sap/fe/core/library.ts +31 -1
  141. package/src/sap/fe/core/messagebundle.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_ar.properties +8 -1
  143. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  144. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  146. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  148. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  149. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  152. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  153. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -1
  154. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  159. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  167. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_no.properties +9 -2
  175. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  184. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  185. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  186. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  187. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  188. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  189. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  190. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  191. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  192. package/src/sap/fe/core/rootView/Fcl.controller.ts +22 -5
  193. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  194. package/src/sap/fe/core/rootView/NavContainer.controller.ts +2 -1
  195. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  196. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  197. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  198. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +9 -9
  199. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  200. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  201. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -4
  202. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -6
  203. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  204. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  205. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +57 -5
  206. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +69 -10
  207. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  208. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  209. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  210. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  211. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  212. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  213. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  214. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  215. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  216. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  217. package/ui5.yaml +2 -0
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/CriticalityFormatters", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/EntitySetHelper", "sap/fe/macros/formatters/TableFormatter", "sap/fe/macros/internal/helpers/ActionHelper", "sap/ui/core/Lib", "sap/ui/core/message/MessageType", "../../ManifestSettings", "../../helpers/Aggregation", "../../helpers/ID", "./Criticality", "./table/Columns", "./table/StandardActions"], function (Log, BindingToolkit, DataField, Action, ConfigurableObject, IssueManager, Key, BindingHelper, ModelHelper, StableIdHelper, TypeGuards, CriticalityFormatters, DataModelPathHelper, EntitySetHelper, tableFormatters, ActionHelper, Library, MessageType, ManifestSettings, Aggregation, ID, Criticality, Columns, StandardActions) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/CriticalityFormatters", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/EntitySetHelper", "sap/fe/macros/formatters/TableFormatter", "sap/fe/macros/internal/helpers/ActionHelper", "sap/ui/core/Lib", "sap/ui/core/message/MessageType", "../../ManifestSettings", "../../helpers/Aggregation", "../../helpers/ID", "./Criticality", "./table/Columns", "./table/StandardActions", "sap/ui/base/BindingInfo"], function (Log, BindingToolkit, DataField, Action, ConfigurableObject, IssueManager, Key, BindingHelper, ModelHelper, StableIdHelper, TypeGuards, CriticalityFormatters, DataModelPathHelper, EntitySetHelper, tableFormatters, ActionHelper, Library, MessageType, ManifestSettings, Aggregation, ID, Criticality, Columns, StandardActions, BindingInfo) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -72,6 +72,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
72
72
  var getAnnotationMenuActionItems = Action.getAnnotationMenuActionItems;
73
73
  var getActionsFromManifest = Action.getActionsFromManifest;
74
74
  var dataFieldIsCopyAction = Action.dataFieldIsCopyAction;
75
+ var addSeparators = Action.addSeparators;
75
76
  var addCollaborationCondition = Action.addCollaborationCondition;
76
77
  var visibleExpression = DataField.visibleExpression;
77
78
  var isDataFieldForActionGroup = DataField.isDataFieldForActionGroup;
@@ -110,7 +111,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
110
111
  */
111
112
  function getTableActions(lineItemAnnotation, visualizationPath, converterContext, standardActions, navigationSettings) {
112
113
  // 1. Get actions from annotations
113
- const isCollaborationEnabled = ModelHelper.isCollaborationDraftSupportedFromConverterContext(converterContext);
114
114
  const tableActions = getTableAnnotationActions(lineItemAnnotation, visualizationPath, converterContext);
115
115
  // 2. Get actions from manifest
116
116
  const manifestActions = getActionsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).actions, converterContext, tableActions.tableActions, navigationSettings, true);
@@ -151,7 +151,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
151
151
  position: OverrideType.overwrite,
152
152
  menu: OverrideType.overwrite,
153
153
  priority: OverrideType.overwrite,
154
- group: OverrideType.overwrite
154
+ group: OverrideType.overwrite,
155
+ overflowGroup: OverrideType.overwrite,
156
+ disableStrictHandling: OverrideType.overwrite
155
157
  };
156
158
  // 3. Get all annotation menu items
157
159
  const annotationMenuActionItems = getAnnotationMenuActionItems(annotationActions);
@@ -170,12 +172,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
170
172
  prepareMenuActions(actions, overwrittenMenuActionItems);
171
173
  // 8. Remove duplicate actions which are menu items
172
174
  actions = removeDuplicateActions(actions);
173
- // 9. Hide menus where all menu items are hidden
174
- actions = getVisibilityEnablementMenuActions(actions);
175
- // 10. Add the collaboration condition for actions other than navigation
176
- if (isCollaborationEnabled) {
175
+ // 9. Add the collaboration condition for actions other than navigation
176
+ if (ModelHelper.isCollaborationDraftSupportedFromConverterContext(converterContext)) {
177
177
  addCollaborationCondition(actions);
178
178
  }
179
+ // 10. Hide menus where all menu items are hidden
180
+ actions = getVisibilityEnablementMenuActions(actions);
181
+ // 11. Add separators based on actionGroups configuration
182
+ const overflowGroupsConfig = converterContext.getManifestControlConfiguration(visualizationPath)?.overflowGroups;
183
+ actions = addSeparators(actions, overflowGroupsConfig);
179
184
  return {
180
185
  actions: actions,
181
186
  commandActions: manifestActions.commandActions
@@ -394,13 +399,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
394
399
  pushFieldList(alternateAndSecondaryKeys, "alternateAndSecondaryKeys");
395
400
  if (capabilitiesAnnotation) {
396
401
  pushField(capabilitiesAnnotation.DeleteRestrictions?.Deletable?.path, "restriction");
397
- pushField(capabilitiesAnnotation.UpdateRestrictions?.Updatable?.path, "restriction");
402
+ }
403
+ const updatePropertyInfo = getCurrentEntitySetUpdatablePathInfo(converterContext);
404
+ if (updatePropertyInfo?.paths) {
405
+ pushFieldList(updatePropertyInfo.paths, "restriction");
398
406
  }
399
407
  return selectedFields;
400
408
  }
401
409
 
402
410
  /**
403
- * This return the property that are available from the NavigationAvailable annotation on IBN Fields.
411
+ * This returns the property that are available from the NavigationAvailable annotation on IBN Fields.
404
412
  * @param lineItem The line item annotation.
405
413
  * @param entityType The Entity Type.
406
414
  * @returns An array containing the properties name.
@@ -544,18 +552,40 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
544
552
  return ActionHelper.getOperationAvailableMap(lineItemAnnotation, "table", converterContext);
545
553
  }
546
554
  /**
547
- * Gets updatable propertyPath for the current entityset if valid.
555
+ * Gets updatable properties for the current entityset, if valid.
548
556
  * @param converterContext The instance of the converter context
549
- * @returns The updatable property for the rows
557
+ * @returns The updatable properties for the rows
550
558
  */
551
- function getCurrentEntitySetUpdatablePath(converterContext) {
559
+ function getCurrentEntitySetUpdatablePathInfo(converterContext) {
552
560
  const restrictions = getRestrictions(converterContext);
553
561
  const entitySet = converterContext.getEntitySet();
554
562
  const updatable = restrictions.isUpdatable;
555
563
  const isOnlyDynamicOnCurrentEntity = !isConstant(updatable.expression) && updatable.navigationExpression._type === "Unresolvable";
556
564
  const updatableExpression = entitySet?.annotations.Capabilities?.UpdateRestrictions?.Updatable;
557
- const updatablePropertyPath = isPathAnnotationExpression(updatableExpression) && updatableExpression.path;
558
- return isOnlyDynamicOnCurrentEntity ? updatablePropertyPath : "";
565
+ if (!isOnlyDynamicOnCurrentEntity || updatableExpression === undefined || isConstant(updatableExpression)) {
566
+ return;
567
+ }
568
+ const bindingExpression = compileExpression(getExpressionFromAnnotation(updatableExpression));
569
+ if (isPathAnnotationExpression(updatableExpression)) {
570
+ return {
571
+ bindingExpression,
572
+ isPathAnnotationExpression: true,
573
+ paths: [updatableExpression.path]
574
+ };
575
+ }
576
+ const bindingInfo = BindingInfo.parse(compileExpression(getExpressionFromAnnotation(updatableExpression)));
577
+ const paths = bindingInfo.parts.reduce((acc, part) => {
578
+ const path = part.path;
579
+ if (part.model === undefined && path) {
580
+ acc.add(path);
581
+ }
582
+ return acc;
583
+ }, new Set());
584
+ return {
585
+ isPathAnnotationExpression: false,
586
+ bindingExpression,
587
+ paths: Array.from(paths)
588
+ };
559
589
  }
560
590
  /**
561
591
  * Method to retrieve all property paths assigned to the Core.OperationAvailable annotation.
@@ -1460,7 +1490,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1460
1490
  row: _getRowConfigurationProperty(lineItemAnnotation, converterContext, navigationSettings, navigationTargetPath, tableManifestConfiguration.type, tableManifestConfiguration.analyticalConfiguration?.aggregationOnLeafLevel),
1461
1491
  p13nMode,
1462
1492
  isInsertUpdateActionsTemplated: standardActionsConfiguration.isInsertUpdateActionsTemplated,
1463
- updatablePropertyPath: getCurrentEntitySetUpdatablePath(converterContext),
1493
+ updatablePropertyPathInfo: getCurrentEntitySetUpdatablePathInfo(converterContext),
1464
1494
  displayMode: isInDisplayMode(converterContext, true),
1465
1495
  create: standardActionsConfiguration.creationBehaviour,
1466
1496
  selectionMode: selectionMode,
@@ -1698,9 +1728,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1698
1728
  * @param tableSettings Settings from the manifest
1699
1729
  * @param converterContext The instance of the converter context
1700
1730
  */
1701
- function updateTreeTableManifestConfiguration(tableConfiguration, tableSettings, converterContext) {
1731
+ function updateTreeTableManifestConfiguration(tableConfiguration, tableSettings, converterContext, lineItemAnnotation) {
1702
1732
  const dataModelObjectPath = converterContext.getDataModelObjectPath();
1703
- tableConfiguration.hierarchyQualifier = tableSettings.hierarchyQualifier;
1733
+ const entityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
1734
+ tableConfiguration.hierarchyQualifier = getHierarchyQualifier(entityType, tableSettings);
1704
1735
  const hierarchyParentNavigationPropertyPath = getHierarchyParentNavigationPropertyPath(dataModelObjectPath, tableConfiguration.hierarchyQualifier);
1705
1736
  const nonUpdatableNavigationProperties = getNonUpdatableNavigationProperties(dataModelObjectPath);
1706
1737
  tableConfiguration.isHierarchyParentNodeUpdatable = !nonUpdatableNavigationProperties?.includes(hierarchyParentNavigationPropertyPath);
@@ -1758,12 +1789,34 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1758
1789
  };
1759
1790
  }
1760
1791
 
1792
+ /**
1793
+ * Gets the hierarchy qualifier from the manifest or the annotations.
1794
+ * @param entityType The entity type of the table
1795
+ * @param tableSettings The table configuration
1796
+ * @returns the hierarchy qualifier or undefined if not found
1797
+ */
1798
+ _exports.getCustomFunctionInfo = getCustomFunctionInfo;
1799
+ function getHierarchyQualifier(entityType, tableSettings) {
1800
+ if (tableSettings.hierarchyQualifier) {
1801
+ return tableSettings.hierarchyQualifier;
1802
+ }
1803
+ const aggregationAnnotation = entityType.annotations?.Aggregation;
1804
+ const hierarchyAnnotation = entityType.annotations?.Hierarchy;
1805
+ // We only check the hierarchyQualifier from the manifest when the tree table is specifically set, otherwise we get it from the annotations
1806
+ // if both annotations have the same qualifier, use it
1807
+ // If there is no qualifier or different qualifiers, the hierarchyQualifier remains undefined
1808
+ // Note: In case of multiple hierarchies with the same qualifier, the first one found will be used
1809
+ const qualifiedName = hierarchyAnnotation?._keys?.find(key => key.includes("RecursiveHierarchy#") && aggregationAnnotation?._keys?.includes(key));
1810
+ if (qualifiedName) {
1811
+ return hierarchyAnnotation[qualifiedName]?.qualifier;
1812
+ }
1813
+ }
1814
+
1761
1815
  /**
1762
1816
  * Retrieve the table control configuration optimistic batch information.
1763
1817
  * @param tableManifestSettings The table configuration
1764
1818
  @returns True if Optimistic batch mode is disabled
1765
1819
  */
1766
- _exports.getCustomFunctionInfo = getCustomFunctionInfo;
1767
1820
  function getOptimisticBatchSettingsFromManifest(tableManifestSettings) {
1768
1821
  // Optimistic batch is set by default
1769
1822
  return tableManifestSettings?.tableSettings?.disableRequestCache;
@@ -1850,7 +1903,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1850
1903
  const oFilterConfiguration = lineItemAnnotation ? getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext, selectionVariantAnnotation) : {};
1851
1904
  const customValidationFunction = tableSettings.creationMode?.customValidationFunction;
1852
1905
  const exportRequestSize = tableSettings.exportRequestSize;
1853
- const tableType = getTableType(converterContext, tableManifestSettings);
1906
+ const tableType = getTableType(converterContext, tableManifestSettings, lineItemAnnotation);
1854
1907
  const analyticalConfiguration = tableSettings.analyticalConfiguration;
1855
1908
  // By default, paste is enabled on an ObjectPage and on a ListReport with a draft TreeTable
1856
1909
  const enablePaste = tableSettings.enablePaste ?? (converterContext.getTemplateType() === "ObjectPage" || tableType === "TreeTable" && converterContext.getEntitySet()?.annotations.Common?.DraftRoot !== undefined);
@@ -1921,7 +1974,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1921
1974
  tableConfiguration.selectionChange = tableSettings.selectionChange;
1922
1975
  tableConfiguration.rowPress = tableSettings.rowPress;
1923
1976
  if (tableType === "TreeTable") {
1924
- updateTreeTableManifestConfiguration(tableConfiguration, tableSettings, converterContext);
1977
+ updateTreeTableManifestConfiguration(tableConfiguration, tableSettings, converterContext, lineItemAnnotation);
1925
1978
  }
1926
1979
  if (tableSettings.headerVisible !== undefined) {
1927
1980
  tableConfiguration.headerVisible = tableSettings.headerVisible;
@@ -1932,11 +1985,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1932
1985
  return tableConfiguration;
1933
1986
  }
1934
1987
  _exports.getTableManifestConfiguration = getTableManifestConfiguration;
1935
- function getTableType(converterContext, tableManifestSettings) {
1988
+ function getTableType(converterContext, tableManifestSettings, lineItemAnnotation) {
1936
1989
  if (tableManifestSettings?.tableSettings?.type) {
1937
1990
  // in case the application specified a table type we will use this one
1938
1991
  return tableManifestSettings.tableSettings.type;
1939
1992
  }
1993
+ const entityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
1994
+ const aggregationHelper = new AggregationHelper(entityType, converterContext);
1995
+ const requiredAllowedTransformations = ["filter", "identity", "orderby", "skip", "top", "groupby", "aggregate", "concat"];
1996
+ if (aggregationHelper.isAnalyticsSupported() && requiredAllowedTransformations.every(transformation => aggregationHelper.getAllowedTransformations()?.includes(transformation))) {
1997
+ return "AnalyticalTable";
1998
+ }
1999
+ const hierarchyAnnotation = entityType.annotations?.Hierarchy;
2000
+ const aggregationAnnotation = entityType.annotations?.Aggregation;
2001
+ if (hierarchyAnnotation?._keys?.some(key => key.includes("RecursiveHierarchy#") && aggregationAnnotation?._keys?.includes(key))) {
2002
+ // Check if there is at least one RecursiveHierarchy qualifier is present in both hierarchyAnnotation and aggregationAnnotation annotations
2003
+ return "TreeTable";
2004
+ }
1940
2005
 
1941
2006
  // default is the ResponsiveTable
1942
2007
  return "ResponsiveTable";
@@ -1959,4 +2024,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
1959
2024
  getCustomFunctionInfo
1960
2025
  };
1961
2026
  }, false);
1962
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJzdGFuZGFyZEFjdGlvbnMiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiTW9kZWxIZWxwZXIiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZEZyb21Db252ZXJ0ZXJDb250ZXh0IiwidGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsIm1hbmlmZXN0QWN0aW9ucyIsImdldEFjdGlvbnNGcm9tTWFuaWZlc3QiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiYWN0aW9ucyIsImNvcHlBY3Rpb25zIiwiZmlsdGVyIiwiYSIsInR5cGUiLCJBY3Rpb25UeXBlIiwiQ29weSIsImFubm90YXRpb25BY3Rpb25zIiwiYW5ub3RhdGlvbkFuZFN0YW5kYXJkQWN0aW9ucyIsImNyZWF0ZSIsImRlbGV0ZSIsIm1hc3NFZGl0IiwiaW5zaWdodHMiLCJjcmVhdGlvblJvdyIsImN1dCIsImNvcHkiLCJwYXN0ZSIsIm1vdmVVcCIsIm1vdmVEb3duIiwiYWN0aW9uIiwidW5kZWZpbmVkIiwibWFuaWZlc3RBY3Rpb24iLCJPYmplY3QiLCJ2YWx1ZXMiLCJEZWZhdWx0IiwiTWVudSIsInBvc2l0aW9uIiwiYW5jaG9yIiwiU3RhbmRhcmRBY3Rpb25LZXlzIiwiQ3JlYXRlIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQmVmb3JlIiwibWFuaWZlc3RBY3Rpb25FbnRyaWVzIiwiZW50cmllcyIsInN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zIiwiZnJvbUVudHJpZXMiLCJfcmVmIiwia2V5Iiwic3RhcnRzV2l0aCIsIm5vblN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zIiwiX3JlZjIiLCJhY3Rpb25PdmVyd3JpdGVDb25maWciLCJpc05hdmlnYWJsZSIsIk92ZXJyaWRlVHlwZSIsIm92ZXJ3cml0ZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJ2aXNpYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiY29tbWFuZCIsIm1lbnUiLCJwcmlvcml0eSIsImdyb3VwIiwiYW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyIsImdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMiLCJtYXRjaGluZ01hbmlmZXN0QWN0aW9ucyIsImdldE1hdGNoaW5nTWFuaWZlc3RBY3Rpb24iLCJvdmVyd3JpdHRlbk1lbnVBY3Rpb25JdGVtcyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwicHJlcGFyZU1lbnVBY3Rpb25zIiwicmVtb3ZlRHVwbGljYXRlQWN0aW9ucyIsImdldFZpc2liaWxpdHlFbmFibGVtZW50TWVudUFjdGlvbnMiLCJhZGRDb2xsYWJvcmF0aW9uQ29uZGl0aW9uIiwiY29tbWFuZEFjdGlvbnMiLCJfZXhwb3J0cyIsImdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uIiwiYWdncmVnYXRpb25IZWxwZXIiLCJjdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucyIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwiY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnMiLCJmb3JFYWNoIiwiYW5ub3RhdGlvbiIsImFnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImZpbmQiLCJwcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwiYW5ub3RhdGlvbnMiLCJBZ2dyZWdhdGlvbiIsIkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJtYXAiLCJjdHhEZWZQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0RXh0ZW5zaW9uSW5mb0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMiLCJTZXQiLCJjb2x1bW4iLCJ0YWJsZUNvbHVtbiIsInVuaXQiLCJ0YXJnZXRVbml0UHJvcGVydHkiLCJwcm9wIiwiYWRkIiwicmVsYXRpdmVQYXRoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbiIsInJlc3VsdCIsInByb3BlcnR5SW5mb3MiLCJyYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwiZnJvbUdyb3VwYWJsZVByb3BlcnR5IiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsImhhcyIsImNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSIsImZvdW5kQ29sdW1uIiwiZmluZENvbHVtbkJ5UGF0aCIsInB1c2giLCJsZW5ndGgiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUiLCJ0YWJsZVZpc3VhbGl6YXRpb24iLCJwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsImNvbnRyb2wiLCJhZ2dyZWdhdGlvbkRhdGEiLCJjb2x1bW5zIiwiZW5hYmxlQW5hbHl0aWNzIiwiZW5hYmxlJHNlbGVjdCIsImVuYWJsZSQkZ2V0S2VlcEFsaXZlQ29udGV4dCIsImFuYWx5dGljc0V4dGVuc2lvbnMiLCJfdXBkYXRlUHJvcGVydHlJbmZvc1dpdGhBZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJhbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImVuYWJsZUJhc2ljU2VhcmNoIiwiaW5jbHVkZXMiLCJncm91cENvbmRpdGlvbnMiLCJnZXRHcm91cENvbmRpdGlvbnMiLCJhZ2dyZWdhdGVDb25kaXRpb25zIiwiZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyIsIkxvZyIsImVycm9yIiwiY2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkIiwiSGllcmFyY2h5IiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiQ2hhbmdlU2libGluZ0ZvclJvb3RzU3VwcG9ydGVkIiwiYWxsb3dEcm9wQmV0d2Vlbk5vZGVzIiwiQ2hhbmdlTmV4dFNpYmxpbmdBY3Rpb24iLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJyZXF1ZXN0QXRMZWFzdCIsImFuYWx5dGljYWxDb25maWd1cmF0aW9uIiwiYWdncmVnYXRpb25PbkxlYWZMZXZlbCIsImlzRHJhZnRSb290IiwiZ2V0RW50aXR5U2V0IiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaXNGY2xFbmFibGVkIiwiZW5hYmxlVXBsb2FkUGx1Z2luIiwic3RyZWFtUHJvcGVydHkiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIlVJIiwiTWVkaWFSZXNvdXJjZSIsIlN0cmVhbSIsIiR0YXJnZXQiLCJ1cGxvYWRBY3Rpb24iLCJ1cGxvYWRUYWJsZSIsInN0cmVhbSIsImZpbGVOYW1lIiwiQ29yZSIsIkNvbnRlbnREaXNwb3NpdGlvbiIsIkZpbGVuYW1lIiwicGF0aCIsImZpbGVOYW1lTWF4TGVuZ3RoIiwibWF4TGVuZ3RoIiwiYWNjZXB0YWJsZU1lZGlhVHlwZXMiLCJBY2NlcHRhYmxlTWVkaWFUeXBlcyIsInZpc2libGVBY3Rpb25zIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsImlzU3RpY2t5IiwiZXZlcnkiLCJkaXNhYmxlT3duUmVxdWVzdE9uTVZGIiwiY3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyIsImxpbmVJdGVtIiwib3BlcmF0aW9uQXZhaWxhYmxlIiwic2VsZWN0ZWRGaWVsZHMiLCJwdXNoRmllbGQiLCJmaWVsZE5hbWUiLCJvcmlnaW4iLCJpbmRleE9mIiwicHVzaEZpZWxkTGlzdCIsImZpZWxkcyIsImZpZWxkIiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsInNwbGl0IiwidmFsaWRQcm9wZXJ0aWVzIiwicHJvcE5hbWUiLCJyZXNvbHZlUGF0aCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5Iiwic2VtYW50aWNLZXkiLCJjYXBhYmlsaXRpZXNBbm5vdGF0aW9uIiwiQ2FwYWJpbGl0aWVzIiwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJSZXF1ZXN0QXRMZWFzdCIsInByb3BlcnR5UGF0aCIsImdldE5hdmlnYXRpb25BdmFpbGFibGVGaWVsZHNGcm9tTGluZUl0ZW0iLCJEZWxldGVSZXN0cmljdGlvbnMiLCJEZWxldGFibGUiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJyZWNvcmQiLCIkVHlwZSIsIklubGluZSIsIkRldGVybWluaW5nIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJOYXZpZ2F0aW9uQXZhaWxhYmxlIiwiZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibWFuaWZlc3RXcmFwcGVyIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJuYXZDb25maWciLCJrZXlzIiwiZGF0YU1vZGVsUGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvIiwiaGVhZGVySW5mb1RpdGxlUGF0aCIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwic2VtYW50aWNLZXlBbm5vdGF0aW9ucyIsImhlYWRlckluZm9UeXBlTmFtZSIsIlR5cGVOYW1lIiwic2VtYW50aWNLZXlDb2x1bW5zIiwib0NvbHVtbiIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsInBhcmFtcyIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwiZ2V0VGFibGVDb2x1bW5zIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwic2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlIiwic3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiIsImdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24iLCJ0YWJsZUFubm90YXRpb24iLCJnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImhlYWRlciIsInRpdGxlIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiSlNPTiIsInN0cmluZ2lmeSIsImhlYWRlckluZm9UaXRsZSIsImhlYWRlclZpc2libGUiLCJoYW5kbGVQYXRjaFNlbnQiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbiIsImlzQmxhbmtUYWJsZSIsImdldENvbHVtbnNGcm9tRW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJjcmVhdGlvbk1vZGUiLCJBY3Rpb25IZWxwZXIiLCJnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aCIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsInVwZGF0YWJsZSIsImlzVXBkYXRhYmxlIiwiaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSIsImlzQ29uc3RhbnQiLCJleHByZXNzaW9uIiwibmF2aWdhdGlvbkV4cHJlc3Npb24iLCJfdHlwZSIsInVwZGF0YWJsZUV4cHJlc3Npb24iLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0aWVzIiwiYWN0aW9uTmFtZSIsInByb3BlcnR5TmFtZSIsInNpemUiLCJ0aXRsZVByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zIiwiZGF0YUZpZWxkIiwiQWN0aW9uVGFyZ2V0IiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJSZXF1aXJlc0NvbnRleHQiLCJ2YWx1ZU9mIiwiSGlkZGVuIiwiZXF1YWwiLCJnZXRIaWRkZW5FeHByZXNzaW9uQXRUYWJsZUxldmVsIiwiZ2V0UGF0aEZyb21BY3Rpb25Bbm5vdGF0aW9uIiwic291cmNlIiwiY29uc3RhbnQiLCJzdWJzdHJpbmciLCJzcGxpdFBhdGhGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJuYXZpZ2F0aW9uUGF0aCIsImlzTmF2aWdhdGlvblByb3BlcnR5IiwidGFyZ2V0T2JqZWN0IiwicGFydG5lciIsInBhdGhJbk1vZGVsIiwic2xpY2UiLCJ1cGRhdGVNYW5pZmVzdEFjdGlvbkFuZFRhZ0l0IiwiZGF0YUZpZWxkSWQiLCJzb21lIiwiYWN0aW9uS2V5IiwicmVxdWlyZXNTZWxlY3Rpb24iLCJoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyIiwibWFuaWZlc3RBY3Rpb25JZCIsImdlbmVyYXRlIiwiQWN0aW9uIiwiU2VtYW50aWNPYmplY3QiLCJBY3Rpb25zIiwiaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJjdXN0b21BY3Rpb25zIiwicmVkdWNlIiwibWVudUFjdGlvbiIsInRvU3RyaW5nIiwiZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiYVZpc2libGVQYXRoRXhwcmVzc2lvbnMiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldENhcGFiaWxpdHlSZXN0cmljdGlvbiIsImlzRGVsZXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiZ2V0U2VsZWN0aW9uTW9kZSIsImlzRW50aXR5U2V0IiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwiY3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJ0YWJsZVR5cGUiLCJ0YWJsZVNldHRpbmdzIiwic2VsZWN0aW9uTW9kZSIsIlNlbGVjdGlvbk1vZGUiLCJNdWx0aSIsIk5vbmUiLCJjb21waWxlRXhwcmVzc2lvbiIsImlmRWxzZSIsIkZvcmNlTXVsdGkiLCJGb3JjZVNpbmdsZSIsIlNpbmdsZSIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiT2JqZWN0UGFnZSIsImJNYXNzRWRpdEVuYWJsZWQiLCJBdXRvIiwiYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJvciIsImFuZCIsIklzRWRpdGFibGUiLCJlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiY29uY2F0IiwiY29weURhdGFGaWVsZCIsImdldENvcHlBY3Rpb24iLCJkYXRhRmllbGRJc0NvcHlBY3Rpb24iLCJhbm5vdGF0aW9uUGF0aCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJ2aXNpYmxlRXhwcmVzc2lvbiIsInRleHQiLCJMYWJlbCIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwidGFibGVBY3Rpb24iLCJnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JBY3Rpb25Hcm91cCIsImRhdGFGaWVsZEdyb3VwIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNBSU9wZXJhdGlvbiIsImlzQWN0aW9uQUlPcGVyYXRpb24iLCJfdXNlRW5hYmxlZEV4cHJlc3Npb24iLCJnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsImlkIiwiaXNNZW51QUlPcGVyYXRpb24iLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3RPck5vZGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsImZvcm1hdFJlc3VsdCIsIkVudGl0eSIsIkhhc0FjdGl2ZSIsIklzQWN0aXZlIiwiSXNJbmFjdGl2ZSIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsImdldEV4dGVybmFsQ3JlYXRpb25CZWhhdmlvciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwiY3JlYXRpb25EZXRhaWxzIiwib3V0Ym91bmRLZXkiLCJvdXRib3VuZENyZWF0aW9uIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsImdldE91dGJvdW5kTmF2aWdhdGlvbkVudHJpZXMiLCJtb2RlIiwiQ3JlYXRpb25Nb2RlIiwiRXh0ZXJuYWwiLCJ3YXJuaW5nIiwiTmV3UGFnZSIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsImV4dGVybmFsQmVoYXZpb3IiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJuYXZpZ2F0aW9uRGV0YWlscyIsImRldGFpbCIsIkNyZWF0aW9uRGlhbG9nIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJ0YXJnZXRBbm5vdGF0aW9uc0NvbW1vbiIsInRhcmdldEFubm90YXRpb25zU2Vzc2lvbiIsIlNlc3Npb24iLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiQ3JlYXRpb25Sb3ciLCJFcnJvciIsInJvdXRlIiwiYXBwZW5kIiwiY3JlYXRlQXRFbmQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiaW5mbyIsIl9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwiYWdncmVnYXRpb25PbkxlYWZMZXZlbGVuYWJsZWQiLCJuYXZpZ2F0aW9uSW5mbyIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJDcml0aWNhbGl0eSIsInJvd05hdmlnYWJsZUV4cHJlc3Npb24iLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiZGlzcGxheSIsInRhcmdldCIsImdldERyYWZ0Um9vdCIsImdldERyYWZ0Tm9kZSIsImNoZWNrRWRpdGFibGUiLCJyb3V0ZVBhdGgiLCJyZWNyZWF0ZUNvbnRleHQiLCJhdmFpbGFiaWxpdHkiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwiYWN0aW9uVHlwZSIsInJvd05hdmlnYXRlZCIsInJvd0NyaXRpY2FsaXR5Rm9ySW5zaWdodHMiLCJjcml0aWNhbGl0eUV4cHJlc3Npb25Gb3JJbnRlZ3JhdGlvbkNhcmRzIiwibm90IiwiaXNOb2RlTGV2ZWxOYXZpZ2FibGUiLCJjcmVhdGVUZWNobmljYWxQcm9wZXJ0eSIsInJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwIiwiY29sdW1uRXhpc3RzIiwiYWRkaXRpb25hbFByb3BlcnR5IiwidGVjaG5pY2FsQ29sdW1uIiwiQ29sdW1uVHlwZSIsIkFubm90YXRpb24iLCJsYWJlbCIsImRhdGFUeXBlIiwic29ydGFibGUiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiZXhwb3J0U2V0dGluZ3MiLCJjYXNlU2Vuc2l0aXZlIiwiYWdncmVnYXRhYmxlIiwiZmlsdGVyYWJsZSIsImV4dGVuc2lvbiIsInRlY2huaWNhbGx5R3JvdXBhYmxlIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJtb2RlcyIsImlzQW5hbHl0aWNhbFRhYmxlIiwiaXNSZXNwb25zaXZlVGFibGUiLCJwZXJzb25hbGl6YXRpb24iLCJzb3J0IiwiYWdncmVnYXRlIiwiVmFyaWFudE1hbmFnZW1lbnRUeXBlIiwiQ29udHJvbCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImlzRmlsdGVyQmFySGlkZGVuIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImdldFNvcnRDb25kaXRpb25zIiwibm9uU29ydGFibGVQcm9wZXJ0aWVzIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwic29ydENvbmRpdGlvbnMiLCJzb3J0ZXJzIiwiU29ydE9yZGVyIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwiZ2V0SW5pdGlhbEV4cGFuc2lvbkxldmVsIiwibGV2ZWwiLCJJbml0aWFsRXhwYW5zaW9uTGV2ZWwiLCJwYXRocyIsImluZm9OYW1lcyIsInByb3BlcnR5SW5mbyIsImFubm90YXRpb25Db2x1bW4iLCJjdXJyZW50UGF0aCIsImdyb3VwTGV2ZWxzIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwicHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8iLCJfZ2V0UHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8iLCJhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24iLCJhZGRpdGlvbmFsUHJvcGVydHlJbmZvcyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm8iLCJfdXBkYXRlRm9yVGV4dE9ubHlQcm9wZXJ0aWVzV2l0aENEUCIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsImFuYWx5dGljc0luZm9Qcm9wZXJ0eU5hbWVGb3JEZXNjIiwiY29sdW1uV2l0aFRleHRPbmx5IiwidGV4dE9ubHlDb2x1bW4iLCJleHRlbnNpb25JbmZvTWFwIiwiVG90YWwiLCJhVG90YWxzIiwiY3JlYXRpb25CZWhhdmlvdXIiLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2V0Q3V0VmlzaWJpbGl0eSIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJnZXRTdGFuZGFyZEFjdGlvbkN1dCIsImdldFN0YW5kYXJkQWN0aW9uQ29weSIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwiZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMiLCJnZXRDcmVhdGlvblJvdyIsImNvbmZpZ3VyYXRpb24iLCJnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24iLCJ0eXBlTmFtZVBsdXJhbCIsIlR5cGVOYW1lUGx1cmFsIiwicGFnZU1hbmlmZXN0U2V0dGluZ3MiLCJoYXNBYnNvbHV0ZVBhdGgiLCJwMTNuTW9kZSIsImdldFRhYmxlSUQiLCJ0aHJlc2hvbGQiLCJnZXRUaHJlc2hvbGQiLCJpc1NlYXJjaGFibGUiLCJpc1BhdGhTZWFyY2hhYmxlIiwiYXBpSWQiLCJlbnRpdHlOYW1lIiwiZW50aXR5VHlwZU5hbWUiLCJjb2xsZWN0aW9uIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInJvdyIsImRpc3BsYXlNb2RlIiwiaXNJbkRpc3BsYXlNb2RlIiwic2VhcmNoYWJsZSIsImluaXRpYWxFeHBhbnNpb25MZXZlbCIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsIk1heEl0ZW1zIiwidGFyZ2V0TmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImxhc3RJbmRleE9mIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzZWxlY3Rpb25WYXJpYW50UGF0aCIsInJlc29sdmVkVGFyZ2V0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJzZWxlY3Rpb24iLCJwcm9wZXJ0eU5hbWVzIiwiU2VsZWN0T3B0aW9ucyIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsIlRleHQiLCJfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UiLCJpc0lwaG9uZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIk1hbmlmZXN0IiwiSXNzdWVTZXZlcml0eSIsIkxvdyIsIklzc3VlVHlwZSIsIkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUIiwiX2dldE11bHRpU2VsZWN0TW9kZSIsIm11bHRpU2VsZWN0TW9kZSIsInNlbGVjdEFsbCIsInVzZUljb25UYWJCYXIiLCJfZ2V0VGFibGVNb2RlIiwiaXNUZW1wbGF0ZUxpc3RSZXBvcnQiLCJyb3dDb3VudE1vZGUiLCJyb3dDb3VudCIsImluaXRpYWxSb3dDb3VudCIsIl9nZXRDb25kZW5zZWRUYWJsZUxheW91dCIsIl90YWJsZVR5cGUiLCJfdGFibGVTZXR0aW5ncyIsImNvbmRlbnNlZFRhYmxlTGF5b3V0IiwiX2dldFRhYmxlU2VsZWN0aW9uTGltaXQiLCJzZWxlY3Rpb25MaW1pdCIsIl9nZXRUYWJsZUlubGluZUNyZWF0aW9uUm93Q291bnQiLCJpbmxpbmVDcmVhdGlvblJvd0NvdW50IiwiX2dldEVuYWJsZUV4cG9ydCIsImVuYWJsZVBhc3RlIiwiZW5hYmxlRXhwb3J0IiwiX2dldEZyb3plbkNvbHVtbkNvdW50IiwiZnJvemVuQ29sdW1uQ291bnQiLCJnZXRFbmFibGVDb2x1bW5GcmVlemUiLCJkaXNhYmxlQ29sdW1uRnJlZXplIiwiX2dldFdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIiwid2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uIiwiaGlkZVRhYmxlVGl0bGUiLCJmaWx0ZXJzIiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwicXVpY2tGaWx0ZXJQYXRocyIsImZpbHRlclBhdGhzIiwicXVpY2tGaWx0ZXJzIiwic2hvd0NvdW50cyIsImhpZGRlbkZpbHRlcnMiLCJzRW50aXR5VHlwZSIsInVzZUVuYWJsZWRFeHByZXNzaW9uIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwib3ZlcmxvYWRBY3Rpb24iLCJzb3VyY2VUeXBlIiwic3RhdGljQWN0aW9uIiwicGFyYW1ldGVycyIsImlzQ29sbGVjdGlvbiIsInVwZGF0ZVRyZWVUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInRhYmxlQ29uZmlndXJhdGlvbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJpc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGUiLCJpc05vZGVNb3ZhYmxlIiwiZ2V0Q3VzdG9tRnVuY3Rpb25JbmZvIiwiaXNOb2RlQ29weWFibGUiLCJpc01vdmVUb1Bvc2l0aW9uQWxsb3dlZCIsImlzQ29weVRvUG9zaXRpb25BbGxvd2VkIiwiY3JlYXRlRW5hYmxlbWVudCIsImlzQ3JlYXRlRW5hYmxlZCIsIm5vZGVUeXBlIiwibm9kZVR5cGVJbmZvIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJnZXRGaWVsZExpc3QiLCJjcmVhdGlvbkZpZWxkcyIsImNyZWF0ZUluUGxhY2UiLCJsYXN0RG90SW5kZXgiLCJtb2R1bGVOYW1lIiwicmVwbGFjZSIsIm1ldGhvZE5hbWUiLCJhZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzIiwiZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QiLCJkaXNhYmxlUmVxdWVzdENhY2hlIiwiZ2V0TWFzc0VkaXRTZXR0aW5ncyIsImRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24iLCJ2aXNpYmxlRmllbGRzIiwiaWdub3JlZEZpZWxkcyIsIm9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIk9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIklzb2xhdGVkIiwiQ2hhbmdlU2V0IiwiZW5hYmxlTWFzc0VkaXQiLCJjdXN0b21GcmFnbWVudCIsImZyb21JbmxpbmUiLCJmaWVsZEdyb3VwIiwiaXNBbm5vdGF0aW9uT2ZUeXBlIiwiRGF0YSIsImlzRGF0YUZpZWxkIiwidHJpbSIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwiX21hbmlmZXN0V3JhcHBlciIsImdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncyIsImdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwiZGVmYXVsdENyZWF0aW9uTW9kZSIsIm1hY3JvcyIsInRhYmxlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiZW5hYmxlQXV0b0NvbHVtbldpZHRoIiwiaXNQaG9uZSIsImRpc2FibGVDb3B5VG9DbGlwYm9hcmQiLCJ0ZW1wbGF0ZVR5cGUiLCJpc0NvbmRlbnNlZExheW91dENvbXBsaWFudCIsIm9GaWx0ZXJDb25maWd1cmF0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZXhwb3J0UmVxdWVzdFNpemUiLCJnZXRUYWJsZVR5cGUiLCJ0YWJsZVJvd01vZGUiLCJkZWZhdWx0U2Nyb2xsVGhyZXNob2xkIiwiZGVmYXVsdFBvcGluTGF5b3V0IiwicG9waW5MYXlvdXQiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwidXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwiZ2V0VXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwib0NvbmZpZ3VyYXRpb24iLCJoYXNEYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzIiwicmVhZE9ubHkiLCJleHBvcnRGaWxlTmFtZSIsImV4cG9ydFNoZWV0TmFtZSIsImVuYWJsZUNvbHVtbkZyZWV6ZSIsImVuYWJsZUFkZENhcmRUb0luc2lnaHRzIiwic2hvd1Jvd0NvdW50IiwiZ2V0Vmlld0NvbmZpZ3VyYXRpb24iLCJ1c2VDb25kZW5zZWRUYWJsZUxheW91dCIsImlzQ29tcGFjdFR5cGUiLCJtb2RlRm9yTm9EYXRhTWVzc2FnZSIsInNjcm9sbFRocmVzaG9sZCIsImJlZm9yZVJlYmluZFRhYmxlIiwic2VsZWN0aW9uQ2hhbmdlIiwicm93UHJlc3MiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ29tbW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25fRWRtXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVNldEFubm90YXRpb25zX1Nlc3Npb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1Nlc3Npb25fRWRtXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENyaXRpY2FsaXR5LFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRMaW5lSXRlbSxcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGUsXG5cdFNlbGVjdE9wdGlvblR5cGUsXG5cdFNlbGVjdGlvblZhcmlhbnQsXG5cdFNlbGVjdGlvblZhcmlhbnRUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdGlzRGF0YUZpZWxkLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkdyb3VwLFxuXHR2aXNpYmxlRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHtcblx0QW5ub3RhdGlvbkFjdGlvbixcblx0QW5ub3RhdGlvbkFjdGlvbkdyb3VwLFxuXHRCYXNlQWN0aW9uLFxuXHRDb21iaW5lZEFjdGlvbixcblx0Q3VzdG9tQWN0aW9uLFxuXHRPdmVycmlkZVR5cGVBY3Rpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHtcblx0YWRkQ29sbGFib3JhdGlvbkNvbmRpdGlvbixcblx0ZGF0YUZpZWxkSXNDb3B5QWN0aW9uLFxuXHRnZXRBY3Rpb25zRnJvbU1hbmlmZXN0LFxuXHRnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zLFxuXHRnZXRDb3B5QWN0aW9uLFxuXHRnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbixcblx0Z2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbixcblx0Z2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyxcblx0aXNBY3Rpb25BSU9wZXJhdGlvbixcblx0aXNNZW51QUlPcGVyYXRpb24sXG5cdHByZXBhcmVNZW51QWN0aW9ucyxcblx0cmVtb3ZlRHVwbGljYXRlQWN0aW9uc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBFbnRpdHksIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgeyBpc0Fubm90YXRpb25PZlR5cGUsIGlzTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGNyaXRpY2FsaXR5RXhwcmVzc2lvbkZvckludGVncmF0aW9uQ2FyZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Dcml0aWNhbGl0eUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7XG5cdGdldEhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdGdldE5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aFNlYXJjaGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZSxcblx0dHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXN0cmljdGVkLWltcG9ydHNcbmltcG9ydCB0YWJsZUZvcm1hdHRlcnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXN0cmljdGVkLWltcG9ydHNcbmltcG9ydCBBY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvaGVscGVycy9BY3Rpb25IZWxwZXJcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IHR5cGUgRm9ybUNvbnRhaW5lciBmcm9tIFwic2FwL3VpL2xheW91dC9mb3JtL0Zvcm1Db250YWluZXJcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHtcblx0TWFuaWZlc3RBY3Rpb24sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvblxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHtcblx0QWN0aW9uVHlwZSxcblx0Q3JlYXRpb25Nb2RlLFxuXHRPcGVyYXRpb25Hcm91cGluZ01vZGUsXG5cdFNlbGVjdGlvbk1vZGUsXG5cdFRlbXBsYXRlVHlwZSxcblx0VmFyaWFudE1hbmFnZW1lbnRUeXBlLFxuXHRWaXN1YWxpemF0aW9uVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCIuLi8uLi9NYW5pZmVzdFdyYXBwZXJcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uSGVscGVyIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IGdldFRhYmxlSUQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9JRFwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7XG5cdENvbHVtblR5cGUsXG5cdGZpbmRDb2x1bW5CeVBhdGgsXG5cdGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSxcblx0Z2V0UmVxdWlyZWRQcm9wZXJ0aWVzLFxuXHRnZXRUYWJsZUNvbHVtbnMsXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMsXG5cdHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uLFxuXHR0eXBlIEV4dGVuc2lvbkZvckFuYWx5dGljcyxcblx0dHlwZSBUYWJsZUNvbHVtblxufSBmcm9tIFwiLi90YWJsZS9Db2x1bW5zXCI7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYXJkQWN0aW9uIH0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5pbXBvcnQge1xuXHRTdGFuZGFyZEFjdGlvbktleXMsXG5cdGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Z2V0Q3JlYXRpb25Sb3csXG5cdGdldEN1dFZpc2liaWxpdHksXG5cdGdldERlbGV0ZVZpc2liaWxpdHksXG5cdGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nLFxuXHRnZXRNYXNzRWRpdFZpc2liaWxpdHksXG5cdGdldFJlc3RyaWN0aW9ucyxcblx0Z2V0U3RhbmRhcmRBY3Rpb25Db3B5LFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25DdXQsXG5cdGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzLFxuXHRnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0LFxuXHRnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24sXG5cdGdldFN0YW5kYXJkQWN0aW9uUGFzdGUsXG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCxcblx0aXNJbkRpc3BsYXlNb2RlXG59IGZyb20gXCIuL3RhYmxlL1N0YW5kYXJkQWN0aW9uc1wiO1xuXG50eXBlIFVwbG9hZFRhYmxlU2V0dGluZ3MgPSB7XG5cdHN0cmVhbTogc3RyaW5nO1xuXHRmaWxlTmFtZT86IHN0cmluZztcblx0ZmlsZU5hbWVNYXhMZW5ndGg/OiBpbnQ7XG5cdGFjY2VwdGFibGVNZWRpYVR5cGVzPzogc3RyaW5nW107XG5cdG1heExlbmd0aD86IGludDtcblx0dXBsb2FkQWN0aW9uPzogU3RhbmRhcmRBY3Rpb247XG59O1xuXG50eXBlIFJvd05hdmlnYXRpb25JbmZvID1cblx0fCB7XG5cdFx0XHR0eXBlOiBcIk91dGJvdW5kXCI7XG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0OiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5FZGl0TW9kZT86IGJvb2xlYW47XG5cdCAgfVxuXHR8IHtcblx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblwiO1xuXHRcdFx0dGFyZ2V0UGF0aDogc3RyaW5nO1xuXHRcdFx0Y2hlY2tFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRcdHJlY3JlYXRlQ29udGV4dDogYm9vbGVhbjtcblx0XHRcdHJvdXRlUGF0aDogc3RyaW5nO1xuXHRcdFx0bmF2aWdhdGlvbkluRWRpdE1vZGU/OiBib29sZWFuO1xuXHQgIH07XG5cbnR5cGUgUm93Q29uZmlndXJhdGlvbiA9IHtcblx0YWN0aW9uVHlwZT86IHN0cmluZztcblx0bmF2aWdhdGlvbkluZm8/OiBSb3dOYXZpZ2F0aW9uSW5mbztcblx0cm93SGlnaGxpZ2h0aW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0cm93TmF2aWdhdGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0cm93Q3JpdGljYWxpdHlGb3JJbnNpZ2h0cz86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR2aXNpYmxlPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBNYXNzRWRpdFRhYmxlQ29uZmlndXJhdGlvbiA9IHtcblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0dmlzaWJsZUZpZWxkczogc3RyaW5nW107XG5cdGlnbm9yZWRGaWVsZHM6IHN0cmluZ1tdO1xuXHRvcGVyYXRpb25Hcm91cGluZ01vZGU6IE9wZXJhdGlvbkdyb3VwaW5nTW9kZTtcblx0Y3VzdG9tRnJhZ21lbnQ/OiBzdHJpbmcgfCBGb3JtQ29udGFpbmVyO1xuXHRmcm9tSW5saW5lPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGFibGVTb3J0Q29uZGl0aW9ucyA9IHtcblx0c29ydGVyczoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRkZXNjZW5kaW5nOiBib29sZWFuO1xuXHR9W107XG59O1xuXG50eXBlIFRhYmxlR3JvdXBDb25kaXRpb25zID0ge1xuXHRncm91cExldmVsczogeyBuYW1lOiBzdHJpbmcgfVtdO1xufTtcblxudHlwZSBUYWJsZUFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXG50eXBlIFRhYmxlUDEzbk1vZGUgPSBcIkFnZ3JlZ2F0ZVwiIHwgXCJDb2x1bW5cIiB8IFwiRmlsdGVyXCIgfCBcIkdyb3VwXCIgfCBcIlNvcnRcIjtcblxuZXhwb3J0IHR5cGUgQW5hbHl0aWNhbENvbmZpZ3VyYXRpb24gPSB7XG5cdGFnZ3JlZ2F0aW9uT25MZWFmTGV2ZWw/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiA9IHtcblx0Y29sbGVjdGlvbjogc3RyaW5nO1xuXHR2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlO1xuXHRmaWx0ZXJJZD86IHN0cmluZztcblx0aWQ6IHN0cmluZztcblx0YXBpSWQ6IHN0cmluZztcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZztcblx0cDEzbk1vZGU/OiBUYWJsZVAxM25Nb2RlW107XG5cdHJvdz86IFJvd0NvbmZpZ3VyYXRpb247XG5cdHNlbGVjdGlvbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuO1xuXHR1cGRhdGFibGVQcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0ZGlzcGxheU1vZGU/OiBib29sZWFuO1xuXHR0aHJlc2hvbGQ6IG51bWJlcjtcblx0ZW50aXR5TmFtZTogc3RyaW5nO1xuXHRlbnRpdHlUeXBlTmFtZTogc3RyaW5nO1xuXHRzb3J0Q29uZGl0aW9ucz86IFRhYmxlU29ydENvbmRpdGlvbnM7XG5cdGdyb3VwQ29uZGl0aW9ucz86IFRhYmxlR3JvdXBDb25kaXRpb25zO1xuXHRhZ2dyZWdhdGVDb25kaXRpb25zPzogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zO1xuXHRpbml0aWFsRXhwYW5zaW9uTGV2ZWw/OiBudW1iZXI7XG5cdGFsbG93RHJvcEJldHdlZW5Ob2Rlcz86IGJvb2xlYW47XG5cdGNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZD86IGJvb2xlYW47XG5cdC8qKiBDcmVhdGUgbmV3IGVudHJpZXMgKi9cblx0Y3JlYXRlOiBDcmVhdGVCZWhhdmlvciB8IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWw7XG5cdHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG5cdHJlcXVpcmVkUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR1cGxvYWRUYWJsZT86IFVwbG9hZFRhYmxlU2V0dGluZ3M7XG59O1xuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFwcCAoZGVmYXVsdCBjYXNlKVxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVCZWhhdmlvciA9IHtcblx0bW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRhcHBlbmQ6IGJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHN0cmluZztcblx0bmF2aWdhdGVUb1RhcmdldD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsTWV0aG9kQ29uZmlnID0ge1xuXHRtb2R1bGVOYW1lOiBzdHJpbmc7XG5cdG1ldGhvZE5hbWU6IHN0cmluZztcbn07XG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIGJ5IG5hdmlnYXRpbmcgdG8gc29tZSB0YXJnZXRcbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCA9IHtcblx0bW9kZTogXCJFeHRlcm5hbFwiO1xuXHRvdXRib3VuZDogc3RyaW5nO1xuXHRvdXRib3VuZERldGFpbDogTmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb25bXCJvdXRib3VuZERldGFpbFwiXTtcbn07XG5leHBvcnQgdHlwZSBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiA9IHtcblx0aXNEZWxldGFibGU6IGJvb2xlYW47XG5cdGlzVXBkYXRhYmxlOiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24gPSB7XG5cdHBhdGhzOiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0fVtdO1xuXHRzaG93Q291bnRzPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRkaXNhYmxlUmVxdWVzdENhY2hlPzogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW47XG5cdGNyZWF0ZUluUGxhY2U/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZTtcblx0b3V0Ym91bmRDcmVhdGlvbj86IHN0cmluZztcblx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogYm9vbGVhbjtcblx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBib29sZWFuO1xuXHRlbmFibGVFeHBvcnQ6IGJvb2xlYW47XG5cdGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xuXHRleHBvcnRTaGVldE5hbWU/OiBzdHJpbmc7XG5cdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcz86IGJvb2xlYW47XG5cdGZyb3plbkNvbHVtbkNvdW50PzogbnVtYmVyO1xuXHRlbmFibGVDb2x1bW5GcmVlemU/OiBib29sZWFuO1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcj86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGZpbHRlcnM/OiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0dHlwZTogVGFibGVUeXBlO1xuXHRyb3dDb3VudE1vZGU/OiBUYWJsZVJvd0NvdW50TW9kZTtcblx0cm93Q291bnQ/OiBudW1iZXI7XG5cdHNjcm9sbFRocmVzaG9sZD86IG51bWJlcjtcblx0dGhyZXNob2xkPzogbnVtYmVyO1xuXHRwb3BpbkxheW91dD86IFBvcGluTGF5b3V0TW9kZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRpZ25vcmVkRmllbGRzPzogc3RyaW5nO1xuXHRyZWFkT25seT86IGJvb2xlYW47XG5cdGRpc2FibGVDb3B5VG9DbGlwYm9hcmQ/OiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGlubGluZUNyZWF0aW9uUm93Q291bnQ/OiBudW1iZXI7XG5cdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU/OiBib29sZWFuO1xuXHRtYXNzRWRpdDogTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb247XG5cdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogYm9vbGVhbjtcblx0aGFzRGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBib29sZWFuO1xuXHRpc0NvbXBhY3RUeXBlPzogYm9vbGVhbjtcblx0aGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nO1xuXHRpc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGU/OiBib29sZWFuO1xuXHRlbmFibGVBZGRDYXJkVG9JbnNpZ2h0cz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdG5vZGVUeXBlPzoge1xuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdHZhbHVlczogeyB2YWx1ZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW10gfVtdO1xuXHR9O1xuXHRjcmVhdGVFbmFibGVtZW50PzogRXh0ZXJuYWxNZXRob2RDb25maWc7XG5cdGlzTm9kZU1vdmFibGU/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNOb2RlQ29weWFibGU/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQ/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNDb3B5VG9Qb3NpdGlvbkFsbG93ZWQ/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0c2VsZWN0aW9uQ2hhbmdlPzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzPzogc3RyaW5nW107XG5cdHJvd1ByZXNzPzogc3RyaW5nO1xuXHRiZWZvcmVSZWJpbmRUYWJsZT86IHN0cmluZztcblx0ZXhwb3J0UmVxdWVzdFNpemU/OiBudW1iZXI7XG5cdGVuYWJsZVVwbG9hZFBsdWdpbj86IGJvb2xlYW47XG5cdG1vZGVGb3JOb0RhdGFNZXNzYWdlPzogc3RyaW5nO1xuXHRhbmFseXRpY2FsQ29uZmlndXJhdGlvbj86IEFuYWx5dGljYWxDb25maWd1cmF0aW9uO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCIgfCBcIlJlc3BvbnNpdmVUYWJsZVwiIHwgXCJBbmFseXRpY2FsVGFibGVcIiB8IFwiVHJlZVRhYmxlXCI7XG5leHBvcnQgdHlwZSBUYWJsZVJvd0NvdW50TW9kZSA9IFwiQXV0b1wiIHwgXCJGaXhlZFwiIHwgXCJJbnRlcmFjdGl2ZVwiO1xuZXhwb3J0IHR5cGUgUG9waW5MYXlvdXRNb2RlID0gXCJCbG9ja1wiIHwgXCJHcmlkTGFyZ2VcIiB8IFwiR3JpZFNtYWxsXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gRXh0ZW5zaW9uRm9yQW5hbHl0aWNzICYge1xuXHRmcm9tR3JvdXBhYmxlUHJvcGVydHk6IGJvb2xlYW47XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGU7XG5cdGFubm90YXRpb246IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb247XG5cdGNvbnRyb2w6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW107XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xuXHRhbmFseXRpY3NFeHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+O1xuXHRyZXF1ZXN0QXRMZWFzdDogUmVxdWVzdEF0TGVhc3Q7XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUJhc2ljU2VhcmNoPzogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcblx0aGVhZGVySW5mb1RpdGxlOiBzdHJpbmc7XG5cdHNlbWFudGljS2V5czogc3RyaW5nW107XG5cdGhlYWRlckluZm9UeXBlTmFtZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8U3RyaW5nPiB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlJHNlbGVjdDogYm9vbGVhbjtcblx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiBib29sZWFuO1xuXHRpc0luc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGhhbmRsZVBhdGNoU2VudDogYm9vbGVhbjtcblx0ZGlzYWJsZU93blJlcXVlc3RPbk1WRj86IGJvb2xlYW47IC8vIFRvIGRpc2FibGUgdGhlICQkb3duUmVxdWVzdCBvbiBNdWx0aVZhbHVlRmllbGRzIGxpc3QgYmluZGluZ1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBzdGFuZGFyZCwgYW5ub3RhdGlvbi1iYXNlZCwgYW5kIG1hbmlmZXN0LWJhc2VkIHRhYmxlIGFjdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyBUaGUgY29tcGxldGUgdGFibGUgYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBY3Rpb25zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uczogU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbltcInN0YW5kYXJkQWN0aW9uc1wiXSxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQ29tYmluZWRBY3Rpb24ge1xuXHQvLyAxLiBHZXQgYWN0aW9ucyBmcm9tIGFubm90YXRpb25zXG5cdGNvbnN0IGlzQ29sbGFib3JhdGlvbkVuYWJsZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZEZyb21Db252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGNvbnN0IHRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdC8vIDIuIEdldCBhY3Rpb25zIGZyb20gbWFuaWZlc3Rcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zIGFzIFJlY29yZDxcblx0XHRcdHN0cmluZyxcblx0XHRcdE1hbmlmZXN0QWN0aW9uXG5cdFx0Pixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHRydWVcblx0KTtcblx0Ly8gVGhlIFwiQ29weVwiIGFjdGlvbiBhbHdheXMgbmVlZHMgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBcIkNyZWF0ZVwiIGFjdGlvbiwgc28gd2UgbmVlZCB0byBzZXBhcmF0ZSBpdFxuXHRjb25zdCBjb3B5QWN0aW9ucyA9IHRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnMuZmlsdGVyKChhKSA9PiBhLnR5cGUgPT09IEFjdGlvblR5cGUuQ29weSk7XG5cdGNvbnN0IGFubm90YXRpb25BY3Rpb25zID0gdGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucy5maWx0ZXIoKGEpID0+IGEudHlwZSAhPT0gQWN0aW9uVHlwZS5Db3B5KTtcblx0Ly8gQ29tYmluZSBzdGFuZGFyZCwgYW5ub3RhdGlvbiwgYW5kIGN1c3RvbSBhY3Rpb25zIHRvZ2V0aGVyLCByZXNwZWN0aW5nIHRoZSBmaXhlZCBvcmRlciBvZiBzdGFuZGFyZCBhY3Rpb25zXG5cdGNvbnN0IGFubm90YXRpb25BbmRTdGFuZGFyZEFjdGlvbnMgPSAoXG5cdFx0W1xuXHRcdFx0Li4uYW5ub3RhdGlvbkFjdGlvbnMsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuY3JlYXRlLFxuXHRcdFx0Li4uY29weUFjdGlvbnMsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuZGVsZXRlLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLm1hc3NFZGl0LFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmluc2lnaHRzLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmNyZWF0aW9uUm93LCAvLyBOb3QgdGVtcGxhdGVkIGFzIGEgYnV0dG9uXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuY3V0LFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmNvcHksXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMucGFzdGUsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMubW92ZVVwLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLm1vdmVEb3duXG5cdFx0XSBhcyBCYXNlQWN0aW9uW11cblx0KS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uICE9PSB1bmRlZmluZWQpO1xuXHQvLyBBbmNob3IgYWxsIG5vbi1hbmNob3JlZCBtYW5pZmVzdCBjdXN0b20gYWN0aW9ucy9tZW51cyBiZWZvcmUgdGhlIHN0YW5kYXJkIGFjdGlvbnNcblx0Zm9yIChjb25zdCBtYW5pZmVzdEFjdGlvbiBvZiBPYmplY3QudmFsdWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKSkge1xuXHRcdGlmICgobWFuaWZlc3RBY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5EZWZhdWx0IHx8IG1hbmlmZXN0QWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkgJiYgIW1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uPy5hbmNob3IpIHtcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uID0ge1xuXHRcdFx0XHRhbmNob3I6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGUsXG5cdFx0XHRcdHBsYWNlbWVudDogUGxhY2VtZW50LkJlZm9yZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gSW5zZXJ0IHR3aWNlIHRvIGFsbG93IHJlZ3VsYXIgb3ZlcnJpZGUgZm9yIG5vbi1zdGFuZGFyZCBhY3Rpb25zIGFuZCBwb3NpdGlvbmFsIG92ZXJyaWRlIGZvciBzdGFuZGFyZCBhY3Rpb25zXG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKTtcblx0Y29uc3Qgc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMobWFuaWZlc3RBY3Rpb25FbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKFwiU3RhbmRhcmRBY3Rpb246OlwiKSkpO1xuXHRjb25zdCBub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhtYW5pZmVzdEFjdGlvbkVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4gIXN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zW2tleV0pKTtcblx0Y29uc3QgYWN0aW9uT3ZlcndyaXRlQ29uZmlnOiBPdmVycmlkZVR5cGVBY3Rpb24gPSB7XG5cdFx0aXNOYXZpZ2FibGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlT25TZWxlY3Q6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlQXV0b1Njcm9sbDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRlbmFibGVkOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdHZpc2libGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGNvbW1hbmQ6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0bWVudTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRwcmlvcml0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRncm91cDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZVxuXHR9O1xuXHQvLyAzLiBHZXQgYWxsIGFubm90YXRpb24gbWVudSBpdGVtc1xuXHRjb25zdCBhbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zID0gZ2V0QW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyhhbm5vdGF0aW9uQWN0aW9ucyk7XG5cdC8vIDQuIEZpbmQgbWFuaWZlc3QgYWN0aW9ucyB3aGljaCBvdmVycmlkZSBhbnkgYW5ub3RhdGlvbiBtZW51IGl0ZW1zXG5cdGNvbnN0IG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zID0gZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbihhbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zLCBtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucyk7XG5cdC8vIDUuIEdldCBvdmVycmlkZGVuIGFubm90YXRpb24gbWVudSBpdGVtc1xuXHRjb25zdCBvdmVyd3JpdHRlbk1lbnVBY3Rpb25JdGVtcyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25NZW51QWN0aW9uSXRlbXMsIG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zLCBhY3Rpb25PdmVyd3JpdGVDb25maWcpO1xuXHQvLyA2LiBPdmVycmlkZSBhbGwgYWN0aW9uc1xuXHRsZXQgYWN0aW9ucyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25BbmRTdGFuZGFyZEFjdGlvbnMsIG5vblN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zLCBhY3Rpb25PdmVyd3JpdGVDb25maWcpIGFzIEN1c3RvbUFjdGlvbltdO1xuXHRhY3Rpb25zID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYWN0aW9ucywgc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMsIHtcblx0XHRwb3NpdGlvbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRwcmlvcml0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRncm91cDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZVxuXHR9KTtcblx0Ly8gNy4gUmVwbGFjZSBvcmlnaW5hbCBtZW51IGl0ZW1zIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBvdmVycmlkZGVuIG1lbnUgaXRlbXNcblx0cHJlcGFyZU1lbnVBY3Rpb25zKGFjdGlvbnMsIG92ZXJ3cml0dGVuTWVudUFjdGlvbkl0ZW1zKTtcblx0Ly8gOC4gUmVtb3ZlIGR1cGxpY2F0ZSBhY3Rpb25zIHdoaWNoIGFyZSBtZW51IGl0ZW1zXG5cdGFjdGlvbnMgPSByZW1vdmVEdXBsaWNhdGVBY3Rpb25zKGFjdGlvbnMpO1xuXHQvLyA5LiBIaWRlIG1lbnVzIHdoZXJlIGFsbCBtZW51IGl0ZW1zIGFyZSBoaWRkZW5cblx0YWN0aW9ucyA9IGdldFZpc2liaWxpdHlFbmFibGVtZW50TWVudUFjdGlvbnMoYWN0aW9ucyk7XG5cdC8vIDEwLiBBZGQgdGhlIGNvbGxhYm9yYXRpb24gY29uZGl0aW9uIGZvciBhY3Rpb25zIG90aGVyIHRoYW4gbmF2aWdhdGlvblxuXHRpZiAoaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCkge1xuXHRcdGFkZENvbGxhYm9yYXRpb25Db25kaXRpb24oYWN0aW9ucyk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IGFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IG1hbmlmZXN0QWN0aW9ucy5jb21tYW5kQWN0aW9uc1xuXHR9O1xufVxuXG4vL1JldHVybnMgdGhlIENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgZnJvbSB0aGUgY3VzdG9tIGFnZ3JlZ2F0ZSBhbm5vdGF0aW9uIG9yIGZyb20gdGhlIGFnZ3JlZ2F0aW9uIGFubm90YXRpb24gb24gdGhlIHByb3BlcnR5IGl0c2VsZi5cbmZ1bmN0aW9uIGdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uKGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcik6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XG5cdGNvbnN0IGN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMoKTtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXHRjdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG5cdFx0Y29uc3QgYWdncmVnYXRlZFByb3BlcnR5ID0gYWdncmVnYXRpb25IZWxwZXIuX2VudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Lm5hbWUgPT09IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdH0pO1xuXHRcdGlmIChhZ2dyZWdhdGVkUHJvcGVydHkpIHtcblx0XHRcdGNvbnN0IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPVxuXHRcdFx0XHRhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcyA/P1xuXHRcdFx0XHRhZ2dyZWdhdGVkUHJvcGVydHkuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9uc1thZ2dyZWdhdGVkUHJvcGVydHkubmFtZV0gPVxuXHRcdFx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPy5tYXAoKGN0eERlZlByb3BlcnR5KSA9PiBjdHhEZWZQcm9wZXJ0eS52YWx1ZSkgPz8gW107XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGN1c3RvbUFnZ3JlZ2F0ZWRlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBhZ2dyZWdhYmxlIHByb3BlcnRpZXMgLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgZG9lc24ndCBzdXBwb3J0IGFuYWx5dGljYWwgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFJlY29yZDxzdHJpbmcsIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzPiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgY3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgdGFibGVDb2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmICh0YWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRjb25zdCB0YXJnZXRVbml0UHJvcGVydHkgPSB0YWJsZUNvbHVtbnMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSB0YWJsZUNvbHVtbi51bml0KSBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuYWRkKHRhcmdldFVuaXRQcm9wZXJ0eS5yZWxhdGl2ZVBhdGgpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb24gPSBnZXRDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uQW5ub3RhdGlvbihhZ2dyZWdhdGlvbkhlbHBlcik7XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+ID0ge307XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgIT09IHVuZGVmaW5lZCB8fCAhdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHQvLyBJZ25vcmUgY29tcGxleCBjb2x1bW5zXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uW3RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aF0gYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBpZiB0aGVyZSBpcyBubyBjdXN0b20gYWdncmVnYXRlIGRlZmluaXRpb24sIGFuZCB0aGUgcHJvcGVydHkgaXMgZ3JvdXBhYmxlLCB0aGVuIHdlIGNhbiB1c2UgdGhlIGRlZmF1bHQgY29udGV4dCBkZWZpbmluZyBwcm9wZXJ0aWVzXG5cdFx0bGV0IGZyb21Hcm91cGFibGVQcm9wZXJ0eSA9IGZhbHNlO1xuXHRcdGlmICghcmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJiBwcm9wZXJ0eSAmJiAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpKSB7XG5cdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHkgPSB0cnVlO1xuXHRcdFx0cmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyA9IHByb3BlcnR5LmFubm90YXRpb25zLkFnZ3JlZ2F0aW9uPy5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChjdHhEZWZQcm9wZXJ0eSkgPT4gY3R4RGVmUHJvcGVydHkudmFsdWVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFyYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIHx8IGN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXModGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSkge1xuXHRcdFx0Ly8gSWdub3JlIGFnZ3JlZ2F0ZXMgY29ycmVzcG9uZGluZyB0byBjdXJyZW5jaWVzIG9yIHVuaXRzIG9mIG1lYXN1cmVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0gPSB7XG5cdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHk6IGZyb21Hcm91cGFibGVQcm9wZXJ0eSxcblx0XHRcdHJlbGF0aXZlUGF0aDogdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoXG5cdFx0fTtcblx0XHRjb25zdCBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMuZm9yRWFjaCgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHQvLyBJZ25vcmUgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVuY2llcyBvciB1bml0cyBvZiBtZWFzdXJlIG9mIGFnZ3JlZ2F0YWJsZSBwcm9wZXJ0aWVzXG5cdFx0XHQvLyAoYnV0IHRoaXMgaXMgYWxsb3dlZCBmb3IgZ3JvdXBhYmxlIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIWZyb21Hcm91cGFibGVQcm9wZXJ0eSAmJiBjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuaGFzKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmb3VuZENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKGZvdW5kQ29sdW1uKSB7XG5cdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMucHVzaChmb3VuZENvbHVtbi5uYW1lKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoY29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdHJlc3VsdFt0YWJsZUNvbHVtbi5uYW1lXS5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IHZvaWQge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EYXRhKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGUkc2VsZWN0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyA9IGFnZ3JlZ2F0aW9uRGF0YTtcblx0XHRcdF91cGRhdGVQcm9wZXJ0eUluZm9zV2l0aEFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyh0YWJsZVZpc3VhbGl6YXRpb24pO1xuXHRcdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdFx0KTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uRGF0YVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLmVycm9yKGBBZ2dyZWdhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGVudGl0eSB0eXBlOiAke2VudGl0eVR5cGUubmFtZX1gKTtcblx0XHR9XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9IFwiR3JpZFRhYmxlXCI7IC8vIEFuYWx5dGljYWxUYWJsZSBpc24ndCBhIHJlYWwgdHlwZSBmb3IgdGhlIE1EQzpUYWJsZSwgc28gd2UgYWx3YXlzIHN3aXRjaCBiYWNrIHRvIEdyaWRcblx0fSBlbHNlIGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uZ3JvdXBDb25kaXRpb25zID0gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGVcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRjb25zdCBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpO1xuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gdHJ1ZTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5jaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPSAoZW50aXR5VHlwZT8uYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bXG5cdFx0XHRgUmVjdXJzaXZlSGllcmFyY2h5QWN0aW9ucyMke3RhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLmhpZXJhcmNoeVF1YWxpZmllciA/PyBcIlwifWBcblx0XHRdPy5DaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPz8gdHJ1ZSkgYXMgYm9vbGVhbjtcblxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFsbG93RHJvcEJldHdlZW5Ob2RlcyA9XG5cdFx0XHQhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bYFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHt0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5oaWVyYXJjaHlRdWFsaWZpZXIgPz8gXCJcIn1gXVxuXHRcdFx0XHQ/LkNoYW5nZU5leHRTaWJsaW5nQWN0aW9uO1xuXHR9XG5cblx0Ly8gU29tZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgbG9hZGVkIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGJ5IG91ciBpbnRlcm5hbCBsb2dpY1xuXHQvLyAtIEhhc0FjdGl2ZUVudGl0eSBpcyBuZWVkZWQgZm9yIHRoZSByb3cgY3JpdGljYWxpdHkgZXhwcmVzc2lvblxuXHQvLyAtIEhhc0RyYWZ0RW50aXR5IGlzIG5lZWRlZCBpbiBMUiB3aXRoIFRyZWVUYWJsZSBhbmQgQW5hbHl0aWNhbCBUYWJsZSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgaWYgdGhlcmUncyBvbmUgd2hlbiBjbGlja2luZyBvbiB0aGUgYWN0aXZlIGluc3RhbmNlXG5cdC8vIC0gSGFzRHJhZnRFbnRpdHkgYW5kIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciBhcmUgbmVlZGVkIGluIHRoZSBMUiBmb3IgdGhlIGRlbGV0ZSBsb2dpY1xuXHRpZiAoTW9kZWxIZWxwZXIuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpKSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiSGFzQWN0aXZlRW50aXR5XCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5hbmFseXRpY2FsQ29uZmlndXJhdGlvbj8uYWdncmVnYXRpb25PbkxlYWZMZXZlbCkge1xuXHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkga2V5IGlzIG5lZWRlZCBmb3IgbmF2aWdhdGlvbiB0byB0aGUgZHJhZnQgaW5zdGFuY2Vcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5yZXF1ZXN0QXRMZWFzdFtcIklzQWN0aXZlRW50aXR5XCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdH1cblxuXHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSkge1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiSGFzRHJhZnRFbnRpdHlcIl0gPSBbXCJkcmFmdEtleXNcIl07XG5cdFx0XHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAhPT0gdHJ1ZSAmJiB0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlICE9PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0XHRcdC8vIFdlIGRvbid0IGxvYWQgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgZm9yIEFuYWx5dGljYWwgYW5kIFRyZWUgdGFibGVzIGluIExSIGJlY2F1c2UgdGhleSBkaXNwbGF5IGFjdGl2ZSBpbnN0YW5jZXMgb25seVxuXHRcdFx0XHQvLyAodGhlcmVmb3JlIG5vIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvSW5Qcm9jZXNzQnlVc2VyXCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZXJDb250ZXh0KSAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNGY2xFbmFibGVkKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIl0gPSBbXCJkcmFmdEtleXNcIl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wuZW5hYmxlVXBsb2FkUGx1Z2luKSB7XG5cdFx0Y29uc3Qgc3RyZWFtUHJvcGVydHkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnM/LlVJPy5NZWRpYVJlc291cmNlPy5TdHJlYW0/LiR0YXJnZXQ7XG5cdFx0aWYgKCFzdHJlYW1Qcm9wZXJ0eSkge1xuXHRcdFx0dGhyb3cgXCJVSS5NZWRpYVJlc291cmNlIGFubm90YXRpb24gd2l0aCBTdHJlYW0gcHJvcGVydHkgbWlzc2luZ1wiO1xuXHRcdH1cblxuXHRcdC8vIHRoZSB1cGxvYWQgYWN0aW9uIGlzIHRyZWF0ZWQgYXMgdGhlIGNyZWF0ZSBhY3Rpb25cblx0XHRjb25zdCB1cGxvYWRBY3Rpb24gPSB0YWJsZVZpc3VhbGl6YXRpb24uYWN0aW9ucy5maW5kKChhKSA9PiBhLmtleSA9PT0gU3RhbmRhcmRBY3Rpb25LZXlzLkNyZWF0ZSkgYXMgU3RhbmRhcmRBY3Rpb247XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi51cGxvYWRUYWJsZSA9IHtcblx0XHRcdHN0cmVhbTogc3RyZWFtUHJvcGVydHkubmFtZSxcblx0XHRcdGZpbGVOYW1lOiAoc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQ29udGVudERpc3Bvc2l0aW9uPy5GaWxlbmFtZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiB8IHVuZGVmaW5lZCk/LnBhdGgsXG5cdFx0XHRmaWxlTmFtZU1heExlbmd0aDogc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQ29udGVudERpc3Bvc2l0aW9uPy5GaWxlbmFtZT8uJHRhcmdldD8ubWF4TGVuZ3RoLFxuXHRcdFx0YWNjZXB0YWJsZU1lZGlhVHlwZXM6IHN0cmVhbVByb3BlcnR5LmFubm90YXRpb25zLkNvcmU/LkFjY2VwdGFibGVNZWRpYVR5cGVzLFxuXHRcdFx0bWF4TGVuZ3RoOiBzdHJlYW1Qcm9wZXJ0eS5tYXhMZW5ndGgsXG5cdFx0XHR1cGxvYWRBY3Rpb246IHVwbG9hZEFjdGlvblxuXHRcdH07XG5cdH1cblxuXHQvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGluIGEgTGlzdFJlcG9ydCwgZm9yIGEgbm9uLWFuYWx5dGljYWwgdGFibGUgdGhhdCBpcyBjb21wbGV0ZWx5IHJlYWQtb25seSAobm8gZWRpdCBkcmFmdC9zdGlja3ksIG5vIGFjdGlvbnMpLFxuXHQvLyB0aGUgbXVsdGktdmFsdWUgZmllbGRzIGRvbid0IGhhdmUgdGhlaXIgb3duIHJlcXVlc3Rcblx0Y29uc3QgdmlzaWJsZUFjdGlvbnMgPSB0YWJsZVZpc3VhbGl6YXRpb24uYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnZpc2libGUgIT09IFwiZmFsc2VcIik7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdCFNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSkgJiZcblx0XHQhTW9kZWxIZWxwZXIuaXNTdGlja3koY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgJiZcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICE9PSB0cnVlICYmXG5cdFx0dmlzaWJsZUFjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIGFjdGlvbi5rZXkuc3RhcnRzV2l0aChcIlN0YW5kYXJkQWN0aW9uOjpcIik7XG5cdFx0fSlcblx0KSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmRpc2FibGVPd25SZXF1ZXN0T25NVkYgPSB0cnVlO1xuXHR9XG59XG5cbnR5cGUgZmllbGRPcmlnaW4gPVxuXHR8IFwic2VtYW50aWNLZXlcIlxuXHR8IFwicmVzdHJpY3Rpb25cIlxuXHR8IFwic2Vjb25kYXJ5S2V5XCJcblx0fCBcInByZXNlbnRhdGlvblZhcmlhbnRcIlxuXHR8IFwibmF2aWdhdGlvblwiXG5cdHwgXCJvcGVyYXRpb25cIlxuXHR8IFwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5c1wiXG5cdHwgXCJkcmFmdEtleXNcIjtcbmV4cG9ydCB0eXBlIFJlcXVlc3RBdExlYXN0ID0gUmVjb3JkPHN0cmluZywgZmllbGRPcmlnaW5bXT47XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHNlbGVjdCBxdWVyeSB3aXRoIHRoZSBzZWxlY3RlZCBmaWVsZHMgZnJvbSB0aGUgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBMaW5lSXRlbSB3ZSB3YW50IHRoZSByZXF1ZXN0ZWQgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIG9wZXJhdGlvbkF2YWlsYWJsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0aW9uLCB3aGljaCB3ZSdsbCB0YWtlIHRoZSBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgc2VsZWN0IHF1ZXJ5LlxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uIHdoaWNoIHdlJ2xsIHRha2UgdGhlIFJlcXVlc3RBdExlYXN0IHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSAnc2VsZWN0JyBxdWVyeSB0aGF0IGhhcyB0aGUgc2VsZWN0ZWQgZmllbGRzIGZyb20gdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RlZFByb3BlcnRpZXMoXG5cdGxpbmVJdGVtOiBMaW5lSXRlbSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0b3BlcmF0aW9uQXZhaWxhYmxlPzogc3RyaW5nLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlXG4pOiBSZXF1ZXN0QXRMZWFzdCB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtKTtcblx0Y29uc3Qgc2VsZWN0ZWRGaWVsZHM6IFJlcXVlc3RBdExlYXN0ID0ge307XG5cdGZ1bmN0aW9uIHB1c2hGaWVsZChmaWVsZE5hbWU6IHN0cmluZywgb3JpZ2luOiBmaWVsZE9yaWdpbik6IHZvaWQge1xuXHRcdGlmIChmaWVsZE5hbWUgJiYgZmllbGROYW1lLmluZGV4T2YoXCIvXCIpICE9PSAwKSB7XG5cdFx0XHQvLyBEbyBub3QgYWRkIHNpbmdsZXRvbiBwcm9wZXJ0eSAod2l0aCBhYnNvbHV0ZSBwYXRoKSB0byAkc2VsZWN0XG5cdFx0XHRpZiAoIXNlbGVjdGVkRmllbGRzW2ZpZWxkTmFtZV0pIHtcblx0XHRcdFx0c2VsZWN0ZWRGaWVsZHNbZmllbGROYW1lXSA9IFtvcmlnaW5dO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZWN0ZWRGaWVsZHNbZmllbGROYW1lXS5wdXNoKG9yaWdpbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaEZpZWxkTGlzdChmaWVsZHM6IHN0cmluZ1tdLCBvcmlnaW46IGZpZWxkT3JpZ2luKTogdm9pZCB7XG5cdFx0aWYgKGZpZWxkcz8ubGVuZ3RoKSB7XG5cdFx0XHRmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHB1c2hGaWVsZChmaWVsZCwgb3JpZ2luKSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyA9IChvcGVyYXRpb25BdmFpbGFibGUgfHwgXCJcIikuc3BsaXQoXCIsXCIpO1xuXHRjb25zdCB2YWxpZFByb3BlcnRpZXMgPSBvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAocHJvcE5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BOYW1lKTtcblx0fSk7XG5cdGNvbnN0IHNlbWFudGljS2V5czogc3RyaW5nW10gPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5IHx8IFtdKS5tYXAoKHNlbWFudGljS2V5KSA9PiBzZW1hbnRpY0tleS52YWx1ZSk7XG5cdGNvbnN0IGNhcGFiaWxpdGllc0Fubm90YXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzO1xuXHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpIGFzIEVudGl0eVNldCk7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdHB1c2hGaWVsZExpc3QocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uUmVxdWVzdEF0TGVhc3Q/Lm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGgudmFsdWUpLCBcInByZXNlbnRhdGlvblZhcmlhbnRcIik7XG5cdH1cblx0cHVzaEZpZWxkTGlzdChnZXROYXZpZ2F0aW9uQXZhaWxhYmxlRmllbGRzRnJvbUxpbmVJdGVtKGxpbmVJdGVtLCBlbnRpdHlUeXBlKSwgXCJuYXZpZ2F0aW9uXCIpO1xuXHRwdXNoRmllbGRMaXN0KHZhbGlkUHJvcGVydGllcywgXCJvcGVyYXRpb25cIik7XG5cdHB1c2hGaWVsZExpc3Qoc2VtYW50aWNLZXlzLCBcInNlbWFudGljS2V5XCIpO1xuXHRwdXNoRmllbGRMaXN0KGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMsIFwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5c1wiKTtcblx0aWYgKGNhcGFiaWxpdGllc0Fubm90YXRpb24pIHtcblx0XHRwdXNoRmllbGQoKGNhcGFiaWxpdGllc0Fubm90YXRpb24uRGVsZXRlUmVzdHJpY3Rpb25zPy5EZWxldGFibGUgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPGJvb2xlYW4+KT8ucGF0aCwgXCJyZXN0cmljdGlvblwiKTtcblx0XHRwdXNoRmllbGQoKGNhcGFiaWxpdGllc0Fubm90YXRpb24uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGUgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPGJvb2xlYW4+KT8ucGF0aCwgXCJyZXN0cmljdGlvblwiKTtcblx0fVxuXG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBUaGlzIHJldHVybiB0aGUgcHJvcGVydHkgdGhhdCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIE5hdmlnYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiBvbiBJQk4gRmllbGRzLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBsaW5lIGl0ZW0gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBFbnRpdHkgVHlwZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvbkF2YWlsYWJsZUZpZWxkc0Zyb21MaW5lSXRlbShsaW5lSXRlbTogTGluZUl0ZW0sIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNlbGVjdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXHRsaW5lSXRlbS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQpIHtcblx0XHRpZiAoXG5cdFx0XHRyZWNvcmQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0IXJlY29yZC5JbmxpbmUgJiZcblx0XHRcdCFyZWNvcmQuRGV0ZXJtaW5pbmcgJiZcblx0XHRcdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHJlY29yZC5OYXZpZ2F0aW9uQXZhaWxhYmxlKVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgcGF0aCA9IChyZWNvcmQuTmF2aWdhdGlvbkF2YWlsYWJsZSBhcyB1bmtub3duIGFzIHsgcGF0aDogc3RyaW5nIH0pLnBhdGg7XG5cdFx0XHRpZiAoZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXRoKSkge1xuXHRcdFx0XHRzZWxlY3RlZEZpZWxkcy5wdXNoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzZWxlY3RlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hdmlnYXRpb24gdGFyZ2V0IHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcGF0aCB0byBjaGVjayBpbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3NcbiAqIEByZXR1cm5zIE5hdmlnYXRpb24gcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgbmF2Q29uZmlnRm9yQ29udGV4dFBhdGggPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oY29udGV4dFBhdGgpO1xuXHRpZiAobmF2Q29uZmlnRm9yQ29udGV4dFBhdGggJiYgT2JqZWN0LmtleXMobmF2Q29uZmlnRm9yQ29udGV4dFBhdGgpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gY29udGV4dFBhdGg7XG5cdH1cblx0cmV0dXJuIGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0ID8gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSA6IGRhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IHtcblx0aGVhZGVySW5mb1RpdGxlUGF0aDogc3RyaW5nO1xuXHRzZW1hbnRpY0tleUNvbHVtbnM6IHN0cmluZ1tdO1xuXHRoZWFkZXJJbmZvVHlwZU5hbWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFN0cmluZz4gfCB1bmRlZmluZWQ7XG59IHtcblx0Y29uc3QgaGVhZGVySW5mb1RpdGxlUGF0aCA9IChjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCk/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZVxuXHRcdD8ucGF0aDtcblx0Y29uc3Qgc2VtYW50aWNLZXlBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNLZXk7XG5cdGNvbnN0IGhlYWRlckluZm9UeXBlTmFtZSA9IGNvbnZlcnRlckNvbnRleHQ/LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCk/LmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWU7XG5cdGNvbnN0IHNlbWFudGljS2V5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcblx0aWYgKHNlbWFudGljS2V5QW5ub3RhdGlvbnMpIHtcblx0XHRzZW1hbnRpY0tleUFubm90YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW4pIHtcblx0XHRcdHNlbWFudGljS2V5Q29sdW1ucy5wdXNoKG9Db2x1bW4udmFsdWUpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7IGhlYWRlckluZm9UaXRsZVBhdGgsIHNlbWFudGljS2V5Q29sdW1ucywgaGVhZGVySW5mb1R5cGVOYW1lIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHBhcmFtcz86IFBhcnRpYWw8e1xuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZTtcblx0XHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGU7XG5cdFx0aXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudDogYm9vbGVhbjtcblx0fT5cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHsgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQsIHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIH0gPSBwYXJhbXMgPz8ge307XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50LFxuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRUYWJsZUNvbHVtbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB0YWJsZU1hbmlmZXN0Q29uZmlnLnR5cGUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSA9IGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24oXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0KTtcblx0Y29uc3QgdGFibGVBbm5vdGF0aW9uID0gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGNvbHVtbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb25cblx0KTtcblx0Y29uc3QgdGFibGVBY3Rpb25zID0gZ2V0VGFibGVBY3Rpb25zKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uc3RhbmRhcmRBY3Rpb25zLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGUgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dCk7XG5cdGxldCBoZWFkZXIgPSB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlcjtcblx0aGVhZGVyID8/PSB0YWJsZUFubm90YXRpb24udGl0bGUgPT09IFwiXCIgPyB1bmRlZmluZWQgOiB0YWJsZUFubm90YXRpb24udGl0bGU7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogdGFibGVBbm5vdGF0aW9uLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogdGFibGVBY3Rpb25zLmFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IHRhYmxlQWN0aW9ucy5jb21tYW5kQWN0aW9ucyxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBvcGVyYXRpb25BdmFpbGFibGUsXG5cdFx0aGVhZGVySW5mb1RpdGxlOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1RpdGxlUGF0aCxcblx0XHRzZW1hbnRpY0tleXM6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5zZW1hbnRpY0tleUNvbHVtbnMsXG5cdFx0aGVhZGVySW5mb1R5cGVOYW1lOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1R5cGVOYW1lLFxuXHRcdGVuYWJsZSRzZWxlY3Q6IHRydWUsXG5cdFx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiB0cnVlLFxuXHRcdGhlYWRlcjogaGVhZGVyLFxuXHRcdGhlYWRlclZpc2libGU6IHRhYmxlTWFuaWZlc3RDb25maWcuaGVhZGVyVmlzaWJsZSxcblx0XHRyZXF1ZXN0QXRMZWFzdDogY3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyhsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG9wZXJhdGlvbkF2YWlsYWJsZSwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pLFxuXHRcdGhhbmRsZVBhdGNoU2VudDogY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0fTtcblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZShcblx0XHRvVmlzdWFsaXphdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRpc0JsYW5rVGFibGU/OiBib29sZWFuXG4pOiBUYWJsZVZpc3VhbGl6YXRpb24ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0Q29uZmlnID0gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odW5kZWZpbmVkLCBcIlwiLCBjb252ZXJ0ZXJDb250ZXh0LCBmYWxzZSk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoXG5cdFx0e30sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0W10sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLnR5cGUsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZy5jcmVhdGlvbk1vZGUsXG5cdFx0e31cblx0KTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSA9IGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBcIlwiKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24gPSBnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uKFxuXHRcdHVuZGVmaW5lZCxcblx0XHRcIlwiLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0KTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XCJcIixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdFx0aXNCbGFua1RhYmxlID8gW10gOiBjb2x1bW5zLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvblxuXHRcdCksXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiBbXSxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dCksXG5cdFx0aGVhZGVySW5mb1RpdGxlOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1RpdGxlUGF0aCxcblx0XHRzZW1hbnRpY0tleXM6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5zZW1hbnRpY0tleUNvbHVtbnMsXG5cdFx0aGVhZGVySW5mb1R5cGVOYW1lOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuaGVhZGVySW5mb1R5cGVOYW1lLFxuXHRcdGVuYWJsZSRzZWxlY3Q6IHRydWUsXG5cdFx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiB0cnVlLFxuXHRcdGhlYWRlcjogdGFibGVNYW5pZmVzdENvbmZpZy5oZWFkZXIsXG5cdFx0aGVhZGVyVmlzaWJsZTogdGFibGVNYW5pZmVzdENvbmZpZy5oZWFkZXJWaXNpYmxlLFxuXHRcdGhhbmRsZVBhdGNoU2VudDogY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0cmVxdWVzdEF0TGVhc3Q6IHt9XG5cdH07XG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCwgY29sdW1ucyk7XG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUob1Zpc3VhbGl6YXRpb24sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgb2YgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHMgZm9yIGFsbCBEYXRhRmllbGRGb3JBY3Rpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGxpbmUgaXRlbVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHJlY29yZCBjb250YWluaW5nIGFsbCBhY3Rpb24gbmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIEFjdGlvbkhlbHBlci5nZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBcInRhYmxlXCIsIGNvbnZlcnRlckNvbnRleHQpO1xufVxuLyoqXG4gKiBHZXRzIHVwZGF0YWJsZSBwcm9wZXJ0eVBhdGggZm9yIHRoZSBjdXJyZW50IGVudGl0eXNldCBpZiB2YWxpZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSB1cGRhdGFibGUgcHJvcGVydHkgZm9yIHRoZSByb3dzXG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IHN0cmluZyB7XG5cdGNvbnN0IHJlc3RyaWN0aW9ucyA9IGdldFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0Y29uc3QgdXBkYXRhYmxlID0gcmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlO1xuXHRjb25zdCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5ID0gIWlzQ29uc3RhbnQodXBkYXRhYmxlLmV4cHJlc3Npb24pICYmIHVwZGF0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIjtcblx0Y29uc3QgdXBkYXRhYmxlRXhwcmVzc2lvbiA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZTtcblx0Y29uc3QgdXBkYXRhYmxlUHJvcGVydHlQYXRoID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odXBkYXRhYmxlRXhwcmVzc2lvbikgJiYgdXBkYXRhYmxlRXhwcmVzc2lvbi5wYXRoO1xuXHRyZXR1cm4gaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSA/ICh1cGRhdGFibGVQcm9wZXJ0eVBhdGggYXMgc3RyaW5nKSA6IFwiXCI7XG59XG4vKipcbiAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbGwgcHJvcGVydHkgcGF0aHMgYXNzaWduZWQgdG8gdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb24uXG4gKiBAcGFyYW0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIENTViBzdHJpbmcgb2YgYWxsIHByb3BlcnR5IHBhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvblxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKFxuXHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblx0aWYgKHByb3BlcnRpZXMuc2l6ZSkge1xuXHRcdC8vIFNvbWUgYWN0aW9ucyBoYXZlIGFuIG9wZXJhdGlvbiBhdmFpbGFibGUgYmFzZWQgb24gcHJvcGVydHkgLS0+IHdlIG5lZWQgdG8gbG9hZCB0aGUgSGVhZGVySW5mby5UaXRsZSBwcm9wZXJ0eVxuXHRcdC8vIHNvIHRoYXQgdGhlIGRpYWxvZyBvbiBwYXJ0aWFsIGFjdGlvbnMgaXMgZGlzcGxheWVkIHByb3Blcmx5IChCQ1AgMjE4MDI3MTQyNSlcblx0XHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0Y29uc3QgdGl0bGVQcm9wZXJ0eSA9IChlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aDtcblx0XHRpZiAodGl0bGVQcm9wZXJ0eSkge1xuXHRcdFx0cHJvcGVydGllcy5hZGQodGl0bGVQcm9wZXJ0eSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBBcnJheS5mcm9tKHByb3BlcnRpZXMpLmpvaW4oXCIsXCIpO1xufVxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggT2JqZWN0IHBhdGggb2YgdGhlIGRhdGEgbW9kZWxcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHQvLyBDaGVjayBpZiB0aGUgbGluZUl0ZW0gY29udGV4dCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBhY3Rpb246XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmXG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlKSB8fFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5SZXF1aXJlc0NvbnRleHQgJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0XHQpIHtcblx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0YVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zLnB1c2goZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbkF0VGFibGVMZXZlbChkYXRhRmllbGQsIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoKSwgZmFsc2UpKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zO1xufVxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgYmluZGluZyBleHByZXNzaW9uIG9mIHRoZSBwYXRoIG9mIGEgRGF0YUZpZWxkLlxuICogQHBhcmFtIGV4cHJlc3Npb24gQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb25cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gZ2V0UGF0aEZyb21BY3Rpb25Bbm5vdGF0aW9uKGV4cHJlc3Npb246IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRsZXQgcGF0aDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuXHRcdHBhdGggPSBleHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cGF0aCA9IGV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjb250ZXh0IGN1cnJlbnRseSByZWZlcmVuY2VkIGJ5IHRoaXMgYmluZGluZyBieSByZW1vdmluZyB0aGUgbGFzdCBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuICpcbiAqIEl0IGlzIHVzZWQgKHNwZWNpZmljYWxseSBpbiB0aGlzIGNhc2UpLCB0byB0cmFuc2Zvcm0gYSBiaW5kaW5nIG1hZGUgZm9yIGEgTmF2UHJvcCBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxL05hdlByb3AyLFxuICogaW50byBhIGJpbmRpbmcgb24gdGhlIHByZXZpb3VzIGNvbnRleHQgL01haW5PYmplY3QvTmF2UHJvcDEuXG4gKiBAcGFyYW0gc291cmNlIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IEN1c3RvbUFjdGlvblxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIERhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gZ2V0SGlkZGVuRXhwcmVzc2lvbkF0VGFibGVMZXZlbChcblx0c291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4ge1xuXHRjb25zdCBleHByZXNzaW9uID0gc291cmNlLmFubm90YXRpb25zPy5VST8uSGlkZGVuIGFzIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRsZXQgcGF0aCA9IGdldFBhdGhGcm9tQWN0aW9uQW5ub3RhdGlvbihleHByZXNzaW9uKTtcblx0aWYgKHR5cGVvZiBwYXRoID09PSBcIm9iamVjdFwiKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGlmIChcInZpc2libGVcIiBpbiBzb3VyY2UpIHtcblx0XHRcdHBhdGggPSBwYXRoLnN1YnN0cmluZygxLCBwYXRoLmxlbmd0aCAtIDEpO1xuXHRcdH1cblx0XHRpZiAocGF0aC5pbmRleE9mKFwiL1wiKSA+IDApIHtcblx0XHRcdC8vY2hlY2sgaWYgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgaXMgY29ycmVjdDpcblx0XHRcdGNvbnN0IHNwbGl0UGF0aEZvck5hdmlnYXRpb25Qcm9wZXJ0eSA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBzcGxpdFBhdGhGb3JOYXZpZ2F0aW9uUHJvcGVydHlbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlzTmF2aWdhdGlvblByb3BlcnR5KGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3QpICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBuYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBwYXRoSW5Nb2RlbChzcGxpdFBhdGhGb3JOYXZpZ2F0aW9uUHJvcGVydHkuc2xpY2UoMSkuam9pbihcIi9cIikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG59XG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgbWFuaWZlc3QgYWN0aW9ucyBhbmQgY2hlY2sgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBJZiB0aGUgZGF0YSBmaWVsZCBpcyBhbHNvIHJlZmVyZW5jZWQgYXMgYSBjdXN0b20gYWN0aW9uLlxuICogSWYgdGhlIHVuZGVybHlpbmcgbWFuaWZlc3QgYWN0aW9uIGlzIGVpdGhlciBhIGJvdW5kIGFjdGlvbiBvciBoYXMgdGhlICdSZXF1aXJlc0NvbnRleHQnIHByb3BlcnR5IHNldCB0byB0cnVlLlxuICpcbiAqIElmIHNvLCB0aGUgJ3JlcXVpcmVzU2VsZWN0aW9uJyBwcm9wZXJ0eSBpcyBmb3JjZWQgdG8gJ3RydWUnIGluIHRoZSBtYW5pZmVzdC5cbiAqIEBwYXJhbSBkYXRhRmllbGRJZCBJZCBvZiB0aGUgRGF0YUZpZWxkIGV2YWx1YXRlZFxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgZXZhbHVhdGVkXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIERhdGFGaWVsZCBpcyBmb3VuZCBhbW9uZyB0aGUgbWFuaWZlc3QgYWN0aW9uc1xuICovXG5mdW5jdGlvbiB1cGRhdGVNYW5pZmVzdEFjdGlvbkFuZFRhZ0l0KFxuXHRkYXRhRmllbGRJZDogc3RyaW5nLFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+XG4pOiBib29sZWFuIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykuc29tZSgoYWN0aW9uS2V5KSA9PiB7XG5cdFx0aWYgKGFjdGlvbktleSA9PT0gZGF0YUZpZWxkSWQpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb24pPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgfHxcblx0XHRcdFx0KGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pPy5SZXF1aXJlc0NvbnRleHRcblx0XHRcdCkge1xuXHRcdFx0XHRtYW5pZmVzdEFjdGlvbnNbZGF0YUZpZWxkSWRdLnJlcXVpcmVzU2VsZWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuLyoqXG4gKiBMb29wIHRocm91Z2ggdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9mIGEgbGluZSBpdGVtIGFuZFxuICogY2hlY2sgdGhlIGZvbGxvd2luZzpcbiAqIElmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFsd2F5cyB2aXNpYmxlIGluIHRoZSB0YWJsZSB0b29sYmFyIGFuZCByZXF1aXJlcyBhIGNvbnRleHRcbiAqIElmIGFuIGFjdGlvbiBpcyBhbHNvIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LCBpdCBpcyBzZXQgYXNpZGUgYW5kIHdpbGwgYmUgY29uc2lkZXJlZFxuICogd2hlbiBnb2luZyB0aHJvdWdoIHRoZSBtYW5pZmVzdC5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBFbnRpdHkgVHlwZVxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzW10sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPixcblx0Y3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gbGluZUl0ZW1Bbm5vdGF0aW9uLnNvbWUoKGRhdGFGaWVsZCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikgJiZcblx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUgJiZcblx0XHRcdChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gZmFsc2UgfHwgZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHVuZGVmaW5lZClcblx0XHQpIHtcblx0XHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBtYW5pZmVzdEFjdGlvbklkID0gZ2VuZXJhdGUoW1wiRGF0YUZpZWxkRm9yQWN0aW9uXCIsIGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nXSk7XG5cdFx0XHRcdC8vIGlmIHRoZSBEYXRhRmllbGRGb3JBY3RvbiBmcm9tIGFubm90YXRpb24gYWxzbyBleGlzdHMgaW4gdGhlIG1hbmlmZXN0LCBpdHMgdmlzaWJpbGl0eSB3aWxsIGJlIGV2YWx1YXRlZCBsYXRlciBvblxuXHRcdFx0XHRpZiAodXBkYXRlTWFuaWZlc3RBY3Rpb25BbmRUYWdJdChtYW5pZmVzdEFjdGlvbklkLCBkYXRhRmllbGQsIG1hbmlmZXN0QWN0aW9ucykpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiYgY3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBhbm5vdGF0aW9uIGFsc28gZXhpc3RzIGluIHRoZSBtYW5pZmVzdCwgaXRzIHZpc2liaWxpdHkgd2lsbCBiZSBldmFsdWF0ZWQgbGF0ZXIgb25cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQoXG5cdFx0XHRcdFx0XHRgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOjoke2RhdGFGaWVsZC5TZW1hbnRpY09iamVjdH06OiR7ZGF0YUZpZWxkLkFjdGlvbn1gLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0bWFuaWZlc3RBY3Rpb25zXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZC5SZXF1aXJlc0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAgJiZcblx0XHRcdChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gZmFsc2UgfHwgZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHVuZGVmaW5lZClcblx0XHQpIHtcblx0XHRcdHJldHVybiBoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGRhdGFGaWVsZC5BY3Rpb25zLCBtYW5pZmVzdEFjdGlvbnMsIGN1cnJlbnRFbnRpdHlUeXBlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgY3VzdG9tIGFjdGlvbiB0aGF0IHJlcXVpcmVzIGEgY29udGV4dCBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdG9vbGJhci5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGFjdGlvbiB0aGF0IG1lZXRzIHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBib29sZWFuIHtcblx0Y29uc3QgY3VzdG9tQWN0aW9ucyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykucmVkdWNlKChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSwgYWN0aW9uS2V5KSA9PiB7XG5cdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0aWYgKCFhY3Rpb24ubWVudSkge1xuXHRcdFx0Ly9zaW1wbGUgY3VzdG9tIGFjdGlvblxuXHRcdFx0YWN0aW9ucy5wdXNoKGFjdGlvbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGdyb3VwZWQgYWN0aW9uc1xuXHRcdFx0YWN0aW9ucyA9IFsuLi5hY3Rpb25zLCAuLi4oYWN0aW9uLm1lbnUuZmlsdGVyKChtZW51QWN0aW9uKSA9PiB0eXBlb2YgbWVudUFjdGlvbiAhPT0gXCJzdHJpbmdcIikgYXMgQ3VzdG9tQWN0aW9uW10pXTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjdGlvbnM7XG5cdH0sIFtdKTtcblx0cmV0dXJuICEhY3VzdG9tQWN0aW9ucy5maW5kKFxuXHRcdChhY3Rpb24pID0+IGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiAmJiAoYWN0aW9uLnZpc2libGUgPT09IHVuZGVmaW5lZCB8fCBhY3Rpb24udmlzaWJsZT8udG9TdHJpbmcoKSA9PT0gXCJ0cnVlXCIpXG5cdCk7XG59XG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIGN1c3RvbSBhY3Rpb25zICh3aXRoIGtleSByZXF1aXJlc1NlbGVjdGlvbikgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0IGZvciB0aGUgY3VycmVudCBsaW5lIGl0ZW0gYW5kIHJldHVybnMgYWxsIHRoZVxuICogdmlzaWJsZSBrZXkgdmFsdWVzIGFzIGFuIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSB7XG5cdGNvbnN0IGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAobWFuaWZlc3RBY3Rpb25zKSB7XG5cdFx0T2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5mb3JFYWNoKChhY3Rpb25LZXkpID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblx0XHRcdFx0XHRhVmlzaWJsZVBhdGhFeHByZXNzaW9ucy5wdXNoKHJlc29sdmVCaW5kaW5nU3RyaW5nKGFjdGlvbj8udmlzaWJsZT8udmFsdWVPZigpLCBcImJvb2xlYW5cIikpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zO1xufVxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uIHtcblx0Y29uc3QgaXNEZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRjb25zdCBpc1VwZGF0YWJsZSA9IGlzUGF0aFVwZGF0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNEZWxldGFibGU6ICEoaXNDb25zdGFudChpc0RlbGV0YWJsZSkgJiYgaXNEZWxldGFibGUudmFsdWUgPT09IGZhbHNlKSxcblx0XHRpc1VwZGF0YWJsZTogIShpc0NvbnN0YW50KGlzVXBkYXRhYmxlKSAmJiBpc1VwZGF0YWJsZS52YWx1ZSA9PT0gZmFsc2UpXG5cdH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRpc0VudGl0eVNldDogYm9vbGVhbixcblx0dGFyZ2V0Q2FwYWJpbGl0aWVzOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbixcblx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24/OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKSxcblx0Y3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlVHlwZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy50eXBlO1xuXHRsZXQgc2VsZWN0aW9uTW9kZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy5zZWxlY3Rpb25Nb2RlO1xuXG5cdC8vIFRoZSBjb2xsYXBzZS9FeHBhbmQgYWN0aW9uIG9mIGEgdHJlZSB0YWJsZSBpcyBhIGJvdW5kIGFjdGlvbiwgYXMgYSByZXN1bHQsIGEgdHJlZSB0YWJsZSBzaG91bGQgYWx3YXlzIGhhdmUgYSBzZWxlY3Rpb24gbW9kZSB0byBcIk11bHRpXCIgd2hlbiBubyBzZWxlY3Rpb25Nb2RlIGhhcyBiZWVuIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJUcmVlVGFibGVcIiAmJiAhc2VsZWN0aW9uTW9kZSkge1xuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9XG5cblx0Ly8gSWYgdGhlIHNlbGVjdGlvbiBtb2RlIGlzIGZvcmNlZCB0byAnTm9uZScgaW4gdGhlIG1hbmlmZXN0L21hY3JvIHRhYmxlIHBhcmFtZXRlcnMsIHdlIGtlZXAgaXQgdW5sZXNzIGhlcmUgaXMgYSBkZWxldGUgYnV0dG9uXG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uIHx8IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuTm9uZSkge1xuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgJiYgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTXVsdGkpLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdH1cblx0aWYgKHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuRm9yY2VNdWx0aSkge1xuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9IGVsc2UgaWYgKHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuRm9yY2VTaW5nbGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5TaW5nbGU7XG5cdH1cblx0bGV0IGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW10sXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRmYWxzZVxuXHQpO1xuXHRsZXQgaXNQYXJlbnREZWxldGFibGUsIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRcdHBhcmVudEVudGl0eVNldERlbGV0YWJsZSA9IGlzUGFyZW50RGVsZXRhYmxlID8gY29tcGlsZUV4cHJlc3Npb24oaXNQYXJlbnREZWxldGFibGUsIHRydWUpIDogaXNQYXJlbnREZWxldGFibGU7XG5cdH1cblx0Y29uc3QgYk1hc3NFZGl0RW5hYmxlZDogYm9vbGVhbiA9ICFpc0NvbnN0YW50KG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pIHx8IG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24udmFsdWUgIT09IGZhbHNlO1xuXHRpZiAoIXNlbGVjdGlvbk1vZGUgfHwgc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5BdXRvKSB7XG5cdFx0c2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblx0aWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBPdmVycmlkZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlIHdoZW4gbWFzcyBlZGl0IGlzIHZpc2libGVcblx0XHRzZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5TaW5nbGUgPyBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA6IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblx0aWYgKFxuXHRcdGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uLCBtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpXG5cdCkge1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHR9XG5cdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKVxuXHQpO1xuXHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyA9IGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucyk7XG5cdC8vIE5vIGFjdGlvbiByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHRpZiAoXG5cdFx0YUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5sZW5ndGggPT09IDAgJiZcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucy5sZW5ndGggPT09IDAgJiZcblx0XHQoY3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgYk1hc3NFZGl0RW5hYmxlZClcblx0KSB7XG5cdFx0aWYgKCFpc0VudGl0eVNldCkge1xuXHRcdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdFx0aWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSB8fCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgIT09IFwiZmFsc2VcIiB8fCBiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0XHRcdC8vIEJ1aWxkaW5nIGV4cHJlc3Npb24gZm9yIGRlbGV0ZSBhbmQgbWFzcyBlZGl0XG5cdFx0XHRcdGNvbnN0IGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gb3IoXG5cdFx0XHRcdFx0Y3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgdHJ1ZSxcblx0XHRcdFx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCB0cnVlLCAvLyBkZWZhdWx0IGRlbGV0ZSB2aXNpYmlsaXR5IGFzIHRydWVcblx0XHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0XHRpZkVsc2UoYW5kKFVJLklzRWRpdGFibGUsIGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdFx0aWZFbHNlKGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLlNpbmdsZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gZXhhbXBsZTogTFIgc2NlbmFyaW9cblx0XHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChzZWxlY3Rpb25Nb2RlKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSkpO1xuXHRcdFx0Ly8gRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGFyZSBhY3Rpb25zIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdH0gZWxzZSBpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gVXNlIHNlbGVjdGlvbk1vZGUgaW4gZWRpdCBtb2RlIGlmIGRlbGV0ZSBpcyBlbmFibGVkIG9yIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0XHRjb25zdCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0XHRiTWFzc0VkaXRFbmFibGVkICYmICF0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUsXG5cdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0XHRcdGNvbnN0YW50KHRydWUpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvL0VudGl0eVNldCBkZWxldGFibGU6XG5cdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBFeGFtcGxlOiBMUiBzY2VuYXJpb1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdC8vRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyksIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHRhYmxlIGFjdGlvbnMgZnJvbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSB0YWJsZSBhbm5vdGF0aW9uIGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiB7IHRhYmxlQWN0aW9uczogQXJyYXk8QW5ub3RhdGlvbkFjdGlvbiB8IEFubm90YXRpb25BY3Rpb25Hcm91cD4gfSB7XG5cdGNvbnN0IHRhYmxlQWN0aW9uczogQXJyYXk8QW5ub3RhdGlvbkFjdGlvbiB8IEFubm90YXRpb25BY3Rpb25Hcm91cD4gPSBbXTtcblx0Y29uc3QgY29weURhdGFGaWVsZCA9IGdldENvcHlBY3Rpb24oXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZpbHRlcigoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkSXNDb3B5QWN0aW9uKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25UeXBlcyk7XG5cdFx0fSkgYXMgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNbXVxuXHQpO1xuXHRpZiAoY29weURhdGFGaWVsZCkge1xuXHRcdHRhYmxlQWN0aW9ucy5wdXNoKHtcblx0XHRcdHR5cGU6IEFjdGlvblR5cGUuQ29weSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoY29weURhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGNvcHlEYXRhRmllbGQpLFxuXHRcdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUV4cHJlc3Npb24oY29weURhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCkpLFxuXHRcdFx0dGV4dDogY29weURhdGFGaWVsZC5MYWJlbD8udG9TdHJpbmcoKSA/PyBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhLmdldFRleHQoXCJDX0NPTU1PTl9DT1BZXCIpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHR9KTtcblx0fVxuXHRsaW5lSXRlbUFubm90YXRpb25cblx0XHQuZmlsdGVyKChkYXRhRmllbGQpID0+IHtcblx0XHRcdHJldHVybiAhZGF0YUZpZWxkSXNDb3B5QWN0aW9uKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb24pO1xuXHRcdH0pXG5cdFx0LmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZCkgJiZcblx0XHRcdFx0ZGF0YUZpZWxkLklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5EZXRlcm1pbmluZz8udmFsdWVPZigpICE9PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBY3Rpb24gPSBnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdGlmICh0YWJsZUFjdGlvbikge1xuXHRcdFx0XHRcdHRhYmxlQWN0aW9ucy5wdXNoKHRhYmxlQWN0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZEZvckFjdGlvbkdyb3VwKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkR3JvdXAgPSBnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkYXRhRmllbGRHcm91cCkge1xuXHRcdFx0XHRcdHRhYmxlQWN0aW9ucy5wdXNoKGRhdGFGaWVsZEdyb3VwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0dGFibGVBY3Rpb25zXG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldERhdGFGaWVsZEFubm90YXRpb25BY3Rpb24oXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBBbm5vdGF0aW9uQWN0aW9uIHwgQW5ub3RhdGlvbkFjdGlvbkdyb3VwIHwgdm9pZCB7XG5cdGxldCB0YWJsZUFjdGlvbjogQW5ub3RhdGlvbkFjdGlvbjtcblx0bGV0IGVudGl0eVR5cGU7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHR0YWJsZUFjdGlvbiA9IHtcblx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbih2aXNpYmxlRXhwcmVzc2lvbihkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGlzQUlPcGVyYXRpb246IGlzQWN0aW9uQUlPcGVyYXRpb24oZGF0YUZpZWxkKSA9PT0gdHJ1ZSB8fCB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0aWYgKF91c2VFbmFibGVkRXhwcmVzc2lvbihkYXRhRmllbGQsIGVudGl0eVR5cGUpKSB7XG5cdFx0XHRcdHRhYmxlQWN0aW9uLmVuYWJsZWQgPSBnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0LCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZUFjdGlvbjtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdH07XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuTWVudSxcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdGlkOiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHRleHQ6IGRhdGFGaWVsZC5MYWJlbD8udG9TdHJpbmcoKSxcblx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSksXG5cdFx0XHRcdGlzQUlPcGVyYXRpb246IGlzTWVudUFJT3BlcmF0aW9uKGRhdGFGaWVsZC5BY3Rpb25zKSA9PT0gdHJ1ZSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdG1lbnU6IGRhdGFGaWVsZC5BY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiBnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uKGFjdGlvbiwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHR9IGFzIEFubm90YXRpb25BY3Rpb25Hcm91cDtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuO1xuXHR9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIGJpbmRpbmdFeHByZXNzaW9uIGZvciB0aGUgaGlnaGxpZ2h0IHJvd1NldHRpbmcgcGFyYW1ldGVyLlxuICogQHBhcmFtIGNyaXRpY2FsaXR5QW5ub3RhdGlvbiBQYXRoIG9yIHZhbHVlIG9mIHRoZSBjcml0aWNhbGl0eVxuICogQHBhcmFtIGlzRHJhZnRSb290T3JOb2RlICBJcyB0aGUgY3VycmVudCBlbnRpdHlTZXQgYW4gRHJhZnQgcm9vdCBvciBhIG5vZGVcbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlUeXBlIFRoZSB0YXJnZXRlZCBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uQmluZGluZ1xuICovXG5mdW5jdGlvbiBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRjcml0aWNhbGl0eUFubm90YXRpb246IENyaXRpY2FsaXR5IHwgdW5kZWZpbmVkLFxuXHRpc0RyYWZ0Um9vdE9yTm9kZTogYm9vbGVhbixcblx0dGFyZ2V0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGlmIChjcml0aWNhbGl0eUFubm90YXRpb24pIHtcblx0XHRpZiAodHlwZW9mIGNyaXRpY2FsaXR5QW5ub3RhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBFbnVtIFZhbHVlIHNvIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgcGFydFxuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoY3JpdGljYWxpdHlBbm5vdGF0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbixcblx0XHRcdHBhdGhJbk1vZGVsKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdGlzRHJhZnRSb290T3JOb2RlICYmIEVudGl0eS5IYXNBY3RpdmUsXG5cdFx0XHRpc0RyYWZ0Um9vdE9yTm9kZSAmJiBFbnRpdHkuSXNBY3RpdmUsXG5cdFx0XHRgJHtpc0RyYWZ0Um9vdE9yTm9kZX1gLFxuXHRcdFx0cGF0aEluTW9kZWwoXCJAJHVpNS5mZS5jb250ZXh0UGF0aFwiKSxcblx0XHRcdFVJLklzSW5hY3RpdmVcblx0XHRdLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5yb3dIaWdobGlnaHRpbmcsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGV4dGVybmFsIGNyZWF0aW9uIGJlaGF2aW9yIGlmIHRoZXJlJ3Mgb25lLlxuICogQHBhcmFtIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMgVGhlIGV4dGVybmFsIGNyZWF0aW9uIGJlaGF2aW9yLCBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBub25lLlxuICovXG5mdW5jdGlvbiBnZXRFeHRlcm5hbENyZWF0aW9uQmVoYXZpb3IoXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCB8IHVuZGVmaW5lZCB7XG5cdC8vIExlZ2FjeSBzZXR0aW5nczogdGhlIG91dGJvdW5kIGlzIHNwZWNpZmllZCBpbiBuYXZpZ2F0aW9uL2NyZWF0ZVxuXHQvLyBOZXcgc2V0dGluZ3M6IHRoZSBvdXRib3VuZCBpcyBzcGVjaWZpZWQgaW4gdGFibGVTZXR0aW5ncy9jcmVhdGlvbk1vZGVcblx0Y29uc3QgY3JlYXRpb25EZXRhaWxzID0gbmF2aWdhdGlvblNldHRpbmdzPy5jcmVhdGU7XG5cdGNvbnN0IG91dGJvdW5kS2V5ID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24ub3V0Ym91bmRDcmVhdGlvbiA/PyBjcmVhdGlvbkRldGFpbHM/Lm91dGJvdW5kO1xuXHRjb25zdCBvdXRib3VuZERldGFpbCA9IG91dGJvdW5kS2V5ID8gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRPdXRib3VuZE5hdmlnYXRpb25FbnRyaWVzKCk/LltvdXRib3VuZEtleV0gOiB1bmRlZmluZWQ7XG5cdGlmIChvdXRib3VuZEtleSAmJiBvdXRib3VuZERldGFpbCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogb3V0Ym91bmRLZXksXG5cdFx0XHRvdXRib3VuZERldGFpbFxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHQvLyBPdXRib3VuZCBjb25maWd1cmF0aW9uIGluY29ycmVjdCAtLT4gZmFsbGJhY2sgdG8gTmV3UGFnZVxuXHRcdFx0TG9nLndhcm5pbmcoYENhbm5vdCBmaW5kIG91dGJvdW5kIHBhcmFtZXRlcnMgZm9yIFwiRXh0ZXJuYWxcIiBjcmVhdGlvbiBtb2RlLiBJbnN0ZWFkLCB0aGUgZGVmYXVsdCBtb2RlIFwiTmV3UGFnZVwiIGlzIHVzZWQuYCk7XG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuTmV3UGFnZTtcblx0XHRcdGRlbGV0ZSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5vdXRib3VuZENyZWF0aW9uO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldENyZWF0aW9uQmVoYXZpb3VyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmdcbik6IENyZWF0ZUJlaGF2aW9yIHwgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCB7XG5cdGNvbnN0IGV4dGVybmFsQmVoYXZpb3IgPSBnZXRFeHRlcm5hbENyZWF0aW9uQmVoYXZpb3IodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGlmIChleHRlcm5hbEJlaGF2aW9yKSB7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsO1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLm91dGJvdW5kQ3JlYXRpb24gPSBleHRlcm5hbEJlaGF2aW9yLm91dGJvdW5kO1xuXHRcdHJldHVybiBleHRlcm5hbEJlaGF2aW9yO1xuXHR9XG5cblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IG9yaWdpbmFsVGFibGVTZXR0aW5ncyA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncyA/PyB7fTtcblx0Y29uc3QgbmF2aWdhdGlvbkRldGFpbHMgPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmRldGFpbDtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0IVtDcmVhdGlvbk1vZGUuTmV3UGFnZSwgQ3JlYXRpb25Nb2RlLkV4dGVybmFsLCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2ddLmluY2x1ZGVzKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSlcblx0KSB7XG5cdFx0Ly8gRmFsbGJhY2sgdG8gXCJOZXdQYWdlXCJcblx0XHRMb2cud2FybmluZyhcblx0XHRcdGBDcmVhdGlvbiBtb2RlICcke3RhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZX0nIGNhbiBub3QgYmUgdXNlZCB3aXRoaW4gdGhlIExpc3QgUmVwb3J0LiBJbnN0ZWFkLCB0aGUgZGVmYXVsdCBtb2RlIFwiTmV3UGFnZVwiIGlzIHVzZWQuYFxuXHRcdCk7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdH0gZWxzZSBpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiICYmXG5cdFx0IVtDcmVhdGlvbk1vZGUuTmV3UGFnZSwgQ3JlYXRpb25Nb2RlLklubGluZSwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUpXG5cdCkge1xuXHRcdC8vIEZhbGxiYWNrIHRvIFwiTmV3UGFnZVwiIGluIGNhc2Ugb2YgYSBub24tc3VwcG9ydGVkIG1vZGUgZm9yIGEgVHJlZVRhYmxlXG5cdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRgQ3JlYXRpb24gbW9kZSAnJHt0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGV9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIFRyZWUgVGFibGUuIEluc3RlYWQsIHRoZSBkZWZhdWx0IG1vZGUgXCJOZXdQYWdlXCIgaXMgdXNlZC5gXG5cdFx0KTtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuTmV3UGFnZTtcblx0fVxuXG5cdGxldCBuZXdBY3Rpb247XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHQvLyBpbi1hcHBcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zQ29tbW9uID0gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbiBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19Db21tb24sXG5cdFx0XHR0YXJnZXRBbm5vdGF0aW9uc1Nlc3Npb24gPSB0YXJnZXRBbm5vdGF0aW9ucz8uU2Vzc2lvbiBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19TZXNzaW9uO1xuXHRcdG5ld0FjdGlvbiA9IHRhcmdldEFubm90YXRpb25zQ29tbW9uPy5EcmFmdFJvb3Q/Lk5ld0FjdGlvbiB8fCB0YXJnZXRBbm5vdGF0aW9uc1Nlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbmV3QWN0aW9uKSB7XG5cdFx0XHQvLyBBIGNvbWJpbmF0aW9uIG9mICdDcmVhdGlvblJvdycgYW5kICdOZXdBY3Rpb24nIGRvZXMgbm90IG1ha2Ugc2Vuc2Vcblx0XHRcdHRocm93IEVycm9yKGBDcmVhdGlvbiBtb2RlICcke0NyZWF0aW9uTW9kZS5DcmVhdGlvblJvd30nIGNhbiBub3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tICduZXcnIGFjdGlvbiAoJHtuZXdBY3Rpb259KWApO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvbkRldGFpbHM/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uRGV0YWlscy5yb3V0ZSA6IHVuZGVmaW5lZCAvLyBuYXZpZ2F0ZSBvbmx5IGluIE5ld1BhZ2UgbW9kZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gbm8gbmF2aWdhdGlvbiBvciBubyByb3V0ZSBzcGVjaWZpZWQgLSBmYWxsYmFjayB0byBpbmxpbmUgY3JlYXRlIGlmIG9yaWdpbmFsIGNyZWF0aW9uIG1vZGUgd2FzICdOZXdQYWdlJ1xuXHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVGhlIGNyZWF0aW9uIG1vZGUgJ05ld1BhZ2UnIGlzIHVzZWQgYnV0IHRoZSBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlIGlzIG1pc3NpbmcuXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSB3YXMgbm8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNyZWF0ZUF0RW5kIHdlIGZvcmNlIGl0IHRvIGZhbHNlXG5cdFx0XHRpZiAob3JpZ2luYWxUYWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmluZm8oXCJUaGUgY3JlYXRpb24gbW9kZSB3YXMgY2hhbmdlZCBmcm9tICdOZXdQYWdlJyB0byAnSW5saW5lJyBkdWUgdG8gbWlzc2luZyBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHN1YiBwYWdlLlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuY29uc3QgX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhcmdldFBhdGg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdGFnZ3JlZ2F0aW9uT25MZWFmTGV2ZWxlbmFibGVkPzogYm9vbGVhblxuKTogUm93Q29uZmlndXJhdGlvbiB7XG5cdGxldCBuYXZpZ2F0aW9uSW5mbzogUm93TmF2aWdhdGlvbkluZm8gfCB1bmRlZmluZWQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+ID0gY29uc3RhbnQoTWVzc2FnZVR5cGUuTm9uZSk7XG5cdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgY3JpdGljYWxpdHlBbm5vdGF0aW9uID0gbGluZUl0ZW1Bbm5vdGF0aW9uPy5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5O1xuXHRsZXQgcm93TmF2aWdhYmxlRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChuYXZpZ2F0aW9uU2V0dGluZ3MgJiYgbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kaXNwbGF5Py50YXJnZXQgfHwgbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ub3V0Ym91bmQ7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0XHRcdGNyaXRpY2FsaXR5QW5ub3RhdGlvbixcblx0XHRcdCEhTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290KHRhcmdldEVudGl0eVNldCkgfHwgISFNb2RlbEhlbHBlci5nZXREcmFmdE5vZGUodGFyZ2V0RW50aXR5U2V0KSxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbyA9IHsgdHlwZTogXCJPdXRib3VuZFwiLCBuYXZpZ2F0aW9uVGFyZ2V0IH07XG5cdFx0fVxuXHRcdGlmICghbmF2aWdhdGlvblRhcmdldCAmJiBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsPy5yb3V0ZSkge1xuXHRcdFx0Y29uc3QgY2hlY2tFZGl0YWJsZSA9XG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdCh0YXJnZXRFbnRpdHlTZXQpICE9PSB1bmRlZmluZWQgfHwgTW9kZWxIZWxwZXIuZ2V0RHJhZnROb2RlKHRhcmdldEVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0XHRcdG5hdmlnYXRpb25JbmZvID0ge1xuXHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25cIixcblx0XHRcdFx0cm91dGVQYXRoOiBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsLnJvdXRlLFxuXHRcdFx0XHR0YXJnZXRQYXRoLFxuXHRcdFx0XHRjaGVja0VkaXRhYmxlLFxuXHRcdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIlxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LmF2YWlsYWJpbGl0eSkge1xuXHRcdFx0cm93TmF2aWdhYmxlRXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKFwiQCR1aTUuZmUudmlydHVhbC5yb3V0ZU5hdmlnYWJsZS1cIiArIG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWwucm91dGUpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGZvcm1hdFJlc3VsdChcblx0XHRbcGF0aEluTW9kZWwoXCIvZGVlcGVzdFBhdGhcIiwgXCJpbnRlcm5hbFwiKV0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLm5hdmlnYXRlZFJvdyxcblx0XHR0YXJnZXRFbnRpdHlUeXBlXG5cdCk7XG5cblx0cmV0dXJuIHtcblx0XHRuYXZpZ2F0aW9uSW5mbyxcblx0XHRhY3Rpb25UeXBlOiBuYXZpZ2F0aW9uSW5mbyA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUV4cHJlc3Npb24oY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlRXhwcmVzc2lvbihyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKSxcblx0XHRyb3dDcml0aWNhbGl0eUZvckluc2lnaHRzOiBjcml0aWNhbGl0eUFubm90YXRpb24gPyBjcml0aWNhbGl0eUV4cHJlc3Npb25Gb3JJbnRlZ3JhdGlvbkNhcmRzKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikgOiB1bmRlZmluZWQsXG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRhbmQocm93TmF2aWdhYmxlRXhwcmVzc2lvbiwgbm90KFVJLklzSW5hY3RpdmUpLCBhZ2dyZWdhdGlvbk9uTGVhZkxldmVsZW5hYmxlZCA/IFVJLmlzTm9kZUxldmVsTmF2aWdhYmxlIDogdHJ1ZSlcblx0XHQpXG5cdH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIHRoZSBpZGVudGlmaWVkIGFkZGl0aW9uYWwgcHJvcGVydHkgZm9yIHRoZSBBTFAgdGFibGUgdXNlIGNhc2UuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHRlY2huaWNhbCBwcm9wZXJ0eSBpbiB0aGUgYWRkaXRpb25hbFByb3BlcnRpZXMgb2YgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm8gb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlIGZyb20gdGhlIHRhYmxlIHZpc3VhbGl6YXRpb24uXG4gKiBAcGFyYW0gcmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXBcbiAqL1xuY29uc3QgY3JlYXRlVGVjaG5pY2FsUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdG5hbWU6IHN0cmluZyxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0cmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRjb25zdCBrZXkgPSBgUHJvcGVydHlfVGVjaG5pY2FsOjoke25hbWV9YDtcblx0Ly8gVmFsaWRhdGUgaWYgdGhlIHRlY2huaWNhbCBwcm9wZXJ0eSBoYXNuJ3QgeWV0IGJlZW4gY3JlYXRlZCBvbiBwcmV2aW91cyBpdGVyYXRpb25zLlxuXHRjb25zdCBjb2x1bW5FeGlzdHMgPSBjb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcblx0Ly8gUmV0cmlldmUgdGhlIHNpbXBsZSBwcm9wZXJ0eSB1c2VkIGJ5IHRoZSBoaWRkZW4gYW5ub3RhdGlvbiwgaXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIG9mIG5ld2x5IGNyZWF0ZWQgdGVjaG5pY2FsIHByb3BlcnR5LiBGb3IgZS5nLiByZWxhdGl2ZVBhdGhcblx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5ID1cblx0XHQhY29sdW1uRXhpc3RzICYmIChjb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUgJiYgIWNvbHVtbi5wcm9wZXJ0eUluZm9zKSBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW4pITtcblx0aWYgKGFkZGl0aW9uYWxQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IHRlY2huaWNhbENvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRsYWJlbDogYWRkaXRpb25hbFByb3BlcnR5LmxhYmVsLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGFkZGl0aW9uYWxQcm9wZXJ0eS5hbm5vdGF0aW9uUGF0aCxcblx0XHRcdGRhdGFUeXBlOiBcIkVkbS5TdHJpbmdcIixcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJIaWRkZW5cIixcblx0XHRcdG5hbWU6IGtleSxcblx0XHRcdHJlbGF0aXZlUGF0aDogYWRkaXRpb25hbFByb3BlcnR5LnJlbGF0aXZlUGF0aCxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdGlzR3JvdXBhYmxlOiBmYWxzZSxcblx0XHRcdGlzS2V5OiBmYWxzZSxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBudWxsLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2UsXG5cdFx0XHRhZ2dyZWdhdGFibGU6IGZhbHNlLFxuXHRcdFx0ZmlsdGVyYWJsZTogZmFsc2UsXG5cdFx0XHRleHRlbnNpb246IHtcblx0XHRcdFx0dGVjaG5pY2FsbHlHcm91cGFibGU6IHRydWUsXG5cdFx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiB0cnVlXG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb2x1bW5zLnB1c2godGVjaG5pY2FsQ29sdW1uKTtcblx0XHRyZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IHRlY2huaWNhbENvbHVtbi5uYW1lO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb25cbik6IFRhYmxlUDEzbk1vZGVbXSB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBtYW5pZmVzdFdyYXBwZXIuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgbW9kZXM6IFRhYmxlUDEzbk1vZGVbXSA9IFtdO1xuXHRjb25zdCBpc0FuYWx5dGljYWxUYWJsZSA9IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cdGNvbnN0IGlzUmVzcG9uc2l2ZVRhYmxlID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIjtcblx0aWYgKHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8ucGVyc29uYWxpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyBQZXJzb25hbGl6YXRpb24gY29uZmlndXJlZCBpbiBtYW5pZmVzdC5cblx0XHRjb25zdCBwZXJzb25hbGl6YXRpb24gPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncy5wZXJzb25hbGl6YXRpb247XG5cdFx0aWYgKHBlcnNvbmFsaXphdGlvbiA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gVGFibGUgcGVyc29uYWxpemF0aW9uIGZ1bGx5IGVuYWJsZWQuXG5cdFx0XHRzd2l0Y2ggKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIkFuYWx5dGljYWxUYWJsZVwiOlxuXHRcdFx0XHRcdHJldHVybiBbXCJTb3J0XCIsIFwiQ29sdW1uXCIsIFwiRmlsdGVyXCIsIFwiR3JvdXBcIiwgXCJBZ2dyZWdhdGVcIl07XG5cdFx0XHRcdGNhc2UgXCJSZXNwb25zaXZlVGFibGVcIjpcblx0XHRcdFx0XHRyZXR1cm4gW1wiU29ydFwiLCBcIkNvbHVtblwiLCBcIkZpbHRlclwiLCBcIkdyb3VwXCJdO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJldHVybiBbXCJTb3J0XCIsIFwiQ29sdW1uXCIsIFwiRmlsdGVyXCJdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHBlcnNvbmFsaXphdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Ly8gU3BlY2lmaWMgcGVyc29uYWxpemF0aW9uIG9wdGlvbnMgZW5hYmxlZCBpbiBtYW5pZmVzdC4gVXNlIHRoZW0gYXMgaXMuXG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLnNvcnQpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIlNvcnRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmNvbHVtbikge1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5maWx0ZXIpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZ3JvdXAgJiYgKGlzQW5hbHl0aWNhbFRhYmxlIHx8IGlzUmVzcG9uc2l2ZVRhYmxlKSkge1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmFnZ3JlZ2F0ZSAmJiBpc0FuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRtb2Rlcy5wdXNoKFwiQWdncmVnYXRlXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1vZGVzLmxlbmd0aCA+IDAgPyBtb2RlcyA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0bW9kZXMucHVzaChcIlNvcnRcIik7XG5cdFx0bW9kZXMucHVzaChcIkNvbHVtblwiKTtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCA9PT0gVmFyaWFudE1hbmFnZW1lbnRUeXBlLkNvbnRyb2wgfHwgX2lzRmlsdGVyQmFySGlkZGVuKG1hbmlmZXN0V3JhcHBlciwgY29udmVydGVyQ29udGV4dCkpIHtcblx0XHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdFx0Ly8gRW5hYmxlIHRhYmxlIGZpbHRlcmluZyBieSBkZWZhdWx0IG9ubHkgaW4gY2FzZSBvZiBDb250cm9sIGxldmVsIHZhcmlhbnQgbWFuYWdlbWVudC5cblx0XHRcdFx0Ly8gT3Igd2hlbiB0aGUgTFIgZmlsdGVyIGJhciBpcyBoaWRkZW4gdmlhIG1hbmlmZXN0IHNldHRpbmdcblx0XHRcdFx0bW9kZXMucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bW9kZXMucHVzaChcIkZpbHRlclwiKTtcblx0XHR9XG5cdFx0aWYgKGlzQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRtb2Rlcy5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHRtb2Rlcy5wdXNoKFwiQWdncmVnYXRlXCIpO1xuXHRcdH1cblx0XHRpZiAoaXNSZXNwb25zaXZlVGFibGUpIHtcblx0XHRcdG1vZGVzLnB1c2goXCJHcm91cFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1vZGVzO1xuXHR9XG59XG4vKipcbiAqIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIHN1Z2dlc3RpbmcgaWYgYSBmaWx0ZXIgYmFyIGlzIGJlaW5nIHVzZWQgb24gdGhlIHBhZ2UuXG4gKlxuICogQ2hhcnQgaGFzIGEgZGVwZW5kZW5jeSB0byBmaWx0ZXIgYmFyIChpc3N1ZSB3aXRoIGxvYWRpbmcgZGF0YSkuIE9uY2UgcmVzb2x2ZWQsIHRoZSBjaGVjayBmb3IgY2hhcnQgc2hvdWxkIGJlIHJlbW92ZWQgaGVyZS5cbiAqIFVudGlsIHRoZW4sIGhpZGluZyBmaWx0ZXIgYmFyIGlzIG5vdyBhbGxvd2VkIGlmIGEgY2hhcnQgaXMgYmVpbmcgdXNlZCBvbiBMUi5cbiAqIEBwYXJhbSBtYW5pZmVzdFdyYXBwZXIgTWFuaWZlc3Qgc2V0dGluZ3MgZ2V0dGVyIGZvciB0aGUgcGFnZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgQm9vbGVhbiBzdWdnZXN0aW5nIGlmIGEgZmlsdGVyIGJhciBpcyBiZWluZyB1c2VkIG9uIHRoZSBwYWdlLlxuICovXG5mdW5jdGlvbiBfaXNGaWx0ZXJCYXJIaWRkZW4obWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXIsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdG1hbmlmZXN0V3JhcHBlci5pc0ZpbHRlckJhckhpZGRlbigpICYmXG5cdFx0IWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucygpICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc29ydCBjb25kaXRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgVGFibGUgY29sdW1ucyBwcm9jZXNzZWQgYnkgdGhlIGNvbnZlcnRlclxuICogQHJldHVybnMgU29ydCBjb25kaXRpb25zIGZvciBhIHByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRTb3J0Q29uZGl0aW9ucyhcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IFRhYmxlU29ydENvbmRpdGlvbnMgfCB1bmRlZmluZWQge1xuXHQvLyBDdXJyZW50bHkgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGFzIHNvcnRlclxuXHRjb25zdCBub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCkubm9uU29ydGFibGVQcm9wZXJ0aWVzO1xuXHRjb25zdCBzb3J0Q29uZGl0aW9uczogVGFibGVTb3J0Q29uZGl0aW9ucyA9IHtcblx0XHRzb3J0ZXJzOiBbXVxuXHR9O1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlNvcnRPcmRlcikge1xuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlNvcnRPcmRlci5mb3JFYWNoKChjb25kaXRpb24pID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblByb3BlcnR5ID0gY29uZGl0aW9uLlByb3BlcnR5O1xuXHRcdFx0aWYgKGNvbmRpdGlvblByb3BlcnR5Py4kdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgIW5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhjb25kaXRpb25Qcm9wZXJ0eS4kdGFyZ2V0Lm5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IGluZm9OYW1lID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhbY29uZGl0aW9uUHJvcGVydHldLCBjb2x1bW5zKVswXTtcblx0XHRcdFx0aWYgKGluZm9OYW1lKSB7XG5cdFx0XHRcdFx0c29ydENvbmRpdGlvbnMuc29ydGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IGluZm9OYW1lLFxuXHRcdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNvcnRDb25kaXRpb25zLnNvcnRlcnMubGVuZ3RoID8gc29ydENvbmRpdGlvbnMgOiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRJbml0aWFsRXhwYW5zaW9uTGV2ZWwocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Y29uc3QgbGV2ZWwgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Jbml0aWFsRXhwYW5zaW9uTGV2ZWw/LnZhbHVlT2YoKTtcblx0cmV0dXJuIHR5cGVvZiBsZXZlbCA9PT0gXCJudW1iZXJcIiA/IGxldmVsICsgMSA6IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgcHJvcGVydHlQYXRoIHRvIGFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lcy5cbiAqIEBwYXJhbSBwYXRocyBUaGUgYXJyYXkgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0gY29sdW1ucyBUaGUgYXJyYXkgb2YgcHJvcGVydHlJbmZvc1xuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcHJvcGVydHlJbmZvIG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMocGF0aHM6IFByb3BlcnR5UGF0aFtdLCBjb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogc3RyaW5nW10ge1xuXHRjb25zdCBpbmZvTmFtZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBwcm9wZXJ0eUluZm86IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkLCBhbm5vdGF0aW9uQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdHBhdGhzLmZvckVhY2goKGN1cnJlbnRQYXRoKSA9PiB7XG5cdFx0aWYgKGN1cnJlbnRQYXRoPy52YWx1ZSkge1xuXHRcdFx0cHJvcGVydHlJbmZvID0gY29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRcdHJldHVybiAhYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBjdXJyZW50UGF0aD8udmFsdWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0aW5mb05hbWVzLnB1c2gocHJvcGVydHlJbmZvLm5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBpbmZvTmFtZXM7XG59XG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIFByZXNlbnRhdGlvbiBWYXJpYW50IGdyb3VwIGNvbmRpdGlvbnMuXG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHJldHVybnMgR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogc3RyaW5nXG4pOiBUYWJsZUdyb3VwQ29uZGl0aW9ucyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGdyb3VwQ29uZGl0aW9uczogVGFibGVHcm91cENvbmRpdGlvbnMgPSB7XG5cdFx0Z3JvdXBMZXZlbHM6IFtdXG5cdH07XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uR3JvdXBCeSkge1xuXHRcdGxldCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnk7XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0YUdyb3VwQnkgPSBhR3JvdXBCeS5zbGljZSgwLCAxKTtcblx0XHR9XG5cdFx0Z3JvdXBDb25kaXRpb25zLmdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogaW5mb05hbWUgfTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZ3JvdXBDb25kaXRpb25zLmdyb3VwTGV2ZWxzLmxlbmd0aCA/IGdyb3VwQ29uZGl0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgY29sdW1uJ3MgcHJvcGVydHlJbmZvcyBvZiBhbiBhbmFseXRpY2FsIHRhYmxlIGludGVncmF0aW5nIGFsbCBleHRlbnNpb25zIGFuZCBiaW5kaW5nLXJlbGV2YW50IHByb3BlcnR5IGluZm8gcGFydC5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICovXG5mdW5jdGlvbiBfdXBkYXRlUHJvcGVydHlJbmZvc1dpdGhBZ2dyZWdhdGVzRGVmaW5pdGlvbnModGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24pOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVGcm9tQW5hbHl0aWNzSW5mbyA9IF9nZXRQcm9wZXJ0eU5hbWVGcm9tQW5hbHl0aWNzSW5mbyh0YWJsZVZpc3VhbGl6YXRpb24sIGNvbHVtbi5uYW1lKTtcblx0XHRpZiAocHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8pIHtcblx0XHRcdGNvbnN0IGFnZ3JlZ2F0YWJsZVByb3BlcnR5RGVmaW5pdGlvbiA9IHRhYmxlVmlzdWFsaXphdGlvbi5hbmFseXRpY3NFeHRlbnNpb25zIVtwcm9wZXJ0eU5hbWVGcm9tQW5hbHl0aWNzSW5mb107XG5cdFx0XHRjb2x1bW4uYWdncmVnYXRhYmxlID0gIWFnZ3JlZ2F0YWJsZVByb3BlcnR5RGVmaW5pdGlvbi5mcm9tR3JvdXBhYmxlUHJvcGVydHk7XG5cdFx0XHRjb2x1bW4uZXh0ZW5zaW9uID0gYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uID8/IHt9O1xuXHRcdFx0aWYgKCFjb2x1bW4uaXNHcm91cGFibGUgJiYgIWNvbHVtbi5hZ2dyZWdhdGFibGUpIHtcblx0XHRcdFx0Ly8gVGhlIGNvbHVtbiBpcyBuZWl0aGVyIGFnZ3JlZ2F0YWJsZSBub3IgZ3JvdXBhYmxlIC0tPiBpdCdzIGEgaGlkZGVuIGNvbHVtbiB0byBhbGxvdyBmaWx0ZXJpbmcgaW4gUDEzTlxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHJlbW92ZSBhZGRpdGlvbmFsUHJvcGVydGllcywgYXMgaXQncyBub3QgbmVlZGVkIGFuZCBjYXVzZXMgYW4gZXJyb3IgaW4gdGhlIE1EQyB0YWJsZSBjb2RlXG5cdFx0XHRcdGRlbGV0ZSBjb2x1bW4uZXh0ZW5zaW9uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbHVtbi5pc0dyb3VwYWJsZSAmJiBjb2x1bW4uZXh0ZW5zaW9uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmIGNvbHVtbi5leHRlbnNpb24uYWRkaXRpb25hbFByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZywgcHJvcGVydGllcyB3aXRoIGNvbnRleHQtZGVmaW5pbmcgcHJvcGVydGllcyBzaGFsbCBub3QgYmUgYWxsb3dlZCBmb3IgdmlzdWFsIGdyb3VwaW5nXG5cdFx0XHRcdC8vIFdlIG5lZWQgYSBVWCBjb25jZXB0IHRvIHN1cHBvcnQgdGhpcyAoYXMgdGhlIGVuZCB1c2VyIHdvdWxkIG5lZWQgdG8gZ3JvdXAgb24gdGhlIGNvbnRleHQtZGVmaW5pbmcgcHJvcGVydGllcyBiZWZvcmUgZ3JvdXBpbmdcblx0XHRcdFx0Ly8gb24gdGhlIHByb3BlcnR5IGl0c2VsZikuXG5cdFx0XHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRjb2x1bW4uZXh0ZW5zaW9uLnRlY2huaWNhbGx5R3JvdXBhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubGVuZ3RoKSB7XG5cdFx0XHRjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5SW5mbykgPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgcHJvcGVydHlJbmZvIGZvciBlYWNoIGFkZGl0aW9uYWwgcHJvcGVydHkuXG5cdFx0XHRcdC8vIFRoZSBuZXcgcHJvcGVydHkgJ25hbWUnIGhhcyBiZWVuIHByZWZpeGVkIHdpdGggJ1Byb3BlcnR5X1RlY2huaWNhbDo6JyBmb3IgdW5pcXVlbmVzcyBhbmQgaXQgaGFzIGJlZW4gbmFtZWQgdGVjaG5pY2FsIHByb3BlcnR5IGFzIGl0IHJlcXVpcmVzIGRlZGljYXRlZCBNREMgYXR0cmlidXRlcyAodGVjaG5pY2FsbHlHcm91cGFibGUgYW5kIHRlY2huaWNhbGx5QWdncmVnYXRhYmxlKS5cblx0XHRcdFx0Y3JlYXRlVGVjaG5pY2FsUHJvcGVydHkoYWRkaXRpb25hbFByb3BlcnR5SW5mbywgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsIHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRfdXBkYXRlRm9yVGV4dE9ubHlQcm9wZXJ0aWVzV2l0aENEUCh0YWJsZVZpc3VhbGl6YXRpb24sIGNvbHVtbik7XG5cdH0pO1xuXHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MpIHtcblx0XHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0XHQpO1xuXHRcdFx0Ly8gQWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0aGUgY29tcGxleCBwcm9wZXJ0eSB1c2luZyB0aGUgaGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5jb25jYXQoY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgYW5hbHl0aWNzIGRhdGFcbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgYW5hbHl6ZWRcbiAqIEBwYXJhbSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBhbmFseXRpY3MgZGF0YVxuICovXG5cbmZ1bmN0aW9uIF9nZXRQcm9wZXJ0eU5hbWVGcm9tQW5hbHl0aWNzSW5mbyh0YWJsZVZpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKHRhYmxlVmlzdWFsaXphdGlvbi5hbmFseXRpY3NFeHRlbnNpb25zISkuZmluZCgoYWdncmVnYXRlKSA9PiBhZ2dyZWdhdGUgPT09IG5hbWUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNvbHVtbidzIHByb3BlcnR5SW5mb3Mgb2YgYSBjb2x1bW4gYW5ub3RhdGVkIHdpdGggdGV4dCBvbmx5IG9uIGFuIGFuYWx5dGljYWwgdGFibGUuXG4gKiBUaGUgcmVmZXJlbmNlZCB0ZXh0IHByb3BlcnR5IGNvdWxkIGRlZmluZSBjb250ZXh0LWRlZmluaW5nIHByb3BlcnRpZXMgdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgY29sdW1uJ3MgcHJvcGVydHlJbmZvcy5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgYW5hbHl6ZWRcbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBjb250YWluaW5nIHRoZSBcInRleHRBcnJhbmdlbWVudFwiIG9iamVjdCB3aGVuIHByZXNlbnRcbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZUZvclRleHRPbmx5UHJvcGVydGllc1dpdGhDRFAodGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdC8vIEN1cnJlbnRseSBhIGNvbHVtbiByZWZlcmVuY2luZyBhIHRleHQgb25seSBwcm9wZXJ0eSBvbmx5IGNvbnRhaW5zIHRoZSB0ZXh0IHByb3BlcnR5IGludG8gaXRzIHByb3BlcnR5SW5mb3MuXG5cdC8vIFByb3BlcnRpZXMgcmVmZXJlbmNpbmcgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0aWVzIChDRFApIGFyZW4ndCBhbGxvd2VkIGZvciBncm91cGluZy4gVGhpcyBuZWVkIHRvIGNoYW5nZSBmb3IgdGV4dCBvbmx5IGNvbHVtbnMsIGFzIGluIGNvbW1vbiBjYXNlcywgdGV4dCBwcm9wZXJ0aWVzIHJlZmVyZW5jZSB0aGVpciB2YWx1ZSBwcm9wZXJ0aWVzIGludG8gdGhlaXIgQ0RQcy5cblx0Ly8gU28sIHdlIG5vdyBpbmNsdWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpbnRvIHRoZSBwcm9wZXJ0eUluZm9zIG9mIHRoZSBjb2x1bW4gdG8gYWxsb3cgdGhlIGdyb3VwaW5nIG9uIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cblx0aWYgKGNvbHVtbi50ZXh0QXJyYW5nZW1lbnQ/Lm1vZGUgPT09IFwiRGVzY3JpcHRpb25cIiAmJiBjb2x1bW4udGV4dEFycmFuZ2VtZW50LnRleHRQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IGFuYWx5dGljc0luZm9Qcm9wZXJ0eU5hbWVGb3JEZXNjID0gX2dldFByb3BlcnR5TmFtZUZyb21BbmFseXRpY3NJbmZvKHRhYmxlVmlzdWFsaXphdGlvbiwgY29sdW1uLnRleHRBcnJhbmdlbWVudC50ZXh0UHJvcGVydHkpO1xuXHRcdGlmIChhbmFseXRpY3NJbmZvUHJvcGVydHlOYW1lRm9yRGVzYykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uID0gdGFibGVWaXN1YWxpemF0aW9uLmFuYWx5dGljc0V4dGVuc2lvbnMhW2FuYWx5dGljc0luZm9Qcm9wZXJ0eU5hbWVGb3JEZXNjXTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSB0ZXh0IHByb3BlcnR5IGhhcyBDRFAgcHJvcGVydGllcyBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgcHJvcGVydHkgaXMgcGFydCBvZiB0aGVzZSBwcm9wZXJ0aWVzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24uYWRkaXRpb25hbFByb3BlcnRpZXM/Lmxlbmd0aCAmJlxuXHRcdFx0XHRhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24uYWRkaXRpb25hbFByb3BlcnRpZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IHZhbHVlIChzaW5nbGUgcHJvcGVydHkpIGV4aXN0cyBhbHJlYWR5IG9uIHRoZSBsaXN0IG9mIGNvbHVtbnMgZnJvbSB0aGUgdGFibGUgYnV0IGl0IHdhcyBvbmx5IGNyZWF0ZWQgZm9yIGZpbHRlcmluZyBwdXJwb3NlcyBpbiBQMTNuIGFuZCBub3QgbGlua2VkIHRvIHRoZSBjb2x1bW4gd2l0aCB0aGUgdGV4dCBhcnJhbmdlbWVudCAjVGV4dE9ubHksXG5cdFx0XHRcdC8vIHRoZXJlZm9yZSBub3QgcHJvcG9zZWQgYXMgYSBkZWZhdWx0IHZhbHVlIGZvciBncm91cGluZyB0aGUgY29sdW1uIG1lbnUuIE5vdyBpdCdsbCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBwcm9wZXJ0eUluZm9zIG9mIHRoZSBjb2x1bW4gdG8gYWxsb3cgdGhlIGRlZmF1bHQgZ3JvdXBpbmcgb24gdGhpcyB2YWx1ZSBwcm9wZXJ0eS5cblx0XHRcdFx0Y29uc3QgY29sdW1uV2l0aFRleHRPbmx5ID0gKHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdKS5maW5kKFxuXHRcdFx0XHRcdCh0ZXh0T25seUNvbHVtbikgPT4gdGV4dE9ubHlDb2x1bW4ucmVsYXRpdmVQYXRoID09PSBjb2x1bW4ucmVsYXRpdmVQYXRoICYmIHRleHRPbmx5Q29sdW1uLnByb3BlcnR5SW5mb3Ncblx0XHRcdFx0KTtcblx0XHRcdFx0Y29sdW1uV2l0aFRleHRPbmx5Py5wcm9wZXJ0eUluZm9zPy5wdXNoKGNvbHVtbi5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEBwYXJhbSBleHRlbnNpb25JbmZvTWFwXG4gKiBAcmV0dXJucyBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGV4dGVuc2lvbkluZm9NYXA6IFJlY29yZDxzdHJpbmcsIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzPlxuKTogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRlQ29uZGl0aW9uczogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zID0ge307XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWw7XG5cdFx0Y29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhVG90YWxzLCBjb2x1bW5zKS5mb3JFYWNoKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBleHRlbnNpb25JbmZvTWFwKSB7XG5cdFx0XHRpZiAoIWV4dGVuc2lvbkluZm9NYXBba2V5XS5mcm9tR3JvdXBhYmxlUHJvcGVydHkpIHtcblx0XHRcdFx0YWdncmVnYXRlQ29uZGl0aW9uc1trZXldID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyhhZ2dyZWdhdGVDb25kaXRpb25zKS5sZW5ndGggPyBhZ2dyZWdhdGVDb25kaXRpb25zIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IHtcblx0Y3JlYXRpb25CZWhhdmlvdXI6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb25bXCJjcmVhdGVcIl07XG5cdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRjcmVhdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGRlbGV0ZTogU3RhbmRhcmRBY3Rpb247XG5cdFx0cGFzdGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdG1hc3NFZGl0OiBTdGFuZGFyZEFjdGlvbjtcblx0XHRpbnNpZ2h0czogU3RhbmRhcmRBY3Rpb247XG5cdFx0Y3JlYXRpb25Sb3c6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGN1dDogU3RhbmRhcmRBY3Rpb247XG5cdFx0Y29weTogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZVVwPzogU3RhbmRhcmRBY3Rpb247XG5cdFx0bW92ZURvd24/OiBTdGFuZGFyZEFjdGlvbjtcblx0fTtcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHN0YW5kYXJkIGFjdGlvbnMgYW5kIGFkamFjZW50IHByb3BlcnRpZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBmdXJ0aGVyIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gVGhlIHRhYmxlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3MgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFN0YW5kYXJkIGFjdGlvbnMgYW5kIGNvbm5lY3RlZCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ge1xuXHRjb25zdCBjcmVhdGlvbkJlaGF2aW91ciA9IF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dmlzdWFsaXphdGlvblBhdGhcblx0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCA9IGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNyZWF0aW9uQmVoYXZpb3VyLm1vZGUgYXMgQ3JlYXRpb25Nb2RlLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG5cdCk7XG5cdGNvbnN0IGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0Q3V0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KVxuXHQpO1xuXHRjb25zdCBzdGFuZGFyZEFjdGlvbnMgPSB7XG5cdFx0Y3V0OiBnZXRTdGFuZGFyZEFjdGlvbkN1dChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRjb3B5OiBnZXRTdGFuZGFyZEFjdGlvbkNvcHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0Y3JlYXRlOiBnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRkZWxldGU6IGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdHBhc3RlOiBnZXRTdGFuZGFyZEFjdGlvblBhc3RlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCksXG5cdFx0bWFzc0VkaXQ6IGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0aW5zaWdodHM6IGdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdGNyZWF0aW9uUm93OiBnZXRDcmVhdGlvblJvdyhjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KVxuXHR9O1xuXHRjb25zdCBjb25maWd1cmF0aW9uOiBTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uID0ge1xuXHRcdGNyZWF0aW9uQmVoYXZpb3VyLFxuXHRcdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkLFxuXHRcdHN0YW5kYXJkQWN0aW9uc1xuXHR9O1xuXG5cdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRjb25maWd1cmF0aW9uLnN0YW5kYXJkQWN0aW9ucy5tb3ZlVXAgPSBnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24oY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdHJ1ZSk7XG5cdFx0Y29uZmlndXJhdGlvbi5zdGFuZGFyZEFjdGlvbnMubW92ZURvd24gPSBnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24oY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZmFsc2UpO1xuXHR9XG5cblx0cmV0dXJuIGNvbmZpZ3VyYXRpb247XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uOiBTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uIHtcblx0Ly8gTmVlZCB0byBnZXQgdGhlIHRhcmdldFxuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0eXBlTmFtZVBsdXJhbCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZVBsdXJhbDtcblx0Y29uc3QgdGl0bGUgPSB0eXBlTmFtZVBsdXJhbCAmJiBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odHlwZU5hbWVQbHVyYWwpKTtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5U2V0O1xuXHRjb25zdCBwYWdlTWFuaWZlc3RTZXR0aW5nczogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgaGFzQWJzb2x1dGVQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggPT09IDA7XG5cdGNvbnN0IHAxM25Nb2RlID0gZ2V0UDEzbk1vZGUodmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKTtcblx0Y29uc3QgaWQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gZ2V0VGFibGVJRCh2aXN1YWxpemF0aW9uUGF0aCkgOiBnZXRUYWJsZUlEKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSwgXCJMaW5lSXRlbVwiKTtcblx0Y29uc3QgdGFyZ2V0Q2FwYWJpbGl0aWVzID0gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBzZWxlY3Rpb25Nb2RlID0gZ2V0U2VsZWN0aW9uTW9kZShcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRoYXNBYnNvbHV0ZVBhdGgsXG5cdFx0dGFyZ2V0Q2FwYWJpbGl0aWVzLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5tYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uY3V0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb25cblx0KTtcblx0Y29uc3QgdGhyZXNob2xkID0gZ2V0VGhyZXNob2xkKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbik7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0cmV0dXJuIHtcblx0XHRpZDogaWQsXG5cdFx0YXBpSWQ6IGdlbmVyYXRlKFtpZCwgXCJUYWJsZVwiXSksXG5cdFx0ZW50aXR5TmFtZTogZW50aXR5U2V0ID8gZW50aXR5U2V0Lm5hbWUgOiBcIlwiLFxuXHRcdGVudGl0eVR5cGVOYW1lOiBlbnRpdHlTZXQgJiYgZW50aXR5U2V0LmVudGl0eVR5cGUgPyBlbnRpdHlTZXQuZW50aXR5VHlwZS5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0bmF2aWdhdGlvblRhcmdldFBhdGgsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlLFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uYW5hbHl0aWNhbENvbmZpZ3VyYXRpb24/LmFnZ3JlZ2F0aW9uT25MZWFmTGV2ZWxcblx0XHQpLFxuXHRcdHAxM25Nb2RlLFxuXHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5pc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQsXG5cdFx0dXBkYXRhYmxlUHJvcGVydHlQYXRoOiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRkaXNwbGF5TW9kZTogaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQsIHRydWUpLFxuXHRcdGNyZWF0ZTogc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5jcmVhdGlvbkJlaGF2aW91cixcblx0XHRzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlLFxuXHRcdHZhcmlhbnRNYW5hZ2VtZW50OiB2YXJpYW50TWFuYWdlbWVudCA9PT0gXCJDb250cm9sXCIgJiYgIXAxM25Nb2RlID8gVmFyaWFudE1hbmFnZW1lbnRUeXBlLk5vbmUgOiB2YXJpYW50TWFuYWdlbWVudCxcblx0XHR0aHJlc2hvbGQ6IHRocmVzaG9sZCxcblx0XHRzb3J0Q29uZGl0aW9uczogZ2V0U29ydENvbmRpdGlvbnMoY29udmVydGVyQ29udGV4dCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGNvbHVtbnMpLFxuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRzZWFyY2hhYmxlOlxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3M/LmlzU2VhcmNoYWJsZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgIT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIShpc0NvbnN0YW50KGlzU2VhcmNoYWJsZSkgJiYgaXNTZWFyY2hhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aW5pdGlhbEV4cGFuc2lvbkxldmVsOiBnZXRJbml0aWFsRXhwYW5zaW9uTGV2ZWwocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pLFxuXHRcdHJlcXVpcmVkUHJvcGVydGllczogZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHQuZmlsdGVyKChwcm9wZXJ0eSkgPT4gcHJvcGVydHk/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIilcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSlcblx0fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiBUaGUgdGFibGUgbWFuaWZlc3QgY29uZmlndXJhdGlvblxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyBUaGUgdGhyZXNob2xkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGdldFRocmVzaG9sZChcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKTogbnVtYmVyIHtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpO1xuXHR9IGVsc2UgaWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHQvLyBUbyBtYWtlIHNjcm9sbGluZyBzbW9vdGgsIHdlIHNldCB0aGUgdGhyZXNob2xkIHZhbHVlIGhpZ2hlciBmb3IgdHJlZSB0YWJsZXNcblx0XHR0aHJlc2hvbGQgPSAyMDA7XG5cdH0gZWxzZSBpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJHcmlkVGFibGVcIiB8fCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0dGhyZXNob2xkID0gMTAwO1xuXHR9XG5cdHJldHVybiB0aHJlc2hvbGQ7XG59XG4vKipcbiAqIFNwbGl0cyB0aGUgdmlzdWFsaXphdGlvbiBwYXRoIGludG8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBwYXRoIGFuZCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyBUaGUgc3BsaXQgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpOiB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZzsgYW5ub3RhdGlvblBhdGg6IHN0cmluZyB9IHtcblx0Y29uc3QgW3RhcmdldE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGFubm90YXRpb25QYXRoXSA9IHZpc3VhbGl6YXRpb25QYXRoLnNwbGl0KFwiQFwiKTtcblx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSB0YXJnZXROYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdC8vIERyb3AgdHJhaWxpbmcgc2xhc2hcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggLSAxKTtcblx0fVxuXHRyZXR1cm4geyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKHNlbGVjdGlvblZhcmlhbnRQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb25WYXJpYW50ID0gcmVzb2x2ZWRUYXJnZXQuYW5ub3RhdGlvbiBhcyBTZWxlY3Rpb25WYXJpYW50O1xuXHRpZiAoc2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBbXTtcblx0XHRzZWxlY3Rpb24uU2VsZWN0T3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25UeXBlKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWU/LnZhbHVlID8/IFwiXCI7XG5cdFx0XHRpZiAoIXByb3BlcnR5TmFtZXMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2gocHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIF9nZXRGdWxsU2NyZWVuQmFzZWRPbkRldmljZShcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRpc0lwaG9uZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdC8vIElmIGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCwgdXNlIGFzIGRlZmF1bHQgdHJ1ZSBvbiBwaG9uZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGlzSXBob25lO1xuXHQvLyBNYWtlIHN1cmUgdGhhdCBlbmFibGVGdWxsU2NyZWVuIGlzIG5vdCBzZXQgb24gTGlzdFJlcG9ydCBmb3IgZGVza3RvcCBvciB0YWJsZXRcblx0aWYgKCFpc0lwaG9uZSAmJiBlbmFibGVGdWxsU2NyZWVuICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0ZW5hYmxlRnVsbFNjcmVlbiA9IGZhbHNlO1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKS5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkxvdywgSXNzdWVUeXBlLkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUKTtcblx0fVxuXHRyZXR1cm4gZW5hYmxlRnVsbFNjcmVlbjtcbn1cbmZ1bmN0aW9uIF9nZXRNdWx0aVNlbGVjdE1vZGUoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0c3dpdGNoIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSB7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydDpcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlOlxuXHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IGZhbHNlID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS51c2VJY29uVGFiQmFyKCkpIHtcblx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gIXRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblx0cmV0dXJuIG11bHRpU2VsZWN0TW9kZTtcbn1cbmZ1bmN0aW9uIF9nZXRUYWJsZU1vZGUoXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRpc1RlbXBsYXRlTGlzdFJlcG9ydDogYm9vbGVhblxuKTogeyByb3dDb3VudE1vZGU/OiBUYWJsZVJvd0NvdW50TW9kZTsgcm93Q291bnQ/OiBudW1iZXIgfSB7XG5cdGlmICh0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRpZiAoaXNUZW1wbGF0ZUxpc3RSZXBvcnQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJvd0NvdW50TW9kZTogXCJBdXRvXCIsXG5cdFx0XHRcdHJvd0NvdW50OiAzXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgaW5pdGlhbFJvd0NvdW50OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKHRhYmxlVHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiR3JpZFRhYmxlXCI6XG5cdFx0XHRcdFx0aW5pdGlhbFJvd0NvdW50ID0gdGFibGVTZXR0aW5ncy5yb3dDb3VudE1vZGUgPT09IFwiQXV0b1wiID8gMyA6IDU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJUcmVlVGFibGVcIjpcblx0XHRcdFx0Y2FzZSBcIkFuYWx5dGljYWxUYWJsZVwiOlxuXHRcdFx0XHRcdGluaXRpYWxSb3dDb3VudCA9IHRhYmxlU2V0dGluZ3Mucm93Q291bnRNb2RlID09PSBcIkF1dG9cIiA/IDMgOiAxMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpbml0aWFsUm93Q291bnQgPSA1O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cm93Q291bnRNb2RlOiB0YWJsZVNldHRpbmdzLnJvd0NvdW50TW9kZSA/PyBcIkZpeGVkXCIsXG5cdFx0XHRcdHJvd0NvdW50OiB0YWJsZVNldHRpbmdzLnJvd0NvdW50ID8/IGluaXRpYWxSb3dDb3VudFxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG59XG5mdW5jdGlvbiBfZ2V0Q29uZGVuc2VkVGFibGVMYXlvdXQoX3RhYmxlVHlwZTogVGFibGVUeXBlLCBfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gX3RhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgIT09IHVuZGVmaW5lZCAmJiBfdGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiXG5cdFx0PyBfdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dFxuXHRcdDogZmFsc2U7XG59XG5mdW5jdGlvbiBfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdChfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IG51bWJlciB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IHRydWUgfHwgX3RhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogX3RhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgfHwgMjAwO1xufVxuZnVuY3Rpb24gX2dldFRhYmxlSW5saW5lQ3JlYXRpb25Sb3dDb3VudChfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IG51bWJlciB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgPyBfdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgOiAxO1xufVxuXG5mdW5jdGlvbiBfZ2V0RW5hYmxlRXhwb3J0KFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVuYWJsZVBhc3RlOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0ICE9PSB1bmRlZmluZWRcblx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0OiBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBcIk9iamVjdFBhZ2VcIiB8fCBlbmFibGVQYXN0ZTtcbn1cbmZ1bmN0aW9uIF9nZXRGcm96ZW5Db2x1bW5Db3VudCh0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZnJvemVuQ29sdW1uQ291bnQ7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgY29sdW1uIGZyZWV6ZSBpcyBlbmFibGVkIG9yIG5vdC5cbiAqIEBwYXJhbSB0YWJsZVNldHRpbmdzIFRhYmxlU2V0dGluZ3NcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBjb2x1bW4gZnJlZXplIHNob3VsZCBiZSBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gZ2V0RW5hYmxlQ29sdW1uRnJlZXplKHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZGlzYWJsZUNvbHVtbkZyZWV6ZSAhPT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlU2V0dGluZ3MgaWYgaXQgZXhpc3RzLlxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgVGFibGVTZXR0aW5ncyBPYmplY3RcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIG9mIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIG9yIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIF9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcih0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiB0YWJsZVNldHRpbmdzLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJDb25maWd1cmF0aW9uKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZFxuKToge1xuXHRmaWx0ZXJzOiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0aGVhZGVyVmlzaWJsZTogYm9vbGVhbjtcbn0ge1xuXHRsZXQgaGlkZVRhYmxlVGl0bGUgPSBmYWxzZTtcblx0Y29uc3QgZmlsdGVyczogUGFydGlhbDxSZWNvcmQ8XCJxdWlja0ZpbHRlcnNcIiB8IFwiaGlkZGVuRmlsdGVyc1wiLCBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uPj4gPSB7fTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0aWYgKHRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRocyA9ICh0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbi5wYXRocyA/PyBbXSkucmVkdWNlKFxuXHRcdFx0KGZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLCBwYXRoKSA9PiB7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhdGguYW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUGF0aHMucHVzaCh7IGFubm90YXRpb25QYXRoOiBwYXRoLmFubm90YXRpb25QYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJQYXRocztcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdFx0aWYgKHF1aWNrRmlsdGVyUGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJzLnF1aWNrRmlsdGVycyA9IHtcblx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24uc2hvd0NvdW50cyxcblx0XHRcdFx0cGF0aHM6IHF1aWNrRmlsdGVyUGF0aHNcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGUgU2VsZWN0aW9uIFZhcmlhbnQgdG8gaGlkZGVuRmlsdGVycyBpbiBvcmRlciB0byBzZXQgdGhlIFNWIGZpbHRlcnMgdG8gdGhlIHRhYmxlLlxuXHRcdCAqIE1EQyBUYWJsZSBvdmVycmlkZXMgYmluZGluZyBGaWx0ZXIgYW5kIGZyb20gU0FQIEZFIHRoZSBvbmx5IG1ldGhvZCB3aGVyZSB3ZSBhcmUgYWJsZSB0byBhZGRcblx0XHQgKiBhZGRpdGlvbmFsIGZpbHRlciBpcyAncmViaW5kVGFibGUnIGludG8gVGFibGUgZGVsZWdhdGUuXG5cdFx0ICogVG8gYXZvaWQgaW1wbGVtZW50aW5nIHNwZWNpZmljIExSIGZlYXR1cmUgdG8gU0FQIEZFIE1hY3JvIFRhYmxlLCB0aGUgZmlsdGVyKHMpICBub3QgbWFuYWdlZCBieSB0aGUgRmlsdGVyQmFyXG5cdFx0ICogY2FuIGJlIHBhc3NlZCB0byBtYWNybyB0YWJsZSB2aWEgcGFyYW1ldGVyL2NvbnRleHQgbmFtZWQgZmlsdGVycyBhbmQga2V5IGhpZGRlbkZpbHRlcnMuXG5cdFx0ICovXG5cdFx0ZmlsdGVycy5oaWRkZW5GaWx0ZXJzID0geyBwYXRoczogW3sgYW5ub3RhdGlvblBhdGg6IGBAJHtzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCJAXCIpWzFdfWAgfV0gfTtcblx0fVxuXG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKGZpbHRlcnM/LnF1aWNrRmlsdGVycyAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhY3Rpb24gd2lsbCBoYXZlIGFuIGV4cHJlc3Npb24gZm9yIGVuYWJsZW1lbnQgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YUZpZWxkIGNvbnRhaW5pbmcgYW4gYWN0aW9uXG4gKiBAcGFyYW0gc0VudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5IGZvciB0ZW1wbGF0aW5nXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFuIGV4cHJlc3Npb24gZm9yIGVuYWJsZW1lbnQgaXMgdG8gYmUgZ2VuZXJhdGVkXG4gKi9cbmZ1bmN0aW9uIF91c2VFbmFibGVkRXhwcmVzc2lvbihkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzLCBzRW50aXR5VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdC8vIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB3aGVuIGEgdGFibGUgYWN0aW9uIGhhcyBhbiBPcGVyYXRpb25BdmFpbGFibGUgdGhhdCBsZWFkcyB0byBhbiBlbmFibGVtZW50IGV4cHJlc3Npb25cblx0Ly8gYW5kIGlzIG5vdCBkZXBlbmRlbnQgdXBvbiB0aGUgdGFibGUgZW50cmllcy5cblx0Ly8gMS4gQW4gYWN0aW9uIHdpdGggYW4gb3ZlcmxvYWQsIHRoYXQgaXMgZXhlY3V0ZWQgYWdhaW5zdCBhIHBhcmVudCBlbnRpdHkuXG5cdC8vIDIuIEFuIHVuYm91bmQgYWN0aW9uXG5cdC8vIDMuIEEgc3RhdGljIGFjdGlvbiAodGhhdCBpcywgYm91bmQgdG8gYSBjb2xsZWN0aW9uKVxuXHRsZXQgdXNlRW5hYmxlZEV4cHJlc3Npb24gPSBmYWxzZTtcblx0aWYgKGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFVuYm91bmQgYWN0aW9uLiBJcyByZWNvZ25pc2VkLCBidXQgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIGNoZWNrcyBmb3IgaXNCb3VuZCA9IHRydWUsIHNvIG5vdCBnZW5lcmF0ZWQuXG5cdFx0Y29uc3QgaXNCb3VuZCA9IGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ/LmlzQm91bmQ7XG5cdFx0Ly9vdmVybG9hZCBhY3Rpb25cblx0XHRjb25zdCBvdmVybG9hZEFjdGlvbiA9IGlzQm91bmQgJiYgZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uc291cmNlVHlwZSAhPT0gc0VudGl0eVR5cGU7XG5cdFx0Ly9zdGF0aWMgYWN0aW9uXG5cdFx0Y29uc3Qgc3RhdGljQWN0aW9uID0gZGF0YUZpZWxkLkFjdGlvblRhcmdldD8ucGFyYW1ldGVyc1swXT8uaXNDb2xsZWN0aW9uO1xuXHRcdC8vY29weSBhY3Rpb25cblx0XHRpZiAoIWlzQm91bmQgfHwgb3ZlcmxvYWRBY3Rpb24gfHwgc3RhdGljQWN0aW9uKSB7XG5cdFx0XHR1c2VFbmFibGVkRXhwcmVzc2lvbiA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1c2VFbmFibGVkRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0YWJsZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gd2l0aCBUcmVlLVRhYmxlIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ29uZmlndXJhdGlvbiBUaGUgdGFibGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgU2V0dGluZ3MgZnJvbSB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJlZVRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHR0YWJsZUNvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5oaWVyYXJjaHlRdWFsaWZpZXIgPSB0YWJsZVNldHRpbmdzLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0Y29uc3QgaGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IGdldEhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uaGllcmFyY2h5UXVhbGlmaWVyIVxuXHQpO1xuXHRjb25zdCBub25VcGRhdGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IGdldE5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNIaWVyYXJjaHlQYXJlbnROb2RlVXBkYXRhYmxlID0gIW5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5pbmNsdWRlcyhoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmlzTm9kZU1vdmFibGUgPSBnZXRDdXN0b21GdW5jdGlvbkluZm8odGFibGVTZXR0aW5ncy5pc05vZGVNb3ZhYmxlLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNOb2RlQ29weWFibGUgPSBnZXRDdXN0b21GdW5jdGlvbkluZm8odGFibGVTZXR0aW5ncy5pc05vZGVDb3B5YWJsZSwgdGFibGVDb25maWd1cmF0aW9uKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmlzTW92ZVRvUG9zaXRpb25BbGxvd2VkID0gZ2V0Q3VzdG9tRnVuY3Rpb25JbmZvKHRhYmxlU2V0dGluZ3MuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQsIHRhYmxlQ29uZmlndXJhdGlvbik7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc0NvcHlUb1Bvc2l0aW9uQWxsb3dlZCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRlRW5hYmxlbWVudCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaXNDcmVhdGVFbmFibGVkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnByb3BlcnR5TmFtZSAmJiB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnZhbHVlcykge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnZhbHVlcztcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24ubm9kZVR5cGUgPSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWU6IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnByb3BlcnR5TmFtZSxcblx0XHRcdHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5vZGVUeXBlSW5mbyA9IHZhbHVlc1t2YWx1ZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBub2RlVHlwZUluZm8gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0XHR0ZXh0OiBub2RlVHlwZUluZm9cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRcdHRleHQ6IG5vZGVUeXBlSW5mby5sYWJlbCxcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0XHRcdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHQ/IGdldEZpZWxkTGlzdChub2RlVHlwZUluZm8uY3JlYXRpb25GaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH07XG5cdH1cblxuXHQvLyBDcmVhdGUgaW4gcGxhY2Vcblx0aWYgKHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVJblBsYWNlKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmNyZWF0ZUluUGxhY2UgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21GdW5jdGlvbkluZm8oXG5cdHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogRXh0ZXJuYWxNZXRob2RDb25maWcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXZhbHVlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBsYXN0RG90SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdGNvbnN0IG1vZHVsZU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKTtcblx0Y29uc3QgbWV0aG9kTmFtZSA9IHZhbHVlLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKTtcblxuXHQvLyBBZGQgdGhlIGN1c3RvbSBtb2R1bGUgaW4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbW9kdWxlcyBpZiBuZWNlc3Nhcnlcblx0aWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCIvZXh0ZW5zaW9uL1wiKSkge1xuXHRcdGlmICghdGFibGVDb25maWd1cmF0aW9uLmFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMpIHtcblx0XHRcdHRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzID0gW21vZHVsZU5hbWVdO1xuXHRcdH0gZWxzZSBpZiAoIXRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XG5cdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uYWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcy5wdXNoKG1vZHVsZU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUgfTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGFibGUgY29udHJvbCBjb25maWd1cmF0aW9uIG9wdGltaXN0aWMgYmF0Y2ggaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdFNldHRpbmdzIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gQHJldHVybnMgVHJ1ZSBpZiBPcHRpbWlzdGljIGJhdGNoIG1vZGUgaXMgZGlzYWJsZWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QodGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHQvLyBPcHRpbWlzdGljIGJhdGNoIGlzIHNldCBieSBkZWZhdWx0XG5cdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LmRpc2FibGVSZXF1ZXN0Q2FjaGU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2V0dGluZ3MgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0IHJlbGF0ZWQgdG8gdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG4gKiBAcGFyYW0gdGFibGVTZXR0aW5ncyBUaGUgdGFibGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIG1hc3MgZWRpdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRTZXR0aW5ncyhcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBNYXNzRWRpdFRhYmxlQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IGRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24gPSB7XG5cdFx0dmlzaWJsZUZpZWxkczogW10sXG5cdFx0aWdub3JlZEZpZWxkczogW10sXG5cdFx0b3BlcmF0aW9uR3JvdXBpbmdNb2RlOlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0PyBPcGVyYXRpb25Hcm91cGluZ01vZGUuSXNvbGF0ZWRcblx0XHRcdFx0OiBPcGVyYXRpb25Hcm91cGluZ01vZGUuQ2hhbmdlU2V0XG5cdH07XG5cdGlmICghdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdCkge1xuXHRcdHJldHVybiB7IGVuYWJsZWQ6IGZhbHNlLCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH1cblx0aWYgKHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IHRydWUpIHtcblx0XHRyZXR1cm4geyBlbmFibGVkOiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdHZpc2libGVGaWVsZHM6IGdldEZpZWxkTGlzdCh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LnZpc2libGVGaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0aWdub3JlZEZpZWxkczogZ2V0RmllbGRMaXN0KHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQuaWdub3JlZEZpZWxkcywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRvcGVyYXRpb25Hcm91cGluZ01vZGU6XG5cdFx0XHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlICYmXG5cdFx0XHRcdE9iamVjdC52YWx1ZXMoT3BlcmF0aW9uR3JvdXBpbmdNb2RlKS5pbmNsdWRlcyh0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0Lm9wZXJhdGlvbkdyb3VwaW5nTW9kZSlcblx0XHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlXG5cdFx0XHRcdFx0OiBkZWZhdWx0RmllbGRDb25maWd1cmF0aW9uLm9wZXJhdGlvbkdyb3VwaW5nTW9kZSxcblx0XHRcdGN1c3RvbUZyYWdtZW50OiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LmN1c3RvbUZyYWdtZW50LFxuXHRcdFx0ZnJvbUlubGluZTogdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdC5mcm9tSW5saW5lXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4geyBlbmFibGVkOiBmYWxzZSwgLi4uZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaXN0IG9mIHRoZSBmaWVsZHMgY29taW5nIGZyb20gdGhlIG1hbmlmZXN0LlxuICogQHBhcmFtIGZpZWxkcyBUaGUgZmllbGRzLCBjb3VsZCBiZSBhIEZpZWxkR3JvdXAgb3IgZmllbGRzIHNlcGFyYXRlZCBieSBhIGNvbW1hXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkTGlzdChmaWVsZHM6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogc3RyaW5nW10ge1xuXHRpZiAoIWZpZWxkcykge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoZmllbGRzLmluY2x1ZGVzKFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApKSB7XG5cdFx0ZmllbGRzID0gZmllbGRzLnN0YXJ0c1dpdGgoXCJAXCIpID8gZmllbGRzIDogYEAke2ZpZWxkc31gO1xuXHRcdGNvbnN0IGZpZWxkR3JvdXAgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uPEZpZWxkR3JvdXA+KGZpZWxkcyk7XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihmaWVsZEdyb3VwLmFubm90YXRpb24sIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKSkge1xuXHRcdFx0cmV0dXJuIGZpZWxkR3JvdXAuYW5ub3RhdGlvbi5EYXRhLnJlZHVjZSgocHJvcGVydGllczogc3RyaW5nW10sIGZpZWxkKSA9PiB7XG5cdFx0XHRcdGlmIChpc0RhdGFGaWVsZChmaWVsZCkgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGQuVmFsdWUpKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllcy5wdXNoKGZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblx0cmV0dXJuIGZpZWxkc1xuXHRcdC5yZXBsYWNlKC9cXHMvZywgXCJcIilcblx0XHQuc3BsaXQoXCIsXCIpXG5cdFx0Lm1hcCgobmFtZSkgPT4gbmFtZS50cmltKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0Y2hlY2tDb25kZW5zZWRMYXlvdXQgPSB0cnVlLFxuXHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbj86IFNlbGVjdGlvblZhcmlhbnRUeXBlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgX21hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0YWJsZVNldHRpbmdzID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzID8/IHt9O1xuXHRjb25zdCBnbG9iYWxGRU1hbmlmZXN0U2V0dGluZ3MgPSBfbWFuaWZlc3RXcmFwcGVyLmdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmF1bHRDcmVhdGlvbk1vZGUgPVxuXHRcdGdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncz8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT0gXCJJbmxpbmVDcmVhdGlvblJvd3NcIiA/IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuTmV3UGFnZTtcblx0Y29uc3QgZW5hYmxlQXV0b0NvbHVtbldpZHRoID0gIV9tYW5pZmVzdFdyYXBwZXIuaXNQaG9uZSgpO1xuXHRjb25zdCBkaXNhYmxlQ29weVRvQ2xpcGJvYXJkID0gdGFibGVTZXR0aW5ncy5kaXNhYmxlQ29weVRvQ2xpcGJvYXJkO1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgX21hbmlmZXN0V3JhcHBlci5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBvRmlsdGVyQ29uZmlndXJhdGlvbiA9IGxpbmVJdGVtQW5ub3RhdGlvblxuXHRcdD8gZ2V0RmlsdGVyQ29uZmlndXJhdGlvbih0YWJsZVNldHRpbmdzLCBsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQsIHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uKVxuXHRcdDoge307XG5cdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdGNvbnN0IGV4cG9ydFJlcXVlc3RTaXplID0gdGFibGVTZXR0aW5ncy5leHBvcnRSZXF1ZXN0U2l6ZTtcblx0Y29uc3QgdGFibGVUeXBlID0gZ2V0VGFibGVUeXBlKGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RTZXR0aW5ncyk7XG5cdGNvbnN0IGFuYWx5dGljYWxDb25maWd1cmF0aW9uID0gdGFibGVTZXR0aW5ncy5hbmFseXRpY2FsQ29uZmlndXJhdGlvbjtcblx0Ly8gQnkgZGVmYXVsdCwgcGFzdGUgaXMgZW5hYmxlZCBvbiBhbiBPYmplY3RQYWdlIGFuZCBvbiBhIExpc3RSZXBvcnQgd2l0aCBhIGRyYWZ0IFRyZWVUYWJsZVxuXHRjb25zdCBlbmFibGVQYXN0ZSA9XG5cdFx0dGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSA/P1xuXHRcdChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBcIk9iamVjdFBhZ2VcIiB8fFxuXHRcdFx0KHRhYmxlVHlwZSA9PT0gXCJUcmVlVGFibGVcIiAmJiAoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdCAhPT0gdW5kZWZpbmVkKSk7XG5cdGNvbnN0IHRhYmxlUm93TW9kZSA9IF9nZXRUYWJsZU1vZGUodGFibGVUeXBlLCB0YWJsZVNldHRpbmdzLCB0ZW1wbGF0ZVR5cGUgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KTtcblx0Y29uc3QgZGVmYXVsdFNjcm9sbFRocmVzaG9sZCA9IHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIiA/IDMwMCA6IHVuZGVmaW5lZDtcblx0Y29uc3QgZGVmYXVsdFBvcGluTGF5b3V0ID1cblx0XHR0YWJsZVR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCJcblx0XHRcdD8gdGFibGVTZXR0aW5ncz8ucG9waW5MYXlvdXQgPz8gZ2xvYmFsRkVNYW5pZmVzdFNldHRpbmdzPy5tYWNyb3M/LnRhYmxlPy5kZWZhdWx0UG9waW5MYXlvdXQgPz8gXCJCbG9ja1wiXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0Y29uc3QgY29uZGVuc2VkVGFibGVMYXlvdXQgPSBfZ2V0Q29uZGVuc2VkVGFibGVMYXlvdXQodGFibGVUeXBlLCB0YWJsZVNldHRpbmdzKTtcblx0bGV0IGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPSBmYWxzZTtcblx0aWYgKHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlKSB7XG5cdFx0aW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSA9XG5cdFx0XHR0eXBlb2YgdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0PyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSA9PT0gXCJ0cnVlXCJcblx0XHRcdFx0OiB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZTtcblx0fVxuXHRsZXQgdXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzOiBzdHJpbmc7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBcIkxpc3RSZXBvcnRcIikge1xuXHRcdHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlcyA9IFwiaWxsdXN0cmF0ZWRNZXNzYWdlLUF1dG9cIjtcblx0fSBlbHNlIHtcblx0XHR1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMgPSBfbWFuaWZlc3RXcmFwcGVyLmdldFVzZVRleHRGb3JOb0RhdGFNZXNzYWdlcygpID8gXCJ0ZXh0XCIgOiBcImlsbHVzdHJhdGVkTWVzc2FnZS1FeHRyYVNtYWxsXCI7XG5cdH1cblxuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IHtcblx0XHQvLyBJZiBubyBjcmVhdGVBdEVuZCBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBmYWxzZSBmb3IgSW5saW5lL0NyZWF0aW9uRGlhbG9nIGNyZWF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2Vcblx0XHRjcmVhdGVBdEVuZDpcblx0XHRcdHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kXG5cdFx0XHRcdDogIVtDcmVhdGlvbk1vZGUuSW5saW5lLCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2ddLmluY2x1ZGVzKGNyZWF0aW9uTW9kZSksXG5cdFx0Y3JlYXRpb25Nb2RlOiBjcmVhdGlvbk1vZGUsXG5cdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6XG5cdFx0XHRjcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZ1xuXHRcdFx0XHQ/IGdldEZpZWxkTGlzdCh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRpb25GaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdGhhc0RhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogdGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHQvLyBpZiBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCwgaS5lLiBzZXQgdG8gZmFsc2Vcblx0XHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhOiAhY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID8gISF0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA6IGZhbHNlLFxuXHRcdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogZW5hYmxlQXV0b0NvbHVtbldpZHRoLFxuXHRcdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllczogdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXMsXG5cdFx0aWdub3JlZEZpZWxkczogdGFibGVTZXR0aW5ncy5pZ25vcmVkRmllbGRzLFxuXHRcdHJlYWRPbmx5OiB0YWJsZVNldHRpbmdzLnJlYWRPbmx5IHx8ICh0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgPyB0cnVlIDogdW5kZWZpbmVkKSwgLy8gQW5hbHl0aWNhbCB0YWJsZXMgYXJlIGFsd2F5cyByZWFkLW9ubHkgZm9yIHRoZSB0aW1lIGJlaW5nXG5cdFx0ZW5hYmxlRXhwb3J0OiBfZ2V0RW5hYmxlRXhwb3J0KHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIGVuYWJsZVBhc3RlKSxcblx0XHRleHBvcnRGaWxlTmFtZTogdGFibGVTZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcblx0XHRleHBvcnRTaGVldE5hbWU6IHRhYmxlU2V0dGluZ3MuZXhwb3J0U2hlZXROYW1lLFxuXHRcdGFuYWx5dGljYWxDb25maWd1cmF0aW9uLFxuXHRcdGZyb3plbkNvbHVtbkNvdW50OiBfZ2V0RnJvemVuQ29sdW1uQ291bnQodGFibGVTZXR0aW5ncyksXG5cdFx0ZW5hYmxlQ29sdW1uRnJlZXplOiBnZXRFbmFibGVDb2x1bW5GcmVlemUodGFibGVTZXR0aW5ncyksXG5cdFx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI6IF9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcih0YWJsZVNldHRpbmdzKSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UodGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCwgX21hbmlmZXN0V3JhcHBlci5pc1Bob25lKCkpLFxuXHRcdG1hc3NFZGl0OiBnZXRNYXNzRWRpdFNldHRpbmdzKHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGVuYWJsZUFkZENhcmRUb0luc2lnaHRzOiB0YWJsZVNldHRpbmdzPy5lbmFibGVBZGRDYXJkVG9JbnNpZ2h0cyxcblx0XHRlbmFibGVQYXN0ZTogZW5hYmxlUGFzdGUsXG5cdFx0ZGlzYWJsZUNvcHlUb0NsaXBib2FyZDogZGlzYWJsZUNvcHlUb0NsaXBib2FyZCxcblx0XHRoZWFkZXJWaXNpYmxlOiB0cnVlLFxuXHRcdGhlYWRlcjogdGFibGVTZXR0aW5ncy5oZWFkZXIsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBfZ2V0TXVsdGlTZWxlY3RNb2RlKHRhYmxlU2V0dGluZ3MsIHRhYmxlVHlwZSwgY29udmVydGVyQ29udGV4dCksXG5cdFx0c2VsZWN0aW9uTGltaXQ6IF9nZXRUYWJsZVNlbGVjdGlvbkxpbWl0KHRhYmxlU2V0dGluZ3MpLFxuXHRcdGlubGluZUNyZWF0aW9uUm93Q291bnQ6IF9nZXRUYWJsZUlubGluZUNyZWF0aW9uUm93Q291bnQodGFibGVTZXR0aW5ncyksXG5cdFx0aW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZTogaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSxcblx0XHRzaG93Um93Q291bnQ6IHRhYmxlU2V0dGluZ3M/LnF1aWNrVmFyaWFudFNlbGVjdGlvbj8ucGF0aHMgPyBmYWxzZSA6ICFfbWFuaWZlc3RXcmFwcGVyLmdldFZpZXdDb25maWd1cmF0aW9uKCk/LnNob3dDb3VudHMsXG5cdFx0dHlwZTogdGFibGVUeXBlLFxuXHRcdGRpc2FibGVSZXF1ZXN0Q2FjaGU6IGdldE9wdGltaXN0aWNCYXRjaFNldHRpbmdzRnJvbU1hbmlmZXN0KHRhYmxlTWFuaWZlc3RTZXR0aW5ncyksXG5cdFx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGNvbmRlbnNlZFRhYmxlTGF5b3V0ICYmIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQsXG5cdFx0aXNDb21wYWN0VHlwZTogX21hbmlmZXN0V3JhcHBlci5pc0NvbXBhY3RUeXBlKCksXG5cdFx0ZXhwb3J0UmVxdWVzdFNpemU6IGV4cG9ydFJlcXVlc3RTaXplLFxuXHRcdGVuYWJsZVVwbG9hZFBsdWdpbjogISFjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnM/LlVJPy5NZWRpYVJlc291cmNlPy5TdHJlYW0sXG5cdFx0bW9kZUZvck5vRGF0YU1lc3NhZ2U6IHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlcyxcblx0XHRzY3JvbGxUaHJlc2hvbGQ6IHRhYmxlU2V0dGluZ3Muc2Nyb2xsVGhyZXNob2xkID8/IGRlZmF1bHRTY3JvbGxUaHJlc2hvbGQsXG5cdFx0dGhyZXNob2xkOiB0YWJsZVNldHRpbmdzLnRocmVzaG9sZCxcblx0XHRwb3BpbkxheW91dDogdGFibGVUeXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiID8gdGFibGVTZXR0aW5ncy5wb3BpbkxheW91dCA/PyBkZWZhdWx0UG9waW5MYXlvdXQgOiB1bmRlZmluZWRcblx0fTtcblxuXHRjb25zdCB0YWJsZUNvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24gPSB7IC4uLm9Db25maWd1cmF0aW9uLCAuLi50YWJsZVJvd01vZGUsIC4uLm9GaWx0ZXJDb25maWd1cmF0aW9uIH07XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5iZWZvcmVSZWJpbmRUYWJsZSA9IHRhYmxlU2V0dGluZ3MuYmVmb3JlUmViaW5kVGFibGU7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5zZWxlY3Rpb25DaGFuZ2UgPSB0YWJsZVNldHRpbmdzLnNlbGVjdGlvbkNoYW5nZTtcblx0dGFibGVDb25maWd1cmF0aW9uLnJvd1ByZXNzID0gdGFibGVTZXR0aW5ncy5yb3dQcmVzcztcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJUcmVlVGFibGVcIikge1xuXHRcdHVwZGF0ZVRyZWVUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih0YWJsZUNvbmZpZ3VyYXRpb24sIHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQpO1xuXHR9XG5cblx0aWYgKHRhYmxlU2V0dGluZ3MuaGVhZGVyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmhlYWRlclZpc2libGUgPSB0YWJsZVNldHRpbmdzLmhlYWRlclZpc2libGU7XG5cdH1cblxuXHRpZiAodGFibGVDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLm91dGJvdW5kQ3JlYXRpb24gPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ub3V0Ym91bmQ7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb25maWd1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRUYWJsZVR5cGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVNYW5pZmVzdFNldHRpbmdzPzogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbik6IFRhYmxlVHlwZSB7XG5cdGlmICh0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnR5cGUpIHtcblx0XHQvLyBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYSB0YWJsZSB0eXBlIHdlIHdpbGwgdXNlIHRoaXMgb25lXG5cdFx0cmV0dXJuIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzLnR5cGU7XG5cdH1cblxuXHQvLyBkZWZhdWx0IGlzIHRoZSBSZXNwb25zaXZlVGFibGVcblx0cmV0dXJuIFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0Z2V0VGFibGVBY3Rpb25zLFxuXHRjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGdldENhcGFiaWxpdHlSZXN0cmljdGlvbixcblx0Z2V0U2VsZWN0aW9uTW9kZSxcblx0Z2V0UDEzbk1vZGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24sXG5cdGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24sXG5cdHNwbGl0UGF0aCxcblx0Z2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JUeXBlLFxuXHRjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzLFxuXHRnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCxcblx0Z2V0Q3VzdG9tRnVuY3Rpb25JbmZvXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0ZBO0VBRUE7RUFxSkE7QUFDQTtBQUNBOztFQVlBO0FBQ0E7QUFDQTs7RUFvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsZUFBZUEsQ0FDOUJDLGtCQUE0QixFQUM1QkMsaUJBQXlCLEVBQ3pCQyxnQkFBeUQsRUFDekRDLGVBQWdFLEVBQ2hFQyxrQkFBb0QsRUFDbkM7SUFDakI7SUFDQSxNQUFNQyxzQkFBc0IsR0FBR0MsV0FBVyxDQUFDQyxpREFBaUQsQ0FBQ0wsZ0JBQWdCLENBQUM7SUFFOUcsTUFBTU0sWUFBWSxHQUFHQyx5QkFBeUIsQ0FBQ1Qsa0JBQWtCLEVBQUVDLGlCQUFpQixFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2RztJQUNBLE1BQU1RLGVBQWUsR0FBR0Msc0JBQXNCLENBQzdDVCxnQkFBZ0IsQ0FBQ1UsK0JBQStCLENBQTZCWCxpQkFBaUIsQ0FBQyxDQUFDWSxPQUFPLEVBSXZHWCxnQkFBZ0IsRUFDaEJNLFlBQVksQ0FBQ0EsWUFBWSxFQUN6Qkosa0JBQWtCLEVBQ2xCLElBQ0QsQ0FBQztJQUNEO0lBQ0EsTUFBTVUsV0FBVyxHQUFHTixZQUFZLENBQUNBLFlBQVksQ0FBQ08sTUFBTSxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsSUFBSSxLQUFLQyxVQUFVLENBQUNDLElBQUksQ0FBQztJQUN2RixNQUFNQyxpQkFBaUIsR0FBR1osWUFBWSxDQUFDQSxZ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
2027
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJzdGFuZGFyZEFjdGlvbnMiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJ0YWJsZUFjdGlvbnMiLCJnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zIiwibWFuaWZlc3RBY3Rpb25zIiwiZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdCIsImdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJhY3Rpb25zIiwiY29weUFjdGlvbnMiLCJmaWx0ZXIiLCJhIiwidHlwZSIsIkFjdGlvblR5cGUiLCJDb3B5IiwiYW5ub3RhdGlvbkFjdGlvbnMiLCJhbm5vdGF0aW9uQW5kU3RhbmRhcmRBY3Rpb25zIiwiY3JlYXRlIiwiZGVsZXRlIiwibWFzc0VkaXQiLCJpbnNpZ2h0cyIsImNyZWF0aW9uUm93IiwiY3V0IiwiY29weSIsInBhc3RlIiwibW92ZVVwIiwibW92ZURvd24iLCJhY3Rpb24iLCJ1bmRlZmluZWQiLCJtYW5pZmVzdEFjdGlvbiIsIk9iamVjdCIsInZhbHVlcyIsIkRlZmF1bHQiLCJNZW51IiwicG9zaXRpb24iLCJhbmNob3IiLCJTdGFuZGFyZEFjdGlvbktleXMiLCJDcmVhdGUiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJCZWZvcmUiLCJtYW5pZmVzdEFjdGlvbkVudHJpZXMiLCJlbnRyaWVzIiwic3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMiLCJmcm9tRW50cmllcyIsIl9yZWYiLCJrZXkiLCJzdGFydHNXaXRoIiwibm9uU3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMiLCJfcmVmMiIsImFjdGlvbk92ZXJ3cml0ZUNvbmZpZyIsImlzTmF2aWdhYmxlIiwiT3ZlcnJpZGVUeXBlIiwib3ZlcndyaXRlIiwiZW5hYmxlT25TZWxlY3QiLCJlbmFibGVBdXRvU2Nyb2xsIiwiZW5hYmxlZCIsInZpc2libGUiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjb21tYW5kIiwibWVudSIsInByaW9yaXR5IiwiZ3JvdXAiLCJvdmVyZmxvd0dyb3VwIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiYW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyIsImdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMiLCJtYXRjaGluZ01hbmlmZXN0QWN0aW9ucyIsImdldE1hdGNoaW5nTWFuaWZlc3RBY3Rpb24iLCJvdmVyd3JpdHRlbk1lbnVBY3Rpb25JdGVtcyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwicHJlcGFyZU1lbnVBY3Rpb25zIiwicmVtb3ZlRHVwbGljYXRlQWN0aW9ucyIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dCIsImFkZENvbGxhYm9yYXRpb25Db25kaXRpb24iLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwib3ZlcmZsb3dHcm91cHNDb25maWciLCJvdmVyZmxvd0dyb3VwcyIsImFkZFNlcGFyYXRvcnMiLCJjb21tYW5kQWN0aW9ucyIsIl9leHBvcnRzIiwiZ2V0Q29udGV4dERlZmluaW5nUHJvcGVydGllc0Zyb21BZ2dyZWdhdGlvbkFubm90YXRpb24iLCJhZ2dyZWdhdGlvbkhlbHBlciIsImN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9ucyIsImZvckVhY2giLCJhbm5vdGF0aW9uIiwiYWdncmVnYXRlZFByb3BlcnR5IiwiX2VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZmluZCIsInByb3BlcnR5IiwibmFtZSIsInF1YWxpZmllciIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJhbm5vdGF0aW9ucyIsIkFnZ3JlZ2F0aW9uIiwiQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsIm1hcCIsImN0eERlZlByb3BlcnR5IiwidmFsdWUiLCJnZXRFeHRlbnNpb25JbmZvRnJvbUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwidGFibGVDb2x1bW5zIiwiQWdncmVnYXRpb25IZWxwZXIiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsImN1cnJlbmN5T3JVbml0UHJvcGVydGllcyIsIlNldCIsImNvbHVtbiIsInRhYmxlQ29sdW1uIiwidW5pdCIsInRhcmdldFVuaXRQcm9wZXJ0eSIsInByb3AiLCJhZGQiLCJyZWxhdGl2ZVBhdGgiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uIiwicmVzdWx0IiwicHJvcGVydHlJbmZvcyIsInJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJmcm9tR3JvdXBhYmxlUHJvcGVydHkiLCJpc1Byb3BlcnR5R3JvdXBhYmxlIiwiaGFzIiwiY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lIiwiZm91bmRDb2x1bW4iLCJmaW5kQ29sdW1uQnlQYXRoIiwicHVzaCIsImxlbmd0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwidXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZSIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsImFnZ3JlZ2F0aW9uRGF0YSIsImNvbHVtbnMiLCJlbmFibGVBbmFseXRpY3MiLCJlbmFibGUkc2VsZWN0IiwiZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0IiwiYW5hbHl0aWNzRXh0ZW5zaW9ucyIsIl91cGRhdGVQcm9wZXJ0eUluZm9zV2l0aEFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyIsImFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJnZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiZW5hYmxlQmFzaWNTZWFyY2giLCJpbmNsdWRlcyIsImdyb3VwQ29uZGl0aW9ucyIsImdldEdyb3VwQ29uZGl0aW9ucyIsImFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXRBZ2dyZWdhdGVDb25kaXRpb25zIiwiTG9nIiwiZXJyb3IiLCJjaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQiLCJIaWVyYXJjaHkiLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJDaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQiLCJhbGxvd0Ryb3BCZXR3ZWVuTm9kZXMiLCJDaGFuZ2VOZXh0U2libGluZ0FjdGlvbiIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInJlcXVlc3RBdExlYXN0IiwiYW5hbHl0aWNhbENvbmZpZ3VyYXRpb24iLCJhZ2dyZWdhdGlvbk9uTGVhZkxldmVsIiwiaXNEcmFmdFJvb3QiLCJnZXRFbnRpdHlTZXQiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJpc0ZjbEVuYWJsZWQiLCJlbmFibGVVcGxvYWRQbHVnaW4iLCJzdHJlYW1Qcm9wZXJ0eSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiVUkiLCJNZWRpYVJlc291cmNlIiwiU3RyZWFtIiwiJHRhcmdldCIsInVwbG9hZEFjdGlvbiIsInVwbG9hZFRhYmxlIiwic3RyZWFtIiwiZmlsZU5hbWUiLCJDb3JlIiwiQ29udGVudERpc3Bvc2l0aW9uIiwiRmlsZW5hbWUiLCJwYXRoIiwiZmlsZU5hbWVNYXhMZW5ndGgiLCJtYXhMZW5ndGgiLCJhY2NlcHRhYmxlTWVkaWFUeXBlcyIsIkFjY2VwdGFibGVNZWRpYVR5cGVzIiwidmlzaWJsZUFjdGlvbnMiLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiaXNTdGlja3kiLCJldmVyeSIsImRpc2FibGVPd25SZXF1ZXN0T25NVkYiLCJjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwibGluZUl0ZW0iLCJvcGVyYXRpb25BdmFpbGFibGUiLCJzZWxlY3RlZEZpZWxkcyIsInB1c2hGaWVsZCIsImZpZWxkTmFtZSIsIm9yaWdpbiIsImluZGV4T2YiLCJwdXNoRmllbGRMaXN0IiwiZmllbGRzIiwiZmllbGQiLCJvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzIiwic3BsaXQiLCJ2YWxpZFByb3BlcnRpZXMiLCJwcm9wTmFtZSIsInJlc29sdmVQYXRoIiwic2VtYW50aWNLZXlzIiwiQ29tbW9uIiwiU2VtYW50aWNLZXkiLCJzZW1hbnRpY0tleSIsImNhcGFiaWxpdGllc0Fubm90YXRpb24iLCJDYXBhYmlsaXRpZXMiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsIlJlcXVlc3RBdExlYXN0IiwicHJvcGVydHlQYXRoIiwiZ2V0TmF2aWdhdGlvbkF2YWlsYWJsZUZpZWxkc0Zyb21MaW5lSXRlbSIsIkRlbGV0ZVJlc3RyaWN0aW9ucyIsIkRlbGV0YWJsZSIsInVwZGF0ZVByb3BlcnR5SW5mbyIsImdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoSW5mbyIsInBhdGhzIiwicmVjb3JkIiwiJFR5cGUiLCJJbmxpbmUiLCJEZXRlcm1pbmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiTmF2aWdhdGlvbkF2YWlsYWJsZSIsImdldE5hdmlnYXRpb25UYXJnZXRQYXRoIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm1hbmlmZXN0V3JhcHBlciIsImdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uIiwibmF2Q29uZmlnIiwia2V5cyIsImRhdGFNb2RlbFBhdGgiLCJjb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwibmF2Q29uZmlnRm9yQ29udGV4dFBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJzdGFydGluZ0VudGl0eVNldCIsImdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyIsImhlYWRlckluZm9UaXRsZVBhdGgiLCJIZWFkZXJJbmZvIiwiVGl0bGUiLCJWYWx1ZSIsInNlbWFudGljS2V5QW5ub3RhdGlvbnMiLCJoZWFkZXJJbmZvVHlwZU5hbWUiLCJUeXBlTmFtZSIsInNlbWFudGljS2V5Q29sdW1ucyIsIm9Db2x1bW4iLCJjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24iLCJwYXJhbXMiLCJpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50Iiwic2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24iLCJ0YWJsZU1hbmlmZXN0Q29uZmlnIiwiZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJzcGxpdFBhdGgiLCJuYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsImdldFRhYmxlQ29sdW1ucyIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSIsInN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24iLCJnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uIiwidGFibGVBbm5vdGF0aW9uIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJoZWFkZXIiLCJ0aXRsZSIsIm9WaXN1YWxpemF0aW9uIiwiVmlzdWFsaXphdGlvblR5cGUiLCJUYWJsZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJoZWFkZXJJbmZvVGl0bGUiLCJoZWFkZXJWaXNpYmxlIiwiaGFuZGxlUGF0Y2hTZW50IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24iLCJpc0JsYW5rVGFibGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwiY3JlYXRpb25Nb2RlIiwiQWN0aW9uSGVscGVyIiwicmVzdHJpY3Rpb25zIiwiZ2V0UmVzdHJpY3Rpb25zIiwiZW50aXR5U2V0IiwidXBkYXRhYmxlIiwiaXNVcGRhdGFibGUiLCJpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5IiwiaXNDb25zdGFudCIsImV4cHJlc3Npb24iLCJuYXZpZ2F0aW9uRXhwcmVzc2lvbiIsIl90eXBlIiwidXBkYXRhYmxlRXhwcmVzc2lvbiIsIlVwZGF0ZVJlc3RyaWN0aW9ucyIsIlVwZGF0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJiaW5kaW5nSW5mbyIsIkJpbmRpbmdJbmZvIiwicGFyc2UiLCJwYXJ0cyIsInJlZHVjZSIsImFjYyIsInBhcnQiLCJtb2RlbCIsIkFycmF5IiwiZnJvbSIsInByb3BlcnRpZXMiLCJhY3Rpb25OYW1lIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJqb2luIiwiZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dCIsImN1cnJlbnRFbnRpdHlUeXBlIiwiY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCJBY3Rpb25UYXJnZXQiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEhpZGRlbkV4cHJlc3Npb25BdFRhYmxlTGV2ZWwiLCJnZXRQYXRoRnJvbUFjdGlvbkFubm90YXRpb24iLCJzb3VyY2UiLCJjb25zdGFudCIsInN1YnN0cmluZyIsInNwbGl0UGF0aEZvck5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJwYXJ0bmVyIiwicGF0aEluTW9kZWwiLCJzbGljZSIsInVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQiLCJkYXRhRmllbGRJZCIsInNvbWUiLCJhY3Rpb25LZXkiLCJyZXF1aXJlc1NlbGVjdGlvbiIsImhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJtYW5pZmVzdEFjdGlvbklkIiwiZ2VuZXJhdGUiLCJBY3Rpb24iLCJTZW1hbnRpY09iamVjdCIsIkFjdGlvbnMiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsImN1c3RvbUFjdGlvbnMiLCJtZW51QWN0aW9uIiwidG9TdHJpbmciLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1BhdGhVcGRhdGFibGUiLCJnZXRTZWxlY3Rpb25Nb2RlIiwiaXNFbnRpdHlTZXQiLCJ0YXJnZXRDYXBhYmlsaXRpZXMiLCJkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsIm1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24iLCJhcmd1bWVudHMiLCJjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsInRhYmxlVHlwZSIsInRhYmxlU2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwiU2VsZWN0aW9uTW9kZSIsIk11bHRpIiwiTm9uZSIsImlmRWxzZSIsIkZvcmNlTXVsdGkiLCJGb3JjZVNpbmdsZSIsIlNpbmdsZSIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiT2JqZWN0UGFnZSIsImJNYXNzRWRpdEVuYWJsZWQiLCJBdXRvIiwiYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJvciIsImFuZCIsIklzRWRpdGFibGUiLCJlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiY29uY2F0IiwiY29weURhdGFGaWVsZCIsImdldENvcHlBY3Rpb24iLCJkYXRhRmllbGRJc0NvcHlBY3Rpb24iLCJhbm5vdGF0aW9uUGF0aCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJ2aXNpYmxlRXhwcmVzc2lvbiIsInRleHQiLCJMYWJlbCIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwidGFibGVBY3Rpb24iLCJnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JBY3Rpb25Hcm91cCIsImRhdGFGaWVsZEdyb3VwIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNBSU9wZXJhdGlvbiIsImlzQWN0aW9uQUlPcGVyYXRpb24iLCJfdXNlRW5hYmxlZEV4cHJlc3Npb24iLCJnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsImlkIiwiaXNNZW51QUlPcGVyYXRpb24iLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3RPck5vZGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsImZvcm1hdFJlc3VsdCIsIkVudGl0eSIsIkhhc0FjdGl2ZSIsIklzQWN0aXZlIiwiSXNJbmFjdGl2ZSIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsImdldEV4dGVybmFsQ3JlYXRpb25CZWhhdmlvciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwiY3JlYXRpb25EZXRhaWxzIiwib3V0Ym91bmRLZXkiLCJvdXRib3VuZENyZWF0aW9uIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsImdldE91dGJvdW5kTmF2aWdhdGlvbkVudHJpZXMiLCJtb2RlIiwiQ3JlYXRpb25Nb2RlIiwiRXh0ZXJuYWwiLCJ3YXJuaW5nIiwiTmV3UGFnZSIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsImV4dGVybmFsQmVoYXZpb3IiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJuYXZpZ2F0aW9uRGV0YWlscyIsImRldGFpbCIsIkNyZWF0aW9uRGlhbG9nIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJ0YXJnZXRBbm5vdGF0aW9uc0NvbW1vbiIsInRhcmdldEFubm90YXRpb25zU2Vzc2lvbiIsIlNlc3Npb24iLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiQ3JlYXRpb25Sb3ciLCJFcnJvciIsInJvdXRlIiwiYXBwZW5kIiwiY3JlYXRlQXRFbmQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiaW5mbyIsIl9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwiYWdncmVnYXRpb25PbkxlYWZMZXZlbGVuYWJsZWQiLCJuYXZpZ2F0aW9uSW5mbyIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJDcml0aWNhbGl0eSIsInJvd05hdmlnYWJsZUV4cHJlc3Npb24iLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiZGlzcGxheSIsInRhcmdldCIsImdldERyYWZ0Um9vdCIsImdldERyYWZ0Tm9kZSIsImNoZWNrRWRpdGFibGUiLCJyb3V0ZVBhdGgiLCJyZWNyZWF0ZUNvbnRleHQiLCJhdmFpbGFiaWxpdHkiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwiYWN0aW9uVHlwZSIsInJvd05hdmlnYXRlZCIsInJvd0NyaXRpY2FsaXR5Rm9ySW5zaWdodHMiLCJjcml0aWNhbGl0eUV4cHJlc3Npb25Gb3JJbnRlZ3JhdGlvbkNhcmRzIiwibm90IiwiaXNOb2RlTGV2ZWxOYXZpZ2FibGUiLCJjcmVhdGVUZWNobmljYWxQcm9wZXJ0eSIsInJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwIiwiY29sdW1uRXhpc3RzIiwiYWRkaXRpb25hbFByb3BlcnR5IiwidGVjaG5pY2FsQ29sdW1uIiwiQ29sdW1uVHlwZSIsIkFubm90YXRpb24iLCJsYWJlbCIsImRhdGFUeXBlIiwic29ydGFibGUiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiZXhwb3J0U2V0dGluZ3MiLCJjYXNlU2Vuc2l0aXZlIiwiYWdncmVnYXRhYmxlIiwiZmlsdGVyYWJsZSIsImV4dGVuc2lvbiIsInRlY2huaWNhbGx5R3JvdXBhYmxlIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJtb2RlcyIsImlzQW5hbHl0aWNhbFRhYmxlIiwiaXNSZXNwb25zaXZlVGFibGUiLCJwZXJzb25hbGl6YXRpb24iLCJzb3J0IiwiYWdncmVnYXRlIiwiVmFyaWFudE1hbmFnZW1lbnRUeXBlIiwiQ29udHJvbCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImlzRmlsdGVyQmFySGlkZGVuIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImdldFNvcnRDb25kaXRpb25zIiwibm9uU29ydGFibGVQcm9wZXJ0aWVzIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwic29ydENvbmRpdGlvbnMiLCJzb3J0ZXJzIiwiU29ydE9yZGVyIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwiZ2V0SW5pdGlhbEV4cGFuc2lvbkxldmVsIiwibGV2ZWwiLCJJbml0aWFsRXhwYW5zaW9uTGV2ZWwiLCJpbmZvTmFtZXMiLCJwcm9wZXJ0eUluZm8iLCJhbm5vdGF0aW9uQ29sdW1uIiwiY3VycmVudFBhdGgiLCJncm91cExldmVscyIsIkdyb3VwQnkiLCJhR3JvdXBCeSIsInByb3BlcnR5TmFtZUZyb21BbmFseXRpY3NJbmZvIiwiX2dldFByb3BlcnR5TmFtZUZyb21BbmFseXRpY3NJbmZvIiwiYWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uIiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlJbmZvIiwiX3VwZGF0ZUZvclRleHRPbmx5UHJvcGVydGllc1dpdGhDRFAiLCJ0ZXh0QXJyYW5nZW1lbnQiLCJ0ZXh0UHJvcGVydHkiLCJhbmFseXRpY3NJbmZvUHJvcGVydHlOYW1lRm9yRGVzYyIsImNvbHVtbldpdGhUZXh0T25seSIsInRleHRPbmx5Q29sdW1uIiwiZXh0ZW5zaW9uSW5mb01hcCIsIlRvdGFsIiwiYVRvdGFscyIsImNyZWF0aW9uQmVoYXZpb3VyIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldEN1dFZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwibWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldE1hc3NFZGl0VmlzaWJpbGl0eSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwiZ2V0U3RhbmRhcmRBY3Rpb25DdXQiLCJnZXRTdGFuZGFyZEFjdGlvbkNvcHkiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzIiwiZ2V0Q3JlYXRpb25Sb3ciLCJjb25maWd1cmF0aW9uIiwiZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duIiwidHlwZU5hbWVQbHVyYWwiLCJUeXBlTmFtZVBsdXJhbCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJnZXRUYWJsZUlEIiwidGhyZXNob2xkIiwiZ2V0VGhyZXNob2xkIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsImFwaUlkIiwiZW50aXR5TmFtZSIsImVudGl0eVR5cGVOYW1lIiwiY29sbGVjdGlvbiIsImdldFRhcmdldE9iamVjdFBhdGgiLCJyb3ciLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvIiwiZGlzcGxheU1vZGUiLCJpc0luRGlzcGxheU1vZGUiLCJzZWFyY2hhYmxlIiwiaW5pdGlhbEV4cGFuc2lvbkxldmVsIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzIiwiTWF4SXRlbXMiLCJ0YXJnZXROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibGFzdEluZGV4T2YiLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInNlbGVjdGlvbiIsInByb3BlcnR5TmFtZXMiLCJTZWxlY3RPcHRpb25zIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwiVGV4dCIsIl9nZXRGdWxsU2NyZWVuQmFzZWRPbkRldmljZSIsImlzSXBob25lIiwiZW5hYmxlRnVsbFNjcmVlbiIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVUeXBlIiwiRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQiLCJfZ2V0TXVsdGlTZWxlY3RNb2RlIiwibXVsdGlTZWxlY3RNb2RlIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsIl9nZXRUYWJsZU1vZGUiLCJpc1RlbXBsYXRlTGlzdFJlcG9ydCIsInJvd0NvdW50TW9kZSIsInJvd0NvdW50IiwiaW5pdGlhbFJvd0NvdW50IiwiX2dldENvbmRlbnNlZFRhYmxlTGF5b3V0IiwiX3RhYmxlVHlwZSIsIl90YWJsZVNldHRpbmdzIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdCIsInNlbGVjdGlvbkxpbWl0IiwiX2dldFRhYmxlSW5saW5lQ3JlYXRpb25Sb3dDb3VudCIsImlubGluZUNyZWF0aW9uUm93Q291bnQiLCJfZ2V0RW5hYmxlRXhwb3J0IiwiZW5hYmxlUGFzdGUiLCJlbmFibGVFeHBvcnQiLCJfZ2V0RnJvemVuQ29sdW1uQ291bnQiLCJmcm96ZW5Db2x1bW5Db3VudCIsImdldEVuYWJsZUNvbHVtbkZyZWV6ZSIsImRpc2FibGVDb2x1bW5GcmVlemUiLCJfZ2V0V2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJoaWRlVGFibGVUaXRsZSIsImZpbHRlcnMiLCJxdWlja1ZhcmlhbnRTZWxlY3Rpb24iLCJxdWlja0ZpbHRlclBhdGhzIiwiZmlsdGVyUGF0aHMiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwiaGlkZGVuRmlsdGVycyIsInNFbnRpdHlUeXBlIiwidXNlRW5hYmxlZEV4cHJlc3Npb24iLCJPcGVyYXRpb25BdmFpbGFibGUiLCJvdmVybG9hZEFjdGlvbiIsInNvdXJjZVR5cGUiLCJzdGF0aWNBY3Rpb24iLCJwYXJhbWV0ZXJzIiwiaXNDb2xsZWN0aW9uIiwidXBkYXRlVHJlZVRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwidGFibGVDb25maWd1cmF0aW9uIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEhpZXJhcmNoeVF1YWxpZmllciIsImhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRIaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJnZXROb25VcGRhdGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsImlzSGllcmFyY2h5UGFyZW50Tm9kZVVwZGF0YWJsZSIsImlzTm9kZU1vdmFibGUiLCJnZXRDdXN0b21GdW5jdGlvbkluZm8iLCJpc05vZGVDb3B5YWJsZSIsImlzTW92ZVRvUG9zaXRpb25BbGxvd2VkIiwiaXNDb3B5VG9Qb3NpdGlvbkFsbG93ZWQiLCJjcmVhdGVFbmFibGVtZW50IiwiaXNDcmVhdGVFbmFibGVkIiwibm9kZVR5cGUiLCJub2RlVHlwZUluZm8iLCJjcmVhdGlvbkRpYWxvZ0ZpZWxkcyIsImdldEZpZWxkTGlzdCIsImNyZWF0aW9uRmllbGRzIiwiY3JlYXRlSW5QbGFjZSIsImxhc3REb3RJbmRleCIsIm1vZHVsZU5hbWUiLCJyZXBsYWNlIiwibWV0aG9kTmFtZSIsImFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMiLCJhZ2dyZWdhdGlvbkFubm90YXRpb24iLCJoaWVyYXJjaHlBbm5vdGF0aW9uIiwicXVhbGlmaWVkTmFtZSIsIl9rZXlzIiwiZ2V0T3B0aW1pc3RpY0JhdGNoU2V0dGluZ3NGcm9tTWFuaWZlc3QiLCJkaXNhYmxlUmVxdWVzdENhY2hlIiwiZ2V0TWFzc0VkaXRTZXR0aW5ncyIsImRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24iLCJ2aXNpYmxlRmllbGRzIiwiaWdub3JlZEZpZWxkcyIsIm9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIk9wZXJhdGlvbkdyb3VwaW5nTW9kZSIsIklzb2xhdGVkIiwiQ2hhbmdlU2V0IiwiZW5hYmxlTWFzc0VkaXQiLCJjdXN0b21GcmFnbWVudCIsImZyb21JbmxpbmUiLCJmaWVsZEdyb3VwIiwiaXNBbm5vdGF0aW9uT2ZUeXBlIiwiRGF0YSIsImlzRGF0YUZpZWxkIiwidHJpbSIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwiX21hbmlmZXN0V3JhcHBlciIsImdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncyIsImdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwiZGVmYXVsdENyZWF0aW9uTW9kZSIsIm1hY3JvcyIsInRhYmxlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiZW5hYmxlQXV0b0NvbHVtbldpZHRoIiwiaXNQaG9uZSIsImRpc2FibGVDb3B5VG9DbGlwYm9hcmQiLCJ0ZW1wbGF0ZVR5cGUiLCJpc0NvbmRlbnNlZExheW91dENvbXBsaWFudCIsIm9GaWx0ZXJDb25maWd1cmF0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZXhwb3J0UmVxdWVzdFNpemUiLCJnZXRUYWJsZVR5cGUiLCJ0YWJsZVJvd01vZGUiLCJkZWZhdWx0U2Nyb2xsVGhyZXNob2xkIiwiZGVmYXVsdFBvcGluTGF5b3V0IiwicG9waW5MYXlvdXQiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwidXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwiZ2V0VXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzIiwib0NvbmZpZ3VyYXRpb24iLCJoYXNEYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzIiwicmVhZE9ubHkiLCJleHBvcnRGaWxlTmFtZSIsImV4cG9ydFNoZWV0TmFtZSIsImVuYWJsZUNvbHVtbkZyZWV6ZSIsImVuYWJsZUFkZENhcmRUb0luc2lnaHRzIiwic2hvd1Jvd0NvdW50IiwiZ2V0Vmlld0NvbmZpZ3VyYXRpb24iLCJ1c2VDb25kZW5zZWRUYWJsZUxheW91dCIsImlzQ29tcGFjdFR5cGUiLCJtb2RlRm9yTm9EYXRhTWVzc2FnZSIsInNjcm9sbFRocmVzaG9sZCIsImJlZm9yZVJlYmluZFRhYmxlIiwic2VsZWN0aW9uQ2hhbmdlIiwicm93UHJlc3MiLCJyZXF1aXJlZEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJ0cmFuc2Zvcm1hdGlvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIEVudGl0eVR5cGUsIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUHJvcGVydHlBbm5vdGF0aW9uVmFsdWUsIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19Db21tb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vbl9FZG1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfU2Vzc2lvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvU2Vzc2lvbl9FZG1cIjtcbmltcG9ydCB0eXBlIHtcblx0Q3JpdGljYWxpdHksXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMsXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtLFxuXHRQcmVzZW50YXRpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0U2VsZWN0aW9uVmFyaWFudCxcblx0U2VsZWN0aW9uVmFyaWFudFR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QsXG5cdGlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAsXG5cdHZpc2libGVFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHR5cGUge1xuXHRBbm5vdGF0aW9uQWN0aW9uLFxuXHRBbm5vdGF0aW9uQWN0aW9uR3JvdXAsXG5cdEJhc2VBY3Rpb24sXG5cdENvbWJpbmVkQWN0aW9uLFxuXHRDdXN0b21BY3Rpb24sXG5cdE92ZXJyaWRlVHlwZUFjdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQge1xuXHRhZGRDb2xsYWJvcmF0aW9uQ29uZGl0aW9uLFxuXHRhZGRTZXBhcmF0b3JzLFxuXHRkYXRhRmllbGRJc0NvcHlBY3Rpb24sXG5cdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QsXG5cdGdldEFubm90YXRpb25NZW51QWN0aW9uSXRlbXMsXG5cdGdldENvcHlBY3Rpb24sXG5cdGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uLFxuXHRnZXRNYXRjaGluZ01hbmlmZXN0QWN0aW9uLFxuXHRnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zLFxuXHRpc0FjdGlvbkFJT3BlcmF0aW9uLFxuXHRpc01lbnVBSU9wZXJhdGlvbixcblx0cHJlcGFyZU1lbnVBY3Rpb25zLFxuXHRyZW1vdmVEdXBsaWNhdGVBY3Rpb25zXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IEVudGl0eSwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNOYXZpZ2F0aW9uUHJvcGVydHksIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgY3JpdGljYWxpdHlFeHByZXNzaW9uRm9ySW50ZWdyYXRpb25DYXJkcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0NyaXRpY2FsaXR5Rm9ybWF0dGVyc1wiO1xuaW1wb3J0IHtcblx0Z2V0SGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0Z2V0Tm9uVXBkYXRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlLFxuXHR0eXBlIERhdGFNb2RlbE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IEFjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBGb3JtQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybUNvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRNYW5pZmVzdEFjdGlvbixcblx0TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0TmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdE9wZXJhdGlvbkdyb3VwaW5nTW9kZSxcblx0U2VsZWN0aW9uTW9kZSxcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpc3VhbGl6YXRpb25UeXBlXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgZ2V0VGFibGVJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUgfSBmcm9tIFwiLi9Dcml0aWNhbGl0eVwiO1xuaW1wb3J0IHtcblx0Q29sdW1uVHlwZSxcblx0ZmluZENvbHVtbkJ5UGF0aCxcblx0Z2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlLFxuXHRnZXRSZXF1aXJlZFByb3BlcnRpZXMsXG5cdGdldFRhYmxlQ29sdW1ucyxcblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyxcblx0dHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4sXG5cdHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzLFxuXHR0eXBlIFRhYmxlQ29sdW1uXG59IGZyb20gXCIuL3RhYmxlL0NvbHVtbnNcIjtcbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRBY3Rpb24gfSBmcm9tIFwiLi90YWJsZS9TdGFuZGFyZEFjdGlvbnNcIjtcbmltcG9ydCB7XG5cdFN0YW5kYXJkQWN0aW9uS2V5cyxcblx0Z2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRnZXRDcmVhdGlvblJvdyxcblx0Z2V0Q3V0VmlzaWJpbGl0eSxcblx0Z2V0RGVsZXRlVmlzaWJpbGl0eSxcblx0Z2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmcsXG5cdGdldE1hc3NFZGl0VmlzaWJpbGl0eSxcblx0Z2V0UmVzdHJpY3Rpb25zLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNvcHksXG5cdGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkN1dCxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93bixcblx0Z2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSxcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkLFxuXHRpc0luRGlzcGxheU1vZGVcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmltcG9ydCB0eXBlIHsgRW50aXR5VHlwZUFubm90YXRpb25zX0FnZ3JlZ2F0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9BZ2dyZWdhdGlvbl9FZG1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5VHlwZUFubm90YXRpb25zX0hpZXJhcmNoeSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvSGllcmFyY2h5X0VkbVwiO1xuaW1wb3J0IEJpbmRpbmdJbmZvIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nSW5mb1wiO1xuaW1wb3J0IHsgdHlwZSBQcm9wZXJ0eUJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcblxudHlwZSBVcGxvYWRUYWJsZVNldHRpbmdzID0ge1xuXHRzdHJlYW06IHN0cmluZztcblx0ZmlsZU5hbWU/OiBzdHJpbmc7XG5cdGZpbGVOYW1lTWF4TGVuZ3RoPzogaW50O1xuXHRhY2NlcHRhYmxlTWVkaWFUeXBlcz86IHN0cmluZ1tdO1xuXHRtYXhMZW5ndGg/OiBpbnQ7XG5cdHVwbG9hZEFjdGlvbj86IFN0YW5kYXJkQWN0aW9uO1xufTtcblxudHlwZSBSb3dOYXZpZ2F0aW9uSW5mbyA9XG5cdHwge1xuXHRcdFx0dHlwZTogXCJPdXRib3VuZFwiO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldDogc3RyaW5nO1xuXHRcdFx0bmF2aWdhdGlvbkluRWRpdE1vZGU/OiBib29sZWFuO1xuXHQgIH1cblx0fCB7XG5cdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25cIjtcblx0XHRcdHRhcmdldFBhdGg6IHN0cmluZztcblx0XHRcdGNoZWNrRWRpdGFibGU6IGJvb2xlYW47XG5cdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW47XG5cdFx0XHRyb3V0ZVBhdGg6IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbkVkaXRNb2RlPzogYm9vbGVhbjtcblx0ICB9O1xuXG50eXBlIFJvd0NvbmZpZ3VyYXRpb24gPSB7XG5cdGFjdGlvblR5cGU/OiBzdHJpbmc7XG5cdG5hdmlnYXRpb25JbmZvPzogUm93TmF2aWdhdGlvbkluZm87XG5cdHJvd0hpZ2hsaWdodGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHJvd05hdmlnYXRlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHJvd0NyaXRpY2FsaXR5Rm9ySW5zaWdodHM/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0dmlzaWJsZT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb24gPSB7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG5cdHZpc2libGVGaWVsZHM6IHN0cmluZ1tdO1xuXHRpZ25vcmVkRmllbGRzOiBzdHJpbmdbXTtcblx0b3BlcmF0aW9uR3JvdXBpbmdNb2RlOiBPcGVyYXRpb25Hcm91cGluZ01vZGU7XG5cdGN1c3RvbUZyYWdtZW50Pzogc3RyaW5nIHwgRm9ybUNvbnRhaW5lcjtcblx0ZnJvbUlubGluZT86IGJvb2xlYW47XG59O1xuXG50eXBlIFRhYmxlU29ydENvbmRpdGlvbnMgPSB7XG5cdHNvcnRlcnM6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0ZGVzY2VuZGluZzogYm9vbGVhbjtcblx0fVtdO1xufTtcblxudHlwZSBUYWJsZUdyb3VwQ29uZGl0aW9ucyA9IHtcblx0Z3JvdXBMZXZlbHM6IHsgbmFtZTogc3RyaW5nIH1bXTtcbn07XG5cbnR5cGUgVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zID0gUmVjb3JkPHN0cmluZywgb2JqZWN0PjtcblxudHlwZSBUYWJsZVAxM25Nb2RlID0gXCJBZ2dyZWdhdGVcIiB8IFwiQ29sdW1uXCIgfCBcIkZpbHRlclwiIHwgXCJHcm91cFwiIHwgXCJTb3J0XCI7XG5cbmV4cG9ydCB0eXBlIEFuYWx5dGljYWxDb25maWd1cmF0aW9uID0ge1xuXHRhZ2dyZWdhdGlvbk9uTGVhZkxldmVsPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm8gPSB7XG5cdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uOiBib29sZWFuO1xuXHRiaW5kaW5nRXhwcmVzc2lvbjogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHBhdGhzOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGNvbGxlY3Rpb246IHN0cmluZztcblx0dmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0ZmlsdGVySWQ/OiBzdHJpbmc7XG5cdGlkOiBzdHJpbmc7XG5cdGFwaUlkOiBzdHJpbmc7XG5cdG5hdmlnYXRpb25QYXRoOiBzdHJpbmc7XG5cdHAxM25Nb2RlPzogVGFibGVQMTNuTW9kZVtdO1xuXHRyb3c/OiBSb3dDb25maWd1cmF0aW9uO1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogYm9vbGVhbjtcblx0dXBkYXRhYmxlUHJvcGVydHlQYXRoSW5mbzogVXBkYXRhYmxlUHJvcGVydHlQYXRoSW5mbyB8IHVuZGVmaW5lZDtcblx0ZGlzcGxheU1vZGU/OiBib29sZWFuO1xuXHR0aHJlc2hvbGQ6IG51bWJlcjtcblx0ZW50aXR5TmFtZTogc3RyaW5nO1xuXHRlbnRpdHlUeXBlTmFtZTogc3RyaW5nO1xuXHRzb3J0Q29uZGl0aW9ucz86IFRhYmxlU29ydENvbmRpdGlvbnM7XG5cdGdyb3VwQ29uZGl0aW9ucz86IFRhYmxlR3JvdXBDb25kaXRpb25zO1xuXHRhZ2dyZWdhdGVDb25kaXRpb25zPzogVGFibGVBZ2dyZWdhdGVDb25kaXRpb25zO1xuXHRpbml0aWFsRXhwYW5zaW9uTGV2ZWw/OiBudW1iZXI7XG5cdGFsbG93RHJvcEJldHdlZW5Ob2Rlcz86IGJvb2xlYW47XG5cdGNoYW5nZVNpYmxpbmdGb3JSb290c1N1cHBvcnRlZD86IGJvb2xlYW47XG5cdC8qKiBDcmVhdGUgbmV3IGVudHJpZXMgKi9cblx0Y3JlYXRlOiBDcmVhdGVCZWhhdmlvciB8IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWw7XG5cdHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG5cdHJlcXVpcmVkUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR1cGxvYWRUYWJsZT86IFVwbG9hZFRhYmxlU2V0dGluZ3M7XG59O1xuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFwcCAoZGVmYXVsdCBjYXNlKVxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVCZWhhdmlvciA9IHtcblx0bW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRhcHBlbmQ6IGJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHN0cmluZztcblx0bmF2aWdhdGVUb1RhcmdldD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsTWV0aG9kQ29uZmlnID0ge1xuXHRtb2R1bGVOYW1lOiBzdHJpbmc7XG5cdG1ldGhvZE5hbWU6IHN0cmluZztcbn07XG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIGJ5IG5hdmlnYXRpbmcgdG8gc29tZSB0YXJnZXRcbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCA9IHtcblx0bW9kZTogXCJFeHRlcm5hbFwiO1xuXHRvdXRib3VuZDogc3RyaW5nO1xuXHRvdXRib3VuZERldGFpbDogTmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb25bXCJvdXRib3VuZERldGFpbFwiXTtcbn07XG5leHBvcnQgdHlwZSBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiA9IHtcblx0aXNEZWxldGFibGU6IGJvb2xlYW47XG5cdGlzVXBkYXRhYmxlOiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24gPSB7XG5cdHBhdGhzOiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0fVtdO1xuXHRzaG93Q291bnRzPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRkaXNhYmxlUmVxdWVzdENhY2hlPzogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW47XG5cdGNyZWF0ZUluUGxhY2U/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZTtcblx0b3V0Ym91bmRDcmVhdGlvbj86IHN0cmluZztcblx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogYm9vbGVhbjtcblx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBib29sZWFuO1xuXHRlbmFibGVFeHBvcnQ6IGJvb2xlYW47XG5cdGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xuXHRleHBvcnRTaGVldE5hbWU/OiBzdHJpbmc7XG5cdGVuYWJsZVBhc3RpbmdPZkNvbXB1dGVkUHJvcGVydGllcz86IGJvb2xlYW47XG5cdGZyb3plbkNvbHVtbkNvdW50PzogbnVtYmVyO1xuXHRlbmFibGVDb2x1bW5GcmVlemU/OiBib29sZWFuO1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcj86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGZpbHRlcnM/OiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0dHlwZTogVGFibGVUeXBlO1xuXHRyb3dDb3VudE1vZGU/OiBUYWJsZVJvd0NvdW50TW9kZTtcblx0cm93Q291bnQ/OiBudW1iZXI7XG5cdHNjcm9sbFRocmVzaG9sZD86IG51bWJlcjtcblx0dGhyZXNob2xkPzogbnVtYmVyO1xuXHRwb3BpbkxheW91dD86IFBvcGluTGF5b3V0TW9kZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRpZ25vcmVkRmllbGRzPzogc3RyaW5nO1xuXHRyZWFkT25seT86IGJvb2xlYW47XG5cdGRpc2FibGVDb3B5VG9DbGlwYm9hcmQ/OiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGlubGluZUNyZWF0aW9uUm93Q291bnQ/OiBudW1iZXI7XG5cdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU/OiBib29sZWFuO1xuXHRtYXNzRWRpdDogTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb247XG5cdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogYm9vbGVhbjtcblx0aGFzRGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBib29sZWFuO1xuXHRpc0NvbXBhY3RUeXBlPzogYm9vbGVhbjtcblx0aGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nO1xuXHRpc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGU/OiBib29sZWFuO1xuXHRlbmFibGVBZGRDYXJkVG9JbnNpZ2h0cz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdG5vZGVUeXBlPzoge1xuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdHZhbHVlczogeyB2YWx1ZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW10gfVtdO1xuXHR9O1xuXHRjcmVhdGVFbmFibGVtZW50PzogRXh0ZXJuYWxNZXRob2RDb25maWc7XG5cdGlzTm9kZU1vdmFibGU/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNOb2RlQ29weWFibGU/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQ/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0aXNDb3B5VG9Qb3NpdGlvbkFsbG93ZWQ/OiBFeHRlcm5hbE1ldGhvZENvbmZpZztcblx0c2VsZWN0aW9uQ2hhbmdlPzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzPzogc3RyaW5nW107XG5cdHJvd1ByZXNzPzogc3RyaW5nO1xuXHRiZWZvcmVSZWJpbmRUYWJsZT86IHN0cmluZztcblx0ZXhwb3J0UmVxdWVzdFNpemU/OiBudW1iZXI7XG5cdGVuYWJsZVVwbG9hZFBsdWdpbj86IGJvb2xlYW47XG5cdG1vZGVGb3JOb0RhdGFNZXNzYWdlPzogc3RyaW5nO1xuXHRhbmFseXRpY2FsQ29uZmlndXJhdGlvbj86IEFuYWx5dGljYWxDb25maWd1cmF0aW9uO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCIgfCBcIlJlc3BvbnNpdmVUYWJsZVwiIHwgXCJBbmFseXRpY2FsVGFibGVcIiB8IFwiVHJlZVRhYmxlXCI7XG5leHBvcnQgdHlwZSBUYWJsZVJvd0NvdW50TW9kZSA9IFwiQXV0b1wiIHwgXCJGaXhlZFwiIHwgXCJJbnRlcmFjdGl2ZVwiO1xuZXhwb3J0IHR5cGUgUG9waW5MYXlvdXRNb2RlID0gXCJCbG9ja1wiIHwgXCJHcmlkTGFyZ2VcIiB8IFwiR3JpZFNtYWxsXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gRXh0ZW5zaW9uRm9yQW5hbHl0aWNzICYge1xuXHRmcm9tR3JvdXBhYmxlUHJvcGVydHk6IGJvb2xlYW47XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGU7XG5cdGFubm90YXRpb246IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb247XG5cdGNvbnRyb2w6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW107XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xuXHRhbmFseXRpY3NFeHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+O1xuXHRyZXF1ZXN0QXRMZWFzdDogUmVxdWVzdEF0TGVhc3Q7XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUJhc2ljU2VhcmNoPzogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcblx0aGVhZGVySW5mb1RpdGxlOiBzdHJpbmc7XG5cdHNlbWFudGljS2V5czogc3RyaW5nW107XG5cdGhlYWRlckluZm9UeXBlTmFtZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8U3RyaW5nPiB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlJHNlbGVjdDogYm9vbGVhbjtcblx0ZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0OiBib29sZWFuO1xuXHRpc0luc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG5cdGhlYWRlcj86IHN0cmluZztcblx0aGVhZGVyVmlzaWJsZT86IGJvb2xlYW47XG5cdGhhbmRsZVBhdGNoU2VudDogYm9vbGVhbjtcblx0ZGlzYWJsZU93blJlcXVlc3RPbk1WRj86IGJvb2xlYW47IC8vIFRvIGRpc2FibGUgdGhlICQkb3duUmVxdWVzdCBvbiBNdWx0aVZhbHVlRmllbGRzIGxpc3QgYmluZGluZ1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBzdGFuZGFyZCwgYW5ub3RhdGlvbi1iYXNlZCwgYW5kIG1hbmlmZXN0LWJhc2VkIHRhYmxlIGFjdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyBUaGUgY29tcGxldGUgdGFibGUgYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBY3Rpb25zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uczogU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbltcInN0YW5kYXJkQWN0aW9uc1wiXSxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQ29tYmluZWRBY3Rpb24ge1xuXHQvLyAxLiBHZXQgYWN0aW9ucyBmcm9tIGFubm90YXRpb25zXG5cdGNvbnN0IHRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdC8vIDIuIEdldCBhY3Rpb25zIGZyb20gbWFuaWZlc3Rcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zIGFzIFJlY29yZDxcblx0XHRcdHN0cmluZyxcblx0XHRcdE1hbmlmZXN0QWN0aW9uXG5cdFx0Pixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHRydWVcblx0KTtcblx0Ly8gVGhlIFwiQ29weVwiIGFjdGlvbiBhbHdheXMgbmVlZHMgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBcIkNyZWF0ZVwiIGFjdGlvbiwgc28gd2UgbmVlZCB0byBzZXBhcmF0ZSBpdFxuXHRjb25zdCBjb3B5QWN0aW9ucyA9IHRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnMuZmlsdGVyKChhKSA9PiBhLnR5cGUgPT09IEFjdGlvblR5cGUuQ29weSk7XG5cdGNvbnN0IGFubm90YXRpb25BY3Rpb25zID0gdGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucy5maWx0ZXIoKGEpID0+IGEudHlwZSAhPT0gQWN0aW9uVHlwZS5Db3B5KTtcblx0Ly8gQ29tYmluZSBzdGFuZGFyZCwgYW5ub3RhdGlvbiwgYW5kIGN1c3RvbSBhY3Rpb25zIHRvZ2V0aGVyLCByZXNwZWN0aW5nIHRoZSBmaXhlZCBvcmRlciBvZiBzdGFuZGFyZCBhY3Rpb25zXG5cdGNvbnN0IGFubm90YXRpb25BbmRTdGFuZGFyZEFjdGlvbnMgPSAoXG5cdFx0W1xuXHRcdFx0Li4uYW5ub3RhdGlvbkFjdGlvbnMsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuY3JlYXRlLFxuXHRcdFx0Li4uY29weUFjdGlvbnMsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuZGVsZXRlLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLm1hc3NFZGl0LFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmluc2lnaHRzLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmNyZWF0aW9uUm93LCAvLyBOb3QgdGVtcGxhdGVkIGFzIGEgYnV0dG9uXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMuY3V0LFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLmNvcHksXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMucGFzdGUsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnMubW92ZVVwLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zLm1vdmVEb3duXG5cdFx0XSBhcyBCYXNlQWN0aW9uW11cblx0KS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uICE9PSB1bmRlZmluZWQpO1xuXHQvLyBBbmNob3IgYWxsIG5vbi1hbmNob3JlZCBtYW5pZmVzdCBjdXN0b20gYWN0aW9ucy9tZW51cyBiZWZvcmUgdGhlIHN0YW5kYXJkIGFjdGlvbnNcblx0Zm9yIChjb25zdCBtYW5pZmVzdEFjdGlvbiBvZiBPYmplY3QudmFsdWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKSkge1xuXHRcdGlmICgobWFuaWZlc3RBY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5EZWZhdWx0IHx8IG1hbmlmZXN0QWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkgJiYgIW1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uPy5hbmNob3IpIHtcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uID0ge1xuXHRcdFx0XHRhbmNob3I6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGUsXG5cdFx0XHRcdHBsYWNlbWVudDogUGxhY2VtZW50LkJlZm9yZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0Ly8gSW5zZXJ0IHR3aWNlIHRvIGFsbG93IHJlZ3VsYXIgb3ZlcnJpZGUgZm9yIG5vbi1zdGFuZGFyZCBhY3Rpb25zIGFuZCBwb3NpdGlvbmFsIG92ZXJyaWRlIGZvciBzdGFuZGFyZCBhY3Rpb25zXG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKTtcblx0Y29uc3Qgc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMobWFuaWZlc3RBY3Rpb25FbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKFwiU3RhbmRhcmRBY3Rpb246OlwiKSkpO1xuXHRjb25zdCBub25TdGFuZGFyZE1hbmlmZXN0QWN0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhtYW5pZmVzdEFjdGlvbkVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4gIXN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zW2tleV0pKTtcblx0Y29uc3QgYWN0aW9uT3ZlcndyaXRlQ29uZmlnOiBPdmVycmlkZVR5cGVBY3Rpb24gPSB7XG5cdFx0aXNOYXZpZ2FibGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlT25TZWxlY3Q6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZW5hYmxlQXV0b1Njcm9sbDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRlbmFibGVkOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdHZpc2libGU6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGNvbW1hbmQ6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0cG9zaXRpb246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0bWVudTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRwcmlvcml0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRncm91cDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRvdmVyZmxvd0dyb3VwOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZVxuXHR9O1xuXHQvLyAzLiBHZXQgYWxsIGFubm90YXRpb24gbWVudSBpdGVtc1xuXHRjb25zdCBhbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zID0gZ2V0QW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyhhbm5vdGF0aW9uQWN0aW9ucyk7XG5cdC8vIDQuIEZpbmQgbWFuaWZlc3QgYWN0aW9ucyB3aGljaCBvdmVycmlkZSBhbnkgYW5ub3RhdGlvbiBtZW51IGl0ZW1zXG5cdGNvbnN0IG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zID0gZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbihhbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zLCBtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucyk7XG5cdC8vIDUuIEdldCBvdmVycmlkZGVuIGFubm90YXRpb24gbWVudSBpdGVtc1xuXHRjb25zdCBvdmVyd3JpdHRlbk1lbnVBY3Rpb25JdGVtcyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25NZW51QWN0aW9uSXRlbXMsIG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zLCBhY3Rpb25PdmVyd3JpdGVDb25maWcpO1xuXHQvLyA2LiBPdmVycmlkZSBhbGwgYWN0aW9uc1xuXHRsZXQgYWN0aW9ucyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25BbmRTdGFuZGFyZEFjdGlvbnMsIG5vblN0YW5kYXJkTWFuaWZlc3RBY3Rpb25zLCBhY3Rpb25PdmVyd3JpdGVDb25maWcpIGFzIEN1c3RvbUFjdGlvbltdO1xuXHRhY3Rpb25zID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYWN0aW9ucywgc3RhbmRhcmRNYW5pZmVzdEFjdGlvbnMsIHtcblx0XHRwb3NpdGlvbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRwcmlvcml0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRncm91cDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZVxuXHR9KTtcblx0Ly8gNy4gUmVwbGFjZSBvcmlnaW5hbCBtZW51IGl0ZW1zIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBvdmVycmlkZGVuIG1lbnUgaXRlbXNcblx0cHJlcGFyZU1lbnVBY3Rpb25zKGFjdGlvbnMsIG92ZXJ3cml0dGVuTWVudUFjdGlvbkl0ZW1zKTtcblx0Ly8gOC4gUmVtb3ZlIGR1cGxpY2F0ZSBhY3Rpb25zIHdoaWNoIGFyZSBtZW51IGl0ZW1zXG5cdGFjdGlvbnMgPSByZW1vdmVEdXBsaWNhdGVBY3Rpb25zKGFjdGlvbnMpO1xuXHQvLyA5LiBBZGQgdGhlIGNvbGxhYm9yYXRpb24gY29uZGl0aW9uIGZvciBhY3Rpb25zIG90aGVyIHRoYW4gbmF2aWdhdGlvblxuXHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZXJDb250ZXh0KSkge1xuXHRcdGFkZENvbGxhYm9yYXRpb25Db25kaXRpb24oYWN0aW9ucyk7XG5cdH1cblx0Ly8gMTAuIEhpZGUgbWVudXMgd2hlcmUgYWxsIG1lbnUgaXRlbXMgYXJlIGhpZGRlblxuXHRhY3Rpb25zID0gZ2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyhhY3Rpb25zKTtcblx0Ly8gMTEuIEFkZCBzZXBhcmF0b3JzIGJhc2VkIG9uIGFjdGlvbkdyb3VwcyBjb25maWd1cmF0aW9uXG5cdGNvbnN0IG92ZXJmbG93R3JvdXBzQ29uZmlnID1cblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKT8ub3ZlcmZsb3dHcm91cHM7XG5cdGFjdGlvbnMgPSBhZGRTZXBhcmF0b3JzKGFjdGlvbnMsIG92ZXJmbG93R3JvdXBzQ29uZmlnKSBhcyBDdXN0b21BY3Rpb25bXTtcblxuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IGFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IG1hbmlmZXN0QWN0aW9ucy5jb21tYW5kQWN0aW9uc1xuXHR9O1xufVxuXG4vL1JldHVybnMgdGhlIENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgZnJvbSB0aGUgY3VzdG9tIGFnZ3JlZ2F0ZSBhbm5vdGF0aW9uIG9yIGZyb20gdGhlIGFnZ3JlZ2F0aW9uIGFubm90YXRpb24gb24gdGhlIHByb3BlcnR5IGl0c2VsZi5cbmZ1bmN0aW9uIGdldENvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb25Bbm5vdGF0aW9uKGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcik6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XG5cdGNvbnN0IGN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMoKTtcblx0Y29uc3QgY3VzdG9tQWdncmVnYXRlZGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXHRjdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG5cdFx0Y29uc3QgYWdncmVnYXRlZFByb3BlcnR5ID0gYWdncmVnYXRpb25IZWxwZXIuX2VudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Lm5hbWUgPT09IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdH0pO1xuXHRcdGlmIChhZ2dyZWdhdGVkUHJvcGVydHkpIHtcblx0XHRcdGNvbnN0IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPVxuXHRcdFx0XHRhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcyA/P1xuXHRcdFx0XHRhZ2dyZWdhdGVkUHJvcGVydHkuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRjdXN0b21BZ2dyZWdhdGVkZWZpbml0aW9uc1thZ2dyZWdhdGVkUHJvcGVydHkubmFtZV0gPVxuXHRcdFx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPy5tYXAoKGN0eERlZlByb3BlcnR5KSA9PiBjdHhEZWZQcm9wZXJ0eS52YWx1ZSkgPz8gW107XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGN1c3RvbUFnZ3JlZ2F0ZWRlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBhZ2dyZWdhYmxlIHByb3BlcnRpZXMgLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgZG9lc24ndCBzdXBwb3J0IGFuYWx5dGljYWwgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFJlY29yZDxzdHJpbmcsIEludGVybmFsRXh0ZW5zaW9uRm9yQW5hbHl0aWNzPiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgY3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgdGFibGVDb2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmICh0YWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRjb25zdCB0YXJnZXRVbml0UHJvcGVydHkgPSB0YWJsZUNvbHVtbnMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSB0YWJsZUNvbHVtbi51bml0KSBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuYWRkKHRhcmdldFVuaXRQcm9wZXJ0eS5yZWxhdGl2ZVBhdGgpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNGcm9tQWdncmVnYXRpb24gPSBnZXRDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uQW5ub3RhdGlvbihhZ2dyZWdhdGlvbkhlbHBlcik7XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSW50ZXJuYWxFeHRlbnNpb25Gb3JBbmFseXRpY3M+ID0ge307XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgIT09IHVuZGVmaW5lZCB8fCAhdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHQvLyBJZ25vcmUgY29tcGxleCBjb2x1bW5zXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzRnJvbUFnZ3JlZ2F0aW9uW3RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aF0gYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cblx0XHQvLyBpZiB0aGVyZSBpcyBubyBjdXN0b20gYWdncmVnYXRlIGRlZmluaXRpb24sIGFuZCB0aGUgcHJvcGVydHkgaXMgZ3JvdXBhYmxlLCB0aGVuIHdlIGNhbiB1c2UgdGhlIGRlZmF1bHQgY29udGV4dCBkZWZpbmluZyBwcm9wZXJ0aWVzXG5cdFx0bGV0IGZyb21Hcm91cGFibGVQcm9wZXJ0eSA9IGZhbHNlO1xuXHRcdGlmICghcmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJiBwcm9wZXJ0eSAmJiAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpKSB7XG5cdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHkgPSB0cnVlO1xuXHRcdFx0cmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyA9IHByb3BlcnR5LmFubm90YXRpb25zLkFnZ3JlZ2F0aW9uPy5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChjdHhEZWZQcm9wZXJ0eSkgPT4gY3R4RGVmUHJvcGVydHkudmFsdWVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFyYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIHx8IGN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXModGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSkge1xuXHRcdFx0Ly8gSWdub3JlIGFnZ3JlZ2F0ZXMgY29ycmVzcG9uZGluZyB0byBjdXJyZW5jaWVzIG9yIHVuaXRzIG9mIG1lYXN1cmVcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXN1bHRbdGFibGVDb2x1bW4ubmFtZV0gPSB7XG5cdFx0XHRmcm9tR3JvdXBhYmxlUHJvcGVydHk6IGZyb21Hcm91cGFibGVQcm9wZXJ0eSxcblx0XHRcdHJlbGF0aXZlUGF0aDogdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoXG5cdFx0fTtcblx0XHRjb25zdCBjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMuZm9yRWFjaCgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHQvLyBJZ25vcmUgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVuY2llcyBvciB1bml0cyBvZiBtZWFzdXJlIG9mIGFnZ3JlZ2F0YWJsZSBwcm9wZXJ0aWVzXG5cdFx0XHQvLyAoYnV0IHRoaXMgaXMgYWxsb3dlZCBmb3IgZ3JvdXBhYmxlIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIWZyb21Hcm91cGFibGVQcm9wZXJ0eSAmJiBjdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuaGFzKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmb3VuZENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKGZvdW5kQ29sdW1uKSB7XG5cdFx0XHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMucHVzaChmb3VuZENvbHVtbi5uYW1lKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoY29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdHJlc3VsdFt0YWJsZUNvbHVtbi5uYW1lXS5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvclR5cGUoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcbik6IHZvaWQge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGdldEV4dGVuc2lvbkluZm9Gcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EYXRhKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGUkc2VsZWN0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyA9IGFnZ3JlZ2F0aW9uRGF0YTtcblx0XHRcdF91cGRhdGVQcm9wZXJ0eUluZm9zV2l0aEFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyh0YWJsZVZpc3VhbGl6YXRpb24pO1xuXHRcdFx0Y29uc3QgYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMoKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdFx0KTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uRGF0YVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLmVycm9yKGBBZ2dyZWdhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGVudGl0eSB0eXBlOiAke2VudGl0eVR5cGUubmFtZX1gKTtcblx0XHR9XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9IFwiR3JpZFRhYmxlXCI7IC8vIEFuYWx5dGljYWxUYWJsZSBpc24ndCBhIHJlYWwgdHlwZSBmb3IgdGhlIE1EQzpUYWJsZSwgc28gd2UgYWx3YXlzIHN3aXRjaCBiYWNrIHRvIEdyaWRcblx0fSBlbHNlIGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uZ3JvdXBDb25kaXRpb25zID0gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGVcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRjb25zdCBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpO1xuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVCYXNpY1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluY2x1ZGVzKFwic2VhcmNoXCIpIDogdHJ1ZTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlJCRnZXRLZWVwQWxpdmVDb250ZXh0ID0gdHJ1ZTtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5jaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPSAoZW50aXR5VHlwZT8uYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bXG5cdFx0XHRgUmVjdXJzaXZlSGllcmFyY2h5QWN0aW9ucyMke3RhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLmhpZXJhcmNoeVF1YWxpZmllciA/PyBcIlwifWBcblx0XHRdPy5DaGFuZ2VTaWJsaW5nRm9yUm9vdHNTdXBwb3J0ZWQgPz8gdHJ1ZSkgYXMgYm9vbGVhbjtcblxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFsbG93RHJvcEJldHdlZW5Ob2RlcyA9XG5cdFx0XHQhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bYFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHt0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5oaWVyYXJjaHlRdWFsaWZpZXIgPz8gXCJcIn1gXVxuXHRcdFx0XHQ/LkNoYW5nZU5leHRTaWJsaW5nQWN0aW9uO1xuXHR9XG5cblx0Ly8gU29tZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgbG9hZGVkIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGJ5IG91ciBpbnRlcm5hbCBsb2dpY1xuXHQvLyAtIEhhc0FjdGl2ZUVudGl0eSBpcyBuZWVkZWQgZm9yIHRoZSByb3cgY3JpdGljYWxpdHkgZXhwcmVzc2lvblxuXHQvLyAtIEhhc0RyYWZ0RW50aXR5IGlzIG5lZWRlZCBpbiBMUiB3aXRoIFRyZWVUYWJsZSBhbmQgQW5hbHl0aWNhbCBUYWJsZSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgaWYgdGhlcmUncyBvbmUgd2hlbiBjbGlja2luZyBvbiB0aGUgYWN0aXZlIGluc3RhbmNlXG5cdC8vIC0gSGFzRHJhZnRFbnRpdHkgYW5kIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciBhcmUgbmVlZGVkIGluIHRoZSBMUiBmb3IgdGhlIGRlbGV0ZSBsb2dpY1xuXHRpZiAoTW9kZWxIZWxwZXIuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpKSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiSGFzQWN0aXZlRW50aXR5XCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC5hbmFseXRpY2FsQ29uZmlndXJhdGlvbj8uYWdncmVnYXRpb25PbkxlYWZMZXZlbCkge1xuXHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkga2V5IGlzIG5lZWRlZCBmb3IgbmF2aWdhdGlvbiB0byB0aGUgZHJhZnQgaW5zdGFuY2Vcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5yZXF1ZXN0QXRMZWFzdFtcIklzQWN0aXZlRW50aXR5XCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdH1cblxuXHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSkge1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiSGFzRHJhZnRFbnRpdHlcIl0gPSBbXCJkcmFmdEtleXNcIl07XG5cdFx0XHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAhPT0gdHJ1ZSAmJiB0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlICE9PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0XHRcdC8vIFdlIGRvbid0IGxvYWQgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgZm9yIEFuYWx5dGljYWwgYW5kIFRyZWUgdGFibGVzIGluIExSIGJlY2F1c2UgdGhleSBkaXNwbGF5IGFjdGl2ZSBpbnN0YW5jZXMgb25seVxuXHRcdFx0XHQvLyAodGhlcmVmb3JlIG5vIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvSW5Qcm9jZXNzQnlVc2VyXCJdID0gW1wiZHJhZnRLZXlzXCJdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZXJDb250ZXh0KSAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNGY2xFbmFibGVkKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLnJlcXVlc3RBdExlYXN0W1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIl0gPSBbXCJkcmFmdEtleXNcIl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wuZW5hYmxlVXBsb2FkUGx1Z2luKSB7XG5cdFx0Y29uc3Qgc3RyZWFtUHJvcGVydHkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnM/LlVJPy5NZWRpYVJlc291cmNlPy5TdHJlYW0/LiR0YXJnZXQ7XG5cdFx0aWYgKCFzdHJlYW1Qcm9wZXJ0eSkge1xuXHRcdFx0dGhyb3cgXCJVSS5NZWRpYVJlc291cmNlIGFubm90YXRpb24gd2l0aCBTdHJlYW0gcHJvcGVydHkgbWlzc2luZ1wiO1xuXHRcdH1cblxuXHRcdC8vIHRoZSB1cGxvYWQgYWN0aW9uIGlzIHRyZWF0ZWQgYXMgdGhlIGNyZWF0ZSBhY3Rpb25cblx0XHRjb25zdCB1cGxvYWRBY3Rpb24gPSB0YWJsZVZpc3VhbGl6YXRpb24uYWN0aW9ucy5maW5kKChhKSA9PiBhLmtleSA9PT0gU3RhbmRhcmRBY3Rpb25LZXlzLkNyZWF0ZSkgYXMgU3RhbmRhcmRBY3Rpb247XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi51cGxvYWRUYWJsZSA9IHtcblx0XHRcdHN0cmVhbTogc3RyZWFtUHJvcGVydHkubmFtZSxcblx0XHRcdGZpbGVOYW1lOiAoc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQ29udGVudERpc3Bvc2l0aW9uPy5GaWxlbmFtZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiB8IHVuZGVmaW5lZCk/LnBhdGgsXG5cdFx0XHRmaWxlTmFtZU1heExlbmd0aDogc3RyZWFtUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29yZT8uQ29udGVudERpc3Bvc2l0aW9uPy5GaWxlbmFtZT8uJHRhcmdldD8ubWF4TGVuZ3RoLFxuXHRcdFx0YWNjZXB0YWJsZU1lZGlhVHlwZXM6IHN0cmVhbVByb3BlcnR5LmFubm90YXRpb25zLkNvcmU/LkFjY2VwdGFibGVNZWRpYVR5cGVzLFxuXHRcdFx0bWF4TGVuZ3RoOiBzdHJlYW1Qcm9wZXJ0eS5tYXhMZW5ndGgsXG5cdFx0XHR1cGxvYWRBY3Rpb246IHVwbG9hZEFjdGlvblxuXHRcdH07XG5cdH1cblxuXHQvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGluIGEgTGlzdFJlcG9ydCwgZm9yIGEgbm9uLWFuYWx5dGljYWwgdGFibGUgdGhhdCBpcyBjb21wbGV0ZWx5IHJlYWQtb25seSAobm8gZWRpdCBkcmFmdC9zdGlja3ksIG5vIGFjdGlvbnMpLFxuXHQvLyB0aGUgbXVsdGktdmFsdWUgZmllbGRzIGRvbid0IGhhdmUgdGhlaXIgb3duIHJlcXVlc3Rcblx0Y29uc3QgdmlzaWJsZUFjdGlvbnMgPSB0YWJsZVZpc3VhbGl6YXRpb24uYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnZpc2libGUgIT09IFwiZmFsc2VcIik7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdCFNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSkgJiZcblx0XHQhTW9kZWxIZWxwZXIuaXNTdGlja3koY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgJiZcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICE9PSB0cnVlICYmXG5cdFx0dmlzaWJsZUFjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4ge1xuXHRcdFx0cmV0dXJuIGFjdGlvbi5rZXkuc3RhcnRzV2l0aChcIlN0YW5kYXJkQWN0aW9uOjpcIik7XG5cdFx0fSlcblx0KSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmRpc2FibGVPd25SZXF1ZXN0T25NVkYgPSB0cnVlO1xuXHR9XG59XG5cbnR5cGUgZmllbGRPcmlnaW4gPVxuXHR8IFwic2VtYW50aWNLZXlcIlxuXHR8IFwicmVzdHJpY3Rpb25cIlxuXHR8IFwic2Vjb25kYXJ5S2V5XCJcblx0fCBcInByZXNlbnRhdGlvblZhcmlhbnRcIlxuXHR8IFwibmF2aWdhdGlvblwiXG5cdHwgXCJvcGVyYXRpb25cIlxuXHR8IFwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5c1wiXG5cdHwgXCJkcmFmdEtleXNcIjtcbmV4cG9ydCB0eXBlIFJlcXVlc3RBdExlYXN0ID0gUmVjb3JkPHN0cmluZywgZmllbGRPcmlnaW5bXT47XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHNlbGVjdCBxdWVyeSB3aXRoIHRoZSBzZWxlY3RlZCBmaWVsZHMgZnJvbSB0aGUgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkLlxuICogQHBhcmFtIGxpbmVJdGVtIFRoZSBMaW5lSXRlbSB3ZSB3YW50IHRoZSByZXF1ZXN0ZWQgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIG9wZXJhdGlvbkF2YWlsYWJsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0aW9uLCB3aGljaCB3ZSdsbCB0YWtlIHRoZSBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgc2VsZWN0IHF1ZXJ5LlxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uIHdoaWNoIHdlJ2xsIHRha2UgdGhlIFJlcXVlc3RBdExlYXN0IHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSAnc2VsZWN0JyBxdWVyeSB0aGF0IGhhcyB0aGUgc2VsZWN0ZWQgZmllbGRzIGZyb20gdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RlZFByb3BlcnRpZXMoXG5cdGxpbmVJdGVtOiBMaW5lSXRlbSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0b3BlcmF0aW9uQXZhaWxhYmxlPzogc3RyaW5nLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlXG4pOiBSZXF1ZXN0QXRMZWFzdCB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtKTtcblx0Y29uc3Qgc2VsZWN0ZWRGaWVsZHM6IFJlcXVlc3RBdExlYXN0ID0ge307XG5cdGZ1bmN0aW9uIHB1c2hGaWVsZChmaWVsZE5hbWU6IHN0cmluZywgb3JpZ2luOiBmaWVsZE9yaWdpbik6IHZvaWQge1xuXHRcdGlmIChmaWVsZE5hbWUgJiYgZmllbGROYW1lLmluZGV4T2YoXCIvXCIpICE9PSAwKSB7XG5cdFx0XHQvLyBEbyBub3QgYWRkIHNpbmdsZXRvbiBwcm9wZXJ0eSAod2l0aCBhYnNvbHV0ZSBwYXRoKSB0byAkc2VsZWN0XG5cdFx0XHRpZiAoIXNlbGVjdGVkRmllbGRzW2ZpZWxkTmFtZV0pIHtcblx0XHRcdFx0c2VsZWN0ZWRGaWVsZHNbZmllbGROYW1lXSA9IFtvcmlnaW5dO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZWN0ZWRGaWVsZHNbZmllbGROYW1lXS5wdXNoKG9yaWdpbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaEZpZWxkTGlzdChmaWVsZHM6IHN0cmluZ1tdLCBvcmlnaW46IGZpZWxkT3JpZ2luKTogdm9pZCB7XG5cdFx0aWYgKGZpZWxkcz8ubGVuZ3RoKSB7XG5cdFx0XHRmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHB1c2hGaWVsZChmaWVsZCwgb3JpZ2luKSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyA9IChvcGVyYXRpb25BdmFpbGFibGUgfHwgXCJcIikuc3BsaXQoXCIsXCIpO1xuXHRjb25zdCB2YWxpZFByb3BlcnRpZXMgPSBvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAocHJvcE5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BOYW1lKTtcblx0fSk7XG5cdGNvbnN0IHNlbWFudGljS2V5czogc3RyaW5nW10gPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5IHx8IFtdKS5tYXAoKHNlbWFudGljS2V5KSA9PiBzZW1hbnRpY0tleS52YWx1ZSk7XG5cdGNvbnN0IGNhcGFiaWxpdGllc0Fubm90YXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzO1xuXHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpIGFzIEVudGl0eVNldCk7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdHB1c2hGaWVsZExpc3QocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uUmVxdWVzdEF0TGVhc3Q/Lm1hcCgocHJvcGVydHlQYXRoKSA9PiBwcm9wZXJ0eVBhdGgudmFsdWUpLCBcInByZXNlbnRhdGlvblZhcmlhbnRcIik7XG5cdH1cblx0cHVzaEZpZWxkTGlzdChnZXROYXZpZ2F0aW9uQXZhaWxhYmxlRmllbGRzRnJvbUxpbmVJdGVtKGxpbmVJdGVtLCBlbnRpdHlUeXBlKSwgXCJuYXZpZ2F0aW9uXCIpO1xuXHRwdXNoRmllbGRMaXN0KHZhbGlkUHJvcGVydGllcywgXCJvcGVyYXRpb25cIik7XG5cdHB1c2hGaWVsZExpc3Qoc2VtYW50aWNLZXlzLCBcInNlbWFudGljS2V5XCIpO1xuXHRwdXNoRmllbGRMaXN0KGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMsIFwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5c1wiKTtcblx0aWYgKGNhcGFiaWxpdGllc0Fubm90YXRpb24pIHtcblx0XHRwdXNoRmllbGQoKGNhcGFiaWxpdGllc0Fubm90YXRpb24uRGVsZXRlUmVzdHJpY3Rpb25zPy5EZWxldGFibGUgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPGJvb2xlYW4+KT8ucGF0aCwgXCJyZXN0cmljdGlvblwiKTtcblx0fVxuXHRjb25zdCB1cGRhdGVQcm9wZXJ0eUluZm8gPSBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aEluZm8oY29udmVydGVyQ29udGV4dCk7XG5cdGlmICh1cGRhdGVQcm9wZXJ0eUluZm8/LnBhdGhzKSB7XG5cdFx0cHVzaEZpZWxkTGlzdCh1cGRhdGVQcm9wZXJ0eUluZm8ucGF0aHMsIFwicmVzdHJpY3Rpb25cIik7XG5cdH1cblxuXHRyZXR1cm4gc2VsZWN0ZWRGaWVsZHM7XG59XG5cbi8qKlxuICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSB0aGF0IGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgTmF2aWdhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uIG9uIElCTiBGaWVsZHMuXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGxpbmUgaXRlbSBhbm5vdGF0aW9uLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIEVudGl0eSBUeXBlLlxuICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uQXZhaWxhYmxlRmllbGRzRnJvbUxpbmVJdGVtKGxpbmVJdGVtOiBMaW5lSXRlbSwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc2VsZWN0ZWRGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cdGxpbmVJdGVtLmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCkge1xuXHRcdGlmIChcblx0XHRcdHJlY29yZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uICYmXG5cdFx0XHQhcmVjb3JkLklubGluZSAmJlxuXHRcdFx0IXJlY29yZC5EZXRlcm1pbmluZyAmJlxuXHRcdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ocmVjb3JkLk5hdmlnYXRpb25BdmFpbGFibGUpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBwYXRoID0gKHJlY29yZC5OYXZpZ2F0aW9uQXZhaWxhYmxlIGFzIHVua25vd24gYXMgeyBwYXRoOiBzdHJpbmcgfSkucGF0aDtcblx0XHRcdGlmIChlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhdGgpKSB7XG5cdFx0XHRcdHNlbGVjdGVkRmllbGRzLnB1c2gocGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNlbGVjdGVkRmllbGRzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmF2aWdhdGlvbiB0YXJnZXQgcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoIHRvIGNoZWNrIGluIHRoZSBtYW5pZmVzdCBzZXR0aW5nc1xuICogQHJldHVybnMgTmF2aWdhdGlvbiBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PiwgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpKSB7XG5cdFx0Y29uc3QgbmF2Q29uZmlnID0gbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhuYXZDb25maWcpLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdH1cblx0fVxuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBuYXZDb25maWdGb3JDb250ZXh0UGF0aCA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihjb250ZXh0UGF0aCk7XG5cdGlmIChuYXZDb25maWdGb3JDb250ZXh0UGF0aCAmJiBPYmplY3Qua2V5cyhuYXZDb25maWdGb3JDb250ZXh0UGF0aCkubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBjb250ZXh0UGF0aDtcblx0fVxuXHRyZXR1cm4gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQgPyBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lIDogZGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTZW1hbnRpY0tleXNBbmRUaXRsZUluZm8oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KToge1xuXHRoZWFkZXJJbmZvVGl0bGVQYXRoOiBzdHJpbmc7XG5cdHNlbWFudGljS2V5Q29sdW1uczogc3RyaW5nW107XG5cdGhlYWRlckluZm9UeXBlTmFtZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8U3RyaW5nPiB8IHVuZGVmaW5lZDtcbn0ge1xuXHRjb25zdCBoZWFkZXJJbmZvVGl0bGVQYXRoID0gKGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlXG5cdFx0Py5wYXRoO1xuXHRjb25zdCBzZW1hbnRpY0tleUFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY0tleTtcblx0Y29uc3QgaGVhZGVySW5mb1R5cGVOYW1lID0gY29udmVydGVyQ29udGV4dD8uZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZTtcblx0Y29uc3Qgc2VtYW50aWNLZXlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoc2VtYW50aWNLZXlBbm5vdGF0aW9ucykge1xuXHRcdHNlbWFudGljS2V5QW5ub3RhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0NvbHVtbikge1xuXHRcdFx0c2VtYW50aWNLZXlDb2x1bW5zLnB1c2gob0NvbHVtbi52YWx1ZSk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHsgaGVhZGVySW5mb1RpdGxlUGF0aCwgc2VtYW50aWNLZXlDb2x1bW5zLCBoZWFkZXJJbmZvVHlwZU5hbWUgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cGFyYW1zPzogUGFydGlhbDx7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlO1xuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZTtcblx0XHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50OiBib29sZWFuO1xuXHR9PlxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgeyBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiwgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCwgc2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24gfSA9IHBhcmFtcyA/PyB7fTtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQsXG5cdFx0c2VsZWN0aW9uVmFyaWFudEFubm90YXRpb25cblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uID0gZ2V0U3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCB0YWJsZUFubm90YXRpb24gPSBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0Y29sdW1ucyxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbixcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXHRjb25zdCB0YWJsZUFjdGlvbnMgPSBnZXRUYWJsZUFjdGlvbnMoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5zdGFuZGFyZEFjdGlvbnMsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzXG5cdCk7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZSA9IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0bGV0IGhlYWRlciA9IHRhYmxlTWFuaWZlc3RDb25maWcuaGVhZGVyO1xuXHRoZWFkZXIgPz89IHRhYmxlQW5ub3RhdGlvbi50aXRsZSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IHRhYmxlQW5ub3RhdGlvbi50aXRsZTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiB0YWJsZUFubm90YXRpb24sXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiB0YWJsZUFjdGlvbnMuYWN0aW9ucyxcblx0XHRjb21tYW5kQWN0aW9uczogdGFibGVBY3Rpb25zLmNvbW1hbmRBY3Rpb25zLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IG9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1ucyxcblx0XHRoZWFkZXJJbmZvVHlwZU5hbWU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVHlwZU5hbWUsXG5cdFx0ZW5hYmxlJHNlbGVjdDogdHJ1ZSxcblx0XHRlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQ6IHRydWUsXG5cdFx0aGVhZGVyOiBoZWFkZXIsXG5cdFx0aGVhZGVyVmlzaWJsZTogdGFibGVNYW5pZmVzdENvbmZpZy5oZWFkZXJWaXNpYmxlLFxuXHRcdHJlcXVlc3RBdExlYXN0OiBjcmVhdGVSZXF1ZXN0ZWRQcm9wZXJ0aWVzKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCwgb3BlcmF0aW9uQXZhaWxhYmxlLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiksXG5cdFx0aGFuZGxlUGF0Y2hTZW50OiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHR9O1xuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQsIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JUeXBlKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGlzQmxhbmtUYWJsZT86IGJvb2xlYW5cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHR7fSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRbXSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLmNyZWF0aW9uTW9kZSxcblx0XHR7fVxuXHQpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIFwiXCIpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IGdldFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24oXG5cdFx0dW5kZWZpbmVkLFxuXHRcdFwiXCIsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcIlwiLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0XHRpc0JsYW5rVGFibGUgPyBbXSA6IGNvbHVtbnMsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IFtdLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1ucyxcblx0XHRoZWFkZXJJbmZvVHlwZU5hbWU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVHlwZU5hbWUsXG5cdFx0ZW5hYmxlJHNlbGVjdDogdHJ1ZSxcblx0XHRlbmFibGUkJGdldEtlZXBBbGl2ZUNvbnRleHQ6IHRydWUsXG5cdFx0aGVhZGVyOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlcixcblx0XHRoZWFkZXJWaXNpYmxlOiB0YWJsZU1hbmlmZXN0Q29uZmlnLmhlYWRlclZpc2libGUsXG5cdFx0aGFuZGxlUGF0Y2hTZW50OiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHRyZXF1ZXN0QXRMZWFzdDoge31cblx0fTtcblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZShvVmlzdWFsaXphdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgbGluZSBpdGVtXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcmVjb3JkIGNvbnRhaW5pbmcgYWxsIGFjdGlvbiBuYW1lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gQWN0aW9uSGVscGVyLmdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb24sIFwidGFibGVcIiwgY29udmVydGVyQ29udGV4dCk7XG59XG4vKipcbiAqIEdldHMgdXBkYXRhYmxlIHByb3BlcnRpZXMgZm9yIHRoZSBjdXJyZW50IGVudGl0eXNldCwgaWYgdmFsaWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdXBkYXRhYmxlIHByb3BlcnRpZXMgZm9yIHRoZSByb3dzXG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoSW5mbyhcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBVcGRhdGFibGVQcm9wZXJ0eVBhdGhJbmZvIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zID0gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCB1cGRhdGFibGUgPSByZXN0cmljdGlvbnMuaXNVcGRhdGFibGU7XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPSAhaXNDb25zdGFudCh1cGRhdGFibGUuZXhwcmVzc2lvbikgJiYgdXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiO1xuXHRjb25zdCB1cGRhdGFibGVFeHByZXNzaW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlVwZGF0ZVJlc3RyaWN0aW9ucz8uVXBkYXRhYmxlO1xuXHRpZiAoIWlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgfHwgdXBkYXRhYmxlRXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGlzQ29uc3RhbnQodXBkYXRhYmxlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3QgYmluZGluZ0V4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odXBkYXRhYmxlRXhwcmVzc2lvbikpO1xuXHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odXBkYXRhYmxlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YmluZGluZ0V4cHJlc3Npb24sXG5cdFx0XHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjogdHJ1ZSxcblx0XHRcdHBhdGhzOiBbdXBkYXRhYmxlRXhwcmVzc2lvbi5wYXRoXVxuXHRcdH07XG5cdH1cblx0Y29uc3QgYmluZGluZ0luZm8gPSBCaW5kaW5nSW5mby5wYXJzZShjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odXBkYXRhYmxlRXhwcmVzc2lvbikpKTtcblx0Y29uc3QgcGF0aHM6IFNldDxzdHJpbmc+ID0gKGJpbmRpbmdJbmZvLnBhcnRzIGFzIFByb3BlcnR5QmluZGluZ0luZm9bXSkucmVkdWNlKChhY2M6IFNldDxzdHJpbmc+LCBwYXJ0OiBQcm9wZXJ0eUJpbmRpbmdJbmZvKSA9PiB7XG5cdFx0Y29uc3QgcGF0aCA9IHBhcnQucGF0aDtcblx0XHRpZiAocGFydC5tb2RlbCA9PT0gdW5kZWZpbmVkICYmIHBhdGgpIHtcblx0XHRcdGFjYy5hZGQocGF0aCk7XG5cdFx0fVxuXHRcdHJldHVybiBhY2M7XG5cdH0sIG5ldyBTZXQoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb246IGZhbHNlLFxuXHRcdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRcdHBhdGhzOiBBcnJheS5mcm9tKHBhdGhzKVxuXHR9O1xufVxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICogQHBhcmFtIG9wZXJhdGlvbkF2YWlsYWJsZU1hcCBUaGUgcmVjb3JkIGNvbnNpc3Rpbmcgb2YgYWN0aW9ucyBhbmQgdGhlaXIgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXHRmb3IgKGNvbnN0IGFjdGlvbk5hbWUgaW4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwW2FjdGlvbk5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IG51bGwpIHtcblx0XHRcdC8vIEFubm90YXRpb24gY29uZmlndXJlZCB3aXRoIGV4cGxpY2l0ICdudWxsJyAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsZXZhbnQpXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChhY3Rpb25OYW1lKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdC8vIEFkZCBwcm9wZXJ0eSBwYXRocyBhbmQgbm90IENvbnN0YW50IHZhbHVlcy5cblx0XHRcdHByb3BlcnRpZXMuYWRkKHByb3BlcnR5TmFtZSk7XG5cdFx0fVxuXHR9XG5cdGlmIChwcm9wZXJ0aWVzLnNpemUpIHtcblx0XHQvLyBTb21lIGFjdGlvbnMgaGF2ZSBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIGJhc2VkIG9uIHByb3BlcnR5IC0tPiB3ZSBuZWVkIHRvIGxvYWQgdGhlIEhlYWRlckluZm8uVGl0bGUgcHJvcGVydHlcblx0XHQvLyBzbyB0aGF0IHRoZSBkaWFsb2cgb24gcGFydGlhbCBhY3Rpb25zIGlzIGRpc3BsYXllZCBwcm9wZXJseSAoQkNQIDIxODAyNzE0MjUpXG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdGNvbnN0IHRpdGxlUHJvcGVydHkgPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGg7XG5cdFx0aWYgKHRpdGxlUHJvcGVydHkpIHtcblx0XHRcdHByb3BlcnRpZXMuYWRkKHRpdGxlUHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kXG4gKiByZXR1cm5zIGFsbCB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZXhwcmVzc2lvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcmV0dXJucyBBbGwgdGhlIGBVSS5IaWRkZW5gIHBhdGggZXhwcmVzc2lvbnMgZm91bmQgaW4gdGhlIHJlbGV2YW50IGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0Y3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJlxuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkgfHxcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0ICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucy5wdXNoKGVxdWFsKGdldEhpZGRlbkV4cHJlc3Npb25BdFRhYmxlTGV2ZWwoZGF0YUZpZWxkLCBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCksIGZhbHNlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBvZiB0aGUgcGF0aCBvZiBhIERhdGFGaWVsZC5cbiAqIEBwYXJhbSBleHByZXNzaW9uIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldFBhdGhGcm9tQWN0aW9uQW5ub3RhdGlvbihleHByZXNzaW9uOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHBhdGg6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcblx0XHRwYXRoID0gZXhwcmVzc2lvbi5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHBhdGggPSBleHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiBwYXRoO1xufVxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICogQHBhcmFtIHNvdXJjZSBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb25cbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEhpZGRlbkV4cHJlc3Npb25BdFRhYmxlTGV2ZWwoXG5cdHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+IHtcblx0Y29uc3QgZXhwcmVzc2lvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiBhcyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0bGV0IHBhdGggPSBnZXRQYXRoRnJvbUFjdGlvbkFubm90YXRpb24oZXhwcmVzc2lvbik7XG5cdGlmICh0eXBlb2YgcGF0aCA9PT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoXCJ2aXNpYmxlXCIgaW4gc291cmNlKSB7XG5cdFx0XHRwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSwgcGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvL2NoZWNrIGlmIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIGNvcnJlY3Q6XG5cdFx0XHRjb25zdCBzcGxpdFBhdGhGb3JOYXZpZ2F0aW9uUHJvcGVydHkgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gc3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5WzBdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eShjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aD8udGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0XHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucGFydG5lciA9PT0gbmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gcGF0aEluTW9kZWwoc3BsaXRQYXRoRm9yTmF2aWdhdGlvblByb3BlcnR5LnNsaWNlKDEpLmpvaW4oXCIvXCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuLyoqXG4gKiBMb29wIHRocm91Z2ggdGhlIG1hbmlmZXN0IGFjdGlvbnMgYW5kIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogSWYgdGhlIGRhdGEgZmllbGQgaXMgYWxzbyByZWZlcmVuY2VkIGFzIGEgY3VzdG9tIGFjdGlvbi5cbiAqIElmIHRoZSB1bmRlcmx5aW5nIG1hbmlmZXN0IGFjdGlvbiBpcyBlaXRoZXIgYSBib3VuZCBhY3Rpb24gb3IgaGFzIHRoZSAnUmVxdWlyZXNDb250ZXh0JyBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS5cbiAqXG4gKiBJZiBzbywgdGhlICdyZXF1aXJlc1NlbGVjdGlvbicgcHJvcGVydHkgaXMgZm9yY2VkIHRvICd0cnVlJyBpbiB0aGUgbWFuaWZlc3QuXG4gKiBAcGFyYW0gZGF0YUZpZWxkSWQgSWQgb2YgdGhlIERhdGFGaWVsZCBldmFsdWF0ZWRcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIGV2YWx1YXRlZFxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBEYXRhRmllbGQgaXMgZm91bmQgYW1vbmcgdGhlIG1hbmlmZXN0IGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTWFuaWZlc3RBY3Rpb25BbmRUYWdJdChcblx0ZGF0YUZpZWxkSWQ6IHN0cmluZyxcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPlxuKTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoKGFjdGlvbktleSkgPT4ge1xuXHRcdGlmIChhY3Rpb25LZXkgPT09IGRhdGFGaWVsZElkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKT8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kIHx8XG5cdFx0XHRcdChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uUmVxdWlyZXNDb250ZXh0XG5cdFx0XHQpIHtcblx0XHRcdFx0bWFuaWZlc3RBY3Rpb25zW2RhdGFGaWVsZElkXS5yZXF1aXJlc1NlbGVjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gKiBJZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciBhbmQgcmVxdWlyZXMgYSBjb250ZXh0XG4gKiBJZiBhbiBhY3Rpb24gaXMgYWxzbyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgaXQgaXMgc2V0IGFzaWRlIGFuZCB3aWxsIGJlIGNvbnNpZGVyZWRcbiAqIHdoZW4gZ29pbmcgdGhyb3VnaCB0aGUgbWFuaWZlc3QuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgRW50aXR5IFR5cGVcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGFjdGlvbiB0aGF0IG1lZXRzIHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlc1tdLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4sXG5cdGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKChkYXRhRmllbGQpID0+IHtcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pICYmXG5cdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHQoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IGZhbHNlIHx8IGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgbWFuaWZlc3RBY3Rpb25JZCA9IGdlbmVyYXRlKFtcIkRhdGFGaWVsZEZvckFjdGlvblwiLCBkYXRhRmllbGQuQWN0aW9uIGFzIHN0cmluZ10pO1xuXHRcdFx0XHQvLyBpZiB0aGUgRGF0YUZpZWxkRm9yQWN0b24gZnJvbSBhbm5vdGF0aW9uIGFsc28gZXhpc3RzIGluIHRoZSBtYW5pZmVzdCwgaXRzIHZpc2liaWxpdHkgd2lsbCBiZSBldmFsdWF0ZWQgbGF0ZXIgb25cblx0XHRcdFx0aWYgKHVwZGF0ZU1hbmlmZXN0QWN0aW9uQW5kVGFnSXQobWFuaWZlc3RBY3Rpb25JZCwgZGF0YUZpZWxkLCBtYW5pZmVzdEFjdGlvbnMpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHQvLyBpZiB0aGUgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gYW5ub3RhdGlvbiBhbHNvIGV4aXN0cyBpbiB0aGUgbWFuaWZlc3QsIGl0cyB2aXNpYmlsaXR5IHdpbGwgYmUgZXZhbHVhdGVkIGxhdGVyIG9uXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR1cGRhdGVNYW5pZmVzdEFjdGlvbkFuZFRhZ0l0KFxuXHRcdFx0XHRcdFx0YERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjo6JHtkYXRhRmllbGQuU2VtYW50aWNPYmplY3R9Ojoke2RhdGFGaWVsZC5BY3Rpb259YCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdG1hbmlmZXN0QWN0aW9uc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwICYmXG5cdFx0XHQoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IGZhbHNlIHx8IGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihkYXRhRmllbGQuQWN0aW9ucywgbWFuaWZlc3RBY3Rpb25zLCBjdXJyZW50RW50aXR5VHlwZSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIGN1c3RvbSBhY3Rpb24gdGhhdCByZXF1aXJlcyBhIGNvbnRleHQgaXMgYWx3YXlzIHZpc2libGUgaW4gdGhlIHRvb2xiYXIuXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBhY3Rpb24gdGhhdCBtZWV0cyB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdGNvbnN0IGN1c3RvbUFjdGlvbnMgPSBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnJlZHVjZSgoYWN0aW9uczogQ3VzdG9tQWN0aW9uW10sIGFjdGlvbktleSkgPT4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdGlmICghYWN0aW9uLm1lbnUpIHtcblx0XHRcdC8vc2ltcGxlIGN1c3RvbSBhY3Rpb25cblx0XHRcdGFjdGlvbnMucHVzaChhY3Rpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBncm91cGVkIGFjdGlvbnNcblx0XHRcdGFjdGlvbnMgPSBbLi4uYWN0aW9ucywgLi4uKGFjdGlvbi5tZW51LmZpbHRlcigobWVudUFjdGlvbikgPT4gdHlwZW9mIG1lbnVBY3Rpb24gIT09IFwic3RyaW5nXCIpIGFzIEN1c3RvbUFjdGlvbltdKV07XG5cdFx0fVxuXHRcdHJldHVybiBhY3Rpb25zO1xuXHR9LCBbXSk7XG5cdHJldHVybiAhIWN1c3RvbUFjdGlvbnMuZmluZChcblx0XHQoYWN0aW9uKSA9PiBhY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gJiYgKGFjdGlvbi52aXNpYmxlID09PSB1bmRlZmluZWQgfHwgYWN0aW9uLnZpc2libGU/LnRvU3RyaW5nKCkgPT09IFwidHJ1ZVwiKVxuXHQpO1xufVxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBjdXN0b20gYWN0aW9ucyAod2l0aCBrZXkgcmVxdWlyZXNTZWxlY3Rpb24pIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGN1cnJlbnQgbGluZSBpdGVtIGFuZCByZXR1cm5zIGFsbCB0aGVcbiAqIHZpc2libGUga2V5IHZhbHVlcyBhcyBhbiBleHByZXNzaW9uLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHJldHVybnMgQXJyYXk8RXhwcmVzc2lvbjxib29sZWFuPj4gQWxsIHRoZSB2aXNpYmxlIHBhdGggZXhwcmVzc2lvbnMgb2YgdGhlIGFjdGlvbnMgdGhhdCBtZWV0IHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykuZm9yRWFjaCgoYWN0aW9uS2V5KSA9PiB7XG5cdFx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRcdGlmIChhY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gPT09IHRydWUgJiYgYWN0aW9uLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGFjdGlvbi52aXNpYmxlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0LypUaGUgZmluYWwgYWltIHdvdWxkIGJlIHRvIGNoZWNrIGlmIHRoZSBwYXRoIGV4cHJlc3Npb24gZGVwZW5kcyBvbiB0aGUgcGFyZW50IGNvbnRleHRcblx0XHRcdFx0XHRhbmQgY29uc2lkZXJzIG9ubHkgdGhvc2UgZXhwcmVzc2lvbnMgZm9yIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24sXG5cdFx0XHRcdFx0YnV0IGN1cnJlbnRseSBub3QgcG9zc2libGUgZnJvbSB0aGUgbWFuaWZlc3QgYXMgdGhlIHZpc2libGUga2V5IGlzIGJvdW5kIG9uIHRoZSBwYXJlbnQgZW50aXR5LlxuXHRcdFx0XHRcdFRyaWNreSB0byBkaWZmZXJlbnRpYXRlIHRoZSBwYXRoIGFzIGl0J3MgZG9uZSBmb3IgdGhlIEhpZGRlbiBhbm5vdGF0aW9uLlxuXHRcdFx0XHRcdEZvciB0aGUgdGltZSBiZWluZyB3ZSBjb25zaWRlciBhbGwgdGhlIHBhdGhzIG9mIHRoZSBtYW5pZmVzdCovXG5cdFx0XHRcdFx0YVZpc2libGVQYXRoRXhwcmVzc2lvbnMucHVzaChyZXNvbHZlQmluZGluZ1N0cmluZyhhY3Rpb24/LnZpc2libGU/LnZhbHVlT2YoKSwgXCJib29sZWFuXCIpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cbi8qKlxuICogRXZhbHVhdGUgaWYgdGhlIHBhdGggaXMgc3RhdGljYWxseSBkZWxldGFibGUgb3IgdXBkYXRhYmxlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSB0YWJsZSBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvbk1vZGUoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uPzogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSksXG5cdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0YWJsZVR5cGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8udHlwZTtcblx0bGV0IHNlbGVjdGlvbk1vZGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8uc2VsZWN0aW9uTW9kZTtcblxuXHQvLyBUaGUgY29sbGFwc2UvRXhwYW5kIGFjdGlvbiBvZiBhIHRyZWUgdGFibGUgaXMgYSBib3VuZCBhY3Rpb24sIGFzIGEgcmVzdWx0LCBhIHRyZWUgdGFibGUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VsZWN0aW9uIG1vZGUgdG8gXCJNdWx0aVwiIHdoZW4gbm8gc2VsZWN0aW9uTW9kZSBoYXMgYmVlbiBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIgJiYgIXNlbGVjdGlvbk1vZGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdC8vIElmIHRoZSBzZWxlY3Rpb24gbW9kZSBpcyBmb3JjZWQgdG8gJ05vbmUnIGluIHRoZSBtYW5pZmVzdC9tYWNybyB0YWJsZSBwYXJhbWV0ZXJzLCB3ZSBrZWVwIGl0IHVubGVzcyBoZXJlIGlzIGEgZGVsZXRlIGJ1dHRvblxuXHRpZiAoIWxpbmVJdGVtQW5ub3RhdGlvbiB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcblx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk11bHRpKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHR9XG5cdGlmIChzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkZvcmNlTXVsdGkpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fSBlbHNlIGlmIChzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkZvcmNlU2luZ2xlKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuU2luZ2xlO1xuXHR9XG5cdGxldCBhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdLFxuXHRcdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0ZmFsc2Vcblx0KTtcblx0bGV0IGlzUGFyZW50RGVsZXRhYmxlLCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGU7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSkge1xuXHRcdGlzUGFyZW50RGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVFeHByZXNzaW9uKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cdGNvbnN0IGJNYXNzRWRpdEVuYWJsZWQ6IGJvb2xlYW4gPSAhaXNDb25zdGFudChtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uKSB8fCBtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uLnZhbHVlICE9PSBmYWxzZTtcblx0aWYgKCFzZWxlY3Rpb25Nb2RlIHx8IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuQXV0bykge1xuXHRcdHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9XG5cdGlmIChiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0Ly8gT3ZlcnJpZGUgZGVmYXVsdCBzZWxlY3Rpb24gbW9kZSB3aGVuIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0c2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuU2luZ2xlID8gU2VsZWN0aW9uTW9kZS5TaW5nbGUgOiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHR9XG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgbWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMsIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpKSB8fFxuXHRcdGhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKClcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpO1xuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKFxuXHRcdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0KGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGJNYXNzRWRpdEVuYWJsZWQpXG5cdCkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0XHQvLyBCdWlsZGluZyBleHByZXNzaW9uIGZvciBkZWxldGUgYW5kIG1hc3MgZWRpdFxuXHRcdFx0XHRjb25zdCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IG9yKFxuXHRcdFx0XHRcdGN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IHRydWUsXG5cdFx0XHRcdFx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gfHwgdHJ1ZSwgLy8gZGVmYXVsdCBkZWxldGUgdmlzaWJpbGl0eSBhcyB0cnVlXG5cdFx0XHRcdFx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdFx0aWZFbHNlKGFuZChVSS5Jc0VkaXRhYmxlLCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiksIGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGlmRWxzZShjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5TaW5nbGUpLCBjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIGV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSAmJiBkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpKTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIFVzZSBzZWxlY3Rpb25Nb2RlIGluIGVkaXQgbW9kZSBpZiBkZWxldGUgaXMgZW5hYmxlZCBvciBtYXNzIGVkaXQgaXMgdmlzaWJsZVxuXHRcdFx0Y29uc3QgZWRpdE1vZGVidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRcdFx0Yk1hc3NFZGl0RW5hYmxlZCAmJiAhdGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlLFxuXHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdFx0XHRjb25zdGFudCh0cnVlKVxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGFuZChVSS5Jc0VkaXRhYmxlLCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucykpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucykpLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Ly9FbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSB8fCBiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0Ly8gRXhhbXBsZTogTFIgc2NlbmFyaW9cblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpLCBtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdGFibGUgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogeyB0YWJsZUFjdGlvbnM6IEFycmF5PEFubm90YXRpb25BY3Rpb24gfCBBbm5vdGF0aW9uQWN0aW9uR3JvdXA+IH0ge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEFycmF5PEFubm90YXRpb25BY3Rpb24gfCBBbm5vdGF0aW9uQWN0aW9uR3JvdXA+ID0gW107XG5cdGNvbnN0IGNvcHlEYXRhRmllbGQgPSBnZXRDb3B5QWN0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5maWx0ZXIoKGRhdGFGaWVsZCkgPT4ge1xuXHRcdFx0cmV0dXJuIGRhdGFGaWVsZElzQ29weUFjdGlvbihkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMpO1xuXHRcdH0pIGFzIERhdGFGaWVsZEZvckFjdGlvblR5cGVzW11cblx0KTtcblx0aWYgKGNvcHlEYXRhRmllbGQpIHtcblx0XHR0YWJsZUFjdGlvbnMucHVzaCh7XG5cdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkNvcHksXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGNvcHlEYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChjb3B5RGF0YUZpZWxkKSxcblx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGNvcHlEYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpKSxcblx0XHRcdHRleHQ6IGNvcHlEYXRhRmllbGQuTGFiZWw/LnRvU3RyaW5nKCkgPz8gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpIS5nZXRUZXh0KFwiQ19DT01NT05fQ09QWVwiKSxcblx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdH1cblx0bGluZUl0ZW1Bbm5vdGF0aW9uXG5cdFx0LmZpbHRlcigoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHRyZXR1cm4gIWRhdGFGaWVsZElzQ29weUFjdGlvbihkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKTtcblx0XHR9KVxuXHRcdC5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQpICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0XHRkYXRhRmllbGQuRGV0ZXJtaW5pbmc/LnZhbHVlT2YoKSAhPT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQWN0aW9uID0gZ2V0RGF0YUZpZWxkQW5ub3RhdGlvbkFjdGlvbihkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0XHRpZiAodGFibGVBY3Rpb24pIHtcblx0XHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRGb3JBY3Rpb25Hcm91cChkYXRhRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFGaWVsZEdyb3VwID0gZ2V0RGF0YUZpZWxkQW5ub3RhdGlvbkFjdGlvbihkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkR3JvdXApIHtcblx0XHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaChkYXRhRmllbGRHcm91cCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdHRhYmxlQWN0aW9uc1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXREYXRhRmllbGRBbm5vdGF0aW9uQWN0aW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQW5ub3RhdGlvbkFjdGlvbiB8IEFubm90YXRpb25BY3Rpb25Hcm91cCB8IHZvaWQge1xuXHRsZXQgdGFibGVBY3Rpb246IEFubm90YXRpb25BY3Rpb247XG5cdGxldCBlbnRpdHlUeXBlO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24odmlzaWJsZUV4cHJlc3Npb24oZGF0YUZpZWxkLCBjb252ZXJ0ZXJDb250ZXh0KSksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlLFxuXHRcdFx0XHRpc0FJT3BlcmF0aW9uOiBpc0FjdGlvbkFJT3BlcmF0aW9uKGRhdGFGaWVsZCkgPT09IHRydWUgfHwgdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0ZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdGlmIChfdXNlRW5hYmxlZEV4cHJlc3Npb24oZGF0YUZpZWxkLCBlbnRpdHlUeXBlKSkge1xuXHRcdFx0XHR0YWJsZUFjdGlvbi5lbmFibGVkID0gZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkLkFjdGlvblRhcmdldCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFibGVBY3Rpb247XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHR9O1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLk1lbnUsXG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHRpZDogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0ZXh0OiBkYXRhRmllbGQuTGFiZWw/LnRvU3RyaW5nKCksXG5cdFx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHZpc2libGVFeHByZXNzaW9uKGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCkpLFxuXHRcdFx0XHRpc0FJT3BlcmF0aW9uOiBpc01lbnVBSU9wZXJhdGlvbihkYXRhRmllbGQuQWN0aW9ucykgPT09IHRydWUgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRtZW51OiBkYXRhRmllbGQuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gZ2V0RGF0YUZpZWxkQW5ub3RhdGlvbkFjdGlvbihhY3Rpb24sIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0fSBhcyBBbm5vdGF0aW9uQWN0aW9uR3JvdXA7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybjtcblx0fVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBiaW5kaW5nRXhwcmVzc2lvbiBmb3IgdGhlIGhpZ2hsaWdodCByb3dTZXR0aW5nIHBhcmFtZXRlci5cbiAqIEBwYXJhbSBjcml0aWNhbGl0eUFubm90YXRpb24gUGF0aCBvciB2YWx1ZSBvZiB0aGUgY3JpdGljYWxpdHlcbiAqIEBwYXJhbSBpc0RyYWZ0Um9vdE9yTm9kZSAgSXMgdGhlIGN1cnJlbnQgZW50aXR5U2V0IGFuIERyYWZ0IHJvb3Qgb3IgYSBub2RlXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5VHlwZSBUaGUgdGFyZ2V0ZWQgZW50aXR5VHlwZVxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbkJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0Y3JpdGljYWxpdHlBbm5vdGF0aW9uOiBDcml0aWNhbGl0eSB8IHVuZGVmaW5lZCxcblx0aXNEcmFmdFJvb3RPck5vZGU6IGJvb2xlYW4sXG5cdHRhcmdldEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+IHtcblx0bGV0IGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uOiBNZXNzYWdlVHlwZSB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoXG5cdFx0W1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24sXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRpc0RyYWZ0Um9vdE9yTm9kZSAmJiBFbnRpdHkuSGFzQWN0aXZlLFxuXHRcdFx0aXNEcmFmdFJvb3RPck5vZGUgJiYgRW50aXR5LklzQWN0aXZlLFxuXHRcdFx0YCR7aXNEcmFmdFJvb3RPck5vZGV9YCxcblx0XHRcdHBhdGhJbk1vZGVsKFwiQCR1aTUuZmUuY29udGV4dFBhdGhcIiksXG5cdFx0XHRVSS5Jc0luYWN0aXZlXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBleHRlcm5hbCBjcmVhdGlvbiBiZWhhdmlvciBpZiB0aGVyZSdzIG9uZS5cbiAqIEBwYXJhbSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIFRoZSBleHRlcm5hbCBjcmVhdGlvbiBiZWhhdmlvciwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXh0ZXJuYWxDcmVhdGlvbkJlaGF2aW9yKFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgfCB1bmRlZmluZWQge1xuXHQvLyBMZWdhY3kgc2V0dGluZ3M6IHRoZSBvdXRib3VuZCBpcyBzcGVjaWZpZWQgaW4gbmF2aWdhdGlvbi9jcmVhdGVcblx0Ly8gTmV3IHNldHRpbmdzOiB0aGUgb3V0Ym91bmQgaXMgc3BlY2lmaWVkIGluIHRhYmxlU2V0dGluZ3MvY3JlYXRpb25Nb2RlXG5cdGNvbnN0IGNyZWF0aW9uRGV0YWlscyA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlO1xuXHRjb25zdCBvdXRib3VuZEtleSA9IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLm91dGJvdW5kQ3JlYXRpb24gPz8gY3JlYXRpb25EZXRhaWxzPy5vdXRib3VuZDtcblx0Y29uc3Qgb3V0Ym91bmREZXRhaWwgPSBvdXRib3VuZEtleSA/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0T3V0Ym91bmROYXZpZ2F0aW9uRW50cmllcygpPy5bb3V0Ym91bmRLZXldIDogdW5kZWZpbmVkO1xuXHRpZiAob3V0Ym91bmRLZXkgJiYgb3V0Ym91bmREZXRhaWwpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bW9kZTogXCJFeHRlcm5hbFwiLFxuXHRcdFx0b3V0Ym91bmQ6IG91dGJvdW5kS2V5LFxuXHRcdFx0b3V0Ym91bmREZXRhaWxcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0Ly8gT3V0Ym91bmQgY29uZmlndXJhdGlvbiBpbmNvcnJlY3QgLS0+IGZhbGxiYWNrIHRvIE5ld1BhZ2Vcblx0XHRcdExvZy53YXJuaW5nKGBDYW5ub3QgZmluZCBvdXRib3VuZCBwYXJhbWV0ZXJzIGZvciBcIkV4dGVybmFsXCIgY3JlYXRpb24gbW9kZS4gSW5zdGVhZCwgdGhlIGRlZmF1bHQgbW9kZSBcIk5ld1BhZ2VcIiBpcyB1c2VkLmApO1xuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdFx0XHRkZWxldGUgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24ub3V0Ym91bmRDcmVhdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nXG4pOiBDcmVhdGVCZWhhdmlvciB8IENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwge1xuXHRjb25zdCBleHRlcm5hbEJlaGF2aW9yID0gZ2V0RXh0ZXJuYWxDcmVhdGlvbkJlaGF2aW9yKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRpZiAoZXh0ZXJuYWxCZWhhdmlvcikge1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5FeHRlcm5hbDtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5vdXRib3VuZENyZWF0aW9uID0gZXh0ZXJuYWxCZWhhdmlvci5vdXRib3VuZDtcblx0XHRyZXR1cm4gZXh0ZXJuYWxCZWhhdmlvcjtcblx0fVxuXG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBvcmlnaW5hbFRhYmxlU2V0dGluZ3MgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3MgPz8ge307XG5cdGNvbnN0IG5hdmlnYXRpb25EZXRhaWxzID0gbmF2aWdhdGlvblNldHRpbmdzPy5kZXRhaWw7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5FeHRlcm5hbCwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUpXG5cdCkge1xuXHRcdC8vIEZhbGxiYWNrIHRvIFwiTmV3UGFnZVwiXG5cdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRgQ3JlYXRpb24gbW9kZSAnJHt0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGV9JyBjYW4gbm90IGJlIHVzZWQgd2l0aGluIHRoZSBMaXN0IFJlcG9ydC4gSW5zdGVhZCwgdGhlIGRlZmF1bHQgbW9kZSBcIk5ld1BhZ2VcIiBpcyB1c2VkLmBcblx0XHQpO1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5OZXdQYWdlO1xuXHR9IGVsc2UgaWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIiAmJlxuXHRcdCFbQ3JlYXRpb25Nb2RlLk5ld1BhZ2UsIENyZWF0aW9uTW9kZS5JbmxpbmUsIENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZ10uaW5jbHVkZXModGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlKVxuXHQpIHtcblx0XHQvLyBGYWxsYmFjayB0byBcIk5ld1BhZ2VcIiBpbiBjYXNlIG9mIGEgbm9uLXN1cHBvcnRlZCBtb2RlIGZvciBhIFRyZWVUYWJsZVxuXHRcdExvZy53YXJuaW5nKFxuXHRcdFx0YENyZWF0aW9uIG1vZGUgJyR7dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlfScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBUcmVlIFRhYmxlLiBJbnN0ZWFkLCB0aGUgZGVmYXVsdCBtb2RlIFwiTmV3UGFnZVwiIGlzIHVzZWQuYFxuXHRcdCk7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdH1cblxuXHRsZXQgbmV3QWN0aW9uO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Ly8gaW4tYXBwXG5cdFx0Y29uc3QgdGFyZ2V0QW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucztcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9uc0NvbW1vbiA9IHRhcmdldEFubm90YXRpb25zPy5Db21tb24gYXMgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ29tbW9uLFxuXHRcdFx0dGFyZ2V0QW5ub3RhdGlvbnNTZXNzaW9uID0gdGFyZ2V0QW5ub3RhdGlvbnM/LlNlc3Npb24gYXMgRW50aXR5U2V0QW5ub3RhdGlvbnNfU2Vzc2lvbjtcblx0XHRuZXdBY3Rpb24gPSB0YXJnZXRBbm5vdGF0aW9uc0NvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHwgdGFyZ2V0QW5ub3RhdGlvbnNTZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG5ld0FjdGlvbikge1xuXHRcdFx0Ly8gQSBjb21iaW5hdGlvbiBvZiAnQ3JlYXRpb25Sb3cnIGFuZCAnTmV3QWN0aW9uJyBkb2VzIG5vdCBtYWtlIHNlbnNlXG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25EZXRhaWxzPy5yb3V0ZSkge1xuXHRcdFx0Ly8gcm91dGUgc3BlY2lmaWVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5OZXdQYWdlID8gbmF2aWdhdGlvbkRldGFpbHMucm91dGUgOiB1bmRlZmluZWQgLy8gbmF2aWdhdGUgb25seSBpbiBOZXdQYWdlIG1vZGVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRcdExvZy5lcnJvcihcIlRoZSBjcmVhdGlvbiBtb2RlICdOZXdQYWdlJyBpcyB1c2VkIGJ1dCB0aGUgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9uIHRvIHRoZSBzdWIgcGFnZSBpcyBtaXNzaW5nLlwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdC8vIEluIGNhc2UgdGhlcmUgd2FzIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjcmVhdGVBdEVuZCB3ZSBmb3JjZSBpdCB0byBmYWxzZVxuXHRcdFx0aWYgKG9yaWdpbmFsVGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdExvZy5pbmZvKFwiVGhlIGNyZWF0aW9uIG1vZGUgd2FzIGNoYW5nZWQgZnJvbSAnTmV3UGFnZScgdG8gJ0lubGluZScgZHVlIHRvIG1pc3NpbmcgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9uIHRvIHRoZSBzdWIgcGFnZS5cIik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0bW9kZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlLFxuXHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKClcblx0fTtcbn1cbmNvbnN0IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRQYXRoOiBzdHJpbmcsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRhZ2dyZWdhdGlvbk9uTGVhZkxldmVsZW5hYmxlZD86IGJvb2xlYW5cbik6IFJvd0NvbmZpZ3VyYXRpb24ge1xuXHRsZXQgbmF2aWdhdGlvbkluZm86IFJvd05hdmlnYXRpb25JbmZvIHwgdW5kZWZpbmVkO1xuXHRsZXQgY3JpdGljYWxpdHlQcm9wZXJ0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiA9IGNvbnN0YW50KE1lc3NhZ2VUeXBlLk5vbmUpO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGNyaXRpY2FsaXR5QW5ub3RhdGlvbiA9IGxpbmVJdGVtQW5ub3RhdGlvbj8uYW5ub3RhdGlvbnM/LlVJPy5Dcml0aWNhbGl0eTtcblx0bGV0IHJvd05hdmlnYWJsZUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KHRydWUpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRjcml0aWNhbGl0eUFubm90YXRpb24sXG5cdFx0XHQhIU1vZGVsSGVscGVyLmdldERyYWZ0Um9vdCh0YXJnZXRFbnRpdHlTZXQpIHx8ICEhTW9kZWxIZWxwZXIuZ2V0RHJhZnROb2RlKHRhcmdldEVudGl0eVNldCksXG5cdFx0XHR0YXJnZXRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRpZiAobmF2aWdhdGlvblRhcmdldCkge1xuXHRcdFx0bmF2aWdhdGlvbkluZm8gPSB7IHR5cGU6IFwiT3V0Ym91bmRcIiwgbmF2aWdhdGlvblRhcmdldCB9O1xuXHRcdH1cblx0XHRpZiAoIW5hdmlnYXRpb25UYXJnZXQgJiYgbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ucm91dGUpIHtcblx0XHRcdGNvbnN0IGNoZWNrRWRpdGFibGUgPVxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXREcmFmdFJvb3QodGFyZ2V0RW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkIHx8IE1vZGVsSGVscGVyLmdldERyYWZ0Tm9kZSh0YXJnZXRFbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbyA9IHtcblx0XHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uXCIsXG5cdFx0XHRcdHJvdXRlUGF0aDogbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbC5yb3V0ZSxcblx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0Y2hlY2tFZGl0YWJsZSxcblx0XHRcdFx0cmVjcmVhdGVDb250ZXh0OiB0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCJcblx0XHRcdH07XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsPy5hdmFpbGFiaWxpdHkpIHtcblx0XHRcdHJvd05hdmlnYWJsZUV4cHJlc3Npb24gPSBwYXRoSW5Nb2RlbChcIkAkdWk1LmZlLnZpcnR1YWwucm91dGVOYXZpZ2FibGUtXCIgKyBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsLnJvdXRlKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCByb3dOYXZpZ2F0ZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W3BhdGhJbk1vZGVsKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0bmF2aWdhdGlvbkluZm8sXG5cdFx0YWN0aW9uVHlwZTogbmF2aWdhdGlvbkluZm8gPyBcIk5hdmlnYXRpb25cIiA6IHVuZGVmaW5lZCxcblx0XHRyb3dIaWdobGlnaHRpbmc6IGNvbXBpbGVFeHByZXNzaW9uKGNyaXRpY2FsaXR5UHJvcGVydHkpLFxuXHRcdHJvd05hdmlnYXRlZDogY29tcGlsZUV4cHJlc3Npb24ocm93TmF2aWdhdGVkRXhwcmVzc2lvbiksXG5cdFx0cm93Q3JpdGljYWxpdHlGb3JJbnNpZ2h0czogY3JpdGljYWxpdHlBbm5vdGF0aW9uID8gY3JpdGljYWxpdHlFeHByZXNzaW9uRm9ySW50ZWdyYXRpb25DYXJkcyhjcml0aWNhbGl0eUFubm90YXRpb24pIDogdW5kZWZpbmVkLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0YW5kKHJvd05hdmlnYWJsZUV4cHJlc3Npb24sIG5vdChVSS5Jc0luYWN0aXZlKSwgYWdncmVnYXRpb25PbkxlYWZMZXZlbGVuYWJsZWQgPyBVSS5pc05vZGVMZXZlbE5hdmlnYWJsZSA6IHRydWUpXG5cdFx0KVxuXHR9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciB0aGUgaWRlbnRpZmllZCBhZGRpdGlvbmFsIHByb3BlcnR5IGZvciB0aGUgQUxQIHRhYmxlIHVzZSBjYXNlLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiBVSS5IaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHksIGluY2x1ZGUgdGhpcyB0ZWNobmljYWwgcHJvcGVydHkgaW4gdGhlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG9mIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZSBmcm9tIHRoZSB0YWJsZSB2aXN1YWxpemF0aW9uLlxuICogQHBhcmFtIHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwXG4gKi9cbmNvbnN0IGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRuYW1lOiBzdHJpbmcsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0Y29uc3Qga2V5ID0gYFByb3BlcnR5X1RlY2huaWNhbDo6JHtuYW1lfWA7XG5cdC8vIFZhbGlkYXRlIGlmIHRoZSB0ZWNobmljYWwgcHJvcGVydHkgaGFzbid0IHlldCBiZWVuIGNyZWF0ZWQgb24gcHJldmlvdXMgaXRlcmF0aW9ucy5cblx0Y29uc3QgY29sdW1uRXhpc3RzID0gY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdC8vIFJldHJpZXZlIHRoZSBzaW1wbGUgcHJvcGVydHkgdXNlZCBieSB0aGUgaGlkZGVuIGFubm90YXRpb24sIGl0IHdpbGwgYmUgdXNlZCBhcyBhIGJhc2UgZm9yIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyBvZiBuZXdseSBjcmVhdGVkIHRlY2huaWNhbCBwcm9wZXJ0eS4gRm9yIGUuZy4gcmVsYXRpdmVQYXRoXG5cdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eSA9XG5cdFx0IWNvbHVtbkV4aXN0cyAmJiAoY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lICYmICFjb2x1bW4ucHJvcGVydHlJbmZvcykgYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKSE7XG5cdGlmIChhZGRpdGlvbmFsUHJvcGVydHkpIHtcblx0XHRjb25zdCB0ZWNobmljYWxDb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGFkZGl0aW9uYWxQcm9wZXJ0eS5sYWJlbCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBhZGRpdGlvbmFsUHJvcGVydHkuYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRkYXRhVHlwZTogXCJFZG0uU3RyaW5nXCIsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiSGlkZGVuXCIsXG5cdFx0XHRuYW1lOiBrZXksXG5cdFx0XHRyZWxhdGl2ZVBhdGg6IGFkZGl0aW9uYWxQcm9wZXJ0eS5yZWxhdGl2ZVBhdGgsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRpc0tleTogZmFsc2UsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0YWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdGZpbHRlcmFibGU6IGZhbHNlLFxuXHRcdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlLFxuXHRcdFx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogdHJ1ZVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKHRlY2huaWNhbENvbHVtbik7XG5cdFx0cmVsYXRlZEFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSB0ZWNobmljYWxDb2x1bW4ubmFtZTtcblx0fVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFAxM25Nb2RlKFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBUYWJsZVAxM25Nb2RlW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IG1vZGVzOiBUYWJsZVAxM25Nb2RlW10gPSBbXTtcblx0Y29uc3QgaXNBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRjb25zdCBpc1Jlc3BvbnNpdmVUYWJsZSA9IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGlmICh0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnBlcnNvbmFsaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gUGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0Y29uc3QgcGVyc29uYWxpemF0aW9uID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0c3dpdGNoICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJBbmFseXRpY2FsVGFibGVcIjpcblx0XHRcdFx0XHRyZXR1cm4gW1wiU29ydFwiLCBcIkNvbHVtblwiLCBcIkZpbHRlclwiLCBcIkdyb3VwXCIsIFwiQWdncmVnYXRlXCJdO1xuXHRcdFx0XHRjYXNlIFwiUmVzcG9uc2l2ZVRhYmxlXCI6XG5cdFx0XHRcdFx0cmV0dXJuIFtcIlNvcnRcIiwgXCJDb2x1bW5cIiwgXCJGaWx0ZXJcIiwgXCJHcm91cFwiXTtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRyZXR1cm4gW1wiU29ydFwiLCBcIkNvbHVtblwiLCBcIkZpbHRlclwiXTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwZXJzb25hbGl6YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFNwZWNpZmljIHBlcnNvbmFsaXphdGlvbiBvcHRpb25zIGVuYWJsZWQgaW4gbWFuaWZlc3QuIFVzZSB0aGVtIGFzIGlzLlxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5zb3J0KSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkNvbHVtblwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZmlsdGVyKSB7XG5cdFx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmdyb3VwICYmIChpc0FuYWx5dGljYWxUYWJsZSB8fCBpc1Jlc3BvbnNpdmVUYWJsZSkpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgaXNBbmFseXRpY2FsVGFibGUpIHtcblx0XHRcdFx0bW9kZXMucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtb2Rlcy5sZW5ndGggPiAwID8gbW9kZXMgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIE5vIHBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdG1vZGVzLnB1c2goXCJTb3J0XCIpO1xuXHRcdG1vZGVzLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0XHRpZiAodmFyaWFudE1hbmFnZW1lbnQgPT09IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Db250cm9sIHx8IF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXIsIGNvbnZlcnRlckNvbnRleHQpKSB7XG5cdFx0XHRcdC8vIEZlYXR1cmUgcGFyaXR5IHdpdGggVjIuXG5cdFx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRcdC8vIE9yIHdoZW4gdGhlIExSIGZpbHRlciBiYXIgaXMgaGlkZGVuIHZpYSBtYW5pZmVzdCBzZXR0aW5nXG5cdFx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZGVzLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXHRcdGlmIChpc0FuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0bW9kZXMucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0bW9kZXMucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0aWYgKGlzUmVzcG9uc2l2ZVRhYmxlKSB7XG5cdFx0XHRtb2Rlcy5wdXNoKFwiR3JvdXBcIik7XG5cdFx0fVxuXHRcdHJldHVybiBtb2Rlcztcblx0fVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBzdWdnZXN0aW5nIGlmIGEgZmlsdGVyIGJhciBpcyBiZWluZyB1c2VkIG9uIHRoZSBwYWdlLlxuICpcbiAqIENoYXJ0IGhhcyBhIGRlcGVuZGVuY3kgdG8gZmlsdGVyIGJhciAoaXNzdWUgd2l0aCBsb2FkaW5nIGRhdGEpLiBPbmNlIHJlc29sdmVkLCB0aGUgY2hlY2sgZm9yIGNoYXJ0IHNob3VsZCBiZSByZW1vdmVkIGhlcmUuXG4gKiBVbnRpbCB0aGVuLCBoaWRpbmcgZmlsdGVyIGJhciBpcyBub3cgYWxsb3dlZCBpZiBhIGNoYXJ0IGlzIGJlaW5nIHVzZWQgb24gTFIuXG4gKiBAcGFyYW0gbWFuaWZlc3RXcmFwcGVyIE1hbmlmZXN0IHNldHRpbmdzIGdldHRlciBmb3IgdGhlIHBhZ2VcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIEJvb2xlYW4gc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqL1xuZnVuY3Rpb24gX2lzRmlsdGVyQmFySGlkZGVuKG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRtYW5pZmVzdFdyYXBwZXIuaXNGaWx0ZXJCYXJIaWRkZW4oKSAmJlxuXHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMoKSAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNvcnQgY29uZGl0aW9ucyBmb3IgdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIFRhYmxlIGNvbHVtbnMgcHJvY2Vzc2VkIGJ5IHRoZSBjb252ZXJ0ZXJcbiAqIEByZXR1cm5zIFNvcnQgY29uZGl0aW9ucyBmb3IgYSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ydENvbmRpdGlvbnMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBUYWJsZVNvcnRDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpLm5vblNvcnRhYmxlUHJvcGVydGllcztcblx0Y29uc3Qgc29ydENvbmRpdGlvbnM6IFRhYmxlU29ydENvbmRpdGlvbnMgPSB7XG5cdFx0c29ydGVyczogW11cblx0fTtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Tb3J0T3JkZXIuZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25Qcm9wZXJ0eSA9IGNvbmRpdGlvbi5Qcm9wZXJ0eTtcblx0XHRcdGlmIChjb25kaXRpb25Qcm9wZXJ0eT8uJHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICFub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoY29uZGl0aW9uUHJvcGVydHkuJHRhcmdldC5uYW1lKSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdHNvcnRDb25kaXRpb25zLnNvcnRlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBpbmZvTmFtZSxcblx0XHRcdFx0XHRcdGRlc2NlbmRpbmc6ICEhY29uZGl0aW9uLkRlc2NlbmRpbmdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzb3J0Q29uZGl0aW9ucy5zb3J0ZXJzLmxlbmd0aCA/IHNvcnRDb25kaXRpb25zIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0SW5pdGlhbEV4cGFuc2lvbkxldmVsKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IGxldmVsID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uSW5pdGlhbEV4cGFuc2lvbkxldmVsPy52YWx1ZU9mKCk7XG5cdHJldHVybiB0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgPyBsZXZlbCArIDEgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKiBAcGFyYW0gcGF0aHMgVGhlIGFycmF5IHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGNvbHVtbnMgVGhlIGFycmF5IG9mIHByb3BlcnR5SW5mb3NcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lc1xuICovXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgcHJvcGVydHlJbmZvOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCwgYW5ub3RhdGlvbkNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRwYXRocy5mb3JFYWNoKChjdXJyZW50UGF0aCkgPT4ge1xuXHRcdGlmIChjdXJyZW50UGF0aD8udmFsdWUpIHtcblx0XHRcdHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0XHRyZXR1cm4gIWFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY3VycmVudFBhdGg/LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gaW5mb05hbWVzO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBncm91cCBjb25kaXRpb25zLlxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IHN0cmluZ1xuKTogVGFibGVHcm91cENvbmRpdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBncm91cENvbmRpdGlvbnM6IFRhYmxlR3JvdXBDb25kaXRpb25zID0ge1xuXHRcdGdyb3VwTGV2ZWxzOiBbXVxuXHR9O1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRsZXQgYUdyb3VwQnkgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Hcm91cEJ5O1xuXHRcdGlmICh0YWJsZVR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGFHcm91cEJ5ID0gYUdyb3VwQnkuc2xpY2UoMCwgMSk7XG5cdFx0fVxuXHRcdGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscyA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYUdyb3VwQnksIGNvbHVtbnMpLm1hcCgoaW5mb05hbWUpID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucy5ncm91cExldmVscy5sZW5ndGggPyBncm91cENvbmRpdGlvbnMgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNvbHVtbidzIHByb3BlcnR5SW5mb3Mgb2YgYW4gYW5hbHl0aWNhbCB0YWJsZSBpbnRlZ3JhdGluZyBhbGwgZXh0ZW5zaW9ucyBhbmQgYmluZGluZy1yZWxldmFudCBwcm9wZXJ0eSBpbmZvIHBhcnQuXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZVByb3BlcnR5SW5mb3NXaXRoQWdncmVnYXRlc0RlZmluaXRpb25zKHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0ZWRBZGRpdGlvbmFsUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuXHRcdGNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8gPSBfZ2V0UHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8odGFibGVWaXN1YWxpemF0aW9uLCBjb2x1bW4ubmFtZSk7XG5cdFx0aWYgKHByb3BlcnR5TmFtZUZyb21BbmFseXRpY3NJbmZvKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24gPSB0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyFbcHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm9dO1xuXHRcdFx0Y29sdW1uLmFnZ3JlZ2F0YWJsZSA9ICFhZ2dyZWdhdGFibGVQcm9wZXJ0eURlZmluaXRpb24uZnJvbUdyb3VwYWJsZVByb3BlcnR5O1xuXHRcdFx0Y29sdW1uLmV4dGVuc2lvbiA9IGFnZ3JlZ2F0YWJsZVByb3BlcnR5RGVmaW5pdGlvbiA/PyB7fTtcblx0XHRcdGlmICghY29sdW1uLmlzR3JvdXBhYmxlICYmICFjb2x1bW4uYWdncmVnYXRhYmxlKSB7XG5cdFx0XHRcdC8vIFRoZSBjb2x1bW4gaXMgbmVpdGhlciBhZ2dyZWdhdGFibGUgbm9yIGdyb3VwYWJsZSAtLT4gaXQncyBhIGhpZGRlbiBjb2x1bW4gdG8gYWxsb3cgZmlsdGVyaW5nIGluIFAxM05cblx0XHRcdFx0Ly8gV2UgbmVlZCB0byByZW1vdmUgYWRkaXRpb25hbFByb3BlcnRpZXMsIGFzIGl0J3Mgbm90IG5lZWRlZCBhbmQgY2F1c2VzIGFuIGVycm9yIGluIHRoZSBNREMgdGFibGUgY29kZVxuXHRcdFx0XHRkZWxldGUgY29sdW1uLmV4dGVuc2lvbi5hZGRpdGlvbmFsUHJvcGVydGllcztcblx0XHRcdH1cblx0XHRcdGlmIChjb2x1bW4uaXNHcm91cGFibGUgJiYgY29sdW1uLmV4dGVuc2lvbi5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBjb2x1bW4uZXh0ZW5zaW9uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcsIHByb3BlcnRpZXMgd2l0aCBjb250ZXh0LWRlZmluaW5nIHByb3BlcnRpZXMgc2hhbGwgbm90IGJlIGFsbG93ZWQgZm9yIHZpc3VhbCBncm91cGluZ1xuXHRcdFx0XHQvLyBXZSBuZWVkIGEgVVggY29uY2VwdCB0byBzdXBwb3J0IHRoaXMgKGFzIHRoZSBlbmQgdXNlciB3b3VsZCBuZWVkIHRvIGdyb3VwIG9uIHRoZSBjb250ZXh0LWRlZmluaW5nIHByb3BlcnRpZXMgYmVmb3JlIGdyb3VwaW5nXG5cdFx0XHRcdC8vIG9uIHRoZSBwcm9wZXJ0eSBpdHNlbGYpLlxuXHRcdFx0XHRjb2x1bW4uaXNHcm91cGFibGUgPSBmYWxzZTtcblx0XHRcdFx0Y29sdW1uLmV4dGVuc2lvbi50ZWNobmljYWxseUdyb3VwYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3M/Lmxlbmd0aCkge1xuXHRcdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8pID0+IHtcblx0XHRcdFx0Ly8gQ3JlYXRlIHByb3BlcnR5SW5mbyBmb3IgZWFjaCBhZGRpdGlvbmFsIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgbmV3IHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eV9UZWNobmljYWw6OicgZm9yIHVuaXF1ZW5lc3MgYW5kIGl0IGhhcyBiZWVuIG5hbWVkIHRlY2huaWNhbCBwcm9wZXJ0eSBhcyBpdCByZXF1aXJlcyBkZWRpY2F0ZWQgTURDIGF0dHJpYnV0ZXMgKHRlY2huaWNhbGx5R3JvdXBhYmxlIGFuZCB0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSkuXG5cdFx0XHRcdGNyZWF0ZVRlY2huaWNhbFByb3BlcnR5KGFkZGl0aW9uYWxQcm9wZXJ0eUluZm8sIHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLCByZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0X3VwZGF0ZUZvclRleHRPbmx5UHJvcGVydGllc1dpdGhDRFAodGFibGVWaXN1YWxpemF0aW9uLCBjb2x1bW4pO1xuXHR9KTtcblx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAoY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MubWFwKFxuXHRcdFx0XHQocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkQWRkaXRpb25hbFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdFx0KTtcblx0XHRcdC8vIEFkZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gdGhlIGNvbXBsZXggcHJvcGVydHkgdXNpbmcgdGhlIGhpZGRlbiBhbm5vdGF0aW9uLlxuXHRcdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8uY29uY2F0KGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBuYW1lIGZyb20gdGhlIGFuYWx5dGljcyBkYXRhXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIGFuYWx5emVkXG4gKiBAcGFyYW0gbmFtZSBUaGUgcHJvcGVydHkgbmFtZVxuICogQHJldHVybnMgVGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgYW5hbHl0aWNzIGRhdGFcbiAqL1xuXG5mdW5jdGlvbiBfZ2V0UHJvcGVydHlOYW1lRnJvbUFuYWx5dGljc0luZm8odGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh0YWJsZVZpc3VhbGl6YXRpb24uYW5hbHl0aWNzRXh0ZW5zaW9ucyEpLmZpbmQoKGFnZ3JlZ2F0ZSkgPT4gYWdncmVnYXRlID09PSBuYW1lKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjb2x1bW4ncyBwcm9wZXJ0eUluZm9zIG9mIGEgY29sdW1uIGFubm90YXRlZCB3aXRoIHRleHQgb25seSBvbiBhbiBhbmFseXRpY2FsIHRhYmxlLlxuICogVGhlIHJlZmVyZW5jZWQgdGV4dCBwcm9wZXJ0eSBjb3VsZCBkZWZpbmUgY29udGV4dC1kZWZpbmluZyBwcm9wZXJ0aWVzIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbHVtbidzIHByb3BlcnR5SW5mb3MuXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIGFuYWx5emVkXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gY29udGFpbmluZyB0aGUgXCJ0ZXh0QXJyYW5nZW1lbnRcIiBvYmplY3Qgd2hlbiBwcmVzZW50XG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVGb3JUZXh0T25seVByb3BlcnRpZXNXaXRoQ0RQKHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHQvLyBDdXJyZW50bHkgYSBjb2x1bW4gcmVmZXJlbmNpbmcgYSB0ZXh0IG9ubHkgcHJvcGVydHkgb25seSBjb250YWlucyB0aGUgdGV4dCBwcm9wZXJ0eSBpbnRvIGl0cyBwcm9wZXJ0eUluZm9zLlxuXHQvLyBQcm9wZXJ0aWVzIHJlZmVyZW5jaW5nIGNvbnRleHQtZGVmaW5pbmcgcHJvcGVydGllcyAoQ0RQKSBhcmVuJ3QgYWxsb3dlZCBmb3IgZ3JvdXBpbmcuIFRoaXMgbmVlZCB0byBjaGFuZ2UgZm9yIHRleHQgb25seSBjb2x1bW5zLCBhcyBpbiBjb21tb24gY2FzZXMsIHRleHQgcHJvcGVydGllcyByZWZlcmVuY2UgdGhlaXIgdmFsdWUgcHJvcGVydGllcyBpbnRvIHRoZWlyIENEUHMuXG5cdC8vIFNvLCB3ZSBub3cgaW5jbHVkZSB0aGUgdmFsdWUgcHJvcGVydHkgaW50byB0aGUgcHJvcGVydHlJbmZvcyBvZiB0aGUgY29sdW1uIHRvIGFsbG93IHRoZSBncm91cGluZyBvbiB0aGUgcHJvcGVydHkgdmFsdWUuXG5cdGlmIChjb2x1bW4udGV4dEFycmFuZ2VtZW50Py5tb2RlID09PSBcIkRlc2NyaXB0aW9uXCIgJiYgY29sdW1uLnRleHRBcnJhbmdlbWVudC50ZXh0UHJvcGVydHkpIHtcblx0XHRjb25zdCBhbmFseXRpY3NJbmZvUHJvcGVydHlOYW1lRm9yRGVzYyA9IF9nZXRQcm9wZXJ0eU5hbWVGcm9tQW5hbHl0aWNzSW5mbyh0YWJsZVZpc3VhbGl6YXRpb24sIGNvbHVtbi50ZXh0QXJyYW5nZW1lbnQudGV4dFByb3BlcnR5KTtcblx0XHRpZiAoYW5hbHl0aWNzSW5mb1Byb3BlcnR5TmFtZUZvckRlc2MpIHtcblx0XHRcdGNvbnN0IGFnZ3JlZ2F0YWJsZVByb3BlcnR5RGVmaW5pdGlvbiA9IHRhYmxlVmlzdWFsaXphdGlvbi5hbmFseXRpY3NFeHRlbnNpb25zIVthbmFseXRpY3NJbmZvUHJvcGVydHlOYW1lRm9yRGVzY107XG5cdFx0XHQvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdGV4dCBwcm9wZXJ0eSBoYXMgQ0RQIHByb3BlcnRpZXMgZGVmaW5lZCBhbmQgdGhlIHZhbHVlIHByb3BlcnR5IGlzIHBhcnQgb2YgdGhlc2UgcHJvcGVydGllcy5cblx0XHRcdGlmIChcblx0XHRcdFx0YWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy5sZW5ndGggJiZcblx0XHRcdFx0YWdncmVnYXRhYmxlUHJvcGVydHlEZWZpbml0aW9uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSB2YWx1ZSAoc2luZ2xlIHByb3BlcnR5KSBleGlzdHMgYWxyZWFkeSBvbiB0aGUgbGlzdCBvZiBjb2x1bW5zIGZyb20gdGhlIHRhYmxlIGJ1dCBpdCB3YXMgb25seSBjcmVhdGVkIGZvciBmaWx0ZXJpbmcgcHVycG9zZXMgaW4gUDEzbiBhbmQgbm90IGxpbmtlZCB0byB0aGUgY29sdW1uIHdpdGggdGhlIHRleHQgYXJyYW5nZW1lbnQgI1RleHRPbmx5LFxuXHRcdFx0XHQvLyB0aGVyZWZvcmUgbm90IHByb3Bvc2VkIGFzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgZ3JvdXBpbmcgdGhlIGNvbHVtbiBtZW51LiBOb3cgaXQnbGwgYmUgaW5jbHVkZWQgaW50byB0aGUgcHJvcGVydHlJbmZvcyBvZiB0aGUgY29sdW1uIHRvIGFsbG93IHRoZSBkZWZhdWx0IGdyb3VwaW5nIG9uIHRoaXMgdmFsdWUgcHJvcGVydHkuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbldpdGhUZXh0T25seSA9ICh0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSkuZmluZChcblx0XHRcdFx0XHQodGV4dE9ubHlDb2x1bW4pID0+IHRleHRPbmx5Q29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY29sdW1uLnJlbGF0aXZlUGF0aCAmJiB0ZXh0T25seUNvbHVtbi5wcm9wZXJ0eUluZm9zXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbHVtbldpdGhUZXh0T25seT8ucHJvcGVydHlJbmZvcz8ucHVzaChjb2x1bW4ubmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgYWdncmVnYXRlIGNvbmRpdGlvbnMuXG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcGFyYW0gZXh0ZW5zaW9uSW5mb01hcFxuICogQHJldHVybnMgR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRleHRlbnNpb25JbmZvTWFwOiBSZWNvcmQ8c3RyaW5nLCBJbnRlcm5hbEV4dGVuc2lvbkZvckFuYWx5dGljcz5cbik6IFRhYmxlQWdncmVnYXRlQ29uZGl0aW9ucyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGFnZ3JlZ2F0ZUNvbmRpdGlvbnM6IFRhYmxlQWdncmVnYXRlQ29uZGl0aW9ucyA9IHt9O1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlRvdGFsKSB7XG5cdFx0Y29uc3QgYVRvdGFscyA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlRvdGFsO1xuXHRcdGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYVRvdGFscywgY29sdW1ucykuZm9yRWFjaCgoaW5mb05hbWUpID0+IHtcblx0XHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnNbaW5mb05hbWVdID0ge307XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gZXh0ZW5zaW9uSW5mb01hcCkge1xuXHRcdFx0aWYgKCFleHRlbnNpb25JbmZvTWFwW2tleV0uZnJvbUdyb3VwYWJsZVByb3BlcnR5KSB7XG5cdFx0XHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnNba2V5XSA9IHt9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMoYWdncmVnYXRlQ29uZGl0aW9ucykubGVuZ3RoID8gYWdncmVnYXRlQ29uZGl0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24gPSB7XG5cdGNyZWF0aW9uQmVoYXZpb3VyOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdO1xuXHRjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogYm9vbGVhbjtcblx0c3RhbmRhcmRBY3Rpb25zOiB7XG5cdFx0Y3JlYXRlOiBTdGFuZGFyZEFjdGlvbjtcblx0XHRkZWxldGU6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdHBhc3RlOiBTdGFuZGFyZEFjdGlvbjtcblx0XHRtYXNzRWRpdDogU3RhbmRhcmRBY3Rpb247XG5cdFx0aW5zaWdodHM6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGNyZWF0aW9uUm93OiBTdGFuZGFyZEFjdGlvbjtcblx0XHRjdXQ6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdGNvcHk6IFN0YW5kYXJkQWN0aW9uO1xuXHRcdG1vdmVVcD86IFN0YW5kYXJkQWN0aW9uO1xuXHRcdG1vdmVEb3duPzogU3RhbmRhcmRBY3Rpb247XG5cdH07XG59O1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzdGFuZGFyZCBhY3Rpb25zIGFuZCBhZGphY2VudCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5lZWRlZCBpbiB0aGUgZnVydGhlciBjb252ZXJzaW9uIHByb2Nlc3MuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIFRoZSB0YWJsZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBTdGFuZGFyZCBhY3Rpb25zIGFuZCBjb25uZWN0ZWQgcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgY3JlYXRpb25CZWhhdmlvdXIgPSBfZ2V0Q3JlYXRpb25CZWhhdmlvdXIoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoXG5cdCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjcmVhdGlvbkJlaGF2aW91ci5tb2RlIGFzIENyZWF0aW9uTW9kZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvblxuXHQpO1xuXHRjb25zdCBjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IGdldEN1dFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdGNvbnN0IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgbWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkID0gZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmcoXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0XHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dClcblx0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zID0ge1xuXHRcdGN1dDogZ2V0U3RhbmRhcmRBY3Rpb25DdXQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0Y29weTogZ2V0U3RhbmRhcmRBY3Rpb25Db3B5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdGNyZWF0ZTogZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0ZGVsZXRlOiBnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRwYXN0ZTogZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpLFxuXHRcdG1hc3NFZGl0OiBnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdGluc2lnaHRzOiBnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRjcmVhdGlvblJvdzogZ2V0Q3JlYXRpb25Sb3coY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dClcblx0fTtcblx0Y29uc3QgY29uZmlndXJhdGlvbjogU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbiA9IHtcblx0XHRjcmVhdGlvbkJlaGF2aW91cixcblx0XHRjdXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCxcblx0XHRzdGFuZGFyZEFjdGlvbnNcblx0fTtcblxuXHRpZiAoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Y29uZmlndXJhdGlvbi5zdGFuZGFyZEFjdGlvbnMubW92ZVVwID0gZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIHRydWUpO1xuXHRcdGNvbmZpZ3VyYXRpb24uc3RhbmRhcmRBY3Rpb25zLm1vdmVEb3duID0gZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGZhbHNlKTtcblx0fVxuXG5cdHJldHVybiBjb25maWd1cmF0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0c3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbjogU3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbixcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiB7XG5cdC8vIE5lZWQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdHlwZU5hbWVQbHVyYWwgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWVQbHVyYWw7XG5cdGNvbnN0IHRpdGxlID0gdHlwZU5hbWVQbHVyYWwgJiYgY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHR5cGVOYW1lUGx1cmFsKSk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFnZU1hbmlmZXN0U2V0dGluZ3M6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IGhhc0Fic29sdXRlUGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoID09PSAwO1xuXHRjb25zdCBwMTNuTW9kZSA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbik7XG5cdGNvbnN0IGlkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IGdldFRhYmxlSUQodmlzdWFsaXphdGlvblBhdGgpIDogZ2V0VGFibGVJRChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCksIFwiTGluZUl0ZW1cIik7XG5cdGNvbnN0IHRhcmdldENhcGFiaWxpdGllcyA9IGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24ubWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRzdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLmN1dEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGNvbnN0IHRocmVzaG9sZCA9IGdldFRocmVzaG9sZCh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGFwaUlkOiBnZW5lcmF0ZShbaWQsIFwiVGFibGVcIl0pLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0ICYmIGVudGl0eVNldC5lbnRpdHlUeXBlID8gZW50aXR5U2V0LmVudGl0eVR5cGUubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHRcdG5hdmlnYXRpb25UYXJnZXRQYXRoLFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmFuYWx5dGljYWxDb25maWd1cmF0aW9uPy5hZ2dyZWdhdGlvbk9uTGVhZkxldmVsXG5cdFx0KSxcblx0XHRwMTNuTW9kZSxcblx0XHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQ6IHN0YW5kYXJkQWN0aW9uc0NvbmZpZ3VyYXRpb24uaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkLFxuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aEluZm86IGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoSW5mbyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRkaXNwbGF5TW9kZTogaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQsIHRydWUpLFxuXHRcdGNyZWF0ZTogc3RhbmRhcmRBY3Rpb25zQ29uZmlndXJhdGlvbi5jcmVhdGlvbkJlaGF2aW91cixcblx0XHRzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlLFxuXHRcdHZhcmlhbnRNYW5hZ2VtZW50OiB2YXJpYW50TWFuYWdlbWVudCA9PT0gXCJDb250cm9sXCIgJiYgIXAxM25Nb2RlID8gVmFyaWFudE1hbmFnZW1lbnRUeXBlLk5vbmUgOiB2YXJpYW50TWFuYWdlbWVudCxcblx0XHR0aHJlc2hvbGQ6IHRocmVzaG9sZCxcblx0XHRzb3J0Q29uZGl0aW9uczogZ2V0U29ydENvbmRpdGlvbnMoY29udmVydGVyQ29udGV4dCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGNvbHVtbnMpLFxuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRzZWFyY2hhYmxlOlxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3M/LmlzU2VhcmNoYWJsZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgIT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIShpc0NvbnN0YW50KGlzU2VhcmNoYWJsZSkgJiYgaXNTZWFyY2hhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aW5pdGlhbEV4cGFuc2lvbkxldmVsOiBnZXRJbml0aWFsRXhwYW5zaW9uTGV2ZWwocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pLFxuXHRcdHJlcXVpcmVkUHJvcGVydGllczogZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHQuZmlsdGVyKChwcm9wZXJ0eSkgPT4gcHJvcGVydHk/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIilcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSlcblx0fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiBUaGUgdGFibGUgbWFuaWZlc3QgY29uZmlndXJhdGlvblxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyBUaGUgdGhyZXNob2xkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGdldFRocmVzaG9sZChcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKTogbnVtYmVyIHtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpO1xuXHR9IGVsc2UgaWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHQvLyBUbyBtYWtlIHNjcm9sbGluZyBzbW9vdGgsIHdlIHNldCB0aGUgdGhyZXNob2xkIHZhbHVlIGhpZ2hlciBmb3IgdHJlZSB0YWJsZXNcblx0XHR0aHJlc2hvbGQgPSAyMDA7XG5cdH0gZWxzZSBpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJHcmlkVGFibGVcIiB8fCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0dGhyZXNob2xkID0gMTAwO1xuXHR9XG5cdHJldHVybiB0aHJlc2hvbGQ7XG59XG4vKipcbiAqIFNwbGl0cyB0aGUgdmlzdWFsaXphdGlvbiBwYXRoIGludG8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBwYXRoIGFuZCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyBUaGUgc3BsaXQgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpOiB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZzsgYW5ub3RhdGlvblBhdGg6IHN0cmluZyB9IHtcblx0Y29uc3QgW3RhcmdldE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGFubm90YXRpb25QYXRoXSA9IHZpc3VhbGl6YXRpb25QYXRoLnNwbGl0KFwiQFwiKTtcblx0bGV0IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSB0YXJnZXROYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdC8vIERyb3AgdHJhaWxpbmcgc2xhc2hcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggLSAxKTtcblx0fVxuXHRyZXR1cm4geyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKHNlbGVjdGlvblZhcmlhbnRQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb25WYXJpYW50ID0gcmVzb2x2ZWRUYXJnZXQuYW5ub3RhdGlvbiBhcyBTZWxlY3Rpb25WYXJpYW50O1xuXHRpZiAoc2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBbXTtcblx0XHRzZWxlY3Rpb24uU2VsZWN0T3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25UeXBlKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWU/LnZhbHVlID8/IFwiXCI7XG5cdFx0XHRpZiAoIXByb3BlcnR5TmFtZXMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2gocHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIF9nZXRGdWxsU2NyZWVuQmFzZWRPbkRldmljZShcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRpc0lwaG9uZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdC8vIElmIGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCwgdXNlIGFzIGRlZmF1bHQgdHJ1ZSBvbiBwaG9uZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGlzSXBob25lO1xuXHQvLyBNYWtlIHN1cmUgdGhhdCBlbmFibGVGdWxsU2NyZWVuIGlzIG5vdCBzZXQgb24gTGlzdFJlcG9ydCBmb3IgZGVza3RvcCBvciB0YWJsZXRcblx0aWYgKCFpc0lwaG9uZSAmJiBlbmFibGVGdWxsU2NyZWVuICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0ZW5hYmxlRnVsbFNjcmVlbiA9IGZhbHNlO1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKS5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkxvdywgSXNzdWVUeXBlLkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUKTtcblx0fVxuXHRyZXR1cm4gZW5hYmxlRnVsbFNjcmVlbjtcbn1cbmZ1bmN0aW9uIF9nZXRNdWx0aVNlbGVjdE1vZGUoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0c3dpdGNoIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSB7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydDpcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlOlxuXHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IGZhbHNlID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS51c2VJY29uVGFiQmFyKCkpIHtcblx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gIXRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblx0cmV0dXJuIG11bHRpU2VsZWN0TW9kZTtcbn1cbmZ1bmN0aW9uIF9nZXRUYWJsZU1vZGUoXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRpc1RlbXBsYXRlTGlzdFJlcG9ydDogYm9vbGVhblxuKTogeyByb3dDb3VudE1vZGU/OiBUYWJsZVJvd0NvdW50TW9kZTsgcm93Q291bnQ/OiBudW1iZXIgfSB7XG5cdGlmICh0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRpZiAoaXNUZW1wbGF0ZUxpc3RSZXBvcnQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJvd0NvdW50TW9kZTogXCJBdXRvXCIsXG5cdFx0XHRcdHJvd0NvdW50OiAzXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgaW5pdGlhbFJvd0NvdW50OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKHRhYmxlVHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiR3JpZFRhYmxlXCI6XG5cdFx0XHRcdFx0aW5pdGlhbFJvd0NvdW50ID0gdGFibGVTZXR0aW5ncy5yb3dDb3VudE1vZGUgPT09IFwiQXV0b1wiID8gMyA6IDU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJUcmVlVGFibGVcIjpcblx0XHRcdFx0Y2FzZSBcIkFuYWx5dGljYWxUYWJsZVwiOlxuXHRcdFx0XHRcdGluaXRpYWxSb3dDb3VudCA9IHRhYmxlU2V0dGluZ3Mucm93Q291bnRNb2RlID09PSBcIkF1dG9cIiA/IDMgOiAxMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpbml0aWFsUm93Q291bnQgPSA1O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cm93Q291bnRNb2RlOiB0YWJsZVNldHRpbmdzLnJvd0NvdW50TW9kZSA/PyBcIkZpeGVkXCIsXG5cdFx0XHRcdHJvd0NvdW50OiB0YWJsZVNldHRpbmdzLnJvd0NvdW50ID8/IGluaXRpYWxSb3dDb3VudFxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG59XG5mdW5jdGlvbiBfZ2V0Q29uZGVuc2VkVGFibGVMYXlvdXQoX3RhYmxlVHlwZTogVGFibGVUeXBlLCBfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gX3RhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgIT09IHVuZGVmaW5lZCAmJiBfdGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiXG5cdFx0PyBfdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dFxuXHRcdDogZmFsc2U7XG59XG5mdW5jdGlvbiBfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdChfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IG51bWJlciB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IHRydWUgfHwgX3RhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogX3RhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgfHwgMjAwO1xufVxuZnVuY3Rpb24gX2dldFRhYmxlSW5saW5lQ3JlYXRpb25Sb3dDb3VudChfdGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbik6IG51bWJlciB7XG5cdHJldHVybiBfdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgPyBfdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgOiAxO1xufVxuXG5mdW5jdGlvbiBfZ2V0RW5hYmxlRXhwb3J0KFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVuYWJsZVBhc3RlOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0ICE9PSB1bmRlZmluZWRcblx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0OiBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBcIk9iamVjdFBhZ2VcIiB8fCBlbmFibGVQYXN0ZTtcbn1cbmZ1bmN0aW9uIF9nZXRGcm96ZW5Db2x1bW5Db3VudCh0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZnJvemVuQ29sdW1uQ291bnQ7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgY29sdW1uIGZyZWV6ZSBpcyBlbmFibGVkIG9yIG5vdC5cbiAqIEBwYXJhbSB0YWJsZVNldHRpbmdzIFRhYmxlU2V0dGluZ3NcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBjb2x1bW4gZnJlZXplIHNob3VsZCBiZSBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gZ2V0RW5hYmxlQ29sdW1uRnJlZXplKHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlU2V0dGluZ3MuZGlzYWJsZUNvbHVtbkZyZWV6ZSAhPT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlU2V0dGluZ3MgaWYgaXQgZXhpc3RzLlxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgVGFibGVTZXR0aW5ncyBPYmplY3RcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIG9mIHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyIG9yIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIF9nZXRXaWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcih0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiB0YWJsZVNldHRpbmdzLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJDb25maWd1cmF0aW9uKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZFxuKToge1xuXHRmaWx0ZXJzOiBQYXJ0aWFsPFJlY29yZDxcInF1aWNrRmlsdGVyc1wiIHwgXCJoaWRkZW5GaWx0ZXJzXCIsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+Pjtcblx0aGVhZGVyVmlzaWJsZTogYm9vbGVhbjtcbn0ge1xuXHRsZXQgaGlkZVRhYmxlVGl0bGUgPSBmYWxzZTtcblx0Y29uc3QgZmlsdGVyczogUGFydGlhbDxSZWNvcmQ8XCJxdWlja0ZpbHRlcnNcIiB8IFwiaGlkZGVuRmlsdGVyc1wiLCBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uPj4gPSB7fTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0aWYgKHRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uKSB7XG5cdFx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRocyA9ICh0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbi5wYXRocyA/PyBbXSkucmVkdWNlKFxuXHRcdFx0KGZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLCBwYXRoKSA9PiB7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhdGguYW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUGF0aHMucHVzaCh7IGFubm90YXRpb25QYXRoOiBwYXRoLmFubm90YXRpb25QYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJQYXRocztcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdFx0aWYgKHF1aWNrRmlsdGVyUGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJzLnF1aWNrRmlsdGVycyA9IHtcblx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24uc2hvd0NvdW50cyxcblx0XHRcdFx0cGF0aHM6IHF1aWNrRmlsdGVyUGF0aHNcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbikge1xuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGUgU2VsZWN0aW9uIFZhcmlhbnQgdG8gaGlkZGVuRmlsdGVycyBpbiBvcmRlciB0byBzZXQgdGhlIFNWIGZpbHRlcnMgdG8gdGhlIHRhYmxlLlxuXHRcdCAqIE1EQyBUYWJsZSBvdmVycmlkZXMgYmluZGluZyBGaWx0ZXIgYW5kIGZyb20gU0FQIEZFIHRoZSBvbmx5IG1ldGhvZCB3aGVyZSB3ZSBhcmUgYWJsZSB0byBhZGRcblx0XHQgKiBhZGRpdGlvbmFsIGZpbHRlciBpcyAncmViaW5kVGFibGUnIGludG8gVGFibGUgZGVsZWdhdGUuXG5cdFx0ICogVG8gYXZvaWQgaW1wbGVtZW50aW5nIHNwZWNpZmljIExSIGZlYXR1cmUgdG8gU0FQIEZFIE1hY3JvIFRhYmxlLCB0aGUgZmlsdGVyKHMpICBub3QgbWFuYWdlZCBieSB0aGUgRmlsdGVyQmFyXG5cdFx0ICogY2FuIGJlIHBhc3NlZCB0byBtYWNybyB0YWJsZSB2aWEgcGFyYW1ldGVyL2NvbnRleHQgbmFtZWQgZmlsdGVycyBhbmQga2V5IGhpZGRlbkZpbHRlcnMuXG5cdFx0ICovXG5cdFx0ZmlsdGVycy5oaWRkZW5GaWx0ZXJzID0geyBwYXRoczogW3sgYW5ub3RhdGlvblBhdGg6IGBAJHtzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCJAXCIpWzFdfWAgfV0gfTtcblx0fVxuXG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKGZpbHRlcnM/LnF1aWNrRmlsdGVycyAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhY3Rpb24gd2lsbCBoYXZlIGFuIGV4cHJlc3Npb24gZm9yIGVuYWJsZW1lbnQgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YUZpZWxkIGNvbnRhaW5pbmcgYW4gYWN0aW9uXG4gKiBAcGFyYW0gc0VudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5IGZvciB0ZW1wbGF0aW5nXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFuIGV4cHJlc3Npb24gZm9yIGVuYWJsZW1lbnQgaXMgdG8gYmUgZ2VuZXJhdGVkXG4gKi9cbmZ1bmN0aW9uIF91c2VFbmFibGVkRXhwcmVzc2lvbihkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzLCBzRW50aXR5VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdC8vIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB3aGVuIGEgdGFibGUgYWN0aW9uIGhhcyBhbiBPcGVyYXRpb25BdmFpbGFibGUgdGhhdCBsZWFkcyB0byBhbiBlbmFibGVtZW50IGV4cHJlc3Npb25cblx0Ly8gYW5kIGlzIG5vdCBkZXBlbmRlbnQgdXBvbiB0aGUgdGFibGUgZW50cmllcy5cblx0Ly8gMS4gQW4gYWN0aW9uIHdpdGggYW4gb3ZlcmxvYWQsIHRoYXQgaXMgZXhlY3V0ZWQgYWdhaW5zdCBhIHBhcmVudCBlbnRpdHkuXG5cdC8vIDIuIEFuIHVuYm91bmQgYWN0aW9uXG5cdC8vIDMuIEEgc3RhdGljIGFjdGlvbiAodGhhdCBpcywgYm91bmQgdG8gYSBjb2xsZWN0aW9uKVxuXHRsZXQgdXNlRW5hYmxlZEV4cHJlc3Npb24gPSBmYWxzZTtcblx0aWYgKGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFVuYm91bmQgYWN0aW9uLiBJcyByZWNvZ25pc2VkLCBidXQgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIGNoZWNrcyBmb3IgaXNCb3VuZCA9IHRydWUsIHNvIG5vdCBnZW5lcmF0ZWQuXG5cdFx0Y29uc3QgaXNCb3VuZCA9IGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ/LmlzQm91bmQ7XG5cdFx0Ly9vdmVybG9hZCBhY3Rpb25cblx0XHRjb25zdCBvdmVybG9hZEFjdGlvbiA9IGlzQm91bmQgJiYgZGF0YUZpZWxkLkFjdGlvblRhcmdldD8uc291cmNlVHlwZSAhPT0gc0VudGl0eVR5cGU7XG5cdFx0Ly9zdGF0aWMgYWN0aW9uXG5cdFx0Y29uc3Qgc3RhdGljQWN0aW9uID0gZGF0YUZpZWxkLkFjdGlvblRhcmdldD8ucGFyYW1ldGVyc1swXT8uaXNDb2xsZWN0aW9uO1xuXHRcdC8vY29weSBhY3Rpb25cblx0XHRpZiAoIWlzQm91bmQgfHwgb3ZlcmxvYWRBY3Rpb24gfHwgc3RhdGljQWN0aW9uKSB7XG5cdFx0XHR1c2VFbmFibGVkRXhwcmVzc2lvbiA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1c2VFbmFibGVkRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0YWJsZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gd2l0aCBUcmVlLVRhYmxlIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ29uZmlndXJhdGlvbiBUaGUgdGFibGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHRhYmxlU2V0dGluZ3MgU2V0dGluZ3MgZnJvbSB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJlZVRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHR0YWJsZUNvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWRcbik6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbik7XG5cblx0dGFibGVDb25maWd1cmF0aW9uLmhpZXJhcmNoeVF1YWxpZmllciA9IGdldEhpZXJhcmNoeVF1YWxpZmllcihlbnRpdHlUeXBlLCB0YWJsZVNldHRpbmdzKTtcblx0Y29uc3QgaGllcmFyY2h5UGFyZW50TmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IGdldEhpZXJhcmNoeVBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uaGllcmFyY2h5UXVhbGlmaWVyIVxuXHQpO1xuXHRjb25zdCBub25VcGRhdGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IGdldE5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNIaWVyYXJjaHlQYXJlbnROb2RlVXBkYXRhYmxlID0gIW5vblVwZGF0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5pbmNsdWRlcyhoaWVyYXJjaHlQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmlzTm9kZU1vdmFibGUgPSBnZXRDdXN0b21GdW5jdGlvbkluZm8odGFibGVTZXR0aW5ncy5pc05vZGVNb3ZhYmxlLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uaXNOb2RlQ29weWFibGUgPSBnZXRDdXN0b21GdW5jdGlvbkluZm8odGFibGVTZXR0aW5ncy5pc05vZGVDb3B5YWJsZSwgdGFibGVDb25maWd1cmF0aW9uKTtcblx0dGFibGVDb25maWd1cmF0aW9uLmlzTW92ZVRvUG9zaXRpb25BbGxvd2VkID0gZ2V0Q3VzdG9tRnVuY3Rpb25JbmZvKHRhYmxlU2V0dGluZ3MuaXNNb3ZlVG9Qb3NpdGlvbkFsbG93ZWQsIHRhYmxlQ29uZmlndXJhdGlvbik7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5pc0NvcHlUb1Bvc2l0aW9uQWxsb3dlZCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmlzQ29weVRvUG9zaXRpb25BbGxvd2VkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRlRW5hYmxlbWVudCA9IGdldEN1c3RvbUZ1bmN0aW9uSW5mbyh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaXNDcmVhdGVFbmFibGVkLCB0YWJsZUNvbmZpZ3VyYXRpb24pO1xuXG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnByb3BlcnR5TmFtZSAmJiB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubm9kZVR5cGU/LnZhbHVlcykge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnZhbHVlcztcblx0XHR0YWJsZUNvbmZpZ3VyYXRpb24ubm9kZVR5cGUgPSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWU6IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlLm5vZGVUeXBlLnByb3BlcnR5TmFtZSxcblx0XHRcdHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5vZGVUeXBlSW5mbyA9IHZhbHVlc1t2YWx1ZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBub2RlVHlwZUluZm8gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0XHR0ZXh0OiBub2RlVHlwZUluZm9cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRcdHRleHQ6IG5vZGVUeXBlSW5mby5sYWJlbCxcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0XHRcdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHQ/IGdldEZpZWxkTGlzdChub2RlVHlwZUluZm8uY3JlYXRpb25GaWVsZHMsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH07XG5cdH1cblxuXHQvLyBDcmVhdGUgaW4gcGxhY2Vcblx0aWYgKHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVJblBsYWNlKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmNyZWF0ZUluUGxhY2UgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21GdW5jdGlvbkluZm8oXG5cdHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHRhYmxlQ29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogRXh0ZXJuYWxNZXRob2RDb25maWcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXZhbHVlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCBsYXN0RG90SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdGNvbnN0IG1vZHVsZU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKTtcblx0Y29uc3QgbWV0aG9kTmFtZSA9IHZhbHVlLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKTtcblxuXHQvLyBBZGQgdGhlIGN1c3RvbSBtb2R1bGUgaW4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbW9kdWxlcyBpZiBuZWNlc3Nhcnlcblx0aWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCIvZXh0ZW5zaW9uL1wiKSkge1xuXHRcdGlmICghdGFibGVDb25maWd1cmF0aW9uLmFkZGl0aW9uYWxSZXF1aXJlZE1vZHVsZXMpIHtcblx0XHRcdHRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzID0gW21vZHVsZU5hbWVdO1xuXHRcdH0gZWxzZSBpZiAoIXRhYmxlQ29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUmVxdWlyZWRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XG5cdFx0XHR0YWJsZUNvbmZpZ3VyYXRpb24uYWRkaXRpb25hbFJlcXVpcmVkTW9kdWxlcy5wdXNoKG1vZHVsZU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUgfTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBoaWVyYXJjaHkgcXVhbGlmaWVyIGZyb20gdGhlIG1hbmlmZXN0IG9yIHRoZSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZVNldHRpbmdzIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB0aGUgaGllcmFyY2h5IHF1YWxpZmllciBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gKi9cblxuZnVuY3Rpb24gZ2V0SGllcmFyY2h5UXVhbGlmaWVyKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodGFibGVTZXR0aW5ncy5oaWVyYXJjaHlRdWFsaWZpZXIpIHtcblx0XHRyZXR1cm4gdGFibGVTZXR0aW5ncy5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdH1cblx0Y29uc3QgYWdncmVnYXRpb25Bbm5vdGF0aW9uID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24gYXMgRW50aXR5VHlwZUFubm90YXRpb25zX0FnZ3JlZ2F0aW9uICYgeyBfa2V5cz86IHN0cmluZ1tdIH07XG5cdGNvbnN0IGhpZXJhcmNoeUFubm90YXRpb24gPSBlbnRpdHlUeXBlLmFubm90YXRpb25zPy5IaWVyYXJjaHkgYXMgRW50aXR5VHlwZUFubm90YXRpb25zX0hpZXJhcmNoeSAmIHsgX2tleXM/OiBzdHJpbmdbXSB9O1xuXHQvLyBXZSBvbmx5IGNoZWNrIHRoZSBoaWVyYXJjaHlRdWFsaWZpZXIgZnJvbSB0aGUgbWFuaWZlc3Qgd2hlbiB0aGUgdHJlZSB0YWJsZSBpcyBzcGVjaWZpY2FsbHkgc2V0LCBvdGhlcndpc2Ugd2UgZ2V0IGl0IGZyb20gdGhlIGFubm90YXRpb25zXG5cdC8vIGlmIGJvdGggYW5ub3RhdGlvbnMgaGF2ZSB0aGUgc2FtZSBxdWFsaWZpZXIsIHVzZSBpdFxuXHQvLyBJZiB0aGVyZSBpcyBubyBxdWFsaWZpZXIgb3IgZGlmZmVyZW50IHF1YWxpZmllcnMsIHRoZSBoaWVyYXJjaHlRdWFsaWZpZXIgcmVtYWlucyB1bmRlZmluZWRcblx0Ly8gTm90ZTogSW4gY2FzZSBvZiBtdWx0aXBsZSBoaWVyYXJjaGllcyB3aXRoIHRoZSBzYW1lIHF1YWxpZmllciwgdGhlIGZpcnN0IG9uZSBmb3VuZCB3aWxsIGJlIHVzZWRcblx0Y29uc3QgcXVhbGlmaWVkTmFtZSA9IGhpZXJhcmNoeUFubm90YXRpb24/Ll9rZXlzPy5maW5kKFxuXHRcdChrZXkpID0+IGtleS5pbmNsdWRlcyhcIlJlY3Vyc2l2ZUhpZXJhcmNoeSNcIikgJiYgYWdncmVnYXRpb25Bbm5vdGF0aW9uPy5fa2V5cz8uaW5jbHVkZXMoa2V5KVxuXHQpO1xuXHRpZiAocXVhbGlmaWVkTmFtZSkge1xuXHRcdHJldHVybiAoaGllcmFyY2h5QW5ub3RhdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB7IHF1YWxpZmllcj86IHN0cmluZyB9PilbcXVhbGlmaWVkTmFtZV0/LnF1YWxpZmllcjtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSB0YWJsZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gb3B0aW1pc3RpYyBiYXRjaCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgVGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiBAcmV0dXJucyBUcnVlIGlmIE9wdGltaXN0aWMgYmF0Y2ggbW9kZSBpcyBkaXNhYmxlZFxuICovXG5mdW5jdGlvbiBnZXRPcHRpbWlzdGljQmF0Y2hTZXR0aW5nc0Zyb21NYW5pZmVzdCh0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdC8vIE9wdGltaXN0aWMgYmF0Y2ggaXMgc2V0IGJ5IGRlZmF1bHRcblx0cmV0dXJuIHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8uZGlzYWJsZVJlcXVlc3RDYWNoZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzZXR0aW5ncyBjb21pbmcgZnJvbSB0aGUgbWFuaWZlc3QgcmVsYXRlZCB0byB0aGUgbWFzcyBlZGl0IGRpYWxvZy5cbiAqIEBwYXJhbSB0YWJsZVNldHRpbmdzIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbWFzcyBlZGl0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXNzRWRpdFNldHRpbmdzKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IE1hc3NFZGl0VGFibGVDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgZGVmYXVsdEZpZWxkQ29uZmlndXJhdGlvbiA9IHtcblx0XHR2aXNpYmxlRmllbGRzOiBbXSxcblx0XHRpZ25vcmVkRmllbGRzOiBbXSxcblx0XHRvcGVyYXRpb25Hcm91cGluZ01vZGU6XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHRcdFx0XHQ/IE9wZXJhdGlvbkdyb3VwaW5nTW9kZS5Jc29sYXRlZFxuXHRcdFx0XHQ6IE9wZXJhdGlvbkdyb3VwaW5nTW9kZS5DaGFuZ2VTZXRcblx0fTtcblx0aWYgKCF0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0KSB7XG5cdFx0cmV0dXJuIHsgZW5hYmxlZDogZmFsc2UsIC4uLmRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24gfTtcblx0fVxuXHRpZiAodGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdCA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiB7IGVuYWJsZWQ6IHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQsIC4uLmRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24gfTtcblx0fSBlbHNlIGlmICh0eXBlb2YgdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0dmlzaWJsZUZpZWxkczogZ2V0RmllbGRMaXN0KHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQudmlzaWJsZUZpZWxkcywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRpZ25vcmVkRmllbGRzOiBnZXRGaWVsZExpc3QodGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdC5pZ25vcmVkRmllbGRzLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdG9wZXJhdGlvbkdyb3VwaW5nTW9kZTpcblx0XHRcdFx0dGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdC5vcGVyYXRpb25Hcm91cGluZ01vZGUgJiZcblx0XHRcdFx0T2JqZWN0LnZhbHVlcyhPcGVyYXRpb25Hcm91cGluZ01vZGUpLmluY2x1ZGVzKHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQub3BlcmF0aW9uR3JvdXBpbmdNb2RlKVxuXHRcdFx0XHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVNYXNzRWRpdC5vcGVyYXRpb25Hcm91cGluZ01vZGVcblx0XHRcdFx0XHQ6IGRlZmF1bHRGaWVsZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uR3JvdXBpbmdNb2RlLFxuXHRcdFx0Y3VzdG9tRnJhZ21lbnQ6IHRhYmxlU2V0dGluZ3MuZW5hYmxlTWFzc0VkaXQuY3VzdG9tRnJhZ21lbnQsXG5cdFx0XHRmcm9tSW5saW5lOiB0YWJsZVNldHRpbmdzLmVuYWJsZU1hc3NFZGl0LmZyb21JbmxpbmVcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7IGVuYWJsZWQ6IGZhbHNlLCAuLi5kZWZhdWx0RmllbGRDb25maWd1cmF0aW9uIH07XG59XG5cbi8qKlxuICogR2V0cyBhIGxpc3Qgb2YgdGhlIGZpZWxkcyBjb21pbmcgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKiBAcGFyYW0gZmllbGRzIFRoZSBmaWVsZHMsIGNvdWxkIGJlIGEgRmllbGRHcm91cCBvciBmaWVsZHMgc2VwYXJhdGVkIGJ5IGEgY29tbWFcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRMaXN0KGZpZWxkczogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBzdHJpbmdbXSB7XG5cdGlmICghZmllbGRzKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmIChmaWVsZHMuaW5jbHVkZXMoVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCkpIHtcblx0XHRmaWVsZHMgPSBmaWVsZHMuc3RhcnRzV2l0aChcIkBcIikgPyBmaWVsZHMgOiBgQCR7ZmllbGRzfWA7XG5cdFx0Y29uc3QgZmllbGRHcm91cCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb248RmllbGRHcm91cD4oZmllbGRzKTtcblx0XHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGZpZWxkR3JvdXAuYW5ub3RhdGlvbiwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gZmllbGRHcm91cC5hbm5vdGF0aW9uLkRhdGEucmVkdWNlKChwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgZmllbGQpID0+IHtcblx0XHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZC5WYWx1ZSkpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzLnB1c2goZmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHByb3BlcnRpZXM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fVxuXHRyZXR1cm4gZmllbGRzXG5cdFx0LnJlcGxhY2UoL1xccy9nLCBcIlwiKVxuXHRcdC5zcGxpdChcIixcIilcblx0XHQubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRjaGVja0NvbmRlbnNlZExheW91dCA9IHRydWUsXG5cdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogU2VsZWN0aW9uVmFyaWFudFR5cGVcbik6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24ge1xuXHRjb25zdCBfbWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3MgPz8ge307XG5cdGNvbnN0IGdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncyA9IF9tYW5pZmVzdFdyYXBwZXIuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKTtcblx0Y29uc3QgZGVmYXVsdENyZWF0aW9uTW9kZSA9XG5cdFx0Z2xvYmFsRkVNYW5pZmVzdFNldHRpbmdzPy5tYWNyb3M/LnRhYmxlPy5kZWZhdWx0Q3JlYXRpb25Nb2RlID09PSBcIklubGluZUNyZWF0aW9uUm93c1wiID8gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyA6IHVuZGVmaW5lZDtcblx0Y29uc3QgY3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubmFtZSA/PyBkZWZhdWx0Q3JlYXRpb25Nb2RlID8/IENyZWF0aW9uTW9kZS5OZXdQYWdlO1xuXHRjb25zdCBlbmFibGVBdXRvQ29sdW1uV2lkdGggPSAhX21hbmlmZXN0V3JhcHBlci5pc1Bob25lKCk7XG5cdGNvbnN0IGRpc2FibGVDb3B5VG9DbGlwYm9hcmQgPSB0YWJsZVNldHRpbmdzLmRpc2FibGVDb3B5VG9DbGlwYm9hcmQ7XG5cdGNvbnN0IHRlbXBsYXRlVHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCk7XG5cdGNvbnN0IGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQgPSBjaGVja0NvbmRlbnNlZExheW91dCAmJiBfbWFuaWZlc3RXcmFwcGVyLmlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50KCk7XG5cdGNvbnN0IG9GaWx0ZXJDb25maWd1cmF0aW9uID0gbGluZUl0ZW1Bbm5vdGF0aW9uXG5cdFx0PyBnZXRGaWx0ZXJDb25maWd1cmF0aW9uKHRhYmxlU2V0dGluZ3MsIGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCwgc2VsZWN0aW9uVmFyaWFudEFubm90YXRpb24pXG5cdFx0OiB7fTtcblx0Y29uc3QgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0Y29uc3QgZXhwb3J0UmVxdWVzdFNpemUgPSB0YWJsZVNldHRpbmdzLmV4cG9ydFJlcXVlc3RTaXplO1xuXHRjb25zdCB0YWJsZVR5cGUgPSBnZXRUYWJsZVR5cGUoY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdFNldHRpbmdzLCBsaW5lSXRlbUFubm90YXRpb24pO1xuXHRjb25zdCBhbmFseXRpY2FsQ29uZmlndXJhdGlvbiA9IHRhYmxlU2V0dGluZ3MuYW5hbHl0aWNhbENvbmZpZ3VyYXRpb247XG5cdC8vIEJ5IGRlZmF1bHQsIHBhc3RlIGlzIGVuYWJsZWQgb24gYW4gT2JqZWN0UGFnZSBhbmQgb24gYSBMaXN0UmVwb3J0IHdpdGggYSBkcmFmdCBUcmVlVGFibGVcblx0Y29uc3QgZW5hYmxlUGFzdGUgPVxuXHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgPz9cblx0XHQoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCIgfHxcblx0XHRcdCh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIgJiYgKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgIT09IHVuZGVmaW5lZCkpO1xuXHRjb25zdCB0YWJsZVJvd01vZGUgPSBfZ2V0VGFibGVNb2RlKHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncywgdGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCk7XG5cdGNvbnN0IGRlZmF1bHRTY3JvbGxUaHJlc2hvbGQgPSB0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIgPyAzMDAgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGRlZmF1bHRQb3BpbkxheW91dCA9XG5cdFx0dGFibGVUeXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiXG5cdFx0XHQ/IHRhYmxlU2V0dGluZ3M/LnBvcGluTGF5b3V0ID8/IGdsb2JhbEZFTWFuaWZlc3RTZXR0aW5ncz8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdFBvcGluTGF5b3V0ID8/IFwiQmxvY2tcIlxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdGNvbnN0IGNvbmRlbnNlZFRhYmxlTGF5b3V0ID0gX2dldENvbmRlbnNlZFRhYmxlTGF5b3V0KHRhYmxlVHlwZSwgdGFibGVTZXR0aW5ncyk7XG5cdGxldCBpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID0gZmFsc2U7XG5cdGlmICh0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSkge1xuXHRcdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPVxuXHRcdFx0dHlwZW9mIHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdD8gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPT09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU7XG5cdH1cblx0bGV0IHVzZVRleHRGb3JOb0RhdGFNZXNzYWdlczogc3RyaW5nO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHR1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMgPSBcImlsbHVzdHJhdGVkTWVzc2FnZS1BdXRvXCI7XG5cdH0gZWxzZSB7XG5cdFx0dXNlVGV4dEZvck5vRGF0YU1lc3NhZ2VzID0gX21hbmlmZXN0V3JhcHBlci5nZXRVc2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMoKSA/IFwidGV4dFwiIDogXCJpbGx1c3RyYXRlZE1lc3NhZ2UtRXh0cmFTbWFsbFwiO1xuXHR9XG5cblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Ly8gSWYgbm8gY3JlYXRlQXRFbmQgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgZmFsc2UgZm9yIElubGluZS9DcmVhdGlvbkRpYWxvZyBjcmVhdGUgYW5kIHRydWUgb3RoZXJ3aXNlXG5cdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHR0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZFxuXHRcdFx0XHQ6ICFbQ3JlYXRpb25Nb2RlLklubGluZSwgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nXS5pbmNsdWRlcyhjcmVhdGlvbk1vZGUpLFxuXHRcdGNyZWF0aW9uTW9kZTogY3JlYXRpb25Nb2RlLFxuXHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOlxuXHRcdFx0Y3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2dcblx0XHRcdFx0PyBnZXRGaWVsZExpc3QodGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0aW9uRmllbGRzLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRoYXNEYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXI6IHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogIWN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA/ICEhdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgOiBmYWxzZSxcblx0XHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCxcblx0XHRlbmFibGVQYXN0aW5nT2ZDb21wdXRlZFByb3BlcnRpZXM6IHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGluZ09mQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuXHRcdGlnbm9yZWRGaWVsZHM6IHRhYmxlU2V0dGluZ3MuaWdub3JlZEZpZWxkcyxcblx0XHRyZWFkT25seTogdGFibGVTZXR0aW5ncy5yZWFkT25seSB8fCAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiID8gdHJ1ZSA6IHVuZGVmaW5lZCksIC8vIEFuYWx5dGljYWwgdGFibGVzIGFyZSBhbHdheXMgcmVhZC1vbmx5IGZvciB0aGUgdGltZSBiZWluZ1xuXHRcdGVuYWJsZUV4cG9ydDogX2dldEVuYWJsZUV4cG9ydCh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBlbmFibGVQYXN0ZSksXG5cdFx0ZXhwb3J0RmlsZU5hbWU6IHRhYmxlU2V0dGluZ3MuZXhwb3J0RmlsZU5hbWUsXG5cdFx0ZXhwb3J0U2hlZXROYW1lOiB0YWJsZVNldHRpbmdzLmV4cG9ydFNoZWV0TmFtZSxcblx0XHRhbmFseXRpY2FsQ29uZmlndXJhdGlvbixcblx0XHRmcm96ZW5Db2x1bW5Db3VudDogX2dldEZyb3plbkNvbHVtbkNvdW50KHRhYmxlU2V0dGluZ3MpLFxuXHRcdGVuYWJsZUNvbHVtbkZyZWV6ZTogZ2V0RW5hYmxlQ29sdW1uRnJlZXplKHRhYmxlU2V0dGluZ3MpLFxuXHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBfZ2V0V2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIodGFibGVTZXR0aW5ncyksXG5cdFx0ZW5hYmxlRnVsbFNjcmVlbjogX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIF9tYW5pZmVzdFdyYXBwZXIuaXNQaG9uZSgpKSxcblx0XHRtYXNzRWRpdDogZ2V0TWFzc0VkaXRTZXR0aW5ncyh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRlbmFibGVBZGRDYXJkVG9JbnNpZ2h0czogdGFibGVTZXR0aW5ncz8uZW5hYmxlQWRkQ2FyZFRvSW5zaWdodHMsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdGRpc2FibGVDb3B5VG9DbGlwYm9hcmQ6IGRpc2FibGVDb3B5VG9DbGlwYm9hcmQsXG5cdFx0aGVhZGVyVmlzaWJsZTogdHJ1ZSxcblx0XHRoZWFkZXI6IHRhYmxlU2V0dGluZ3MuaGVhZGVyLFxuXHRcdG11bHRpU2VsZWN0TW9kZTogX2dldE11bHRpU2VsZWN0TW9kZSh0YWJsZVNldHRpbmdzLCB0YWJsZVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHNlbGVjdGlvbkxpbWl0OiBfZ2V0VGFibGVTZWxlY3Rpb25MaW1pdCh0YWJsZVNldHRpbmdzKSxcblx0XHRpbmxpbmVDcmVhdGlvblJvd0NvdW50OiBfZ2V0VGFibGVJbmxpbmVDcmVhdGlvblJvd0NvdW50KHRhYmxlU2V0dGluZ3MpLFxuXHRcdGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGU6IGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUsXG5cdFx0c2hvd1Jvd0NvdW50OiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzID8gZmFsc2UgOiAhX21hbmlmZXN0V3JhcHBlci5nZXRWaWV3Q29uZmlndXJhdGlvbigpPy5zaG93Q291bnRzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRkaXNhYmxlUmVxdWVzdENhY2hlOiBnZXRPcHRpbWlzdGljQmF0Y2hTZXR0aW5nc0Zyb21NYW5pZmVzdCh0YWJsZU1hbmlmZXN0U2V0dGluZ3MpLFxuXHRcdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBjb25kZW5zZWRUYWJsZUxheW91dCAmJiBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50LFxuXHRcdGlzQ29tcGFjdFR5cGU6IF9tYW5pZmVzdFdyYXBwZXIuaXNDb21wYWN0VHlwZSgpLFxuXHRcdGV4cG9ydFJlcXVlc3RTaXplOiBleHBvcnRSZXF1ZXN0U2l6ZSxcblx0XHRlbmFibGVVcGxvYWRQbHVnaW46ICEhY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpLmFubm90YXRpb25zPy5VST8uTWVkaWFSZXNvdXJjZT8uU3RyZWFtLFxuXHRcdG1vZGVGb3JOb0RhdGFNZXNzYWdlOiB1c2VUZXh0Rm9yTm9EYXRhTWVzc2FnZXMsXG5cdFx0c2Nyb2xsVGhyZXNob2xkOiB0YWJsZVNldHRpbmdzLnNjcm9sbFRocmVzaG9sZCA/PyBkZWZhdWx0U2Nyb2xsVGhyZXNob2xkLFxuXHRcdHRocmVzaG9sZDogdGFibGVTZXR0aW5ncy50aHJlc2hvbGQsXG5cdFx0cG9waW5MYXlvdXQ6IHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIiA/IHRhYmxlU2V0dGluZ3MucG9waW5MYXlvdXQgPz8gZGVmYXVsdFBvcGluTGF5b3V0IDogdW5kZWZpbmVkXG5cdH07XG5cblx0Y29uc3QgdGFibGVDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0geyAuLi5vQ29uZmlndXJhdGlvbiwgLi4udGFibGVSb3dNb2RlLCAuLi5vRmlsdGVyQ29uZmlndXJhdGlvbiB9O1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uYmVmb3JlUmViaW5kVGFibGUgPSB0YWJsZVNldHRpbmdzLmJlZm9yZVJlYmluZFRhYmxlO1xuXHR0YWJsZUNvbmZpZ3VyYXRpb24uc2VsZWN0aW9uQ2hhbmdlID0gdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25DaGFuZ2U7XG5cdHRhYmxlQ29uZmlndXJhdGlvbi5yb3dQcmVzcyA9IHRhYmxlU2V0dGluZ3Mucm93UHJlc3M7XG5cdGlmICh0YWJsZVR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHR1cGRhdGVUcmVlVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGFibGVDb25maWd1cmF0aW9uLCB0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBsaW5lSXRlbUFubm90YXRpb24pO1xuXHR9XG5cblx0aWYgKHRhYmxlU2V0dGluZ3MuaGVhZGVyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLmhlYWRlclZpc2libGUgPSB0YWJsZVNldHRpbmdzLmhlYWRlclZpc2libGU7XG5cdH1cblxuXHRpZiAodGFibGVDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0dGFibGVDb25maWd1cmF0aW9uLm91dGJvdW5kQ3JlYXRpb24gPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ub3V0Ym91bmQ7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb25maWd1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRUYWJsZVR5cGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVNYW5pZmVzdFNldHRpbmdzPzogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdGxpbmVJdGVtQW5ub3RhdGlvbj86IExpbmVJdGVtXG4pOiBUYWJsZVR5cGUge1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlKSB7XG5cdFx0Ly8gaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVkIGEgdGFibGUgdHlwZSB3ZSB3aWxsIHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncy50eXBlO1xuXHR9XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbik7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCByZXF1aXJlZEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPSBbXCJmaWx0ZXJcIiwgXCJpZGVudGl0eVwiLCBcIm9yZGVyYnlcIiwgXCJza2lwXCIsIFwidG9wXCIsIFwiZ3JvdXBieVwiLCBcImFnZ3JlZ2F0ZVwiLCBcImNvbmNhdFwiXTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdHJlcXVpcmVkQWxsb3dlZFRyYW5zZm9ybWF0aW9ucy5ldmVyeShcblx0XHRcdCh0cmFuc2Zvcm1hdGlvbjogc3RyaW5nKSA9PiBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk/LmluY2x1ZGVzKHRyYW5zZm9ybWF0aW9uKVxuXHRcdClcblx0KSB7XG5cdFx0cmV0dXJuIFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cdH1cblxuXHRjb25zdCBoaWVyYXJjaHlBbm5vdGF0aW9uID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uSGllcmFyY2h5IGFzIEVudGl0eVR5cGVBbm5vdGF0aW9uc19IaWVyYXJjaHkgJiB7IF9rZXlzPzogc3RyaW5nW10gfTtcblx0Y29uc3QgYWdncmVnYXRpb25Bbm5vdGF0aW9uID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24gYXMgRW50aXR5VHlwZUFubm90YXRpb25zX0FnZ3JlZ2F0aW9uICYgeyBfa2V5cz86IHN0cmluZ1tdIH07XG5cdGlmIChoaWVyYXJjaHlBbm5vdGF0aW9uPy5fa2V5cz8uc29tZSgoa2V5KSA9PiBrZXkuaW5jbHVkZXMoXCJSZWN1cnNpdmVIaWVyYXJjaHkjXCIpICYmIGFnZ3JlZ2F0aW9uQW5ub3RhdGlvbj8uX2tleXM/LmluY2x1ZGVzKGtleSkpKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFJlY3Vyc2l2ZUhpZXJhcmNoeSBxdWFsaWZpZXIgaXMgcHJlc2VudCBpbiBib3RoIGhpZXJhcmNoeUFubm90YXRpb24gYW5kIGFnZ3JlZ2F0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1xuXHRcdHJldHVybiBcIlRyZWVUYWJsZVwiO1xuXHR9XG5cblx0Ly8gZGVmYXVsdCBpcyB0aGUgUmVzcG9uc2l2ZVRhYmxlXG5cdHJldHVybiBcIlJlc3BvbnNpdmVUYWJsZVwiO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGdldFRhYmxlQWN0aW9ucyxcblx0Y3JlYXRlVGFibGVWaXN1YWxpemF0aW9uLFxuXHRjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uLFxuXHRnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGdldFNlbGVjdGlvbk1vZGUsXG5cdGdldFAxM25Nb2RlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbnNDb25maWd1cmF0aW9uLFxuXHRnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uLFxuXHRzcGxpdFBhdGgsXG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yVHlwZSxcblx0Y3JlYXRlUmVxdWVzdGVkUHJvcGVydGllcyxcblx0Z2V0TmF2aWdhdGlvblRhcmdldFBhdGgsXG5cdGdldEN1c3RvbUZ1bmN0aW9uSW5mb1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtRkE7RUFFQTtFQWdLQTtBQUNBO0FBQ0E7O0VBWUE7QUFDQTtBQUNBOztFQW9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQSxlQUFlQSxDQUM5QkMsa0JBQTRCLEVBQzVCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUN6REMsZUFBZ0UsRUFDaEVDLGtCQUFvRCxFQUNuQztJQUNqQjtJQUNBLE1BQU1DLFlBQVksR0FBR0MseUJBQXlCLENBQUNOLGtCQUFrQixFQUFFQyxpQkFBaUIsRUFBRUMsZ0JBQWdCLENBQUM7SUFDdkc7SUFDQSxNQUFNSyxlQUFlLEdB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