@sapui5/sap.fe.core 1.102.2 → 1.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,7 +2,7 @@
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/UriParameters", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/CheckBox", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, UriParameters, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, FPMHelper, ModelHelper, FELibrary, Button, CheckBox, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/CheckBox", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, FPMHelper, ModelHelper, FELibrary, Button, CheckBox, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
6
6
  "use strict";
7
7
 
8
8
  var CreationMode = FELibrary.CreationMode;
@@ -57,12 +57,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
57
57
  *
58
58
  * @memberof sap.fe.core.TransactionHelper
59
59
  * @static
60
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be validated
61
- * @param {object} [mParameters] Can contain the following attributes:
62
- * * @param {object} [mParameters.data] A map of data that should be validated
63
- * * @param {string} [mParameters.customValidationFunction] A string representing the path to the validation function
64
- * @param {object} oView Contains the object of the current view
65
- * @returns {Promise} Promise resolves with result of the custom validation function
60
+ * @param oContext Context of the document to be validated
61
+ * @param [mParameters] Can contain the following attributes:
62
+ * @param [mParameters.data] A map of data that should be validated
63
+ * @param [mParameters.customValidationFunction] A string representing the path to the validation function
64
+ * @param oView Contains the object of the current view
65
+ * @returns Promise resolves with result of the custom validation function
66
66
  * @ui5-restricted
67
67
  * @final
68
68
  */
@@ -86,17 +86,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
86
86
  *
87
87
  * @memberof sap.fe.core.TransactionHelper
88
88
  * @static
89
- * @param {sap.ui.model.odata.v4.ODataListBinding} oMainListBinding OData V4 ListBinding object
90
- * @param {object} [mInParameters] Optional, can contain the following attributes:
91
- * @param {map} [mInParameters.data] A map of data that should be sent within the POST
92
- * @param {string} [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
93
- * @param {map} [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
94
- * @param {map} [mInParameters.inactive] If set, the context is set as inactive for empty rows
89
+ * @param oMainListBinding OData V4 ListBinding object
90
+ * @param [mInParameters] Optional, can contain the following attributes:
91
+ * @param [mInParameters.data] A map of data that should be sent within the POST
92
+ * @param [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
93
+ * @param [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
94
+ * @param [mInParameters.inactive] If set, the context is set as inactive for empty rows
95
95
  * @param oResourceBundle
96
96
  * @param messageHandler
97
97
  * @param bFromCopyPaste
98
98
  * @param oView The current view
99
- * @returns {Promise} Promise resolves with new binding context
99
+ * @returns Promise resolves with new binding context
100
100
  * @ui5-restricted
101
101
  * @final
102
102
  */
@@ -120,14 +120,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
120
120
  var mBindingParameters = {
121
121
  "$$patchWithoutSideEffects": true
122
122
  };
123
- var sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
123
+ var sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
124
124
  var sBusyPath = "/busy";
125
- var sFunctionName = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") || oMetaModel.getObject(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
125
+ var sFunctionName = oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) || oMetaModel.getObject("".concat(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)), "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"));
126
126
  var bFunctionOnNavProp;
127
127
  var oNewDocumentContext;
128
128
 
129
129
  if (sFunctionName) {
130
- if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
130
+ if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
131
131
  bFunctionOnNavProp = true;
132
132
  } else {
133
133
  bFunctionOnNavProp = false;
@@ -153,7 +153,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
153
153
  if (mParameters.busyMode === "Local") {
154
154
  // in case of local busy mode we use the list binding name
155
155
  // there's no APY yet so we have to use the .sId TODO provide a public method?
156
- sBusyPath = "/busyLocal/" + oMainListBinding.sId;
156
+ sBusyPath = "/busyLocal/".concat(oMainListBinding.sId);
157
157
  }
158
158
 
159
159
  mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
@@ -178,10 +178,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
178
178
  if (sFunctionName) {
179
179
  //bound to the source entity:
180
180
  if (bFunctionOnNavProp) {
181
- sFunctionPath = oMainListBinding.getContext() && oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()) + "/" + sFunctionName;
181
+ sFunctionPath = oMainListBinding.getContext() && "".concat(oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()), "/").concat(sFunctionName);
182
182
  oFunctionContext = oMainListBinding.getContext();
183
183
  } else {
184
- sFunctionPath = oMainListBinding.getHeaderContext() && oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()) + "/" + sFunctionName;
184
+ sFunctionPath = oMainListBinding.getHeaderContext() && "".concat(oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()), "/").concat(sFunctionName);
185
185
  oFunctionContext = oMainListBinding.getHeaderContext();
186
186
  }
187
187
  }
@@ -201,7 +201,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
201
201
  return undefined;
202
202
  }
203
203
  }).catch(function (oError) {
204
- Log.error("Error while executing the function " + sFunctionName, oError);
204
+ Log.error("Error while executing the function ".concat(sFunctionName), oError);
205
205
  throw oError;
206
206
  }).then(function (oData) {
207
207
  mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
@@ -284,9 +284,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
284
284
  *
285
285
  * @memberof sap.fe.core.TransactionHelper
286
286
  * @static
287
- * @param {sap.ui.model.odata.v4.Context[]} aContexts Contexts Either one context or an array with contexts to be deleted
287
+ * @param aContexts Contexts Either one context or an array with contexts to be deleted
288
288
  * @param bFindActiveContexts
289
- * @returns {Array} Array of the active contexts
289
+ * @returns Array of the active contexts
290
290
  */
291
291
  ;
292
292
 
@@ -299,12 +299,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
299
299
  var oMetaModel = oContext.getModel().getMetaModel();
300
300
  var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
301
301
 
302
- if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot")) {
302
+ if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot"))) {
303
303
  var bIsActiveEntity = oContext.getObject().IsActiveEntity,
304
304
  bHasActiveEntity = oContext.getObject().HasActiveEntity;
305
305
 
306
306
  if (!bIsActiveEntity && bHasActiveEntity) {
307
- var oActiveContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext();
307
+ var oActiveContext = oContext.getModel().bindContext("".concat(oContext.getPath(), "/SiblingEntity")).getBoundContext();
308
308
  aResult.push(oActiveContext);
309
309
  }
310
310
  }
@@ -314,8 +314,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
314
314
  return Promise.all(activeContexts.map(function (oContext) {
315
315
  return oContext.requestCanonicalPath().then(function () {
316
316
  return oContext;
317
- }, function () {
318
- return;
319
317
  });
320
318
  }));
321
319
  };
@@ -343,9 +341,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
343
341
  }
344
342
 
345
343
  if (aContexts.length === 1) {
346
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
344
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
347
345
  } else {
348
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
346
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
349
347
  }
350
348
  }
351
349
  /**
@@ -353,19 +351,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
353
351
  *
354
352
  * @memberof sap.fe.core.TransactionHelper
355
353
  * @static
356
- * @param {sap.ui.model.odata.v4.Context} vContexts Contexts Either one context or an array with contexts to be deleted
357
- * @param {object} mParameters Optional, can contain the following attributes:
358
- * @param {string} mParameters.title Title of the object to be deleted
359
- * @param {string} mParameters.description Description of the object to be deleted
360
- * @param {integer} mParameters.numberOfSelectedContexts Number of objects selected
361
- * @param {boolean} mParameters.noDialog To disable the confirmation dialog
354
+ * @param vInContexts Contexts Either one context or an array with contexts to be deleted
355
+ * @param mParameters Optional, can contain the following attributes:
356
+ * @param mParameters.title Title of the object to be deleted
357
+ * @param mParameters.description Description of the object to be deleted
358
+ * @param mParameters.numberOfSelectedContexts Number of objects selected
359
+ * @param mParameters.noDialog To disable the confirmation dialog
362
360
  * @param oResourceBundle
363
361
  * @param messageHandler
364
- * @returns {Promise}
362
+ * @returns A Promise resolved once the document are deleted
365
363
  */
366
364
  ;
367
365
 
368
- _proto.deleteDocument = function deleteDocument(vContexts, mParameters, oResourceBundle, messageHandler) {
366
+ _proto.deleteDocument = function deleteDocument(vInContexts, mParameters, oResourceBundle, messageHandler) {
369
367
  var fnReject,
370
368
  fnResolve,
371
369
  aDeletableContexts = [],
@@ -379,13 +377,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
379
377
  oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
380
378
  var aParams;
381
379
  var oDeleteMessage = {
382
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
380
+ title: oResourceBundleCore.getText("C_COMMON_DELETE")
383
381
  };
384
382
  messageHandling.removeBoundTransitionMessages();
385
383
  BusyLocker.lock(this.oLockObject);
384
+ var vContexts;
386
385
 
387
- if (!Array.isArray(vContexts)) {
388
- vContexts = [vContexts];
386
+ if (Array.isArray(vInContexts)) {
387
+ vContexts = vInContexts;
388
+ } else {
389
+ vContexts = [vInContexts];
389
390
  }
390
391
 
391
392
  Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
@@ -396,8 +397,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
396
397
  var oContextData = vContexts[i].getObject();
397
398
 
398
399
  if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
399
- MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle), {
400
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
400
+ var sLockedUser = "";
401
+ var draftAdminData = oContextData && oContextData.DraftAdministrativeData;
402
+
403
+ if (draftAdminData) {
404
+ sLockedUser = draftAdminData["InProcessByUser"];
405
+ }
406
+
407
+ aParams = [sLockedUser];
408
+ MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle, aParams), {
409
+ title: oResourceBundleCore.getText("C_COMMON_DELETE"),
401
410
  onClose: fnReject
402
411
  });
403
412
  return;
@@ -409,63 +418,87 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
409
418
 
410
419
  if (mParameters.title) {
411
420
  if (mParameters.description) {
412
- aParams = [mParameters.title, mParameters.description];
421
+ aParams = [mParameters.title + " ", mParameters.description];
413
422
  } else {
414
423
  aParams = [mParameters.title, ""];
415
424
  }
416
425
 
417
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
426
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
418
427
  } else {
419
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
428
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
420
429
  }
421
430
 
422
431
  aDeletableContexts = vContexts;
423
432
  } else {
424
433
  oDeleteMessage = {
425
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
434
+ title: oResourceBundleCore.getText("C_COMMON_DELETE")
426
435
  };
427
436
 
428
437
  if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
429
438
  aDeletableContexts = vContexts;
430
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
439
+ var oLineContextData = vContexts[0].getObject();
440
+
441
+ if (mParameters.title && mParameters.title.path) {
442
+ var _sTitle = oLineContextData[mParameters.title.path];
443
+ var sKey = CommonUtils.getKeys(that._oAppComponent.getMetaModel(), vContexts[0].getPath(), mParameters.entitySetName);
444
+ var sKeyValue = sKey ? oLineContextData[sKey] : undefined;
445
+ var sDescription = mParameters.description && mParameters.description.path ? oLineContextData[mParameters.description.path] : undefined;
446
+
447
+ if (_sTitle) {
448
+ if (sDescription) {
449
+ aParams = [_sTitle + " ", sDescription];
450
+ } else {
451
+ aParams = [_sTitle, ""];
452
+ }
453
+
454
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
455
+ } else if (sKeyValue) {
456
+ aParams = [sKeyValue, ""];
457
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
458
+ } else {
459
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
460
+ }
461
+ } else {
462
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
463
+ }
431
464
  } else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
432
465
  //only one unsaved object
433
466
  aDeletableContexts = mParameters.unSavedContexts;
434
- var draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
467
+ var _draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
435
468
  var sLastChangedByUser = "";
436
469
 
437
- if (draftAdminData) {
438
- sLastChangedByUser = draftAdminData["LastChangedByUserDescription"] || draftAdminData["LastChangedByUser"] || "";
470
+ if (_draftAdminData) {
471
+ sLastChangedByUser = _draftAdminData["LastChangedByUserDescription"] || _draftAdminData["LastChangedByUser"] || "";
439
472
  }
440
473
 
441
474
  aParams = [sLastChangedByUser];
442
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
475
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
443
476
  } else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
444
477
  //only multiple unsaved objects
445
478
  aDeletableContexts = mParameters.unSavedContexts;
446
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
479
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
447
480
  } else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
448
481
  //only unsaved, locked ,deletable objects but not non-deletable objects
449
482
  aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
450
- oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
483
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
451
484
  } else {
452
485
  //if non-deletable objects exists along with any of unsaved ,deletable objects
453
486
  aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
454
487
  cannotBeDeletedTextVisible = true;
455
- oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName);
456
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
488
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, [aDeletableContexts.length], mParameters.entitySetName);
489
+ oDeleteMessage.nonDeletableText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle);
457
490
  }
458
491
 
459
492
  if (mParameters.lockedContexts.length == 1) {
460
493
  //setting the locked text if locked objects exist
461
494
  isLockedTextVisible = true;
462
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
495
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
463
496
  }
464
497
 
465
498
  if (mParameters.lockedContexts.length > 1) {
466
499
  //setting the locked text if locked objects exist
467
500
  isLockedTextVisible = true;
468
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
501
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
469
502
  }
470
503
 
471
504
  if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
@@ -475,15 +508,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
475
508
  aDeletableContexts = mParameters.unSavedContexts;
476
509
 
477
510
  if (mParameters.unSavedContexts.length === 1) {
478
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
511
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
479
512
  } else {
480
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
513
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
481
514
  }
482
515
  } else {
483
516
  if (mParameters.unSavedContexts.length === 1) {
484
- oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
517
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
485
518
  } else {
486
- oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
519
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
487
520
  }
488
521
 
489
522
  isCheckBoxVisible = true;
@@ -491,13 +524,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
491
524
  }
492
525
 
493
526
  if (cannotBeDeletedTextVisible && isLockedTextVisible) {
494
- //if both locked and non-deletable objects exist along with deletable objects
527
+ //if non-deletable objects exist along with deletable objects
528
+ var sNonDeletableContextText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle); //if both locked and non-deletable objects exist along with deletable objects
529
+
530
+
495
531
  if (mParameters.unSavedContexts.length > 1) {
496
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
532
+ oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
497
533
  }
498
534
 
499
535
  if (mParameters.unSavedContexts.length == 1) {
500
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
536
+ oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
501
537
  }
502
538
  }
503
539
  }
@@ -527,7 +563,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
527
563
  visible: isCheckBoxVisible
528
564
  })]
529
565
  });
530
- var sTitle = oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE");
566
+ var sTitle = oResourceBundleCore.getText("C_COMMON_DELETE");
531
567
 
532
568
  var fnConfirm = function () {
533
569
  bDialogConfirmed = true;
@@ -585,7 +621,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
585
621
  content: [oContent],
586
622
  ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
587
623
  beginButton: new Button({
588
- text: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
624
+ text: oResourceBundleCore.getText("C_COMMON_DELETE"),
589
625
  type: "Emphasized",
590
626
  press: function () {
591
627
  oDialog.close();
@@ -629,10 +665,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
629
665
  *
630
666
  * @memberof sap.fe.core.TransactionHelper
631
667
  * @static
632
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document
633
- * @param {object} oView Current view
668
+ * @param oContext Context of the active document
669
+ * @param oView Current view
634
670
  * @param messageHandler
635
- * @returns {Promise} Promise resolves with the new draft context in case of draft programming model
671
+ * @returns Promise resolves with the new draft context in case of draft programming model
636
672
  * @ui5-restricted
637
673
  * @final
638
674
  */
@@ -685,13 +721,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
685
721
  *
686
722
  * @memberof sap.fe.core.TransactionHelper
687
723
  * @static
688
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be canceled or deleted
689
- * @param {object} [mInParameters] Optional, can contain the following attributes:
690
- * @param {sap.m.Button} mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
691
- * @param {boolean} mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
724
+ * @param oContext Context of the document to be canceled or deleted
725
+ * @param [mInParameters] Optional, can contain the following attributes:
726
+ * @param mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
727
+ * @param mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
692
728
  * @param oResourceBundle
693
729
  * @param messageHandler
694
- * @returns {Promise} Promise resolves with ???
730
+ * @returns Promise resolves with ???
695
731
  * @ui5-restricted
696
732
  * @final
697
733
  */
@@ -716,7 +752,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
716
752
  sProgrammingModel = sPModel;
717
753
 
718
754
  if (sPModel === ProgrammingModel.Draft) {
719
- var draftDataContext = oModel.bindContext(oParamsContext.getPath() + "/DraftAdministrativeData").getBoundContext();
755
+ var draftDataContext = oModel.bindContext("".concat(oParamsContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
720
756
 
721
757
  if (!that._bIsModified) {
722
758
  return draftDataContext.requestObject().then(function (draftAdminData) {
@@ -746,6 +782,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
746
782
  // eslint-disable-next-line default-case
747
783
  switch (sProgrammingModel) {
748
784
  case ProgrammingModel.Draft:
785
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
786
+ // @ts-ignore
749
787
  return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
750
788
  var oDeletePromise;
751
789
 
@@ -757,7 +795,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
757
795
  oDeletePromise = draft.deleteDraft(oParamsContext);
758
796
  return oDeletePromise;
759
797
  } else {
760
- var oActiveContext = oModel.bindContext(oParamsContext.getPath() + "/SiblingEntity").getBoundContext();
798
+ var oActiveContext = oModel.bindContext("".concat(oParamsContext.getPath(), "/SiblingEntity")).getBoundContext();
761
799
  return oActiveContext.requestCanonicalPath().then(function (sPath) {
762
800
  sCanonicalPath = sPath;
763
801
 
@@ -769,7 +807,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
769
807
  return oDeletePromise;
770
808
  }, function () {
771
809
  draft.deleteDraft(oParamsContext);
772
- return;
773
810
  }).then(function () {
774
811
  //oParamsContext.delete() in the previous promise doesnt return anything upon success.
775
812
  if (!sCanonicalPath) {
@@ -788,15 +825,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
788
825
  });
789
826
 
790
827
  case ProgrammingModel.Sticky:
791
- return sticky.discardDocument(oContext).then(function (oContext) {
792
- if (oContext) {
793
- if (oContext.hasPendingChanges()) {
794
- oContext.getBinding().resetChanges();
828
+ return sticky.discardDocument(oContext).then(function (discardedContext) {
829
+ if (discardedContext) {
830
+ if (discardedContext.hasPendingChanges()) {
831
+ discardedContext.getBinding().resetChanges();
795
832
  }
796
833
 
797
834
  if (!that._bCreateMode) {
798
- oContext.refresh();
799
- return oContext;
835
+ discardedContext.refresh();
836
+ return discardedContext;
800
837
  }
801
838
  }
802
839
 
@@ -827,12 +864,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
827
864
  *
828
865
  * @memberof sap.fe.core.TransactionHelper
829
866
  * @static
830
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be saved
867
+ * @param oContext Context of the document to be saved
831
868
  * @param oResourceBundle
832
869
  * @param bExecuteSideEffectsOnError
833
870
  * @param aBindings
834
871
  * @param messageHandler
835
- * @returns {Promise} Promise resolves with ???
872
+ * @returns Promise resolves with ???
836
873
  * @ui5-restricted
837
874
  * @final
838
875
  */
@@ -856,8 +893,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
856
893
  if (sProgrammingModel === ProgrammingModel.Draft) {
857
894
  oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
858
895
  } else if (sProgrammingModel === ProgrammingModel.Sticky) {
859
- var bEnableStrictHandling = UriParameters.fromQuery(window.location.search).get("sap-fe-save-strict-mode") === "true";
860
- oSavePromise = sticky.activateDocument(oContext, bEnableStrictHandling);
896
+ oSavePromise = sticky.activateDocument(oContext);
861
897
  } else {
862
898
  BusyLocker.unlock(that.oLockObject);
863
899
  return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
@@ -867,9 +903,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
867
903
  var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
868
904
  MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
869
905
  that._bIsModified = false;
870
- return messageHandler.showMessageDialog().then(function () {
871
- return oActiveDocument;
872
- });
906
+ return oActiveDocument;
873
907
  }).catch(function (err) {
874
908
  if (aBindings && aBindings.length > 0) {
875
909
  /* The sideEffects are executed only for table items in transient state */
@@ -896,19 +930,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
896
930
  * @static
897
931
  * @name sap.fe.core.TransactionHelper.callAction
898
932
  * @memberof sap.fe.core.TransactionHelper
899
- * @param {string} sActionName The name of the action to be called
900
- * @param {map} [mParameters] Contains the following attributes:
901
- * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
902
- * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
903
- * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
904
- * @param {string} [mParameters.label] A human-readable label for the action
905
- * @param {boolean} [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
906
- * @param {object} oView Contains the object of the current view
933
+ * @param sActionName The name of the action to be called
934
+ * @param [mParameters] Contains the following attributes:
935
+ * @param [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
936
+ * @param [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
937
+ * @param [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
938
+ * @param [mParameters.label] A human-readable label for the action
939
+ * @param [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
940
+ * @param oView Contains the object of the current view
907
941
  * @param messageHandler
908
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
942
+ * @returns Promise resolves with an array of response objects (TODO: to be changed)
909
943
  * @ui5-restricted
910
944
  * @final
911
- **/
945
+ */
912
946
  ;
913
947
 
914
948
  _proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
@@ -990,7 +1024,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
990
1024
  var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
991
1025
  var oMetaModel = oModel.getMetaModel();
992
1026
  var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
993
- var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")) + "/";
1027
+ var sEntitySet = "".concat(sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")), "/");
994
1028
  var oDialogLabelModel = new JSONModel({
995
1029
  title: mParameters.label
996
1030
  });
@@ -1088,9 +1122,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1088
1122
  * @name sap.fe.core.TransactionHelper#_handleActionResponse
1089
1123
  * @memberof sap.fe.core.TransactionHelper
1090
1124
  * @param messageHandler
1091
- * @param {object} mParameters Parameters to be considered for the action.
1092
- * @param {string} sActionName The name of the action to be called
1093
- * @returns {Promise} Promise after message dialog is opened if required.
1125
+ * @param mParameters Parameters to be considered for the action.
1126
+ * @param sActionName The name of the action to be called
1127
+ * @returns Promise after message dialog is opened if required.
1094
1128
  * @ui5-restricted
1095
1129
  * @final
1096
1130
  */
@@ -1131,13 +1165,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1131
1165
  * Shows a popover if it needs to be shown.
1132
1166
  * TODO: Popover is shown if user has modified any data.
1133
1167
  * TODO: Popover is shown if there's a difference from draft admin data.
1168
+ *
1134
1169
  * @static
1135
1170
  * @name sap.fe.core.TransactionHelper._showDiscardPopover
1136
1171
  * @memberof sap.fe.core.TransactionHelper
1137
- * @param {sap.ui.core.Control} oCancelButton The control which will open the popover
1172
+ * @param oCancelButton The control which will open the popover
1138
1173
  * @param bIsModified
1139
1174
  * @param oResourceBundle
1140
- * @returns {Promise} Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1175
+ * @returns Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1141
1176
  * @ui5-restricted
1142
1177
  * @final
1143
1178
  */
@@ -1234,10 +1269,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1234
1269
  * @private
1235
1270
  * @name sap.fe.core.TransactionHelper._getOwnerComponent
1236
1271
  * @memberof sap.fe.core.TransactionHelper
1237
- * @returns {sap.fe.core.AppComponent} The app component
1272
+ * @returns The app component
1238
1273
  * @ui5-restricted
1239
1274
  * @final
1240
- **/
1275
+ */
1241
1276
  ;
1242
1277
 
1243
1278
  _proto._getAppComponent = function _getAppComponent() {
@@ -1268,6 +1303,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1268
1303
  }
1269
1304
  };
1270
1305
 
1306
+ _proto._getNonDeletableText = function _getNonDeletableText(mParameters, vContexts, oResourceBundle) {
1307
+ var aNonDeletableContexts = mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length;
1308
+ return aNonDeletableContexts === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts]) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
1309
+ };
1310
+
1271
1311
  _proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
1272
1312
  // eslint-disable-next-line @typescript-eslint/no-this-alias
1273
1313
  var that = this;
@@ -1287,24 +1327,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1287
1327
  sMetaPath = oMetaModel.getMetaPath(sPath);
1288
1328
 
1289
1329
  for (var i in mFields) {
1290
- aImmutableFields.push(oMetaModel.createBindingContext(sMetaPath + "/" + mFields[i]));
1330
+ aImmutableFields.push(oMetaModel.createBindingContext("".concat(sMetaPath, "/").concat(mFields[i])));
1291
1331
  }
1292
1332
 
1293
1333
  var oImmutableCtxModel = new JSONModel(aImmutableFields);
1294
1334
  var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
1335
+ var aRequiredProperties = CommonUtils.getRequiredPropertiesFromInsertRestrictions(sMetaPath, oMetaModel);
1336
+ var oRequiredPropertyPathsCtxModel = new JSONModel(aRequiredProperties);
1337
+ var oRequiredPropertyPathsCtx = oRequiredPropertyPathsCtxModel.createBindingContext("/");
1295
1338
  return Promise.resolve(XMLPreprocessor.process(oFragment, {
1296
1339
  name: sFragmentName
1297
1340
  }, {
1298
1341
  bindingContexts: {
1299
1342
  entitySet: oEntitySetContext,
1300
- fields: oImmutableCtx
1343
+ fields: oImmutableCtx,
1344
+ requiredProperties: oRequiredPropertyPathsCtx
1301
1345
  },
1302
1346
  models: {
1303
1347
  entitySet: oEntitySetContext.getModel(),
1304
1348
  fields: oImmutableCtx.getModel(),
1305
- metaModel: oMetaModel
1349
+ metaModel: oMetaModel,
1350
+ requiredProperties: oRequiredPropertyPathsCtxModel
1306
1351
  }
1307
- })).then(function (oFragment) {
1352
+ })).then(function (oNewFragment) {
1308
1353
  var aFormElements = [];
1309
1354
  var mFieldValueMap = {};
1310
1355
  var oCreateButton;
@@ -1313,22 +1358,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1313
1358
  return Promise.all(aFormElements.map(function (oFormElement) {
1314
1359
  return oFormElement.getFields()[0];
1315
1360
  }).filter(function (oField) {
1316
- // The continue button should remain disabled in case of error in any field of the create dialog
1317
- return oField.getRequired() || oField.getValueState() === ValueState.Error && oField.getValue() !== "";
1361
+ // The continue button should remain disabled in case of empty required fields.
1362
+ return oField.getRequired() || oField.getValueState() === ValueState.Error;
1318
1363
  }).map(function (oField) {
1319
1364
  var sFieldId = oField.getId();
1320
1365
 
1321
1366
  if (sFieldId in mFieldValueMap) {
1322
1367
  return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
1323
- return oField.getValueState() === ValueState.Error ? undefined : vValue;
1368
+ return oField.getValue() === "" ? undefined : vValue;
1324
1369
  }).catch(function () {
1325
1370
  return undefined;
1326
1371
  });
1327
1372
  }
1328
1373
 
1329
- return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
1374
+ return oField.getValue() === "" ? undefined : oField.getValue();
1330
1375
  })).then(function (aResults) {
1331
1376
  return aResults.every(function (vValue) {
1377
+ if (Array.isArray(vValue)) {
1378
+ vValue = vValue[0];
1379
+ }
1380
+
1332
1381
  return vValue !== undefined && vValue !== null && vValue !== "";
1333
1382
  });
1334
1383
  }).catch(function () {
@@ -1363,7 +1412,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1363
1412
  }
1364
1413
  };
1365
1414
  return Fragment.load({
1366
- definition: oFragment,
1415
+ definition: oNewFragment,
1367
1416
  controller: oController
1368
1417
  }).then(function (oDialogContent) {
1369
1418
  oDialog = new Dialog({
@@ -1373,8 +1422,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1373
1422
  text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
1374
1423
  type: "Emphasized",
1375
1424
  press: function (oEvent) {
1376
- var oCreateButton = oEvent.getSource();
1377
- oCreateButton.setEnabled(false);
1425
+ var createButton = oEvent.getSource();
1426
+ createButton.setEnabled(false);
1378
1427
  BusyLocker.lock(oDialog);
1379
1428
  mParameters.bIsCreateDialog = true;
1380
1429
  return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
@@ -1410,8 +1459,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1410
1459
  reject(oError);
1411
1460
  }).finally(function () {
1412
1461
  BusyLocker.unlock(oDialog);
1413
- oCreateButton.setEnabled(true);
1414
- return messageHandler.showMessages();
1462
+ createButton.setEnabled(true);
1463
+ messageHandler.showMessages();
1415
1464
  });
1416
1465
  }
1417
1466
  },
@@ -1486,8 +1535,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1486
1535
  // this is needed to avoid console errors TO be checked with model colleagues
1487
1536
  oContext.created().then(undefined, function () {
1488
1537
  Log.trace("transient creation context deleted");
1489
- }).catch(function (oError) {
1490
- Log.trace("transient creation context deletion error", oError);
1538
+ }).catch(function (contextError) {
1539
+ Log.trace("transient creation context deletion error", contextError);
1491
1540
  });
1492
1541
 
1493
1542
  if (!mParameters.bIsCreateDialog) {
@@ -1518,14 +1567,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1518
1567
  * @private
1519
1568
  * @name sap.fe.core.TransactionHelper._getNewAction
1520
1569
  * @memberof sap.fe.core.TransactionHelper
1521
- * @param {object} oStartupParameters Startup parameters of the application
1522
- * @param {string} sCreateHash Hash to be checked for action type
1523
- * @param {object} oMetaModel The MetaModel used to check for NewAction parameter
1524
- * @param {string} sMetaPath The MetaPath
1525
- * @returns {string} The name of the action
1570
+ * @param oStartupParameters Startup parameters of the application
1571
+ * @param sCreateHash Hash to be checked for action type
1572
+ * @param oMetaModel The MetaModel used to check for NewAction parameter
1573
+ * @param sMetaPath The MetaPath
1574
+ * @returns The name of the action
1526
1575
  * @ui5-restricted
1527
1576
  * @final
1528
- **/
1577
+ */
1529
1578
  ;
1530
1579
 
1531
1580
  _proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
@@ -1535,7 +1584,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1535
1584
  var sPreferredMode = oStartupParameters.preferredMode[0];
1536
1585
  sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
1537
1586
  } else {
1538
- sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction") || oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction") : undefined;
1587
+ sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction")) || oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction")) : undefined;
1539
1588
  }
1540
1589
 
1541
1590
  return sNewAction;
@@ -1553,30 +1602,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1553
1602
  * @private
1554
1603
  * @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
1555
1604
  * @memberof sap.fe.core.TransactionHelper
1556
- * @param {object} oMetaModel The MetaModel used to check for the NewAction parameter
1557
- * @param {string} sMetaPath The MetaPath
1558
- * @param {string} sNewAction Contains the name of the action to be executed
1559
- * @param {object} oResourceBundleCore ResourceBundle to access the default Create label
1560
- * @returns {string} The label for the Create Action Dialog
1605
+ * @param oMetaModel The MetaModel used to check for the NewAction parameter
1606
+ * @param sMetaPath The MetaPath
1607
+ * @param sNewAction Contains the name of the action to be executed
1608
+ * @param oResourceBundleCore ResourceBundle to access the default Create label
1609
+ * @returns The label for the Create Action Dialog
1561
1610
  * @ui5-restricted
1562
1611
  * @final
1563
- **/
1612
+ */
1564
1613
  ;
1565
1614
 
1566
1615
  _proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
1567
1616
  var fnGetLabelFromLineItemAnnotation = function () {
1568
- if (oMetaModel && oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")) {
1569
- var iLineItemIndex = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem").findIndex(function (oLineItem) {
1617
+ if (oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem"))) {
1618
+ var iLineItemIndex = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem")).findIndex(function (oLineItem) {
1570
1619
  var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
1571
1620
  return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
1572
1621
  });
1573
- return iLineItemIndex > -1 ? oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")[iLineItemIndex].Label : undefined;
1622
+ return iLineItemIndex > -1 ? oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem"))[iLineItemIndex].Label : undefined;
1574
1623
  } else {
1575
1624
  return undefined;
1576
1625
  }
1577
1626
  };
1578
1627
 
1579
- return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject(sMetaPath + "/" + sNewAction + "@com.sap.vocabularies.Common.v1.Label") || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1628
+ return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/").concat(sNewAction, "@com.sap.vocabularies.Common.v1.Label")) || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1580
1629
  };
1581
1630
 
1582
1631
  return TransactionHelper;
@@ -1584,4 +1633,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/UriParameters", "sap/fe/core/Commo
1584
1633
 
1585
1634
  return TransactionHelper;
1586
1635
  }, false);
1587
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2Q29udGV4dHMiLCJmblJlamVjdCIsImZuUmVzb2x2ZSIsImFEZWxldGFibGVDb250ZXh0cyIsImlzTG9ja2VkVGV4dFZpc2libGUiLCJjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSIsImJEaWFsb2dDb25maXJtZWQiLCJhUGFyYW1zIiwib0RlbGV0ZU1lc3NhZ2UiLCJ0aXRsZSIsImdldFRleHQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJvQ29udGV4dERhdGEiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJkcmFmdEFkbWluRGF0YSIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImNvbmNhdCIsImxvY2tlZENvbnRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImNoZWNrQm94VGV4dCIsIm9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wiLCJvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sIiwib0NvbnRlbnQiLCJWQm94IiwiaXRlbXMiLCJUZXh0IiwidmlzaWJsZSIsIkNoZWNrQm94Iiwic2VsZWN0ZWQiLCJzZWxlY3QiLCJvRXZlbnQiLCJnZXRTb3VyY2UiLCJnZXRTZWxlY3RlZCIsInNUaXRsZSIsImZuQ29uZmlybSIsIm9uQmVmb3JlRGVsZXRlUHJvbWlzZSIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiYmluZCIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsImRyYWZ0IiwiZGVsZXRlRHJhZnQiLCJzaG93TWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJnZXRWaXNpYmxlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIndhcm5pbmciLCJlZGl0RG9jdW1lbnQiLCJvRWRpdFByb21pc2UiLCJFcnJvciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsIm9OZXdDb250ZXh0IiwiZXJyIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJvUGFyYW1zQ29udGV4dCIsIm9DYW5jZWxCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJvbkJlZm9yZUNhbmNlbFByb21pc2UiLCJzQ2Fub25pY2FsUGF0aCIsInNQTW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfc2hvd0Rpc2NhcmRQb3BvdmVyIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjb250ZXh0Iiwib0RlbGV0ZVByb21pc2UiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJvU2F2ZVByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiVXJpUGFyYW1ldGVycyIsImZyb21RdWVyeSIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiZ2V0Iiwib0FjdGl2ZURvY3VtZW50IiwiYk5ld09iamVjdCIsImZvckVhY2giLCJvTGlzdEJpbmRpbmciLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJvUHJvbWlzZSIsInNOYW1lIiwic3BsaXQiLCJtb2RlbCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwib0FwcGxpY2FibGVDb250ZXh0RGlhbG9nIiwib0NvbnRyb2xsZXIiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHQiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGVDb250ZXh0IiwiYU5vdEFwcGxpY2FibGVJdGVtcyIsIm9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCIsIkpTT05Nb2RlbCIsIm9Ub3RhbHMiLCJ0b3RhbCIsInNldE1vZGVsIiwic0ZyYWdtZW50TmFtZSIsIm9EaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZ2V0Q2Fub25pY2FsUGF0aCIsInNFbnRpdHlTZXQiLCJzdWJzdHIiLCJvRGlhbG9nTGFiZWxNb2RlbCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsIm1vZGVscyIsIm1ldGFNb2RlbCIsIm9GcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib1BvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJjb250ZXh0VG9Qcm9jZXNzIiwiY2FsbEJvdW5kQWN0aW9uIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiR2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJvTWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTWFuYWdlciIsImVycm9yVG9SZW1vdmUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiYklzTW9kaWZpZWQiLCJmbk9uQWZ0ZXJEaXNjYXJkIiwic2V0RW5hYmxlZCIsIl9vUG9wb3ZlciIsImRldGFjaEFmdGVyQ2xvc2UiLCJvVGV4dCIsIm9CdXR0b24iLCJ3aWR0aCIsIlBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiYmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJfb25GaWVsZENoYW5nZSIsIm9DcmVhdGVCdXR0b24iLCJmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0ZpZWxkIiwib0ZpZWxkUHJvbWlzZSIsImdldFBhcmFtZXRlciIsInZhbHVlIiwic2V0VmFsdWUiLCJnZXRWYWx1ZSIsIm9UcmFuc2llbnRDb250ZXh0IiwibUZpZWxkcyIsIm9QYXJlbnRDb250cm9sIiwiYlN1Y2Nlc3MiLCJnZXRDb250cm9sbGVyIiwiYUltbXV0YWJsZUZpZWxkcyIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0ltbXV0YWJsZUN0eE1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImVudGl0eVNldCIsImZpZWxkcyIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImFSZXN1bHRzIiwiZXZlcnkiLCJiRW5hYmxlZCIsImhhbmRsZUNoYW5nZSIsImhhbmRsZUxpdmVDaGFuZ2UiLCJiSXNDcmVhdGVEaWFsb2ciLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwic3VibWl0QmF0Y2giLCJvUmVzcG9uc2UiLCJiS2VlcERpYWxvZ09wZW4iLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiZ2V0QWdncmVnYXRpb24iLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuQ3JlYXRlQ29tcGxldGVkIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsInByZWZlcnJlZE1vZGUiLCJzUHJlZmVycmVkTW9kZSIsImZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uIiwiaUxpbmVJdGVtSW5kZXgiLCJmaW5kSW5kZXgiLCJvTGluZUl0ZW0iLCJhTGluZUl0ZW1BY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQThCQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBbkM7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLFdBQVcsQ0FBQ0QsVUFBL0I7QUFDQTs7QUFDQSxXQUFTRSxhQUFULENBQXVCQyxXQUF2QixFQUF5QztBQUN4QyxRQUFJQSxXQUFXLElBQUlB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VUFBVSxDQUFDa0IsU0FBWCxDQUFxQmpCLFNBQVMsR0FBRyxHQUFaLEdBQWtCVyxVQUFsQixHQUErQix1Q0FBcEQsQ0FEZixJQUVDa0IsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDc0csT0FBcEIsQ0FBNEIsMENBQTVCLENBSHpCO0FBS0EsSzs7Ozs7U0FHYW5MLGlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFVyaVBhcmFtZXRlcnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvVXJpUGFyYW1ldGVyc1wiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IENoZWNrQm94IGZyb20gXCJzYXAvbS9DaGVja0JveFwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcbmNvbnN0IFZhbHVlU3RhdGUgPSBjb3JlTGlicmFyeS5WYWx1ZVN0YXRlO1xuLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1QYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb0V2ZW50ICovXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHR9XG5cdHJldHVybiBtUGFyYW1ldGVycyB8fCB7fTtcbn1cblxuY2xhc3MgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRfb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRvTG9ja09iamVjdDogYW55O1xuXHRzUHJvZ3JhbW1pbmdNb2RlbD86IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsO1xuXHRfYklzTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDcmVhdGVNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQ29udGludWVEaXNjYXJkOiBib29sZWFuID0gZmFsc2U7XG5cdF9vUG9wb3ZlciE6IFBvcG92ZXI7XG5cdGNvbnN0cnVjdG9yKG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgb0xvY2tPYmplY3Q6IGFueSkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBvQXBwQ29tcG9uZW50O1xuXHRcdHRoaXMub0xvY2tPYmplY3QgPSBvTG9ja09iamVjdDtcblx0fVxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0PzogYW55KTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGlmICghdGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCAmJiBvQ29udGV4dCkge1xuXHRcdFx0bGV0IHNQYXRoO1xuXHRcdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5pc1JlbGF0aXZlKCkgPyBvQ29udGV4dC5nZXRSZXNvbHZlZFBhdGgoKSA6IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHNQYXRoKSkge1xuXHRcdFx0XHR0aGlzLnNQcm9ncmFtbWluZ01vZGVsID0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGFzIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgYSBzaW5nbGV0b24gd2UgZG9uJ3Qgc3RvcmUgdGhlIG5vbiBkcmFmdCBhcyB0aGUgdXNlciBjb3VsZFxuXHRcdFx0XHQvLyBzdGFydCB3aXRoIGEgbm9uIGRyYWZ0IGNoaWxkIHBhZ2UgYW5kIG5hdmlnYXRlcyBiYWNrIHRvIGEgZHJhZnQgZW5hYmxlZCBvbmVcblx0XHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNQcm9ncmFtbWluZ01vZGVsIGFzIHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHZhbGlkYXRlRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9NYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHtzdHJpbmd9IFttSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSB7bWFwfSBbbUluUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7bWFwfSBbbUluUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIGJGcm9tQ29weVBhc3RlXG5cdCAqIEBwYXJhbSBvVmlldyBUaGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRjcmVhdGVEb2N1bWVudChcblx0XHRvTWFpbkxpc3RCaW5kaW5nOiBhbnksXG5cdFx0bUluUGFyYW1ldGVyczogeyBkYXRhPzogYW55OyBidXN5TW9kZT86IHN0cmluZyB8IHVuZGVmaW5lZDsga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGFueTsgaW5hY3RpdmU/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IGFueSxcblx0XHRiRnJvbUNvcHlQYXN0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdG9WaWV3OiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvTW9kZWwgPSBvTWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpLFxuXHRcdFx0c0NyZWF0ZUhhc2ggPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdG9Db21wb25lbnREYXRhID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Q29tcG9uZW50RGF0YSgpLFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRcdHNOZXdBY3Rpb24gPSAhb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKClcblx0XHRcdFx0PyB0aGlzLl9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzLCBzQ3JlYXRlSGFzaCwgb01ldGFNb2RlbCwgc01ldGFQYXRoKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRsZXQgb0NyZWF0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnM6IGFueSA9IHsgXCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzXCI6IHRydWUgfTtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblx0XHRsZXQgc0J1c3lQYXRoID0gXCIvYnVzeVwiO1xuXHRcdGxldCBzRnVuY3Rpb25OYW1lID1cblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIikgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiXG5cdFx0XHQpO1xuXHRcdGxldCBiRnVuY3Rpb25Pbk5hdlByb3A7XG5cdFx0bGV0IG9OZXdEb2N1bWVudENvbnRleHQ6IGFueTtcblx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCIpICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSkgIT09IHNNZXRhUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBzTWVzc2FnZXNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0aWYgKCFvTWFpbkxpc3RCaW5kaW5nKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCaW5kaW5nIHJlcXVpcmVkIGZvciBuZXcgZG9jdW1lbnQgY3JlYXRpb25cIik7XG5cdFx0fVxuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9NYWluTGlzdEJpbmRpbmcpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID09PSBcIkxvY2FsXCIpIHtcblx0XHRcdC8vIGluIGNhc2Ugb2YgbG9jYWwgYnVzeSBtb2RlIHdlIHVzZSB0aGUgbGlzdCBiaW5kaW5nIG5hbWVcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gQVBZIHlldCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgLnNJZCBUT0RPIHByb3ZpZGUgYSBwdWJsaWMgbWV0aG9kP1xuXHRcdFx0c0J1c3lQYXRoID0gXCIvYnVzeUxvY2FsL1wiICsgb01haW5MaXN0QmluZGluZy5zSWQ7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QsIHNCdXN5UGF0aCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlQ29yZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdG9DcmVhdGlvblByb21pc2UgPSB0aGlzLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250ZXh0czogb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRzTWV0YVBhdGgsXG5cdFx0XHRcdFx0XHRzTmV3QWN0aW9uLFxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlQ29yZSBhcyBSZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgYklzTmV3UGFnZUNyZWF0aW9uID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGJJc05ld1BhZ2VDcmVhdGlvblxuXHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIG9WaWV3KVxuXHRcdFx0XHQ6IFtdO1xuXHRcdFx0c0Z1bmN0aW9uTmFtZSA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRsZXQgc0Z1bmN0aW9uUGF0aCwgb0Z1bmN0aW9uQ29udGV4dDtcblx0XHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRcdC8vYm91bmQgdG8gdGhlIHNvdXJjZSBlbnRpdHk6XG5cdFx0XHRcdGlmIChiRnVuY3Rpb25Pbk5hdlByb3ApIHtcblx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgKyBcIi9cIiArIHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRcdFx0b0Z1bmN0aW9uQ29udGV4dCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG9GdW5jdGlvbiA9IHNGdW5jdGlvblBhdGggJiYgb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0XHRcdGlmIChvRnVuY3Rpb24gJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKVswXS4kSXNCb3VuZCkge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvRnVuY3Rpb25Db250ZXh0LCBvTW9kZWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbiBcIiArIHNGdW5jdGlvbk5hbWUsIG9FcnJvcik7XG5cdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSBvRGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIG9EYXRhLCBtUGFyYW1ldGVycy5kYXRhKSA6IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9UcmFuc2llbnRMaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChvTWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKSwgb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvKiAqL1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvVHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKG1QYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoYXQuX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0YU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyxcblx0XHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxldCBvbkJlZm9yZUNyZWF0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWFpbkxpc3RCaW5kaW5nICYmIG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb01haW5MaXN0QmluZGluZy5jcmVhdGUoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuaW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTWFpbkxpc3RCaW5kaW5nLCBvTmV3RG9jdW1lbnRDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb0NyZWF0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGNyZWF0ZSBtb2RlIHNoYWxsIGN1cnJlbnRseSBvbmx5IGJlIHNldCBvbiBjcmVhdGluZyBhIHJvb3QgZG9jdW1lbnRcblx0XHRcdFx0XHR0aGF0Ll9iQ3JlYXRlTW9kZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQgfHwgKG9SZXN1bHQgJiYgb1Jlc3VsdC5yZXNwb25zZSk7XG5cdFx0XHRcdC8vIFRPRE86IHdoZXJlIGRvZXMgdGhpcyBvbmUgY29taW5nIGZyb20/Pz9cblx0XHRcdFx0aWYgKG9SZXN1bHQgJiYgb1Jlc3VsdC5iQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkKSB7XG5cdFx0XHRcdFx0dGhhdC5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBmb3IgaW5zdGFuY2UsIG9uIGNhbmNlbCBvZiBjcmVhdGUgZGlhbG9nLCB0aGUgcHJvbWlzZSBpcyByZWplY3RlZFxuXHRcdFx0XHRcdC8vIGEgcmV0dXJuIGhlcmUgd291bGQgcmVzdG9yZSB0aGUgcHJvbWlzZSBjaGFpbiBhbmQgcmVzdWx0IGluIGVycm9ycyB3aGlsZSByb3V0aW5nXG5cdFx0XHRcdFx0Ly8gc29sdXRpb24gLSAgcmVqZWN0IGhlcmUgYXMgd2VsbFxuXHRcdFx0XHRcdGlmIChvRXJyb3IgJiYgb0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ICYmIG9OZXdEb2N1bWVudENvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBGaW5kIHRoZSBhY3RpdmUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cywgb25seSBmb3IgdGhlIGRyYWZ0IHJvb3RzLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0W119IGFDb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBiRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgdGhlIGFjdGl2ZSBjb250ZXh0c1xuXHQgKi9cblx0ZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzKGFDb250ZXh0czogYW55W10sIGJGaW5kQWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdGlmICghYkZpbmRBY3RpdmVDb250ZXh0cykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGFDb250ZXh0cy5yZWR1Y2UoZnVuY3Rpb24gKGFSZXN1bHQ6IGFueSwgb0NvbnRleHQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRpZiAob01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSkge1xuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSxcblx0XHRcdFx0XHRiSGFzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRpZiAoIWJJc0FjdGl2ZUVudGl0eSAmJiBiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGl2ZUNvbnRleHQgPSBvQ29udGV4dFxuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9TaWJsaW5nRW50aXR5XCIpXG5cdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0YVJlc3VsdC5wdXNoKG9BY3RpdmVDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFSZXN1bHQ7XG5cdFx0fSwgW10pO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFjdGl2ZUNvbnRleHRzLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKS50aGVuKFxuXHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblx0YWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzOiBhbnksIGNoZWNrQm94OiBhbnksIGFDb250ZXh0czogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQgJiYgb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiKSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChjaGVja0JveC5pc0NoZWNrQm94VmlzaWJsZSA9PT0gdHJ1ZSAmJiBjaGVja0JveC5pc0NoZWNrQm94U2VsZWN0ZWQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vaWYgdW5zYXZlZCBvYmplY3RzIGFyZSBub3QgZGVsZXRlZCB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBlbmFibGVkIHRvIHRydWUgYW5kIHVwZGF0ZSB0aGUgbW9kZWwgZGF0YSBmb3IgbmV4dCBkZWxldGlvblxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRPYmplY3QoKSwge30pO1xuXHRcdFx0XHRvYmouc2VsZWN0ZWRDb250ZXh0cyA9IG9iai5zZWxlY3RlZENvbnRleHRzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iai5kZWxldGFibGVDb250ZXh0cy5pbmRleE9mKGVsZW1lbnQpID09PSAtMTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9iai5kZWxldGFibGVDb250ZXh0cyA9IFtdO1xuXHRcdFx0XHRvYmouc2VsZWN0ZWRDb250ZXh0cyA9IFtdO1xuXHRcdFx0XHRvYmoubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMubGVuZ3RoO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfREVMRVRFX1RPQVNUX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9ERUxFVEVfVE9BU1RfUExVUkFMXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogRGVsZXRlIG9uZSBvciBtdWx0aXBsZSBkb2N1bWVudChzKS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gdkNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHRkZWxldGVEb2N1bWVudCh2Q29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHRsZXQgZm5SZWplY3Q6IEZ1bmN0aW9uLFxuXHRcdFx0Zm5SZXNvbHZlOiBGdW5jdGlvbixcblx0XHRcdGFEZWxldGFibGVDb250ZXh0czogYW55W10gPSBbXSxcblx0XHRcdGlzQ2hlY2tCb3hWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSA9IGZhbHNlLFxuXHRcdFx0aXNDaGVja0JveFNlbGVjdGVkOiBib29sZWFuLFxuXHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlQ29yZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0bGV0IGFQYXJhbXM7XG5cdFx0bGV0IG9EZWxldGVNZXNzYWdlOiBhbnkgPSB7XG5cdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpXG5cdFx0fTtcblx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5vTG9ja09iamVjdCk7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHZDb250ZXh0cykpIHtcblx0XHRcdHZDb250ZXh0cyA9IFt2Q29udGV4dHNdO1xuXHRcdH1cblx0XHRQcm9taXNlLnJlc29sdmUodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHZDb250ZXh0c1swXSkpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc1Byb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdkNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gdkNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiBmblJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgXCJcIl07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSB2Q29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG9uZSB1bnNhdmVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYURlbGV0YWJsZUNvbnRleHRzWzBdLmdldE9iamVjdCgpW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl07XG5cdFx0XHRcdFx0XHRcdGxldCBzTGFzdENoYW5nZWRCeVVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHRzTGFzdENoYW5nZWRCeVVzZXIgPVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uXCJdIHx8IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJcIl0gfHwgXCJcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMYXN0Q2hhbmdlZEJ5VXNlcl07XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSBtdWx0aXBsZSB1bnNhdmVkIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU19NVUxUSVBMRV9PQkpFQ1RTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09XG5cdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cykpLmxlbmd0aFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSB1bnNhdmVkLCBsb2NrZWQgLGRlbGV0YWJsZSBvYmplY3RzIGJ1dCBub3Qgbm9uLWRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vaWYgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0cyBhbG9uZyB3aXRoIGFueSBvZiB1bnNhdmVkICxkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA9PSAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vc2V0dGluZyB0aGUgbG9ja2VkIHRleHQgaWYgbG9ja2VkIG9iamVjdHMgZXhpc3Rcblx0XHRcdFx0XHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vc2V0dGluZyB0aGUgbG9ja2VkIHRleHQgaWYgbG9ja2VkIG9iamVjdHMgZXhpc3Rcblx0XHRcdFx0XHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCAhPT0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdChjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSB8fCBpc0xvY2tlZFRleHRWaXNpYmxlKSAmJlxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly9pZiBvbmx5IHVuc2F2ZWQgYW5kIGVpdGhlciBvciBib3RoIG9mIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IHRoZW4gd2UgaGlkZSB0aGUgY2hlY2sgYm94XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9QTFVSQUxcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19VTlNBVkVEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19VTlNBVkVEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlICYmIGlzTG9ja2VkVGV4dFZpc2libGUpIHtcblx0XHRcdFx0XHRcdFx0Ly9pZiBib3RoIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IGFsb25nIHdpdGggZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9BTkRfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGggLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURfQU5EX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoIC1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2w7XG5cdFx0XHRcdGNvbnN0IG9Db250ZW50ID0gbmV3IFZCb3goe1xuXHRcdFx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdFx0XHQob05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNMb2NrZWRUZXh0VmlzaWJsZSB8fCBjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0KG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLnRleHRcblx0XHRcdFx0XHRcdH0pKSxcblx0XHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdDogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0U2VsZWN0ZWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNDaGVja0JveFZpc2libGVcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IGFDb250ZXh0cyA9IGFEZWxldGFibGVDb250ZXh0cztcblx0XHRcdFx0XHRsZXQgb25CZWZvcmVEZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0b25CZWZvcmVEZWxldGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2soeyBjb250ZXh0czogYUNvbnRleHRzIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlRGVsZXRlUHJvbWlzZVxuXHRcdFx0XHRcdFx0LnRoZW4odGhhdC5maW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMuYmluZCh0aGF0LCBhQ29udGV4dHMsIG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMpKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFjdGl2ZUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly9tYWtlIHN1cmUgdG8gZmV0Y2ggdGhlIGFjdGl2ZSBjb250ZXh0cyBiZWZvcmUgZGVsZXRpbmcgdGhlIGRyYWZ0c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9kZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcgPSBhQ29udGV4dHMubGVuZ3RoID09PSAxID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlLXRocm93IGVycm9yIHRvIGVuZm9yY2UgcmVqZWN0aW5nIHRoZSBnZW5lcmFsIHByb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGVja0JveCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJpc0NoZWNrQm94VmlzaWJsZVwiOiBpc0NoZWNrQm94VmlzaWJsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJpc0NoZWNrQm94U2VsZWN0ZWRcIjogaXNDaGVja0JveFNlbGVjdGVkXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUNvbnRleHRzICYmIGFjdGl2ZUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZuUmVzb2x2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdC5hZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnMsIGNoZWNrQm94LCBhQ29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IFtvQ29udGVudF0sXG5cdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wuZ2V0VmlzaWJsZSgpXG5cdFx0XHRcdFx0XHQ/IFtvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sLCBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sXVxuXHRcdFx0XHRcdFx0OiBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdFx0XHRpZiAoIWJEaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiQ291bGRuJ3QgZ2V0IFByb2dyYW1taW5nIG1vZGVsXCIpO1xuXHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRmblJlamVjdCA9IHJlamVjdDtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGVkaXREb2N1bWVudChvQ29udGV4dDogYW55LCBvVmlldzogb2JqZWN0LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvRWRpdFByb21pc2U7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9FZGl0UHJvbWlzZSA9IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSwge1xuXHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdH0gYXMgYW55KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0b0VkaXRQcm9taXNlID0gc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0dGhhdC5fYkNyZWF0ZU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIHtib29sZWFufSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBhbnk7IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZTogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9QYXJhbXNDb250ZXh0ID0gb0NvbnRleHQsXG5cdFx0XHRvQ2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLFxuXHRcdFx0b01vZGVsID0gb1BhcmFtc0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb25CZWZvcmVDYW5jZWxQcm9taXNlLCBzQ2Fub25pY2FsUGF0aDogc3RyaW5nO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzUE1vZGVsOiBhbnkpIHtcblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSBzUE1vZGVsO1xuXHRcdFx0XHRpZiAoc1BNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKCF0aGF0Ll9iSXNNb2RpZmllZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpLnRoZW4oZnVuY3Rpb24gKGRyYWZ0QWRtaW5EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSAhKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fc2hvd0Rpc2NhcmRQb3BvdmVyKG9DYW5jZWxCdXR0b24sIHRoYXQuX2JJc01vZGlmaWVkLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvbkJlZm9yZUNhbmNlbFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDYW5jZWxQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZVxuXHRcdFx0XHRzd2l0Y2ggKHNQcm9ncmFtbWluZ01vZGVsKSB7XG5cdFx0XHRcdFx0Y2FzZSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJhbXNDb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIikudGhlbihmdW5jdGlvbiAoYkhhc0FjdGl2ZUVudGl0eTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGxldCBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0aWYgKCFiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXNDb250ZXh0ICYmIG9QYXJhbXNDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXNDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZVByb21pc2UgPSBkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChvUGFyYW1zQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9TaWJsaW5nRW50aXR5XCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RDYW5vbmljYWxQYXRoKClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNDYW5vbmljYWxQYXRoID0gc1BhdGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXNDb250ZXh0ICYmIG9QYXJhbXNDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXNDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZVByb21pc2UgPSBkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL29QYXJhbXNDb250ZXh0LmRlbGV0ZSgpIGluIHRoZSBwcmV2aW91cyBwcm9taXNlIGRvZXNudCByZXR1cm4gYW55dGhpbmcgdXBvbiBzdWNjZXNzLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkgIT09IHNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGFjdGl2ZSBjb250ZXh0IGlzIHVzaW5nIHRoZSBzaWJsaW5nIGVudGl0eSAtIHRoaXMgcGF0aCBpcyBub3QgYWNjZXNzaWJsZSBhbnltb3JlIGFzIHdlIGRlbGV0ZWQgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZG9jdW1lbnQgLSB0aGVyZWZvcmUgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBjYW5vbmljYWwgcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9BY3RpdmVDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Y2FzZSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTpcblx0XHRcdFx0XHRcdHJldHVybiBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KS50aGVuKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICghdGhhdC5fYkNyZWF0ZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChjb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gcmVtb3ZlIGV4aXN0aW5nIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3Jcblx0ICogQHBhcmFtIGFCaW5kaW5nc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0c2F2ZURvY3VtZW50KG9Db250ZXh0OiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYW55LCBhQmluZGluZ3M6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb1NhdmVQcm9taXNlO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0b1NhdmVQcm9taXNlID0gZHJhZnQuYWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHt9KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgYkVuYWJsZVN0cmljdEhhbmRsaW5nID0gVXJpUGFyYW1ldGVycy5mcm9tUXVlcnkod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFwic2FwLWZlLXNhdmUtc3RyaWN0LW1vZGVcIikgPT09IFwidHJ1ZVwiO1xuXHRcdFx0b1NhdmVQcm9taXNlID0gc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NhdmVQcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50OiBhbnkpIHtcblx0XHRcdFx0Y29uc3QgYk5ld09iamVjdCA9XG5cdFx0XHRcdFx0dGhhdC5zUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgPyB0aGF0Ll9iQ3JlYXRlTW9kZSA6ICFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGJOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAoYUJpbmRpbmdzICYmIGFCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0XHRhQmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbiAob0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpICYmIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcgfCBudWxsLCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRsZXQgb0NvbnRleHQsIG9Nb2RlbDogYW55LCBvUHJvbWlzZTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycztcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRzQWN0aW9uTmFtZSA9IHNOYW1lIHx8IHNBY3Rpb25OYW1lO1xuXHRcdG9Db250ZXh0ID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKG9Db250ZXh0ICYmICgoQXJyYXkuaXNBcnJheShvQ29udGV4dCkgJiYgb0NvbnRleHQubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShvQ29udGV4dCkpKSB7XG5cdFx0XHRvQ29udGV4dCA9IEFycmF5LmlzQXJyYXkob0NvbnRleHQpID8gb0NvbnRleHRbMF0gOiBvQ29udGV4dDtcblx0XHRcdG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSB8fCB7fTtcblx0XHRpZiAob0NvbnRleHQgJiYgb01vZGVsKSB7XG5cdFx0XHRvUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0bGV0IG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZzogRGlhbG9nO1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VyIGNhbmNlbHMgYWN0aW9uXG5cdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uQ29udGludWU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXJzIGNvbnRpbnVlcyB0aGUgYWN0aW9uIHdpdGggdGhlIGJvdW5kIGNvbnRleHRzXG5cdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUobVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgZm5PcGVuQW5kRmlsbERpYWxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRsZXQgb0RpYWxvZ0NvbnRlbnQ7XG5cdFx0XHRcdFx0Y29uc3Qgbk5vdEFwcGxpY2FibGUgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zID0gW107XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0b0RpYWxvZ0NvbnRlbnQgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dFtpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMucHVzaChvRGlhbG9nQ29udGVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoYU5vdEFwcGxpY2FibGVJdGVtcyk7XG5cdFx0XHRcdFx0Y29uc3Qgb1RvdGFscyA9IG5ldyBKU09OTW9kZWwoeyB0b3RhbDogbk5vdEFwcGxpY2FibGUsIGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCB9KTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob05vdEFwcGxpY2FibGVJdGVtc01vZGVsLCBcIm5vdEFwcGxpY2FibGVcIik7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dCAmJiBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRcdC8vIFNob3cgdGhlIGNvbnRleHRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIGFuZCB3aWxsIG5vdCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkXG5cdFx0XHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuQWN0aW9uUGFydGlhbFwiO1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dGcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBtUGFyYW1ldGVycy5jb250ZXh0c1swXS5nZXRDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IHNDYW5vbmljYWxQYXRoLnN1YnN0cigwLCBzQ2Fub25pY2FsUGF0aC5pbmRleE9mKFwiKFwiKSkgKyBcIi9cIjtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nTGFiZWxNb2RlbCA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dGcmFnbWVudCxcblx0XHRcdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWxcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUG9wb3ZlcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZyA9IG9Qb3BvdmVyO1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvUG9wb3Zlcik7XG5cdFx0XHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2coKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkudGhlbihmdW5jdGlvbiAoY29udGV4dFRvUHJvY2VzczogYW55KSB7XG5cdFx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lLCBjb250ZXh0VG9Qcm9jZXNzLCBvTW9kZWwsIG9BcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRcdGludm9jYXRpb25Hcm91cGluZzogbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRjb250cm9sSWQ6IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCxcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRPRE86IGNvbmZpcm0gaWYgYWN0aW9uIGltcG9ydCBuZWVkcyBzaWRlIGVmZmVjdHMuXG5cdFx0XHRvUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUmVzcG9uc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0Ly8gU3VjY2VlZGVkXG5cdFx0XHRcdHJldHVybiB0aGF0Ll9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjX2hhbmRsZUFjdGlvblJlc3BvbnNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdkaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNoYW5kbGVWYWxpZGF0aW9uRXJyb3Jcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCkge1xuXHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRcdGVycm9yVG9SZW1vdmUgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRcdFx0XHRpZiAoZXJyb3IudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGVycm9yVG9SZW1vdmUpO1xuXHR9XG5cdC8qKlxuXHQgKiBTaG93cyBhIHBvcG92ZXIgaWYgaXQgbmVlZHMgdG8gYmUgc2hvd24uXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdXNlciBoYXMgbW9kaWZpZWQgYW55IGRhdGEuXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdGhlcmUncyBhIGRpZmZlcmVuY2UgZnJvbSBkcmFmdCBhZG1pbiBkYXRhLlxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9zaG93RGlzY2FyZFBvcG92ZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUuQ29udHJvbH0gb0NhbmNlbEJ1dHRvbiBUaGUgY29udHJvbCB3aGljaCB3aWxsIG9wZW4gdGhlIHBvcG92ZXJcblx0ICogQHBhcmFtIGJJc01vZGlmaWVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uOiBhbnksIGJJc01vZGlmaWVkOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Ly8gVE9ETzogSW1wbGVtZW50IHRoaXMgcG9wb3ZlciBhcyBhIGZyYWdtZW50IGFzIGluIHYyPz9cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHR0aGF0Ll9iQ29udGludWVEaXNjYXJkID0gZmFsc2U7XG5cdFx0Ly8gdG8gYmUgaW1wbGVtZW50ZWRcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0aWYgKCFvQ2FuY2VsQnV0dG9uKSB7XG5cdFx0XHRcdHJlamVjdChcIkNhbmNlbCBidXR0b24gbm90IGZvdW5kXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly9TaG93IHBvcG92ZXIgb25seSB3aGVuIGRhdGEgaXMgY2hhbmdlZC5cblx0XHRcdGlmIChiSXNNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBmbk9uQWZ0ZXJEaXNjYXJkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAodGhhdC5fYkNvbnRpbnVlRGlzY2FyZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEaXNjYXJkIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQuIERvY3VtZW50IGhhcyBub3QgYmVlbiBkaXNjYXJkZWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmRldGFjaEFmdGVyQ2xvc2UoZm5PbkFmdGVyRGlzY2FyZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICghdGhhdC5fb1BvcG92ZXIpIHtcblx0XHRcdFx0XHRjb25zdCBvVGV4dCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0Ly9UaGlzIHRleHQgaXMgdGhlIHNhbWUgYXMgTFIgdjIuXG5cdFx0XHRcdFx0XHRcdC8vVE9ETzogRGlzcGxheSBtZXNzYWdlIHByb3ZpZGVkIGJ5IGFwcCBkZXZlbG9wZXI/Pz9cblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRvQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IG9UZXh0XG5cdFx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIgPSBuZXcgUG9wb3Zlcih7XG5cdFx0XHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIixcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcdFx0bmV3IFZCb3goe1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zOiBbb1RleHQsIG9CdXR0b25dXG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvLyBtYWtlIHN1cmUgdG8gTk9UIHRyaWdnZXIgbXVsdGlwbGUgY2FuY2VsIGZsb3dzXG5cdFx0XHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhvQnV0dG9uKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5vcGVuQnkob0NhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhhdC5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBkb2N1bWVudCB0byBtb2RpZmllZCBzdGF0ZSBvbiBwYXRjaCBldmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKSB7XG5cdFx0dGhpcy5fYklzTW9kaWZpZWQgPSB0cnVlO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG93bmVyIGNvbXBvbmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldE93bmVyQ29tcG9uZW50XG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcmV0dXJucyB7c2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50fSBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0X2dldEFwcENvbXBvbmVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudDtcblx0fVxuXG5cdF9vbkZpZWxkQ2hhbmdlKG9FdmVudDogYW55LCBvQ3JlYXRlQnV0dG9uOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnksIGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXM6IEZ1bmN0aW9uKSB7XG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3Qgb0ZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRpZiAob0ZpZWxkUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9GaWVsZFByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIGZpZWxkIGFzICcnIGluIGNhc2Ugb2YgdmFsdWUgaGVscCBhbmQgdmFsaWRhdGluZyBvdGhlciBmaWVsZHNcblx0XHRcdFx0XHRvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Ly9kaXNhYmxpbmcgdGhlIGNvbnRpbnVlIGJ1dHRvbiBpbiBjYXNlIG9mIGludmFsaWQgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIHZhbGlkYXRpbmcgYWxsIHRoZSBmaWVsZHMgaW4gY2FzZSBvZiBlbXB0eSB2YWx1ZSBpbiBmaWVsZFxuXHRcdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdG9MaXN0QmluZGluZzogYW55LFxuXHRcdG9UcmFuc2llbnRMaXN0QmluZGluZzogYW55LFxuXHRcdG9UcmFuc2llbnRDb250ZXh0OiBhbnksXG5cdFx0bUZpZWxkczogYW55LFxuXHRcdG9Nb2RlbDogYW55LFxuXHRcdG1QYXJhbWV0ZXJzOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IGFueVxuXHQpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRsZXQgb0RpYWxvZzogRGlhbG9nO1xuXHRcdGNvbnN0IG9QYXJlbnRDb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdGJTdWNjZXNzID0gZmFsc2U7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9Ob25Db21wdXRlZFZpc2libGVLZXlGaWVsZHNEaWFsb2dcIjtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHNQYXRoID0gb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IG9MaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdFx0Zm9yIChjb25zdCBpIGluIG1GaWVsZHMpIHtcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcy5wdXNoKG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc01ldGFQYXRoICsgXCIvXCIgKyBtRmllbGRzW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KS50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRsZXQgYUZvcm1FbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdFx0XHRsZXQgb0NyZWF0ZUJ1dHRvbjogQnV0dG9uO1xuXHRcdFx0XHRjb25zdCB2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgY29udGludWUgYnV0dG9uIHNob3VsZCByZW1haW4gZGlzYWJsZWQgaW4gY2FzZSBvZiBlcnJvciBpbiBhbnkgZmllbGQgb2YgdGhlIGNyZWF0ZSBkaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFJlcXVpcmVkKCkgfHwgKG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3IgJiYgb0ZpZWxkLmdldFZhbHVlKCkgIT09IFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRmllbGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0ZpZWxkLmdldElkKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNGaWVsZElkIGluIG1GaWVsZFZhbHVlTWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3IgPyB1bmRlZmluZWQgOiB2VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yID8gdW5kZWZpbmVkIDogb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVJlc3VsdHMuZXZlcnkoZnVuY3Rpb24gKHZWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZWYWx1ZSAhPT0gbnVsbCAmJiB2VmFsdWUgIT09IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYkVuYWJsZWQ6IGJvb2xlYW4pIHtcblx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGJFbmFibGVkKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGZvY3VzIG91dCBmcm9tIGZpZWxkIG9yIG9uIHNlbGVjdGluZyBhIHZhbHVlIGZyb20gdGhlIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB0aGF0Ll9vbkZpZWxkQ2hhbmdlKG9FdmVudCwgb0NyZWF0ZUJ1dHRvbiwgbWVzc2FnZUhhbmRsZXIsIHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8qXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24ga2V5IHByZXNzLiB0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRoYW5kbGVMaXZlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdFx0Y29uc3QgdlZhbHVlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gdlZhbHVlO1xuXHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0XHRkZWZpbml0aW9uOiBvRnJhZ21lbnQsXG5cdFx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbiAob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjoge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0ZUJ1dHRvbiA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG1GaWVsZFZhbHVlTWFwKS5tYXAoZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV0udGhlbihmdW5jdGlvbiAob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nVmFsdWU6IGFueSA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2dWYWx1ZVtzS2V5XSA9IG9WYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RpYWxvZ1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFWYWx1ZXM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBvbkJlZm9yZUNyZWF0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQmVmb3JlQ3JlYXRlUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGFWYWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goXCJzdWJtaXRMYXRlclwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9SZXNwb25zZSB8fCAob1Jlc3BvbnNlICYmIG9SZXNwb25zZS5iS2VlcERpYWxvZ09wZW4gIT09IHRydWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUob1Jlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGVuZEJ1dHRvbjoge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHRcdFx0KG9EaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3Qoe1xuXHRcdFx0XHRcdFx0XHRcdFx0YkRlbGV0ZVRyYW5zaWVudENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGU6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzID0gb0RpYWxvZ0NvbnRlbnRcblx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1cIilcblx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1Db250YWluZXJzXCIpWzBdXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRcdFx0aWYgKG9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudCkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBwYXJlbnQgY29udHJvbCBzcGVjaWZpZWQgYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50XG5cdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9DcmVhdGVCdXR0b24gPSBvRGlhbG9nLmdldEJlZ2luQnV0dG9uKCk7XG5cdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChvVHJhbnNpZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLFxuXHRcdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmc6IGFueSwgb05ld0RvY3VtZW50Q29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGZuUmVzb2x2ZTogRnVuY3Rpb24sIGZuUmVqZWN0OiBGdW5jdGlvbjtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHRmblJlamVjdCA9IHJlamVjdDtcblx0XHR9KTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0Y29uc3QgZm5DcmVhdGVDb21wbGV0ZWQgPSBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIiksXG5cdFx0XHRcdGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAob0NvbnRleHQgPT09IG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nLmRldGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhhdCk7XG5cdFx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3I6IGFueSA9IHsgYkRlbGV0ZVRyYW5zaWVudENvbnRleHQ6IGZhbHNlIH07XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBkZWxldGVkXG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvQ29udGV4dFxuXHRcdFx0XHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIGN1cnJlbnQgc3RhdGUgaXMgdHJhbnNpZW50ICguLi4pLCBicm93c2VyIHdpbGwgY29tZSBiYWNrIHRvIHByZXZpb3VzIHN0YXRlXG5cdFx0XHRcdFx0XHRcdG9FcnJvci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmblJlc29sdmUoeyBiS2VlcERpYWxvZ09wZW46IHRydWUgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmNyZWF0ZWQoKS50aGVuKGZuUmVzb2x2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdG9MaXN0QmluZGluZy5hdHRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoaXMpO1xuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXROZXdBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0X2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NyZWF0ZUhhc2g6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVXaXRoXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUuaW5kZXhPZihcImNyZWF0ZVdpdGg6XCIpID4gLTEgPyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25cIikgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uXCIpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzb3VyY2VCdW5kbGVDb3JlIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbVwiKSkge1xuXHRcdFx0XHRjb25zdCBpTGluZUl0ZW1JbmRleCA9IG9NZXRhTW9kZWxcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbVwiKVxuXHRcdFx0XHRcdC5maW5kSW5kZXgoZnVuY3Rpb24gKG9MaW5lSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhTGluZUl0ZW1BY3Rpb24gPSBvTGluZUl0ZW0uQWN0aW9uID8gb0xpbmVJdGVtLkFjdGlvbi5zcGxpdChcIihcIikgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYUxpbmVJdGVtQWN0aW9uID8gYUxpbmVJdGVtQWN0aW9uWzBdID09PSBzTmV3QWN0aW9uIDogZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBpTGluZUl0ZW1JbmRleCA+IC0xXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIilbaUxpbmVJdGVtSW5kZXhdLkxhYmVsXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0Zm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24oKSB8fFxuXHRcdFx0KG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvXCIgKyBzTmV3QWN0aW9uICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCIpKSB8fFxuXHRcdFx0KG9SZXNvdXJjZUJ1bmRsZUNvcmUgJiYgb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSlcblx0XHQpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uSGVscGVyO1xuIl19
1636
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2SW5Db250ZXh0cyIsImZuUmVqZWN0IiwiZm5SZXNvbHZlIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiaXNMb2NrZWRUZXh0VmlzaWJsZSIsImNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIiwiYkRpYWxvZ0NvbmZpcm1lZCIsImFQYXJhbXMiLCJvRGVsZXRlTWVzc2FnZSIsInRpdGxlIiwiZ2V0VGV4dCIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwidkNvbnRleHRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaSIsIm9Db250ZXh0RGF0YSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJzTG9ja2VkVXNlciIsImRyYWZ0QWRtaW5EYXRhIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJvTGluZUNvbnRleHREYXRhIiwicGF0aCIsInNUaXRsZSIsInNLZXkiLCJnZXRLZXlzIiwic0tleVZhbHVlIiwic0Rlc2NyaXB0aW9uIiwidW5TYXZlZENvbnRleHRzIiwic0xhc3RDaGFuZ2VkQnlVc2VyIiwiY29uY2F0IiwibG9ja2VkQ29udGV4dHMiLCJub25EZWxldGFibGVUZXh0IiwiX2dldE5vbkRlbGV0YWJsZVRleHQiLCJjaGVja0JveFRleHQiLCJzTm9uRGVsZXRhYmxlQ29udGV4dFRleHQiLCJvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sIiwib0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCIsIm9Db250ZW50IiwiVkJveCIsIml0ZW1zIiwiVGV4dCIsInZpc2libGUiLCJDaGVja0JveCIsInNlbGVjdGVkIiwic2VsZWN0Iiwib0V2ZW50IiwiZ2V0U291cmNlIiwiZ2V0U2VsZWN0ZWQiLCJmbkNvbmZpcm0iLCJvbkJlZm9yZURlbGV0ZVByb21pc2UiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsImJpbmQiLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkcmFmdCIsImRlbGV0ZURyYWZ0Iiwic2hvd01lc3NhZ2VzIiwib0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiZ2V0VmlzaWJsZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIm5vRGlhbG9nIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJ3YXJuaW5nIiwiZWRpdERvY3VtZW50Iiwib0VkaXRQcm9taXNlIiwiRXJyb3IiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJvTmV3Q29udGV4dCIsImVyciIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImNhbmNlbERvY3VtZW50Iiwib1BhcmFtc0NvbnRleHQiLCJvQ2FuY2VsQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwib25CZWZvcmVDYW5jZWxQcm9taXNlIiwic0Nhbm9uaWNhbFBhdGgiLCJzUE1vZGVsIiwiZHJhZnREYXRhQ29udGV4dCIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiX3Nob3dEaXNjYXJkUG9wb3ZlciIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY29udGV4dCIsIm9EZWxldGVQcm9taXNlIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZGlzY2FyZERvY3VtZW50IiwiZGlzY2FyZGVkQ29udGV4dCIsInJlZnJlc2giLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsIm9TYXZlUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnQiLCJiTmV3T2JqZWN0IiwiZm9yRWFjaCIsIm9MaXN0QmluZGluZyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQWN0aW9uTmFtZSIsIm9Qcm9taXNlIiwic05hbWUiLCJzcGxpdCIsIm1vZGVsIiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJvQXBwbGljYWJsZUNvbnRleHREaWFsb2ciLCJvQ29udHJvbGxlciIsIm9uQ29udGludWUiLCJhcHBsaWNhYmxlQ29udGV4dCIsImZuT3BlbkFuZEZpbGxEaWFsb2ciLCJvRGlhbG9nQ29udGVudCIsIm5Ob3RBcHBsaWNhYmxlIiwibm90QXBwbGljYWJsZUNvbnRleHQiLCJhTm90QXBwbGljYWJsZUl0ZW1zIiwib05vdEFwcGxpY2FibGVJdGVtc01vZGVsIiwiSlNPTk1vZGVsIiwib1RvdGFscyIsInRvdGFsIiwic2V0TW9kZWwiLCJzRnJhZ21lbnROYW1lIiwib0RpYWxvZ0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJnZXRDYW5vbmljYWxQYXRoIiwic0VudGl0eVNldCIsInN1YnN0ciIsIm9EaWFsb2dMYWJlbE1vZGVsIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlUeXBlIiwibW9kZWxzIiwibWV0YU1vZGVsIiwib0ZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJvUG9wb3ZlciIsImFkZERlcGVuZGVudCIsImNvbnRleHRUb1Byb2Nlc3MiLCJjYWxsQm91bmRBY3Rpb24iLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJHZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsIm9NZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZXJyb3JUb1JlbW92ZSIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJ2YWxpZGF0aW9uIiwicmVtb3ZlTWVzc2FnZXMiLCJiSXNNb2RpZmllZCIsImZuT25BZnRlckRpc2NhcmQiLCJzZXRFbmFibGVkIiwiX29Qb3BvdmVyIiwiZGV0YWNoQWZ0ZXJDbG9zZSIsIm9UZXh0Iiwib0J1dHRvbiIsIndpZHRoIiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJiZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsIl9vbkZpZWxkQ2hhbmdlIiwib0NyZWF0ZUJ1dHRvbiIsImZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJvRmllbGQiLCJvRmllbGRQcm9taXNlIiwiZ2V0UGFyYW1ldGVyIiwidmFsdWUiLCJzZXRWYWx1ZSIsImdldFZhbHVlIiwiYU5vbkRlbGV0YWJsZUNvbnRleHRzIiwib1RyYW5zaWVudENvbnRleHQiLCJtRmllbGRzIiwib1BhcmVudENvbnRyb2wiLCJiU3VjY2VzcyIsImdldENvbnRyb2xsZXIiLCJhSW1tdXRhYmxlRmllbGRzIiwib0VudGl0eVNldENvbnRleHQiLCJvSW1tdXRhYmxlQ3R4TW9kZWwiLCJvSW1tdXRhYmxlQ3R4IiwiYVJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4IiwiZW50aXR5U2V0IiwiZmllbGRzIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwib05ld0ZyYWdtZW50IiwiYUZvcm1FbGVtZW50cyIsIm1GaWVsZFZhbHVlTWFwIiwidmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJvRm9ybUVsZW1lbnQiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlU3RhdGUiLCJzRmllbGRJZCIsImdldElkIiwidlZhbHVlIiwiYVJlc3VsdHMiLCJldmVyeSIsImJFbmFibGVkIiwiaGFuZGxlQ2hhbmdlIiwiaGFuZGxlTGl2ZUNoYW5nZSIsImNyZWF0ZUJ1dHRvbiIsImJJc0NyZWF0ZURpYWxvZyIsImtleXMiLCJvVmFsdWUiLCJvRGlhbG9nVmFsdWUiLCJhVmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsInN1Ym1pdEJhdGNoIiwib1Jlc3BvbnNlIiwiYktlZXBEaWFsb2dPcGVuIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImdldEFnZ3JlZ2F0aW9uIiwiZ2V0QmVnaW5CdXR0b24iLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJmbkNyZWF0ZUNvbXBsZXRlZCIsImRldGFjaENyZWF0ZUNvbXBsZXRlZCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJjcmVhdGVkIiwidHJhY2UiLCJjb250ZXh0RXJyb3IiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJwcmVmZXJyZWRNb2RlIiwic1ByZWZlcnJlZE1vZGUiLCJmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiIsImlMaW5lSXRlbUluZGV4IiwiZmluZEluZGV4Iiwib0xpbmVJdGVtIiwiYUxpbmVJdGVtQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUE4QkEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQS9CO0FBQ0EsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQW5DO0FBQ0EsTUFBTUMsVUFBVSxHQUFHQyxXQUFXLENBQUNELFVBQS9CO0FBQ0E7O0FBQ0EsV0FBU0UsYUFBVCxDQUF1QkMsV0FBdkIsRUFBeUM7QUFDeEMsUUFBSUEsV0FBVyxJQUFJQSxXQUFXLENBQUNDLFdBQTNCLElBQTBDRCxXQUFXLENBQUNDLFdBQVosR0FBMEJDLE9BQTFCLE9BQXdDLG1CQUF0RixFQUEyRztBQUMxR0YsTUFBQUEsV0FBVyxHQUFHLEVBQWQ7QUFDQTs7QUFDRCxXQUFPQSxXQUFXLElBQUksRUFBdEI7QUFDQTs7TUFFS0csaUI7QUFRTCwrQkFBWUMsYUFBWixFQUF5Q0MsV0FBekMsRUFBMkQ7QUFBQSxXQUozREMsWUFJMkQsR0FKbkMsS0FJbUM7QUFBQSxXQUgzREMsWUFHMkQsR0FIbkMsS0FHbUM7QUFBQSxXQUYzREMsaUJBRTJELEdBRjlCLEtBRThCO0FBQzFELFdBQUtDLGNBQUwsR0FBc0JMLGFBQXRCO0FBQ0EsV0FBS0MsV0FBTCxHQUFtQkEsV0FBbkI7QUFDQTs7OztXQUNESyxtQixHQUFBLDZCQUFvQkMsUUFBcEIsRUFBNkQ7QUFDNUQsVUFBSSxDQUFDLEtBQUtDLGlCQUFOLElBQTJCRCxRQUEvQixFQUF5QztBQUN4QyxZQUFJRSxLQUFKOztBQUNBLFlBQUlGLFFBQVEsQ0FBQ0csR0FBVCxDQUFhLCtCQUFiLENBQUosRUFBbUQ7QUFDbERELFVBQUFBLEtBQUssR0FBR0YsUUFBUSxDQUFDSSxPQUFULEVBQVI7QUFDQSxTQUZELE1BRU87QUFDTkYsVUFBQUEsS0FBSyxHQUFHRixRQUFRLENBQUNL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LEdBQWlEOU8sU0FBekU7QUFDQSxtQkFBT29ZLGVBQWUsR0FBR0EsZUFBZSxDQUFDLENBQUQsQ0FBZixLQUF1QnRZLFVBQTFCLEdBQXVDLEtBQTdEO0FBQ0EsV0FMcUIsQ0FBdkI7QUFNQSxpQkFBT21ZLGNBQWMsR0FBRyxDQUFDLENBQWxCLEdBQ0ovWSxVQUFVLENBQUNrQixTQUFYLFdBQXdCakIsU0FBeEIsNENBQTBFOFksY0FBMUUsRUFBMEZLLEtBRHRGLEdBRUp0WSxTQUZIO0FBR0EsU0FWRCxNQVVPO0FBQ04saUJBQU9BLFNBQVA7QUFDQTtBQUNELE9BZEQ7O0FBZ0JBLGFBQ0NnWSxnQ0FBZ0MsTUFDL0I5WSxVQUFVLElBQUlBLFVBQVUsQ0FBQ2tCLFNBQVgsV0FBd0JqQixTQUF4QixjQUFxQ1csVUFBckMsMkNBRGYsSUFFQ2tCLG1CQUFtQixJQUFJQSxtQkFBbUIsQ0FBQ3NHLE9BQXBCLENBQTRCLDBDQUE1QixDQUh6QjtBQUtBLEs7Ozs7O1NBR2FuTCxpQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXgsIE9EYXRhTGlzdEJpbmRpbmcsIFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcbmNvbnN0IFZhbHVlU3RhdGUgPSBjb3JlTGlicmFyeS5WYWx1ZVN0YXRlO1xuLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1QYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb0V2ZW50ICovXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHR9XG5cdHJldHVybiBtUGFyYW1ldGVycyB8fCB7fTtcbn1cblxuY2xhc3MgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRfb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRvTG9ja09iamVjdDogYW55O1xuXHRzUHJvZ3JhbW1pbmdNb2RlbD86IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsO1xuXHRfYklzTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDcmVhdGVNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQ29udGludWVEaXNjYXJkOiBib29sZWFuID0gZmFsc2U7XG5cdF9vUG9wb3ZlciE6IFBvcG92ZXI7XG5cdGNvbnN0cnVjdG9yKG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgb0xvY2tPYmplY3Q6IGFueSkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBvQXBwQ29tcG9uZW50O1xuXHRcdHRoaXMub0xvY2tPYmplY3QgPSBvTG9ja09iamVjdDtcblx0fVxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0PzogYW55KTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGlmICghdGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCAmJiBvQ29udGV4dCkge1xuXHRcdFx0bGV0IHNQYXRoO1xuXHRcdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5pc1JlbGF0aXZlKCkgPyBvQ29udGV4dC5nZXRSZXNvbHZlZFBhdGgoKSA6IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHNQYXRoKSkge1xuXHRcdFx0XHR0aGlzLnNQcm9ncmFtbWluZ01vZGVsID0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGFzIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgYSBzaW5nbGV0b24gd2UgZG9uJ3Qgc3RvcmUgdGhlIG5vbiBkcmFmdCBhcyB0aGUgdXNlciBjb3VsZFxuXHRcdFx0XHQvLyBzdGFydCB3aXRoIGEgbm9uIGRyYWZ0IGNoaWxkIHBhZ2UgYW5kIG5hdmlnYXRlcyBiYWNrIHRvIGEgZHJhZnQgZW5hYmxlZCBvbmVcblx0XHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNQcm9ncmFtbWluZ01vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0dmFsaWRhdGVEb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0LCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9NYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIGJGcm9tQ29weVBhc3RlXG5cdCAqIEBwYXJhbSBvVmlldyBUaGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdG9NYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0bUluUGFyYW1ldGVyczogeyBkYXRhPzogYW55OyBidXN5TW9kZT86IHN0cmluZyB8IHVuZGVmaW5lZDsga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGFueTsgaW5hY3RpdmU/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IGFueSxcblx0XHRiRnJvbUNvcHlQYXN0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdG9WaWV3OiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvTW9kZWwgPSBvTWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpLFxuXHRcdFx0c0NyZWF0ZUhhc2ggPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdG9Db21wb25lbnREYXRhID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Q29tcG9uZW50RGF0YSgpLFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRcdHNOZXdBY3Rpb24gPSAhb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKClcblx0XHRcdFx0PyB0aGlzLl9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzLCBzQ3JlYXRlSGFzaCwgb01ldGFNb2RlbCwgc01ldGFQYXRoKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRsZXQgb0NyZWF0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnM6IGFueSA9IHsgXCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzXCI6IHRydWUgfTtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0bGV0IHNCdXN5UGF0aCA9IFwiL2J1c3lcIjtcblx0XHRsZXQgc0Z1bmN0aW9uTmFtZSA9XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGAke01vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gXG5cdFx0XHQpO1xuXHRcdGxldCBiRnVuY3Rpb25Pbk5hdlByb3A7XG5cdFx0bGV0IG9OZXdEb2N1bWVudENvbnRleHQ6IGFueTtcblx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICE9PSBzTWV0YVBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRtQmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc01lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGlmICghb01haW5MaXN0QmluZGluZykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiKSB7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIGxvY2FsIGJ1c3kgbW9kZSB3ZSB1c2UgdGhlIGxpc3QgYmluZGluZyBuYW1lXG5cdFx0XHQvLyB0aGVyZSdzIG5vIEFQWSB5ZXQgc28gd2UgaGF2ZSB0byB1c2UgdGhlIC5zSWQgVE9ETyBwcm92aWRlIGEgcHVibGljIG1ldGhvZD9cblx0XHRcdHNCdXN5UGF0aCA9IGAvYnVzeUxvY2FsLyR7b01haW5MaXN0QmluZGluZy5zSWR9YDtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnRleHRzOiBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgc05ld0FjdGlvbiwgb1Jlc291cmNlQnVuZGxlQ29yZSksXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgYklzTmV3UGFnZUNyZWF0aW9uID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGJJc05ld1BhZ2VDcmVhdGlvblxuXHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIG9WaWV3KVxuXHRcdFx0XHQ6IFtdO1xuXHRcdFx0c0Z1bmN0aW9uTmFtZSA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRsZXQgc0Z1bmN0aW9uUGF0aCwgb0Z1bmN0aW9uQ29udGV4dDtcblx0XHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRcdC8vYm91bmQgdG8gdGhlIHNvdXJjZSBlbnRpdHk6XG5cdFx0XHRcdGlmIChiRnVuY3Rpb25Pbk5hdlByb3ApIHtcblx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiAob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKSBhcyBhbnkpO1xuXHRcdFx0aWYgKG9GdW5jdGlvbiAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KCkgJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpWzBdLiRJc0JvdW5kKSB7XG5cdFx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9GdW5jdGlvbkNvbnRleHQsIG9Nb2RlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfWAsIG9FcnJvcik7XG5cdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSBvRGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIG9EYXRhLCBtUGFyYW1ldGVycy5kYXRhKSA6IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9UcmFuc2llbnRMaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChvTWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKSwgb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0XHRcdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8qICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9UcmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUobVBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bGV0IG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NYWluTGlzdEJpbmRpbmcgJiYgb01haW5MaXN0QmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBvbkJlZm9yZUNyZWF0ZVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmNyZWF0ZShcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmICghb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRlIG1vZGUgc2hhbGwgY3VycmVudGx5IG9ubHkgYmUgc2V0IG9uIGNyZWF0aW5nIGEgcm9vdCBkb2N1bWVudFxuXHRcdFx0XHRcdHRoYXQuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dCB8fCAob1Jlc3VsdCAmJiBvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0Ly8gVE9ETzogd2hlcmUgZG9lcyB0aGlzIG9uZSBjb21pbmcgZnJvbT8/P1xuXHRcdFx0XHRpZiAob1Jlc3VsdCAmJiBvUmVzdWx0LmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQpIHtcblx0XHRcdFx0XHR0aGF0LmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIGZvciBpbnN0YW5jZSwgb24gY2FuY2VsIG9mIGNyZWF0ZSBkaWFsb2csIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXG5cdFx0XHRcdFx0Ly8gYSByZXR1cm4gaGVyZSB3b3VsZCByZXN0b3JlIHRoZSBwcm9taXNlIGNoYWluIGFuZCByZXN1bHQgaW4gZXJyb3JzIHdoaWxlIHJvdXRpbmdcblx0XHRcdFx0XHQvLyBzb2x1dGlvbiAtICByZWplY3QgaGVyZSBhcyB3ZWxsXG5cdFx0XHRcdFx0aWYgKG9FcnJvciAmJiBvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgJiYgb05ld0RvY3VtZW50Q29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGFjdGl2ZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzLCBvbmx5IGZvciB0aGUgZHJhZnQgcm9vdHMuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBcnJheSBvZiB0aGUgYWN0aXZlIGNvbnRleHRzXG5cdCAqL1xuXHRmaW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMoYUNvbnRleHRzOiBWNENvbnRleHRbXSwgYkZpbmRBY3RpdmVDb250ZXh0czogYW55KSB7XG5cdFx0aWYgKCFiRmluZEFjdGl2ZUNvbnRleHRzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gYUNvbnRleHRzLnJlZHVjZShmdW5jdGlvbiAoYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSkge1xuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSxcblx0XHRcdFx0XHRiSGFzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRpZiAoIWJJc0FjdGl2ZUVudGl0eSAmJiBiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGl2ZUNvbnRleHQgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGFSZXN1bHQucHVzaChvQWN0aXZlQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhUmVzdWx0O1xuXHRcdH0sIFtdKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXHRhZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnM6IGFueSwgY2hlY2tCb3g6IGFueSwgYUNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoZWNrQm94LmlzQ2hlY2tCb3hWaXNpYmxlID09PSB0cnVlICYmIGNoZWNrQm94LmlzQ2hlY2tCb3hTZWxlY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly9pZiB1bnNhdmVkIG9iamVjdHMgYXJlIG5vdCBkZWxldGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIGVuYWJsZWQgdG8gdHJ1ZSBhbmQgdXBkYXRlIHRoZSBtb2RlbCBkYXRhIGZvciBuZXh0IGRlbGV0aW9uXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLCB7fSk7XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqLmRlbGV0YWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b2JqLmRlbGV0YWJsZUNvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBvYmouc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RFTEVURV9UT0FTVF9QTFVSQUxcIiwgb1Jlc291cmNlQnVuZGxlLCBudWxsLCBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB2SW5Db250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZJbkNvbnRleHRzOiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0bGV0IGZuUmVqZWN0OiBGdW5jdGlvbixcblx0XHRcdGZuUmVzb2x2ZTogRnVuY3Rpb24sXG5cdFx0XHRhRGVsZXRhYmxlQ29udGV4dHM6IGFueVtdID0gW10sXG5cdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlLFxuXHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IGZhbHNlLFxuXHRcdFx0Y2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZDogYm9vbGVhbixcblx0XHRcdGJEaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGxldCBhUGFyYW1zO1xuXHRcdGxldCBvRGVsZXRlTWVzc2FnZTogYW55ID0ge1xuXHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKVxuXHRcdH07XG5cdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdGxldCB2Q29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZJbkNvbnRleHRzKSkge1xuXHRcdFx0dkNvbnRleHRzID0gdkluQ29udGV4dHM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZDb250ZXh0cyA9IFt2SW5Db250ZXh0c107XG5cdFx0fVxuXHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodkNvbnRleHRzWzBdKSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzUHJvZ3JhbW1pbmdNb2RlbDogYW55KSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2Q29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSB2Q29udGV4dHNbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IW9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBzTG9ja2VkVXNlciA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IG9Db250ZXh0RGF0YSAmJiBvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGE7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0xvY2tlZFVzZXIgPSBkcmFmdEFkbWluRGF0YVtcIkluUHJvY2Vzc0J5VXNlclwiXTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0xvY2tlZFVzZXJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVBhcmFtc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiBmblJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlICsgXCIgXCIsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlID0ge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHZDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGluZUNvbnRleHREYXRhID0gdkNvbnRleHRzWzBdLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudGl0bGUgJiYgbVBhcmFtZXRlcnMudGl0bGUucGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUaXRsZSA9IG9MaW5lQ29udGV4dERhdGFbbVBhcmFtZXRlcnMudGl0bGUucGF0aF07XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IENvbW1vblV0aWxzLmdldEtleXMoXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9vQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dkNvbnRleHRzWzBdLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IHNLZXkgPyBvTGluZUNvbnRleHREYXRhW3NLZXldIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNEZXNjcmlwdGlvbiA9XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiAmJiBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbi5wYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gb0xpbmVDb250ZXh0RGF0YVttUGFyYW1ldGVycy5kZXNjcmlwdGlvbi5wYXRoXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc1RpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoc0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc1RpdGxlICsgXCIgXCIsIHNEZXNjcmlwdGlvbl07XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NUaXRsZSwgXCJcIl07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHNLZXlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFtzS2V5VmFsdWUsIFwiXCJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG9uZSB1bnNhdmVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYURlbGV0YWJsZUNvbnRleHRzWzBdLmdldE9iamVjdCgpW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl07XG5cdFx0XHRcdFx0XHRcdGxldCBzTGFzdENoYW5nZWRCeVVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHRzTGFzdENoYW5nZWRCeVVzZXIgPVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uXCJdIHx8IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJcIl0gfHwgXCJcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMYXN0Q2hhbmdlZEJ5VXNlcl07XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSBtdWx0aXBsZSB1bnNhdmVkIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU19NVUxUSVBMRV9PQkpFQ1RTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09XG5cdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cykpLmxlbmd0aFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSB1bnNhdmVkLCBsb2NrZWQgLGRlbGV0YWJsZSBvYmplY3RzIGJ1dCBub3Qgbm9uLWRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vaWYgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0cyBhbG9uZyB3aXRoIGFueSBvZiB1bnNhdmVkICxkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W2FEZWxldGFibGVDb250ZXh0cy5sZW5ndGhdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IHRoYXQuX2dldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHZDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0XHQvL3NldHRpbmcgdGhlIGxvY2tlZCB0ZXh0IGlmIGxvY2tlZCBvYmplY3RzIGV4aXN0XG5cdFx0XHRcdFx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNdXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHQvL3NldHRpbmcgdGhlIGxvY2tlZCB0ZXh0IGlmIGxvY2tlZCBvYmplY3RzIGV4aXN0XG5cdFx0XHRcdFx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLCBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNdXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggIT09IG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHQoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgfHwgaXNMb2NrZWRUZXh0VmlzaWJsZSkgJiZcblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vaWYgb25seSB1bnNhdmVkIGFuZCBlaXRoZXIgb3IgYm90aCBvZiBsb2NrZWQgYW5kIG5vbi1kZWxldGFibGUgb2JqZWN0cyBleGlzdCB0aGVuIHdlIGhpZGUgdGhlIGNoZWNrIGJveFxuXHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0FORF9GRVdfT0JKRUNUU19MT0NLRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfVU5TQVZFRF9QTFVSQUxcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSAmJiBpc0xvY2tlZFRleHRWaXNpYmxlKSB7XG5cdFx0XHRcdFx0XHRcdC8vaWYgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IGFsb25nIHdpdGggZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc05vbkRlbGV0YWJsZUNvbnRleHRUZXh0ID0gdGhhdC5fZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdkNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHQvL2lmIGJvdGggbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgYWxvbmcgd2l0aCBkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRcdHNOb25EZWxldGFibGVDb250ZXh0VGV4dCArXG5cdFx0XHRcdFx0XHRcdFx0XHRcIiBcIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0c05vbkRlbGV0YWJsZUNvbnRleHRUZXh0ICtcblx0XHRcdFx0XHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbDtcblx0XHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBuZXcgVkJveCh7XG5cdFx0XHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0XHRcdChvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0xvY2tlZFRleHRWaXNpYmxlIHx8IGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlXG5cdFx0XHRcdFx0XHR9KSksXG5cdFx0XHRcdFx0XHQob0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UudGV4dFxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0NoZWNrQm94VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIik7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0Y29uc3QgYUNvbnRleHRzID0gYURlbGV0YWJsZUNvbnRleHRzO1xuXHRcdFx0XHRcdGxldCBvbkJlZm9yZURlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayh7IGNvbnRleHRzOiBhQ29udGV4dHMgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9uQmVmb3JlRGVsZXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVEZWxldGVQcm9taXNlXG5cdFx0XHRcdFx0XHQudGhlbih0aGF0LmZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cy5iaW5kKHRoYXQsIGFDb250ZXh0cywgbVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cykpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvL21ha2Ugc3VyZSB0byBmZXRjaCB0aGUgYWN0aXZlIGNvbnRleHRzIGJlZm9yZSBkZWxldGluZyB0aGUgZHJhZnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGFDb250ZXh0cy5sZW5ndGggPT09IDEgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hWaXNpYmxlXCI6IGlzQ2hlY2tCb3hWaXNpYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hTZWxlY3RlZFwiOiBpc0NoZWNrQm94U2VsZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ29udGV4dHMgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuYWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzLCBjaGVja0JveCwgYUNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmblJlc29sdmUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IHNUaXRsZSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogW29Db250ZW50XSxcblx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbC5nZXRWaXNpYmxlKClcblx0XHRcdFx0XHRcdD8gW29Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2xdXG5cdFx0XHRcdFx0XHQ6IG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wsXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNvbmZpcm0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0XHRcdGlmICghYkRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJDb3VsZG4ndCBnZXQgUHJvZ3JhbW1pbmcgbW9kZWxcIik7XG5cdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0ZWRpdERvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG9WaWV3OiBWaWV3LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvRWRpdFByb21pc2U7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9FZGl0UHJvbWlzZSA9IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSwge1xuXHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdH0gYXMgYW55KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0b0VkaXRQcm9taXNlID0gc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0dGhhdC5fYkNyZWF0ZU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogeyBjYW5jZWxCdXR0b246IGFueTsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IGFueVxuXHQpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRsZXQgc1Byb2dyYW1taW5nTW9kZWw6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsO1xuXHRcdC8vY29udGV4dCBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgLSBtYW5kYXRvcnkgcGFyYW1ldGVyXG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiTm8gY29udGV4dCBleGlzdHMuIFBhc3MgYSBtZWFuaW5nZnVsIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1BhcmFtc0NvbnRleHQgPSBvQ29udGV4dCxcblx0XHRcdG9DYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24sXG5cdFx0XHRvTW9kZWwgPSBvUGFyYW1zQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGxldCBvbkJlZm9yZUNhbmNlbFByb21pc2UsIHNDYW5vbmljYWxQYXRoOiBzdHJpbmc7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNQTW9kZWw6IGFueSkge1xuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9IHNQTW9kZWw7XG5cdFx0XHRcdGlmIChzUE1vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvUGFyYW1zQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKCF0aGF0Ll9iSXNNb2RpZmllZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpLnRoZW4oZnVuY3Rpb24gKGRyYWZ0QWRtaW5EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSAhKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fc2hvd0Rpc2NhcmRQb3BvdmVyKG9DYW5jZWxCdXR0b24sIHRoYXQuX2JJc01vZGlmaWVkLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvbkJlZm9yZUNhbmNlbFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDYW5jZWxQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZVxuXHRcdFx0XHRzd2l0Y2ggKHNQcm9ncmFtbWluZ01vZGVsKSB7XG5cdFx0XHRcdFx0Y2FzZSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0OlxuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJhbXNDb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIikudGhlbihmdW5jdGlvbiAoYkhhc0FjdGl2ZUVudGl0eTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGxldCBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0aWYgKCFiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXNDb250ZXh0ICYmIG9QYXJhbXNDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXNDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZVByb21pc2UgPSBkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvUGFyYW1zQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQ2Fub25pY2FsUGF0aCA9IHNQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL29QYXJhbXNDb250ZXh0LmRlbGV0ZSgpIGluIHRoZSBwcmV2aW91cyBwcm9taXNlIGRvZXNudCByZXR1cm4gYW55dGhpbmcgdXBvbiBzdWNjZXNzLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkgIT09IHNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGFjdGl2ZSBjb250ZXh0IGlzIHVzaW5nIHRoZSBzaWJsaW5nIGVudGl0eSAtIHRoaXMgcGF0aCBpcyBub3QgYWNjZXNzaWJsZSBhbnltb3JlIGFzIHdlIGRlbGV0ZWQgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZG9jdW1lbnQgLSB0aGVyZWZvcmUgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBjYW5vbmljYWwgcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9BY3RpdmVDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Y2FzZSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTpcblx0XHRcdFx0XHRcdHJldHVybiBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KS50aGVuKGZ1bmN0aW9uIChkaXNjYXJkZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGF0Ll9iQ3JlYXRlTW9kZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZGlzY2FyZGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChjb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gcmVtb3ZlIGV4aXN0aW5nIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yXG5cdCAqIEBwYXJhbSBhQmluZGluZ3Ncblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0c2F2ZURvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYW55LCBhQmluZGluZ3M6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb1NhdmVQcm9taXNlO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0b1NhdmVQcm9taXNlID0gZHJhZnQuYWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHt9KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0b1NhdmVQcm9taXNlID0gc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TYXZlUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IGJOZXdPYmplY3QgPVxuXHRcdFx0XHRcdHRoYXQuc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ID8gdGhhdC5fYkNyZWF0ZU1vZGUgOiAhb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRiTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAoYUJpbmRpbmdzICYmIGFCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0XHRhQmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbiAob0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpICYmIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uOiBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjogQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0Y2FsbEFjdGlvbihzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyB8IG51bGwsIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBvQ29udGV4dCwgb01vZGVsOiBhbnksIG9Qcm9taXNlO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdGlmICghc0FjdGlvbk5hbWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIlByb3ZpZGUgbmFtZSBvZiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcIik7XG5cdFx0fVxuXHRcdC8vIGFjdGlvbiBpbXBvcnRzIGFyZSBub3QgZGlyZWN0bHkgb2J0YWluZWQgZnJvbSB0aGUgbWV0YU1vZGVsIGJ5IGl0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBlbnRpdHlDb250YWluZXJcblx0XHQvLyBhbmQgdGhlIGFjaW9ucyBpdCByZWZlcnMgdG8gcHJlc2VudCBvdXRzaWRlIHRoZSBlbnRpdHljb250YWluZXIsIGhlbmNlIHRvIG9idGFpbiBraW5kIG9mIHRoZSBhY3Rpb25cblx0XHQvLyBzcGxpdCgpIG9uIGl0cyBuYW1lIHdhcyByZXF1aXJlZFxuXHRcdGNvbnN0IHNOYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdHNBY3Rpb25OYW1lID0gc05hbWUgfHwgc0FjdGlvbk5hbWU7XG5cdFx0b0NvbnRleHQgPSBzTmFtZSA/IHVuZGVmaW5lZCA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdC8vY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dCBpcyBhbiBhcnJheSB3aXRoIG1vcmUgdGhhbiAwIGxlbmd0aCBvciBub3QgYW4gYXJyYXkoY3JlYXRlIGFjdGlvbilcblx0XHRpZiAob0NvbnRleHQgJiYgKChBcnJheS5pc0FycmF5KG9Db250ZXh0KSAmJiBvQ29udGV4dC5sZW5ndGgpIHx8ICFBcnJheS5pc0FycmF5KG9Db250ZXh0KSkpIHtcblx0XHRcdG9Db250ZXh0ID0gQXJyYXkuaXNBcnJheShvQ29udGV4dCkgPyBvQ29udGV4dFswXSA6IG9Db250ZXh0O1xuXHRcdFx0b01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKCFvTW9kZWwpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIlBhc3MgYSBjb250ZXh0IGZvciBhIGJvdW5kIGFjdGlvbiBvciBwYXNzIHRoZSBtb2RlbCBmb3IgYW4gdW5ib3VuZCBhY3Rpb25cIik7XG5cdFx0fVxuXHRcdC8vIGdldCB0aGUgYmluZGluZyBwYXJhbWV0ZXJzICRzZWxlY3QgYW5kICRleHBhbmQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvbiB0aGlzIGFjdGlvblxuXHRcdC8vIGFsc28gZ2F0aGVyIGFkZGl0aW9uYWwgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIHN1Y2ggYXMgdGV4dCBhc3NvY2lhdGlvbnNcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzUGFyYW1ldGVycyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpIHx8IHt9O1xuXHRcdGlmIChvQ29udGV4dCAmJiBvTW9kZWwpIHtcblx0XHRcdG9Qcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRsZXQgb0FwcGxpY2FibGVDb250ZXh0RGlhbG9nOiBEaWFsb2c7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXIgY2FuY2VscyBhY3Rpb25cblx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25Db250aW51ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlcnMgY29udGludWVzIHRoZSBhY3Rpb24gd2l0aCB0aGUgYm91bmQgY29udGV4dHNcblx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBmbk9wZW5BbmRGaWxsRGlhbG9nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGxldCBvRGlhbG9nQ29udGVudDtcblx0XHRcdFx0XHRjb25zdCBuTm90QXBwbGljYWJsZSA9IG1QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nQ29udGVudCA9IG1QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0W2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcy5wdXNoKG9EaWFsb2dDb250ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgb05vdEFwcGxpY2FibGVJdGVtc01vZGVsID0gbmV3IEpTT05Nb2RlbChhTm90QXBwbGljYWJsZUl0ZW1zKTtcblx0XHRcdFx0XHRjb25zdCBvVG90YWxzID0gbmV3IEpTT05Nb2RlbCh7IHRvdGFsOiBuTm90QXBwbGljYWJsZSwgbGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsIH0pO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwsIFwibm90QXBwbGljYWJsZVwiKTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob1RvdGFscywgXCJ0b3RhbHNcIik7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0ICYmIG1QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0Lmxlbmd0aCA+PSAxKSB7XG5cdFx0XHRcdFx0Ly8gU2hvdyB0aGUgY29udGV4dHMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgYW5kIHdpbGwgbm90IHRoZXJlZm9yZSBiZSBwcm9jZXNzZWRcblx0XHRcdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5BY3Rpb25QYXJ0aWFsXCI7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBzQ2Fub25pY2FsUGF0aCA9IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdLmdldENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gYCR7c0Nhbm9uaWNhbFBhdGguc3Vic3RyKDAsIHNDYW5vbmljYWxQYXRoLmluZGV4T2YoXCIoXCIpKX0vYDtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nTGFiZWxNb2RlbCA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dGcmFnbWVudCxcblx0XHRcdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWxcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUG9wb3ZlcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZyA9IG9Qb3BvdmVyO1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvUG9wb3Zlcik7XG5cdFx0XHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2coKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkudGhlbihmdW5jdGlvbiAoY29udGV4dFRvUHJvY2VzczogYW55KSB7XG5cdFx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lLCBjb250ZXh0VG9Qcm9jZXNzLCBvTW9kZWwsIG9BcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRcdGludm9jYXRpb25Hcm91cGluZzogbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRjb250cm9sSWQ6IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCxcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRPRE86IGNvbmZpcm0gaWYgYWN0aW9uIGltcG9ydCBuZWVkcyBzaWRlIGVmZmVjdHMuXG5cdFx0XHRvUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUmVzcG9uc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0Ly8gU3VjY2VlZGVkXG5cdFx0XHRcdHJldHVybiB0aGF0Ll9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjX2hhbmRsZUFjdGlvblJlc3BvbnNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgYWZ0ZXIgbWVzc2FnZSBkaWFsb2cgaXMgb3BlbmVkIGlmIHJlcXVpcmVkLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfaGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXI6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgc0FjdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGUgJ2Rpc2NhcmQnIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI2hhbmRsZVZhbGlkYXRpb25FcnJvclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVWYWxpZGF0aW9uRXJyb3IoKSB7XG5cdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdFx0ZXJyb3JUb1JlbW92ZSA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdFx0XHRcdGlmIChlcnJvci52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciBpZiBpdCBuZWVkcyB0byBiZSBzaG93bi5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB1c2VyIGhhcyBtb2RpZmllZCBhbnkgZGF0YS5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB0aGVyZSdzIGEgZGlmZmVyZW5jZSBmcm9tIGRyYWZ0IGFkbWluIGRhdGEuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX3Nob3dEaXNjYXJkUG9wb3ZlclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG9DYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBiSXNNb2RpZmllZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uOiBhbnksIGJJc01vZGlmaWVkOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Ly8gVE9ETzogSW1wbGVtZW50IHRoaXMgcG9wb3ZlciBhcyBhIGZyYWdtZW50IGFzIGluIHYyPz9cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHR0aGF0Ll9iQ29udGludWVEaXNjYXJkID0gZmFsc2U7XG5cdFx0Ly8gdG8gYmUgaW1wbGVtZW50ZWRcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0aWYgKCFvQ2FuY2VsQnV0dG9uKSB7XG5cdFx0XHRcdHJlamVjdChcIkNhbmNlbCBidXR0b24gbm90IGZvdW5kXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly9TaG93IHBvcG92ZXIgb25seSB3aGVuIGRhdGEgaXMgY2hhbmdlZC5cblx0XHRcdGlmIChiSXNNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBmbk9uQWZ0ZXJEaXNjYXJkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAodGhhdC5fYkNvbnRpbnVlRGlzY2FyZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEaXNjYXJkIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQuIERvY3VtZW50IGhhcyBub3QgYmVlbiBkaXNjYXJkZWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmRldGFjaEFmdGVyQ2xvc2UoZm5PbkFmdGVyRGlzY2FyZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICghdGhhdC5fb1BvcG92ZXIpIHtcblx0XHRcdFx0XHRjb25zdCBvVGV4dCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0Ly9UaGlzIHRleHQgaXMgdGhlIHNhbWUgYXMgTFIgdjIuXG5cdFx0XHRcdFx0XHRcdC8vVE9ETzogRGlzcGxheSBtZXNzYWdlIHByb3ZpZGVkIGJ5IGFwcCBkZXZlbG9wZXI/Pz9cblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRvQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IG9UZXh0XG5cdFx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIgPSBuZXcgUG9wb3Zlcih7XG5cdFx0XHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIixcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcdFx0bmV3IFZCb3goe1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zOiBbb1RleHQsIG9CdXR0b25dXG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvLyBtYWtlIHN1cmUgdG8gTk9UIHRyaWdnZXIgbXVsdGlwbGUgY2FuY2VsIGZsb3dzXG5cdFx0XHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhvQnV0dG9uKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5vcGVuQnkob0NhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhhdC5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBkb2N1bWVudCB0byBtb2RpZmllZCBzdGF0ZSBvbiBwYXRjaCBldmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKSB7XG5cdFx0dGhpcy5fYklzTW9kaWZpZWQgPSB0cnVlO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG93bmVyIGNvbXBvbmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldE93bmVyQ29tcG9uZW50XG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcmV0dXJucyBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0QXBwQ29tcG9uZW50KCkge1xuXHRcdHJldHVybiB0aGlzLl9vQXBwQ29tcG9uZW50O1xuXHR9XG5cblx0X29uRmllbGRDaGFuZ2Uob0V2ZW50OiBhbnksIG9DcmVhdGVCdXR0b246IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSwgZm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllczogRnVuY3Rpb24pIHtcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3Qgb0ZpZWxkUHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpO1xuXHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRyZXR1cm4gb0ZpZWxkUHJvbWlzZVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdC8vIFNldHRpbmcgdmFsdWUgb2YgZmllbGQgYXMgJycgaW4gY2FzZSBvZiB2YWx1ZSBoZWxwIGFuZCB2YWxpZGF0aW5nIG90aGVyIGZpZWxkc1xuXHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0Zm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdC8vZGlzYWJsaW5nIHRoZSBjb250aW51ZSBidXR0b24gaW4gY2FzZSBvZiBpbnZhbGlkIHZhbHVlIGluIGZpZWxkXG5cdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyB2YWxpZGF0aW5nIGFsbCB0aGUgZmllbGRzIGluIGNhc2Ugb2YgZW1wdHkgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0X2dldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnM6IGFueSwgdkNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3QgYU5vbkRlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpLmxlbmd0aDtcblx0XHRyZXR1cm4gYU5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxXG5cdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdCAgKVxuXHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XVxuXHRcdFx0ICApO1xuXHR9XG5cblx0X2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBhbnksXG5cdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nOiBhbnksXG5cdFx0b1RyYW5zaWVudENvbnRleHQ6IGFueSxcblx0XHRtRmllbGRzOiBhbnksXG5cdFx0b01vZGVsOiBhbnksXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBvRGlhbG9nOiBEaWFsb2c7XG5cdFx0Y29uc3Qgb1BhcmVudENvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0YlN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL05vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkc0RpYWxvZ1wiO1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIiksXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IG9QYXJlbnRDb250cm9sLmdldENvbnRyb2xsZXIoKS5vUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHM6IGFueVtdID0gW10sXG5cdFx0XHRcdG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0c1BhdGggPSBvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpID8gb0xpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIDogb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNQYXRoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUZpZWxkcykge1xuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLnB1c2gob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzTWV0YVBhdGh9LyR7bUZpZWxkc1tpXX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHNNZXRhUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCA9IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LFxuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXM6IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHguZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXM6IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KS50aGVuKGZ1bmN0aW9uIChvTmV3RnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRsZXQgYUZvcm1FbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdFx0XHRsZXQgb0NyZWF0ZUJ1dHRvbjogQnV0dG9uO1xuXHRcdFx0XHRjb25zdCB2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgY29udGludWUgYnV0dG9uIHNob3VsZCByZW1haW4gZGlzYWJsZWQgaW4gY2FzZSBvZiBlbXB0eSByZXF1aXJlZCBmaWVsZHMuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpIHx8IG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3I7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRmllbGQuZ2V0SWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0ZpZWxkSWQgaW4gbUZpZWxkVmFsdWVNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAodlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCkgPT09IFwiXCIgPyB1bmRlZmluZWQgOiB2VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhUmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFSZXN1bHRzLmV2ZXJ5KGZ1bmN0aW9uICh2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IHZWYWx1ZVswXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZWYWx1ZSAhPT0gbnVsbCAmJiB2VmFsdWUgIT09IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYkVuYWJsZWQ6IGJvb2xlYW4pIHtcblx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGJFbmFibGVkKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGZvY3VzIG91dCBmcm9tIGZpZWxkIG9yIG9uIHNlbGVjdGluZyBhIHZhbHVlIGZyb20gdGhlIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB0aGF0Ll9vbkZpZWxkQ2hhbmdlKG9FdmVudCwgb0NyZWF0ZUJ1dHRvbiwgbWVzc2FnZUhhbmRsZXIsIHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8qXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24ga2V5IHByZXNzLiB0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRoYW5kbGVMaXZlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdFx0Y29uc3QgdlZhbHVlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gdlZhbHVlO1xuXHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0XHRkZWZpbml0aW9uOiBvTmV3RnJhZ21lbnQsXG5cdFx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbiAob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjoge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3JlYXRlQnV0dG9uID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhtRmllbGRWYWx1ZU1hcCkubWFwKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1GaWVsZFZhbHVlTWFwW3NLZXldLnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ1ZhbHVlOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EaWFsb2dWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKFwic3VibWl0TGF0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvUmVzcG9uc2UgfHwgKG9SZXNwb25zZSAmJiBvUmVzcG9uc2UuYktlZXBEaWFsb2dPcGVuICE9PSB0cnVlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9SZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvLyBzaG93IGZvb3RlciBhcyBwZXIgVVggZ3VpZGVsaW5lcyB3aGVuIGRpYWxvZyBpcyBub3Qgb3BlblxuXHRcdFx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRiRGVsZXRlVHJhbnNpZW50Q29udGV4dDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdGFGb3JtRWxlbWVudHMgPSBvRGlhbG9nQ29udGVudFxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKVxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF1cblx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1FbGVtZW50c1wiKTtcblx0XHRcdFx0XHRpZiAob1BhcmVudENvbnRyb2wgJiYgb1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KSB7XG5cdFx0XHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBhIHBhcmVudCBjb250cm9sIHNwZWNpZmllZCBhZGQgdGhlIGRpYWxvZyBhcyBkZXBlbmRlbnRcblx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbiA9IG9EaWFsb2cuZ2V0QmVnaW5CdXR0b24oKTtcblx0XHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KG9UcmFuc2llbnRDb250ZXh0KTtcblx0XHRcdFx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKFxuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdGFJbW11dGFibGVGaWVsZHMsXG5cdFx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHRcdFx0Ly8gZm9vdGVyIG11c3Qgbm90IGJlIHZpc2libGUgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW4gYXMgcGVyIFVYIGd1aWRlbGluZXNcblx0XHRcdFx0XHRcdFx0KG9EaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdG9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9MaXN0QmluZGluZzogYW55LCBvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRsZXQgZm5SZXNvbHZlOiBGdW5jdGlvbiwgZm5SZWplY3Q6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdC8vIFdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IE9EYXRhIG1vZGVsIHY0IGNvbGxlYWd1ZXNcblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSxcblx0XHRcdFx0YlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGF0KTtcblx0XHRcdFx0aWYgKCFiU3VjY2Vzcykge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvcjogYW55ID0geyBiRGVsZXRlVHJhbnNpZW50Q29udGV4dDogZmFsc2UgfTtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdG9Db250ZXh0XG5cdFx0XHRcdFx0XHRcdC5jcmVhdGVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0aW9uIGVycm9yXCIsIGNvbnRleHRFcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBpcyB0cmFuc2llbnQgKC4uLiksIGJyb3dzZXIgd2lsbCBjb21lIGJhY2sgdG8gcHJldmlvdXMgc3RhdGVcblx0XHRcdFx0XHRcdFx0b0Vycm9yLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9FcnJvci5iRGVsZXRlVHJhbnNpZW50Q29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGZuUmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZuUmVzb2x2ZSh7IGJLZWVwRGlhbG9nT3BlbjogdHJ1ZSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuY3JlYXRlZCgpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0b0xpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhpcyk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldE5ld0FjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIHNDcmVhdGVIYXNoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlV2l0aFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLmluZGV4T2YoXCJjcmVhdGVXaXRoOlwiKSA+IC0xID8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKSB8fFxuXHRcdFx0XHRcdCAgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVDb3JlIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMgVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwoXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmcsXG5cdFx0c05ld0FjdGlvbjogc3RyaW5nLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmU6IFJlc291cmNlQnVuZGxlXG5cdCkge1xuXHRcdGNvbnN0IGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKSkge1xuXHRcdFx0XHRjb25zdCBpTGluZUl0ZW1JbmRleCA9IG9NZXRhTW9kZWxcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYClcblx0XHRcdFx0XHQuZmluZEluZGV4KGZ1bmN0aW9uIChvTGluZUl0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYUxpbmVJdGVtQWN0aW9uID0gb0xpbmVJdGVtLkFjdGlvbiA/IG9MaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFMaW5lSXRlbUFjdGlvbiA/IGFMaW5lSXRlbUFjdGlvblswXSA9PT0gc05ld0FjdGlvbiA6IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaUxpbmVJdGVtSW5kZXggPiAtMVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKVtpTGluZUl0ZW1JbmRleF0uTGFiZWxcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbigpIHx8XG5cdFx0XHQob01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c05ld0FjdGlvbn1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsYCkpIHx8XG5cdFx0XHQob1Jlc291cmNlQnVuZGxlQ29yZSAmJiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIpKVxuXHRcdCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNhY3Rpb25IZWxwZXI7XG4iXX0=