@sapui5/sap.fe.core 1.102.3 → 1.105.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 (359) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +120 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +108 -0
  5. package/src/sap/fe/core/AppComponent.js +81 -35
  6. package/src/sap/fe/core/AppComponent.ts +68 -44
  7. package/src/sap/fe/core/AppStateHandler.js +82 -70
  8. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  9. package/src/sap/fe/core/BaseController.js +12 -10
  10. package/src/sap/fe/core/BaseController.ts +15 -13
  11. package/src/sap/fe/core/CommonUtils.js +291 -218
  12. package/src/sap/fe/core/CommonUtils.ts +315 -251
  13. package/src/sap/fe/core/ExtensionAPI.js +25 -28
  14. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  15. package/src/sap/fe/core/PageController.js +5 -5
  16. package/src/sap/fe/core/PageController.ts +4 -5
  17. package/src/sap/fe/core/TemplateComponent.js +21 -10
  18. package/src/sap/fe/core/TemplateComponent.ts +9 -6
  19. package/src/sap/fe/core/TemplateModel.js +2 -2
  20. package/src/sap/fe/core/TemplateModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  22. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
  29. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  31. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  32. package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
  33. package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
  34. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
  35. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  36. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
  37. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
  38. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
  39. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  40. package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
  45. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  46. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
  47. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  48. package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
  49. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  50. package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
  51. package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
  52. package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
  53. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  54. package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
  55. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  56. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Share.js +171 -140
  58. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  59. package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
  60. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  61. package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
  62. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  63. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  64. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  65. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
  66. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  67. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
  69. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
  70. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
  71. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
  72. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
  73. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
  74. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
  75. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
  76. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  77. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  78. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
  79. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
  80. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
  81. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
  82. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
  83. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
  84. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
  85. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
  86. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
  87. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  88. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
  89. package/src/sap/fe/core/controls/Any.js +9 -5
  90. package/src/sap/fe/core/controls/Any.ts +10 -4
  91. package/src/sap/fe/core/controls/CommandExecution.js +12 -26
  92. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  93. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
  94. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  95. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
  96. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  97. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
  98. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  99. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  101. package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
  102. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  103. package/src/sap/fe/core/controls/FileWrapper.js +9 -4
  104. package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
  105. package/src/sap/fe/core/controls/FilterBar.js +7 -3
  106. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  107. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  108. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  109. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  110. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  111. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  112. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
  113. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  114. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  116. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
  117. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  118. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  119. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  120. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  121. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  122. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  123. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  124. package/src/sap/fe/core/converters/ConverterContext.js +48 -34
  125. package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
  126. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
  131. package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
  132. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  133. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  134. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  135. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  136. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
  137. package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
  138. package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
  139. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
  140. package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
  141. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  142. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  143. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
  145. package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
  147. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  148. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  158. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
  160. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
  162. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
  163. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  164. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  166. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
  171. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  172. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  173. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  174. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  175. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  176. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  178. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  179. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  180. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
  181. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
  182. package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
  183. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
  184. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
  185. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
  186. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  187. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  188. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  189. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  190. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  191. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  192. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  193. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  194. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  195. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  196. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  197. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  198. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  199. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  200. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  201. package/src/sap/fe/core/fpm/Component.js +33 -7
  202. package/src/sap/fe/core/fpm/Component.ts +14 -0
  203. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  204. package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
  205. package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
  206. package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
  207. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
  208. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  209. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  210. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  211. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  212. package/src/sap/fe/core/helpers/EditState.js +1 -6
  213. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  214. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  215. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  216. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  217. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  218. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  219. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  220. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  221. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  222. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  223. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  224. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  225. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  226. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  227. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  228. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  229. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  230. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  231. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  232. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  233. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  234. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  235. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  236. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  237. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  238. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  239. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  240. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  241. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  242. package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
  243. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
  244. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  245. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  246. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  247. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  248. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  249. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  250. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  251. package/src/sap/fe/core/library.js +42 -3
  252. package/src/sap/fe/core/library.support.js +1 -1
  253. package/src/sap/fe/core/library.ts +38 -0
  254. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  255. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  256. package/src/sap/fe/core/messagebundle.properties +39 -67
  257. package/src/sap/fe/core/messagebundle_ar.properties +27 -44
  258. package/src/sap/fe/core/messagebundle_bg.properties +27 -44
  259. package/src/sap/fe/core/messagebundle_ca.properties +27 -44
  260. package/src/sap/fe/core/messagebundle_cs.properties +27 -44
  261. package/src/sap/fe/core/messagebundle_cy.properties +26 -43
  262. package/src/sap/fe/core/messagebundle_da.properties +27 -44
  263. package/src/sap/fe/core/messagebundle_de.properties +25 -42
  264. package/src/sap/fe/core/messagebundle_el.properties +28 -45
  265. package/src/sap/fe/core/messagebundle_en.properties +27 -44
  266. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
  267. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
  268. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
  269. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
  270. package/src/sap/fe/core/messagebundle_es.properties +27 -44
  271. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
  272. package/src/sap/fe/core/messagebundle_et.properties +27 -44
  273. package/src/sap/fe/core/messagebundle_fi.properties +27 -44
  274. package/src/sap/fe/core/messagebundle_fr.properties +26 -43
  275. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
  276. package/src/sap/fe/core/messagebundle_hi.properties +27 -44
  277. package/src/sap/fe/core/messagebundle_hr.properties +27 -44
  278. package/src/sap/fe/core/messagebundle_hu.properties +27 -44
  279. package/src/sap/fe/core/messagebundle_id.properties +27 -44
  280. package/src/sap/fe/core/messagebundle_it.properties +43 -60
  281. package/src/sap/fe/core/messagebundle_iw.properties +27 -44
  282. package/src/sap/fe/core/messagebundle_ja.properties +27 -44
  283. package/src/sap/fe/core/messagebundle_kk.properties +27 -44
  284. package/src/sap/fe/core/messagebundle_ko.properties +30 -47
  285. package/src/sap/fe/core/messagebundle_lt.properties +27 -44
  286. package/src/sap/fe/core/messagebundle_lv.properties +27 -44
  287. package/src/sap/fe/core/messagebundle_ms.properties +27 -44
  288. package/src/sap/fe/core/messagebundle_nl.properties +29 -46
  289. package/src/sap/fe/core/messagebundle_no.properties +27 -44
  290. package/src/sap/fe/core/messagebundle_pl.properties +28 -45
  291. package/src/sap/fe/core/messagebundle_pt.properties +28 -45
  292. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
  293. package/src/sap/fe/core/messagebundle_ro.properties +27 -44
  294. package/src/sap/fe/core/messagebundle_ru.properties +27 -44
  295. package/src/sap/fe/core/messagebundle_sh.properties +27 -44
  296. package/src/sap/fe/core/messagebundle_sk.properties +27 -44
  297. package/src/sap/fe/core/messagebundle_sl.properties +27 -44
  298. package/src/sap/fe/core/messagebundle_sv.properties +27 -44
  299. package/src/sap/fe/core/messagebundle_th.properties +25 -42
  300. package/src/sap/fe/core/messagebundle_tr.properties +27 -44
  301. package/src/sap/fe/core/messagebundle_uk.properties +27 -44
  302. package/src/sap/fe/core/messagebundle_vi.properties +27 -44
  303. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
  304. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
  305. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
  308. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
  309. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  310. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  311. package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
  312. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  313. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  314. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  315. package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
  316. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  317. package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
  318. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  319. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
  320. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  321. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
  322. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
  323. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  324. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  327. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  328. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  330. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  332. package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
  333. package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
  334. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  335. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  336. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  337. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  338. package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
  339. package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
  340. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  341. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  342. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  343. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  344. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  345. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  346. package/src/sap/fe/core/templating/FilterHelper.js +18 -17
  347. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  348. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  349. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  350. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  351. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  352. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  353. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  354. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  355. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  356. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  357. package/src/sap/fe/core/type/Email.js +3 -3
  358. package/src/sap/fe/core/type/Email.ts +2 -2
  359. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,14 +2,14 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingExpression", "../../ManifestSettings", "../Common/DataVisualization"], function (Table, VisualFilters, ConfigurableObject, IssueManager, Key, BindingExpression, ManifestSettings, DataVisualization) {
5
+ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/BindingToolkit", "../../ManifestSettings", "../Common/DataVisualization"], function (Table, VisualFilters, ConfigurableObject, IssueManager, Key, BindingToolkit, ManifestSettings, DataVisualization) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var getSelectionVariant = DataVisualization.getSelectionVariant;
10
10
  var AvailabilityType = ManifestSettings.AvailabilityType;
11
- var compileBinding = BindingExpression.compileBinding;
12
- var annotationExpression = BindingExpression.annotationExpression;
11
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
12
+ var compileExpression = BindingToolkit.compileExpression;
13
13
  var KeyHelper = Key.KeyHelper;
14
14
  var IssueType = IssueManager.IssueType;
15
15
  var IssueSeverity = IssueManager.IssueSeverity;
@@ -21,9 +21,9 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
21
21
  var getTypeConfig = Table.getTypeConfig;
22
22
  var getSelectionVariantConfiguration = Table.getSelectionVariantConfiguration;
23
23
 
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
25
 
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
27
 
28
28
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
29
 
@@ -40,8 +40,8 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
40
40
  /**
41
41
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
42
42
  *
43
- * @param {AnnotationTerm<FieldGroupType>} fieldGroup
44
- * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
43
+ * @param fieldGroup
44
+ * @returns The map of facets for the given FieldGroup
45
45
  */
46
46
  function getFieldGroupFilterGroups(fieldGroup) {
47
47
  var filterFacetMap = {};
@@ -51,7 +51,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
51
51
 
52
52
  filterFacetMap[dataField.Value.path] = {
53
53
  group: fieldGroup.fullyQualifiedName,
54
- groupLabel: compileBinding(annotationExpression(fieldGroup.Label || ((_fieldGroup$annotatio = fieldGroup.annotations) === null || _fieldGroup$annotatio === void 0 ? void 0 : (_fieldGroup$annotatio2 = _fieldGroup$annotatio.Common) === null || _fieldGroup$annotatio2 === void 0 ? void 0 : _fieldGroup$annotatio2.Label) || fieldGroup.qualifier)) || fieldGroup.qualifier
54
+ groupLabel: compileExpression(getExpressionFromAnnotation(fieldGroup.Label || ((_fieldGroup$annotatio = fieldGroup.annotations) === null || _fieldGroup$annotatio === void 0 ? void 0 : (_fieldGroup$annotatio2 = _fieldGroup$annotatio.Common) === null || _fieldGroup$annotatio2 === void 0 ? void 0 : _fieldGroup$annotatio2.Label) || fieldGroup.qualifier)) || fieldGroup.qualifier
55
55
  };
56
56
  }
57
57
  });
@@ -67,10 +67,11 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
67
67
  }, {});
68
68
  }
69
69
  /**
70
- * Check that all the tables for a dedicated entity set are configured as analytical table.
71
- * @param {TableVisualization[]} listReportTables List report tables
72
- * @param {string} contextPath
73
- * @returns {boolean} Is FilterBar search field hidden or not
70
+ * Check that all the tables for a dedicated entity set are configured as analytical tables.
71
+ *
72
+ * @param listReportTables List report tables
73
+ * @param contextPath
74
+ * @returns Is FilterBar search field hidden or not
74
75
  */
75
76
 
76
77
 
@@ -117,7 +118,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
117
118
  *
118
119
  * @param entityType The root EntityType
119
120
  * @param propertyPath The full path to the target property
120
- * @returns {string} The formatted condition path
121
+ * @returns The formatted condition path
121
122
  */
122
123
 
123
124
 
@@ -128,14 +129,14 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
128
129
 
129
130
  while (parts.length) {
130
131
  var part = parts.shift();
131
- partialPath = partialPath ? partialPath + "/" + part : part;
132
+ partialPath = partialPath ? "".concat(partialPath, "/").concat(part) : part;
132
133
  var property = entityType.resolvePath(partialPath);
133
134
 
134
135
  if (property._type === "NavigationProperty" && property.isCollection) {
135
136
  part += "*";
136
137
  }
137
138
 
138
- key = key ? key + "/" + part : part;
139
+ key = key ? "".concat(key, "/").concat(part) : part;
139
140
  }
140
141
 
141
142
  return key;
@@ -154,9 +155,9 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
154
155
  annotationPath: converterContext.getAbsoluteAnnotationPath(fullPropertyPath),
155
156
  conditionPath: _getConditionPath(entityType, fullPropertyPath),
156
157
  availability: ((_property$annotations4 = property.annotations) === null || _property$annotations4 === void 0 ? void 0 : (_property$annotations5 = _property$annotations4.UI) === null || _property$annotations5 === void 0 ? void 0 : (_property$annotations6 = _property$annotations5.HiddenFilter) === null || _property$annotations6 === void 0 ? void 0 : _property$annotations6.valueOf()) === true ? AvailabilityType.Hidden : AvailabilityType.Adaptation,
157
- label: compileBinding(annotationExpression(((_property$annotations7 = property.annotations.Common) === null || _property$annotations7 === void 0 ? void 0 : (_property$annotations8 = _property$annotations7.Label) === null || _property$annotations8 === void 0 ? void 0 : _property$annotations8.valueOf()) || property.name)),
158
+ label: compileExpression(getExpressionFromAnnotation(((_property$annotations7 = property.annotations.Common) === null || _property$annotations7 === void 0 ? void 0 : (_property$annotations8 = _property$annotations7.Label) === null || _property$annotations8 === void 0 ? void 0 : _property$annotations8.valueOf()) || property.name)),
158
159
  group: targetEntityType.name,
159
- groupLabel: compileBinding(annotationExpression((targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : (_targetEntityType$ann2 = _targetEntityType$ann.Common) === null || _targetEntityType$ann2 === void 0 ? void 0 : (_targetEntityType$ann3 = _targetEntityType$ann2.Label) === null || _targetEntityType$ann3 === void 0 ? void 0 : _targetEntityType$ann3.valueOf()) || targetEntityType.name))
160
+ groupLabel: compileExpression(getExpressionFromAnnotation((targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : (_targetEntityType$ann2 = _targetEntityType$ann.Common) === null || _targetEntityType$ann2 === void 0 ? void 0 : (_targetEntityType$ann3 = _targetEntityType$ann2.Label) === null || _targetEntityType$ann3 === void 0 ? void 0 : _targetEntityType$ann3.valueOf()) || targetEntityType.name))
160
161
  };
161
162
  }
162
163
 
@@ -230,7 +231,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
230
231
  if (properties) {
231
232
  properties.forEach(function (property) {
232
233
  var propertyPath = property.name;
233
- var fullPath = (navigationPath ? navigationPath + "/" : "") + propertyPath;
234
+ var fullPath = (navigationPath ? "".concat(navigationPath, "/") : "") + propertyPath;
234
235
 
235
236
  var selectionField = _createFilterSelectionField(entityType, property, fullPath, includeHidden, converterContext);
236
237
 
@@ -313,13 +314,13 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
313
314
  aSelectOptions === null || aSelectOptions === void 0 ? void 0 : aSelectOptions.forEach(function (selectOption) {
314
315
  var propertyName = selectOption.PropertyName;
315
316
  var sPropertyPath = propertyName.value;
316
- var UISelectionFields = {};
317
+ var currentSelectionFields = {};
317
318
  annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.forEach(function (SelectionField) {
318
- UISelectionFields[SelectionField.value] = true;
319
+ currentSelectionFields[SelectionField.value] = true;
319
320
  });
320
321
 
321
322
  if (!(sPropertyPath in excludedFilterProperties)) {
322
- if (!(sPropertyPath in UISelectionFields)) {
323
+ if (!(sPropertyPath in currentSelectionFields)) {
323
324
  var _FilterField = getFilterField(sPropertyPath, converterContext, entityType);
324
325
 
325
326
  if (_FilterField) {
@@ -333,11 +334,11 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
333
334
  var _property$annotations9, _property$annotations10;
334
335
 
335
336
  var defaultFilterValue = (_property$annotations9 = property.annotations) === null || _property$annotations9 === void 0 ? void 0 : (_property$annotations10 = _property$annotations9.Common) === null || _property$annotations10 === void 0 ? void 0 : _property$annotations10.FilterDefaultValue;
336
- var PropertyPath = property.name;
337
+ var propertyPath = property.name;
337
338
 
338
- if (!(PropertyPath in excludedFilterProperties)) {
339
- if (defaultFilterValue && !(PropertyPath in UISelectionFields)) {
340
- var _FilterField2 = getFilterField(PropertyPath, converterContext, entityType);
339
+ if (!(propertyPath in excludedFilterProperties)) {
340
+ if (defaultFilterValue && !(propertyPath in UISelectionFields)) {
341
+ var _FilterField2 = getFilterField(propertyPath, converterContext, entityType);
341
342
 
342
343
  if (_FilterField2) {
343
344
  selectionFields.push(_FilterField2);
@@ -351,8 +352,9 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
351
352
  };
352
353
  /**
353
354
  * Get all parameter filter fields in case of a parameterized service.
354
- * @param {ConverterContext} converterContext
355
- * @returns {FilterField[]} An array of parameter filterfields
355
+ *
356
+ * @param converterContext
357
+ * @returns An array of parameter FilterFields
356
358
  */
357
359
 
358
360
 
@@ -362,19 +364,18 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
362
364
  var dataModelObjectPath = converterContext.getDataModelObjectPath();
363
365
  var parameterEntityType = dataModelObjectPath.startingEntitySet.entityType;
364
366
  var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext) && !dataModelObjectPath.targetEntitySet;
365
- var parameterConverterContext = isParameterized && converterContext.getConverterContextFor("/" + dataModelObjectPath.startingEntitySet.name);
366
- var parameterFields = parameterConverterContext ? parameterEntityType.entityProperties.map(function (property) {
367
+ var parameterConverterContext = isParameterized && converterContext.getConverterContextFor("/".concat(dataModelObjectPath.startingEntitySet.name));
368
+ return parameterConverterContext ? parameterEntityType.entityProperties.map(function (property) {
367
369
  return _getFilterField({}, property.name, parameterConverterContext, parameterEntityType);
368
370
  }) : [];
369
- return parameterFields;
370
371
  }
371
372
  /**
372
373
  * Determines if the FilterBar search field is hidden or not.
373
374
  *
374
- * @param {TableVisualization[]} listReportTables The list report tables
375
- * @param {ChartVisualization[]} charts The ALP charts
376
- * @param {ConverterContext} converterContext The converter context
377
- * @returns {boolean} The information if the FilterBar search field is hidden or not
375
+ * @param listReportTables The list report tables
376
+ * @param charts The ALP charts
377
+ * @param converterContext The converter context
378
+ * @returns The information if the FilterBar search field is hidden or not
378
379
  */
379
380
 
380
381
 
@@ -400,7 +401,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
400
401
  *
401
402
  * @param entityType The current entityType
402
403
  * @param converterContext The converter context
403
- * @returns {Record<string, CustomElementFilterField>} The filter fields defined in the manifest
404
+ * @returns The filter fields defined in the manifest
404
405
  */
405
406
 
406
407
 
@@ -434,7 +435,8 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
434
435
  },
435
436
  availability: filterField.availability || AvailabilityType.Default,
436
437
  settings: filterField.settings,
437
- visualFilter: visualFilter
438
+ visualFilter: visualFilter,
439
+ required: filterField.required
438
440
  };
439
441
  }
440
442
 
@@ -535,7 +537,8 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
535
537
  position: oFilterFieldInfo.position,
536
538
  type: oFilterFieldInfo.type,
537
539
  template: oFilterFieldInfo.template,
538
- menu: oFilterFieldInfo.menu
540
+ menu: oFilterFieldInfo.menu,
541
+ required: oFilterFieldInfo.required
539
542
  };
540
543
  };
541
544
 
@@ -617,21 +620,40 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
617
620
 
618
621
  _exports.isMultiValue = isMultiValue;
619
622
 
623
+ var _isFilterableNavigationProperty = function (entry) {
624
+ return (entry.$Type === "com.sap.vocabularies.UI.v1.DataField" || entry.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl" || entry.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithNavigationPath") && entry.Value.path.includes("/");
625
+ };
626
+
620
627
  var getAnnotatedSelectionFieldData = function (converterContext) {
621
628
  var _converterContext$get9, _entityType$annotatio3, _entityType$annotatio4;
622
629
 
623
630
  var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
624
631
  var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
625
632
  var includeHidden = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
633
+ var lineItemTerm = arguments.length > 4 ? arguments[4] : undefined;
626
634
  // Fetch all selectionVariants defined in the different visualizations and different views (multi table mode)
627
635
  var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
628
636
 
629
637
  var excludedFilterProperties = getExcludedFilterProperties(selectionVariants);
630
638
  var entityType = converterContext.getEntityType(); //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
631
639
 
632
- var annotatedSelectionFields = annotationPath && ((_converterContext$get9 = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get9 === void 0 ? void 0 : _converterContext$get9.annotation) || ((_entityType$annotatio3 = entityType.annotations) === null || _entityType$annotatio3 === void 0 ? void 0 : (_entityType$annotatio4 = _entityType$annotatio3.UI) === null || _entityType$annotatio4 === void 0 ? void 0 : _entityType$annotatio4.SelectionFields) || []; // create a map of all potential filter fields based on...
640
+ var annotatedSelectionFields = annotationPath && ((_converterContext$get9 = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get9 === void 0 ? void 0 : _converterContext$get9.annotation) || ((_entityType$annotatio3 = entityType.annotations) === null || _entityType$annotatio3 === void 0 ? void 0 : (_entityType$annotatio4 = _entityType$annotatio3.UI) === null || _entityType$annotatio4 === void 0 ? void 0 : _entityType$annotatio4.SelectionFields) || [];
641
+ var navProperties = [];
633
642
 
634
- var filterFields = _objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, includeHidden, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, includeHidden, converterContext));
643
+ if (lrTables.length === 0 && !!lineItemTerm) {
644
+ var _converterContext$get10;
645
+
646
+ (_converterContext$get10 = converterContext.getEntityTypeAnnotation(lineItemTerm).annotation) === null || _converterContext$get10 === void 0 ? void 0 : _converterContext$get10.forEach(function (entry) {
647
+ if (_isFilterableNavigationProperty(entry)) {
648
+ if (!navProperties.includes(entry.Value.path.split("/")[0])) {
649
+ navProperties.push(entry.Value.path.split("/")[0]);
650
+ }
651
+ }
652
+ });
653
+ } // create a map of all potential filter fields based on...
654
+
655
+
656
+ var filterFields = _objectSpread(_objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, includeHidden, converterContext)), _getSelectionFieldsByPath(entityType, navProperties, false, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, includeHidden, converterContext));
635
657
 
636
658
  var aSelectOptions = [];
637
659
  var selectionVariant = getSelectionVariant(entityType, converterContext);
@@ -669,7 +691,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
669
691
  };
670
692
 
671
693
  var processSelectionFields = function (propertyInfoFields, converterContext, defaultValuePropertyFields) {
672
- var _converterContext$get10, _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15;
694
+ var _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15, _converterContext$get16;
673
695
 
674
696
  //get TypeConfig function
675
697
  var selectionFieldTypes = [];
@@ -705,7 +727,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
705
727
  }
706
728
  }); // filterRestrictions
707
729
 
708
- var oFilterRestrictions = (_converterContext$get10 = converterContext.getEntitySet()) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.annotations) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.Capabilities) === null || _converterContext$get12 === void 0 ? void 0 : _converterContext$get12.FilterRestrictions;
730
+ var oFilterRestrictions = (_converterContext$get11 = converterContext.getEntitySet()) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.annotations) === null || _converterContext$get12 === void 0 ? void 0 : (_converterContext$get13 = _converterContext$get12.Capabilities) === null || _converterContext$get13 === void 0 ? void 0 : _converterContext$get13.FilterRestrictions;
709
731
  var oRet = {};
710
732
  oRet["RequiredProperties"] = getFilterRestrictions(oFilterRestrictions, "RequiredProperties") || [];
711
733
  oRet["NonFilterableProperties"] = getFilterRestrictions(oFilterRestrictions, "NonFilterableProperties") || [];
@@ -741,9 +763,11 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
741
763
  oPropertyInfo = _fetchPropertyInfo(converterContext, oConvertedProperty, aTypeConfig[propertyInfoField.key]);
742
764
 
743
765
  if (oPropertyInfo) {
766
+ var _oConvertedProperty$r;
767
+
744
768
  oPropertyInfo = Object.assign(oPropertyInfo, {
745
769
  maxConditions: !oPropertyInfo.isParameter && isMultiValue(oPropertyInfo) ? -1 : 1,
746
- required: oPropertyInfo.isParameter || aRequiredProps.indexOf(sPropertyPath) >= 0,
770
+ required: (_oConvertedProperty$r = oConvertedProperty.required) !== null && _oConvertedProperty$r !== void 0 ? _oConvertedProperty$r : oPropertyInfo.isParameter || aRequiredProps.indexOf(sPropertyPath) >= 0,
747
771
  caseSensitive: isCaseSensitive,
748
772
  dataType: aTypeConfig[propertyInfoField.key].type
749
773
  });
@@ -752,7 +776,7 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
752
776
  }
753
777
  }); //add edit
754
778
 
755
- if ((_converterContext$get13 = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get13 !== void 0 && (_converterContext$get14 = _converterContext$get13.annotations) !== null && _converterContext$get14 !== void 0 && (_converterContext$get15 = _converterContext$get14.Common) !== null && _converterContext$get15 !== void 0 && _converterContext$get15.DraftRoot) {
779
+ if ((_converterContext$get14 = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get14 !== void 0 && (_converterContext$get15 = _converterContext$get14.annotations) !== null && _converterContext$get15 !== void 0 && (_converterContext$get16 = _converterContext$get15.Common) !== null && _converterContext$get16 !== void 0 && _converterContext$get16.DraftRoot) {
756
780
  aFetchedProperties.push(getEditStateFilterPropertyInfo());
757
781
  } // add search
758
782
 
@@ -779,16 +803,20 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
779
803
  position: "overwrite",
780
804
  template: "overwrite",
781
805
  settings: "overwrite",
782
- visualFilter: "overwrite"
806
+ visualFilter: "overwrite",
807
+ required: "overwrite"
783
808
  });
784
809
  };
785
810
  /**
786
811
  * Retrieve the configuration for the selection fields that will be used within the filter bar
787
- * This configuration takes into account annotation and the selection variants.
788
- * @param {ConverterContext} converterContext
789
- * @param {TableVisualization[]} lrTables
790
- * @param {string} annotationPath
791
- * @returns {FilterSelectionField[]} An array of selection fields
812
+ * This configuration takes into account the annotation and the selection variants.
813
+ *
814
+ * @param converterContext
815
+ * @param lrTables
816
+ * @param annotationPath
817
+ * @param [includeHidden]
818
+ * @param [lineItemTerm]
819
+ * @returns An array of selection fields
792
820
  */
793
821
 
794
822
 
@@ -800,7 +828,8 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
800
828
  var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
801
829
  var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
802
830
  var includeHidden = arguments.length > 3 ? arguments[3] : undefined;
803
- var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath, includeHidden);
831
+ var lineItemTerm = arguments.length > 4 ? arguments[4] : undefined;
832
+ var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath, includeHidden, lineItemTerm);
804
833
 
805
834
  var parameterFields = _getParameterFields(converterContext);
806
835
 
@@ -840,10 +869,10 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
840
869
  }
841
870
  } else {
842
871
  filterFacetMap = filterFacets.reduce(function (previousValue, filterFacet) {
843
- for (var _i = 0; _i < filterFacet.Target.$target.Data.length; _i++) {
844
- var _filterFacet$ID, _filterFacet$Label;
872
+ for (var _i = 0; _i < (filterFacet === null || filterFacet === void 0 ? void 0 : (_filterFacet$Target = filterFacet.Target) === null || _filterFacet$Target === void 0 ? void 0 : (_filterFacet$Target$$ = _filterFacet$Target.$target) === null || _filterFacet$Target$$ === void 0 ? void 0 : (_filterFacet$Target$$2 = _filterFacet$Target$$.Data) === null || _filterFacet$Target$$2 === void 0 ? void 0 : _filterFacet$Target$$2.length); _i++) {
873
+ var _filterFacet$Target, _filterFacet$Target$$, _filterFacet$Target$$2, _filterFacet$Target2, _filterFacet$Target2$, _filterFacet$Target2$2, _filterFacet$Target2$3, _filterFacet$ID, _filterFacet$Label;
845
874
 
846
- previousValue[filterFacet.Target.$target.Data[_i].Value.path] = {
875
+ previousValue[filterFacet === null || filterFacet === void 0 ? void 0 : (_filterFacet$Target2 = filterFacet.Target) === null || _filterFacet$Target2 === void 0 ? void 0 : (_filterFacet$Target2$ = _filterFacet$Target2.$target) === null || _filterFacet$Target2$ === void 0 ? void 0 : (_filterFacet$Target2$2 = _filterFacet$Target2$.Data[_i]) === null || _filterFacet$Target2$2 === void 0 ? void 0 : (_filterFacet$Target2$3 = _filterFacet$Target2$2.Value) === null || _filterFacet$Target2$3 === void 0 ? void 0 : _filterFacet$Target2$3.path] = {
847
876
  group: filterFacet === null || filterFacet === void 0 ? void 0 : (_filterFacet$ID = filterFacet.ID) === null || _filterFacet$ID === void 0 ? void 0 : _filterFacet$ID.toString(),
848
877
  groupLabel: filterFacet === null || filterFacet === void 0 ? void 0 : (_filterFacet$Label = filterFacet.Label) === null || _filterFacet$Label === void 0 ? void 0 : _filterFacet$Label.toString()
849
878
  };
@@ -892,14 +921,15 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
892
921
  };
893
922
  };
894
923
  /**
895
- * Determines whether the filter bar inside a value help dialog should be expanded. This is true if one of the following condition holds:
924
+ * Determines whether the filter bar inside a value help dialog should be expanded. This is true if one of the following conditions hold:
896
925
  * (1) a filter property is mandatory,
897
926
  * (2) no search field exists (entity isn't search enabled),
898
927
  * (3) when the data isn't loaded by default (annotation FetchValues = 2).
899
- * @param {ConverterContext} converterContext The converter context
900
- * @param {any} filterRestrictionsAnnotation The FilterRestriction annotation
901
- * @param {any} valueListAnnotation The ValueList annotation
902
- * @returns {boolean} The value for expandFilterFields
928
+ *
929
+ * @param converterContext The converter context
930
+ * @param filterRestrictionsAnnotation The FilterRestriction annotation
931
+ * @param valueListAnnotation The ValueList annotation
932
+ * @returns The value for expandFilterFields
903
933
  */
904
934
 
905
935
 
@@ -921,4 +951,4 @@ sap.ui.define(["sap/fe/core/converters/controls/Common/Table", "sap/fe/core/conv
921
951
  _exports.getExpandFilterFields = getExpandFilterFields;
922
952
  return _exports;
923
953
  }, false);
924
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlQmluZGluZyIsImFubm90YXRpb25FeHByZXNzaW9uIiwiTGFiZWwiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsInF1YWxpZmllciIsImdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsInNlbGVjdGlvblZhcmlhbnRzIiwicmVkdWNlIiwicHJldmlvdXNWYWx1ZSIsInNlbGVjdGlvblZhcmlhbnQiLCJwcm9wZXJ0eU5hbWVzIiwicHJvcGVydHlOYW1lIiwiY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwiLCJsaXN0UmVwb3J0VGFibGVzIiwiY29udGV4dFBhdGgiLCJsZW5ndGgiLCJldmVyeSIsInZpc3VhbGl6YXRpb24iLCJlbmFibGVBbmFseXRpY3MiLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsImdldFNlbGVjdGlvblZhcmlhbnRzIiwibHJUYWJsZVZpc3VhbGl6YXRpb25zIiwiY29udmVydGVyQ29udGV4dCIsInNlbGVjdGlvblZhcmlhbnRQYXRocyIsIm1hcCIsInRhYmxlRmlsdGVycyIsImNvbnRyb2wiLCJmaWx0ZXJzIiwidGFibGVTVkNvbmZpZ3MiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJwYXRocyIsImFubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInB1c2giLCJzZWxlY3Rpb25WYXJpYW50Q29uZmlnIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzdkNvbmZpZ3MiLCJjb25jYXQiLCJfZ2V0Q29uZGl0aW9uUGF0aCIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXJ0cyIsInNwbGl0IiwicGFydGlhbFBhdGgiLCJwYXJ0Iiwic2hpZnQiLCJwcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJpc0NvbGxlY3Rpb24iLCJfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQiLCJmdWxsUHJvcGVydHlQYXRoIiwiaW5jbHVkZUhpZGRlbiIsInVuZGVmaW5lZCIsInRhcmdldFR5cGUiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUiLCJLZXlIZWxwZXIiLCJnZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsImNvbmRpdGlvblBhdGgiLCJhdmFpbGFiaWxpdHkiLCJIaWRkZW5GaWx0ZXIiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsImxhYmVsIiwibmFtZSIsImdldE1vZGVsVHlwZSIsInNUeXBlIiwibURlZmF1bHRUeXBlRm9yRWRtVHlwZSIsIm1vZGVsVHlwZSIsIl9nZXRTZWxlY3Rpb25GaWVsZHMiLCJuYXZpZ2F0aW9uUGF0aCIsInByb3BlcnRpZXMiLCJzZWxlY3Rpb25GaWVsZE1hcCIsImZ1bGxQYXRoIiwic2VsZWN0aW9uRmllbGQiLCJfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoIiwicHJvcGVydHlQYXRocyIsInNlbGVjdGlvbkZpZWxkcyIsImxvY2FsU2VsZWN0aW9uRmllbGRzIiwiZW50aXR5UHJvcGVydGllcyIsImluY2x1ZGVzIiwic3BsaWNlIiwiam9pbiIsIl9nZXRGaWx0ZXJGaWVsZCIsImZpbHRlckZpZWxkcyIsImZpbHRlckZpZWxkIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIkhpZ2giLCJJc3N1ZVR5cGUiLCJNSVNTSU5HX1NFTEVDVElPTkZJRUxEIiwiRGVmYXVsdCIsImlzUGFyYW1ldGVyIiwiUmVzdWx0Q29udGV4dCIsIl9nZXREZWZhdWx0RmlsdGVyRmllbGRzIiwiYVNlbGVjdE9wdGlvbnMiLCJleGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMiLCJVSVNlbGVjdGlvbkZpZWxkcyIsIlNlbGVjdGlvbkZpZWxkIiwidmFsdWUiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJzUHJvcGVydHlQYXRoIiwiRmlsdGVyRmllbGQiLCJnZXRGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInRhcmdldEVudGl0eVNldCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiY2hhcnRzIiwibm9TZWFyY2hJbkNoYXJ0cyIsImNoYXJ0IiwiYXBwbHlTdXBwb3J0ZWQiLCJlbmFibGVTZWFyY2giLCJub1NlYXJjaEluVGFibGVzIiwidGFibGUiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJnZXRDb250ZXh0UGF0aCIsImdldE1hbmlmZXN0RmlsdGVyRmllbGRzIiwiZmJDb25maWciLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uIiwiZGVmaW5lZEZpbHRlckZpZWxkcyIsIk9iamVjdCIsImtleXMiLCJnZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5Iiwic0tleSIsInR5cGUiLCJTbG90IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zIiwib0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJzUmVzdHJpY3Rpb24iLCJhUHJvcHMiLCJvUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyIsImRhdGFUeXBlIiwibWF4Q29uZGl0aW9ucyIsImdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbyIsImhpZGRlbkZpbHRlciIsImdldFNlYXJjaFJlc3RyaWN0aW9ucyIsImdldEVudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJzTmF2aWdhdGlvblBhdGgiLCJvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJkaXNwbGF5IiwiY2FzZVNlbnNpdGl2ZSIsIm1lbnUiLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwiYUV4cHJlc3Npb25zIiwiYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5Iiwic29ydCIsImEiLCJiIiwiZGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJUZXh0Iiwib1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiIsIlRleHRBcnJhbmdlbWVudCIsIl9mZXRjaFByb3BlcnR5SW5mbyIsIm9UeXBlQ29uZmlnIiwib1Byb3BlcnR5SW5mbyIsInNBbm5vdGF0aW9uUGF0aCIsInRhcmdldFByb3BlcnR5T2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib0Zvcm1hdE9wdGlvbnMiLCJmb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhc3NpZ24iLCJpc011bHRpVmFsdWUiLCJiSXNNdWx0aVZhbHVlIiwiZmlsdGVyRXhwcmVzc2lvbiIsImdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJnZXRTZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0T3B0aW9ucyIsInByb3BlcnR5SW5mb0ZpZWxkcyIsImRlZmF1bHRGaWx0ZXJGaWVsZHMiLCJwcm9jZXNzU2VsZWN0aW9uRmllbGRzIiwiZGVmYXVsdFZhbHVlUHJvcGVydHlGaWVsZHMiLCJzZWxlY3Rpb25GaWVsZFR5cGVzIiwiYVR5cGVDb25maWciLCJfZm5UeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsIm51bGxhYmxlIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwicGFyYW1ldGVyRmllbGQiLCJwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dCIsInByb3BlcnR5VGFyZ2V0T2JqZWN0Iiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsIkZpbHRlclJlc3RyaWN0aW9ucyIsIm9SZXQiLCJzRW50aXR5U2V0UGF0aCIsImFQYXRoUGFydHMiLCJvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucyIsIlJlcXVpcmVkUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIiwiaXNDYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYVJlcXVpcmVkUHJvcHMiLCJhTm9uRmlsdGVyYWJsZVByb3BzIiwiYUZldGNoZWRQcm9wZXJ0aWVzIiwicHJvcGVydHlJbmZvRmllbGQiLCJvQ29udmVydGVkUHJvcGVydHkiLCJyZXBsYWNlIiwicmVxdWlyZWQiLCJEcmFmdFJvb3QiLCJzZWFyY2hSZXN0cmljdGlvbnMiLCJoaWRlQmFzaWNTZWFyY2giLCJCb29sZWFuIiwiU2VhcmNoYWJsZSIsImluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImdldFNlbGVjdGlvbkZpZWxkcyIsIm9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJsb2NhbGVDb21wYXJlIiwic0ZldGNoUHJvcGVydGllcyIsInNQcm9wZXJ0eUluZm8iLCJwcm9wU2VsZWN0aW9uRmllbGRzIiwiZmlsdGVyRmFjZXRzIiwiRmlsdGVyRmFjZXRzIiwiYUZpZWxkR3JvdXBzIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJpIiwiZmlsdGVyRmFjZXQiLCJUYXJnZXQiLCIkdGFyZ2V0IiwiSUQiLCJ0b1N0cmluZyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCIsImdldEV4cGFuZEZpbHRlckZpZWxkcyIsImZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJ2YWx1ZUxpc3RBbm5vdGF0aW9uIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwidmFsdWVMaXN0IiwiZ2V0T2JqZWN0IiwiRmV0Y2hWYWx1ZXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01B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YUFBYSxFQUFiQTtBQUFuQixLQUFQO0FBQ0EsR0F4R007QUEwR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTW1CLHFCQUFxQixHQUFHLFVBQ3BDN1EsZ0JBRG9DLEVBRXBDOFEsNEJBRm9DLEVBR3BDQyxtQkFIb0MsRUFJMUI7QUFDVixRQUFNQyxrQkFBa0IsR0FBR3hJLHFCQUFxQixDQUFDc0ksNEJBQUQsRUFBK0Isb0JBQS9CLENBQWhEO0FBQ0EsUUFBTWpDLGtCQUFrQixHQUFHdEYscUJBQXFCLENBQUN2SixnQkFBRCxDQUFoRDtBQUNBLFFBQU04TyxlQUFlLEdBQUdDLE9BQU8sQ0FBQ0Ysa0JBQWtCLElBQUksQ0FBQ0Esa0JBQWtCLENBQUNHLFVBQTNDLENBQS9CO0FBQ0EsUUFBTWlDLFNBQVMsR0FBR0YsbUJBQW1CLENBQUNHLFNBQXBCLEVBQWxCOztBQUNBLFFBQUlGLGtCQUFrQixDQUFDeFIsTUFBbkIsR0FBNEIsQ0FBNUIsSUFBaUNzUCxlQUFqQyxJQUFvRCxDQUFBbUMsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVFLFdBQVgsTUFBMkIsQ0FBbkYsRUFBc0Y7QUFDckYsYUFBTyxJQUFQO0FBQ0E7O0FBQ0QsV0FBTyxLQUFQO0FBQ0EsR0FiTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9FZG1cIjtcbmltcG9ydCB7IEZpZWxkR3JvdXAsIEZpZWxkR3JvdXBUeXBlLCBTZWxlY3RPcHRpb25UeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBDaGFydFZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQ2hhcnRcIjtcbmltcG9ydCB7XG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRnZXRUeXBlQ29uZmlnLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRUYWJsZVZpc3VhbGl6YXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBnZXRWaXN1YWxGaWx0ZXJzLCBWaXN1YWxGaWx0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9WaXN1YWxGaWx0ZXJzXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQsIGluc2VydEN1c3RvbUVsZW1lbnRzLCBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5VHlwZSwgRmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sIEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbi8vaW1wb3J0IHsgaGFzVmFsdWVIZWxwIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRmllbGQgPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbmRpdGlvblBhdGg6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRzZXR0aW5ncz86IEZpbHRlclNldHRpbmdzO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdHZpc3VhbEZpbHRlcj86IFZpc3VhbEZpbHRlcnM7XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWx0ZXJHcm91cCA9IHtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5lbnVtIGZpbHRlckZpZWxkVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmNvbnN0IHNFZG1TdHJpbmcgPSBcIkVkbS5TdHJpbmdcIjtcbmNvbnN0IHNTdHJpbmdEYXRhVHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZCA9IEN1c3RvbUVsZW1lbnQ8RmlsdGVyRmllbGQ+O1xuXG4vKipcbiAqIEVudGVyIGFsbCBEYXRhRmllbGRzIG9mIGEgZ2l2ZW4gRmllbGRHcm91cCBpbnRvIHRoZSBmaWx0ZXJGYWNldE1hcC5cbiAqXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPn0gZmllbGRHcm91cFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPn0gVGhlIG1hcCBvZiBmYWNldHMgZm9yIHRoZSBnaXZlbiBGaWVsZEdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoZmllbGRHcm91cDogQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+IHtcblx0Y29uc3QgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXHRmaWVsZEdyb3VwLkRhdGEuZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXBbZGF0YUZpZWxkLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRncm91cDogZmllbGRHcm91cC5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6XG5cdFx0XHRcdFx0Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZEdyb3VwLkxhYmVsIHx8IGZpZWxkR3JvdXAuYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwgfHwgZmllbGRHcm91cC5xdWFsaWZpZXIpXG5cdFx0XHRcdFx0KSB8fCBmaWVsZEdyb3VwLnF1YWxpZmllclxuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZmlsdGVyRmFjZXRNYXA7XG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0cmV0dXJuIHNlbGVjdGlvblZhcmlhbnRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIHNlbGVjdGlvblZhcmlhbnQpID0+IHtcblx0XHRzZWxlY3Rpb25WYXJpYW50LnByb3BlcnR5TmFtZXMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5IHNldCBhcmUgY29uZmlndXJlZCBhcyBhbmFseXRpY2FsIHRhYmxlLlxuICogQHBhcmFtIHtUYWJsZVZpc3VhbGl6YXRpb25bXX0gbGlzdFJlcG9ydFRhYmxlcyBMaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59IElzIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaGlkZGVuIG9yIG5vdFxuICovXG5mdW5jdGlvbiBjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udGV4dFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY29udGV4dFBhdGggJiYgbGlzdFJlcG9ydFRhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkoKHZpc3VhbGl6YXRpb24pID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAoKHZpc3VhbGl6YXRpb24pID0+IHtcblx0XHRcdGNvbnN0IHRhYmxlRmlsdGVycyA9IHZpc3VhbGl6YXRpb24uY29udHJvbC5maWx0ZXJzO1xuXHRcdFx0Y29uc3QgdGFibGVTVkNvbmZpZ3M6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIHRhYmxlRmlsdGVycykge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0YWJsZUZpbHRlcnNba2V5XS5wYXRocykpIHtcblx0XHRcdFx0XHRjb25zdCBwYXRocyA9IHRhYmxlRmlsdGVyc1trZXldLnBhdGhzO1xuXHRcdFx0XHRcdHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguYW5ub3RhdGlvblBhdGggJiYgc2VsZWN0aW9uVmFyaWFudFBhdGhzLmluZGV4T2YocGF0aC5hbm5vdGF0aW9uUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnRQYXRocy5wdXNoKHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb25WYXJpYW50Q29uZmlnID0gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24ocGF0aC5hbm5vdGF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGVTVkNvbmZpZ3MucHVzaChzZWxlY3Rpb25WYXJpYW50Q29uZmlnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFibGVTVkNvbmZpZ3M7XG5cdFx0fSlcblx0XHQucmVkdWNlKChzdkNvbmZpZ3MsIHNlbGVjdGlvblZhcmlhbnQpID0+IHN2Q29uZmlncy5jb25jYXQoc2VsZWN0aW9uVmFyaWFudCksIFtdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gcGF0aCByZXF1aXJlZCBmb3IgdGhlIGNvbmRpdGlvbiBtb2RlbC4gSXQgbG9va3MgYXMgZm9sbG93czpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlwZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbiAoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgcHJvcGVydHlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBwYXJ0cyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCBwYXJ0aWFsUGF0aDtcblx0bGV0IGtleSA9IFwiXCI7XG5cdHdoaWxlIChwYXJ0cy5sZW5ndGgpIHtcblx0XHRsZXQgcGFydCA9IHBhcnRzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuXHRcdHBhcnRpYWxQYXRoID0gcGFydGlhbFBhdGggPyBwYXJ0aWFsUGF0aCArIFwiL1wiICsgcGFydCA6IHBhcnQ7XG5cdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXJ0aWFsUGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIHByb3BlcnR5LmlzQ29sbGVjdGlvbikge1xuXHRcdFx0cGFydCArPSBcIipcIjtcblx0XHR9XG5cdFx0a2V5ID0ga2V5ID8ga2V5ICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0fVxuXHRyZXR1cm4ga2V5O1xufTtcblxuY29uc3QgX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHQvLyBpZ25vcmUgY29tcGxleCBwcm9wZXJ0eSB0eXBlcyBhbmQgaGlkZGVuIGFubm90YXRlZCBvbmVzXG5cdGlmIChcblx0XHRwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0cHJvcGVydHkudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0KGluY2x1ZGVIaWRkZW4gfHwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0KSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUocHJvcGVydHkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGNvbmRpdGlvblBhdGg6IF9nZXRDb25kaXRpb25QYXRoKGVudGl0eVR5cGUsIGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YXZhaWxhYmlsaXR5OlxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpID09PSB0cnVlID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0XHRsYWJlbDogY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKSxcblx0XHRcdGdyb3VwOiB0YXJnZXRFbnRpdHlUeXBlLm5hbWUsXG5cdFx0XHRncm91cExhYmVsOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCB0YXJnZXRFbnRpdHlUeXBlLm5hbWUpXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsVHlwZShzVHlwZTogYW55KSB7XG5cdHR5cGUgZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRba2V5OiBzdHJpbmddOiBzdHJpbmc7XG5cdFx0fTtcblx0fTtcblx0Y29uc3QgbURlZmF1bHRUeXBlRm9yRWRtVHlwZTogZGVmYXVsdE1vZGVsVHlwZSA9IHtcblx0XHRcIkVkbS5Cb29sZWFuXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJCb29sXCJcblx0XHR9LFxuXHRcdFwiRWRtLkJ5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EYXRlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEYXRlVGltZU9mZnNldFwiXG5cdFx0fSxcblx0XHRcIkVkbS5EZWNpbWFsXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJEZWNpbWFsXCJcblx0XHR9LFxuXHRcdFwiRWRtLkRvdWJsZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRmxvYXRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkd1aWRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkd1aWRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50MTZcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQzMlwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDY0XCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU0J5dGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TaW5nbGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkZsb2F0XCJcblx0XHR9LFxuXHRcdFwiRWRtLlN0cmluZ1wiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiU3RyaW5nXCJcblx0XHR9LFxuXHRcdFwiRWRtLlRpbWVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5UaW1lT2ZEYXlcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIlRpbWVPZkRheVwiXG5cdFx0fSxcblx0XHRcIkVkbS5TdHJlYW1cIjoge1xuXHRcdFx0Ly9ubyBjb3JyZXNwb25kaW5nIG1vZGVsVHlwZSAtIGlnbm9yZSBmb3IgZmlsdGVyaW5nXG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc1R5cGUgJiYgc1R5cGUgaW4gbURlZmF1bHRUeXBlRm9yRWRtVHlwZSAmJiBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlW3NUeXBlXS5tb2RlbFR5cGU7XG59XG5jb25zdCBfZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eS50YXJnZXRUeXBlLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCIpIHtcblx0XHRcdFx0Ly8gaGFuZGxlIENvbXBsZXhUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIikuc3BsaWNlKDAsIDEpLmpvaW4oXCIvXCIpIDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbiAoXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHRsZXQgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF07XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpPy5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1JU1NJTkdfU0VMRUNUSU9ORklFTEQpO1xuXHR9XG5cdC8vIGRlZmluZWQgU2VsZWN0aW9uRmllbGRzIGFyZSBhdmFpbGFibGUgYnkgZGVmYXVsdFxuXHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHkgPT09IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQ7XG5cdFx0ZmlsdGVyRmllbGQuaXNQYXJhbWV0ZXIgPSAhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGQ7XG59O1xuXG5jb25zdCBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uIChcblx0YVNlbGVjdE9wdGlvbnM6IGFueVtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IFByb3BlcnR5UGF0aFtdXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gW107XG5cdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Ly8gVXNpbmcgZW50aXR5VHlwZSBpbnN0ZWFkIG9mIGVudGl0eVNldFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goKFNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKChTZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0XHRVSVNlbGVjdGlvbkZpZWxkc1tTZWxlY3Rpb25GaWVsZC52YWx1ZV0gPSB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBnZXRGaWx0ZXJGaWVsZChzUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGRlZmF1bHRGaWx0ZXJWYWx1ZSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LkZpbHRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aCA9IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRpZiAoIShQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoZGVmYXVsdEZpbHRlclZhbHVlICYmICEoUHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IGdldEZpbHRlckZpZWxkKFByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG5cbi8qKlxuICogR2V0IGFsbCBwYXJhbWV0ZXIgZmlsdGVyIGZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dCAmJiAhZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQ7XG5cdGNvbnN0IHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQgPVxuXHRcdGlzUGFyYW1ldGVyaXplZCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWUpO1xuXG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IChcblx0XHRwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZChcblx0XHRcdFx0XHRcdHt9IGFzIFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPixcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVyRW50aXR5VHlwZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHQgIH0pXG5cdFx0XHQ6IFtdXG5cdCkgYXMgRmlsdGVyRmllbGRbXTtcblxuXHRyZXR1cm4gcGFyYW1ldGVyRmllbGRzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIFRoZSBsaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7Q2hhcnRWaXN1YWxpemF0aW9uW119IGNoYXJ0cyBUaGUgQUxQIGNoYXJ0c1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbiAoXG5cdGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjaGFydHM6IENoYXJ0VmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBib29sZWFuIHtcblx0Ly8gQ2hlY2sgaWYgY2hhcnRzIGFsbG93IHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluQ2hhcnRzID0gY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuZXZlcnkoKGNoYXJ0KSA9PiAhY2hhcnQuYXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoKTtcblxuXHQvLyBDaGVjayBpZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIGFuZCBub25lIG9mIHRoZW0gYWxsb3cgZm9yIHNlYXJjaFxuXHRjb25zdCBub1NlYXJjaEluVGFibGVzID1cblx0XHRsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA9PT0gMCB8fCBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KCh0YWJsZSkgPT4gdGFibGUuZW5hYmxlQW5hbHl0aWNzICYmICF0YWJsZS5lbmFibGVBbmFseXRpY3NTZWFyY2gpO1xuXG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRpZiAoY29udGV4dFBhdGggJiYgbm9TZWFyY2hJbkNoYXJ0cyAmJiBub1NlYXJjaEluVGFibGVzKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IGZiQ29uZmlnOiBGaWx0ZXJNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKTtcblx0Y29uc3QgZGVmaW5lZEZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24+ID0gZmJDb25maWc/LmZpbHRlckZpZWxkcyB8fCB7fTtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSBfZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0T2JqZWN0LmtleXMoZGVmaW5lZEZpbHRlckZpZWxkcykubWFwKChrZXkpID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHR5cGUgPSBmaWx0ZXJGaWVsZC50eXBlID09PSBcIlNsb3RcIiA/IGZpbHRlckZpZWxkVHlwZS5TbG90IDogZmlsdGVyRmllbGRUeXBlLkRlZmF1bHQ7XG5cdFx0Y29uc3QgdmlzdWFsRmlsdGVyID1cblx0XHRcdGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkPy52aXN1YWxGaWx0ZXJcblx0XHRcdFx0PyBnZXRWaXN1YWxGaWx0ZXJzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQsIHNLZXksIGRlZmluZWRGaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGZpbHRlckZpZWxkc1tzS2V5XSA9IHtcblx0XHRcdGtleTogc0tleSxcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmFubm90YXRpb25QYXRoLFxuXHRcdFx0Y29uZGl0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmNvbmRpdGlvblBhdGggfHwgcHJvcGVydHlOYW1lLFxuXHRcdFx0dGVtcGxhdGU6IGZpbHRlckZpZWxkLnRlbXBsYXRlLFxuXHRcdFx0bGFiZWw6IGZpbHRlckZpZWxkLmxhYmVsLFxuXHRcdFx0cG9zaXRpb246IGZpbHRlckZpZWxkLnBvc2l0aW9uIHx8IHsgcGxhY2VtZW50OiBQbGFjZW1lbnQuQWZ0ZXIgfSxcblx0XHRcdGF2YWlsYWJpbGl0eTogZmlsdGVyRmllbGQuYXZhaWxhYmlsaXR5IHx8IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdHNldHRpbmdzOiBmaWx0ZXJGaWVsZC5zZXR0aW5ncyxcblx0XHRcdHZpc3VhbEZpbHRlcjogdmlzdWFsRmlsdGVyXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlckZpZWxkID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XG5cdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30sIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uOiBhbnksIHNSZXN0cmljdGlvbjogYW55KSB7XG5cdGlmIChzUmVzdHJpY3Rpb24gPT09IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfHwgc1Jlc3RyaWN0aW9uID09PSBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHtcblx0XHRsZXQgYVByb3BzID0gW107XG5cdFx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0pIHtcblx0XHRcdGFQcm9wcyA9IG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbl0ubWFwKGZ1bmN0aW9uIChvUHJvcGVydHk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGggfHwgb1Byb3BlcnR5LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhUHJvcHM7XG5cdH0gZWxzZSBpZiAoc1Jlc3RyaWN0aW9uID09PSBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiKSB7XG5cdFx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9ucyA9IHt9IGFzIGFueTtcblx0XHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucykge1xuXHRcdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHk6IGFueSkge1xuXHRcdFx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0XHRcdGlmIChtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0pIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0ucHVzaChvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS52YWx1ZV0gPSBbb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9uc107XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gbUFsbG93ZWRFeHByZXNzaW9ucztcblx0fVxuXHRyZXR1cm4gb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb247XG59O1xuXG5jb25zdCBnZXRTZWFyY2hGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkc2VhcmNoXCIsXG5cdFx0cGF0aDogXCIkc2VhcmNoXCIsXG5cdFx0ZGF0YVR5cGU6IHNTdHJpbmdEYXRhVHlwZSxcblx0XHRtYXhDb25kaXRpb25zOiAxXG5cdH07XG59O1xuXG5jb25zdCBnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB7XG5cdFx0bmFtZTogXCIkZWRpdFN0YXRlXCIsXG5cdFx0cGF0aDogXCIkZWRpdFN0YXRlXCIsXG5cdFx0Z3JvdXBMYWJlbDogXCJcIixcblx0XHRncm91cDogXCJcIixcblx0XHRkYXRhVHlwZTogc1N0cmluZ0RhdGFUeXBlLFxuXHRcdGhpZGRlbkZpbHRlcjogZmFsc2Vcblx0fTtcbn07XG5cbmNvbnN0IGdldFNlYXJjaFJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KSB7XG5cdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5TZWFyY2hSZXN0cmljdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGg6IHN0cmluZykge1xuXHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9uczogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuUmVzdHJpY3RlZFByb3BlcnRpZXM7XG5cdHJldHVybiAoXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzICYmXG5cdFx0YVJlc3RyaWN0ZWRQcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24gKG9SZXN0cmljdGVkUHJvcGVydHk6IGFueSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eSAmJlxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eSAmJlxuXHRcdFx0XHQob1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IHNOYXZpZ2F0aW9uUGF0aCB8fFxuXHRcdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5LnZhbHVlID09PSBzTmF2aWdhdGlvblBhdGgpXG5cdFx0XHQpO1xuXHRcdH0pXG5cdCk7XG59O1xuXG5jb25zdCBfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyA9IGZ1bmN0aW9uIChvRmlsdGVyRmllbGRJbmZvOiBhbnkpIHtcblx0cmV0dXJuIHtcblx0XHRrZXk6IG9GaWx0ZXJGaWVsZEluZm8ua2V5LFxuXHRcdGFubm90YXRpb25QYXRoOiBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoLFxuXHRcdGNvbmRpdGlvblBhdGg6IG9GaWx0ZXJGaWVsZEluZm8uY29uZGl0aW9uUGF0aCxcblx0XHRuYW1lOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0bGFiZWw6IG9GaWx0ZXJGaWVsZEluZm8ubGFiZWwsXG5cdFx0aGlkZGVuRmlsdGVyOiBvRmlsdGVyRmllbGRJbmZvLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIixcblx0XHRkaXNwbGF5OiBcIlZhbHVlXCIsXG5cdFx0aXNQYXJhbWV0ZXI6IG9GaWx0ZXJGaWVsZEluZm8uaXNQYXJhbWV0ZXIsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogb0ZpbHRlckZpZWxkSW5mby5jYXNlU2Vuc2l0aXZlLFxuXHRcdGF2YWlsYWJpbGl0eTogb0ZpbHRlckZpZWxkSW5mby5hdmFpbGFiaWxpdHksXG5cdFx0cG9zaXRpb246IG9GaWx0ZXJGaWVsZEluZm8ucG9zaXRpb24sXG5cdFx0dHlwZTogb0ZpbHRlckZpZWxkSW5mby50eXBlLFxuXHRcdHRlbXBsYXRlOiBvRmlsdGVyRmllbGRJbmZvLnRlbXBsYXRlLFxuXHRcdG1lbnU6IG9GaWx0ZXJGaWVsZEluZm8ubWVudVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoYUV4cHJlc3Npb25zOiBhbnkpIHtcblx0Y29uc3QgYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5ID0gW1xuXHRcdFwiU2luZ2xlVmFsdWVcIixcblx0XHRcIk11bHRpVmFsdWVcIixcblx0XHRcIlNpbmdsZVJhbmdlXCIsXG5cdFx0XCJNdWx0aVJhbmdlXCIsXG5cdFx0XCJTZWFyY2hFeHByZXNzaW9uXCIsXG5cdFx0XCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCJcblx0XTtcblxuXHRhRXhwcmVzc2lvbnMuc29ydChmdW5jdGlvbiAoYTogYW55LCBiOiBhbnkpIHtcblx0XHRyZXR1cm4gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYSkgLSBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihiKTtcblx0fSk7XG5cblx0cmV0dXJuIGFFeHByZXNzaW9uc1swXTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvUHJvcGVydHlBbm5vdGF0aW9uczogYW55LCBvQ29sbGVjdGlvbkFubm90YXRpb25zOiBhbnkpIHtcblx0Y29uc3Qgb1RleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCxcblx0XHRvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uID1cblx0XHRcdG9UZXh0QW5ub3RhdGlvbiAmJlxuXHRcdFx0KChvUHJvcGVydHlBbm5vdGF0aW9ucyAmJiBvUHJvcGVydHlBbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkgfHxcblx0XHRcdFx0KG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgJiYgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkpO1xuXG5cdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dE9ubHlcIikge1xuXHRcdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dExhc3RcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVEZXNjcmlwdGlvblwiO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblZhbHVlXCI7IC8vVGV4dEZpcnN0XG5cdH1cblx0cmV0dXJuIG9UZXh0QW5ub3RhdGlvbiA/IFwiRGVzY3JpcHRpb25WYWx1ZVwiIDogXCJWYWx1ZVwiO1xufTtcblxuY29uc3QgX2ZldGNoUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG9GaWx0ZXJGaWVsZEluZm86IGFueSwgb1R5cGVDb25maWc6IGFueSkge1xuXHRsZXQgb1Byb3BlcnR5SW5mbyA9IF9mZXRjaEJhc2ljUHJvcGVydHlJbmZvKG9GaWx0ZXJGaWVsZEluZm8pO1xuXHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvRmlsdGVyRmllbGRJbmZvLmFubm90YXRpb25QYXRoO1xuXG5cdGlmICghc0Fubm90YXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG5cdH1cblx0Y29uc3QgdGFyZ2V0UHJvcGVydHlPYmplY3QgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3Ioc0Fubm90YXRpb25QYXRoKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eUFubm90YXRpb25zID0gdGFyZ2V0UHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zO1xuXHRjb25zdCBvQ29sbGVjdGlvbkFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM7XG5cblx0Y29uc3Qgb0Zvcm1hdE9wdGlvbnMgPSBvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zO1xuXHRjb25zdCBvQ29uc3RyYWludHMgPSBvVHlwZUNvbmZpZy5jb25zdHJhaW50cztcblx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zLFxuXHRcdGNvbnN0cmFpbnRzOiBvQ29uc3RyYWludHMsXG5cdFx0ZGlzcGxheTogZGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnMsIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMpXG5cdH0pO1xuXHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcbn07XG5cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWUgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBhbnkpIHtcblx0bGV0IGJJc011bHRpVmFsdWUgPSB0cnVlO1xuXHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdHN3aXRjaCAob1Byb3BlcnR5LmZpbHRlckV4cHJlc3Npb24pIHtcblx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0YklzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChvUHJvcGVydHkudHlwZSAmJiBvUHJvcGVydHkudHlwZS5pbmRleE9mKFwiQm9vbGVhblwiKSA+IDApIHtcblx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGJJc011bHRpVmFsdWU7XG59O1xuXG5jb25zdCBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIixcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHQvL0ZpbHRlcnMgd2hpY2ggaGFzIHRvIGJlIGFkZGVkIHdoaWNoIGlzIHBhcnQgb2YgU1YvRGVmYXVsdCBhbm5vdGF0aW9ucyBidXQgbm90IHByZXNlbnQgaW4gdGhlIFNlbGVjdGlvbkZpZWxkc1xuXHRjb25zdCBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMgPSAoKGFubm90YXRpb25QYXRoICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGgpPy5hbm5vdGF0aW9uKSB8fFxuXHRcdGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5TZWxlY3Rpb25GaWVsZHMgfHxcblx0XHRbXSkgYXMgUHJvcGVydHlQYXRoW107XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IHtcblx0XHQvLyAuLi5ub24gaGlkZGVuIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eVxuXHRcdC4uLl9nZXRTZWxlY3Rpb25GaWVsZHMoZW50aXR5VHlwZSwgXCJcIiwgZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0KVxuXHR9O1xuXHRsZXQgYVNlbGVjdE9wdGlvbnM6IGFueVtdID0gW107XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnQgPSBnZXRTZWxlY3Rpb25WYXJpYW50KGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zO1xuXHR9XG5cblx0Y29uc3QgcHJvcGVydHlJbmZvRmllbGRzOiBhbnkgPVxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3Rpb25GaWVsZC52YWx1ZTtcblx0XHRcdGlmICghKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwID0gXCJcIjtcblx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChmaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG5cdFx0fSwgW10pIHx8IFtdO1xuXG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJGaWVsZHMgPSBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyhcblx0XHRhU2VsZWN0T3B0aW9ucyxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkc1xuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0ZW50aXR5VHlwZTogZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyxcblx0XHRmaWx0ZXJGaWVsZHM6IGZpbHRlckZpZWxkcyxcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHM6IHByb3BlcnR5SW5mb0ZpZWxkcyxcblx0XHRkZWZhdWx0RmlsdGVyRmllbGRzOiBkZWZhdWx0RmlsdGVyRmllbGRzXG5cdH07XG59O1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5SW5mb0ZpZWxkczogYW55LFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcz86IGFueVxuKSB7XG5cdC8vZ2V0IFR5cGVDb25maWcgZnVuY3Rpb25cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRUeXBlczogYW55ID0gW107XG5cdGNvbnN0IGFUeXBlQ29uZmlnOiBhbnkgPSB7fTtcblx0Y29uc3QgX2ZuVHlwZUNvbmZpZyA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHksIGtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1R5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBwcm9wZXJ0eT8udHlwZSk7XG5cdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHByb3BlcnR5Py50eXBlKTtcblx0XHRpZiAoXG5cdFx0XHRwcm9wZXJ0eT8udHlwZSA9PT0gc0VkbVN0cmluZyAmJlxuXHRcdFx0KG9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzLm51bGxhYmxlID09PSB1bmRlZmluZWQgfHwgb1R5cGVDb25maWcuY29uc3RyYWludHMubnVsbGFibGUgPT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRvVHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IGZhbHNlO1xuXHRcdH1cblx0XHRhVHlwZUNvbmZpZ1trZXldID0gb1R5cGVDb25maWc7XG5cdH07XG5cblx0aWYgKGRlZmF1bHRWYWx1ZVByb3BlcnR5RmllbGRzKSB7XG5cdFx0cHJvcGVydHlJbmZvRmllbGRzID0gcHJvcGVydHlJbmZvRmllbGRzLmNvbmNhdChkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcyk7XG5cdH1cblx0Ly9hZGQgdHlwZUNvbmZpZ1xuXHRwcm9wZXJ0eUluZm9GaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW1ldGVyRmllbGQ6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlDb252ZXJ0eUNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUYXJnZXRPYmplY3QgPSBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXHRcdFx0X2ZuVHlwZUNvbmZpZyhwcm9wZXJ0eVRhcmdldE9iamVjdCwgcGFyYW1ldGVyRmllbGQua2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZWN0aW9uRmllbGRUeXBlcy5wdXNoKHNFZG1TdHJpbmcpO1xuXHRcdFx0YVR5cGVDb25maWdbcGFyYW1ldGVyRmllbGQua2V5XSA9IHsgdHlwZTogc1N0cmluZ0RhdGFUeXBlIH07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBmaWx0ZXJSZXN0cmljdGlvbnNcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3Qgb1JldCA9IHt9IGFzIGFueTtcblx0b1JldFtcIlJlcXVpcmVkUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0b1JldFtcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge307XG5cblx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IGFQYXRoUGFydHMgPSBzRW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIik7XG5cdGlmIChhUGF0aFBhcnRzLmxlbmd0aCA+IDIpIHtcblx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBhUGF0aFBhcnRzW2FQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0YVBhdGhQYXJ0cy5zcGxpY2UoLTEsIDEpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LCBzTmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zID0gb05hdmlnYXRpb25SZXN0cmljdGlvbnMgJiYgb05hdmlnYXRpb25SZXN0cmljdGlvbnMuRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10pO1xuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge1xuXHRcdFx0Li4uKGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucywgXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikgfHwge30pLFxuXHRcdFx0Li4ub1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcblx0XHR9O1xuXHR9XG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcHMgPSBvUmV0LlJlcXVpcmVkUHJvcGVydGllcztcblx0Y29uc3QgYU5vbkZpbHRlcmFibGVQcm9wcyA9IG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM7XG5cdGxldCBvUHJvcGVydHlJbmZvO1xuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXM6IGFueSA9IFtdO1xuXG5cdC8vIHByb2Nlc3MgdGhlIGZpZWxkcyB0byBhZGQgbmVjZXNzYXJ5IHByb3BlcnRpZXNcblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5SW5mb0ZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ29udmVydGVkUHJvcGVydHkgPSBwcm9wZXJ0eUluZm9GaWVsZDtcblx0XHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0XHRpZiAob0NvbnZlcnRlZFByb3BlcnR5LmNvbmRpdGlvblBhdGgpIHtcblx0XHRcdHNQcm9wZXJ0eVBhdGggPSBvQ29udmVydGVkUHJvcGVydHkuY29uZGl0aW9uUGF0aC5yZXBsYWNlKC9cXCt8XFwqL2csIFwiXCIpO1xuXHRcdH1cblx0XHRpZiAoYU5vbkZpbHRlcmFibGVQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0b1Byb3BlcnR5SW5mbyA9IF9mZXRjaFByb3BlcnR5SW5mbyhjb252ZXJ0ZXJDb250ZXh0LCBvQ29udmVydGVkUHJvcGVydHksIGFUeXBlQ29uZmlnW3Byb3BlcnR5SW5mb0ZpZWxkLmtleV0pO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdFx0XHRcdG1heENvbmRpdGlvbnM6ICFvUHJvcGVydHlJbmZvLmlzUGFyYW1ldGVyICYmIGlzTXVsdGlWYWx1ZShvUHJvcGVydHlJbmZvKSA/IC0xIDogMSxcblx0XHRcdFx0XHRyZXF1aXJlZDogb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciB8fCBhUmVxdWlyZWRQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID49IDAsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNDYXNlU2Vuc2l0aXZlLFxuXHRcdFx0XHRcdGRhdGFUeXBlOiBhVHlwZUNvbmZpZ1twcm9wZXJ0eUluZm9GaWVsZC5rZXldLnR5cGVcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2gob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQvL2FkZCBlZGl0XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCkge1xuXHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKGdldEVkaXRTdGF0ZUZpbHRlclByb3BlcnR5SW5mbygpKTtcblx0fVxuXHQvLyBhZGQgc2VhcmNoXG5cdGNvbnN0IHNlYXJjaFJlc3RyaWN0aW9ucyA9IGdldFNlYXJjaFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgaGlkZUJhc2ljU2VhcmNoID0gQm9vbGVhbihzZWFyY2hSZXN0cmljdGlvbnMgJiYgIXNlYXJjaFJlc3RyaWN0aW9ucy5TZWFyY2hhYmxlKTtcblx0aWYgKHNFbnRpdHlTZXRQYXRoICYmIGhpZGVCYXNpY1NlYXJjaCAhPT0gdHJ1ZSkge1xuXHRcdGlmICghc2VhcmNoUmVzdHJpY3Rpb25zIHx8IHNlYXJjaFJlc3RyaWN0aW9ucz8uU2VhcmNoYWJsZSkge1xuXHRcdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2goZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvKCkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhRmV0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyA9IGZ1bmN0aW9uIChcblx0ZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pIHtcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGZpbHRlckZpZWxkcywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHR5cGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0cG9zaXRpb246IFwib3ZlcndyaXRlXCIsXG5cdFx0dGVtcGxhdGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0dmlzdWFsRmlsdGVyOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIixcblx0aW5jbHVkZUhpZGRlbj86IGJvb2xlYW5cbik6IGFueSB7XG5cdGNvbnN0IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEoY29udmVydGVyQ29udGV4dCwgbHJUYWJsZXMsIGFubm90YXRpb25QYXRoLCBpbmNsdWRlSGlkZGVuKTtcblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0bGV0IHByb3BlcnR5SW5mb0ZpZWxkczogRmlsdGVyRmllbGRbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5wcm9wZXJ0eUluZm9GaWVsZHMpKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZW50aXR5VHlwZTtcblxuXHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBwYXJhbWV0ZXJGaWVsZHMuY29uY2F0KHByb3BlcnR5SW5mb0ZpZWxkcyk7XG5cblx0cHJvcGVydHlJbmZvRmllbGRzID0gaW5zZXJ0Q3VzdG9tTWFuaWZlc3RFbGVtZW50cyhwcm9wZXJ0eUluZm9GaWVsZHMsIGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGNvbnN0IGFGZXRjaGVkUHJvcGVydGllcyA9IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMoXG5cdFx0cHJvcGVydHlJbmZvRmllbGRzLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0b0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5kZWZhdWx0RmlsdGVyRmllbGRzXG5cdCk7XG5cdGFGZXRjaGVkUHJvcGVydGllcy5zb3J0KGZ1bmN0aW9uIChhOiBhbnksIGI6IGFueSkge1xuXHRcdGlmIChhLmdyb3VwTGFiZWwgPT09IHVuZGVmaW5lZCB8fCBhLmdyb3VwTGFiZWwgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdFx0aWYgKGIuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGIuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdHJldHVybiBhLmdyb3VwTGFiZWwubG9jYWxlQ29tcGFyZShiLmdyb3VwTGFiZWwpO1xuXHR9KTtcblxuXHRsZXQgc0ZldGNoUHJvcGVydGllcyA9IEpTT04uc3RyaW5naWZ5KGFGZXRjaGVkUHJvcGVydGllcyk7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcey9nLCBcIlxcXFx7XCIpO1xuXHRzRmV0Y2hQcm9wZXJ0aWVzID0gc0ZldGNoUHJvcGVydGllcy5yZXBsYWNlKC9cXH0vZywgXCJcXFxcfVwiKTtcblx0Y29uc3Qgc1Byb3BlcnR5SW5mbyA9IHNGZXRjaFByb3BlcnRpZXM7XG5cdC8vIGVuZCBvZiBwcm9wZXJ0eUZpZWxkcyBwcm9jZXNzaW5nXG5cblx0Ly8gdG8gcG9wdWxhdGUgc2VsZWN0aW9uIGZpZWxkc1xuXHRsZXQgcHJvcFNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5wcm9wZXJ0eUluZm9GaWVsZHMpKTtcblx0cHJvcFNlbGVjdGlvbkZpZWxkcyA9IHBhcmFtZXRlckZpZWxkcy5jb25jYXQocHJvcFNlbGVjdGlvbkZpZWxkcyk7XG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gc2VsZWN0aW9uIHZhcmlhbnRzXG5cdGNvbnN0IGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcztcblx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5GaWx0ZXJGYWNldHM7XG5cdGxldCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cblx0Y29uc3QgYUZpZWxkR3JvdXBzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApO1xuXG5cdGlmIChmaWx0ZXJGYWNldHMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJGYWNldHMubGVuZ3RoIDwgMCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiBhRmllbGRHcm91cHMpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwID0ge1xuXHRcdFx0XHQuLi5maWx0ZXJGYWNldE1hcCxcblx0XHRcdFx0Li4uZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhhRmllbGRHcm91cHNbaV0gYXMgQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmlsdGVyRmFjZXRNYXAgPSBmaWx0ZXJGYWNldHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4sIGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldFR5cGVzKSA9PiB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHByZXZpb3VzVmFsdWVbKChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhW2ldIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0XHRncm91cDogZmlsdGVyRmFjZXQ/LklEPy50b1N0cmluZygpLFxuXHRcdFx0XHRcdGdyb3VwTGFiZWw6IGZpbHRlckZhY2V0Py5MYWJlbD8udG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZmlsdGVyRmllbGRzO1xuXG5cdC8vIGZpbmFsbHkgY3JlYXRlIGZpbmFsIGxpc3Qgb2YgZmlsdGVyIGZpZWxkcyBieSBhZGRpbmcgdGhlIFNlbGVjdGlvbkZpZWxkcyBmaXJzdCAob3JkZXIgbWF0dGVycykuLi5cblx0bGV0IGFsbEZpbHRlcnMgPSBwcm9wU2VsZWN0aW9uRmllbGRzXG5cblx0XHQvLyAuLi5hbmQgYWRkaW5nIHJlbWFpbmluZyBmaWx0ZXIgZmllbGRzLCB0aGF0IGFyZSBub3QgdXNlZCBpbiBhIFNlbGVjdGlvblZhcmlhbnQgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyKVxuXHRcdC5jb25jYXQoXG5cdFx0XHRPYmplY3Qua2V5cyhmaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdC5maWx0ZXIoKHByb3BlcnR5UGF0aCkgPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF0sIGZpbHRlckZhY2V0TWFwW3Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblxuXHQvL2lmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgdGFibGVzIFwiYWdncmVnYXRhYmxlXCIgcHJvcGVydGllcyBtdXN0IGJlIGV4Y2x1ZGVkXG5cdGlmIChjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsclRhYmxlcywgc0NvbnRleHRQYXRoKSkge1xuXHRcdC8vIEN1cnJlbnRseSBhbGwgYWdyZWdhdGVzIGFyZSByb290IGVudGl0eSBwcm9wZXJ0aWVzIChubyBwcm9wZXJ0aWVzIGNvbWluZyBmcm9tIG5hdmlnYXRpb24pIGFuZCBhbGxcblx0XHQvLyB0YWJsZXMgd2l0aCBzYW1lIGVudGl0eVNldCBnZXRzIHNhbWUgYWdncmVhZ3RlIGNvbmZpZ3VyYXRpb24gdGhhdCdzIHdoeSB3ZSBjYW4gdXNlIGZpcnN0IHRhYmxlIGludG9cblx0XHQvLyBMUiB0byBnZXQgYWdncmVnYXRlcyAod2l0aG91dCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMgc2luY2Ugd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZmlsdGVyIHRoZW0pLlxuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXMgPSBsclRhYmxlc1swXS5hZ2dyZWdhdGVzO1xuXHRcdGlmIChhZ2dyZWdhdGVzKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZXMpLm1hcCgoYWdncmVnYXRlS2V5KSA9PiBhZ2dyZWdhdGVzW2FnZ3JlZ2F0ZUtleV0ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGFsbEZpbHRlcnMgPSBhbGxGaWx0ZXJzLmZpbHRlcigoZmlsdGVyRmllbGQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMoYWxsRmlsdGVycywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gQWRkIGNhc2VTZW5zaXRpdmUgcHJvcGVydHkgdG8gYWxsIHNlbGVjdGlvbiBmaWVsZHMuXG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0c2VsZWN0aW9uRmllbGRzLmZvckVhY2goKGZpbHRlckZpZWxkKSA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHsgc2VsZWN0aW9uRmllbGRzLCBzUHJvcGVydHlJbmZvIH07XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIGJhciBpbnNpZGUgYSB2YWx1ZSBoZWxwIGRpYWxvZyBzaG91bGQgYmUgZXhwYW5kZWQuIFRoaXMgaXMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaG9sZHM6XG4gKiAoMSkgYSBmaWx0ZXIgcHJvcGVydHkgaXMgbWFuZGF0b3J5LFxuICogKDIpIG5vIHNlYXJjaCBmaWVsZCBleGlzdHMgKGVudGl0eSBpc24ndCBzZWFyY2ggZW5hYmxlZCksXG4gKiAoMykgd2hlbiB0aGUgZGF0YSBpc24ndCBsb2FkZWQgYnkgZGVmYXVsdCAoYW5ub3RhdGlvbiBGZXRjaFZhbHVlcyA9IDIpLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHthbnl9IGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gVGhlIEZpbHRlclJlc3RyaWN0aW9uIGFubm90YXRpb25cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZUxpc3RBbm5vdGF0aW9uIFRoZSBWYWx1ZUxpc3QgYW5ub3RhdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSB2YWx1ZSBmb3IgZXhwYW5kRmlsdGVyRmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHBhbmRGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb246IGFueSxcblx0dmFsdWVMaXN0QW5ub3RhdGlvbjogYW55XG4pOiBib29sZWFuIHtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24sIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpO1xuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlTGlzdEFubm90YXRpb24uZ2V0T2JqZWN0KCk7XG5cdGlmIChyZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCB8fCBoaWRlQmFzaWNTZWFyY2ggfHwgdmFsdWVMaXN0Py5GZXRjaFZhbHVlcyA9PT0gMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iXX0=
954
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJzRWRtU3RyaW5nIiwic1N0cmluZ0RhdGFUeXBlIiwiZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyIsImZpZWxkR3JvdXAiLCJmaWx0ZXJGYWNldE1hcCIsIkRhdGEiLCJmb3JFYWNoIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsInBhdGgiLCJncm91cCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImdyb3VwTGFiZWwiLCJjb21waWxlRXhwcmVzc2lvbiIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkxhYmVsIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJxdWFsaWZpZXIiLCJnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMiLCJzZWxlY3Rpb25WYXJpYW50cyIsInJlZHVjZSIsInByZXZpb3VzVmFsdWUiLCJzZWxlY3Rpb25WYXJpYW50IiwicHJvcGVydHlOYW1lcyIsInByb3BlcnR5TmFtZSIsImNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsIiwibGlzdFJlcG9ydFRhYmxlcyIsImNvbnRleHRQYXRoIiwibGVuZ3RoIiwiZXZlcnkiLCJ2aXN1YWxpemF0aW9uIiwiZW5hYmxlQW5hbHl0aWNzIiwiYW5ub3RhdGlvbiIsImNvbGxlY3Rpb24iLCJnZXRTZWxlY3Rpb25WYXJpYW50cyIsImxyVGFibGVWaXN1YWxpemF0aW9ucyIsImNvbnZlcnRlckNvbnRleHQiLCJzZWxlY3Rpb25WYXJpYW50UGF0aHMiLCJtYXAiLCJ0YWJsZUZpbHRlcnMiLCJjb250cm9sIiwiZmlsdGVycyIsInRhYmxlU1ZDb25maWdzIiwia2V5IiwiQXJyYXkiLCJpc0FycmF5IiwicGF0aHMiLCJhbm5vdGF0aW9uUGF0aCIsImluZGV4T2YiLCJwdXNoIiwic2VsZWN0aW9uVmFyaWFudENvbmZpZyIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic3ZDb25maWdzIiwiY29uY2F0IiwiX2dldENvbmRpdGlvblBhdGgiLCJlbnRpdHlUeXBlIiwicHJvcGVydHlQYXRoIiwicGFydHMiLCJzcGxpdCIsInBhcnRpYWxQYXRoIiwicGFydCIsInNoaWZ0IiwicHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiaXNDb2xsZWN0aW9uIiwiX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkIiwiZnVsbFByb3BlcnR5UGF0aCIsImluY2x1ZGVIaWRkZW4iLCJ1bmRlZmluZWQiLCJ0YXJnZXRUeXBlIiwiVUkiLCJIaWRkZW4iLCJ2YWx1ZU9mIiwidGFyZ2V0RW50aXR5VHlwZSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiS2V5SGVscGVyIiwiZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJjb25kaXRpb25QYXRoIiwiYXZhaWxhYmlsaXR5IiwiSGlkZGVuRmlsdGVyIiwiQXZhaWxhYmlsaXR5VHlwZSIsIkFkYXB0YXRpb24iLCJsYWJlbCIsIm5hbWUiLCJnZXRNb2RlbFR5cGUiLCJzVHlwZSIsIm1EZWZhdWx0VHlwZUZvckVkbVR5cGUiLCJtb2RlbFR5cGUiLCJfZ2V0U2VsZWN0aW9uRmllbGRzIiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0aWVzIiwic2VsZWN0aW9uRmllbGRNYXAiLCJmdWxsUGF0aCIsInNlbGVjdGlvbkZpZWxkIiwiX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCIsInByb3BlcnR5UGF0aHMiLCJzZWxlY3Rpb25GaWVsZHMiLCJsb2NhbFNlbGVjdGlvbkZpZWxkcyIsImVudGl0eVByb3BlcnRpZXMiLCJpbmNsdWRlcyIsInNwbGljZSIsImpvaW4iLCJfZ2V0RmlsdGVyRmllbGQiLCJmaWx0ZXJGaWVsZHMiLCJmaWx0ZXJGaWVsZCIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiQW5ub3RhdGlvbiIsIklzc3VlU2V2ZXJpdHkiLCJIaWdoIiwiSXNzdWVUeXBlIiwiTUlTU0lOR19TRUxFQ1RJT05GSUVMRCIsIkRlZmF1bHQiLCJpc1BhcmFtZXRlciIsIlJlc3VsdENvbnRleHQiLCJfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyIsImFTZWxlY3RPcHRpb25zIiwiZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwiYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzIiwiVUlTZWxlY3Rpb25GaWVsZHMiLCJTZWxlY3Rpb25GaWVsZCIsInZhbHVlIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwic1Byb3BlcnR5UGF0aCIsImN1cnJlbnRTZWxlY3Rpb25GaWVsZHMiLCJGaWx0ZXJGaWVsZCIsImdldEZpbHRlckZpZWxkIiwiZGVmYXVsdEZpbHRlclZhbHVlIiwiRmlsdGVyRGVmYXVsdFZhbHVlIiwiX2dldFBhcmFtZXRlckZpZWxkcyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwicGFyYW1ldGVyRW50aXR5VHlwZSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiaXNQYXJhbWV0ZXJpemVkIiwidGFyZ2V0RW50aXR5U2V0IiwicGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2giLCJjaGFydHMiLCJub1NlYXJjaEluQ2hhcnRzIiwiY2hhcnQiLCJhcHBseVN1cHBvcnRlZCIsImVuYWJsZVNlYXJjaCIsIm5vU2VhcmNoSW5UYWJsZXMiLCJ0YWJsZSIsImVuYWJsZUFuYWx5dGljc1NlYXJjaCIsImdldENvbnRleHRQYXRoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldE1hbmlmZXN0V3JhcHBlciIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidHlwZSIsIlNsb3QiLCJ2aXN1YWxGaWx0ZXIiLCJnZXRWaXN1YWxGaWx0ZXJzIiwidGVtcGxhdGUiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwic2V0dGluZ3MiLCJyZXF1aXJlZCIsImdldEZpbHRlclJlc3RyaWN0aW9ucyIsIm9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uIiwic1Jlc3RyaWN0aW9uIiwiYVByb3BzIiwib1Byb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIm1BbGxvd2VkRXhwcmVzc2lvbnMiLCJGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiUHJvcGVydHkiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJnZXRTZWFyY2hGaWx0ZXJQcm9wZXJ0eUluZm8iLCJkYXRhVHlwZSIsIm1heENvbmRpdGlvbnMiLCJnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8iLCJoaWRkZW5GaWx0ZXIiLCJnZXRTZWFyY2hSZXN0cmljdGlvbnMiLCJnZXRFbnRpdHlTZXQiLCJDYXBhYmlsaXRpZXMiLCJTZWFyY2hSZXN0cmljdGlvbnMiLCJnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwic05hdmlnYXRpb25QYXRoIiwib05hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiYVJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJmaW5kIiwib1Jlc3RyaWN0ZWRQcm9wZXJ0eSIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiX2ZldGNoQmFzaWNQcm9wZXJ0eUluZm8iLCJvRmlsdGVyRmllbGRJbmZvIiwiZGlzcGxheSIsImNhc2VTZW5zaXRpdmUiLCJtZW51IiwiZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbiIsImFFeHByZXNzaW9ucyIsImFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eSIsInNvcnQiLCJhIiwiYiIsImRpc3BsYXlNb2RlIiwib1Byb3BlcnR5QW5ub3RhdGlvbnMiLCJvQ29sbGVjdGlvbkFubm90YXRpb25zIiwib1RleHRBbm5vdGF0aW9uIiwiVGV4dCIsIm9UZXh0QXJyYW5nbWVudEFubm90YXRpb24iLCJUZXh0QXJyYW5nZW1lbnQiLCJfZmV0Y2hQcm9wZXJ0eUluZm8iLCJvVHlwZUNvbmZpZyIsIm9Qcm9wZXJ0eUluZm8iLCJzQW5ub3RhdGlvblBhdGgiLCJ0YXJnZXRQcm9wZXJ0eU9iamVjdCIsInRhcmdldE9iamVjdCIsIm9Gb3JtYXRPcHRpb25zIiwiZm9ybWF0T3B0aW9ucyIsIm9Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiYXNzaWduIiwiaXNNdWx0aVZhbHVlIiwiYklzTXVsdGlWYWx1ZSIsImZpbHRlckV4cHJlc3Npb24iLCJfaXNGaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnR5IiwiZW50cnkiLCJnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEiLCJsclRhYmxlcyIsImxpbmVJdGVtVGVybSIsImdldEVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsIlNlbGVjdGlvbkZpZWxkcyIsIm5hdlByb3BlcnRpZXMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldFNlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3RPcHRpb25zIiwicHJvcGVydHlJbmZvRmllbGRzIiwiZGVmYXVsdEZpbHRlckZpZWxkcyIsInByb2Nlc3NTZWxlY3Rpb25GaWVsZHMiLCJkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcyIsInNlbGVjdGlvbkZpZWxkVHlwZXMiLCJhVHlwZUNvbmZpZyIsIl9mblR5cGVDb25maWciLCJnZXRUeXBlQ29uZmlnIiwibnVsbGFibGUiLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJwYXJhbWV0ZXJGaWVsZCIsInByb3BlcnR5Q29udmVydHlDb250ZXh0IiwicHJvcGVydHlUYXJnZXRPYmplY3QiLCJvRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwib1JldCIsInNFbnRpdHlTZXRQYXRoIiwiYVBhdGhQYXJ0cyIsIm9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJpc0Nhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJhUmVxdWlyZWRQcm9wcyIsImFOb25GaWx0ZXJhYmxlUHJvcHMiLCJhRmV0Y2hlZFByb3BlcnRpZXMiLCJwcm9wZXJ0eUluZm9GaWVsZCIsIm9Db252ZXJ0ZWRQcm9wZXJ0eSIsInJlcGxhY2UiLCJEcmFmdFJvb3QiLCJzZWFyY2hSZXN0cmljdGlvbnMiLCJoaWRlQmFzaWNTZWFyY2giLCJCb29sZWFuIiwiU2VhcmNoYWJsZSIsImluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImdldFNlbGVjdGlvbkZpZWxkcyIsIm9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEiLCJwYXJhbWV0ZXJGaWVsZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJsb2NhbGVDb21wYXJlIiwic0ZldGNoUHJvcGVydGllcyIsInNQcm9wZXJ0eUluZm8iLCJwcm9wU2VsZWN0aW9uRmllbGRzIiwiZmlsdGVyRmFjZXRzIiwiRmlsdGVyRmFjZXRzIiwiYUZpZWxkR3JvdXBzIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJpIiwiZmlsdGVyRmFjZXQiLCJUYXJnZXQiLCIkdGFyZ2V0IiwiSUQiLCJ0b1N0cmluZyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCIsImdldEV4cGFuZEZpbHRlckZpZWxkcyIsImZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24iLCJ2YWx1ZUxpc3RBbm5vdGF0aW9uIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwidmFsdWVMaXN0IiwiZ2V0T2JqZWN0IiwiRmV0Y2hWYWx1ZXMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoLFxuXHREYXRhRmllbGRXaXRoVXJsLFxuXHRGaWVsZEdyb3VwLFxuXHRMaW5lSXRlbSxcblx0UmVmZXJlbmNlRmFjZXRUeXBlcyxcblx0U2VsZWN0T3B0aW9uVHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IENoYXJ0VmlzdWFsaXphdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9DaGFydFwiO1xuaW1wb3J0IHR5cGUgeyBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiwgVGFibGVWaXN1YWxpemF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiwgZ2V0VHlwZUNvbmZpZywgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uLCBGaWx0ZXJTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlUeXBlIH0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi4vQ29tbW9uL0RhdGFWaXN1YWxpemF0aW9uXCI7XG4vL2ltcG9ydCB7IGhhc1ZhbHVlSGVscCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWx0ZXJHcm91cCA9IHtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5lbnVtIGZpbHRlckZpZWxkVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmNvbnN0IHNFZG1TdHJpbmcgPSBcIkVkbS5TdHJpbmdcIjtcbmNvbnN0IHNTdHJpbmdEYXRhVHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZCA9IEN1c3RvbUVsZW1lbnQ8RmlsdGVyRmllbGQ+O1xuXG4vKipcbiAqIEVudGVyIGFsbCBEYXRhRmllbGRzIG9mIGEgZ2l2ZW4gRmllbGRHcm91cCBpbnRvIHRoZSBmaWx0ZXJGYWNldE1hcC5cbiAqXG4gKiBAcGFyYW0gZmllbGRHcm91cFxuICogQHJldHVybnMgVGhlIG1hcCBvZiBmYWNldHMgZm9yIHRoZSBnaXZlbiBGaWVsZEdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoZmllbGRHcm91cDogRmllbGRHcm91cCk6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiB7XG5cdGNvbnN0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblx0ZmllbGRHcm91cC5EYXRhLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwW2RhdGFGaWVsZC5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0Z3JvdXA6IGZpZWxkR3JvdXAuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOlxuXHRcdFx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdHByZXZpb3VzVmFsdWVbcHJvcGVydHlOYW1lXSA9IHRydWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdH0sIHt9KTtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IGFsbCB0aGUgdGFibGVzIGZvciBhIGRlZGljYXRlZCBlbnRpdHkgc2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGVzLlxuICpcbiAqIEBwYXJhbSBsaXN0UmVwb3J0VGFibGVzIExpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyBJcyBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGhpZGRlbiBvciBub3RcbiAqL1xuZnVuY3Rpb24gY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobGlzdFJlcG9ydFRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10sIGNvbnRleHRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0aWYgKGNvbnRleHRQYXRoICYmIGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KCh2aXN1YWxpemF0aW9uKSA9PiB7XG5cdFx0XHRyZXR1cm4gdmlzdWFsaXphdGlvbi5lbmFibGVBbmFseXRpY3MgJiYgY29udGV4dFBhdGggPT09IHZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5jb2xsZWN0aW9uO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudHMoXG5cdGxyVGFibGVWaXN1YWxpemF0aW9uczogVGFibGVWaXN1YWxpemF0aW9uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10ge1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdHJldHVybiBsclRhYmxlVmlzdWFsaXphdGlvbnNcblx0XHQubWFwKCh2aXN1YWxpemF0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKChwYXRoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAocGF0aCAmJiBwYXRoLmFubm90YXRpb25QYXRoICYmIHNlbGVjdGlvblZhcmlhbnRQYXRocy5pbmRleE9mKHBhdGguYW5ub3RhdGlvblBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50UGF0aHMucHVzaChwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudENvbmZpZyA9IGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKHBhdGguYW5ub3RhdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2VsZWN0aW9uVmFyaWFudENvbmZpZykge1xuXHRcdFx0XHRcdFx0XHRcdHRhYmxlU1ZDb25maWdzLnB1c2goc2VsZWN0aW9uVmFyaWFudENvbmZpZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhYmxlU1ZDb25maWdzO1xuXHRcdH0pXG5cdFx0LnJlZHVjZSgoc3ZDb25maWdzLCBzZWxlY3Rpb25WYXJpYW50KSA9PiBzdkNvbmZpZ3MuY29uY2F0KHNlbGVjdGlvblZhcmlhbnQpLCBbXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29uZGl0aW9uIHBhdGggcmVxdWlyZWQgZm9yIHRoZSBjb25kaXRpb24gbW9kZWwuIEl0IGxvb2tzIGFzIGZvbGxvd3M6XG4gKiA8MTpOLVByb3BlcnR5TmFtZT4qXFwvPDE6MS1Qcm9wZXJ0eU5hbWU+LzxQcm9wZXJ0eU5hbWU+LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSByb290IEVudGl0eVR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGNvbmRpdGlvbiBwYXRoXG4gKi9cbmNvbnN0IF9nZXRDb25kaXRpb25QYXRoID0gZnVuY3Rpb24gKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgcGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRsZXQgcGFydGlhbFBhdGg7XG5cdGxldCBrZXkgPSBcIlwiO1xuXHR3aGlsZSAocGFydHMubGVuZ3RoKSB7XG5cdFx0bGV0IHBhcnQgPSBwYXJ0cy5zaGlmdCgpIGFzIHN0cmluZztcblx0XHRwYXJ0aWFsUGF0aCA9IHBhcnRpYWxQYXRoID8gYCR7cGFydGlhbFBhdGh9LyR7cGFydH1gIDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBgJHtrZXl9LyR7cGFydH1gIDogcGFydDtcblx0fVxuXHRyZXR1cm4ga2V5O1xufTtcblxuY29uc3QgX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHQvLyBpZ25vcmUgY29tcGxleCBwcm9wZXJ0eSB0eXBlcyBhbmQgaGlkZGVuIGFubm90YXRlZCBvbmVzXG5cdGlmIChcblx0XHRwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0cHJvcGVydHkudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0KGluY2x1ZGVIaWRkZW4gfHwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0KSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUocHJvcGVydHkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGNvbmRpdGlvblBhdGg6IF9nZXRDb25kaXRpb25QYXRoKGVudGl0eVR5cGUsIGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YXZhaWxhYmlsaXR5OlxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpID09PSB0cnVlID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0XHRsYWJlbDogY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHRhcmdldEVudGl0eVR5cGUubmFtZSlcblx0XHRcdClcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxUeXBlKHNUeXBlOiBhbnkpIHtcblx0dHlwZSBkZWZhdWx0TW9kZWxUeXBlID0ge1xuXHRcdFtrZXk6IHN0cmluZ106IHtcblx0XHRcdFtrZXk6IHN0cmluZ106IHN0cmluZztcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlOiBkZWZhdWx0TW9kZWxUeXBlID0ge1xuXHRcdFwiRWRtLkJvb2xlYW5cIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkJvb2xcIlxuXHRcdH0sXG5cdFx0XCJFZG0uQnl0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVRpbWVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVUaW1lT2Zmc2V0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkRlY2ltYWxcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRlY2ltYWxcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRG91YmxlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5GbG9hdFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uR3VpZFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiR3VpZFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQxNlwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDMyXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50NjRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TQnl0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLlNpbmdsZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU3RyaW5nXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJTdHJpbmdcIlxuXHRcdH0sXG5cdFx0XCJFZG0uVGltZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiVGltZU9mRGF5XCJcblx0XHR9LFxuXHRcdFwiRWRtLlRpbWVPZkRheVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiVGltZU9mRGF5XCJcblx0XHR9LFxuXHRcdFwiRWRtLlN0cmVhbVwiOiB7XG5cdFx0XHQvL25vIGNvcnJlc3BvbmRpbmcgbW9kZWxUeXBlIC0gaWdub3JlIGZvciBmaWx0ZXJpbmdcblx0XHR9XG5cdH07XG5cdHJldHVybiBzVHlwZSAmJiBzVHlwZSBpbiBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlICYmIG1EZWZhdWx0VHlwZUZvckVkbVR5cGVbc1R5cGVdLm1vZGVsVHlwZTtcbn1cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdG5hdmlnYXRpb25QYXRoOiBzdHJpbmcsXG5cdHByb3BlcnRpZXM6IEFycmF5PFByb3BlcnR5PiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IHt9O1xuXHRpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRjb25zdCBmdWxsUGF0aDogc3RyaW5nID0gKG5hdmlnYXRpb25QYXRoID8gYCR7bmF2aWdhdGlvblBhdGh9L2AgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uIChcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eS50YXJnZXRUeXBlLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCIpIHtcblx0XHRcdFx0Ly8gaGFuZGxlIENvbXBsZXhUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIikuc3BsaWNlKDAsIDEpLmpvaW4oXCIvXCIpIDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbiAoXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHRsZXQgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF07XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpPy5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuSGlnaCwgSXNzdWVUeXBlLk1JU1NJTkdfU0VMRUNUSU9ORklFTEQpO1xuXHR9XG5cdC8vIGRlZmluZWQgU2VsZWN0aW9uRmllbGRzIGFyZSBhdmFpbGFibGUgYnkgZGVmYXVsdFxuXHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHkgPT09IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQ7XG5cdFx0ZmlsdGVyRmllbGQuaXNQYXJhbWV0ZXIgPSAhIWVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGQ7XG59O1xuXG5jb25zdCBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uIChcblx0YVNlbGVjdE9wdGlvbnM6IGFueVtdLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IFByb3BlcnR5UGF0aFtdXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gW107XG5cdGNvbnN0IFVJU2VsZWN0aW9uRmllbGRzOiBhbnkgPSB7fTtcblx0Y29uc3QgcHJvcGVydGllcyA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcztcblx0Ly8gVXNpbmcgZW50aXR5VHlwZSBpbnN0ZWFkIG9mIGVudGl0eVNldFxuXHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goKFNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgY3VycmVudFNlbGVjdGlvbkZpZWxkczogYW55ID0ge307XG5cdFx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goKFNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRcdGN1cnJlbnRTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gY3VycmVudFNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBnZXRGaWx0ZXJGaWVsZChzUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGRlZmF1bHRGaWx0ZXJWYWx1ZSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LkZpbHRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRpZiAoIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoZGVmYXVsdEZpbHRlclZhbHVlICYmICEocHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IGdldEZpbHRlckZpZWxkKHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG5cbi8qKlxuICogR2V0IGFsbCBwYXJhbWV0ZXIgZmlsdGVyIGZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgRmlsdGVyRmllbGRzXG4gKi9cbmZ1bmN0aW9uIF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHBhcmFtZXRlckVudGl0eVR5cGUgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0ICYmICFkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCA9XG5cdFx0aXNQYXJhbWV0ZXJpemVkICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihgLyR7ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lfWApO1xuXG5cdHJldHVybiAoXG5cdFx0cGFyYW1ldGVyQ29udmVydGVyQ29udGV4dFxuXHRcdFx0PyBwYXJhbWV0ZXJFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoXG5cdFx0XHRcdFx0XHR7fSBhcyBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdHBhcmFtZXRlckVudGl0eVR5cGVcblx0XHRcdFx0XHQpO1xuXHRcdFx0ICB9KVxuXHRcdFx0OiBbXVxuXHQpIGFzIEZpbHRlckZpZWxkW107XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90LlxuICpcbiAqIEBwYXJhbSBsaXN0UmVwb3J0VGFibGVzIFRoZSBsaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSBjaGFydHMgVGhlIEFMUCBjaGFydHNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGlmIHRoZSBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGlzIGhpZGRlbiBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpbHRlckJhcmhpZGVCYXNpY1NlYXJjaCA9IGZ1bmN0aW9uIChcblx0bGlzdFJlcG9ydFRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10sXG5cdGNoYXJ0czogQ2hhcnRWaXN1YWxpemF0aW9uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IGJvb2xlYW4ge1xuXHQvLyBDaGVjayBpZiBjaGFydHMgYWxsb3cgc2VhcmNoXG5cdGNvbnN0IG5vU2VhcmNoSW5DaGFydHMgPSBjaGFydHMubGVuZ3RoID09PSAwIHx8IGNoYXJ0cy5ldmVyeSgoY2hhcnQpID0+ICFjaGFydC5hcHBseVN1cHBvcnRlZC5lbmFibGVTZWFyY2gpO1xuXG5cdC8vIENoZWNrIGlmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgYW5kIG5vbmUgb2YgdGhlbSBhbGxvdyBmb3Igc2VhcmNoXG5cdGNvbnN0IG5vU2VhcmNoSW5UYWJsZXMgPVxuXHRcdGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID09PSAwIHx8IGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkoKHRhYmxlKSA9PiB0YWJsZS5lbmFibGVBbmFseXRpY3MgJiYgIXRhYmxlLmVuYWJsZUFuYWx5dGljc1NlYXJjaCk7XG5cblx0Y29uc3QgY29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBub1NlYXJjaEluQ2hhcnRzICYmIG5vU2VhcmNoSW5UYWJsZXMpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGZpbHRlciBmaWVsZHMgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5VHlwZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyIGZpZWxkcyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICovXG5leHBvcnQgY29uc3QgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBmYkNvbmZpZzogRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmluZWRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPiA9IGZiQ29uZmlnPy5maWx0ZXJGaWVsZHMgfHwge307XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRlbnRpdHlUeXBlLFxuXHRcdE9iamVjdC5rZXlzKGRlZmluZWRGaWx0ZXJGaWVsZHMpLm1hcCgoa2V5KSA9PiBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShrZXkpKSxcblx0XHR0cnVlLFxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0KTtcblx0Y29uc3QgZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+ID0ge307XG5cblx0Zm9yIChjb25zdCBzS2V5IGluIGRlZmluZWRGaWx0ZXJGaWVsZHMpIHtcblx0XHRjb25zdCBmaWx0ZXJGaWVsZCA9IGRlZmluZWRGaWx0ZXJGaWVsZHNbc0tleV07XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoc0tleSk7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uRmllbGQgPSBzZWxlY3Rpb25GaWVsZHNbcHJvcGVydHlOYW1lXTtcblx0XHRjb25zdCB0eXBlID0gZmlsdGVyRmllbGQudHlwZSA9PT0gXCJTbG90XCIgPyBmaWx0ZXJGaWVsZFR5cGUuU2xvdCA6IGZpbHRlckZpZWxkVHlwZS5EZWZhdWx0O1xuXHRcdGNvbnN0IHZpc3VhbEZpbHRlciA9XG5cdFx0XHRmaWx0ZXJGaWVsZCAmJiBmaWx0ZXJGaWVsZD8udmlzdWFsRmlsdGVyXG5cdFx0XHRcdD8gZ2V0VmlzdWFsRmlsdGVycyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0LCBzS2V5LCBkZWZpbmVkRmlsdGVyRmllbGRzKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRmaWx0ZXJGaWVsZHNbc0tleV0gPSB7XG5cdFx0XHRrZXk6IHNLZXksXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5hbm5vdGF0aW9uUGF0aCxcblx0XHRcdGNvbmRpdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5jb25kaXRpb25QYXRoIHx8IHByb3BlcnR5TmFtZSxcblx0XHRcdHRlbXBsYXRlOiBmaWx0ZXJGaWVsZC50ZW1wbGF0ZSxcblx0XHRcdGxhYmVsOiBmaWx0ZXJGaWVsZC5sYWJlbCxcblx0XHRcdHBvc2l0aW9uOiBmaWx0ZXJGaWVsZC5wb3NpdGlvbiB8fCB7IHBsYWNlbWVudDogUGxhY2VtZW50LkFmdGVyIH0sXG5cdFx0XHRhdmFpbGFiaWxpdHk6IGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSB8fCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRzZXR0aW5nczogZmlsdGVyRmllbGQuc2V0dGluZ3MsXG5cdFx0XHR2aXN1YWxGaWx0ZXI6IHZpc3VhbEZpbHRlcixcblx0XHRcdHJlcXVpcmVkOiBmaWx0ZXJGaWVsZC5yZXF1aXJlZFxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJGaWVsZCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xuXHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9LCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlclJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbjogYW55LCBzUmVzdHJpY3Rpb246IGFueSkge1xuXHRpZiAoc1Jlc3RyaWN0aW9uID09PSBcIlJlcXVpcmVkUHJvcGVydGllc1wiIHx8IHNSZXN0cmljdGlvbiA9PT0gXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB7XG5cdFx0bGV0IGFQcm9wcyA9IFtdO1xuXHRcdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb25dKSB7XG5cdFx0XHRhUHJvcHMgPSBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb25dLm1hcChmdW5jdGlvbiAob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoIHx8IG9Qcm9wZXJ0eS52YWx1ZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYVByb3BzO1xuXHR9IGVsc2UgaWYgKHNSZXN0cmljdGlvbiA9PT0gXCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNcIikge1xuXHRcdGNvbnN0IG1BbGxvd2VkRXhwcmVzc2lvbnMgPSB7fSBhcyBhbnk7XG5cdFx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMpIHtcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0XHRpZiAobUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdKSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdLnB1c2gob1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkudmFsdWVdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnNdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG1BbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uO1xufTtcblxuY29uc3QgZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4ge1xuXHRcdG5hbWU6IFwiJHNlYXJjaFwiLFxuXHRcdHBhdGg6IFwiJHNlYXJjaFwiLFxuXHRcdGRhdGFUeXBlOiBzU3RyaW5nRGF0YVR5cGUsXG5cdFx0bWF4Q29uZGl0aW9uczogMVxuXHR9O1xufTtcblxuY29uc3QgZ2V0RWRpdFN0YXRlRmlsdGVyUHJvcGVydHlJbmZvID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4ge1xuXHRcdG5hbWU6IFwiJGVkaXRTdGF0ZVwiLFxuXHRcdHBhdGg6IFwiJGVkaXRTdGF0ZVwiLFxuXHRcdGdyb3VwTGFiZWw6IFwiXCIsXG5cdFx0Z3JvdXA6IFwiXCIsXG5cdFx0ZGF0YVR5cGU6IHNTdHJpbmdEYXRhVHlwZSxcblx0XHRoaWRkZW5GaWx0ZXI6IGZhbHNlXG5cdH07XG59O1xuXG5jb25zdCBnZXRTZWFyY2hSZXN0cmljdGlvbnMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uU2VhcmNoUmVzdHJpY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc05hdmlnYXRpb25QYXRoOiBzdHJpbmcpIHtcblx0Y29uc3Qgb05hdmlnYXRpb25SZXN0cmljdGlvbnM6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG5cdGNvbnN0IGFSZXN0cmljdGVkUHJvcGVydGllcyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLlJlc3RyaWN0ZWRQcm9wZXJ0aWVzO1xuXHRyZXR1cm4gKFxuXHRcdGFSZXN0cmljdGVkUHJvcGVydGllcyAmJlxuXHRcdGFSZXN0cmljdGVkUHJvcGVydGllcy5maW5kKGZ1bmN0aW9uIChvUmVzdHJpY3RlZFByb3BlcnR5OiBhbnkpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkgJiZcblx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkgJiZcblx0XHRcdFx0KG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBzTmF2aWdhdGlvblBhdGggfHxcblx0XHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZSA9PT0gc05hdmlnYXRpb25QYXRoKVxuXHRcdFx0KTtcblx0XHR9KVxuXHQpO1xufTtcblxuY29uc3QgX2ZldGNoQmFzaWNQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbiAob0ZpbHRlckZpZWxkSW5mbzogYW55KSB7XG5cdHJldHVybiB7XG5cdFx0a2V5OiBvRmlsdGVyRmllbGRJbmZvLmtleSxcblx0XHRhbm5vdGF0aW9uUGF0aDogb0ZpbHRlckZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aCxcblx0XHRjb25kaXRpb25QYXRoOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0bmFtZTogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdGxhYmVsOiBvRmlsdGVyRmllbGRJbmZvLmxhYmVsLFxuXHRcdGhpZGRlbkZpbHRlcjogb0ZpbHRlckZpZWxkSW5mby5hdmFpbGFiaWxpdHkgPT09IFwiSGlkZGVuXCIsXG5cdFx0ZGlzcGxheTogXCJWYWx1ZVwiLFxuXHRcdGlzUGFyYW1ldGVyOiBvRmlsdGVyRmllbGRJbmZvLmlzUGFyYW1ldGVyLFxuXHRcdGNhc2VTZW5zaXRpdmU6IG9GaWx0ZXJGaWVsZEluZm8uY2FzZVNlbnNpdGl2ZSxcblx0XHRhdmFpbGFiaWxpdHk6IG9GaWx0ZXJGaWVsZEluZm8uYXZhaWxhYmlsaXR5LFxuXHRcdHBvc2l0aW9uOiBvRmlsdGVyRmllbGRJbmZvLnBvc2l0aW9uLFxuXHRcdHR5cGU6IG9GaWx0ZXJGaWVsZEluZm8udHlwZSxcblx0XHR0ZW1wbGF0ZTogb0ZpbHRlckZpZWxkSW5mby50ZW1wbGF0ZSxcblx0XHRtZW51OiBvRmlsdGVyRmllbGRJbmZvLm1lbnUsXG5cdFx0cmVxdWlyZWQ6IG9GaWx0ZXJGaWVsZEluZm8ucmVxdWlyZWRcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKGFFeHByZXNzaW9uczogYW55KSB7XG5cdGNvbnN0IGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eSA9IFtcblx0XHRcIlNpbmdsZVZhbHVlXCIsXG5cdFx0XCJNdWx0aVZhbHVlXCIsXG5cdFx0XCJTaW5nbGVSYW5nZVwiLFxuXHRcdFwiTXVsdGlSYW5nZVwiLFxuXHRcdFwiU2VhcmNoRXhwcmVzc2lvblwiLFxuXHRcdFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiXG5cdF07XG5cblx0YUV4cHJlc3Npb25zLnNvcnQoZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KSB7XG5cdFx0cmV0dXJuIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGEpIC0gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYik7XG5cdH0pO1xuXG5cdHJldHVybiBhRXhwcmVzc2lvbnNbMF07XG59O1xuXG5leHBvcnQgY29uc3QgZGlzcGxheU1vZGUgPSBmdW5jdGlvbiAob1Byb3BlcnR5QW5ub3RhdGlvbnM6IGFueSwgb0NvbGxlY3Rpb25Bbm5vdGF0aW9uczogYW55KSB7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zPy5Db21tb24/LlRleHQsXG5cdFx0b1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbiA9XG5cdFx0XHRvVGV4dEFubm90YXRpb24gJiZcblx0XHRcdCgob1Byb3BlcnR5QW5ub3RhdGlvbnMgJiYgb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHx8XG5cdFx0XHRcdChvQ29sbGVjdGlvbkFubm90YXRpb25zICYmIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpKTtcblxuXHRpZiAob1RleHRBcnJhbmdtZW50QW5ub3RhdGlvbikge1xuXHRcdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHJldHVybiBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uLnZhbHVlT2YoKSA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHJldHVybiBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9XG5cdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25WYWx1ZVwiOyAvL1RleHRGaXJzdFxuXHR9XG5cdHJldHVybiBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcbn07XG5cbmNvbnN0IF9mZXRjaFByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBvRmlsdGVyRmllbGRJbmZvOiBhbnksIG9UeXBlQ29uZmlnOiBhbnkpIHtcblx0bGV0IG9Qcm9wZXJ0eUluZm8gPSBfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyhvRmlsdGVyRmllbGRJbmZvKTtcblx0Y29uc3Qgc0Fubm90YXRpb25QYXRoID0gb0ZpbHRlckZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aDtcblxuXHRpZiAoIXNBbm5vdGF0aW9uUGF0aCkge1xuXHRcdHJldHVybiBvUHJvcGVydHlJbmZvO1xuXHR9XG5cdGNvbnN0IHRhcmdldFByb3BlcnR5T2JqZWN0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKHNBbm5vdGF0aW9uUGF0aCkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdDtcblxuXHRjb25zdCBvUHJvcGVydHlBbm5vdGF0aW9ucyA9IHRhcmdldFByb3BlcnR5T2JqZWN0Py5hbm5vdGF0aW9ucztcblx0Y29uc3Qgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQ/LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zO1xuXG5cdGNvbnN0IG9Gb3JtYXRPcHRpb25zID0gb1R5cGVDb25maWcuZm9ybWF0T3B0aW9ucztcblx0Y29uc3Qgb0NvbnN0cmFpbnRzID0gb1R5cGVDb25maWcuY29uc3RyYWludHM7XG5cdG9Qcm9wZXJ0eUluZm8gPSBPYmplY3QuYXNzaWduKG9Qcm9wZXJ0eUluZm8sIHtcblx0XHRmb3JtYXRPcHRpb25zOiBvRm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogb0NvbnN0cmFpbnRzLFxuXHRcdGRpc3BsYXk6IGRpc3BsYXlNb2RlKG9Qcm9wZXJ0eUFubm90YXRpb25zLCBvQ29sbGVjdGlvbkFubm90YXRpb25zKVxuXHR9KTtcblx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG59O1xuXG5leHBvcnQgY29uc3QgaXNNdWx0aVZhbHVlID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eTogYW55KSB7XG5cdGxldCBiSXNNdWx0aVZhbHVlID0gdHJ1ZTtcblx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRzd2l0Y2ggKG9Qcm9wZXJ0eS5maWx0ZXJFeHByZXNzaW9uKSB7XG5cdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRjYXNlIFwiU2luZ2xlVmFsdWVcIjpcblx0XHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXHRpZiAob1Byb3BlcnR5LnR5cGUgJiYgb1Byb3BlcnR5LnR5cGUuaW5kZXhPZihcIkJvb2xlYW5cIikgPiAwKSB7XG5cdFx0YklzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiBiSXNNdWx0aVZhbHVlO1xufTtcblxuY29uc3QgX2lzRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50cnk6IERhdGFGaWVsZEFic3RyYWN0VHlwZXNcbik6IGVudHJ5IGlzIEFubm90YXRpb25UZXJtPERhdGFGaWVsZCB8IERhdGFGaWVsZFdpdGhVcmwgfCBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg+IHtcblx0cmV0dXJuIChcblx0XHQoZW50cnkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fFxuXHRcdFx0ZW50cnkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwgfHxcblx0XHRcdGVudHJ5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgpICYmXG5cdFx0ZW50cnkuVmFsdWUucGF0aC5pbmNsdWRlcyhcIi9cIilcblx0KTtcbn07XG5cbmNvbnN0IGdldEFubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UsXG5cdGxpbmVJdGVtVGVybT86IHN0cmluZ1xuKSB7XG5cdC8vIEZldGNoIGFsbCBzZWxlY3Rpb25WYXJpYW50cyBkZWZpbmVkIGluIHRoZSBkaWZmZXJlbnQgdmlzdWFsaXphdGlvbnMgYW5kIGRpZmZlcmVudCB2aWV3cyAobXVsdGkgdGFibGUgbW9kZSlcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBnZXRTZWxlY3Rpb25WYXJpYW50cyhsclRhYmxlcywgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50cyk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Ly9GaWx0ZXJzIHdoaWNoIGhhcyB0byBiZSBhZGRlZCB3aGljaCBpcyBwYXJ0IG9mIFNWL0RlZmF1bHQgYW5ub3RhdGlvbnMgYnV0IG5vdCBwcmVzZW50IGluIHRoZSBTZWxlY3Rpb25GaWVsZHNcblx0Y29uc3QgYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzID0gKChhbm5vdGF0aW9uUGF0aCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKGFubm90YXRpb25QYXRoKT8uYW5ub3RhdGlvbikgfHxcblx0XHRlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uU2VsZWN0aW9uRmllbGRzIHx8XG5cdFx0W10pIGFzIFByb3BlcnR5UGF0aFtdO1xuXG5cdGNvbnN0IG5hdlByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmIChsclRhYmxlcy5sZW5ndGggPT09IDAgJiYgISFsaW5lSXRlbVRlcm0pIHtcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihsaW5lSXRlbVRlcm0pLmFubm90YXRpb24gYXMgTGluZUl0ZW0pPy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuXHRcdFx0aWYgKF9pc0ZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydHkoZW50cnkpKSB7XG5cdFx0XHRcdGlmICghbmF2UHJvcGVydGllcy5pbmNsdWRlcyhlbnRyeS5WYWx1ZS5wYXRoLnNwbGl0KFwiL1wiKVswXSkpIHtcblx0XHRcdFx0XHRuYXZQcm9wZXJ0aWVzLnB1c2goZW50cnkuVmFsdWUucGF0aC5zcGxpdChcIi9cIilbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdC8vIC4uLiBub24gaGlkZGVuIHByb3BlcnRpZXMgb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChlbnRpdHlUeXBlLCBuYXZQcm9wZXJ0aWVzLCBmYWxzZSwgY29udmVydGVyQ29udGV4dCksXG5cdFx0Ly8gLi4uYWRkaXRpb25hbCBtYW5pZmVzdCBkZWZpbmVkIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdC4uLl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCkubmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdClcblx0fTtcblx0bGV0IGFTZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtdO1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50ID0gZ2V0U2VsZWN0aW9uVmFyaWFudChlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRhU2VsZWN0T3B0aW9ucyA9IHNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucztcblx0fVxuXG5cdGNvbnN0IHByb3BlcnR5SW5mb0ZpZWxkczogYW55ID1cblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LnJlZHVjZSgoc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdLCBzZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gc2VsZWN0aW9uRmllbGQudmFsdWU7XG5cdFx0XHRpZiAoIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cCA9IFwiXCI7XG5cdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXBMYWJlbCA9IFwiXCI7XG5cdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goZmlsdGVyRmllbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzO1xuXHRcdH0sIFtdKSB8fCBbXTtcblxuXHRjb25zdCBkZWZhdWx0RmlsdGVyRmllbGRzID0gX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMoXG5cdFx0YVNlbGVjdE9wdGlvbnMsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHNcblx0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGVudGl0eVR5cGU6IGVudGl0eVR5cGUsXG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzOiBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMsXG5cdFx0ZmlsdGVyRmllbGRzOiBmaWx0ZXJGaWVsZHMsXG5cdFx0cHJvcGVydHlJbmZvRmllbGRzOiBwcm9wZXJ0eUluZm9GaWVsZHMsXG5cdFx0ZGVmYXVsdEZpbHRlckZpZWxkczogZGVmYXVsdEZpbHRlckZpZWxkc1xuXHR9O1xufTtcbmV4cG9ydCBjb25zdCBwcm9jZXNzU2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZGVmYXVsdFZhbHVlUHJvcGVydHlGaWVsZHM/OiBhbnlcbikge1xuXHQvL2dldCBUeXBlQ29uZmlnIGZ1bmN0aW9uXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkVHlwZXM6IGFueSA9IFtdO1xuXHRjb25zdCBhVHlwZUNvbmZpZzogYW55ID0ge307XG5cdGNvbnN0IF9mblR5cGVDb25maWcgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5LCBrZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IG9UeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgcHJvcGVydHk/LnR5cGUpO1xuXHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChwcm9wZXJ0eT8udHlwZSk7XG5cdFx0aWYgKFxuXHRcdFx0cHJvcGVydHk/LnR5cGUgPT09IHNFZG1TdHJpbmcgJiZcblx0XHRcdChvVHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gdW5kZWZpbmVkIHx8IG9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzLm51bGxhYmxlID09PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0b1R5cGVDb25maWcuZm9ybWF0T3B0aW9ucy5wYXJzZUtlZXBzRW1wdHlTdHJpbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0YVR5cGVDb25maWdba2V5XSA9IG9UeXBlQ29uZmlnO1xuXHR9O1xuXG5cdGlmIChkZWZhdWx0VmFsdWVQcm9wZXJ0eUZpZWxkcykge1xuXHRcdHByb3BlcnR5SW5mb0ZpZWxkcyA9IHByb3BlcnR5SW5mb0ZpZWxkcy5jb25jYXQoZGVmYXVsdFZhbHVlUHJvcGVydHlGaWVsZHMpO1xuXHR9XG5cdC8vYWRkIHR5cGVDb25maWdcblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtZXRlckZpZWxkOiBhbnkpIHtcblx0XHRpZiAocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5Q29udmVydHlDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKHBhcmFtZXRlckZpZWxkLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VGFyZ2V0T2JqZWN0ID0gcHJvcGVydHlDb252ZXJ0eUNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdDtcblx0XHRcdF9mblR5cGVDb25maWcocHJvcGVydHlUYXJnZXRPYmplY3QsIHBhcmFtZXRlckZpZWxkLmtleSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChzRWRtU3RyaW5nKTtcblx0XHRcdGFUeXBlQ29uZmlnW3BhcmFtZXRlckZpZWxkLmtleV0gPSB7IHR5cGU6IHNTdHJpbmdEYXRhVHlwZSB9O1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gZmlsdGVyUmVzdHJpY3Rpb25zXG5cdGNvbnN0IG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM7XG5cdGNvbnN0IG9SZXQgPSB7fSBhcyBhbnk7XG5cdG9SZXRbXCJSZXF1aXJlZFByb3BlcnRpZXNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRvUmV0W1wiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHx8IHt9O1xuXG5cdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBhUGF0aFBhcnRzID0gc0VudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpO1xuXHRpZiAoYVBhdGhQYXJ0cy5sZW5ndGggPiAyKSB7XG5cdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYVBhdGhQYXJ0c1thUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdGFQYXRoUGFydHMuc3BsaWNlKC0xLCAxKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCwgc05hdmlnYXRpb25QYXRoKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLkZpbHRlclJlc3RyaWN0aW9ucztcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcy5jb25jYXQoZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXSk7XG5cdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5jb25jYXQoZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IHtcblx0XHRcdC4uLihnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHx8IHt9KSxcblx0XHRcdC4uLm9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXG5cdFx0fTtcblx0fVxuXHRjb25zdCBpc0Nhc2VTZW5zaXRpdmUgPSBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGFSZXF1aXJlZFByb3BzID0gb1JldC5SZXF1aXJlZFByb3BlcnRpZXM7XG5cdGNvbnN0IGFOb25GaWx0ZXJhYmxlUHJvcHMgPSBvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzO1xuXHRsZXQgb1Byb3BlcnR5SW5mbztcblx0Y29uc3QgYUZldGNoZWRQcm9wZXJ0aWVzOiBhbnkgPSBbXTtcblxuXHQvLyBwcm9jZXNzIHRoZSBmaWVsZHMgdG8gYWRkIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG5cdHByb3BlcnR5SW5mb0ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eUluZm9GaWVsZDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnZlcnRlZFByb3BlcnR5ID0gcHJvcGVydHlJbmZvRmllbGQ7XG5cdFx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdFx0aWYgKG9Db252ZXJ0ZWRQcm9wZXJ0eS5jb25kaXRpb25QYXRoKSB7XG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0NvbnZlcnRlZFByb3BlcnR5LmNvbmRpdGlvblBhdGgucmVwbGFjZSgvXFwrfFxcKi9nLCBcIlwiKTtcblx0XHR9XG5cdFx0aWYgKGFOb25GaWx0ZXJhYmxlUHJvcHMuaW5kZXhPZihzUHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBfZmV0Y2hQcm9wZXJ0eUluZm8oY29udmVydGVyQ29udGV4dCwgb0NvbnZlcnRlZFByb3BlcnR5LCBhVHlwZUNvbmZpZ1twcm9wZXJ0eUluZm9GaWVsZC5rZXldKTtcblx0XHRcdGlmIChvUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBPYmplY3QuYXNzaWduKG9Qcm9wZXJ0eUluZm8sIHtcblx0XHRcdFx0XHRtYXhDb25kaXRpb25zOiAhb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciAmJiBpc011bHRpVmFsdWUob1Byb3BlcnR5SW5mbykgPyAtMSA6IDEsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IG9Db252ZXJ0ZWRQcm9wZXJ0eS5yZXF1aXJlZCA/PyAob1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciB8fCBhUmVxdWlyZWRQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID49IDApLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzQ2FzZVNlbnNpdGl2ZSxcblx0XHRcdFx0XHRkYXRhVHlwZTogYVR5cGVDb25maWdbcHJvcGVydHlJbmZvRmllbGQua2V5XS50eXBlXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly9hZGQgZWRpdFxuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdH1cblx0Ly8gYWRkIHNlYXJjaFxuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGlmIChzRW50aXR5U2V0UGF0aCAmJiBoaWRlQmFzaWNTZWFyY2ggIT09IHRydWUpIHtcblx0XHRpZiAoIXNlYXJjaFJlc3RyaWN0aW9ucyB8fCBzZWFyY2hSZXN0cmljdGlvbnM/LlNlYXJjaGFibGUpIHtcblx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKGdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbygpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYUZldGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEN1c3RvbU1hbmlmZXN0RWxlbWVudHMgPSBmdW5jdGlvbiAoXG5cdGZpbHRlckZpZWxkczogRmlsdGVyRmllbGRbXSxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKSB7XG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhmaWx0ZXJGaWVsZHMsIGdldE1hbmlmZXN0RmlsdGVyRmllbGRzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLCB7XG5cdFx0XCJhdmFpbGFiaWxpdHlcIjogXCJvdmVyd3JpdGVcIixcblx0XHRsYWJlbDogXCJvdmVyd3JpdGVcIixcblx0XHR0eXBlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIixcblx0XHRyZXF1aXJlZDogXCJvdmVyd3JpdGVcIlxuXHR9KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZWxlY3Rpb24gZmllbGRzIHRoYXQgd2lsbCBiZSB1c2VkIHdpdGhpbiB0aGUgZmlsdGVyIGJhclxuICogVGhpcyBjb25maWd1cmF0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGxyVGFibGVzXG4gKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcbiAqIEBwYXJhbSBbaW5jbHVkZUhpZGRlbl1cbiAqIEBwYXJhbSBbbGluZUl0ZW1UZXJtXVxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRsclRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10gPSBbXSxcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZyA9IFwiXCIsXG5cdGluY2x1ZGVIaWRkZW4/OiBib29sZWFuLFxuXHRsaW5lSXRlbVRlcm0/OiBzdHJpbmdcbik6IGFueSB7XG5cdGNvbnN0IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRsclRhYmxlcyxcblx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdGxpbmVJdGVtVGVybVxuXHQpO1xuXHRjb25zdCBwYXJhbWV0ZXJGaWVsZHMgPSBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRsZXQgcHJvcGVydHlJbmZvRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5lbnRpdHlUeXBlO1xuXG5cdHByb3BlcnR5SW5mb0ZpZWxkcyA9IHBhcmFtZXRlckZpZWxkcy5jb25jYXQocHJvcGVydHlJbmZvRmllbGRzKTtcblxuXHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBpbnNlcnRDdXN0b21NYW5pZmVzdEVsZW1lbnRzKHByb3BlcnR5SW5mb0ZpZWxkcywgZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Y29uc3QgYUZldGNoZWRQcm9wZXJ0aWVzID0gcHJvY2Vzc1NlbGVjdGlvbkZpZWxkcyhcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmRlZmF1bHRGaWx0ZXJGaWVsZHNcblx0KTtcblx0YUZldGNoZWRQcm9wZXJ0aWVzLnNvcnQoZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KSB7XG5cdFx0aWYgKGEuZ3JvdXBMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGEuZ3JvdXBMYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRpZiAoYi5ncm91cExhYmVsID09PSB1bmRlZmluZWQgfHwgYi5ncm91cExhYmVsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0cmV0dXJuIGEuZ3JvdXBMYWJlbC5sb2NhbGVDb21wYXJlKGIuZ3JvdXBMYWJlbCk7XG5cdH0pO1xuXG5cdGxldCBzRmV0Y2hQcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkoYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0c0ZldGNoUHJvcGVydGllcyA9IHNGZXRjaFByb3BlcnRpZXMucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIik7XG5cdHNGZXRjaFByb3BlcnRpZXMgPSBzRmV0Y2hQcm9wZXJ0aWVzLnJlcGxhY2UoL1xcfS9nLCBcIlxcXFx9XCIpO1xuXHRjb25zdCBzUHJvcGVydHlJbmZvID0gc0ZldGNoUHJvcGVydGllcztcblx0Ly8gZW5kIG9mIHByb3BlcnR5RmllbGRzIHByb2Nlc3NpbmdcblxuXHQvLyB0byBwb3B1bGF0ZSBzZWxlY3Rpb24gZmllbGRzXG5cdGxldCBwcm9wU2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLnByb3BlcnR5SW5mb0ZpZWxkcykpO1xuXHRwcm9wU2VsZWN0aW9uRmllbGRzID0gcGFyYW1ldGVyRmllbGRzLmNvbmNhdChwcm9wU2VsZWN0aW9uRmllbGRzKTtcblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0bGV0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblxuXHRjb25zdCBhRmllbGRHcm91cHMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCk7XG5cblx0aWYgKGZpbHRlckZhY2V0cyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckZhY2V0cy5sZW5ndGggPCAwKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFGaWVsZEdyb3Vwcykge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXAgPSB7XG5cdFx0XHRcdC4uLmZpbHRlckZhY2V0TWFwLFxuXHRcdFx0XHQuLi5nZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGFGaWVsZEdyb3Vwc1tpXSlcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZhY2V0TWFwID0gZmlsdGVyRmFjZXRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+LCBmaWx0ZXJGYWNldDogUmVmZXJlbmNlRmFjZXRUeXBlcykgPT4ge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAoZmlsdGVyRmFjZXQ/LlRhcmdldD8uJHRhcmdldCBhcyBGaWVsZEdyb3VwKT8uRGF0YT8ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cHJldmlvdXNWYWx1ZVsoKGZpbHRlckZhY2V0Py5UYXJnZXQ/LiR0YXJnZXQgYXMgRmllbGRHcm91cCk/LkRhdGFbaV0gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aF0gPSB7XG5cdFx0XHRcdFx0Z3JvdXA6IGZpbHRlckZhY2V0Py5JRD8udG9TdHJpbmcoKSxcblx0XHRcdFx0XHRncm91cExhYmVsOiBmaWx0ZXJGYWNldD8uTGFiZWw/LnRvU3RyaW5nKClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHRcdH0sIHt9KTtcblx0fVxuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBhbGwgcG90ZW50aWFsIGZpbHRlciBmaWVsZHMgYmFzZWQgb24uLi5cblx0Y29uc3QgZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmZpbHRlckZpZWxkcztcblxuXHQvLyBmaW5hbGx5IGNyZWF0ZSBmaW5hbCBsaXN0IG9mIGZpbHRlciBmaWVsZHMgYnkgYWRkaW5nIHRoZSBTZWxlY3Rpb25GaWVsZHMgZmlyc3QgKG9yZGVyIG1hdHRlcnMpLi4uXG5cdGxldCBhbGxGaWx0ZXJzID0gcHJvcFNlbGVjdGlvbkZpZWxkc1xuXG5cdFx0Ly8gLi4uYW5kIGFkZGluZyByZW1haW5pbmcgZmlsdGVyIGZpZWxkcywgdGhhdCBhcmUgbm90IHVzZWQgaW4gYSBTZWxlY3Rpb25WYXJpYW50IChvcmRlciBkb2Vzbid0IG1hdHRlcilcblx0XHQuY29uY2F0KFxuXHRcdFx0T2JqZWN0LmtleXMoZmlsdGVyRmllbGRzKVxuXHRcdFx0XHQuZmlsdGVyKChwcm9wZXJ0eVBhdGgpID0+ICEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpXG5cdFx0XHRcdC5tYXAoKHByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdLCBmaWx0ZXJGYWNldE1hcFtwcm9wZXJ0eVBhdGhdKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRjb25zdCBzQ29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cblx0Ly9pZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIHRhYmxlcyBcImFnZ3JlZ2F0YWJsZVwiIHByb3BlcnRpZXMgbXVzdCBiZSBleGNsdWRlZFxuXHRpZiAoY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobHJUYWJsZXMsIHNDb250ZXh0UGF0aCkpIHtcblx0XHQvLyBDdXJyZW50bHkgYWxsIGFncmVnYXRlcyBhcmUgcm9vdCBlbnRpdHkgcHJvcGVydGllcyAobm8gcHJvcGVydGllcyBjb21pbmcgZnJvbSBuYXZpZ2F0aW9uKSBhbmQgYWxsXG5cdFx0Ly8gdGFibGVzIHdpdGggc2FtZSBlbnRpdHlTZXQgZ2V0cyBzYW1lIGFnZ3JlYWd0ZSBjb25maWd1cmF0aW9uIHRoYXQncyB3aHkgd2UgY2FuIHVzZSBmaXJzdCB0YWJsZSBpbnRvXG5cdFx0Ly8gTFIgdG8gZ2V0IGFnZ3JlZ2F0ZXMgKHdpdGhvdXQgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzIHNpbmNlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGVtKS5cblx0XHRjb25zdCBhZ2dyZWdhdGVzID0gbHJUYWJsZXNbMF0uYWdncmVnYXRlcztcblx0XHRpZiAoYWdncmVnYXRlcykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhZ2dyZWdhdGVzKS5tYXAoKGFnZ3JlZ2F0ZUtleSkgPT4gYWdncmVnYXRlc1thZ2dyZWdhdGVLZXldLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRhbGxGaWx0ZXJzID0gYWxsRmlsdGVycy5maWx0ZXIoKGZpbHRlckZpZWxkKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzLmluZGV4T2YoZmlsdGVyRmllbGQua2V5KSA9PT0gLTE7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHMgPSBpbnNlcnRDdXN0b21NYW5pZmVzdEVsZW1lbnRzKGFsbEZpbHRlcnMsIGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIEFkZCBjYXNlU2Vuc2l0aXZlIHByb3BlcnR5IHRvIGFsbCBzZWxlY3Rpb24gZmllbGRzLlxuXHRjb25zdCBpc0Nhc2VTZW5zaXRpdmUgPSBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCk7XG5cdHNlbGVjdGlvbkZpZWxkcy5mb3JFYWNoKChmaWx0ZXJGaWVsZCkgPT4ge1xuXHRcdGZpbHRlckZpZWxkLmNhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7XG5cdH0pO1xuXG5cdHJldHVybiB7IHNlbGVjdGlvbkZpZWxkcywgc1Byb3BlcnR5SW5mbyB9O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpbHRlciBiYXIgaW5zaWRlIGEgdmFsdWUgaGVscCBkaWFsb2cgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGlzIGlzIHRydWUgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkOlxuICogKDEpIGEgZmlsdGVyIHByb3BlcnR5IGlzIG1hbmRhdG9yeSxcbiAqICgyKSBubyBzZWFyY2ggZmllbGQgZXhpc3RzIChlbnRpdHkgaXNuJ3Qgc2VhcmNoIGVuYWJsZWQpLFxuICogKDMpIHdoZW4gdGhlIGRhdGEgaXNuJ3QgbG9hZGVkIGJ5IGRlZmF1bHQgKGFubm90YXRpb24gRmV0Y2hWYWx1ZXMgPSAyKS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBmaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uIFRoZSBGaWx0ZXJSZXN0cmljdGlvbiBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmFsdWVMaXN0QW5ub3RhdGlvbiBUaGUgVmFsdWVMaXN0IGFubm90YXRpb25cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmb3IgZXhwYW5kRmlsdGVyRmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHBhbmRGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb246IGFueSxcblx0dmFsdWVMaXN0QW5ub3RhdGlvbjogYW55XG4pOiBib29sZWFuIHtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKGZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24sIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpO1xuXHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZGVCYXNpY1NlYXJjaCA9IEJvb2xlYW4oc2VhcmNoUmVzdHJpY3Rpb25zICYmICFzZWFyY2hSZXN0cmljdGlvbnMuU2VhcmNoYWJsZSk7XG5cdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlTGlzdEFubm90YXRpb24uZ2V0T2JqZWN0KCk7XG5cdGlmIChyZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCB8fCBoaWRlQmFzaWNTZWFyY2ggfHwgdmFsdWVMaXN0Py5GZXRjaFZhbHVlcyA9PT0gMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFB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