@sapui5/sap.fe.core 1.100.0 → 1.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -2,18 +2,32 @@
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/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/ui/core/mvc/OverrideExecution", "sap/ui/core/Component", "sap/fe/core/CommonUtils", "sap/fe/core/BusyLocker", "sap/fe/core/helpers/SemanticKeyHelper", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/base/Log", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ClassSupport"], function (ControllerExtension, ControllerExtensionMetadata, OverrideExecution, Component, CommonUtils, BusyLocker, SemanticKeyHelper, Filter, FilterOperator, Log, EditState, ModelHelper, ClassSupport) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/ui/core/Component", "sap/ui/core/Core", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/Filter", "sap/ui/model/FilterOperator"], function (Log, CommonUtils, BusyLocker, ActivitySync, draft, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, FELibrary, Component, Core, ControllerExtension, OverrideExecution, Filter, FilterOperator) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _class, _class2;
9
9
 
10
- var UI5Class = ClassSupport.UI5Class;
11
- var Public = ClassSupport.Public;
12
- var Override = ClassSupport.Override;
13
- var Final = ClassSupport.Final;
14
- var Extensible = ClassSupport.Extensible;
10
+ var publicExtension = ClassSupport.publicExtension;
11
+ var methodOverride = ClassSupport.methodOverride;
12
+ var finalExtension = ClassSupport.finalExtension;
13
+ var extensible = ClassSupport.extensible;
14
+ var defineUI5Class = ClassSupport.defineUI5Class;
15
15
 
16
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
16
+ function _catch(body, recover) {
17
+ try {
18
+ var result = body();
19
+ } catch (e) {
20
+ return recover(e);
21
+ }
22
+
23
+ if (result && result.then) {
24
+ return result.then(void 0, recover);
25
+ }
26
+
27
+ return result;
28
+ }
29
+
30
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
17
31
 
18
32
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
33
 
@@ -24,12 +38,11 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
24
38
  *
25
39
  * @namespace
26
40
  * @alias sap.fe.core.controllerextensions.InternalRouting
27
- *
28
41
  * @private
29
42
  * @since 1.74.0
30
43
  */
31
- var InternalRouting = (_dec = UI5Class("sap.fe.core.controllerextensions.InternalRouting", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Override(), _dec4 = Extensible(OverrideExecution.After), _dec5 = Extensible(OverrideExecution.After), _dec6 = Extensible(OverrideExecution.After), _dec7 = Extensible(OverrideExecution.After), _dec8 = Extensible(OverrideExecution.Before), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
32
- _inherits(InternalRouting, _ControllerExtension);
44
+ var InternalRouting = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InternalRouting"), _dec2 = methodOverride(), _dec3 = methodOverride(), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = publicExtension(), _dec7 = extensible(OverrideExecution.After), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = publicExtension(), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = finalExtension(), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = publicExtension(), _dec28 = finalExtension(), _dec29 = publicExtension(), _dec30 = extensible(OverrideExecution.Before), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
45
+ _inheritsLoose(InternalRouting, _ControllerExtension);
33
46
 
34
47
  function InternalRouting() {
35
48
  return _ControllerExtension.apply(this, arguments) || this;
@@ -152,7 +165,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
152
165
  * @param {sap.ui.model.odata.v4.Context} oContext The context to be navigated to
153
166
  * @param {object} [mParameters] Optional navigation parameters
154
167
  * @returns {Promise} Promise resolved when the navigation has been triggered
155
- *
156
168
  * @ui5-restricted
157
169
  */
158
170
  ;
@@ -177,7 +189,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
177
189
  editable: mParameters.editable,
178
190
  bPersistOPScroll: mParameters.bPersistOPScroll,
179
191
  updateFCLLevel: mParameters.updateFCLLevel,
180
- bForceFocus: mParameters.bForceFocus
192
+ bForceFocus: mParameters.bForceFocus,
193
+ bNavigateToSiblingEntity: mParameters.bNavigateToSiblingEntity
181
194
  });
182
195
  }).catch(function (oError) {
183
196
  Log.error("Error with the async context", oError);
@@ -204,7 +217,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
204
217
 
205
218
  if (bOverrideNav) {
206
219
  oInternalModel.setProperty("/paginatorCurrentContext", oContext);
207
- return Promise.resolve();
220
+ return Promise.resolve(true);
208
221
  }
209
222
  }
210
223
 
@@ -217,7 +230,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
217
230
  * @param {sap.ui.model.odata.v4.Context} oContext Context to be navigated from
218
231
  * @param {object} [mParameters] Optional navigation parameters
219
232
  * @returns {Promise} Promise resolved when the navigation has been triggered
220
- *
221
233
  * @ui5-restricted
222
234
  */
223
235
  ;
@@ -233,7 +245,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
233
245
  * @param {sap.ui.model.odata.v4.Context} oContext Context to be navigated to
234
246
  * @param {object} mParameters Optional navigation parameters
235
247
  * @returns {Promise} Promise resolved when the navigation has been triggered
236
- *
237
248
  * @ui5-restricted
238
249
  */
239
250
  ;
@@ -242,7 +253,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
242
253
  var _this$_oView$getBindi;
243
254
 
244
255
  if (((_this$_oView$getBindi = this._oView.getBindingContext("internal")) === null || _this$_oView$getBindi === void 0 ? void 0 : _this$_oView$getBindi.getProperty("messageFooterContainsErrors")) === true) {
245
- return Promise.resolve();
256
+ return Promise.resolve(true);
246
257
  }
247
258
 
248
259
  mParameters = mParameters || {};
@@ -278,7 +289,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
278
289
  *
279
290
  * @param {sap.ui.model.odata.v4.Context} oContext
280
291
  * @returns {boolean}
281
- *
282
292
  * @ui5-restricted
283
293
  */
284
294
  ;
@@ -294,7 +304,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
294
304
  * Builds the binding context from the navigation parameters, and bind the page accordingly.
295
305
  *
296
306
  * @param {object} oEvent
297
- *
298
307
  * @ui5-restricted
299
308
  */
300
309
  ;
@@ -429,7 +438,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
429
438
  _this4._bindPageToPath(sTechnicalPath, oModel, oNavigationParameters);
430
439
  }).catch(function (oError) {
431
440
  // Error handling for erroneous metadata request
432
- var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
441
+ var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
433
442
 
434
443
  _this4.navigateToMessagePage(oResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
435
444
  title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
@@ -445,7 +454,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
445
454
  * @param {Array} aSemanticKeys The semantic keys for the path
446
455
  * @param {object} oMetaModel The instance of the meta model
447
456
  * @returns {sap.ui.model.Filter} The filter
448
- *
449
457
  * @ui5-restricted
450
458
  */
451
459
  ;
@@ -528,7 +536,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
528
536
  * @param {sap.ui.model.odata.v4.ODataModel} oModel The model for the path
529
537
  * @param {Array} aSemanticKeys The semantic keys for the path
530
538
  * @returns {Promise} A Promise containing the path with technical keys if sSemanticPath could be interpreted as a semantic path, null otherwise
531
- *
532
539
  * @ui5-restricted
533
540
  */
534
541
  ;
@@ -575,7 +582,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
575
582
  * @param {string} sPath The path to test
576
583
  * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel The associated metadata model
577
584
  * @returns {boolean} `true` if the path is eligible
578
- *
579
585
  * @ui5-restricted
580
586
  */
581
587
  ;
@@ -597,8 +603,9 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
597
603
  }
598
604
  /**
599
605
  * Builds a path with semantic keys from a path with technical keys.
606
+ *
600
607
  * @param {string} sPathToResolve The path to be transformed
601
- * @param oModel
608
+ * @param oModel The OData model
602
609
  * @returns {Promise} String promise for the new path. If sPathToResolved couldn't be interpreted as a semantic path, it is returned as is.
603
610
  * @ui5-restricted
604
611
  */
@@ -656,7 +663,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
656
663
  * @param {string} sTargetPath The path to build the context. Needs to contain technical keys only.
657
664
  * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
658
665
  * @param {object} oNavigationParameters Navigation parameters
659
- *
660
666
  * @ui5-restricted
661
667
  */
662
668
  ;
@@ -676,7 +682,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
676
682
  oTargetContext = oUseContext;
677
683
  } else {
678
684
  // Otherwise we need to create it from sTargetPath
679
- oTargetContext = this._createBindingContext(sTargetPath, oModel);
685
+ oTargetContext = this._createContext(sTargetPath, oModel, oNavigationParameters.bNavigateToSiblingEntity);
680
686
  }
681
687
 
682
688
  if (oTargetContext !== oCurrentContext) {
@@ -692,7 +698,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
692
698
  * @param {sap.ui.model.odata.v4.Context} oContext Context to be bound
693
699
  * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
694
700
  * @param {object} oNavigationParameters Navigation parameters
695
- *
696
701
  * @ui5-restricted
697
702
  */
698
703
  ;
@@ -706,18 +711,23 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
706
711
  } else {
707
712
  var oParentListBinding = oContext.getBinding();
708
713
 
709
- if (!oContext.getBinding() || oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")) {
710
- // We need to recreate the context otherwise we get errors
711
- oContext = this._createBindingContext(oContext.getPath(), oModel);
712
-
713
- if (EditState.isEditStateDirty()) {
714
- // TODO: as a workaround we invalidate the model cache while the app is dirty
715
- // as the manage model sets the parent in an async task and the request side effects
716
- // relies on the parent relationship we have to set a timeout 0
717
- setTimeout(function () {
718
- _this6._refreshBindingContext(oContext);
719
- }, 0);
714
+ var oRootViewController = this._oAppComponent.getRootViewController();
715
+
716
+ if (oRootViewController.isFclEnabled()) {
717
+ if (!oParentListBinding || !oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding") || oParentListBinding.getUpdateGroupId() === "submitLater") {
718
+ // if the parentBinding is not a listBinding or the transient one from the create, we create a new context
719
+ oContext = this._createContext(oContext.getPath(), oModel);
720
720
  }
721
+
722
+ oContext.setKeepAlive(true, function () {
723
+ // it is possible that the context is no longer kept alive
724
+ if (oContext.isKeepAlive() && oRootViewController.isContextUsedInPages(oContext)) {
725
+ _this6.navigateBackFromContext(oContext);
726
+ }
727
+ });
728
+ } else if (!oParentListBinding || oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
729
+ // We need to recreate the context otherwise we get errors
730
+ oContext = this._createContext(oContext.getPath(), oModel, oNavigationParameters.bNavigateToSiblingEntity);
721
731
  } // Set the binding context with the proper before/after callbacks
722
732
 
723
733
 
@@ -735,87 +745,138 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
735
745
  }
736
746
  }
737
747
  /**
738
- * Creates a binding context from a path.
748
+ * Creates a context from a path.
739
749
  *
740
750
  * @param {string} sPath The path
741
751
  * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
742
- * @returns {sap.ui.model.odata.v4.Context} Created context
743
- *
752
+ * @param {boolean} navigateToSiblingEntity A parameter that tells whether to navigate to the context on data received
753
+ * @returns {sap.ui.model.odata.v4.Context} The created context
744
754
  * @ui5-restricted
745
755
  */
746
756
  ;
747
757
 
748
- _proto._createBindingContext = function _createBindingContext(sPath, oModel) {
758
+ _proto._createContext = function _createContext(sPath, oModel) {
749
759
  var _this7 = this;
750
760
 
761
+ var navigateToSiblingEntity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
751
762
  var oPageComponent = this._oPageComponent,
752
763
  sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
753
764
  sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/" + sEntitySet,
754
765
  oMetaModel = oModel.getMetaModel(),
755
766
  mParameters = {
756
- $$patchWithoutSideEffects: true,
757
767
  $$groupId: "$auto.Heroes",
758
- $$updateGroupId: "$auto"
759
- };
768
+ $$updateGroupId: "$auto",
769
+ $$patchWithoutSideEffects: true
770
+ }; // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
771
+
772
+ var oDraftRoot = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot");
773
+ var oDraftNode = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftNode");
760
774
 
761
- if (sEntitySet) {
762
- var sMessagesPath = oMetaModel.getObject(sContextPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
775
+ var oRootViewController = this._oAppComponent.getRootViewController();
763
776
 
764
- if (sMessagesPath) {
765
- mParameters.$select = sMessagesPath;
777
+ if (oRootViewController.isFclEnabled()) {
778
+ var oContext = oModel.getKeepAliveContext(sPath, false, mParameters);
779
+
780
+ if (oDraftRoot || oDraftNode) {
781
+ // when switching between draft and edit we need to ensure those properties are requested again even if they are in the binding's cache
782
+ // otherwise when you edit and go to the saved version you have no way of switching back to the edit version
783
+ oContext.requestSideEffects(["HasActiveEntity", "HasDraftEntity", "IsActiveEntity", "DraftAdministrativeData"]);
766
784
  }
767
- } // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
768
785
 
786
+ return oContext;
787
+ } else {
788
+ if (sEntitySet) {
789
+ var sMessagesPath = oMetaModel.getObject(sContextPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
769
790
 
770
- var oDraftRoot = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot");
771
- var oDraftNode = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftNode");
791
+ if (sMessagesPath) {
792
+ mParameters.$select = sMessagesPath;
793
+ }
794
+ } // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
772
795
 
773
- if (oDraftRoot || oDraftNode) {
774
- if (mParameters.$select === undefined) {
775
- mParameters.$select = "HasActiveEntity,HasDraftEntity,IsActiveEntity";
776
- } else {
777
- mParameters.$select += ",HasActiveEntity,HasDraftEntity,IsActiveEntity";
796
+
797
+ if (oDraftRoot || oDraftNode) {
798
+ if (mParameters.$select === undefined) {
799
+ mParameters.$select = "HasActiveEntity,HasDraftEntity,IsActiveEntity";
800
+ } else {
801
+ mParameters.$select += ",HasActiveEntity,HasDraftEntity,IsActiveEntity";
802
+ }
778
803
  }
779
- }
780
804
 
781
- var oHiddenBinding = oModel.bindContext(sPath, undefined, mParameters);
782
- oHiddenBinding.attachEventOnce("dataRequested", function () {
783
- BusyLocker.lock(_this7._oView);
784
- });
785
- oHiddenBinding.attachEventOnce("dataReceived", this._dataReceivedEventHandler.bind(this));
786
- return oHiddenBinding.getBoundContext();
805
+ var oHiddenBinding = oModel.bindContext(sPath, undefined, mParameters);
806
+ oHiddenBinding.attachEventOnce("dataRequested", function () {
807
+ BusyLocker.lock(_this7._oView);
808
+ });
809
+ oHiddenBinding.attachEventOnce("dataReceived", this._dataReceivedEventHandler.bind(this, navigateToSiblingEntity));
810
+ return oHiddenBinding.getBoundContext();
811
+ }
787
812
  };
788
813
 
789
- _proto._dataReceivedEventHandler = function _dataReceivedEventHandler(oEvent) {
790
- var _this8 = this;
814
+ _proto._dataReceivedEventHandler = function _dataReceivedEventHandler(navigateToSiblingEntity, oEvent) {
815
+ try {
816
+ var _oEvent$getSource, _this9$_oView, _this9$_oView$getCont, _this9$_oView$getCont2;
817
+
818
+ var _exit2 = false;
819
+
820
+ var _this9 = this;
821
+
822
+ function _temp6(_result) {
823
+ if (_exit2) return _result;
824
+
825
+ var _temp2 = function () {
826
+ if (sErrorDescription) {
827
+ var _temp5 = _catch(function () {
828
+ return Promise.resolve(Core.getLibraryResourceBundle("sap.fe.core", true)).then(function (oResourceBundle) {
829
+ var messageHandler = _this9.base.messageHandler;
830
+ var mParams = {};
831
+
832
+ if (sErrorDescription && sErrorDescription.status === 503) {
833
+ mParams = {
834
+ isInitialLoad503Error: true,
835
+ shellBack: true
836
+ };
837
+ } else {
838
+ mParams = {
839
+ title: oResourceBundle.getText("SAPFE_ERROR"),
840
+ description: sErrorDescription,
841
+ isDataReceivedError: true,
842
+ shellBack: true
843
+ };
844
+ }
845
+
846
+ messageHandler.showMessages(mParams);
847
+ });
848
+ }, function (oError) {
849
+ Log.error("Error while getting the core resource bundle", oError);
850
+ });
851
+
852
+ if (_temp5 && _temp5.then) return _temp5.then(function () {});
853
+ }
854
+ }();
855
+
856
+ if (_temp2 && _temp2.then) return _temp2.then(function () {});
857
+ }
791
858
 
792
- var sErrorDescription = oEvent && oEvent.getParameter("error");
793
- BusyLocker.unlock(this._oView);
859
+ var context = (oEvent === null || oEvent === void 0 ? void 0 : oEvent.getSource) && (oEvent === null || oEvent === void 0 ? void 0 : (_oEvent$getSource = oEvent.getSource()) === null || _oEvent$getSource === void 0 ? void 0 : _oEvent$getSource.getBoundContext());
860
+ var ProgrammingModel = FELibrary.ProgrammingModel;
861
+ var programmingModel = (_this9$_oView = _this9._oView) === null || _this9$_oView === void 0 ? void 0 : (_this9$_oView$getCont = _this9$_oView.getController()) === null || _this9$_oView$getCont === void 0 ? void 0 : (_this9$_oView$getCont2 = _this9$_oView$getCont._editFlow) === null || _this9$_oView$getCont2 === void 0 ? void 0 : _this9$_oView$getCont2.getProgrammingModel(context);
862
+ var sErrorDescription = oEvent && oEvent.getParameter("error");
863
+ BusyLocker.unlock(_this9._oView);
794
864
 
795
- if (sErrorDescription) {
796
- // TODO: in case of 404 the text shall be different
797
- sap.ui.getCore().getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
798
- var messageHandler = _this8.base.messageHandler;
799
- var mParams = {};
865
+ var _temp7 = function () {
866
+ if (programmingModel === ProgrammingModel.Draft && ActivitySync.isCollaborationEnabled(_this9._oView) && navigateToSiblingEntity && context.getProperty("IsActiveEntity") && context.getObject().DraftAdministrativeData) {
867
+ return Promise.resolve(draft.computeSiblingInformation(context, context)).then(function (siblingInfo) {
868
+ if (siblingInfo) {
869
+ _this9.navigateToContext(siblingInfo.targetContext);
800
870
 
801
- if (sErrorDescription && sErrorDescription.status === 503) {
802
- mParams = {
803
- isInitialLoad503Error: true,
804
- shellBack: true
805
- };
806
- } else {
807
- mParams = {
808
- title: oResourceBundle.getText("SAPFE_ERROR"),
809
- description: sErrorDescription,
810
- isDataReceivedError: true,
811
- shellBack: true
812
- };
871
+ _exit2 = true;
872
+ }
873
+ });
813
874
  }
875
+ }();
814
876
 
815
- messageHandler.showMessages(mParams);
816
- }).catch(function (oError) {
817
- Log.error("Error while getting the core resource bundle", oError);
818
- });
877
+ return Promise.resolve(_temp7 && _temp7.then ? _temp7.then(_temp6) : _temp6(_temp7));
878
+ } catch (e) {
879
+ return Promise.reject(e);
819
880
  }
820
881
  }
821
882
  /**
@@ -827,7 +888,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
827
888
  * request them.
828
889
  *
829
890
  * @param {sap.ui.model.odata.v4.Context} oBindingContext Context to be refreshed
830
- *
831
891
  * @ui5-restricted
832
892
  */
833
893
  ;
@@ -910,7 +970,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
910
970
  * Gets the binding context of the page or the component.
911
971
  *
912
972
  * @returns {sap.ui.model.odata.v4.Context} The binding context
913
- *
914
973
  * @ui5-restricted
915
974
  */
916
975
  ;
@@ -926,23 +985,31 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
926
985
  * Sets the binding context of the page or the component.
927
986
  *
928
987
  * @param {sap.ui.model.odata.v4.Context} oContext The binding context
929
- *
930
988
  * @ui5-restricted
931
989
  */
932
990
  ;
933
991
 
934
992
  _proto._setBindingContext = function _setBindingContext(oContext) {
993
+ var oPreviousContext, oTargetControl;
994
+
935
995
  if (this._oPageComponent) {
936
- this._oPageComponent.setBindingContext(oContext);
996
+ oPreviousContext = this._oPageComponent.getBindingContext();
997
+ oTargetControl = this._oPageComponent;
937
998
  } else {
938
- this._oView.setBindingContext(oContext);
999
+ oPreviousContext = this._oView.getBindingContext();
1000
+ oTargetControl = this._oView;
1001
+ }
1002
+
1003
+ oTargetControl.setBindingContext(oContext);
1004
+
1005
+ if (oPreviousContext && oPreviousContext.isKeepAlive()) {
1006
+ oPreviousContext.setKeepAlive(false);
939
1007
  }
940
1008
  }
941
1009
  /**
942
1010
  * Gets the flexible column layout (FCL) level corresponding to the view (-1 if the app is not FCL).
943
1011
  *
944
1012
  * @returns {number} The level
945
- *
946
1013
  * @ui5-restricted
947
1014
  */
948
1015
  ;
@@ -988,11 +1055,11 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
988
1055
  var oMetaModel = oContext.getModel().getMetaModel();
989
1056
 
990
1057
  if (oViewData && oViewData.viewLevel === 1 && ModelHelper.isDraftSupported(oMetaModel, oContext.getPath())) {
991
- CommonUtils.fnProcessDataLossOrDraftDiscardConfirmation(function () {
1058
+ draft.processDataLossOrDraftDiscardConfirmation(function () {
992
1059
  base._routing.navigateBackFromContext(oContext, {
993
1060
  noPreservationCache: true
994
1061
  });
995
- }, Function.prototype, oContext, oSource.getController(), false);
1062
+ }, Function.prototype, oContext, oSource.getController(), false, draft.NavigationType.BackNavigation);
996
1063
  } else {
997
1064
  base._routing.navigateBackFromContext(oContext, {
998
1065
  noPreservationCache: true
@@ -1001,7 +1068,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
1001
1068
  };
1002
1069
 
1003
1070
  return InternalRouting;
1004
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [Public, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [Public, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [Public, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [Public, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [Public, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
1071
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_createContext", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "_createContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
1005
1072
  return InternalRouting;
1006
1073
  }, false);
1007
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJVSTVDbGFzcyIsIkNvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSIsIk92ZXJyaWRlIiwiRXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwidGhlbiIsIm9Sb3V0aW5nU2VydmljZSIsIl9vblJvdXRlTWF0Y2hlZCIsImJpbmQiLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJfb1RhcmdldEluZm9ybWF0aW9uIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJjYXRjaCIsIm9uUm91dGVNYXRjaGVkIiwib25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCIsIm9uQmVmb3JlQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwib1JvdXRpbmciLCJnZXRDb250cm9sbGVyIiwicm91dGluZyIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwib25Db250ZXh0Qm91bmRUb1ZpZXciLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJvU2VtYW50aWNPYmplY3QiLCJiUHJlc2VydmVIaXN0b3J5Iiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0Vmlld0RhdGEiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIm9Db250ZXh0SW5mbyIsImlzQSIsImFzeW5jQ29udGV4dCIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiZWRpdGFibGUiLCJiUGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJiRm9yY2VGb2N1cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiYkRlZmVycmVkQ29udGV4dCIsImNhbGxFeHRlbnNpb24iLCJvSW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJzb3VyY2VCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdCIsImJpbmRpbmdDb250ZXh0Iiwib0V2ZW50IiwiYk92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJGQ0xMZXZlbCIsIl9nZXRGQ0xMZXZlbCIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRQcm9wZXJ0eSIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsInNIYXNoIiwiZ2V0SGFzaCIsImluZGV4T2YiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm5hdlRvSGFzaCIsImdldERlZmF1bHRDcmVhdGVIYXNoIiwiZGlzcGxheU1lc3NhZ2VQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiYVRhcmdldHMiLCJnZXRQYXJhbWV0ZXIiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInNUYXJnZXQiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInJlcGxhY2UiLCJtQXJndW1lbnRzIiwiZ2V0UGFyYW1ldGVycyIsImFyZ3VtZW50cyIsImJEZWZlcnJlZCIsIm9OYXZpZ2F0aW9uUGFyYW1ldGVycyIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsImJBY3Rpb25DcmVhdGUiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJfcmVzb2x2ZVNlbWFudGljUGF0aCIsInNUZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwib1Jlc291cmNlQnVuZGxlIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiX2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgiLCJzU2VtYW50aWNQYXRoIiwiYVNlbWFudGljS2V5cyIsIm9NZXRhTW9kZWwiLCJmblVucXVvdGVBbmREZWNvZGUiLCJsYXN0SW5kZXhPZiIsImxlbmd0aCIsImRlY29kZVVSSUNvbXBvbmVudCIsInN1YnN0cmluZyIsImFLZXlWYWx1ZXMiLCJzcGxpdCIsImFGaWx0ZXJzIiwiYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJNb2RlbEhlbHBlciIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsInNLZXlWYWx1ZSIsIkZpbHRlciIsInBhdGgiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJvQ29tYmluZWRGaWx0ZXIiLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1RhcmdldENvbnRleHQiLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsInNldFRpbWVvdXQiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJ1bmxvY2siLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaSIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiY29uY2F0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwidmlld0xldmVsIiwiaXNEcmFmdFN1cHBvcnRlZCIsImZuUHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFFTUEsZSxXQURMQyxRQUFRLENBQUMsa0RBQUQsRUFBcURDLDJCQUFyRCxDLFVBWVBDLFFBQVEsRSxVQUtSQSxRQUFRLEUsVUFxQ1JDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsVUFNVkYsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxVQU1WRixVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBU1ZGLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsVUE0MEJWRixVQUFVLENBQUNDLGlCQUFpQixDQUFDRSxNQUFuQixDOzs7Ozs7Ozs7V0ExNEJYQyxNLEdBREEsa0JBQ1M7QUFDUixXQUFLQyxnQkFBTCxJQUF5QixLQUFLQSxnQkFBTCxDQUFzQkMsa0JBQXRCLENBQXlDLEtBQUtDLG9CQUE5QyxDQUF6QjtBQUNBLEs7O1dBR0RDLE0sR0FEQSxrQkFDUztBQUFBOztBQUNSLFdBQUtDLE1BQUwsR0FBYyxLQUFLQyxJQUFMLENBQVVDLE9BQVYsRUFBZDtBQUNBLFdBQUtDLGNB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NUJDLE0sNEtBTUFBLE0sNktBTUFBLE0scUtBU0FBLE0sc0tBd0JBQSxNLGdLQXlCQUEsTSxpS0FjQUEsTSxFQUNBQyxLLHlLQThEQUQsTSxFQUNBQyxLLGdMQWlCQUQsTSxFQUNBQyxLLHVMQWNBRCxNLEVBQ0FDLEssb0xBVUFELE0sRUFDQUMsSyw4S0FvQkFELE0sRUFDQUMsSyx5S0FxbkJBRCxNLEVBQ0FDLEssNEpBc0JBRCxNO1NBeUJhN1MsZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IEV4dGVuc2libGUsIEZpbmFsLCBPdmVycmlkZSwgUHVibGljLCBVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB7IFRlbXBsYXRlQ29tcG9uZW50VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvUm91dGVyUHJveHlcIjtcbmltcG9ydCB7IFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IFRlbXBsYXRlQ29tcG9uZW50VHlwZSB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcml2YXRlIF9vVGFyZ2V0SW5mb3JtYXRpb246IGFueTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKSB7XG5cdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlICYmIHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBUZW1wbGF0ZUNvbXBvbmVudFR5cGU7XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmF2aWdhdGlvbiB0YXJnZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0KG9Db250ZXh0OiBhbnksIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLCBvU2VtYW50aWNPYmplY3Q/OiBvYmplY3QsIGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgc1JvdXRlTmFtZSwgbVBhcmFtZXRlck1hcHBpbmcsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgbnVsbCwgbnVsbCwgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fVxuXHRcdHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRuYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0SW5mbzogYW55ID0ge307XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdGlmIChvQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dCkge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dFxuXHRcdFx0XHRcdC50aGVuKChvQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBvbmNlIHRoZSBjb250ZXh0IGlzIHJldHVybmVkIHdlIG5hdmlnYXRlIGludG8gaXRcblx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2l0aCB0aGUgYXN5bmMgY29udGV4dFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHRvQ29udGV4dEluZm8uc291cmNlQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdG9Db250ZXh0SW5mby5iaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9FdmVudCkge1xuXHRcdFx0XHRvQ29udGV4dEluZm8ub0V2ZW50ID0gbVBhcmFtZXRlcnMub0V2ZW50O1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3QgYk92ZXJyaWRlTmF2ID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24ob0NvbnRleHRJbmZvKTtcblx0XHRcdGlmIChiT3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0bmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRvIGJpbmQgdGhlIHBhZ2Ugd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWRcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBCdWlsZHMgdGhlIGJpbmRpbmcgY29udGV4dCBmcm9tIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBiaW5kIHRoZSBwYWdlIGFjY29yZGluZ2x5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaXMgcGFydCBvZiB0aGUgZXZlbnQgdGFyZ2V0c1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikudGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHJpZXZlIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGxldCBzVGFyZ2V0O1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdHNUYXJnZXQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0c1RhcmdldCA9IHNUYXJnZXQgfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKHNUYXJnZXQgPT09IG51bGwgfHwgc1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHdlIGFscmVhZHkgZ290IHNUYXJnZXQgPT0gJycsIHdoaWNoIGlzIGEgdmFsaWQgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdHNUYXJnZXQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblx0XHRzVGFyZ2V0ID0gc1RhcmdldC5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBwYXJhbWV0ZXJzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRjb25zdCBtQXJndW1lbnRzID0gKG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkgYXMgYW55KS5hcmd1bWVudHM7XG5cdFx0bGV0IGJEZWZlcnJlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiBtQXJndW1lbnRzKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSBtQXJndW1lbnRzW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBzVGFyZ2V0LmluZGV4T2YoXCJ7XCIgKyBzS2V5ICsgXCJ9XCIpID49IDApIHtcblx0XHRcdFx0YkRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0c1RhcmdldCA9IHNUYXJnZXQucmVwbGFjZShcIntcIiArIHNLZXkgKyBcIn1cIiwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKG1Bcmd1bWVudHNbXCI/cXVlcnlcIl0gJiYgbUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgdGFyZ2V0IGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChzVGFyZ2V0ICYmIHNUYXJnZXRbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRzVGFyZ2V0ID0gXCIvXCIgKyBzVGFyZ2V0O1xuXHRcdH1cblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0bGV0IG9PdXQ7XG5cdFx0aWYgKGJEZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChzVGFyZ2V0LCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2Uoc1RhcmdldCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0LFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCkgJiYgdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKS5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0dGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2Uoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0KSB7XG5cdFx0aWYgKHNUYXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNvbHZlU2VtYW50aWNQYXRoKHNUYXJnZXRQYXRoLCBvTW9kZWwpXG5cdFx0XHRcdC50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgoc1RlY2huaWNhbFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9FcnJvci5tZXNzYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5GaWx0ZXJ9IFRoZSBmaWx0ZXJcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIGFTZW1hbnRpY0tleXM6IGFueVtdLCBvTWV0YU1vZGVsOiBvYmplY3QpIHtcblx0XHRjb25zdCBmblVucXVvdGVBbmREZWNvZGUgPSBmdW5jdGlvbihzVmFsdWU6IGFueSkge1xuXHRcdFx0aWYgKHNWYWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiBzVmFsdWUubGFzdEluZGV4T2YoXCInXCIpID09PSBzVmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHF1b3RlcyBmcm9tIHRoZSB2YWx1ZSBhbmQgZGVjb2RlIHNwZWNpYWwgY2hhcnNcblx0XHRcdFx0c1ZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHNWYWx1ZS5zdWJzdHJpbmcoMSwgc1ZhbHVlLmxlbmd0aCAtIDEpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzVmFsdWU7XG5cdFx0fTtcblx0XHRjb25zdCBhS2V5VmFsdWVzID0gc1NlbWFudGljUGF0aC5zdWJzdHJpbmcoc1NlbWFudGljUGF0aC5pbmRleE9mKFwiKFwiKSArIDEsIHNTZW1hbnRpY1BhdGgubGVuZ3RoIC0gMSkuc3BsaXQoXCIsXCIpO1xuXHRcdGxldCBhRmlsdGVyczogRmlsdGVyW107XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggIT0gYUtleVZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG9NZXRhTW9kZWwpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHQvLyBUYWtlIHRoZSBmaXJzdCBrZXkgdmFsdWVcblx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhS2V5VmFsdWVzWzBdKTtcblx0XHRcdGFGaWx0ZXJzID0gW1xuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRwYXRoOiBhU2VtYW50aWNLZXlzWzBdLiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdHZhbHVlMTogc0tleVZhbHVlLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdH0pXG5cdFx0XHRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtS2V5VmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdC8vIENyZWF0ZSBhIG1hcCBvZiBhbGwga2V5IHZhbHVlc1xuXHRcdFx0YUtleVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IHNLZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYkZhaWxlZCA9IGZhbHNlO1xuXHRcdFx0YUZpbHRlcnMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbihvU2VtYW50aWNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzS2V5ID0gb1NlbWFudGljS2V5LiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0c1ZhbHVlID0gbUtleVZhbHVlc1tzS2V5XTtcblxuXHRcdFx0XHRpZiAoc1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBzS2V5LFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJGYWlsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiWFhcIlxuXHRcdFx0XHRcdH0pOyAvLyB3aWxsIGJlIGlnbm9yZSBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYkZhaWxlZCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYSBkcmFmdCBmaWx0ZXIgdG8gbWFrZSBzdXJlIHdlIHRha2UgdGhlIGRyYWZ0IGVudGl0eSBpZiB0aGVyZSBpcyBvbmVcblx0XHQvLyBPciB0aGUgYWN0aXZlIGVudGl0eSBvdGhlcndpc2Vcblx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblxuXHRcdGNvbnN0IG9Db21iaW5lZEZpbHRlciA9IG5ldyBGaWx0ZXIoYUZpbHRlcnMsIHRydWUpO1xuXHRcdHJldHVybiBvQ29tYmluZWRGaWx0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZW1hbnRpY1BhdGggVGhlIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgbW9kZWwgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHNTZW1hbnRpY1BhdGggY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBhU2VtYW50aWNLZXlzOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzU2VtYW50aWNQYXRoKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWFTZW1hbnRpY0tleXMgfHwgYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgc2V0IG9mIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBhbGwga2V5c1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSB0aGlzLl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGgsIGFTZW1hbnRpY0tleXMsIG9NZXRhTW9kZWwpO1xuXHRcdGlmIChvRmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Rcblx0XHRpZiAoIXNFbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0VudGl0eVNldFBhdGggPSBcIi9cIiArIHNFbnRpdHlTZXRQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qoc0VudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHRcIiQkZ3JvdXBJZFwiOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKS50aGVuKGZ1bmN0aW9uKG9Db250ZXh0czogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRleHRzICYmIG9Db250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0c1swXS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBObyBkYXRhIGNvdWxkIGJlIGxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGVsaWdpYmxlIGZvciBzZW1hbnRpYyBib29rbWFya2luZy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFRoZSBwYXRoIHRvIHRlc3Rcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWx9IG9NZXRhTW9kZWwgVGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgbW9kZWxcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBlbGlnaWJsZVxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nKHNQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IGFueSkge1xuXHRcdC8vIE9ubHkgcGF0aCBvbiByb290IG9iamVjdHMgYWxsb3cgc2VtYW50aWMgYm9va21hcmtpbmcsIGkuZS4gc1BhdGggPSB4eHgoeXl5KVxuXHRcdGNvbnN0IGFNYXRjaGVzID0gL15bXFwvXT8oXFx3KylcXChbXlxcL10rXFwpJC8uZXhlYyhzUGF0aCk7XG5cdFx0aWYgKCFhTWF0Y2hlcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGVudGl0eVNldCBuYW1lXG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBcIi9cIiArIGFNYXRjaGVzWzFdO1xuXHRcdC8vIENoZWNrIHRoZSBlbnRpdHkgc2V0IHN1cHBvcnRzIGRyYWZ0IChvdGhlcndpc2Ugd2UgZG9uJ3Qgc3VwcG9ydCBzZW1hbnRpYyBib29rbWFya2luZylcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIik7XG5cdFx0cmV0dXJuIG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyBmcm9tIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG9Nb2RlbFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXJcblx0XHRcdC5nZXRIYXNoQ2hhbmdlcigpXG5cdFx0XHQuZ2V0SGFzaCgpXG5cdFx0XHQuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpKSB7XG5cdFx0XHRsZXQgb1RhcmdldENvbnRleHQ7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IG9Vc2VDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gY3JlYXRlIGl0IGZyb20gc1RhcmdldFBhdGhcblx0XHRcdFx0b1RhcmdldENvbnRleHQgPSB0aGlzLl9jcmVhdGVCaW5kaW5nQ29udGV4dChzVGFyZ2V0UGF0aCwgb01vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChvVGFyZ2V0Q29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9UYXJnZXRDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJSZWFzb25Jc0lhcHBTdGF0ZSAmJiBFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdGlmICghb0NvbnRleHQuZ2V0QmluZGluZygpIHx8IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQmluZGluZ0NvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0XHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0XHRcdC8vIFRPRE86IGFzIGEgd29ya2Fyb3VuZCB3ZSBpbnZhbGlkYXRlIHRoZSBtb2RlbCBjYWNoZSB3aGlsZSB0aGUgYXBwIGlzIGRpcnR5XG5cdFx0XHRcdFx0Ly8gYXMgdGhlIG1hbmFnZSBtb2RlbCBzZXRzIHRoZSBwYXJlbnQgaW4gYW4gYXN5bmMgdGFzayBhbmQgdGhlIHJlcXVlc3Qgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0Ly8gcmVsaWVzIG9uIHRoZSBwYXJlbnQgcmVsYXRpb25zaGlwIHdlIGhhdmUgdG8gc2V0IGEgdGltZW91dCAwXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhvQ29udGV4dCwge1xuXHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0bGlzdEJpbmRpbmc6IG9QYXJlbnRMaXN0QmluZGluZyxcblx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhvQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBiaW5kaW5nIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gQ3JlYXRlZCBjb250ZXh0XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUJpbmRpbmdDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgXCIvXCIgKyBzRW50aXR5U2V0KSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlLFxuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiXG5cdFx0XHR9O1xuXG5cdFx0aWYgKHNFbnRpdHlTZXQpIHtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ29udGV4dFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xuXHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiKTtcblx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fSk7XG5cdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMuX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdH1cblxuXHRfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBzRXJyb3JEZXNjcmlwdGlvbiA9IG9FdmVudCAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHQoc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4ob1Jlc291cmNlQnVuZGxlID0+IHtcblx0XHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbiAmJiBzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlNBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIFwiL1wiICsgc0VudGl0eVNldCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogYW55ID0ge1xuXHRcdFx0VGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHRUYXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBzUmVsYXRpdmVQYXRoLnNsaWNlKDEpICsgXCIvXCIgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhhRGVwZW5kZW50QmluZGluZ3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYVByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogc01lc3NhZ2VzUGF0aFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5jb25jYXQob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMpLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogYW55KSB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29WaWV3LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0c3dpdGNoRnVsbFNjcmVlbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0ID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgc0xheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGNsb3NlQ29sdW1uKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IG9Tb3VyY2UuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBiYXNlID0gdGhpcy5iYXNlO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0aWYgKG9WaWV3RGF0YSAmJiBvVmlld0RhdGEudmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0Q29tbW9uVXRpbHMuZm5Qcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvU291cmNlLmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJhc2UuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgbm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSB9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxSb3V0aW5nO1xuIl19
1074
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJhVGFyZ2V0cyIsImdldFBhcmFtZXRlciIsInRhcmdldHMiLCJ0YXJnZXROYW1lIiwic1RhcmdldCIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwicmVwbGFjZSIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwiYXJndW1lbnRzIiwiYkRlZmVycmVkIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsIm9Nb2RlbCIsIm9PdXQiLCJfYmluZERlZmVycmVkIiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3Iiwic1RhcmdldFBhdGgiLCJvQXN5bmNDb250ZXh0IiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwidXNlQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9iaW5kUGFnZVRvQ29udGV4dCIsIl9yZXNvbHZlU2VtYW50aWNQYXRoIiwic1RlY2huaWNhbFBhdGgiLCJfYmluZFBhZ2VUb1BhdGgiLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiX2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgiLCJzU2VtYW50aWNQYXRoIiwiYVNlbWFudGljS2V5cyIsIm9NZXRhTW9kZWwiLCJmblVucXVvdGVBbmREZWNvZGUiLCJsYXN0SW5kZXhPZiIsImxlbmd0aCIsImRlY29kZVVSSUNvbXBvbmVudCIsInN1YnN0cmluZyIsImFLZXlWYWx1ZXMiLCJzcGxpdCIsImFGaWx0ZXJzIiwiYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJNb2RlbEhlbHBlciIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsInNLZXlWYWx1ZSIsIkZpbHRlciIsInBhdGgiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJvQ29tYmluZWRGaWx0ZXIiLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1RhcmdldENvbnRleHQiLCJfY3JlYXRlQ29udGV4dCIsImJSZWFzb25Jc0lhcHBTdGF0ZSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJfcmVmcmVzaEJpbmRpbmdDb250ZXh0Iiwib1BhcmVudExpc3RCaW5kaW5nIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJzZXRLZWVwQWxpdmUiLCJpc0tlZXBBbGl2ZSIsImlzQ29udGV4dFVzZWRJblBhZ2VzIiwibGlzdEJpbmRpbmciLCJiRHJhZnROYXZpZ2F0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsIm5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCIkJGdyb3VwSWQiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlciIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsImNvbnRleHQiLCJnZXRTb3VyY2UiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwicHJvZ3JhbW1pbmdNb2RlbCIsIl9lZGl0RmxvdyIsImdldFByb2dyYW1taW5nTW9kZWwiLCJ1bmxvY2siLCJEcmFmdCIsIkFjdGl2aXR5U3luYyIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwidGFyZ2V0Q29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0Iiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwidmlld0xldmVsIiwiaXNEcmFmdFN1cHBvcnRlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFD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LEVBT0MsS0FQRCxFQVFDOE8sS0FBSyxDQUFDMEMsY0FBTixDQUFxQkMsY0FSdEI7QUFVQSxPQVhELE1BV087QUFDTnBULFFBQUFBLElBQUksQ0FBQ3dTLFFBQUwsQ0FBY3pOLHVCQUFkLENBQXNDOUMsUUFBdEMsRUFBZ0Q7QUFBRStRLFVBQUFBLG1CQUFtQixFQUFFO0FBQXZCLFNBQWhEO0FBQ0E7QUFDRCxLOzs7SUF4OEI0QkssbUI7U0EyOEJmcFUsZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0RW5oYW5jZVdpdGhVSTUsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcml2YXRlIF9vVGFyZ2V0SW5mb3JtYXRpb246IGFueTtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKSB7XG5cdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlICYmIHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udHJvbGxlciBleHRlbnNpb24gY2Fubm90IHdvcmsgd2l0aG91dCBhICdyb3V0aW5nU2VydmljZScgb24gdGhlIG1haW4gQXBwQ29tcG9uZW50XCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIGV2ZXJ5IHRpbWUgdGhpcyBjb250cm9sbGVyIGlzIGEgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmF2aWdhdGlvbiB0YXJnZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIG9TZW1hbnRpY09iamVjdD86IG9iamVjdCwgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHRJbmZvOiBhbnkgPSB7fTtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0KSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XG5cdFx0XHRcdFx0LnRoZW4oKG9Db250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogbVBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBtUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0XHRcdFx0dXBkYXRlRkNMTGV2ZWw6IG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsLFxuXHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXMsXG5cdFx0XHRcdFx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogbVBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVcIikgPiAtMSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRcdHJldHVybiAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmRpc3BsYXlNZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzXG5cdFx0Y29uc3QgYVRhcmdldHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKS50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgYVRhcmdldHMuaW5kZXhPZih0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkgPT09IC0xKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IHNUYXJnZXQ7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0c1RhcmdldCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybigpO1xuXHRcdH1cblx0XHRzVGFyZ2V0ID0gc1RhcmdldCB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoc1RhcmdldCA9PT0gbnVsbCB8fCBzVGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0c1RhcmdldCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXHRcdHNUYXJnZXQgPSBzVGFyZ2V0LnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSAob0V2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyBhbnkpLmFyZ3VtZW50cztcblx0XHRsZXQgYkRlZmVycmVkID0gZmFsc2U7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25QYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcIm5hdmlnYXRpb25JbmZvXCIpO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG1Bcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IG1Bcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIHNUYXJnZXQuaW5kZXhPZihcIntcIiArIHNLZXkgKyBcIn1cIikgPj0gMCkge1xuXHRcdFx0XHRiRGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRzVGFyZ2V0ID0gc1RhcmdldC5yZXBsYWNlKFwie1wiICsgc0tleSArIFwifVwiLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAobUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiBtQXJndW1lbnRzW1wiP3F1ZXJ5XCJdLmhhc093blByb3BlcnR5KFwiaS1hY3Rpb25cIikpIHtcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyB0YXJnZXQgaXMgYWx3YXlzIGFic29sdXRlXG5cdFx0aWYgKHNUYXJnZXQgJiYgc1RhcmdldFswXSAhPT0gXCIvXCIpIHtcblx0XHRcdHNUYXJnZXQgPSBcIi9cIiArIHNUYXJnZXQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb091dDtcblx0XHRpZiAoYkRlZmVycmVkKSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZERlZmVycmVkKHNUYXJnZXQsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kUGFnZShzVGFyZ2V0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdG9PdXQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHR9KTtcblxuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmREZWZlcnJlZChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwsIHsgZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQgfHwgIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5vQXN5bmNDb250ZXh0KSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0c1RhcmdldFBhdGgsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSAmJiB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHR0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2Uoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0KSB7XG5cdFx0aWYgKHNUYXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNvbHZlU2VtYW50aWNQYXRoKHNUYXJnZXRQYXRoLCBvTW9kZWwpXG5cdFx0XHRcdC50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgoc1RlY2huaWNhbFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9FcnJvci5tZXNzYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5GaWx0ZXJ9IFRoZSBmaWx0ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIGFTZW1hbnRpY0tleXM6IGFueVtdLCBvTWV0YU1vZGVsOiBvYmplY3QpIHtcblx0XHRjb25zdCBmblVucXVvdGVBbmREZWNvZGUgPSBmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdGlmIChzVmFsdWUuaW5kZXhPZihcIidcIikgPT09IDAgJiYgc1ZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gc1ZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHNWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChzVmFsdWUuc3Vic3RyaW5nKDEsIHNWYWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1ZhbHVlO1xuXHRcdH07XG5cdFx0Y29uc3QgYUtleVZhbHVlcyA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNTZW1hbnRpY1BhdGguaW5kZXhPZihcIihcIikgKyAxLCBzU2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblx0XHRsZXQgYUZpbHRlcnM6IEZpbHRlcltdO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoICE9IGFLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShvTWV0YU1vZGVsKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYUtleVZhbHVlc1swXSk7XG5cdFx0XHRhRmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogYVNlbWFudGljS2V5c1swXS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IHNLZXlWYWx1ZSxcblx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGFLZXlWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleUFzc2lnbm1lbnQ6IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBhUGFydHMgPSBzS2V5QXNzaWdubWVudC5zcGxpdChcIj1cIiksXG5cdFx0XHRcdFx0c0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFQYXJ0c1sxXSk7XG5cblx0XHRcdFx0bUtleVZhbHVlc1thUGFydHNbMF1dID0gc0tleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBiRmFpbGVkID0gZmFsc2U7XG5cdFx0XHRhRmlsdGVycyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvU2VtYW50aWNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzS2V5ID0gb1NlbWFudGljS2V5LiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0c1ZhbHVlID0gbUtleVZhbHVlc1tzS2V5XTtcblxuXHRcdFx0XHRpZiAoc1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBzS2V5LFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJGYWlsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiWFhcIlxuXHRcdFx0XHRcdH0pOyAvLyB3aWxsIGJlIGlnbm9yZSBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYkZhaWxlZCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYSBkcmFmdCBmaWx0ZXIgdG8gbWFrZSBzdXJlIHdlIHRha2UgdGhlIGRyYWZ0IGVudGl0eSBpZiB0aGVyZSBpcyBvbmVcblx0XHQvLyBPciB0aGUgYWN0aXZlIGVudGl0eSBvdGhlcndpc2Vcblx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblxuXHRcdGNvbnN0IG9Db21iaW5lZEZpbHRlciA9IG5ldyBGaWx0ZXIoYUZpbHRlcnMsIHRydWUpO1xuXHRcdHJldHVybiBvQ29tYmluZWRGaWx0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZW1hbnRpY1BhdGggVGhlIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgbW9kZWwgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHNTZW1hbnRpY1BhdGggY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBhU2VtYW50aWNLZXlzOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzU2VtYW50aWNQYXRoKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWFTZW1hbnRpY0tleXMgfHwgYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgc2V0IG9mIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBhbGwga2V5c1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSB0aGlzLl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGgsIGFTZW1hbnRpY0tleXMsIG9NZXRhTW9kZWwpO1xuXHRcdGlmIChvRmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Rcblx0XHRpZiAoIXNFbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0VudGl0eVNldFBhdGggPSBcIi9cIiArIHNFbnRpdHlTZXRQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qoc0VudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHRcIiQkZ3JvdXBJZFwiOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKS50aGVuKGZ1bmN0aW9uIChvQ29udGV4dHM6IGFueSkge1xuXHRcdFx0aWYgKG9Db250ZXh0cyAmJiBvQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dHNbMF0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gZGF0YSBjb3VsZCBiZSBsb2FkZWRcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBlbGlnaWJsZSBmb3Igc2VtYW50aWMgYm9va21hcmtpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBUaGUgcGF0aCB0byB0ZXN0XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgZWxpZ2libGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBPbmx5IHBhdGggb24gcm9vdCBvYmplY3RzIGFsbG93IHNlbWFudGljIGJvb2ttYXJraW5nLCBpLmUuIHNQYXRoID0geHh4KHl5eSlcblx0XHRjb25zdCBhTWF0Y2hlcyA9IC9eW1xcL10/KFxcdyspXFwoW15cXC9dK1xcKSQvLmV4ZWMoc1BhdGgpO1xuXHRcdGlmICghYU1hdGNoZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gR2V0IHRoZSBlbnRpdHlTZXQgbmFtZVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gXCIvXCIgKyBhTWF0Y2hlc1sxXTtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdCAob3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgc2VtYW50aWMgYm9va21hcmtpbmcpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlXCIpO1xuXHRcdHJldHVybiBvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgZnJvbSBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoVG9SZXNvbHZlIFRoZSBwYXRoIHRvIGJlIHRyYW5zZm9ybWVkXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBTdHJpbmcgcHJvbWlzZSBmb3IgdGhlIG5ldyBwYXRoLiBJZiBzUGF0aFRvUmVzb2x2ZWQgY291bGRuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBpdCBpcyByZXR1cm5lZCBhcyBpcy5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVzb2x2ZVNlbWFudGljUGF0aChzUGF0aFRvUmVzb2x2ZTogc3RyaW5nLCBvTW9kZWw6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0bGV0IHNDdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cblx0XHRpZiAoc0N1cnJlbnRIYXNoTm9QYXJhbXMgJiYgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGFzdEluZGV4T2YoXCIvXCIpID09PSBzQ3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKSB7XG5cdFx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgJy8nXG5cdFx0XHRzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cmluZygwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRsZXQgc1Jvb3RFbnRpdHlOYW1lID0gc0N1cnJlbnRIYXNoTm9QYXJhbXMgJiYgc0N1cnJlbnRIYXNoTm9QYXJhbXMuc3Vic3RyKDAsIHNDdXJyZW50SGFzaE5vUGFyYW1zLmluZGV4T2YoXCIoXCIpKTtcblx0XHRpZiAoc1Jvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHRzUm9vdEVudGl0eU5hbWUgPSBzUm9vdEVudGl0eU5hbWUuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrID0gdGhpcy5fY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzQ3VycmVudEhhc2hOb1BhcmFtcywgb01ldGFNb2RlbCksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gYkFsbG93U2VtYW50aWNCb29rbWFyayAmJiBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc1Jvb3RFbnRpdHlOYW1lKTtcblx0XHRpZiAoIWFTZW1hbnRpY0tleXMpIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXMgYXZhaWxhYmxlIC0tPiB1c2UgdGhlIHBhdGggYXMgaXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoc1BhdGhUb1Jlc29sdmUpO1xuXHRcdH0gZWxzZSBpZiAob0xhc3RTZW1hbnRpY01hcHBpbmcgJiYgb0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoID09PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhpcyBzZW1hbnRpYyBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHlcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob0xhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIG5lZWQgcmVzb2x2ZSB0aGUgc2VtYW50aWMgcGF0aCB0byBnZXQgdGhlIHRlY2huaWNhbCBrZXlzXG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9Nb2RlbCwgYVNlbWFudGljS2V5cykudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc1RlY2huaWNhbFBhdGggJiYgc1RlY2huaWNhbFBhdGggIT09IHNQYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHNlbWFudGljIHBhdGggd2FzIHJlc29sdmVkIChvdGhlcndpc2Uga2VlcCB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRhcmdldClcblx0XHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2Uuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7XG5cdFx0XHRcdFx0XHR0ZWNobmljYWxQYXRoOiBzVGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0XHRcdHNlbWFudGljUGF0aDogc1BhdGhUb1Jlc29sdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gc1RlY2huaWNhbFBhdGg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNQYXRoVG9SZXNvbHZlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQuIE5lZWRzIHRvIGNvbnRhaW4gdGVjaG5pY2FsIGtleXMgb25seS5cblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0O1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCB8fCAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkpIHtcblx0XHRcdGxldCBvVGFyZ2V0Q29udGV4dDtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkXG5cdFx0XHRcdG9UYXJnZXRDb250ZXh0ID0gb1VzZUNvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgaXQgZnJvbSBzVGFyZ2V0UGF0aFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldENvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVGFyZ2V0Q29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUmVhc29uSXNJYXBwU3RhdGUgJiYgRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9DdXJyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJpbmRzIHRoZSBwYWdlIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IW9QYXJlbnRMaXN0QmluZGluZyB8fFxuXHRcdFx0XHRcdCFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgfHxcblx0XHRcdFx0XHRvUGFyZW50TGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpID09PSBcInN1Ym1pdExhdGVyXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcgb3IgdGhlIHRyYW5zaWVudCBvbmUgZnJvbSB0aGUgY3JlYXRlLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKHRydWUsICgpID0+IHtcblx0XHRcdFx0XHQvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjb250ZXh0IGlzIG5vIGxvbmdlciBrZXB0IGFsaXZlXG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG9Db250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkgQSBwYXJhbWV0ZXIgdGhhdCB0ZWxscyB3aGV0aGVyIHRvIG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IG9uIGRhdGEgcmVjZWl2ZWRcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYm9vbGVhbiA9IHRydWUpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBcIi9cIiArIHNFbnRpdHlTZXQpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5fZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyLmJpbmQodGhpcywgbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyKG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBib29sZWFuLCBvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3QgY29udGV4dCA9IG9FdmVudD8uZ2V0U291cmNlICYmIChvRXZlbnQ/LmdldFNvdXJjZSgpIGFzIGFueSk/LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gKHRoaXMuX29WaWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpPy5fZWRpdEZsb3c/LmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRpZiAoXG5cdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRBY3Rpdml0eVN5bmMuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCh0aGlzLl9vVmlldykgJiZcblx0XHRcdG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5ICYmXG5cdFx0XHRjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgJiZcblx0XHRcdGNvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihjb250ZXh0LCBjb250ZXh0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24gJiYgc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBcIi9cIiArIHNFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IGFueSA9IHtcblx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gc1JlbGF0aXZlUGF0aC5zbGljZSgxKSArIFwiL1wiIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGhcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMuY29uY2F0KG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dCAmJiBvUHJldmlvdXNDb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSxcblx0XHRcdGJJc0Z1bGxTY3JlZW4gPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vaXNGdWxsU2NyZWVuXCIpLFxuXHRcdFx0c05leHRMYXlvdXQgPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXG5cdFx0XHRcdGJJc0Z1bGxTY3JlZW4gPyBcIi9hY3Rpb25CdXR0b25zSW5mby9leGl0RnVsbFNjcmVlblwiIDogXCIvYWN0aW9uQnV0dG9uc0luZm8vZnVsbFNjcmVlblwiXG5cdFx0XHQpLFxuXHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRjb25zdCBvQ29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IHNMYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQmVmb3JlKVxuXHRjbG9zZUNvbHVtbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvVmlld0RhdGEgPSBvU291cmNlLmdldFZpZXdEYXRhKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgYmFzZSA9IHRoaXMuYmFzZTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGlmIChvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLnZpZXdMZXZlbCA9PT0gMSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwsIG9Db250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvU291cmNlLmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiYXNlLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUgfSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdfQ==