@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,142 +2,321 @@
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/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingToolkit", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, uid, AttributeModel, BindingToolkit, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
6
+ "use strict";
7
+
8
+ function _forOf(target, body, check) {
9
+ if (typeof target[_iteratorSymbol] === "function") {
10
+ var iterator = target[_iteratorSymbol](),
11
+ step,
12
+ pact,
13
+ reject;
14
+
15
+ function _cycle(result) {
16
+ try {
17
+ while (!(step = iterator.next()).done && (!check || !check())) {
18
+ result = body(step.value);
19
+
20
+ if (result && result.then) {
21
+ if (_isSettledPact(result)) {
22
+ result = result.v;
23
+ } else {
24
+ result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
25
+ return;
26
+ }
27
+ }
28
+ }
5
29
 
6
- function _settle(pact, state, value) {
7
- if (!pact.s) {
8
- if (value instanceof _Pact) {
9
- if (value.s) {
10
- if (state & 1) {
11
- state = value.s;
30
+ if (pact) {
31
+ _settle(pact, 1, result);
32
+ } else {
33
+ pact = result;
34
+ }
35
+ } catch (e) {
36
+ _settle(pact || (pact = new _Pact()), 2, e);
12
37
  }
38
+ }
13
39
 
14
- value = value.v;
15
- } else {
16
- value.o = _settle.bind(null, pact, state);
17
- return;
40
+ _cycle();
41
+
42
+ if (iterator.return) {
43
+ var _fixup = function (value) {
44
+ try {
45
+ if (!step.done) {
46
+ iterator.return();
47
+ }
48
+ } catch (e) {}
49
+
50
+ return value;
51
+ };
52
+
53
+ if (pact && pact.then) {
54
+ return pact.then(_fixup, function (e) {
55
+ throw _fixup(e);
56
+ });
57
+ }
58
+
59
+ _fixup();
18
60
  }
19
- }
20
61
 
21
- if (value && value.then) {
22
- value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
23
- return;
62
+ return pact;
63
+ } // No support for Symbol.iterator
64
+
65
+
66
+ if (!("length" in target)) {
67
+ throw new TypeError("Object is not iterable");
68
+ } // Handle live collections properly
69
+
70
+
71
+ var values = [];
72
+
73
+ for (var i = 0; i < target.length; i++) {
74
+ values.push(target[i]);
24
75
  }
25
76
 
26
- pact.s = state;
27
- pact.v = value;
28
- var observer = pact.o;
77
+ return _forTo(values, function (i) {
78
+ return body(values[i]);
79
+ }, check);
80
+ }
81
+
82
+ function _forTo(array, body, check) {
83
+ var i = -1,
84
+ pact,
85
+ reject;
29
86
 
30
- if (observer) {
31
- observer(pact);
87
+ function _cycle(result) {
88
+ try {
89
+ while (++i < array.length && (!check || !check())) {
90
+ result = body(i);
91
+
92
+ if (result && result.then) {
93
+ if (_isSettledPact(result)) {
94
+ result = result.v;
95
+ } else {
96
+ result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
97
+ return;
98
+ }
99
+ }
100
+ }
101
+
102
+ if (pact) {
103
+ _settle(pact, 1, result);
104
+ } else {
105
+ pact = result;
106
+ }
107
+ } catch (e) {
108
+ _settle(pact || (pact = new _Pact()), 2, e);
109
+ }
32
110
  }
111
+
112
+ _cycle();
113
+
114
+ return pact;
33
115
  }
34
- }
35
116
 
36
- var _Pact = /*#__PURE__*/function () {
37
- function _Pact() {}
117
+ var _iteratorSymbol = /*#__PURE__*/typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
38
118
 
39
- _Pact.prototype.then = function (onFulfilled, onRejected) {
40
- var result = new _Pact();
41
- var state = this.s;
119
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
42
120
 
43
- if (state) {
44
- var callback = state & 1 ? onFulfilled : onRejected;
121
+ var _exports = {};
122
+ var compileExpression = BindingToolkit.compileExpression;
45
123
 
46
- if (callback) {
47
- try {
48
- _settle(result, 1, callback(this.v));
49
- } catch (e) {
50
- _settle(result, 2, e);
124
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
125
+
126
+ 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; }
127
+
128
+ 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; }
129
+
130
+ 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; }
131
+
132
+ function _settle(pact, state, value) {
133
+ if (!pact.s) {
134
+ if (value instanceof _Pact) {
135
+ if (value.s) {
136
+ if (state & 1) {
137
+ state = value.s;
138
+ }
139
+
140
+ value = value.v;
141
+ } else {
142
+ value.o = _settle.bind(null, pact, state);
143
+ return;
51
144
  }
145
+ }
52
146
 
53
- return result;
54
- } else {
55
- return this;
147
+ if (value && value.then) {
148
+ value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
149
+ return;
150
+ }
151
+
152
+ pact.s = state;
153
+ pact.v = value;
154
+ var observer = pact.o;
155
+
156
+ if (observer) {
157
+ observer(pact);
56
158
  }
57
159
  }
160
+ }
58
161
 
59
- this.o = function (_this) {
60
- try {
61
- var value = _this.v;
162
+ var _Pact = /*#__PURE__*/function () {
163
+ function _Pact() {}
164
+
165
+ _Pact.prototype.then = function (onFulfilled, onRejected) {
166
+ var result = new _Pact();
167
+ var state = this.s;
168
+
169
+ if (state) {
170
+ var callback = state & 1 ? onFulfilled : onRejected;
171
+
172
+ if (callback) {
173
+ try {
174
+ _settle(result, 1, callback(this.v));
175
+ } catch (e) {
176
+ _settle(result, 2, e);
177
+ }
62
178
 
63
- if (_this.s & 1) {
64
- _settle(result, 1, onFulfilled ? onFulfilled(value) : value);
65
- } else if (onRejected) {
66
- _settle(result, 1, onRejected(value));
179
+ return result;
67
180
  } else {
68
- _settle(result, 2, value);
181
+ return this;
69
182
  }
70
- } catch (e) {
71
- _settle(result, 2, e);
72
183
  }
184
+
185
+ this.o = function (_this) {
186
+ try {
187
+ var value = _this.v;
188
+
189
+ if (_this.s & 1) {
190
+ _settle(result, 1, onFulfilled ? onFulfilled(value) : value);
191
+ } else if (onRejected) {
192
+ _settle(result, 1, onRejected(value));
193
+ } else {
194
+ _settle(result, 2, value);
195
+ }
196
+ } catch (e) {
197
+ _settle(result, 2, e);
198
+ }
199
+ };
200
+
201
+ return result;
73
202
  };
74
203
 
75
- return result;
76
- };
204
+ return _Pact;
205
+ }();
77
206
 
78
- return _Pact;
79
- }();
207
+ function _isSettledPact(thenable) {
208
+ return thenable instanceof _Pact && thenable.s & 1;
209
+ }
80
210
 
81
- function _isSettledPact(thenable) {
82
- return thenable instanceof _Pact && thenable.s & 1;
83
- }
211
+ function _for(test, update, body) {
212
+ var stage;
84
213
 
85
- function _forTo(array, body, check) {
86
- var i = -1,
87
- pact,
88
- reject;
214
+ for (;;) {
215
+ var shouldContinue = test();
89
216
 
90
- function _cycle(result) {
91
- try {
92
- while (++i < array.length && (!check || !check())) {
93
- result = body(i);
217
+ if (_isSettledPact(shouldContinue)) {
218
+ shouldContinue = shouldContinue.v;
219
+ }
94
220
 
95
- if (result && result.then) {
96
- if (_isSettledPact(result)) {
97
- result = result.v;
98
- } else {
99
- result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
100
- return;
101
- }
221
+ if (!shouldContinue) {
222
+ return result;
223
+ }
224
+
225
+ if (shouldContinue.then) {
226
+ stage = 0;
227
+ break;
228
+ }
229
+
230
+ var result = body();
231
+
232
+ if (result && result.then) {
233
+ if (_isSettledPact(result)) {
234
+ result = result.s;
235
+ } else {
236
+ stage = 1;
237
+ break;
102
238
  }
103
239
  }
104
240
 
105
- if (pact) {
106
- _settle(pact, 1, result);
107
- } else {
108
- pact = result;
241
+ if (update) {
242
+ var updateValue = update();
243
+
244
+ if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
245
+ stage = 2;
246
+ break;
247
+ }
109
248
  }
110
- } catch (e) {
111
- _settle(pact || (pact = new _Pact()), 2, e);
112
249
  }
113
- }
114
250
 
115
- _cycle();
251
+ var pact = new _Pact();
116
252
 
117
- return pact;
118
- }
253
+ var reject = _settle.bind(null, pact, 2);
119
254
 
120
- sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingExpression", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, uid, AttributeModel, BindingExpression, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
121
- "use strict";
255
+ (stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
256
+ return pact;
122
257
 
123
- var _templateObject, _templateObject2, _templateObject3;
258
+ function _resumeAfterBody(value) {
259
+ result = value;
124
260
 
125
- var _exports = {};
126
- var compileBinding = BindingExpression.compileBinding;
261
+ do {
262
+ if (update) {
263
+ updateValue = update();
127
264
 
128
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
265
+ if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
266
+ updateValue.then(_resumeAfterUpdate).then(void 0, reject);
267
+ return;
268
+ }
269
+ }
129
270
 
130
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
271
+ shouldContinue = test();
131
272
 
132
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
273
+ if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {
274
+ _settle(pact, 1, result);
133
275
 
134
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
276
+ return;
277
+ }
135
278
 
136
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
279
+ if (shouldContinue.then) {
280
+ shouldContinue.then(_resumeAfterTest).then(void 0, reject);
281
+ return;
282
+ }
137
283
 
138
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
284
+ result = body();
139
285
 
140
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
286
+ if (_isSettledPact(result)) {
287
+ result = result.v;
288
+ }
289
+ } while (!result || !result.then);
290
+
291
+ result.then(_resumeAfterBody).then(void 0, reject);
292
+ }
293
+
294
+ function _resumeAfterTest(shouldContinue) {
295
+ if (shouldContinue) {
296
+ result = body();
297
+
298
+ if (result && result.then) {
299
+ result.then(_resumeAfterBody).then(void 0, reject);
300
+ } else {
301
+ _resumeAfterBody(result);
302
+ }
303
+ } else {
304
+ _settle(pact, 1, result);
305
+ }
306
+ }
307
+
308
+ function _resumeAfterUpdate() {
309
+ if (shouldContinue = test()) {
310
+ if (shouldContinue.then) {
311
+ shouldContinue.then(_resumeAfterTest).then(void 0, reject);
312
+ } else {
313
+ _resumeAfterTest(shouldContinue);
314
+ }
315
+ } else {
316
+ _settle(pact, 1, result);
317
+ }
318
+ }
319
+ }
141
320
 
142
321
  function _catch(body, recover) {
143
322
  try {
@@ -155,11 +334,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
155
334
 
156
335
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
157
336
 
158
- var processBuildingBlock = function (buildingBLockDefinition, oNode, oVisitor) {
337
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
338
+
339
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
340
+
341
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
342
+
343
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
344
+
345
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
346
+
347
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
348
+
349
+ var processBuildingBlock = function (buildingBlockDefinition, oNode, oVisitor) {
159
350
  var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
160
351
 
161
352
  try {
162
- var sFragmentName = buildingBLockDefinition.fragment || "".concat(buildingBLockDefinition.namespace, ".").concat(buildingBLockDefinition.name);
353
+ var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.name);
163
354
  var sName = "this";
164
355
  var mContexts = {};
165
356
  var oMetadataContexts = {};
@@ -173,22 +364,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
173
364
  });
174
365
  }
175
366
 
176
- var oMetadata = prepareMetadata(buildingBLockDefinition.metadata, buildingBLockDefinition.isOpen); //Inject storage for macros
367
+ var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen); //Inject storage for macros
177
368
 
178
369
  if (!oSettings[sFragmentName]) {
179
370
  oSettings[sFragmentName] = {};
180
371
  } // First of all we need to visit the attributes
181
372
 
182
373
 
183
- return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
374
+ return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, buildingBlockDefinition.apiVersion)).then(function (_ref) {
184
375
  var mMissingContext = _ref.mMissingContext,
185
376
  propertyValues = _ref.propertyValues;
186
377
  var initialKeys = Object.keys(propertyValues);
187
378
 
188
- var _temp5 = _catch(function () {
379
+ var _temp18 = _catch(function () {
189
380
  // Aggregation and complex type support
190
- return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues)).then(function (oAggregations) {
191
- function _temp4() {
381
+ return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
382
+ function _temp17() {
192
383
  if (oPreviousMacroInfo) {
193
384
  //restore macro info if available
194
385
  oSettings["_macroInfo"] = oPreviousMacroInfo;
@@ -207,8 +398,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
207
398
 
208
399
  var processedPropertyValues = propertyValues;
209
400
 
210
- if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.create) {
211
- processedPropertyValues = buildingBLockDefinition.create.call(buildingBLockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
401
+ if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
402
+ processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
212
403
  Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
213
404
  if (oMetadata.metadataContexts[sMetadataName].computed) {
214
405
  mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
@@ -219,21 +410,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
219
410
  mContexts[sContextName] = processedPropertyValues[sContextName];
220
411
  }
221
412
  });
222
- } else if (buildingBLockDefinition.apiVersion === 2) {
413
+ } else if (buildingBlockDefinition.apiVersion === 2) {
223
414
  Object.keys(propertyValues).forEach(function (propName) {
224
415
  var oData = propertyValues[propName];
225
416
 
226
- if (oData && oData.isA && oData.isA("sap.ui.model.Context") && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
417
+ if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
227
418
  propertyValues[propName] = oData.getObject();
228
419
  }
229
420
  });
230
- var BuildingBlockClass = buildingBLockDefinition;
231
- oInstance = new BuildingBlockClass(propertyValues
421
+ var BuildingBlockClass = buildingBlockDefinition;
422
+ propertyValues.isPublic = isPublic;
423
+ oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
232
424
  /*, oControlConfig, oSettings, oAggregations, isPublic*/
233
425
  );
426
+ processedPropertyValues = oInstance.getProperties();
427
+ Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
428
+ if (processedPropertyValues.hasOwnProperty(sContextName)) {
429
+ var targetObject = processedPropertyValues[sContextName];
430
+
431
+ if (typeof targetObject === "object" && !targetObject.getObject) {
432
+ var sAttributeValue = storeValue(targetObject);
433
+ var sContextPath = "".concat(sAttributeValue);
434
+ oSettings.models.converterContext.setProperty(sContextPath, targetObject);
435
+ targetObject = oSettings.models.converterContext.createBindingContext(sContextPath);
436
+ delete myStore[sAttributeValue];
437
+ mContexts[sContextName] = targetObject;
438
+ } else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
439
+ mContexts[sContextName] = targetObject;
440
+ }
441
+ }
442
+ });
234
443
  }
235
444
 
236
- var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBLockDefinition);
445
+ var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
237
446
  mContexts[sName] = oAttributesModel.createBindingContext("/");
238
447
  var oPreviousMacroInfo; // Keep track
239
448
 
@@ -247,24 +456,35 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
247
456
  }
248
457
 
249
458
  validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
250
- var oContextVisitor = oVisitor.with(mContexts, buildingBLockDefinition.isOpen !== undefined ? !buildingBLockDefinition.isOpen : true);
459
+ var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
251
460
  var oParent = oNode.parentNode;
252
461
  var iChildIndex;
253
462
  var oPromise;
463
+ var processCustomData = true;
254
464
 
255
- var _temp3 = function () {
465
+ var _temp16 = function () {
256
466
  if (oParent) {
257
467
  iChildIndex = Array.from(oParent.children).indexOf(oNode);
258
468
 
259
- if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.getTemplate || buildingBLockDefinition.apiVersion === 2) {
469
+ if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
260
470
  var oTemplate;
261
471
  var addDefaultNamespace = false;
262
472
 
263
- if (buildingBLockDefinition.apiVersion === 2) {
473
+ if (buildingBlockDefinition.apiVersion === 2) {
264
474
  oTemplate = oInstance.getTemplate();
475
+
476
+ if (buildingBlockDefinition.isRuntime) {
477
+ for (var myStoreKey in myStore) {
478
+ var oData = myStore[myStoreKey];
479
+ var sContextPath = "".concat(myStoreKey);
480
+ oSettings.models.converterContext.setProperty(sContextPath, oData);
481
+ delete myStore[myStoreKey];
482
+ }
483
+ }
484
+
265
485
  addDefaultNamespace = true;
266
- } else if (buildingBLockDefinition.getTemplate) {
267
- oTemplate = buildingBLockDefinition.getTemplate(processedPropertyValues);
486
+ } else if (buildingBlockDefinition.getTemplate) {
487
+ oTemplate = buildingBlockDefinition.getTemplate(processedPropertyValues);
268
488
  }
269
489
 
270
490
  var hasError = "";
@@ -287,27 +507,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
287
507
 
288
508
  if (oTemplate.localName === "parsererror") {
289
509
  // If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
290
- // Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective and if an error is found it's returned instead of the normal fragment
291
- Log.error("Error while processing building block ".concat(buildingBLockDefinition.name));
510
+ // Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
511
+ // If an error is found it's returned instead of the normal fragment
512
+ Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
292
513
 
293
514
  try {
294
515
  var _oInstance;
295
516
 
296
517
  isTraceMode = true;
297
- oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBLockDefinition.getTemplate(processedPropertyValues);
518
+ oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBlockDefinition.getTemplate(processedPropertyValues);
298
519
  oTemplate = parseXMLString(oTemplate, true);
299
520
  } finally {
300
521
  isTraceMode = false;
301
522
  }
302
523
  } else if (hasError.length > 0) {
303
524
  // If there is trailing text we create a standard error and display it.
304
- Log.error("Error while processing building block ".concat(buildingBLockDefinition.name));
305
- var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBLockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
525
+ Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
526
+ var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
306
527
  oTemplate = parseXMLString(oErrorText, true);
307
528
  }
308
529
 
309
530
  oNode.replaceWith(oTemplate);
310
531
  oNode = oParent.children[iChildIndex];
532
+ processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
533
+ processCustomData = false;
311
534
  oPromise = oContextVisitor.visitNode(oNode);
312
535
  } else {
313
536
  oNode.remove();
@@ -319,34 +542,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
319
542
 
320
543
  return Promise.resolve(oPromise).then(function () {
321
544
  var oMacroElement = oParent.children[iChildIndex];
322
-
323
- if (Object.keys(oAggregations).length > 0) {
324
- Object.keys(oAggregations).forEach(function (sAggregationName) {
325
- var oAggregationElement = oAggregations[sAggregationName];
326
-
327
- if (oMacroElement !== null && oMacroElement !== undefined) {
328
- var oNewChild = document.createElementNS(oMacroElement.namespaceURI, sAggregationName);
329
- var oElementChild = oAggregationElement.firstElementChild;
330
-
331
- while (oElementChild) {
332
- var oNextChild = oElementChild.nextElementSibling;
333
- oNewChild.appendChild(oElementChild);
334
- oElementChild = oNextChild;
335
- }
336
-
337
- if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
338
- var sSlotName = oMetadata.aggregations[sAggregationName] && oMetadata.aggregations[sAggregationName].slot || sAggregationName;
339
- var oTargetElement = oMacroElement.querySelector("slot[name='" + sSlotName + "']");
340
-
341
- if (oTargetElement) {
342
- oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
343
- }
344
- } else {
345
- oMacroElement.appendChild(oNewChild);
346
- }
347
- }
348
- });
349
- }
545
+ processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
350
546
 
351
547
  if (oMacroElement) {
352
548
  var oRemainingSlots = oMacroElement.querySelectorAll("slot");
@@ -358,7 +554,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
358
554
  }
359
555
  }();
360
556
 
361
- return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
557
+ return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
362
558
  });
363
559
  }, function (e) {
364
560
  // In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
@@ -376,7 +572,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
376
572
  var _propertyName = _step.value;
377
573
  var _propertyValue = propertyValues[_propertyName];
378
574
 
379
- if (_propertyValue && _propertyValue.isA && _propertyValue.isA("sap.ui.model.Context")) {
575
+ if (_propertyValue && _propertyValue.isA && _propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
380
576
  traceDetails.initialProperties[_propertyName] = {
381
577
  path: _propertyValue.getPath(),
382
578
  value: _propertyValue.getObject()
@@ -395,7 +591,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
395
591
  var propertyValue = propertyValues[propertyName];
396
592
 
397
593
  if (!initialKeys.includes(propertyName)) {
398
- if (propertyValue && propertyValue.isA && propertyValue.isA("sap.ui.model.Context")) {
594
+ if (propertyValue && propertyValue.isA && propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
399
595
  traceDetails.resolvedProperties[propertyName] = {
400
596
  path: propertyValue.getPath(),
401
597
  value: propertyValue.getObject()
@@ -408,50 +604,150 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
408
604
 
409
605
  var errorAny = e;
410
606
  Log.error(errorAny, errorAny);
411
- var oError = createErrorXML(["Error while processing building block ".concat(buildingBLockDefinition.name), errorAny.stack], oNode.outerHTML, traceDetails);
607
+ var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name)], oNode.outerHTML, traceDetails, errorAny.stack);
412
608
  var oTemplate = parseXMLString(oError, true);
413
609
  oNode.replaceWith(oTemplate);
414
610
  });
415
611
 
416
- if (_temp5 && _temp5.then) return _temp5.then(function () {});
612
+ if (_temp18 && _temp18.then) return _temp18.then(function () {});
417
613
  });
418
614
  } catch (e) {
419
615
  return Promise.reject(e);
420
616
  }
421
617
  };
422
618
 
423
- var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues) {
619
+ var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues, apiVersion) {
424
620
  try {
425
621
  var oAggregations = {};
426
622
 
427
- var _temp2 = function () {
623
+ var _temp10 = function () {
428
624
  if (oNode.firstElementChild !== null) {
429
- // If there are aggregation we need to visit the childNodes first and foremost
430
- return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {
431
- var oFirstElementChild = oNode.firstElementChild;
432
-
433
- while (oFirstElementChild !== null) {
434
- var sChildName = oFirstElementChild.localName;
435
-
436
- if (Object.keys(oMetadata.aggregations).indexOf(sChildName) !== -1 && (!isPublic || oMetadata.aggregations[sChildName].isPublic)) {
437
- oAggregations[oFirstElementChild.localName] = oFirstElementChild;
438
- } else if (Object.keys(oMetadata.properties).indexOf(sChildName) !== -1) {
439
- // Object Type properties
440
- propertyValues[sChildName] = {};
441
-
442
- for (var _i = 0, _Object$keys = Object.keys(oFirstElementChild.attributes); _i < _Object$keys.length; _i++) {
443
- var attributeIndex = _Object$keys[_i];
444
- propertyValues[sChildName][oFirstElementChild.attributes[attributeIndex].localName] = oFirstElementChild.attributes[attributeIndex].value;
625
+ function _temp11() {
626
+ _oFirstElementChild = oNode.firstElementChild;
627
+
628
+ var _temp6 = _for(function () {
629
+ return _oFirstElementChild !== null;
630
+ }, void 0, function () {
631
+ function _temp5() {
632
+ _oFirstElementChild = oNextChild;
633
+ }
634
+
635
+ var oNextChild = _oFirstElementChild.nextElementSibling;
636
+ var sChildName = _oFirstElementChild.localName;
637
+ var sAggregationName = sChildName;
638
+
639
+ if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
640
+ // not a sub aggregation, go back to default Aggregation
641
+ sAggregationName = oMetadata.defaultAggregation || "";
642
+ }
643
+
644
+ var _temp4 = function () {
645
+ if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic)) {
646
+ var _temp13 = function () {
647
+ if (apiVersion === 2) {
648
+ var aggregationDefinition = oMetadata.aggregations[sAggregationName];
649
+
650
+ var _temp14 = function () {
651
+ if (!aggregationDefinition.slot && _oFirstElementChild && _oFirstElementChild.children.length > 0) {
652
+ return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
653
+ var childDefinition = _oFirstElementChild.firstElementChild;
654
+
655
+ while (childDefinition) {
656
+ var oNewChild = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
657
+ var nextChild = childDefinition.nextElementSibling;
658
+ oNewChild.appendChild(childDefinition);
659
+ oAggregations[childDefinition.getAttribute("key")] = oNewChild;
660
+ childDefinition.removeAttribute("key");
661
+ childDefinition = nextChild;
662
+ }
663
+ });
664
+ } else if (aggregationDefinition.slot) {
665
+ if (sAggregationName !== sChildName) {
666
+ if (!oAggregations[sAggregationName]) {
667
+ var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
668
+ oAggregations[sAggregationName] = oNewChild;
669
+ }
670
+
671
+ oAggregations[sAggregationName].appendChild(_oFirstElementChild);
672
+ } else {
673
+ oAggregations[sAggregationName] = _oFirstElementChild;
674
+ }
675
+ }
676
+ }();
677
+
678
+ if (_temp14 && _temp14.then) return _temp14.then(function () {});
679
+ } else {
680
+ return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
681
+ oAggregations[_oFirstElementChild.localName] = _oFirstElementChild;
682
+ });
683
+ }
684
+ }();
685
+
686
+ if (_temp13 && _temp13.then) return _temp13.then(function () {});
687
+ } else {
688
+ var _temp15 = function () {
689
+ if (Object.keys(oMetadata.properties).indexOf(sAggregationName) !== -1) {
690
+ return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
691
+ // Object Type properties
692
+ propertyValues[sAggregationName] = {};
693
+
694
+ for (var _i = 0, _Object$keys = Object.keys(_oFirstElementChild.attributes); _i < _Object$keys.length; _i++) {
695
+ var attributeIndex = _Object$keys[_i];
696
+ propertyValues[sAggregationName][_oFirstElementChild.attributes[attributeIndex].localName] = _oFirstElementChild.attributes[attributeIndex].value;
697
+ }
698
+ });
699
+ }
700
+ }();
701
+
702
+ if (_temp15 && _temp15.then) return _temp15.then(function () {});
703
+ }
704
+ }();
705
+
706
+ return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
707
+ });
708
+
709
+ if (_temp6 && _temp6.then) return _temp6.then(function () {});
710
+ }
711
+
712
+ var _oFirstElementChild = oNode.firstElementChild;
713
+
714
+ if (apiVersion === 2) {
715
+ while (_oFirstElementChild !== null) {
716
+ var sChildName = _oFirstElementChild.localName;
717
+ var sAggregationName = sChildName;
718
+
719
+ if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
720
+ // not a sub aggregation, go back to default Aggregation
721
+ sAggregationName = oMetadata.defaultAggregation || "";
722
+ }
723
+
724
+ var aggregationDefinition = oMetadata.aggregations[sAggregationName];
725
+
726
+ if (aggregationDefinition && !aggregationDefinition.slot) {
727
+ var parsedAggregation = parseAggregation(_oFirstElementChild);
728
+ oAggregations[sAggregationName] = parsedAggregation;
729
+
730
+ for (var parsedAggregationKey in parsedAggregation) {
731
+ oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
445
732
  }
446
733
  }
447
734
 
448
- oFirstElementChild = oFirstElementChild.nextElementSibling;
735
+ _oFirstElementChild = _oFirstElementChild.nextElementSibling;
449
736
  }
450
- });
737
+ }
738
+
739
+ var _temp12 = function () {
740
+ if (apiVersion !== 2) {
741
+ // If there are aggregation we need to visit the childNodes to resolve templating instructions
742
+ return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {});
743
+ }
744
+ }();
745
+
746
+ return _temp12 && _temp12.then ? _temp12.then(_temp11) : _temp11(_temp12);
451
747
  }
452
748
  }();
453
749
 
454
- return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {
750
+ return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(function () {
455
751
  return oAggregations;
456
752
  }) : oAggregations);
457
753
  } catch (e) {
@@ -459,9 +755,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
459
755
  }
460
756
  };
461
757
 
462
- var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
758
+ var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, apiVersion) {
463
759
  try {
464
- function _temp10() {
760
+ function _temp23() {
465
761
  // Sort keys to be sure contextPath is before metaPath ( yes I'm desperate )
466
762
  aDefinitionContextsKeys = aDefinitionContextsKeys.sort(function (a, b) {
467
763
  return a > b ? 1 : -1;
@@ -515,39 +811,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
515
811
  var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
516
812
  var propertyValues = {};
517
813
 
518
- var _temp11 = _forTo(aDefinitionPropertiesKeys, function (j) {
519
- var sKeyValue = aDefinitionPropertiesKeys[j];
520
-
814
+ var _temp24 = _forOf(aDefinitionPropertiesKeys, function (sKeyValue) {
521
815
  if (oDefinitionProperties[sKeyValue].type === "object") {
522
- propertyValues[sKeyValue] = {}; // To avoid vales being reused accross macros
816
+ propertyValues[sKeyValue] = {}; // To avoid values being reused accross macros
523
817
  } else {
524
818
  propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
525
819
  }
526
820
 
527
- var _temp7 = function () {
821
+ var _temp20 = function () {
528
822
  if (oNode.hasAttribute(sKeyValue) && isPublic && !oDefinitionProperties[sKeyValue].isPublic) {
529
823
  Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
530
824
  } else {
531
- var _temp12 = function () {
825
+ var _temp25 = function () {
532
826
  if (oNode.hasAttribute(sKeyValue)) {
533
827
  return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
534
828
  var vValue = oNode.getAttribute(sKeyValue);
535
829
 
536
830
  if (vValue !== undefined) {
831
+ if (apiVersion === 2 && typeof vValue === "string" && oDefinitionProperties[sKeyValue].type === "boolean") {
832
+ vValue = vValue === "true";
833
+ }
834
+
537
835
  propertyValues[sKeyValue] = vValue;
538
836
  }
539
837
  });
540
838
  }
541
839
  }();
542
840
 
543
- if (_temp12 && _temp12.then) return _temp12.then(function () {});
841
+ if (_temp25 && _temp25.then) return _temp25.then(function () {});
544
842
  }
545
843
  }();
546
844
 
547
- if (_temp7 && _temp7.then) return _temp7.then(function () {});
845
+ if (_temp20 && _temp20.then) return _temp20.then(function () {});
548
846
  });
549
847
 
550
- return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(_temp10) : _temp10(_temp11));
848
+ return Promise.resolve(_temp24 && _temp24.then ? _temp24.then(_temp23) : _temp23(_temp24));
551
849
  } catch (e) {
552
850
  return Promise.reject(e);
553
851
  }
@@ -611,7 +909,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
611
909
 
612
910
  if (!oNode.hasAttribute(sKey)) {
613
911
  if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
614
- throw new Error(sName + ": " + "Required property '" + sKey + "' is missing");
912
+ throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
615
913
  }
616
914
  } else {
617
915
  delete oAttributeNames[sKey];
@@ -625,6 +923,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
625
923
  }
626
924
  });
627
925
  }
926
+
927
+ _exports.validateMacroSignature = validateMacroSignature;
928
+ var SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
929
+ var SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
628
930
  /**
629
931
  * Ensures that the metadata for the building block are properly defined.
630
932
  *
@@ -633,9 +935,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
633
935
  * @returns A set of completed metadata for further processing
634
936
  */
635
937
 
636
-
637
- _exports.validateMacroSignature = validateMacroSignature;
638
-
639
938
  function prepareMetadata(buildingBlockMetadata) {
640
939
  var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
641
940
 
@@ -643,15 +942,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
643
942
  var oProperties = {};
644
943
  var oAggregations = {
645
944
  "dependents": {
646
- type: "sap.ui.core.Element"
945
+ type: SAP_UI_CORE_ELEMENT
647
946
  },
648
947
  "customData": {
649
- type: "sap.ui.core.Element"
948
+ type: SAP_UI_CORE_ELEMENT
650
949
  }
651
950
  };
652
951
  var oMetadataContexts = {};
952
+ var foundDefaultAggregation;
653
953
  Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
654
- if (buildingBlockMetadata.properties[sPropertyName].type !== "sap.ui.model.Context") {
954
+ if (buildingBlockMetadata.properties[sPropertyName].type !== SAP_UI_MODEL_CONTEXT) {
655
955
  oProperties[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
656
956
  } else {
657
957
  oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
@@ -667,12 +967,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
667
967
  if (buildingBlockMetadata.aggregations) {
668
968
  Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
669
969
  oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
970
+
971
+ if (oAggregations[sPropertyName].isDefault) {
972
+ foundDefaultAggregation = sPropertyName;
973
+ }
670
974
  });
671
975
  }
672
976
 
673
977
  return {
674
978
  properties: oProperties,
675
979
  aggregations: oAggregations,
980
+ defaultAggregation: foundDefaultAggregation,
676
981
  metadataContexts: oMetadataContexts,
677
982
  isOpen: isOpen
678
983
  };
@@ -681,10 +986,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
681
986
  metadataContexts: {},
682
987
  aggregations: {
683
988
  "dependents": {
684
- type: "sap.ui.core.Element"
989
+ type: SAP_UI_CORE_ELEMENT
685
990
  },
686
991
  "customData": {
687
- type: "sap.ui.core.Element"
992
+ type: SAP_UI_CORE_ELEMENT
688
993
  }
689
994
  },
690
995
  properties: {},
@@ -698,31 +1003,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
698
1003
 
699
1004
  if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
700
1005
  var sAttributeValue = oNode.getAttribute(sAttributeName);
701
- var sMetaPath; // oVisitor.getResult(sAttributeValue, oNode);
702
-
1006
+ var sMetaPath;
703
1007
  oMetadataContext = BindingParser.complexParser(sAttributeValue);
704
1008
 
705
1009
  if (!oMetadataContext) {
706
- if (sAttributeValue.startsWith("uid--")) {
1010
+ if (sAttributeValue.startsWith("/uid--")) {
707
1011
  var oData = myStore[sAttributeValue];
708
- var sContextPath = "/" + sAttributeValue;
709
- oSettings.models.converterContext.setProperty(sContextPath, oData);
1012
+ oSettings.models.converterContext.setProperty(sAttributeValue, oData);
710
1013
  oMetadataContext = {
711
1014
  model: "converterContext",
712
- path: sContextPath
1015
+ path: sAttributeValue
713
1016
  };
714
1017
  } else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
715
1018
  if (sAttributeValue && sAttributeValue.startsWith("/")) {
716
1019
  // absolute path - we just use this one
717
1020
  sMetaPath = sAttributeValue;
718
1021
  } else {
719
- var _sContextPath = oSettings.currentContextPath.getPath();
1022
+ var sContextPath = oSettings.currentContextPath.getPath();
720
1023
 
721
- if (!_sContextPath.endsWith("/")) {
722
- _sContextPath += "/";
1024
+ if (!sContextPath.endsWith("/")) {
1025
+ sContextPath += "/";
723
1026
  }
724
1027
 
725
- sMetaPath = _sContextPath + sAttributeValue;
1028
+ sMetaPath = sContextPath + sAttributeValue;
726
1029
  }
727
1030
 
728
1031
  oMetadataContext = {
@@ -757,6 +1060,66 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
757
1060
  return oMetadataContext;
758
1061
  }
759
1062
 
1063
+ function parseAggregation(oAggregation) {
1064
+ var oOutObjects = {};
1065
+
1066
+ if (oAggregation && oAggregation.children.length > 0) {
1067
+ var children = oAggregation.children;
1068
+
1069
+ for (var childIdx = 0; childIdx < children.length; childIdx++) {
1070
+ var childDefinition = children[childIdx];
1071
+ var childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
1072
+
1073
+ if (childKey) {
1074
+ childKey = "InlineXML_".concat(childKey);
1075
+ childDefinition.setAttribute("key", childKey);
1076
+ oOutObjects[childKey] = {
1077
+ key: childKey,
1078
+ position: {
1079
+ placement: childDefinition.getAttribute("placement"),
1080
+ anchor: childDefinition.getAttribute("anchor")
1081
+ },
1082
+ type: "Slot"
1083
+ };
1084
+ }
1085
+ }
1086
+ }
1087
+
1088
+ return oOutObjects;
1089
+ }
1090
+
1091
+ function processSlots(oAggregations, oMetadataAggregations, oNode) {
1092
+ var processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1093
+
1094
+ if (Object.keys(oAggregations).length > 0) {
1095
+ Object.keys(oAggregations).forEach(function (sAggregationName) {
1096
+ var oAggregationElement = oAggregations[sAggregationName];
1097
+
1098
+ if (oNode !== null && oNode !== undefined && oAggregationElement) {
1099
+ var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
1100
+ var oElementChild = oAggregationElement.firstElementChild;
1101
+
1102
+ while (oElementChild) {
1103
+ var oNextChild = oElementChild.nextElementSibling;
1104
+ oNewChild.appendChild(oElementChild);
1105
+ oElementChild = oNextChild;
1106
+ }
1107
+
1108
+ if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
1109
+ var sSlotName = oMetadataAggregations[sAggregationName] && oMetadataAggregations[sAggregationName].slot || sAggregationName;
1110
+ var oTargetElement = oNode.querySelector("slot[name='".concat(sSlotName, "']"));
1111
+
1112
+ if (oTargetElement) {
1113
+ oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
1114
+ }
1115
+ } else if (processCustomData && oNewChild.children.length > 0) {
1116
+ oNode.appendChild(oNewChild);
1117
+ }
1118
+ }
1119
+ });
1120
+ }
1121
+ }
1122
+
760
1123
  function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
761
1124
  var sKey = oCtx.name || oCtx.model || undefined;
762
1125
 
@@ -768,12 +1131,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
768
1131
  var sContextPath = oCtx.path;
769
1132
 
770
1133
  if (oCtx.model != null) {
771
- sContextPath = oCtx.model + ">" + sContextPath;
1134
+ sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
772
1135
  }
773
1136
 
774
1137
  var mSetting = oVisitor.getSettings();
775
1138
 
776
- if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
1139
+ if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
1140
+ mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path, mSetting.bindingContexts[oCtx.model]); // add the context to the visitor
1141
+ } else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
777
1142
  mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
778
1143
  } else {
779
1144
  mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
@@ -808,23 +1173,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
808
1173
 
809
1174
  _exports.registerBuildingBlock = registerBuildingBlock;
810
1175
 
811
- function createErrorXML(errorMessages, xmlFragment, additionalData) {
1176
+ function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
812
1177
  var errorLabels = errorMessages.map(function (errorMessage) {
813
- return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXML(errorMessage));
1178
+ return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXMLAttributeValue(errorMessage));
814
1179
  });
1180
+ var errorStack = "";
1181
+
1182
+ if (stack) {
1183
+ var stackFormatted = btoa("<pre>".concat(stack, "</pre>"));
1184
+ errorStack = xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<m:FormattedText htmlText=\"", "\" />"])), "{= BBF.base64Decode('".concat(stackFormatted, "') }"));
1185
+ }
1186
+
815
1187
  var additionalText = "";
816
1188
 
817
1189
  if (additionalData) {
818
- additionalText = xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"Trace Info\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"json\" value=\"", "\" height=\"300px\" width=\"100vh\"/>\n\t\t\t\t\t</m:VBox>"])), escapeXML(JSON.stringify(additionalData, null, 4)));
1190
+ additionalText = xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"Trace Info\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"json\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>"])), "{= BBF.base64Decode('".concat(btoa(JSON.stringify(additionalData, null, 4)), "') }"));
819
1191
  }
820
1192
 
821
- return xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\">\n\t\t\t\t", "\n\t\t\t\t<m:HBox>\n\t\t\t\t\t<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"How the building block was called\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"xml\" value=\"", "\" height=\"300px\" width=\"100vh\"/>\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</m:HBox>\n\t\t\t</m:VBox>"])), errorLabels, escapeXML(xmlFragment), additionalText);
1193
+ return xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\" core:require=\"{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}\">\n\t\t\t\t", "\t\t\t\n\t\t\t\t", "\n\t\t\t\t<grid:CSSGrid gridTemplateRows=\"fr\" gridTemplateColumns=\"repeat(2,1fr)\" gridGap=\"1rem\" xmlns:grid=\"sap.ui.layout.cssgrid\" >\n\t\t\t\t\t<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"How the building block was called\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"xml\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</grid:CSSGrid>\n\t\t\t</m:VBox>"])), errorLabels, errorStack, "{= BBF.base64Decode('".concat(btoa(xmlFragment.replaceAll("&gt;", ">")), "') }"), additionalText);
822
1194
  }
823
1195
 
824
1196
  var myStore = {};
825
1197
 
826
1198
  function storeValue(values) {
827
- var propertyUID = "uid--".concat(uid());
1199
+ var propertyUID = "/uid--".concat(uid());
828
1200
  myStore[propertyUID] = values;
829
1201
  return propertyUID;
830
1202
  }
@@ -841,7 +1213,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
841
1213
  var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
842
1214
 
843
1215
  if (addDefaultNamespaces) {
844
- xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
1216
+ xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:macros=\"sap.fe.macros\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:mdc=\"sap.ui.mdc\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
845
1217
  }
846
1218
 
847
1219
  var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
@@ -855,17 +1227,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
855
1227
 
856
1228
  return output;
857
1229
  }
858
- /**
859
- * Escape an XML string to include it in an XML fragment.
860
- *
861
- * @param str The string to escape
862
- * @returns The escaped string.
863
- */
864
-
865
-
866
- function escapeXML(str) {
867
- return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\n/g, "&#10;").replace(/\{/g, "\\{").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
868
- }
869
1230
  /**
870
1231
  * Escape an XML attribute value.
871
1232
  *
@@ -874,8 +1235,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
874
1235
  */
875
1236
 
876
1237
 
1238
+ _exports.parseXMLString = parseXMLString;
1239
+
877
1240
  function escapeXMLAttributeValue(val) {
878
- return val.replace(/&/g, "&amp;").replace(/</g, "&lt;");
1241
+ return val && val.replace(/&/g, "&amp;").replace(/</g, "&lt;");
1242
+ }
1243
+
1244
+ function renderInTraceMode(outStr) {
1245
+ var xmlResult = parseXMLString(outStr, true);
1246
+
1247
+ if (xmlResult && (xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.localName) === "parsererror") {
1248
+ var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
1249
+ return createErrorXML([errorMessage.split("\n")[0]], outStr);
1250
+ } else {
1251
+ return outStr;
1252
+ }
879
1253
  }
880
1254
  /**
881
1255
  * Create a string representation of the template literal while handling special object case.
@@ -899,16 +1273,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
899
1273
 
900
1274
  outStr += strings[i]; // Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
901
1275
 
902
- if (Array.isArray(values[i])) {
903
- outStr += values[i].flat(5).join("").trim();
1276
+ if (Array.isArray(values[i]) && values[i].length > 0 && typeof values[i][0] === "string") {
1277
+ outStr += values[i].flat(5).join("\n").trim();
904
1278
  } else if ((_values$i = values[i]) !== null && _values$i !== void 0 && _values$i._type) {
905
- var compiledExpression = compileBinding(values[i]);
1279
+ var compiledExpression = compileExpression(values[i]);
906
1280
  outStr += compiledExpression !== undefined ? escapeXMLAttributeValue(compiledExpression) : undefined;
907
1281
  } else if ((_values$i2 = values[i]) !== null && _values$i2 !== void 0 && _values$i2.getTemplate) {
908
1282
  outStr += values[i].getTemplate();
1283
+ } else if (typeof values[i] === "undefined") {
1284
+ outStr += "{this>undefinedValue}";
909
1285
  } else if (typeof values[i] === "object") {
910
- var propertyUId = storeValue(values[i]);
911
- outStr += "".concat(propertyUId);
1286
+ var _values$i$isA, _values$i3;
1287
+
1288
+ if ((_values$i$isA = (_values$i3 = values[i]).isA) !== null && _values$i$isA !== void 0 && _values$i$isA.call(_values$i3, "sap.ui.model.Context")) {
1289
+ outStr += values[i].getPath();
1290
+ } else {
1291
+ var propertyUId = storeValue(values[i]);
1292
+ outStr += "".concat(propertyUId);
1293
+ }
1294
+ } else if (values[i] && typeof values[i] === "string" && !values[i].startsWith("<") && !values[i].startsWith("&lt;")) {
1295
+ outStr += escapeXMLAttributeValue(values[i]);
912
1296
  } else {
913
1297
  outStr += values[i];
914
1298
  }
@@ -918,12 +1302,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
918
1302
  outStr = outStr.trim();
919
1303
 
920
1304
  if (isTraceMode) {
921
- var xmlResult = parseXMLString(outStr, true);
922
-
923
- if (xmlResult && (xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.localName) === "parsererror") {
924
- var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
925
- return createErrorXML([errorMessage.split("\n")[0]], outStr);
926
- }
1305
+ return renderInTraceMode(outStr);
927
1306
  }
928
1307
 
929
1308
  return outStr;
@@ -932,4 +1311,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
932
1311
  _exports.xml = xml;
933
1312
  return _exports;
934
1313
  }, false);
935
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJpc09wZW4iLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwiaW5pdGlhbEtleXMiLCJPYmplY3QiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcGlWZXJzaW9uIiwicHJvcE5hbWUiLCJvRGF0YSIsImlzQSIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsInVuZGVmaW5lZCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvTmV3Q2hpbGQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsInZpc2l0Q2hpbGROb2RlcyIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsInNDaGlsZE5hbWUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJzb3J0IiwiYSIsImIiLCJzQXR0cmlidXRlTmFtZSIsImJEb05vdFJlc29sdmUiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0IiwiYmluZGluZ0NvbnRleHRzIiwiY3VycmVudENvbnRleHRQYXRoIiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiY29udGV4dFBhdGgiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwiaiIsInNLZXlWYWx1ZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJ2aXNpdEF0dHJpYnV0ZSIsImdldE5hbWVkSXRlbSIsInZWYWx1ZSIsImdldEF0dHJpYnV0ZSIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwib0NvbnRleHRTZXR0aW5ncyIsInNLZXkiLCJvQ29udGV4dCIsIm9Db250ZXh0T2JqZWN0IiwicmVxdWlyZWQiLCJFcnJvciIsIiRraW5kIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJteVN0b3JlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibW9kZWwiLCJlbmRzV2l0aCIsImVudGl0eVNldCIsImdldENvbnRleHQiLCJvQ3R4IiwibVNldHRpbmciLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJtYXAiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUwiLCJhZGRpdGlvbmFsVGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdG9yZVZhbHVlIiwidmFsdWVzIiwicHJvcGVydHlVSUQiLCJ1aWQiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0Iiwic3RyIiwicmVwbGFjZSIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsIiwic3RyaW5ncyIsIm91dFN0ciIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsIl90eXBlIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUJpbmRp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QUNBLE9BRk0sTUFFQSxJQUFJLE9BQU8rSSxNQUFNLENBQUNoTyxDQUFELENBQWIsS0FBcUIsUUFBekIsRUFBbUM7QUFDekMsWUFBTW9QLFdBQVcsR0FBR3JCLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDaE8sQ0FBRCxDQUFQLENBQTlCO0FBQ0E2TyxRQUFBQSxNQUFNLGNBQU9PLFdBQVAsQ0FBTjtBQUNBLE9BSE0sTUFHQTtBQUNOUCxRQUFBQSxNQUFNLElBQUliLE1BQU0sQ0FBQ2hPLENBQUQsQ0FBaEI7QUFDQTtBQUNEOztBQUNENk8sSUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUM1TyxDQUFELENBQWpCO0FBQ0E2TyxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzlJLElBQVAsRUFBVDs7QUFDQSxRQUFJRSxXQUFKLEVBQWlCO0FBQ2hCLFVBQU1vSixTQUFTLEdBQUcvSixjQUFjLENBQUN1SixNQUFELEVBQVMsSUFBVCxDQUFoQzs7QUFDQSxVQUFJUSxTQUFTLElBQUksQ0FBQUEsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVySixTQUFYLE1BQXlCLGFBQTFDLEVBQXlEO0FBQ3hELFlBQU15SCxZQUFZLEdBQUk0QixTQUFELENBQW1CQyxTQUFuQixJQUFpQ0QsU0FBRCxDQUFtQkUsU0FBeEU7QUFDQSxlQUFPcEosY0FBYyxDQUFDLENBQUNzSCxZQUFZLENBQUMrQixLQUFiLENBQW1CLElBQW5CLEVBQXlCLENBQXpCLENBQUQsQ0FBRCxFQUFnQ1gsTUFBaEMsQ0FBckI7QUFDQTtBQUNEOztBQUNELFdBQU9BLE1BQVA7QUFDQSxHQTlCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0Jhc2UsXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgeyBjb21waWxlQmluZGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcbmxldCBpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXG50eXBlIFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPjtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xuXHRpc09wZW46IGJvb2xlYW47XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKiovXG5cdHZpc2l0Tm9kZShvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEluc2VydHMgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuIExvYWRzIHRoZVxuXHQgKiBmcmFnbWVudCwgdGFrZXMgY2FyZSBvZiBjYWNoaW5nIChmb3IgdGhlIGN1cnJlbnQgcHJlLXByb2Nlc3NvciBydW4pIGFuZCB2aXNpdHMgdGhlXG5cdCAqIGZyYWdtZW50J3MgY29udGVudCBvbmNlIGl0IGhhcyBiZWVuIGltcG9ydGVkIGludG8gdGhlIGVsZW1lbnQncyBvd25lciBkb2N1bWVudCBhbmRcblx0ICogcHV0IGludG8gcGxhY2UuIExvYWRpbmcgb2YgZnJhZ21lbnRzIGlzIGFzeW5jaHJvbm91cyBpZiB0aGUgdGVtcGxhdGUgdmlldyBpc1xuXHQgKiBhc3luY2hyb25vdXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRnJhZ21lbnROYW1lXG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IG9FbGVtZW50XG5cdCAqICAgdGhlIFhNTCBET00gZWxlbWVudCwgZS5nLiA8c2FwLnVpLmNvcmU6RnJhZ21lbnQ+IG9yIDxjb3JlOkV4dGVuc2lvblBvaW50PlxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLnV0aWwuX3dpdGh9IG9XaXRoQ29udHJvbFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZX1cblx0ICogQSBzeW5jIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdGhlIGZyYWdtZW50XG5cdCAqICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIGxvYWRpbmcgb3IgdmlzaXRpbmdcblx0ICogICBmYWlscy5cblx0ICovXG5cdGluc2VydEZyYWdtZW50KHNGcmFnbWVudDogc3RyaW5nLCBvRWxlbWVudDogRWxlbWVudCwgb1dpdGg/OiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdEF0dHJpYnV0ZShvTm9kZTogRWxlbWVudCwgb0F0dHJpYnV0ZTogQXR0cik6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0Q2hpbGROb2RlcyhvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBJbnRlcnByZXRzIHRoZSBnaXZlbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlXG5cdCAqIHJlc3VsdGluZyB2YWx1ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZVxuXHQgKiAgIEFuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gW29FbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V8bnVsbH1cblx0ICogICBBIHRoZW5hYmxlIHdoaWNoIHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdGluZyB2YWx1ZSwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhXG5cdCAqICAgY29ycmVzcG9uZGluZyBlcnJvciAoZm9yIGV4YW1wbGUsIGFuIGVycm9yIHRocm93biBieSBhIGZvcm1hdHRlcikgb3Jcblx0ICogICA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIHRoZSBiaW5kaW5nIGlzIG5vdCByZWFkeSAoYmVjYXVzZSBpdCByZWZlcnMgdG8gYVxuXHQgKiAgIG1vZGVsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUpIChzaW5jZSAxLjU3LjApXG5cdCAqL1xuXHRnZXRSZXN1bHQoc1ZhbHVlOiBzdHJpbmcsIGVsZW1lbnQ/OiBFbGVtZW50KTogUHJvbWlzZTxhbnk+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aDogc3RyaW5nKTogQ29udGV4dDtcblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYXAgb2YgdmFyaWFibGVzIHdoaWNoXG5cdCAqIG92ZXJyaWRlIGN1cnJlbnRseSBrbm93biB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8Y29kZT50aGlzPC9jb2RlPlxuXHQgKiBwYXJlbnQgaW50ZXJmYWNlIG9yIHJlcGxhY2UgdGhlbSBhbHRvZ2V0aGVyLiBFYWNoIHZhcmlhYmxlIG5hbWUgYmVjb21lcyBhXG5cdCAqIG5hbWVkIG1vZGVsIHdpdGggYSBjb3JyZXNwb25kaW5nIG9iamVjdCBiaW5kaW5nIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlXG5cdCAqIFhNTCB0ZW1wbGF0ZSBpbiB0aGUgdXN1YWwgd2F5LCB0aGF0IGlzLCB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uIGxpa2Vcblx0ICogPGNvZGU+XCJ7dmFyPnNvbWUvcmVsYXRpdmUvcGF0aH1cIjwvY29kZT4gKHNlZSBleGFtcGxlKS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttVmFyaWFibGVzPXt9XVxuXHQgKiAgIE1hcCBmcm9tIHZhcmlhYmxlIG5hbWUgKHN0cmluZykgdG8gdmFsdWUgKHtAbGluayBzYXAudWkubW9kZWwuQ29udGV4dH0pXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JSZXBsYWNlXVxuXHQgKiAgIFdoZXRoZXIgb25seSB0aGUgZ2l2ZW4gdmFyaWFibGVzIGFyZSBrbm93biBpbiB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZVxuXHQgKiAgIGluc3RhbmNlLCBubyBpbmhlcml0ZWQgb25lc1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrfVxuXHQgKiAgIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBtVmFyaWFibGVzXG5cdCAqIEBwYXJhbSBiUmVwbGFjZVxuXHQgKi9cblx0XCJ3aXRoXCIobVZhcmlhYmxlcz86IGFueSwgYlJlcGxhY2U/OiBib29sZWFuKTogSUNhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBUeXBlZ3VhcmQgZm9yIGNoZWNraW5nIGlmIGEgYnVpbGRpbmcgYmxvY2sgdXNlIEFQSSAxLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvblxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2luZyBBUEkgMS5cbiAqL1xuZnVuY3Rpb24gaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uIGlzIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEge1xuXHRyZXR1cm4gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b0NvbnRleHRTZXR0aW5nczogQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdHNLZXk6IHN0cmluZ1xuKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gbUNvbnRleHRzW3NLZXldO1xuXHRjb25zdCBvQ29udGV4dE9iamVjdCA9IG9Db250ZXh0Py5nZXRPYmplY3QoKTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJGtpbmQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRraW5kLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIka2luZFwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRraW5kXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRUeXBlKSB7XG5cdFx0XHQvLyBDaGVjayBvbmx5ICRUeXBlXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4kVHlwZS5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJFR5cGVcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3NbXCIkVHlwZVwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNOYW1lOiBhbnksIG9NZXRhZGF0YTogYW55LCBtQ29udGV4dHM6IGFueSwgb05vZGU6IGFueSkge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBhbnkgPSB7fTtcblxuXHQvLyBjb2xsZWN0IGFsbCBhdHRyaWJ1dGVzIHRvIGZpbmQgdW5jaGVja2VkIHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMob05vZGUuYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoaUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc0tleSA9IG9Ob2RlLmF0dHJpYnV0ZXNbaUtleV0ubmFtZTtcblx0XHRvQXR0cmlidXRlTmFtZXNbc0tleV0gPSB0cnVlO1xuXHR9KTtcblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV07XG5cdFx0aWYgKCFvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkpIHtcblx0XHRcdGlmIChvUHJvcGVydHlTZXR0aW5ncy5yZXF1aXJlZCAmJiAhb1Byb3BlcnR5U2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNOYW1lICsgXCI6IFwiICsgXCJSZXF1aXJlZCBwcm9wZXJ0eSAnXCIgKyBzS2V5ICsgXCInIGlzIG1pc3NpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH0sXG5cdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRsZXQgc01ldGFQYXRoO1xuXHRcdC8vIG9WaXNpdG9yLmdldFJlc3VsdChzQXR0cmlidXRlVmFsdWUsIG9Ob2RlKTtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCJ1aWQtLVwiKSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gXCIvXCIgKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRcdFx0cGF0aDogc0NvbnRleHRQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55XG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGxldCBqID0gMDsgaiA8IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMubGVuZ3RoOyBqKyspIHtcblx0XHRjb25zdCBzS2V5VmFsdWUgPSBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzW2pdO1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbGVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0Y29uc3QgdlZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiAhb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKSB8fFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdC8vIElmIHRoZXJlIGFyZSBhZ2dyZWdhdGlvbiB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBjaGlsZE5vZGVzIGZpcnN0IGFuZCBmb3JlbW9zdFxuXHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NDaGlsZE5hbWVdLmlzUHVibGljKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZV0gPSBvRmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNDaGlsZE5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHQvLyBPYmplY3QgVHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlSW5kZXggb2YgT2JqZWN0LmtleXMob0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0NoaWxkTmFtZV1bb0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXNbYXR0cmlidXRlSW5kZXggYXMgYW55XS5sb2NhbE5hbWVdID1cblx0XHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRpc1B1YmxpYyA9IGZhbHNlXG4pIHtcblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdC8vIFRPRE8gMDAwMSBNb3ZlIHRoaXMgZWxzZXdoZXJlIHRoaXMgaXMgd2VpcmQgOilcblx0aWYgKG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0LmdldFJlc291cmNlQnVuZGxlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm1ldGFkYXRhLCBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5pc09wZW4pO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXNcblx0Y29uc3QgeyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH0gPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKG9Ob2RlLCBvVmlzaXRvciwgb01ldGFkYXRhLCBpc1B1YmxpYywgcHJvcGVydHlWYWx1ZXMpO1xuXHRcdGxldCBvSW5zdGFuY2U6IGFueTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhwcm9wZXJ0eVZhbHVlcyAvKiwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncywgb0FnZ3JlZ2F0aW9ucywgaXNQdWJsaWMqLyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDJcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZSBhbmQgaWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShvTm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b05vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9NYWNyb0VsZW1lbnQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IG51bGwgJiYgb01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob01hY3JvRWxlbWVudC5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0bGV0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHRcdFx0KG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gJiYgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5zbG90KSB8fFxuXHRcdFx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic2xvdFtuYW1lPSdcIiArIHNTbG90TmFtZSArIFwiJ11cIikgYXMgRWxlbWVudDtcblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyBhbnkpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b01hY3JvRWxlbWVudC5hcHBlbmRDaGlsZChvTmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXHRcdGNvbnN0IHRyYWNlRGV0YWlscyA9IHtcblx0XHRcdGluaXRpYWxQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBlcnJvckFueSA9IGUgYXMgYW55O1xuXHRcdExvZy5lcnJvcihlcnJvckFueSwgZXJyb3JBbnkpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCTG9ja0RlZmluaXRpb24ubmFtZX1gLCBlcnJvckFueS5zdGFja10sXG5cdFx0XHRvTm9kZS5vdXRlckhUTUwsXG5cdFx0XHR0cmFjZURldGFpbHNcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlIGFzIGFueSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9DdHg6IGFueSwgb01ldGFkYXRhQ29udGV4dHM6IGFueSkge1xuXHRjb25zdCBzS2V5ID0gb0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkO1xuXG5cdGlmIChvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPSBudWxsKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBvQ3R4Lm1vZGVsICsgXCI+XCIgKyBzQ29udGV4dFBhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1TZXR0aW5nID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSAmJiBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUwoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiB2YWx1ZT1cIiR7ZXNjYXBlWE1MKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQ8bTpIQm94PlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2VzY2FwZVhNTCh4bWxGcmFnbWVudCl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvbTpIQm94PlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGB1aWQtLSR7dWlkKCl9YDtcblx0bXlTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZXM7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIGFkZERlZmF1bHROYW1lc3BhY2VzIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhZGQgZGVmYXVsdCBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlWE1MU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlcyA9IGZhbHNlKTogRWxlbWVudCB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgc3RyaW5nIHRvIGluY2x1ZGUgaXQgaW4gYW4gWE1MIGZyYWdtZW50LlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBlc2NhcGVcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlWE1MKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHN0clxuXHRcdC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcblx0XHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0XHQucmVwbGFjZSgvXFxuL2csIFwiJiMxMDtcIilcblx0XHQucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIilcblx0XHQucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblx0XHQucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcblx0XHQucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB2YWwucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiAoZGV0ZXJtaW5lZCBieSBfdHlwZSkgdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1tpXSkpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZmxhdCg1KS5qb2luKFwiXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uX3R5cGUpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVCaW5kaW5nKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gY29tcGlsZWRFeHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldPy5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdFx0aWYgKHhtbFJlc3VsdCAmJiB4bWxSZXN1bHQ/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl19
1314
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJhcGlWZXJzaW9uIiwibU1pc3NpbmdDb250ZXh0IiwicHJvcGVydHlWYWx1ZXMiLCJpbml0aWFsS2V5cyIsIk9iamVjdCIsImtleXMiLCJwcm9jZXNzQ2hpbGRyZW4iLCJvQWdncmVnYXRpb25zIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwib0luc3RhbmNlIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsImdldFByb3BlcnR5IiwicHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMiLCJpc1YxTWFjcm9EZWYiLCJjcmVhdGUiLCJjYWxsIiwibWV0YWRhdGFDb250ZXh0cyIsImZvckVhY2giLCJzTWV0YWRhdGFOYW1lIiwiY29tcHV0ZWQiLCJzQ29udGV4dE5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3BOYW1lIiwib0RhdGEiLCJpc0EiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwiZ2V0UHJvcGVydGllcyIsInRhcmdldE9iamVjdCIsInNBdHRyaWJ1dGVWYWx1ZSIsInN0b3JlVmFsdWUiLCJzQ29udGV4dFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm15U3RvcmUiLCJ1bmRlZmluZWQiLCJvQXR0cmlidXRlc01vZGVsIiwiQXR0cmlidXRlTW9kZWwiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsInByb2Nlc3NDdXN0b21EYXRhIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGRyZW4iLCJpbmRleE9mIiwiZ2V0VGVtcGxhdGUiLCJvVGVtcGxhdGUiLCJhZGREZWZhdWx0TmFtZXNwYWNlIiwiaXNSdW50aW1lIiwibXlTdG9yZUtleSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInByb2Nlc3NTbG90cyIsImFnZ3JlZ2F0aW9ucyIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwib1JlbWFpbmluZ1Nsb3RzIiwicXVlcnlTZWxlY3RvckFsbCIsIm9TbG90RWxlbWVudCIsInRyYWNlRGV0YWlscyIsImluaXRpYWxQcm9wZXJ0aWVzIiwicmVzb2x2ZWRQcm9wZXJ0aWVzIiwibWlzc2luZ0NvbnRleHRzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlWYWx1ZSIsInBhdGgiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJlcnJvckFueSIsIm9FcnJvciIsInN0YWNrIiwib0ZpcnN0RWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJzbG90IiwiY2hpbGREZWZpbml0aW9uIiwib05ld0NoaWxkIiwiY3JlYXRlRWxlbWVudE5TIiwibmFtZXNwYWNlVVJJIiwiZ2V0QXR0cmlidXRlIiwibmV4dENoaWxkIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwicGFyc2VkQWdncmVnYXRpb24iLCJwYXJzZUFnZ3JlZ2F0aW9uIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJ2aXNpdENoaWxkTm9kZXMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsInNvcnQiLCJhIiwiYiIsInNBdHRyaWJ1dGVOYW1lIiwiYkRvTm90UmVzb2x2ZSIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJoYXNBdHRyaWJ1dGUiLCJvTWV0YWRhdGFDb250ZXh0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsImFkZFNpbmdsZUNvbnRleHQiLCJiaW5kaW5nQ29udGV4dHMiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJjb250ZXh0UGF0aCIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJzS2V5VmFsdWUiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwidmlzaXRBdHRyaWJ1dGUiLCJnZXROYW1lZEl0ZW0iLCJ2VmFsdWUiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXJJbnN0YW5jZSIsIkRPTVBhcnNlciIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCIkVHlwZSIsImFNZXRhZGF0YUNvbnRleHRLZXlzIiwiYVByb3BlcnRpZXMiLCJvQXR0cmlidXRlTmFtZXMiLCJpS2V5Iiwib1Byb3BlcnR5U2V0dGluZ3MiLCJzdGFydHNXaXRoIiwid2FybmluZyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsImZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uIiwic1Byb3BlcnR5TmFtZSIsImV2ZW50cyIsInNFdmVudE5hbWUiLCJpc0RlZmF1bHQiLCJzTWV0YVBhdGgiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsIm1vZGVsIiwiZW5kc1dpdGgiLCJlbnRpdHlTZXQiLCJnZXRDb250ZXh0Iiwib0FnZ3JlZ2F0aW9uIiwib091dE9iamVjdHMiLCJjaGlsZElkeCIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJhbmNob3IiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwieG1sVGFnIiwicHVibGljTmFtZXNwYWNlIiwiZXJyb3JNZXNzYWdlcyIsInhtbEZyYWdtZW50IiwiYWRkaXRpb25hbERhdGEiLCJlcnJvckxhYmVscyIsIm1hcCIsImVycm9yTWVzc2FnZSIsInhtbCIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwiZXJyb3JTdGFjayIsInN0YWNrRm9ybWF0dGVkIiwiYnRvYSIsImFkZGl0aW9uYWxUZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2VBbGwiLCJwcm9wZXJ0eVVJRCIsInVpZCIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJ2YWwiLCJyZXBsYWNlIiwicmVuZGVySW5UcmFjZU1vZGUiLCJvdXRTdHIiLCJ4bWxSZXN1bHQiLCJpbm5lclRleHQiLCJpbm5lckhUTUwiLCJzcGxpdCIsInN0cmluZ3MiLCJpc0FycmF5IiwiZmxhdCIsImpvaW4iLCJfdHlwZSIsImNvbXBpbGVkRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwicHJvcGVydHlVSWQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCBBdHRyaWJ1dGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQXR0cmlidXRlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0Jhc2UsXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5sZXQgaXNUcmFjZU1vZGUgPSBmYWxzZTtcblxudHlwZSBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IHtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcblx0aXNPcGVuOiBib29sZWFuO1xuXHRkZWZhdWx0QWdncmVnYXRpb24/OiBzdHJpbmc7XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKi9cblx0dmlzaXROb2RlKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSW5zZXJ0cyB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBwbGFjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gTG9hZHMgdGhlXG5cdCAqIGZyYWdtZW50LCB0YWtlcyBjYXJlIG9mIGNhY2hpbmcgKGZvciB0aGUgY3VycmVudCBwcmUtcHJvY2Vzc29yIHJ1bikgYW5kIHZpc2l0cyB0aGVcblx0ICogZnJhZ21lbnQncyBjb250ZW50IG9uY2UgaXQgaGFzIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGFuZFxuXHQgKiBwdXQgaW50byBwbGFjZS4gTG9hZGluZyBvZiBmcmFnbWVudHMgaXMgYXN5bmNocm9ub3VzIGlmIHRoZSB0ZW1wbGF0ZSB2aWV3IGlzXG5cdCAqIGFzeW5jaHJvbm91cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGcmFnbWVudE5hbWVcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUudXRpbC5fd2l0aH0gb1dpdGhDb250cm9sXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiBBIHN5bmMgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB0aGUgZnJhZ21lbnRcblx0ICogICBoYXMgYmVlbiBpbnNlcnRlZCwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgbG9hZGluZyBvciB2aXNpdGluZ1xuXHQgKiAgIGZhaWxzLlxuXHQgKi9cblx0aW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50OiBzdHJpbmcsIG9FbGVtZW50OiBFbGVtZW50LCBvV2l0aD86IGFueSk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHRnZXRDb250ZXh0KHNQYXRoOiBzdHJpbmcpOiBDb250ZXh0O1xuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hcCBvZiB2YXJpYWJsZXMgd2hpY2hcblx0ICogb3ZlcnJpZGUgY3VycmVudGx5IGtub3duIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lIGluIDxjb2RlPnRoaXM8L2NvZGU+XG5cdCAqIHBhcmVudCBpbnRlcmZhY2Ugb3IgcmVwbGFjZSB0aGVtIGFsdG9nZXRoZXIuIEVhY2ggdmFyaWFibGUgbmFtZSBiZWNvbWVzIGFcblx0ICogbmFtZWQgbW9kZWwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGJpbmRpbmcgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSB0aGVcblx0ICogWE1MIHRlbXBsYXRlIGluIHRoZSB1c3VhbCB3YXksIHRoYXQgaXMsIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb24gbGlrZVxuXHQgKiA8Y29kZT5cInt2YXI+c29tZS9yZWxhdGl2ZS9wYXRofVwiPC9jb2RlPiAoc2VlIGV4YW1wbGUpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21WYXJpYWJsZXM9e31dXG5cdCAqICAgTWFwIGZyb20gdmFyaWFibGUgbmFtZSAoc3RyaW5nKSB0byB2YWx1ZSAoe0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2t9XG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogYW55LCBiUmVwbGFjZT86IGJvb2xlYW4pOiBJQ2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIFR5cGVndWFyZCBmb3IgY2hlY2tpbmcgaWYgYSBidWlsZGluZyBibG9jayB1c2UgQVBJIDEuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzaW5nIEFQSSAxLlxuICovXG5mdW5jdGlvbiBpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gaXMgQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSB7XG5cdHJldHVybiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogYW55LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRraW5kXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIkVHlwZVwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc05hbWU6IGFueSwgb01ldGFkYXRhOiBhbnksIG1Db250ZXh0czogYW55LCBvTm9kZTogYW55KSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IGFueSA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvTm9kZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzS2V5ID0gb05vZGUuYXR0cmlidXRlc1tpS2V5XS5uYW1lO1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1tzS2V5XSA9IHRydWU7XG5cdH0pO1xuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmNvbnN0IFNBUF9VSV9NT0RFTF9DT05URVhUID0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fSxcblx0XHRcdFwiY3VzdG9tRGF0YVwiOiB7XG5cdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRcdGxldCBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHRzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gTWVyZ2UgZXZlbnRzIGludG8gcHJvcGVydGllcyBhcyB0aGV5IGFyZSBoYW5kbGVkIGlkZW50aWNhbGx5XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKHNFdmVudE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzRXZlbnROYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHNbc0V2ZW50TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdFx0Zm91bmREZWZhdWx0QWdncmVnYXRpb24gPSBzUHJvcGVydHlOYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uOiBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbixcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzLFxuXHRcdFx0aXNPcGVuOiBpc09wZW5cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge1xuXHRcdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdGJEb05vdFJlc29sdmU6IGJvb2xlYW4sXG5cdGlzT3BlbjogYm9vbGVhblxuKSB7XG5cdGxldCBvTWV0YWRhdGFDb250ZXh0O1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzQXR0cmlidXRlVmFsdWUpO1xuXHRcdGlmICghb01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhID0gbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlLCBvRGF0YSk7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICgoc0F0dHJpYnV0ZU5hbWUgPT09IFwibWV0YVBhdGhcIiAmJiBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoKSB8fCBzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRcdFx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogc01ldGFQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0XHRcdHBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0XG5cdFx0XHRcdFx0XHQ/IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0LmdldFBhdGgoc0F0dHJpYnV0ZVZhbHVlKVxuXHRcdFx0XHRcdFx0OiBzQXR0cmlidXRlVmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b01ldGFkYXRhQ29udGV4dHM6IGFueSxcblx0YXBpVmVyc2lvbj86IG51bWJlclxuKSB7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogYW55ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uUHJvcGVydGllcyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzO1xuXHRjb25zdCBvRGVmaW5pdGlvbkNvbnRleHRzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHM7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXG5cdC8vIFJldHJpZXZlIHByb3BlcnRpZXMgdmFsdWVzXG5cdGNvbnN0IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvblByb3BlcnRpZXMpO1xuXHRsZXQgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0Zm9yIChjb25zdCBzS2V5VmFsdWUgb2YgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cykge1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNjcm9zcyBtYWNyb3Ncblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdFx0aWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpICYmIGlzUHVibGljICYmICFvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYykge1xuXHRcdFx0TG9nLmVycm9yKGBQcm9wZXJ0eSAke3NLZXlWYWx1ZX0gd2FzIGlnbm9yZWQgYXMgaXQgaXMgbm90IGludGVuZGVkIGZvciBwdWJsaWMgdXNhZ2VgKTtcblx0XHR9IGVsc2UgaWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpKSB7XG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdEF0dHJpYnV0ZShvTm9kZSwgb05vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oc0tleVZhbHVlKSBhcyBBdHRyKTtcblx0XHRcdGxldCB2VmFsdWU6IGFueSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyICYmIHR5cGVvZiB2VmFsdWUgPT09IFwic3RyaW5nXCIgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHR2VmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIFNvcnQga2V5cyB0byBiZSBzdXJlIGNvbnRleHRQYXRoIGlzIGJlZm9yZSBtZXRhUGF0aCAoIHllcyBJJ20gZGVzcGVyYXRlIClcblx0YURlZmluaXRpb25Db250ZXh0c0tleXMgPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zb3J0KGZ1bmN0aW9uIChhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuXHRcdHJldHVybiBhID4gYiA/IDEgOiAtMTtcblx0fSk7XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQsIG9NZXRhZGF0YUNvbnRleHRzKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiICYmICFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkgfHxcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IHByb3BlcnR5VmFsdWVzIH07XG59XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbjogRWxlbWVudCkge1xuXHRjb25zdCBvT3V0T2JqZWN0czogYW55ID0ge307XG5cdGlmIChvQWdncmVnYXRpb24gJiYgb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9BZ2dyZWdhdGlvbi5jaGlsZHJlbjtcblx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRjb25zdCBjaGlsZERlZmluaXRpb24gPSBjaGlsZHJlbltjaGlsZElkeF07XG5cdFx0XHRsZXQgY2hpbGRLZXkgPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIHx8IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHRcdGlmIChjaGlsZEtleSkge1xuXHRcdFx0XHRjaGlsZEtleSA9IGBJbmxpbmVYTUxfJHtjaGlsZEtleX1gO1xuXHRcdFx0XHRjaGlsZERlZmluaXRpb24uc2V0QXR0cmlidXRlKFwia2V5XCIsIGNoaWxkS2V5KTtcblx0XHRcdFx0b091dE9iamVjdHNbY2hpbGRLZXldID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcInBsYWNlbWVudFwiKSxcblx0XHRcdFx0XHRcdGFuY2hvcjogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImFuY2hvclwiKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHlwZTogXCJTbG90XCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9PdXRPYmplY3RzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdGFwaVZlcnNpb24/OiBudW1iZXJcbikge1xuXHRjb25zdCBvQWdncmVnYXRpb25zOiBhbnkgPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhcGlWZXJzaW9uICE9PSAyKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyB0byByZXNvbHZlIHRlbXBsYXRpbmcgaW5zdHJ1Y3Rpb25zXG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdH1cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdC8vIE9iamVjdCBUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSB7fTtcblx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXVtvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLmxvY2FsTmFtZV0gPVxuXHRcdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXNbYXR0cmlidXRlSW5kZXggYXMgYW55XS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGE6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdGxldCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICYmIG9NZXRhZGF0YUFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5zbG90KSB8fCBzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApIGFzIEVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIGFueSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvTmV3Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5mcmFnbWVudCB8fCBgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXG5cdGNvbnN0IHNOYW1lID0gXCJ0aGlzXCI7XG5cblx0Y29uc3QgbUNvbnRleHRzOiBhbnkgPSB7fTtcblx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHQvLyBUT0RPIDAwMDEgTW92ZSB0aGlzIGVsc2V3aGVyZSB0aGlzIGlzIHdlaXJkIDopXG5cdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl1cblx0XHRcdC5nZXRSZXNvdXJjZUJ1bmRsZSgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0UmVzb3VyY2VNb2RlbC5zZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUob1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdGNvbnN0IG9NZXRhZGF0YSA9IHByZXBhcmVNZXRhZGF0YShidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5tZXRhZGF0YSwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuKTtcblxuXHQvL0luamVjdCBzdG9yYWdlIGZvciBtYWNyb3Ncblx0aWYgKCFvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0pIHtcblx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0fVxuXG5cdC8vIEZpcnN0IG9mIGFsbCB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBhdHRyaWJ1dGVzXG5cdGNvbnN0IHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlcyB9ID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdFx0b01ldGFkYXRhLFxuXHRcdG9TZXR0aW5ncyxcblx0XHRvTm9kZSxcblx0XHRpc1B1YmxpYyxcblx0XHRvVmlzaXRvcixcblx0XHRtQ29udGV4dHMsXG5cdFx0b01ldGFkYXRhQ29udGV4dHMsXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvblxuXHQpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXHRcdGlmIChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZSkge1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5jcmVhdGUuY2FsbChcblx0XHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzLFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0XHRvQWdncmVnYXRpb25zLFxuXHRcdFx0XHRpc1B1YmxpY1xuXHRcdFx0KTtcblx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdLmNvbXB1dGVkKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc01ldGFkYXRhTmFtZV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bGV0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgIXRhcmdldE9iamVjdC5nZXRPYmplY3QpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gdGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik7XG5cdFx0bUNvbnRleHRzW3NOYW1lXSA9IG9BdHRyaWJ1dGVzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdGxldCBvUHJldmlvdXNNYWNyb0luZm86IGFueTtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBvVGVtcGxhdGU7XG5cdFx0XHRcdGxldCBhZGREZWZhdWx0TmFtZXNwYWNlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gb0luc3RhbmNlLmdldFRlbXBsYXRlKCk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0XHRcdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2U7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHByb2Nlc3NDdXN0b21EYXRhKTtcblx0XHRcdGlmIChvTWFjcm9FbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9TbG90RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cdFx0Y29uc3QgdHJhY2VEZXRhaWxzID0ge1xuXHRcdFx0aW5pdGlhbFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdHJlc29sdmVkUHJvcGVydGllczoge30gYXMgYW55LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHByb3BlcnR5VmFsdWUuaXNBICYmIHByb3BlcnR5VmFsdWUuaXNBKFNBUF9VSV9NT0RFTF9DT05URVhUKSkge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAoIWluaXRpYWxLZXlzLmluY2x1ZGVzKHByb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoU0FQX1VJX01PREVMX0NPTlRFWFQpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBlcnJvckFueSA9IGUgYXMgYW55O1xuXHRcdExvZy5lcnJvcihlcnJvckFueSwgZXJyb3JBbnkpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdGVycm9yQW55LnN0YWNrXG5cdFx0KTtcblx0XHRjb25zdCBvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3IsIHRydWUpO1xuXHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSBhcyBhbnkpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0czogYW55LCBvVmlzaXRvcjogYW55LCBvQ3R4OiBhbnksIG9NZXRhZGF0YUNvbnRleHRzOiBhbnkpIHtcblx0Y29uc3Qgc0tleSA9IG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZDtcblxuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0pOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2UgaWYgKCFtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdKSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0uZ2V0Q29udGV4dChvQ3R4LnBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9XG5cblx0XHRvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSA9IG1Db250ZXh0c1tzS2V5XTsgLy8gbWFrZSBpdCBhdmFpbGFibGUgaW5zaWRlIG1ldGFkYXRhQ29udGV4dHMgSlNPTiBvYmplY3Rcblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvL2NvbnNvbGUuZXJyb3IoZXgpO1xuXHRcdC8vIGlnbm9yZSB0aGUgY29udGV4dCBhcyB0aGlzIGNhbiBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoZSBtb2RlbCBpcyBub3QgcmVhZHksIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3Jcblx0XHQvLyBwcm92aWRpbmcgYWZ0ZXJ3YXJkc1xuXHRcdC8vIFRPRE8gMDAwMiBub3QgeWV0IGltcGxlbWVudGVkXG5cdFx0Ly9tQ29udGV4dHNbXCJfJGVycm9yXCJdLm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIHNLZXksIGV4KTtcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiB2b2lkIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHQob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHQpO1xuXHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciwgdHJ1ZSksXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfWB9XCIgLz5gO1xuXHR9XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiAgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCIgY29yZTpyZXF1aXJlPVwie0JCRjonc2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdCR7ZXJyb3JMYWJlbHN9XHRcdFx0XG5cdFx0XHRcdCR7ZXJyb3JTdGFja31cblx0XHRcdFx0PGdyaWQ6Q1NTR3JpZCBncmlkVGVtcGxhdGVSb3dzPVwiZnJcIiBncmlkVGVtcGxhdGVDb2x1bW5zPVwicmVwZWF0KDIsMWZyKVwiIGdyaWRHYXA9XCIxcmVtXCIgeG1sbnM6Z3JpZD1cInNhcC51aS5sYXlvdXQuY3NzZ3JpZFwiID5cblx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIkhvdyB0aGUgYnVpbGRpbmcgYmxvY2sgd2FzIGNhbGxlZFwiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cInhtbFwiIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKHhtbEZyYWdtZW50LnJlcGxhY2VBbGwoXCImZ3Q7XCIsIFwiPlwiKSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvZ3JpZDpDU1NHcmlkPlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdG15U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWVzO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBhZGREZWZhdWx0TmFtZXNwYWNlcyBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIGRlZmF1bHQgbmFtZXNwYWNlXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50IHtcblx0aWYgKGFkZERlZmF1bHROYW1lc3BhY2VzKSB7XG5cdFx0eG1sU3RyaW5nID0gYDx0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0eG1sbnM6dGVtcGxhdGU9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiXG5cdFx0XHRcdFx0XHR4bWxuczptPVwic2FwLm1cIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWFjcm9zPVwic2FwLmZlLm1hY3Jvc1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWRjPVwic2FwLnVpLm1kY1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWwgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbCAmJiB2YWwucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZykge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0ICYmIHhtbFJlc3VsdD8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0cmV0dXJuIGNyZWF0ZUVycm9yWE1MKFtlcnJvck1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF1dLCBvdXRTdHIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvdXRTdHI7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgb2JqZWN0IGNhc2UuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogYW55W10pID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIChkZXRlcm1pbmVkIGJ5IF90eXBlKSB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVzW2ldKSAmJiB2YWx1ZXNbaV0ubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVzW2ldWzBdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWVzW2ldLmZsYXQoNSkuam9pbihcIlxcblwiKS50cmltKCk7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZXNbaV0/Ll90eXBlKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZXNbaV0pO1xuXHRcdFx0b3V0U3RyICs9IGNvbXBpbGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkID8gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKSA6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uZ2V0VGVtcGxhdGUpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZ2V0VGVtcGxhdGUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdG91dFN0ciArPSBcInt0aGlzPnVuZGVmaW5lZFZhbHVlfVwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0aWYgKHZhbHVlc1tpXS5pc0E/LihcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldICYmIHR5cGVvZiB2YWx1ZXNbaV0gPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlc1tpXS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWVzW2ldLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWVzW2ldKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdHJldHVybiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHIpO1xuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBd0tPLGdCQUFnQkEsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQztJQUMzQyxJQUFJLE9BQU9GLE1BQU0saUJBQWIsS0FBbUMsVUFBdkMsRUFBbUQ7TUFDbEQsSUFBSUcsUUFBUSxHQUFHSCxNQUFNLGlCQUFOLEVBQWY7TUFBQSxJQUEwQ0ksSUFBMUM7TUFBQSxJQUFnREMsSUFBaEQ7TUFBQSxJQUFzREMsTUFBdEQ7O01BQ0EsU0FBU0MsTUFBVCxDQUFnQkMsTUFBaEIsRUFBd0I7UUFDdkIsSUFBSTtVQUNILE9BQU8sQ0FBQyxDQUFDSixJQUFJLEdBQUdELFFBQVEsQ0FBQ00sSUFBVCxFQUFSLEVBQXlCQyxJQUExQixLQUFtQyxDQUFDUixLQUFELElBQVUsQ0FBQ0EsS0FBSyxFQUFuRCxDQUFQLEVBQStEO1lBQzlETSxNQUFNLEdBQUdQLElBQUksQ0FBQ0csSUFBSSxDQUFDTyxLQUFOLENBQWI7O1lBQ0EsSUFBSUgsTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQXJCLEVBQTJC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