@sapui5/sap.fe.core 1.102.3 → 1.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +120 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +108 -0
  5. package/src/sap/fe/core/AppComponent.js +81 -35
  6. package/src/sap/fe/core/AppComponent.ts +68 -44
  7. package/src/sap/fe/core/AppStateHandler.js +82 -70
  8. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  9. package/src/sap/fe/core/BaseController.js +12 -10
  10. package/src/sap/fe/core/BaseController.ts +15 -13
  11. package/src/sap/fe/core/CommonUtils.js +291 -218
  12. package/src/sap/fe/core/CommonUtils.ts +315 -251
  13. package/src/sap/fe/core/ExtensionAPI.js +25 -28
  14. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  15. package/src/sap/fe/core/PageController.js +5 -5
  16. package/src/sap/fe/core/PageController.ts +4 -5
  17. package/src/sap/fe/core/TemplateComponent.js +21 -10
  18. package/src/sap/fe/core/TemplateComponent.ts +9 -6
  19. package/src/sap/fe/core/TemplateModel.js +2 -2
  20. package/src/sap/fe/core/TemplateModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  22. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
  29. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  31. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  32. package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
  33. package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
  34. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
  35. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  36. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
  37. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
  38. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
  39. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  40. package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
  45. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  46. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
  47. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  48. package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
  49. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  50. package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
  51. package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
  52. package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
  53. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  54. package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
  55. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  56. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Share.js +171 -140
  58. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  59. package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
  60. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  61. package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
  62. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  63. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  64. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  65. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
  66. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  67. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
  69. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
  70. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
  71. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
  72. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
  73. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
  74. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
  75. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
  76. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  77. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  78. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
  79. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
  80. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
  81. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
  82. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
  83. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
  84. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
  85. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
  86. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
  87. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  88. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
  89. package/src/sap/fe/core/controls/Any.js +9 -5
  90. package/src/sap/fe/core/controls/Any.ts +10 -4
  91. package/src/sap/fe/core/controls/CommandExecution.js +12 -26
  92. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  93. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
  94. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  95. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
  96. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  97. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
  98. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  99. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  101. package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
  102. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  103. package/src/sap/fe/core/controls/FileWrapper.js +9 -4
  104. package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
  105. package/src/sap/fe/core/controls/FilterBar.js +7 -3
  106. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  107. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  108. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  109. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  110. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  111. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  112. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
  113. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  114. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  116. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
  117. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  118. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  119. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  120. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  121. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  122. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  123. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  124. package/src/sap/fe/core/converters/ConverterContext.js +48 -34
  125. package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
  126. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
  131. package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
  132. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  133. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  134. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  135. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  136. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
  137. package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
  138. package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
  139. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
  140. package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
  141. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  142. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  143. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
  145. package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
  147. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  148. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  158. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
  160. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
  162. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
  163. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  164. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  166. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
  171. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  172. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  173. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  174. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  175. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  176. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  178. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  179. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  180. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
  181. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
  182. package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
  183. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
  184. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
  185. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
  186. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  187. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  188. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  189. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  190. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  191. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  192. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  193. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  194. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  195. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  196. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  197. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  198. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  199. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  200. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  201. package/src/sap/fe/core/fpm/Component.js +33 -7
  202. package/src/sap/fe/core/fpm/Component.ts +14 -0
  203. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  204. package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
  205. package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
  206. package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
  207. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
  208. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  209. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  210. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  211. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  212. package/src/sap/fe/core/helpers/EditState.js +1 -6
  213. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  214. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  215. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  216. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  217. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  218. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  219. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  220. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  221. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  222. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  223. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  224. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  225. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  226. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  227. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  228. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  229. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  230. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  231. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  232. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  233. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  234. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  235. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  236. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  237. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  238. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  239. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  240. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  241. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  242. package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
  243. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
  244. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  245. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  246. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  247. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  248. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  249. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  250. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  251. package/src/sap/fe/core/library.js +42 -3
  252. package/src/sap/fe/core/library.support.js +1 -1
  253. package/src/sap/fe/core/library.ts +38 -0
  254. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  255. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  256. package/src/sap/fe/core/messagebundle.properties +39 -67
  257. package/src/sap/fe/core/messagebundle_ar.properties +27 -44
  258. package/src/sap/fe/core/messagebundle_bg.properties +27 -44
  259. package/src/sap/fe/core/messagebundle_ca.properties +27 -44
  260. package/src/sap/fe/core/messagebundle_cs.properties +27 -44
  261. package/src/sap/fe/core/messagebundle_cy.properties +26 -43
  262. package/src/sap/fe/core/messagebundle_da.properties +27 -44
  263. package/src/sap/fe/core/messagebundle_de.properties +25 -42
  264. package/src/sap/fe/core/messagebundle_el.properties +28 -45
  265. package/src/sap/fe/core/messagebundle_en.properties +27 -44
  266. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
  267. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
  268. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
  269. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
  270. package/src/sap/fe/core/messagebundle_es.properties +27 -44
  271. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
  272. package/src/sap/fe/core/messagebundle_et.properties +27 -44
  273. package/src/sap/fe/core/messagebundle_fi.properties +27 -44
  274. package/src/sap/fe/core/messagebundle_fr.properties +26 -43
  275. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
  276. package/src/sap/fe/core/messagebundle_hi.properties +27 -44
  277. package/src/sap/fe/core/messagebundle_hr.properties +27 -44
  278. package/src/sap/fe/core/messagebundle_hu.properties +27 -44
  279. package/src/sap/fe/core/messagebundle_id.properties +27 -44
  280. package/src/sap/fe/core/messagebundle_it.properties +43 -60
  281. package/src/sap/fe/core/messagebundle_iw.properties +27 -44
  282. package/src/sap/fe/core/messagebundle_ja.properties +27 -44
  283. package/src/sap/fe/core/messagebundle_kk.properties +27 -44
  284. package/src/sap/fe/core/messagebundle_ko.properties +30 -47
  285. package/src/sap/fe/core/messagebundle_lt.properties +27 -44
  286. package/src/sap/fe/core/messagebundle_lv.properties +27 -44
  287. package/src/sap/fe/core/messagebundle_ms.properties +27 -44
  288. package/src/sap/fe/core/messagebundle_nl.properties +29 -46
  289. package/src/sap/fe/core/messagebundle_no.properties +27 -44
  290. package/src/sap/fe/core/messagebundle_pl.properties +28 -45
  291. package/src/sap/fe/core/messagebundle_pt.properties +28 -45
  292. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
  293. package/src/sap/fe/core/messagebundle_ro.properties +27 -44
  294. package/src/sap/fe/core/messagebundle_ru.properties +27 -44
  295. package/src/sap/fe/core/messagebundle_sh.properties +27 -44
  296. package/src/sap/fe/core/messagebundle_sk.properties +27 -44
  297. package/src/sap/fe/core/messagebundle_sl.properties +27 -44
  298. package/src/sap/fe/core/messagebundle_sv.properties +27 -44
  299. package/src/sap/fe/core/messagebundle_th.properties +25 -42
  300. package/src/sap/fe/core/messagebundle_tr.properties +27 -44
  301. package/src/sap/fe/core/messagebundle_uk.properties +27 -44
  302. package/src/sap/fe/core/messagebundle_vi.properties +27 -44
  303. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
  304. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
  305. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
  308. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
  309. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  310. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  311. package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
  312. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  313. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  314. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  315. package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
  316. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  317. package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
  318. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  319. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
  320. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  321. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
  322. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
  323. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  324. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  327. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  328. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  330. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  332. package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
  333. package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
  334. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  335. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  336. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  337. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  338. package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
  339. package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
  340. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  341. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  342. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  343. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  344. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  345. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  346. package/src/sap/fe/core/templating/FilterHelper.js +18 -17
  347. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  348. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  349. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  350. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  351. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  352. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  353. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  354. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  355. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  356. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  357. package/src/sap/fe/core/type/Email.js +3 -3
  358. package/src/sap/fe/core/type/Email.ts +2 -2
  359. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -13,9 +13,37 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
13
13
  var extensible = ClassSupport.extensible;
14
14
  var defineUI5Class = ClassSupport.defineUI5Class;
15
15
 
16
+ function _finallyRethrows(body, finalizer) {
17
+ try {
18
+ var result = body();
19
+ } catch (e) {
20
+ return finalizer(true, e);
21
+ }
22
+
23
+ if (result && result.then) {
24
+ return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
25
+ }
26
+
27
+ return finalizer(false, result);
28
+ }
29
+
30
+ function _catch(body, recover) {
31
+ try {
32
+ var result = body();
33
+ } catch (e) {
34
+ return recover(e);
35
+ }
36
+
37
+ if (result && result.then) {
38
+ return result.then(void 0, recover);
39
+ }
40
+
41
+ return result;
42
+ }
43
+
16
44
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
17
45
 
18
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
46
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
47
 
20
48
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
21
49
 
@@ -116,7 +144,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
116
144
  }
117
145
  }
118
146
  } else {
119
- Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
147
+ Log.info("Table: ".concat(oTable.getId(), " was not refreshed. No binding found!"));
120
148
  }
121
149
  }
122
150
  },
@@ -137,7 +165,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
137
165
  };
138
166
  },
139
167
  apply: function (oOPLayout, oControlState) {
140
- oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
168
+ if (oControlState) {
169
+ oOPLayout.setSelectedSection(oControlState.selectedSection);
170
+ }
141
171
  },
142
172
  refreshBinding: function (oOPLayout) {
143
173
  var oBindingContext = oOPLayout.getBindingContext();
@@ -173,7 +203,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
173
203
  oBinding.refresh();
174
204
  }
175
205
  } else {
176
- Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
206
+ Log.info("ObjectPage: ".concat(oOPLayout.getId(), " was not refreshed. No binding found!"));
177
207
  }
178
208
  }
179
209
  },
@@ -184,7 +214,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
184
214
  };
185
215
  },
186
216
  apply: function (oQuickFilter, oControlState) {
187
- oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
217
+ if (oControlState) {
218
+ oQuickFilter.setSelectorKey(oControlState.selectedKey);
219
+ }
188
220
  }
189
221
  },
190
222
  "sap.m.SegmentedButton": {
@@ -194,7 +226,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
194
226
  };
195
227
  },
196
228
  apply: function (oSegmentedButton, oControlState) {
197
- oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
229
+ if (oControlState) {
230
+ oSegmentedButton.setSelectedKey(oControlState.selectedKey);
231
+ }
198
232
  }
199
233
  },
200
234
  "sap.m.Select": {
@@ -204,7 +238,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
204
238
  };
205
239
  },
206
240
  apply: function (oSelect, oControlState) {
207
- oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
241
+ if (oControlState) {
242
+ oSelect.setSelectedKey(oControlState.selectedKey);
243
+ }
208
244
  }
209
245
  },
210
246
  "sap.f.DynamicPage": {
@@ -214,7 +250,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
214
250
  };
215
251
  },
216
252
  apply: function (oDynamicPage, oControlState) {
217
- oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
253
+ if (oControlState) {
254
+ oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
255
+ }
218
256
  }
219
257
  },
220
258
  "sap.ui.core.mvc.View": {
@@ -291,24 +329,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
291
329
  var _proto = ViewState.prototype;
292
330
 
293
331
  _proto.refreshViewBindings = function refreshViewBindings() {
294
- var _this2 = this;
295
-
296
- return this.collectResults(this.base.viewState.adaptBindingRefreshControls).then(function (aControls) {
297
- var oPromiseChain = Promise.resolve();
298
- aControls.filter(function (oControl) {
299
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
300
- }).forEach(function (oControl) {
301
- oPromiseChain = oPromiseChain.then(_this2.refreshControlBinding.bind(_this2, oControl));
332
+ try {
333
+ var _this3 = this;
334
+
335
+ return Promise.resolve(_this3.collectResults(_this3.base.viewState.adaptBindingRefreshControls)).then(function (aControls) {
336
+ var oPromiseChain = Promise.resolve();
337
+ aControls.filter(function (oControl) {
338
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
339
+ }).forEach(function (oControl) {
340
+ oPromiseChain = oPromiseChain.then(_this3.refreshControlBinding.bind(_this3, oControl));
341
+ });
342
+ return oPromiseChain;
302
343
  });
303
- return oPromiseChain;
304
- });
344
+ } catch (e) {
345
+ return Promise.reject(e);
346
+ }
305
347
  }
306
348
  /**
307
349
  * This function should add all controls relevant for refreshing to the provided control array.
308
350
  *
309
351
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
310
352
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
311
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
353
+ *
354
+ * @param aCollectedControls The collected controls
312
355
  * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
313
356
  * @protected
314
357
  */
@@ -323,7 +366,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
323
366
  var oPromiseChain = Promise.resolve();
324
367
 
325
368
  if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
326
- Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
369
+ Log.info("refreshBinding handler for control: ".concat(oControl.getMetadata().getName(), " is not provided"));
327
370
  } else {
328
371
  oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(this, oControl));
329
372
  }
@@ -362,9 +405,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
362
405
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
363
406
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
364
407
  *
365
- * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
366
- * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
367
- *
408
+ * @param oControl The control for which the refresh handler is adapted.
409
+ * @param oControlHandler A plain object which can have one function: <code>refreshBinding</code>
368
410
  * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
369
411
  * @protected
370
412
  */
@@ -407,9 +449,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
407
449
  * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
408
450
  * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
409
451
  *
410
- * @param {Function} fnCall The function to be called
452
+ * @param fnCall The function to be called
411
453
  * @param args
412
- * @returns {Promise} A promise to be resolved with the result of all overrides
454
+ * @returns A promise to be resolved with the result of all overrides
413
455
  */
414
456
  ;
415
457
 
@@ -430,9 +472,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
430
472
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
431
473
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
432
474
  *
433
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
434
- * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
435
- *
475
+ * @param oControl The control to get state handler for
476
+ * @param aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
436
477
  * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
437
478
  * @protected
438
479
  */
@@ -444,8 +485,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
444
485
  /**
445
486
  * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
446
487
  *
447
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
448
- * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
488
+ * @param oControl The control to get state handler for
489
+ * @returns A plain object with two functions: <code>retrieve</code> and <code>apply</code>
449
490
  */
450
491
  ;
451
492
 
@@ -471,7 +512,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
471
512
  *
472
513
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
473
514
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
474
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
515
+ *
516
+ * @param aCollectedControls The collected controls
475
517
  * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
476
518
  * @protected
477
519
  */
@@ -483,8 +525,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
483
525
  /**
484
526
  * Returns the key to be used for given control.
485
527
  *
486
- * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
487
- * @returns {string} The key to be used for storing the controls state
528
+ * @param oControl The control to get state key for
529
+ * @returns The key to be used for storing the controls state
488
530
  */
489
531
  ;
490
532
 
@@ -495,49 +537,59 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
495
537
  * Retrieve the view state of this extensions view.
496
538
  * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
497
539
  *
498
- * @returns {Promise} A promise resolving the view state
499
- *
540
+ * @returns A promise resolving the view state
500
541
  * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
501
542
  * @public
502
543
  */
503
544
  ;
504
545
 
505
546
  _proto.retrieveViewState = function retrieveViewState() {
506
- var _this3 = this;
507
-
508
- ++this._iRetrievingStateCounter;
509
- return this._pInitialStateApplied.then(function () {
510
- return _this3.collectResults(_this3.base.viewState.adaptStateControls);
511
- }).then(function (aControls) {
512
- return Promise.all(aControls.filter(function (oControl) {
513
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
514
- }).map(function (oControl) {
515
- return _this3.retrieveControlState(oControl).then(function (vResult) {
516
- return {
517
- key: _this3.getStateKey(oControl),
518
- value: vResult
519
- };
520
- });
521
- }));
522
- }).then(function (aResolvedStates) {
523
- return aResolvedStates.reduce(function (oStates, mState) {
524
- var oCurrentState = {};
525
- oCurrentState[mState.key] = mState.value;
526
- return mergeObjects(oStates, oCurrentState);
527
- }, {});
528
- }).then(function (oViewState) {
529
- return Promise.resolve(_this3._retrieveAdditionalStates()).then(function (mAdditionalStates) {
530
- if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
531
- oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
532
- }
547
+ try {
548
+ var _this5 = this;
549
+
550
+ function _temp3() {
551
+ return _this5._iRetrievingStateCounter === 0 ? oViewState : undefined;
552
+ }
533
553
 
534
- return oViewState;
554
+ ++_this5._iRetrievingStateCounter;
555
+ var oViewState;
556
+
557
+ var _temp4 = _finallyRethrows(function () {
558
+ return Promise.resolve(_this5._pInitialStateApplied).then(function () {
559
+ return Promise.resolve(_this5.collectResults(_this5.base.viewState.adaptStateControls)).then(function (aControls) {
560
+ return Promise.resolve(Promise.all(aControls.filter(function (oControl) {
561
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
562
+ }).map(function (oControl) {
563
+ return _this5.retrieveControlState(oControl).then(function (vResult) {
564
+ return {
565
+ key: _this5.getStateKey(oControl),
566
+ value: vResult
567
+ };
568
+ });
569
+ }))).then(function (aResolvedStates) {
570
+ oViewState = aResolvedStates.reduce(function (oStates, mState) {
571
+ var oCurrentState = {};
572
+ oCurrentState[mState.key] = mState.value;
573
+ return mergeObjects(oStates, oCurrentState);
574
+ }, {});
575
+ return Promise.resolve(Promise.resolve(_this5._retrieveAdditionalStates())).then(function (mAdditionalStates) {
576
+ if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
577
+ oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
578
+ }
579
+ });
580
+ });
581
+ });
582
+ });
583
+ }, function (_wasThrown, _result) {
584
+ --_this5._iRetrievingStateCounter;
585
+ if (_wasThrown) throw _result;
586
+ return _result;
535
587
  });
536
- }).finally(function () {
537
- --_this3._iRetrievingStateCounter;
538
- }).then(function (oViewState) {
539
- return _this3._iRetrievingStateCounter === 0 ? oViewState : undefined;
540
- });
588
+
589
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
590
+ } catch (e) {
591
+ return Promise.reject(e);
592
+ }
541
593
  }
542
594
  /**
543
595
  * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
@@ -545,8 +597,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
545
597
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
546
598
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
547
599
  *
548
- * @param {object} mAdditionalStates The additional state
549
- *
600
+ * @param mAdditionalStates The additional state
550
601
  * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
551
602
  * @protected
552
603
  */
@@ -558,7 +609,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
558
609
  /**
559
610
  * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
560
611
  *
561
- * @returns {object | Promise<object>} Additional view states
612
+ * @returns Additional view states
562
613
  */
563
614
  ;
564
615
 
@@ -570,21 +621,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
570
621
  /**
571
622
  * Returns the current state for the given control.
572
623
  *
573
- * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
574
- * @returns {Promise<object>} The state for the given control
624
+ * @param oControl The object to get the state for
625
+ * @returns The state for the given control
575
626
  */
576
627
  ;
577
628
 
578
629
  _proto.retrieveControlState = function retrieveControlState(oControl) {
579
- var _this4 = this;
630
+ var _this6 = this;
580
631
 
581
632
  var aControlStateHandlers = this.getControlStateHandler(oControl);
582
633
  return Promise.all(aControlStateHandlers.map(function (mControlStateHandler) {
583
634
  if (typeof mControlStateHandler.retrieve !== "function") {
584
- throw new Error("controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName());
635
+ throw new Error("controlStateHandler.retrieve is not a function for control: ".concat(oControl.getMetadata().getName()));
585
636
  }
586
637
 
587
- return mControlStateHandler.retrieve.call(_this4, oControl);
638
+ return mControlStateHandler.retrieve.call(_this6, oControl);
588
639
  })).then(function (aStates) {
589
640
  return aStates.reduce(function (oFinalState, oCurrentState) {
590
641
  return mergeObjects(oFinalState, oCurrentState);
@@ -600,9 +651,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
600
651
  * Important:
601
652
  * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
602
653
  *
603
- * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
654
+ * @returns If <code>true</code>, only the initial view state is applied once,
604
655
  * else any new view state is also applied on follow-up calls (default)
605
- *
606
656
  * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
607
657
  * @protected
608
658
  */
@@ -614,48 +664,71 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
614
664
  /**
615
665
  * Applies the given view state to this extensions view.
616
666
  *
617
- * @param {object} oViewState The view state to apply (can be undefined)
618
- * @param {object} oNavParameter The current navigation parameter
619
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
620
- * @param {object} oNavParameter.selectionVariant The selectionVariant from the navigation
621
- * @param {object} oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
622
- * @param {boolean} oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
623
- *
624
- * @returns {Promise} Promise for async state handling
625
- *
667
+ * @param oViewState The view state to apply (can be undefined)
668
+ * @param oNavParameter The current navigation parameter
669
+ * @param oNavParameter.navigationType The actual navigation type
670
+ * @param oNavParameter.selectionVariant The selectionVariant from the navigation
671
+ * @param oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
672
+ * @param oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
673
+ * @returns Promise for async state handling
626
674
  * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
627
675
  * @public
628
676
  */
629
677
  ;
630
678
 
631
679
  _proto.applyViewState = function applyViewState(oViewState, oNavParameter) {
632
- var _this5 = this;
680
+ try {
681
+ var _this8 = this;
633
682
 
634
- if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
635
- return Promise.resolve();
636
- }
683
+ if (_this8.base.viewState.applyInitialStateOnly() && _this8._getInitialStateApplied()) {
684
+ return Promise.resolve();
685
+ }
686
+
687
+ var _temp9 = _finallyRethrows(function () {
688
+ return Promise.resolve(_this8.collectResults(_this8.base.viewState.onBeforeStateApplied)).then(function () {
689
+ return Promise.resolve(_this8.collectResults(_this8.base.viewState.adaptStateControls)).then(function (aControls) {
690
+ var oPromiseChain = Promise.resolve();
691
+ aControls.filter(function (oControl) {
692
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
693
+ }).forEach(function (oControl) {
694
+ var sKey = _this8.getStateKey(oControl);
695
+
696
+ oPromiseChain = oPromiseChain.then(_this8.applyControlState.bind(_this8, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
697
+ });
698
+ return Promise.resolve(oPromiseChain).then(function () {
699
+ var _temp5 = function () {
700
+ if (oNavParameter.navigationType === NavType.iAppState) {
701
+ return Promise.resolve(_this8.collectResults(_this8.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined)).then(function () {});
702
+ } else {
703
+ return Promise.resolve(_this8.collectResults(_this8.base.viewState.applyNavigationParameters, oNavParameter)).then(function () {});
704
+ }
705
+ }();
706
+
707
+ if (_temp5 && _temp5.then) return _temp5.then(function () {});
708
+ });
709
+ });
710
+ });
711
+ }, function (_wasThrown2, _result2) {
712
+ function _temp7() {
713
+ if (_wasThrown2) throw _result2;
714
+ return _result2;
715
+ }
637
716
 
638
- return this.collectResults(this.base.viewState.onBeforeStateApplied).then(function () {
639
- return _this5.collectResults(_this5.base.viewState.adaptStateControls);
640
- }).then(function (aControls) {
641
- var oPromiseChain = Promise.resolve();
642
- aControls.filter(function (oControl) {
643
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
644
- }).forEach(function (oControl) {
645
- var sKey = _this5.getStateKey(oControl);
717
+ var _temp6 = _catch(function () {
718
+ return Promise.resolve(_this8.collectResults(_this8.base.viewState.onAfterStateApplied)).then(function () {
719
+ _this8._setInitialStateApplied();
720
+ });
721
+ }, function (e) {
722
+ Log.error(e);
723
+ });
646
724
 
647
- oPromiseChain = oPromiseChain.then(_this5.applyControlState.bind(_this5, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
725
+ return _temp6 && _temp6.then ? _temp6.then(_temp7) : _temp7(_temp6);
648
726
  });
649
- return oPromiseChain;
650
- }).then(function () {
651
- if (oNavParameter.navigationType === NavType.iAppState) {
652
- return _this5.collectResults(_this5.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined);
653
- } else {
654
- return _this5.collectResults(_this5.base.viewState.applyNavigationParameters, oNavParameter);
655
- }
656
- }).finally(function () {
657
- return _this5.collectResults(_this5.base.viewState.onAfterStateApplied).then(_this5._setInitialStateApplied.bind(_this5));
658
- });
727
+
728
+ return Promise.resolve(_temp9 && _temp9.then ? _temp9.then(function () {}) : void 0);
729
+ } catch (e) {
730
+ return Promise.reject(e);
731
+ }
659
732
  };
660
733
 
661
734
  _proto._checkIfVariantIdIsAvailable = function _checkIfVariantIdIsAvailable(oVM, sVariantId) {
@@ -686,8 +759,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
686
759
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
687
760
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
688
761
  *
689
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
690
- *
762
+ * @param aPromises Extensible array of promises to be resolved before continuing
691
763
  * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
692
764
  * @protected
693
765
  */
@@ -702,8 +774,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
702
774
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
703
775
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
704
776
  *
705
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
706
- *
777
+ * @param aPromises Extensible array of promises to be resolved before continuing
707
778
  * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
708
779
  * @protected
709
780
  */
@@ -718,9 +789,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
718
789
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
719
790
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
720
791
  *
721
- * @param {object} oViewState The current view state
722
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
723
- *
792
+ * @param oViewState The current view state
793
+ * @param aPromises Extensible array of promises to be resolved before continuing
724
794
  * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
725
795
  * @protected
726
796
  */
@@ -735,13 +805,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
735
805
  * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
736
806
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
737
807
  *
738
- * @param {object} oNavParameter The current navigation parameter
739
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
740
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
741
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
742
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
743
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
744
- *
808
+ * @param oNavParameter The current navigation parameter
809
+ * @param oNavParameter.navigationType The actual navigation type
810
+ * @param [oNavParameter.selectionVariant] The selectionVariant from the navigation
811
+ * @param [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
812
+ * @param [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
813
+ * @param aPromises Extensible array of promises to be resolved before continuing
745
814
  * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
746
815
  * @protected
747
816
  */
@@ -754,24 +823,24 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
754
823
  /**
755
824
  * Applying the given state to the given control.
756
825
  *
757
- * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
758
- * @param {object} oControlState The state for the given control
759
- * @param {object} [oNavParameters] The current navigation parameters
760
- * @returns {any} Return a promise for async state handling
826
+ * @param oControl The object to apply the given state
827
+ * @param oControlState The state for the given control
828
+ * @param [oNavParameters] The current navigation parameters
829
+ * @returns Return a promise for async state handling
761
830
  */
762
831
  ;
763
832
 
764
833
  _proto.applyControlState = function applyControlState(oControl, oControlState, oNavParameters) {
765
- var _this6 = this;
834
+ var _this9 = this;
766
835
 
767
836
  var aControlStateHandlers = this.getControlStateHandler(oControl);
768
837
  var oPromiseChain = Promise.resolve();
769
838
  aControlStateHandlers.forEach(function (mControlStateHandler) {
770
839
  if (typeof mControlStateHandler.apply !== "function") {
771
- throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
840
+ throw new Error("controlStateHandler.apply is not a function for control: ".concat(oControl.getMetadata().getName()));
772
841
  }
773
842
 
774
- oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this6, oControl, oControlState, oNavParameters));
843
+ oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this9, oControl, oControlState, oNavParameters));
775
844
  });
776
845
  return oPromiseChain;
777
846
  };
@@ -784,4 +853,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils",
784
853
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [_dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
785
854
  return ViewState;
786
855
  }, false);
787
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsIm9Db250cm9sU3RhdGUiLCJ2YXJpYW50SWQiLCJ1bmRlZmluZWQiLCJzVmFyaWFudFJlZmVyZW5jZSIsIl9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUiLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJvVGFiQmFyIiwic2VsZWN0ZWRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIm9TZWxlY3RlZEl0ZW0iLCJnZXRJdGVtcyIsImZpbmQiLCJvSXRlbSIsImdldEtleSIsInNldFNlbGVjdGVkSXRlbSIsIm9GaWx0ZXJCYXIiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwibUZpbHRlckJhclN0YXRlIiwiYVByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwibUZpbHRlciIsImZpbHRlciIsIm9Qcm9wZXJ0eUluZm8iLCJwYXRoIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsIm9UYWJsZSIsInN1cHBsZW1lbnRhcnlDb25maWciLCJyZWZyZXNoQmluZGluZyIsIm9UYWJsZUJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib1Jvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJyZWZyZXNoIiwib0hlYWRlckNvbnRleHQiLCJnZXRIZWFkZXJDb250ZXh0Iiwic0dyb3VwSWQiLCJnZXRHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJMb2ciLCJpbmZvIiwiZ2V0SWQiLCJvQ2hhcnQiLCJvT1BMYXlvdXQiLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic1N0cmF0ZWd5IiwiS2VlcEFsaXZlSGVscGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib05hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiQ29tbW9uVXRpbHMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCIka2luZCIsImFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFQcmV2Iiwic05hdlByb3AiLCIkaXNDb2xsZWN0aW9uIiwicHVzaCIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9RdWlja0ZpbHRlciIsImdldFNlbGVjdG9yS2V5Iiwic2V0U2VsZWN0b3JLZXkiLCJvU2VnbWVudGVkQnV0dG9uIiwic2V0U2VsZWN0ZWRLZXkiLCJvU2VsZWN0Iiwib0R5bmFtaWNQYWdlIiwiaGVhZGVyRXhwYW5kZWQiLCJnZXRIZWFkZXJFeHBhbmRlZCIsInNldEhlYWRlckV4cGFuZGVkIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZXRyaWV2ZVZpZXdTdGF0ZSIsIm9OYXZQYXJhbWV0ZXJzIiwiYXBwbHlWaWV3U3RhdGUiLCJyZWZyZXNoVmlld0JpbmRpbmdzIiwib0NvbXBvbmVudENvbnRhaW5lciIsIm9Db21wb25lbnQiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsInJldHJpZXZlQ29udHJvbFN0YXRlIiwiZ2V0Um9vdENvbnRyb2wiLCJhcHBseUNvbnRyb2xTdGF0ZSIsIlZpZXdTdGF0ZSIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInByaXZhdGVFeHRlbnNpb24iLCJJbnN0ZWFkIiwiX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiY29sbGVjdFJlc3VsdHMiLCJiYXNlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwib1Byb21pc2VDaGFpbiIsIm9Db250cm9sIiwiaXNBIiwicmVmcmVzaENvbnRyb2xCaW5kaW5nIiwiYmluZCIsImFDb2xsZWN0ZWRDb250cm9scyIsIm9Db250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlciIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIm9SZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJzVHlwZSIsImFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyIiwib0NvbnRyb2xIYW5kbGVyIiwib25TdXNwZW5kIiwib25SZXN0b3JlIiwiZGVzdHJveSIsImZuQ2FsbCIsImFSZXN1bHRzIiwiYXJncyIsImFsbCIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImFDb250cm9sSGFuZGxlciIsImdldENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyIiwiYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhc3NpZ24iLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJnZXRTdGF0ZUtleSIsImdldFZpZXciLCJnZXRMb2NhbElkIiwibWFwIiwidlJlc3VsdCIsImtleSIsInZhbHVlIiwiYVJlc29sdmVkU3RhdGVzIiwib1N0YXRlcyIsIm1TdGF0ZSIsIm9DdXJyZW50U3RhdGUiLCJtZXJnZU9iamVjdHMiLCJvVmlld1N0YXRlIiwiX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsIm1BZGRpdGlvbmFsU3RhdGVzIiwiZmluYWxseSIsInJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsImFDb250cm9sU3RhdGVIYW5kbGVycyIsIm1Db250cm9sU3RhdGVIYW5kbGVyIiwiRXJyb3IiLCJjYWxsIiwiYVN0YXRlcyIsIm9GaW5hbFN0YXRlIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5Iiwib05hdlBhcmFtZXRlciIsIl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwib25CZWZvcmVTdGF0ZUFwcGxpZWQiLCJzS2V5IiwibmF2aWdhdGlvblR5cGUiLCJpQXBwU3RhdGUiLCJhcHBseUFkZGl0aW9uYWxTdGF0ZXMiLCJhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzIiwib25BZnRlclN0YXRlQXBwbGllZCIsIl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkIiwic1ZhcmlhbnRJZCIsImFWYXJpYW50cyIsImdldFZhcmlhbnRzIiwiYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSIsIm9WYXJpYW50IiwicEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlIiwiYVByb21pc2VzIiwiZ2V0SW50ZXJmYWNlIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEscUJBQXFCLEdBQUcsbUJBQTlCO0FBQUEsTUFDQ0MsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BRHRCLEMsQ0FFQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUUsd0JBQTZDLEdBQUc7QUFDckQsNENBQXdDO0FBQ3ZDQyxNQUFBQSxRQUFRLEVBQUUsVUFBVUMsR0FBVixFQUFvQjtBQUM3QixlQUFPO0FBQ04sdUJBQWFB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O0FBQzVELFlBQUksT0FBT0Esb0JBQW9CLENBQUM5SyxLQUE1QixLQUFzQyxVQUExQyxFQUFzRDtBQUNyRCxnQkFBTSxJQUFJK0ssS0FBSixDQUFVLDhEQUE4RDlDLFFBQVEsQ0FBQ08sV0FBVCxHQUF1QkMsT0FBdkIsRUFBeEUsQ0FBTjtBQUNBOztBQUNEVCxRQUFBQSxhQUFhLEdBQUdBLGFBQWEsQ0FBQ3pHLElBQWQsQ0FBbUJ1SixvQkFBb0IsQ0FBQzlLLEtBQXJCLENBQTJCb0ksSUFBM0IsQ0FBZ0MsTUFBaEMsRUFBc0NILFFBQXRDLEVBQWdEaEksYUFBaEQsRUFBK0RvRyxjQUEvRCxDQUFuQixDQUFoQjtBQUNBLE9BTEQ7QUFNQSxhQUFPMkIsYUFBUDtBQUNBLEs7O1dBQ0RxRSxZLEdBQUEsd0JBQWU7QUFDZCxhQUFPLElBQVA7QUFDQSxLOzs7SUFyaUJzQkMsbUI7U0F3aUJUeEYsUyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IE5hdkxpYnJhcnkgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL2xpYnJhcnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1ldGhvZHMgdG8gcmV0cmlldmUgJiBhcHBseSBzdGF0ZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29udHJvbHMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVk06IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSAmJiBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSkge1xuXHRcdFx0XHRjb25zdCBzVmFyaWFudFJlZmVyZW5jZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIG9Db250cm9sU3RhdGUudmFyaWFudElkKVxuXHRcdFx0XHRcdD8gb0NvbnRyb2xTdGF0ZS52YXJpYW50SWRcblx0XHRcdFx0XHQ6IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0cmV0dXJuIENvbnRyb2xWYXJpYW50QXBwbHlBUEkuYWN0aXZhdGVWYXJpYW50KHtcblx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0dmFyaWFudFJlZmVyZW5jZTogc1ZhcmlhbnRSZWZlcmVuY2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLkljb25UYWJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1RhYkJhcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1RhYkJhci5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0l0ZW0uZ2V0S2V5KCkgPT09IG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkSXRlbSkge1xuXHRcdFx0XHRcdG9UYWJCYXIuc2V0U2VsZWN0ZWRJdGVtKG9TZWxlY3RlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuRmlsdGVyQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcikudGhlbihmdW5jdGlvbiAobUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0bUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdICYmIChvUHJvcGVydHlJbmZvLnJlbW92ZUZyb21BcHBTdGF0ZSB8fCBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBtRmlsdGVyQmFyU3RhdGU7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRyZXR1cm4gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvVGFibGUpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFibGU6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRpZiAoIW9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZykge1xuXHRcdFx0XHRcdG9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9UYWJsZSwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9UYWJsZUJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9Sb290QmluZGluZyA9PT0gb1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRcdC8vIGFic29sdXRlIGJpbmRpbmdcblx0XHRcdFx0XHRvVGFibGVCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZWxhdGl2ZSBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb0hlYWRlckNvbnRleHQgPSBvVGFibGVCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBzR3JvdXBJZCA9IG9UYWJsZUJpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9IZWFkZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvSGVhZGVyQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIHNHcm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiVGFibGU6IFwiICsgb1RhYmxlLmdldElkKCkgKyBcIiB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuQ2hhcnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob0NoYXJ0OiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9DaGFydCk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9DaGFydDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9DaGFydCwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9PUExheW91dC5zZXRTZWxlY3RlZFNlY3Rpb24ob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZFNlY3Rpb24pO1xuXHRcdH0sXG5cdFx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBzU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoKG9PUExheW91dCwgc01ldGFQYXRoKTtcblx0XHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllcyA9XG5cdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHtcblx0XHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0XHR9KSB8fCB7fSxcblx0XHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJPYmplY3RQYWdlOiBcIiArIG9PUExheW91dC5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1F1aWNrRmlsdGVyLmdldFNlbGVjdG9yS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9RdWlja0ZpbHRlcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdG9Db250cm9sU3RhdGUgJiYgb1F1aWNrRmlsdGVyLnNldFNlbGVjdG9yS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWdtZW50ZWRCdXR0b25cIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VnbWVudGVkQnV0dG9uLnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWxlY3RcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlbGVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlbGVjdC5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aGVhZGVyRXhwYW5kZWQ6IG9EeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvRHluYW1pY1BhZ2U6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChvQ29udHJvbFN0YXRlLmhlYWRlckV4cGFuZGVkKTtcblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob1ZpZXc6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5hcHBseVZpZXdTdGF0ZShvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9WaWV3OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLnJlZnJlc2hWaWV3QmluZGluZ3MoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9Db21wb25lbnRDb250YWluZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55LCBvTmF2UGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbXBvbmVudENvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0aWYgKG9Db21wb25lbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlDb250cm9sU3RhdGUob0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGZvciBzdGF0ZSBoYW5kbGluZ1xuICpcbiAqIElmIHlvdSBuZWVkIHRvIG1haW50YWluIGEgc3BlY2lmaWMgc3RhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gdXNlIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS44NS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZVwiKVxuY2xhc3MgVmlld1N0YXRlIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyOiBudW1iZXI7XG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkOiBQcm9taXNlPHVua25vd24+O1xuXHRwcml2YXRlIF9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlciA9IDA7XG5cdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZWZyZXNoVmlld0JpbmRpbmdzKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKS50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIHJlbGV2YW50IGZvciByZWZyZXNoaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge0FycmF5PHNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3Q+fSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhcInJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgKyBcIiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyKG9Db250cm9sOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IG9SZWZyZXNoQmluZGluZ0hhbmRsZXI6IGFueSA9IHt9O1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBwYXNzIG9ubHkgdGhlIHJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgaW4gYW4gb2JqZWN0IHNvIHRoYXQgOlxuXHRcdFx0XHRcdC8vIDEuIEFwcGxpY2F0aW9uIGhhcyBhY2Nlc3Mgb25seSB0byByZWZyZXNoQmluZGluZyBhbmQgbm90IGFwcGx5IGFuZCByZXRlcml2ZSBhdCB0aGlzIHN0YWdlXG5cdFx0XHRcdFx0Ly8gMi4gQXBwbGljYXRpb24gbW9kaWZpY2F0aW9ucyB0byB0aGUgb2JqZWN0IHdpbGwgYmUgcmVmbGVjdGVkIGhlcmUgKGFzIHdlIHBhc3MgYnkgcmVmZXJlbmNlKVxuXHRcdFx0XHRcdG9SZWZyZXNoQmluZGluZ0hhbmRsZXJbXCJyZWZyZXNoQmluZGluZ1wiXSA9IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0ucmVmcmVzaEJpbmRpbmcgfHwge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbCwgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcik7XG5cdFx0cmV0dXJuIG9SZWZyZXNoQmluZGluZ0hhbmRsZXI7XG5cdH1cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCBmb3Igd2hpY2ggdGhlIHJlZnJlc2ggaGFuZGxlciBpcyBhZGFwdGVkLlxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IG9Db250cm9sSGFuZGxlciBBIHBsYWluIG9iamVjdCB3aGljaCBjYW4gaGF2ZSBvbmUgZnVuY3Rpb246IDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgb0NvbnRyb2xIYW5kbGVyOiBhbnlbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBzdXNwZW5kZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblN1c3BlbmRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblN1c3BlbmQoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3RvcmVkIGR1ZSB0byBrZWVwLWFsaXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25SZXN0b3JlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25SZXN0b3JlKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIERlc3RydWN0b3IgbWV0aG9kIGZvciBvYmplY3RzLlxuXHQgKi9cblx0ZGVzdHJveSgpIHtcblx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5hYmxlIG11bHRpIG92ZXJyaWRlLiBJdCBpcyBhZGRpbmcgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgKGFycmF5KSB0byB0aGUgcHJvdmlkZWRcblx0ICogZnVuY3Rpb24gKGFuZCBpdHMgcGFyYW1ldGVycyksIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgdmlhIDxjb2RlPlByb21pc2UuYWxsPC9jb2RlPi5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5DYWxsIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIGFyZ3Ncblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgb2YgYWxsIG92ZXJyaWRlc1xuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjb2xsZWN0UmVzdWx0cyhmbkNhbGw6IEZ1bmN0aW9uLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRcdGNvbnN0IGFSZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGFyZ3MucHVzaChhUmVzdWx0cyk7XG5cdFx0Zm5DYWxsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3VzdG9taXplIHRoZSA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IGFDb250cm9sSGFuZGxlciBBIGxpc3Qgb2YgcGxhaW4gb2JqZWN0cyB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIGFDb250cm9sSGFuZGxlcjogb2JqZWN0W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZFxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBtYXAgb2YgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHJldHVybnMge29iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCB0d28gZnVuY3Rpb25zOiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPlxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyID0gW10sXG5cdFx0XHRhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcjogYW55W10gPSBbXTtcblx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdGZvciAoY29uc3Qgc1R5cGUgaW4gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwKSB7XG5cdFx0XHRcdGlmIChvQ29udHJvbC5pc0Eoc1R5cGUpKSB7XG5cdFx0XHRcdFx0Ly8gYXZvaWQgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBpbnRlcm5hbCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXBcblx0XHRcdFx0XHRhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXSkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sLCBhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdFx0cmV0dXJuIGFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIuY29uY2F0KGFDdXN0b21Db250cm9sU3RhdGVIYW5kbGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIGZvciBnaXZlbiB2aWV3IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGF0ZSBoYW5kbGluZyB0byB0aGUgcHJvdmlkZWQgY29udHJvbCBhcnJheS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtBcnJheTxzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0Pn0gYUNvbGxlY3RlZENvbnRyb2xzIFRoZSBjb2xsZWN0ZWQgY29udHJvbHNcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdFN0YXRlQ29udHJvbHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0U3RhdGVDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGtleSBmb3Jcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGtleSB0byBiZSB1c2VkIGZvciBzdG9yaW5nIHRoZSBjb250cm9scyBzdGF0ZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldFN0YXRlS2V5KG9Db250cm9sOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TG9jYWxJZChvQ29udHJvbC5nZXRJZCgpKSB8fCBvQ29udHJvbC5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB2aWV3IHN0YXRlIG9mIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGJlZm9yZSBmaW5pc2hpbmcsIGFsbCBidXQgdGhlIGZpbmFsIHJlc3BvbnNlIHdpbGwgcmVzb2x2ZSB0byA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHJlc29sdmluZyB0aGUgdmlldyBzdGF0ZVxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlVmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdHJldHVybiB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGFDb250cm9sczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5tYXAoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmV0cmlldmVDb250cm9sU3RhdGUob0NvbnRyb2wpLnRoZW4oKHZSZXN1bHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHZSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXNvbHZlZFN0YXRlczogYW55KSB7XG5cdFx0XHRcdHJldHVybiBhUmVzb2x2ZWRTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKS50aGVuKGZ1bmN0aW9uIChtQWRkaXRpb25hbFN0YXRlczogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG1BZGRpdGlvbmFsU3RhdGVzICYmIE9iamVjdC5rZXlzKG1BZGRpdGlvbmFsU3RhdGVzKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGVbQURESVRJT05BTF9TVEFURVNfS0VZXSA9IG1BZGRpdGlvbmFsU3RhdGVzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb1ZpZXdTdGF0ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHQtLXRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChvVmlld1N0YXRlOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID09PSAwID8gb1ZpZXdTdGF0ZSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4dGVuZCB0aGUgbWFwIG9mIGFkZGl0aW9uYWwgc3RhdGVzIChub3QgY29udHJvbCBib3VuZCkgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmlldy5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1BZGRpdGlvbmFsU3RhdGVzIFRoZSBhZGRpdGlvbmFsIHN0YXRlXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCBQcm9taXNlPG9iamVjdD59IEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xTdGF0ZUhhbmRsZXJzID0gdGhpcy5nZXRDb250cm9sU3RhdGVIYW5kbGVyKG9Db250cm9sKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMubWFwKChtQ29udHJvbFN0YXRlSGFuZGxlcjogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbUNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZS5jYWxsKHRoaXMsIG9Db250cm9sKTtcblx0XHRcdH0pXG5cdFx0KS50aGVuKChhU3RhdGVzOiBhbnlbXSkgPT4ge1xuXHRcdFx0cmV0dXJuIGFTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChvRmluYWxTdGF0ZTogYW55LCBvQ3VycmVudFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lcmdlT2JqZWN0cyhvRmluYWxTdGF0ZSwgb0N1cnJlbnRTdGF0ZSk7XG5cdFx0XHR9LCB7fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB2aWV3IHN0YXRlIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgb25jZSBpbml0aWFsbHkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICpcblx0ICogSW1wb3J0YW50OlxuXHQgKiBZb3Ugc2hvdWxkIG9ubHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYWdlcyBhbmQgbm90IGZvciB0aGUgc3RhbmRhcmQgTGlzdFJlcG9ydFBhZ2UgYW5kIE9iamVjdFBhZ2UhXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJZiA8Y29kZT50cnVlPC9jb2RlPiwgb25seSB0aGUgaW5pdGlhbCB2aWV3IHN0YXRlIGlzIGFwcGxpZWQgb25jZSxcblx0ICogZWxzZSBhbnkgbmV3IHZpZXcgc3RhdGUgaXMgYWxzbyBhcHBsaWVkIG9uIGZvbGxvdy11cCBjYWxscyAoZGVmYXVsdClcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUluaXRpYWxTdGF0ZU9ubHlcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFwcGx5SW5pdGlhbFN0YXRlT25seSgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gdmlldyBzdGF0ZSB0byB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3U3RhdGUgVGhlIHZpZXcgc3RhdGUgdG8gYXBwbHkgKGNhbiBiZSB1bmRlZmluZWQpXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2UGFyYW1ldGVyIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7c2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gb05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSBUaGUgYWN0dWFsIG5hdmlnYXRpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBvTmF2UGFyYW1ldGVyLnJlcXVpcmVzU3RhbmRhcmRWYXJpYW50IERlZmluZXMgd2hldGhlciBzdGFuZGFyZCB2YXJpYW50IG11c3QgYmUgdXNlZCBpbiBWTVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlWaWV3U3RhdGUoXG5cdFx0b1ZpZXdTdGF0ZTogYW55LFxuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0O1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRpZiAodGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseUluaXRpYWxTdGF0ZU9ubHkoKSAmJiB0aGlzLl9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5vbkJlZm9yZVN0YXRlQXBwbGllZClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdFN0YXRlQ29udHJvbHMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0XHRsZXQgb1Byb21pc2VDaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpO1xuXHRcdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCkudGhlbih0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdF9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUob1ZNOiBhbnksIHNWYXJpYW50SWQ6IGFueSkge1xuXHRcdGNvbnN0IGFWYXJpYW50cyA9IG9WTS5nZXRWYXJpYW50cygpO1xuXHRcdGxldCBiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlID0gZmFsc2U7XG5cdFx0YVZhcmlhbnRzLmZvckVhY2goZnVuY3Rpb24gKG9WYXJpYW50OiBhbnkpIHtcblx0XHRcdGlmIChvVmFyaWFudC5rZXkgPT09IHNWYXJpYW50SWQpIHtcblx0XHRcdFx0YklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGU7XG5cdH1cblxuXHRfc2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRpZiAodGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0cEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdF9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3QgYmVmb3JlIGEgc3RhdGUgZm9yIGdpdmVuIHZpZXcgaXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQWZ0ZXJTdGF0ZUFwcGxpZWRcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQWZ0ZXJTdGF0ZUFwcGxpZWQoYVByb21pc2VzOiBQcm9taXNlPGFueT4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyBhZGRpdGlvbmFsLCBub3QgY29udHJvbCByZWxhdGVkLCBzdGF0ZXMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgaUFwcFN0YXRlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXdTdGF0ZSBUaGUgY3VycmVudCB2aWV3IHN0YXRlXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFwcGx5QWRkaXRpb25hbFN0YXRlcyhvVmlld1N0YXRlOiBvYmplY3QsIGFQcm9taXNlczogUHJvbWlzZTxhbnk+KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgbm90IGlBcHBTdGF0ZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbb05hdlBhcmFtZXRlci5yZXF1aXJlc1N0YW5kYXJkVmFyaWFudF0gRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0b05hdlBhcmFtZXRlcjoge1xuXHRcdFx0bmF2aWdhdGlvblR5cGU6IGFueTtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50RGVmYXVsdHM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRyZXF1aXJlc1N0YW5kYXJkVmFyaWFudD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdFx0YVByb21pc2VzOiBQcm9taXNlPGFueT5cblx0KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseWluZyB0aGUgZ2l2ZW4gc3RhdGUgdG8gdGhlIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZ2l2ZW4gc3RhdGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sU3RhdGUgVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29OYXZQYXJhbWV0ZXJzXSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge2FueX0gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0fVxuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseS5iaW5kKHRoaXMsIG9Db250cm9sLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cdGdldEludGVyZmFjZSgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGU7XG4iXX0=
856
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwiZmluYWxpemVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJiaW5kIiwicmVjb3ZlciIsIkFERElUSU9OQUxfU1RBVEVTX0tFWSIsIk5hdlR5cGUiLCJOYXZMaWJyYXJ5IiwiX21Db250cm9sU3RhdGVIYW5kbGVyTWFwIiwicmV0cmlldmUiLCJvVk0iLCJnZXRDdXJyZW50VmFyaWFudEtleSIsImFwcGx5Iiwib0NvbnRyb2xTdGF0ZSIsInZhcmlhbnRJZCIsInVuZGVmaW5lZCIsInNWYXJpYW50UmVmZXJlbmNlIiwiX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZSIsImdldFN0YW5kYXJkVmFyaWFudEtleSIsIkNvbnRyb2xWYXJpYW50QXBwbHlBUEkiLCJhY3RpdmF0ZVZhcmlhbnQiLCJlbGVtZW50IiwidmFyaWFudFJlZmVyZW5jZSIsIm9UYWJCYXIiLCJzZWxlY3RlZEtleSIsImdldFNlbGVjdGVkS2V5Iiwib1NlbGVjdGVkSXRlbSIsImdldEl0ZW1zIiwiZmluZCIsIm9JdGVtIiwiZ2V0S2V5Iiwic2V0U2VsZWN0ZWRJdGVtIiwib0ZpbHRlckJhciIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsIm1GaWx0ZXJCYXJTdGF0ZSIsImFQcm9wZXJ0aWVzSW5mbyIsImdldFByb3BlcnR5SW5mb1NldCIsIm1GaWx0ZXIiLCJmaWx0ZXIiLCJvUHJvcGVydHlJbmZvIiwicGF0aCIsInJlbW92ZUZyb21BcHBTdGF0ZSIsImxlbmd0aCIsImZvckVhY2giLCJhcHBseUV4dGVybmFsU3RhdGUiLCJvVGFibGUiLCJzdXBwbGVtZW50YXJ5Q29uZmlnIiwicmVmcmVzaEJpbmRpbmciLCJvVGFibGVCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwicmVmcmVzaCIsIm9IZWFkZXJDb250ZXh0IiwiZ2V0SGVhZGVyQ29udGV4dCIsInNHcm91cElkIiwiZ2V0R3JvdXBJZCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiTG9nIiwiaW5mbyIsImdldElkIiwib0NoYXJ0Iiwib09QTGF5b3V0Iiwic2VsZWN0ZWRTZWN0aW9uIiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwic2V0U2VsZWN0ZWRTZWN0aW9uIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJzTWV0YVBhdGgiLCJNb2RlbEhlbHBlciIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsInNTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aCIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9OYXZpZ2F0aW9uUHJvcGVydGllcyIsIkNvbW1vblV0aWxzIiwiZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzIiwiJGtpbmQiLCJhTmF2UHJvcGVydGllc1RvUmVxdWVzdCIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhUHJldiIsInNOYXZQcm9wIiwiJGlzQ29sbGVjdGlvbiIsInB1c2giLCJhUHJvcGVydGllcyIsIiRQcm9wZXJ0eVBhdGgiLCJjb25jYXQiLCJvUXVpY2tGaWx0ZXIiLCJnZXRTZWxlY3RvcktleSIsInNldFNlbGVjdG9yS2V5Iiwib1NlZ21lbnRlZEJ1dHRvbiIsInNldFNlbGVjdGVkS2V5Iiwib1NlbGVjdCIsIm9EeW5hbWljUGFnZSIsImhlYWRlckV4cGFuZGVkIiwiZ2V0SGVhZGVyRXhwYW5kZWQiLCJzZXRIZWFkZXJFeHBhbmRlZCIsIm9WaWV3Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwidmlld1N0YXRlIiwicmV0cmlldmVWaWV3U3RhdGUiLCJvTmF2UGFyYW1ldGVycyIsImFwcGx5Vmlld1N0YXRlIiwicmVmcmVzaFZpZXdCaW5kaW5ncyIsIm9Db21wb25lbnRDb250YWluZXIiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJyZXRyaWV2ZUNvbnRyb2xTdGF0ZSIsImdldFJvb3RDb250cm9sIiwiYXBwbHlDb250cm9sU3RhdGUiLCJWaWV3U3RhdGUiLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJwcml2YXRlRXh0ZW5zaW9uIiwiSW5zdGVhZCIsIl9pUmV0cmlldmluZ1N0YXRlQ291bnRlciIsIl9wSW5pdGlhbFN0YXRlQXBwbGllZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSIsImNvbGxlY3RSZXN1bHRzIiwiYmFzZSIsImFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyIsImFDb250cm9scyIsIm9Qcm9taXNlQ2hhaW4iLCJvQ29udHJvbCIsImlzQSIsInJlZnJlc2hDb250cm9sQmluZGluZyIsImFDb2xsZWN0ZWRDb250cm9scyIsIm9Db250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlciIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIm9SZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJzVHlwZSIsImFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyIiwib0NvbnRyb2xIYW5kbGVyIiwib25TdXNwZW5kIiwib25SZXN0b3JlIiwiZGVzdHJveSIsImZuQ2FsbCIsImFSZXN1bHRzIiwiYXJncyIsImFsbCIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImFDb250cm9sSGFuZGxlciIsImdldENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyIiwiYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhc3NpZ24iLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJnZXRTdGF0ZUtleSIsImdldFZpZXciLCJnZXRMb2NhbElkIiwib1ZpZXdTdGF0ZSIsIm1hcCIsInZSZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsImFSZXNvbHZlZFN0YXRlcyIsIm9TdGF0ZXMiLCJtU3RhdGUiLCJvQ3VycmVudFN0YXRlIiwibWVyZ2VPYmplY3RzIiwiX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcyIsIm1BZGRpdGlvbmFsU3RhdGVzIiwicmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwiYUNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwibUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJFcnJvciIsImNhbGwiLCJhU3RhdGVzIiwib0ZpbmFsU3RhdGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJvTmF2UGFyYW1ldGVyIiwiX2dldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJvbkJlZm9yZVN0YXRlQXBwbGllZCIsInNLZXkiLCJuYXZpZ2F0aW9uVHlwZSIsImlBcHBTdGF0ZSIsImFwcGx5QWRkaXRpb25hbFN0YXRlcyIsImFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvbkFmdGVyU3RhdGVBcHBsaWVkIiwiX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJlcnJvciIsInNWYXJpYW50SWQiLCJhVmFyaWFudHMiLCJnZXRWYXJpYW50cyIsImJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGUiLCJvVmFyaWFudCIsInBJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSIsImFQcm9taXNlcyIsImdldEludGVyZmFjZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHJpdmF0ZUV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgQ29udHJvbFZhcmlhbnRBcHBseUFQSSBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L2FwaS9Db250cm9sVmFyaWFudEFwcGx5QVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG4vLyBhZGRpdGlvbmFsU3RhdGVzIGFyZSBzdG9yZWQgbmV4dCB0byBjb250cm9sIElEcywgc28gbmFtZSBjbGFzaCBhdm9pZGFuY2UgbmVlZGVkLiBGb3J0dW5hdGVseSBJRHMgaGF2ZSByZXN0cmljdGlvbnM6XG4vLyBcIkFsbG93ZWQgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChjYXBpdGFsL2xvd2VyY2FzZSksIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcywgcG9pbnRzIGFuZC9vciBjb2xvbnMuXCJcbi8vIFRoZXJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgbGlrZSAjIG9yIEBcbmNvbnN0IEFERElUSU9OQUxfU1RBVEVTX0tFWSA9IFwiI2FkZGl0aW9uYWxTdGF0ZXNcIixcblx0TmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1ldGhvZHMgdG8gcmV0cmlldmUgJiBhcHBseSBzdGF0ZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29udHJvbHMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcblx0XCJzYXAudWkuZmwudmFyaWFudHMuVmFyaWFudE1hbmFnZW1lbnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVk06IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSAmJiBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSkge1xuXHRcdFx0XHRjb25zdCBzVmFyaWFudFJlZmVyZW5jZSA9IHRoaXMuX2NoZWNrSWZWYXJpYW50SWRJc0F2YWlsYWJsZShvVk0sIG9Db250cm9sU3RhdGUudmFyaWFudElkKVxuXHRcdFx0XHRcdD8gb0NvbnRyb2xTdGF0ZS52YXJpYW50SWRcblx0XHRcdFx0XHQ6IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0cmV0dXJuIENvbnRyb2xWYXJpYW50QXBwbHlBUEkuYWN0aXZhdGVWYXJpYW50KHtcblx0XHRcdFx0XHRlbGVtZW50OiBvVk0sXG5cdFx0XHRcdFx0dmFyaWFudFJlZmVyZW5jZTogc1ZhcmlhbnRSZWZlcmVuY2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLkljb25UYWJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1RhYkJhcjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1RhYkJhci5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0l0ZW0uZ2V0S2V5KCkgPT09IG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkSXRlbSkge1xuXHRcdFx0XHRcdG9UYWJCYXIuc2V0U2VsZWN0ZWRJdGVtKG9TZWxlY3RlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuRmlsdGVyQmFyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcikudGhlbihmdW5jdGlvbiAobUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0bUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdICYmIChvUHJvcGVydHlJbmZvLnJlbW92ZUZyb21BcHBTdGF0ZSB8fCBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0ubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBtRmlsdGVyQmFyU3RhdGU7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRyZXR1cm4gU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvVGFibGUpO1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVGFibGU6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRpZiAoIW9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZykge1xuXHRcdFx0XHRcdG9Db250cm9sU3RhdGUuc3VwcGxlbWVudGFyeUNvbmZpZyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9UYWJsZSwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290QmluZGluZyA9IG9UYWJsZUJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9Sb290QmluZGluZyA9PT0gb1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRcdC8vIGFic29sdXRlIGJpbmRpbmdcblx0XHRcdFx0XHRvVGFibGVCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZWxhdGl2ZSBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb0hlYWRlckNvbnRleHQgPSBvVGFibGVCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBzR3JvdXBJZCA9IG9UYWJsZUJpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9IZWFkZXJDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvSGVhZGVyQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIHNHcm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKGBUYWJsZTogJHtvVGFibGUuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5tZGMuQ2hhcnRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob0NoYXJ0OiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9DaGFydCk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9DaGFydDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9DaGFydCwgb0NvbnRyb2xTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRvT1BMYXlvdXQuc2V0U2VsZWN0ZWRTZWN0aW9uKG9Db250cm9sU3RhdGUuc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmIChvQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRcdGlmIChzU3RyYXRlZ3kgPT09IFwic2VsZlwiKSB7XG5cdFx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXMgPVxuXHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0fSkgfHwge30sXG5cdFx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uIChhUHJldjogYW55W10sIHNOYXZQcm9wOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uUHJvcGVydGllc1tzTmF2UHJvcF0uJGlzQ29sbGVjdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGFQcmV2LnB1c2goeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc05hdlByb3AgfSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFQcmV2O1xuXHRcdFx0XHRcdFx0fSwgW10pLFxuXHRcdFx0XHRcdFx0YVByb3BlcnRpZXMgPSBbeyAkUHJvcGVydHlQYXRoOiBcIipcIiB9XSxcblx0XHRcdFx0XHRcdHNHcm91cElkID0gb0JpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhhUHJvcGVydGllcy5jb25jYXQoYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QpLCBzR3JvdXBJZCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1N0cmF0ZWd5ID09PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdC8vIENvbXBsZXRlIHJlZnJlc2hcblx0XHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKGBPYmplY3RQYWdlOiAke29PUExheW91dC5nZXRJZCgpfSB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLmZlLm1hY3Jvcy50YWJsZS5RdWlja0ZpbHRlckNvbnRhaW5lclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvUXVpY2tGaWx0ZXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9RdWlja0ZpbHRlci5nZXRTZWxlY3RvcktleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvUXVpY2tGaWx0ZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRvUXVpY2tGaWx0ZXIuc2V0U2VsZWN0b3JLZXkob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLlNlZ21lbnRlZEJ1dHRvblwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvU2VnbWVudGVkQnV0dG9uOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkS2V5OiBvU2VnbWVudGVkQnV0dG9uLmdldFNlbGVjdGVkS2V5KClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24gKG9TZWdtZW50ZWRCdXR0b246IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRyb2xTdGF0ZSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAubS5TZWxlY3RcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob1NlbGVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlbGVjdC5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0b1NlbGVjdC5zZXRTZWxlY3RlZEtleShvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLmYuRHluYW1pY1BhZ2VcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob0R5bmFtaWNQYWdlOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGhlYWRlckV4cGFuZGVkOiBvRHluYW1pY1BhZ2UuZ2V0SGVhZGVyRXhwYW5kZWQoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0R5bmFtaWNQYWdlOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0b0R5bmFtaWNQYWdlLnNldEhlYWRlckV4cGFuZGVkKG9Db250cm9sU3RhdGUuaGVhZGVyRXhwYW5kZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkuY29yZS5tdmMuVmlld1wiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uIChvVmlldzogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5yZXRyaWV2ZVZpZXdTdGF0ZShvQ29udHJvbGxlci52aWV3U3RhdGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChvVmlldzogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLmFwcGx5Vmlld1N0YXRlKG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmVmcmVzaFZpZXdCaW5kaW5ncygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAob0NvbXBvbmVudENvbnRhaW5lcjogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbXBvbmVudENvbnRhaW5lci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdFx0aWYgKG9Db21wb25lbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmV0cmlldmVDb250cm9sU3RhdGUob0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbiAob0NvbXBvbmVudENvbnRhaW5lcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29tcG9uZW50Q29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRpZiAob0NvbXBvbmVudCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNvbnRyb2xTdGF0ZShvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCksIG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgZm9yIHN0YXRlIGhhbmRsaW5nXG4gKlxuICogSWYgeW91IG5lZWQgdG8gbWFpbnRhaW4gYSBzcGVjaWZpYyBzdGF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjg1LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlXCIpXG5jbGFzcyBWaWV3U3RhdGUgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfaVJldHJpZXZpbmdTdGF0ZUNvdW50ZXI6IG51bWJlcjtcblx0cHJpdmF0ZSBfcEluaXRpYWxTdGF0ZUFwcGxpZWQ6IFByb21pc2U8dW5rbm93bj47XG5cdHByaXZhdGUgX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZT86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyID0gMDtcblx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHJlZnJlc2hWaWV3QmluZGluZ3MoKSB7XG5cdFx0Y29uc3QgYUNvbnRyb2xzID0gYXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbHNcblx0XHRcdC5maWx0ZXIoKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG9Qcm9taXNlQ2hhaW47XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFkZCBhbGwgY29udHJvbHMgcmVsZXZhbnQgZm9yIHJlZnJlc2hpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhgcmVmcmVzaEJpbmRpbmcgaGFuZGxlciBmb3IgY29udHJvbDogJHtvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX0gaXMgbm90IHByb3ZpZGVkYCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyKG9Db250cm9sOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IG9SZWZyZXNoQmluZGluZ0hhbmRsZXI6IGFueSA9IHt9O1xuXHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0Zm9yIChjb25zdCBzVHlwZSBpbiBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXApIHtcblx0XHRcdFx0aWYgKG9Db250cm9sLmlzQShzVHlwZSkpIHtcblx0XHRcdFx0XHQvLyBwYXNzIG9ubHkgdGhlIHJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgaW4gYW4gb2JqZWN0IHNvIHRoYXQgOlxuXHRcdFx0XHRcdC8vIDEuIEFwcGxpY2F0aW9uIGhhcyBhY2Nlc3Mgb25seSB0byByZWZyZXNoQmluZGluZyBhbmQgbm90IGFwcGx5IGFuZCByZXRlcml2ZSBhdCB0aGlzIHN0YWdlXG5cdFx0XHRcdFx0Ly8gMi4gQXBwbGljYXRpb24gbW9kaWZpY2F0aW9ucyB0byB0aGUgb2JqZWN0IHdpbGwgYmUgcmVmbGVjdGVkIGhlcmUgKGFzIHdlIHBhc3MgYnkgcmVmZXJlbmNlKVxuXHRcdFx0XHRcdG9SZWZyZXNoQmluZGluZ0hhbmRsZXJbXCJyZWZyZXNoQmluZGluZ1wiXSA9IF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0ucmVmcmVzaEJpbmRpbmcgfHwge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbCwgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcik7XG5cdFx0cmV0dXJuIG9SZWZyZXNoQmluZGluZ0hhbmRsZXI7XG5cdH1cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+IGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIGZvciB3aGljaCB0aGUgcmVmcmVzaCBoYW5kbGVyIGlzIGFkYXB0ZWQuXG5cdCAqIEBwYXJhbSBvQ29udHJvbEhhbmRsZXIgQSBwbGFpbiBvYmplY3Qgd2hpY2ggY2FuIGhhdmUgb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlclxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIG9Db250cm9sSGFuZGxlcjogYW55W10pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgc3VzcGVuZGVkIGR1ZSB0byBrZWVwLWFsaXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25TdXNwZW5kXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25TdXNwZW5kKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyByZXN0b3JlZCBkdWUgdG8ga2VlcC1hbGl2ZSBtb2RlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uUmVzdG9yZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUmVzdG9yZSgpIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBEZXN0cnVjdG9yIG1ldGhvZCBmb3Igb2JqZWN0cy5cblx0ICovXG5cdGRlc3Ryb3koKSB7XG5cdFx0ZGVsZXRlIHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGVuYWJsZSBtdWx0aSBvdmVycmlkZS4gSXQgaXMgYWRkaW5nIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIChhcnJheSkgdG8gdGhlIHByb3ZpZGVkXG5cdCAqIGZ1bmN0aW9uIChhbmQgaXRzIHBhcmFtZXRlcnMpLCB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIHZpYSA8Y29kZT5Qcm9taXNlLmFsbDwvY29kZT4uXG5cdCAqXG5cdCAqIEBwYXJhbSBmbkNhbGwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGFsbCBvdmVycmlkZXNcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y29sbGVjdFJlc3VsdHMoZm5DYWxsOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pIHtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRhcmdzLnB1c2goYVJlc3VsdHMpO1xuXHRcdGZuQ2FsbC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcGFyYW0gYUNvbnRyb2xIYW5kbGVyIEEgbGlzdCBvZiBwbGFpbiBvYmplY3RzIHdpdGggdHdvIGZ1bmN0aW9uczogPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgYUNvbnRyb2xIYW5kbGVyOiBvYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIEEgcGxhaW4gb2JqZWN0IHdpdGggdHdvIGZ1bmN0aW9uczogPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT5cblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlciA9IFtdLFxuXHRcdFx0YUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueVtdID0gW107XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIGF2b2lkIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgaW50ZXJuYWwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwXG5cdFx0XHRcdFx0YUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlci5wdXNoKE9iamVjdC5hc3NpZ24oe30sIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCwgYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIpO1xuXHRcdHJldHVybiBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLmNvbmNhdChhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYWRkIGFsbCBjb250cm9scyBmb3IgZ2l2ZW4gdmlldyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgc3RhdGUgaGFuZGxpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0U3RhdGVDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRTdGF0ZUNvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBrZXkgZm9yXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgdG8gYmUgdXNlZCBmb3Igc3RvcmluZyB0aGUgY29udHJvbHMgc3RhdGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRTdGF0ZUtleShvQ29udHJvbDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldExvY2FsSWQob0NvbnRyb2wuZ2V0SWQoKSkgfHwgb0NvbnRyb2wuZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdmlldyBzdGF0ZSBvZiB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBiZWZvcmUgZmluaXNoaW5nLCBhbGwgYnV0IHRoZSBmaW5hbCByZXNwb25zZSB3aWxsIHJlc29sdmUgdG8gPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi5cblx0ICpcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0aGUgdmlldyBzdGF0ZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI3JldHJpZXZlVmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyByZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdGxldCBvVmlld1N0YXRlOiBhbnk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWQ7XG5cdFx0XHRjb25zdCBhQ29udHJvbHMgPSBhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRTdGF0ZUNvbnRyb2xzKTtcblx0XHRcdGNvbnN0IGFSZXNvbHZlZFN0YXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQubWFwKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbCkudGhlbigodlJlc3VsdDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0a2V5OiB0aGlzLmdldFN0YXRlS2V5KG9Db250cm9sKSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdlJlc3VsdFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRvVmlld1N0YXRlID0gYVJlc29sdmVkU3RhdGVzLnJlZHVjZShmdW5jdGlvbiAob1N0YXRlczogYW55LCBtU3RhdGU6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvQ3VycmVudFN0YXRlOiBhbnkgPSB7fTtcblx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0cmV0dXJuIG1lcmdlT2JqZWN0cyhvU3RhdGVzLCBvQ3VycmVudFN0YXRlKTtcblx0XHRcdH0sIHt9KTtcblx0XHRcdGNvbnN0IG1BZGRpdGlvbmFsU3RhdGVzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKTtcblx0XHRcdGlmIChtQWRkaXRpb25hbFN0YXRlcyAmJiBPYmplY3Qua2V5cyhtQWRkaXRpb25hbFN0YXRlcykubGVuZ3RoKSB7XG5cdFx0XHRcdG9WaWV3U3RhdGVbQURESVRJT05BTF9TVEFURVNfS0VZXSA9IG1BZGRpdGlvbmFsU3RhdGVzO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHQtLXRoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9pUmV0cmlldmluZ1N0YXRlQ291bnRlciA9PT0gMCA/IG9WaWV3U3RhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogRXh0ZW5kIHRoZSBtYXAgb2YgYWRkaXRpb25hbCBzdGF0ZXMgKG5vdCBjb250cm9sIGJvdW5kKSB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHN0YXRlIG9mIHRoZSBnaXZlbiB2aWV3LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gbUFkZGl0aW9uYWxTdGF0ZXMgVGhlIGFkZGl0aW9uYWwgc3RhdGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlczogb2JqZWN0KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIGFkZGl0aW9uYWwgc3RhdGVzIChub3QgY29udHJvbCBib3VuZCkgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmlldy5cblx0ICpcblx0ICogQHJldHVybnMgQWRkaXRpb25hbCB2aWV3IHN0YXRlc1xuXHQgKi9cblx0X3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpIHtcblx0XHRjb25zdCBtQWRkaXRpb25hbFN0YXRlcyA9IHt9O1xuXHRcdHRoaXMuYmFzZS52aWV3U3RhdGUucmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzKG1BZGRpdGlvbmFsU3RhdGVzKTtcblx0XHRyZXR1cm4gbUFkZGl0aW9uYWxTdGF0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udHJvbCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgc3RhdGUgZm9yXG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2xcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cmV0cmlldmVDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0YUNvbnRyb2xTdGF0ZUhhbmRsZXJzLm1hcCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1Db250cm9sU3RhdGVIYW5kbGVyLnJldHJpZXZlICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGNvbnRyb2xTdGF0ZUhhbmRsZXIucmV0cmlldmUgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6ICR7b0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1Db250cm9sU3RhdGVIYW5kbGVyLnJldHJpZXZlLmNhbGwodGhpcywgb0NvbnRyb2wpO1xuXHRcdFx0fSlcblx0XHQpLnRoZW4oKGFTdGF0ZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRyZXR1cm4gYVN0YXRlcy5yZWR1Y2UoZnVuY3Rpb24gKG9GaW5hbFN0YXRlOiBhbnksIG9DdXJyZW50U3RhdGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9GaW5hbFN0YXRlLCBvQ3VycmVudFN0YXRlKTtcblx0XHRcdH0sIHt9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIHZpZXcgc3RhdGUgc2hvdWxkIG9ubHkgYmUgYXBwbGllZCBvbmNlIGluaXRpYWxseS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWR9LlxuXHQgKlxuXHQgKiBJbXBvcnRhbnQ6XG5cdCAqIFlvdSBzaG91bGQgb25seSBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIHBhZ2VzIGFuZCBub3QgZm9yIHRoZSBzdGFuZGFyZCBMaXN0UmVwb3J0UGFnZSBhbmQgT2JqZWN0UGFnZSFcblx0ICpcblx0ICogQHJldHVybnMgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG9ubHkgdGhlIGluaXRpYWwgdmlldyBzdGF0ZSBpcyBhcHBsaWVkIG9uY2UsXG5cdCAqIGVsc2UgYW55IG5ldyB2aWV3IHN0YXRlIGlzIGFsc28gYXBwbGllZCBvbiBmb2xsb3ctdXAgY2FsbHMgKGRlZmF1bHQpXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlJbml0aWFsU3RhdGVPbmx5XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHkoKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0LyoqXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIHZpZXcgc3RhdGUgdG8gdGhpcyBleHRlbnNpb25zIHZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlld1N0YXRlIFRoZSB2aWV3IHN0YXRlIHRvIGFwcGx5IChjYW4gYmUgdW5kZWZpbmVkKVxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlciBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlci5uYXZpZ2F0aW9uVHlwZSBUaGUgYWN0dWFsIG5hdmlnYXRpb24gdHlwZVxuXHQgKiBAcGFyYW0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb25WYXJpYW50IGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIuc2VsZWN0aW9uVmFyaWFudERlZmF1bHRzIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIG9OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQgRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEByZXR1cm5zIFByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlWaWV3U3RhdGVcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5Vmlld1N0YXRlKFxuXHRcdG9WaWV3U3RhdGU6IGFueSxcblx0XHRvTmF2UGFyYW1ldGVyOiB7XG5cdFx0XHRuYXZpZ2F0aW9uVHlwZTogYW55O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdDtcblx0XHRcdHJlcXVpcmVzU3RhbmRhcmRWYXJpYW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0aWYgKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlJbml0aWFsU3RhdGVPbmx5KCkgJiYgdGhpcy5fZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHModGhpcy5iYXNlLnZpZXdTdGF0ZS5vbkJlZm9yZVN0YXRlQXBwbGllZCk7XG5cdFx0XHRjb25zdCBhQ29udHJvbHMgPSBhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRTdGF0ZUNvbnRyb2xzKTtcblx0XHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZvckVhY2goKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzS2V5ID0gdGhpcy5nZXRTdGF0ZUtleShvQ29udHJvbCk7XG5cdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdHRoaXMuYXBwbHlDb250cm9sU3RhdGUuYmluZCh0aGlzLCBvQ29udHJvbCwgb1ZpZXdTdGF0ZSA/IG9WaWV3U3RhdGVbc0tleV0gOiB1bmRlZmluZWQsIG9OYXZQYXJhbWV0ZXIpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRhd2FpdCBvUHJvbWlzZUNoYWluO1xuXHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0dGhpcy5iYXNlLnZpZXdTdGF0ZS5hcHBseUFkZGl0aW9uYWxTdGF0ZXMsXG5cdFx0XHRcdFx0b1ZpZXdTdGF0ZSA/IG9WaWV3U3RhdGVbQURESVRJT05BTF9TVEFURVNfS0VZXSA6IHVuZGVmaW5lZFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMsIG9OYXZQYXJhbWV0ZXIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCk7XG5cdFx0XHRcdHRoaXMuX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQoKTtcblx0XHRcdH0gY2F0Y2ggKGU6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRfY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTTogYW55LCBzVmFyaWFudElkOiBhbnkpIHtcblx0XHRjb25zdCBhVmFyaWFudHMgPSBvVk0uZ2V0VmFyaWFudHMoKTtcblx0XHRsZXQgYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IGZhbHNlO1xuXHRcdGFWYXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uIChvVmFyaWFudDogYW55KSB7XG5cdFx0XHRpZiAob1ZhcmlhbnQua2V5ID09PSBzVmFyaWFudElkKSB7XG5cdFx0XHRcdGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlO1xuXHR9XG5cblx0X3NldEluaXRpYWxTdGF0ZUFwcGxpZWQoKSB7XG5cdFx0aWYgKHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSkge1xuXHRcdFx0Y29uc3QgcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlID0gdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0XHRcdHBJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXHRfZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkUmVzb2x2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHRvIHJlYWN0IGJlZm9yZSBhIHN0YXRlIGZvciBnaXZlbiB2aWV3IGlzIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3Qgd2hlbiBzdGF0ZSBmb3IgZ2l2ZW4gdmlldyB3YXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjb25BZnRlclN0YXRlQXBwbGllZFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25BZnRlclN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIGFkZGl0aW9uYWwsIG5vdCBjb250cm9sIHJlbGF0ZWQsIHN0YXRlcyAtIGlzIGNhbGxlZCBvbmx5IGlmIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVmlld1N0YXRlIFRoZSBjdXJyZW50IHZpZXcgc3RhdGVcblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlBZGRpdGlvbmFsU3RhdGVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhcHBseUFkZGl0aW9uYWxTdGF0ZXMob1ZpZXdTdGF0ZTogb2JqZWN0LCBhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHkgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIC0gaXMgY2FsbGVkIG9ubHkgaWYgbmF2aWdhdGlvbiB0eXBlIGlzIG5vdCBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvTmF2UGFyYW1ldGVyIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIFtvTmF2UGFyYW1ldGVyLnJlcXVpcmVzU3RhbmRhcmRWYXJpYW50XSBEZWZpbmVzIHdoZXRoZXIgc3RhbmRhcmQgdmFyaWFudCBtdXN0IGJlIHVzZWQgaW4gVk1cblx0ICogQHBhcmFtIGFQcm9taXNlcyBFeHRlbnNpYmxlIGFycmF5IG9mIHByb21pc2VzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdGFQcm9taXNlczogUHJvbWlzZTxhbnk+XG5cdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHlpbmcgdGhlIGdpdmVuIHN0YXRlIHRvIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2wgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZ2l2ZW4gc3RhdGVcblx0ICogQHBhcmFtIG9Db250cm9sU3RhdGUgVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKiBAcGFyYW0gW29OYXZQYXJhbWV0ZXJzXSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RhdGUgaGFuZGxpbmdcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgY29udHJvbFN0YXRlSGFuZGxlci5hcHBseSBpcyBub3QgYSBmdW5jdGlvbiBmb3IgY29udHJvbDogJHtvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gKTtcblx0XHRcdH1cblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4obUNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkuYmluZCh0aGlzLCBvQ29udHJvbCwgb0NvbnRyb2xTdGF0ZSwgb05hdlBhcmFtZXRlcnMpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld1N0YXRlO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7RUErakJPLDBCQUEwQkEsSUFBMUIsRUFBZ0NDLFNBQWhDLEVBQTJDO0lBQ2pELElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7SUFDQSxDQUZELENBRUUsT0FBT0csQ0FBUCxFQUFVO01BQ1gsT0FBT0YsU0FBUyxDQUFDLElBQUQsRUFBT0UsQ0FBUCxDQUFoQjtJQUNBOztJQUNELElBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWUgsU0FBUyxDQUFDSSxJQUFWLENBQWUsSUFBZixFQUFxQixLQUFyQixDQUFaLEVBQXlDSixTQUFTLENBQUNJLElBQVYsQ0FBZSxJQUFmLEVBQXFCLElBQXJCLENBQXpDLENBQVA7SUFDQTs7SUFDRCxPQUFPSixTQUFTLENBQUMsS0FBRCxFQUFRQyxNQUFSLENBQWhCO0VBQ0E7O0VBdkJNLGdCQUFnQkYsSUFBaEIsRUFBc0JNLE9BQXRCLEVBQStCO0lBQ3JDLElBQUk7TUFDSCxJQUFJSixNQUFNLEdBQUdGLElBQUksRUFBakI7SUFDQSxDQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO01BQ1YsT0FBT0csT0FBTyxDQUFDSCxDQUFELENBQWQ7SUFDQTs7SUFDRCxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7TUFDMUIsT0FBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkUsT0FBcEIsQ0FBUDtJQUNBOztJQUNELE9BQU9KLE1BQVA7RUFDQTs7Ozs7Ozs7RUEvaUJEO0VBQ0E7RUFDQTtFQUNBLElBQU1LLHFCQUFxQixHQUFHLG1CQUE5QjtFQUFBLElBQ0NDLE9BQU8sR0FBR0MsVUFBVSxDQUFDRCxPQUR0QixDLENBRUE7RUFDQTtFQUNBOztFQUNBLElBQU1FLHdCQUE2QyxHQUFHO0lBQ3JELHdDQUF3QztNQUN2Q0MsUUFBUSxFQUFFLFVBQVVDLEdBQVYsRUFBb0I7UUFDN0IsT0FBTztVQUNOLGFBQWFBLEdBQUcsQ0FBQ0Msb0JBQUo7UUFEUCxDQUFQO01BR0EsQ0FMc0M7TUFNdkNDLEtBQUssRUFBRSxVQUFVRixHQUFWLEVBQW9CRyxhQUFwQixFQUF3QztRQUM5QyxJQUFJQSxhQUFhLElBQUlBLGFBQWEsQ0FBQ0MsU0FBZCxLQUE0QkMsU0FBN0MsSUFBMERGLGFBQWEsQ0FBQ0MsU0FBZCxLQUE0QkosR0FBRyxDQUFDQyxvQkFBSixFQUExRixFQUFzSDtVQUNySCxJQUFNSyxpQkFBaUIsR0FBRyxLQUFLQyw0QkFBTCxDQUFrQ1AsR0FBbEMsRUFBdUNHLGFBQWEsQ0FBQ0MsU0FBckQsSUFDdkJELGFBQWEsQ0FBQ0MsU0FEUyxHQUV2QkosR0FBRyxDQUFDUSxxQkFBSixFQUZIO1VBR0EsT0FBT0Msc0JBQXNCLENBQUNDLGVBQXZCLENBQXVDO1lBQzdDQyxPQUFPLEVBQUVYLEdBRG9DO1lBRTdDWSxnQkFBZ0IsRUFBRU47VUFGMkIsQ0FBdkMsQ0FBUDtRQUlBO01BQ0Q7SUFoQnNDLENBRGE7SUFtQnJELG9CQUFvQjtNQUNuQlAsUUFBUSxFQUFFLFVBQVVjLE9BQVYsRUFBd0I7UUFDakMsT0FBTztVQUNOQyxXQUFXLEVBQUVELE9BQU8sQ0FBQ0UsY0FBUjtRQURQLENBQVA7TUFHQSxDQUxrQjtNQU1uQmIsS0FBSyxFQUFFLFVBQVVXLE9BQVYsRUFBd0JWLGFBQXhCLEVBQTRDO1FBQ2xELElBQUlBLGFBQWEsSUFBSUEsYUFBYSxDQUFDVyxXQUFuQyxFQUFnRDtVQUMvQyxJQUFNRSxhQUFhLEdBQUdILE9BQU8sQ0FBQ0ksUUFBUixHQUFtQkMsSUFBbkIsQ0FBd0IsVUFBVUMsS0FBVixFQUFzQjtZQUNuRSxPQUFPQSxLQUFLLENBQUNDLE1BQU4sT0FBbUJqQixhQUFhLENBQUNXLFdBQXhDO1VBQ0EsQ0FGcUIsQ0FBdEI7O1VBR0EsSUFBSUUsYUFBSixFQUFtQjtZQUNsQkgsT0FBTyxDQUFDUSxlQUFSLENBQXdCTCxhQUF4QjtVQUNBO1FBQ0Q7TUFDRDtJQWZrQixDQW5CaUM7SUFvQ3JELHdCQUF3QjtNQUN2QmpCLFFBQVEsRUFBRSxVQUFVdUIsVUFBVixFQUEyQjtRQUNwQyxPQUFPQyxTQUFTLENBQUNDLHFCQUFWLENBQWdDRixVQUFoQyxFQUE0QzlCLElBQTVDLENBQWlELFVBQVVpQyxlQUFWLEVBQWdDO1VBQ3ZGO1VBQ0EsSUFBTUMsZUFBZSxHQUFHSixVQUFVLENBQUNLLGtCQUFYLEVBQXhCO1VBQUEsSUFDQ0MsT0FBTyxHQUFHSCxlQUFlLENBQUNJLE1BQWhCLElBQTBCLEVBRHJDO1VBRUFILGVBQWUsQ0FDYkcsTUFERixDQUNTLFVBQVVDLGFBQVYsRUFBOEI7WUFDckMsT0FDQ0YsT0FBTyxDQUFDRSxhQUFhLENBQUNDLElBQWYsQ0FBUCxLQUFnQ0QsYUFBYSxDQUFDRSxrQkFBZCxJQUFvQ0osT0FBTyxDQUFDRSxhQUFhLENBQUNDLElBQWYsQ0FBUCxDQUE0QkUsTUFBNUIsS0FBdUMsQ0FBM0csQ0FERDtVQUdBLENBTEYsRUFNRUMsT0FORixDQU1VLFVBQVVKLGFBQVYsRUFBOEI7WUFDdEMsT0FBT0YsT0FBTyxDQUFDRSxhQUFhLENBQUNDLElBQWYsQ0FBZDtVQUNBLENBUkY7VUFTQSxPQUFPTixlQUFQO1FBQ0EsQ0FkTSxDQUFQO01BZUEsQ0FqQnNCO01Ba0J2QnZCLEtBQUssRUFBRSxVQUFVb0IsVUFBVixFQUEyQm5CLGFBQTNCLEVBQStDO1FBQ3JELElBQUlBLGFBQUosRUFBbUI7VUFDbEIsT0FBT29CLFNBQVMsQ0FBQ1ksa0JBQVYsQ0FBNkJiLFVBQTdCLEVBQXlDbkIsYUFBekMsQ0FBUDtRQUNBO01BQ0Q7SUF0QnNCLENBcEM2QjtJQTREckQsb0JBQW9CO01BQ25CSixRQUFRLEVBQUUsVUFBVXFDLE1BQVYsRUFBdUI7UUFDaEMsT0FBT2IsU0FBUyxDQUFDQyxxQkFBVixDQUFnQ1ksTUFBaEMsQ0FBUDtNQUNBLENBSGtCO01BSW5CbEMsS0FBSyxFQUFFLFVBQVVrQyxNQUFWLEVBQXVCakMsYUFBdkIsRUFBMkM7UUFDakQsSUFBSUEsYUFBSixFQUFtQjtVQUNsQixJQUFJLENBQUNBLGFBQWEsQ0FBQ2tDLG1CQUFuQixFQUF3QztZQUN2Q2xDLGFBQWEsQ0FBQ2tDLG1CQUFkLEdBQW9DLEVBQXBDO1VBQ0E7O1VBQ0QsT0FBT2QsU0FBUyxDQUFDWSxrQkFBVixDQUE2QkMsTUFBN0IsRUFBcUNqQyxhQUFyQyxDQUFQO1FBQ0E7TUFDRCxDQVhrQjtNQVluQm1DLGNBQWMsRUFBRSxVQUFVRixNQUFWLEVBQXVCO1FBQ3RDLElBQU1HLGFBQWEsR0FBR0gsTUFBTSxDQUFDSSxhQUFQLEVBQXRCOztRQUNBLElBQUlELGFBQUosRUFBbUI7VUFDbEIsSUFBTUUsWUFBWSxHQUFHRixhQUFhLENBQUNHLGNBQWQsRUFBckI7O1VBQ0EsSUFBSUQsWUFBWSxLQUFLRixhQUFyQixFQUFvQztZQUNuQztZQUNBQSxhQUFhLENBQUNJLE9BQWQ7VUFDQSxDQUhELE1BR087WUFDTjtZQUNBLElBQU1DLGNBQWMsR0FBR0wsYUFBYSxDQUFDTSxnQkFBZCxFQUF2QjtZQUNBLElBQU1DLFFBQVEsR0FBR1AsYUFBYSxDQUFDUSxVQUFkLEVBQWpCOztZQUVBLElBQUlILGNBQUosRUFBb0I7Y0FDbkJBLGNBQWMsQ0FBQ0ksa0JBQWYsQ0FBa0MsQ0FBQztnQkFBRUMsdUJBQXVCLEVBQUU7Y0FBM0IsQ0FBRCxDQUFsQyxFQUFxRUgsUUFBckU7WUFDQTtVQUNEO1FBQ0QsQ0FkRCxNQWNPO1VBQ05JLEdBQUcsQ0FBQ0MsSUFBSixrQkFBbUJmLE1BQU0sQ0FBQ2dCLEtBQVAsRUFBbkI7UUFDQTtNQUNEO0lBL0JrQixDQTVEaUM7SUE2RnJELG9CQUFvQjtNQUNuQnJELFFBQVEsRUFBRSxVQUFVc0QsTUFBVixFQUF1QjtRQUNoQyxPQUFPOUIsU0FBUyxDQUFDQyxxQkFBVixDQUFnQzZCLE1BQWhDLENBQVA7TUFDQSxDQUhrQjtNQUluQm5ELEtBQUssRUFBRSxVQUFVbUQsTUFBVixFQUF1QmxELGFBQXZCLEVBQTJDO1FBQ2pELElBQUlBLGFBQUosRUFBbUI7VUFDbEIsT0FBT29CLFNBQVMsQ0FBQ1ksa0JBQVYsQ0FBNkJrQixNQUE3QixFQUFxQ2xELGFBQXJDLENBQVA7UUFDQTtNQUNEO0lBUmtCLENBN0ZpQztJQXVHckQsNkJBQTZCO01BQzVCSixRQUFRLEVBQUUsVUFBVXVELFNBQVYsRUFBMEI7UUFDbkMsT0FBTztVQUNOQyxlQUFlLEVBQUVELFNBQVMsQ0FBQ0Usa0JBQVY7UUFEWCxDQUFQO01BR0EsQ0FMMkI7TUFNNUJ0RCxLQUFLLEVBQUUsVUFBVW9ELFNBQVYsRUFBMEJuRCxhQUExQixFQUE4QztRQUNwRCxJQUFJQSxhQUFKLEVBQW1CO1VBQ2xCbUQsU0FBUyxDQUFDRyxrQkFBVixDQUE2QnRELGFBQWEsQ0FBQ29ELGVBQTNDO1FBQ0E7TUFDRCxDQVYyQjtNQVc1QmpCLGNBQWMsRUFBRSxVQUFVZ0IsU0FBVixFQUEwQjtRQUN6QyxJQUFNSSxlQUFlLEdBQUdKLFNBQVMsQ0FBQ0ssaUJBQVYsRUFBeEI7UUFDQSxJQUFNQyxRQUFRLEdBQUdGLGVBQWUsSUFBSUEsZUFBZSxDQUFDRyxVQUFoQixFQUFwQzs7UUFDQSxJQUFJRCxRQUFKLEVBQWM7VUFDYixJQUFNRSxTQUFTLEdBQUdDLFdBQVcsQ0FBQ0MscUJBQVosQ0FBa0NOLGVBQWxDLENBQWxCO1VBQ0EsSUFBTU8sU0FBUyxHQUFHQyxlQUFlLENBQUNDLHVDQUFoQixDQUF3RGIsU0FBeEQsRUFBbUVRLFNBQW5FLENBQWxCOztVQUNBLElBQUlHLFNBQVMsS0FBSyxNQUFsQixFQUEwQjtZQUN6QjtZQUNBLElBQU1HLE1BQU0sR0FBR1YsZUFBZSxDQUFDVyxRQUFoQixFQUFmO1lBQUEsSUFDQ0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVAsRUFEZDtZQUFBLElBRUNDLHFCQUFxQixHQUNwQkMsV0FBVyxDQUFDQyx3QkFBWixDQUFxQ0osVUFBckMsRUFBaURSLFNBQWpELEVBQTREO2NBQzNEYSxLQUFLLEVBQUU7WUFEb0QsQ0FBNUQsS0FFTSxFQUxSO1lBQUEsSUFNQ0MsdUJBQXVCLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixxQkFBWixFQUFtQ08sTUFBbkMsQ0FBMEMsVUFBVUMsS0FBVixFQUF3QkMsUUFBeEIsRUFBMEM7Y0FDN0csSUFBSVQscUJBQXFCLENBQUNTLFFBQUQsQ0FBckIsQ0FBZ0NDLGFBQWhDLEtBQWtELElBQXRELEVBQTREO2dCQUMzREYsS0FBSyxDQUFDRyxJQUFOLENBQVc7a0JBQUVsQyx1QkFBdUIsRUFBRWdDO2dCQUEzQixDQUFYO2NBQ0E7O2NBQ0QsT0FBT0QsS0FBUDtZQUNBLENBTHlCLEVBS3ZCLEVBTHVCLENBTjNCO1lBQUEsSUFZQ0ksV0FBVyxHQUFHLENBQUM7Y0FBRUMsYUFBYSxFQUFFO1lBQWpCLENBQUQsQ0FaZjtZQUFBLElBYUN2QyxRQUFRLEdBQUdjLFFBQVEsQ0FBQ2IsVUFBVCxFQWJaO1lBZUFXLGVBQWUsQ0FBQ1Ysa0JBQWhCLENBQW1Db0MsV0FBVyxDQUFDRSxNQUFaLENBQW1CVix1QkFBbkIsQ0FBbkMsRUFBZ0Y5QixRQUFoRjtVQUNBLENBbEJELE1Ba0JPLElBQUltQixTQUFTLEtBQUsscUJBQWxCLEVBQXlDO1lBQy9DO1lBQ0FMLFFBQVEsQ0FBQ2pCLE9BQVQ7VUFDQTtRQUNELENBekJELE1BeUJPO1VBQ05PLEdBQUcsQ0FBQ0MsSUFBSix1QkFBd0JHLFNBQVMsQ0FBQ0YsS0FBVixFQUF4QjtRQUNBO01BQ0Q7SUExQzJCLENBdkd3QjtJQW1KckQsNENBQTRDO01BQzNDckQsUUFBUSxFQUFFLFVBQVV3RixZQUFWLEVBQTZCO1FBQ3RDLE9BQU87VUFDTnpFLFdBQVcsRUFBRXlFLFlBQVksQ0FBQ0MsY0FBYjtRQURQLENBQVA7TUFHQSxDQUwwQztNQU0zQ3RGLEtBQUssRUFBRSxVQUFVcUYsWUFBVixFQUE2QnBGLGFBQTdCLEVBQWlEO1FBQ3ZELElBQUlBLGFBQUosRUFBbUI7VUFDbEJvRixZQUFZLENBQUNFLGNBQWIsQ0FBNEJ0RixhQUFhLENBQUNXLFdBQTFDO1FBQ0E7TUFDRDtJQVYwQyxDQW5KUztJQStKckQseUJBQXlCO01BQ3hCZixRQUFRLEVBQUUsVUFBVTJGLGdCQUFWLEVBQWlDO1FBQzFDLE9BQU87VUFDTjVFLFdBQVcsRUFBRTRFLGdCQUFnQixDQUFDM0UsY0FBakI7UUFEUCxDQUFQO01BR0EsQ0FMdUI7TUFNeEJiLEtBQUssRUFBRSxVQUFVd0YsZ0JBQVYsRUFBaUN2RixhQUFqQyxFQUFxRDtRQUMzRCxJQUFJQSxhQUFKLEVBQW1CO1VBQ2xCdUYsZ0JBQWdCLENBQUNDLGNBQWpCLENBQWdDeEYsYUFBYSxDQUFDVyxXQUE5QztRQUNBO01BQ0Q7SUFWdUIsQ0EvSjRCO0lBMktyRCxnQkFBZ0I7TUFDZmYsUUFBUSxFQUFFLFVBQVU2RixPQUFWLEVBQXdCO1FBQ2pDLE9BQU87VUFDTjlFLFdBQVcsRUFBRThFLE9BQU8sQ0FBQzdFLGNBQVI7UUFEUCxDQUFQO01BR0EsQ0FMYztNQU1mYixLQUFLLEVBQUUsVUFBVTBGLE9BQVYsRUFBd0J6RixhQUF4QixFQUE0QztRQUNsRCxJQUFJQSxhQUFKLEVBQW1CO1VBQ2xCeUYsT0FBTyxDQUFDRCxjQUFSLENBQXVCeEYsYUFBYSxDQUFDVyxXQUFyQztRQUNBO01BQ0Q7SUFWYyxDQTNLcUM7SUF1THJELHFCQUFxQjtNQUNwQmYsUUFBUSxFQUFFLFVBQVU4RixZQUFWLEVBQTZCO1FBQ3RDLE9BQU87VUFDTkMsY0FBYyxFQUFFRCxZQUFZLENBQUNFLGlCQUFiO1FBRFYsQ0FBUDtNQUdBLENBTG1CO01BTXBCN0YsS0FBSyxFQUFFLFVBQVUyRixZQUFWLEVBQTZCMUYsYUFBN0IsRUFBaUQ7UUFDdkQsSUFBSUEsYUFBSixFQUFtQjtVQUNsQjBGLFlBQVksQ0FBQ0csaUJBQWIsQ0FBK0I3RixhQUFhLENBQUMyRixjQUE3QztRQUNBO01BQ0Q7SUFWbUIsQ0F2TGdDO0lBbU1yRCx3QkFBd0I7TUFDdkIvRixRQUFRLEVBQUUsVUFBVWtHLEtBQVYsRUFBc0I7UUFDL0IsSUFBTUMsV0FBVyxHQUFHRCxLQUFLLENBQUNFLGFBQU4sRUFBcEI7O1FBQ0EsSUFBSUQsV0FBVyxJQUFJQSxXQUFXLENBQUNFLFNBQS9CLEVBQTBDO1VBQ3pDLE9BQU9GLFdBQVcsQ0FBQ0UsU0FBWixDQUFzQkMsaUJBQXRCLENBQXdDSCxXQUFXLENBQUNFLFNBQXBELENBQVA7UUFDQTs7UUFDRCxPQUFPLEVBQVA7TUFDQSxDQVBzQjtNQVF2QmxHLEtBQUssRUFBRSxVQUFVK0YsS0FBVixFQUFzQjlGLGFBQXRCLEVBQTBDbUcsY0FBMUMsRUFBK0Q7UUFDckUsSUFBTUosV0FBVyxHQUFHRCxLQUFLLENBQUNFLGFBQU4sRUFBcEI7O1FBQ0EsSUFBSUQsV0FBVyxJQUFJQSxXQUFXLENBQUNFLFNBQS9CLEVBQTBDO1VBQ3pDLE9BQU9GLFdBQVcsQ0FBQ0UsU0FBWixDQUFzQkcsY0FBdEIsQ0FBcUNwRyxhQUFyQyxFQUFvRG1HLGNBQXBELENBQVA7UUFDQTtNQUNELENBYnNCO01BY3ZCaEUsY0FBYyxFQUFFLFVBQVUyRCxLQUFWLEVBQXNCO1FBQ3JDLElBQU1DLFdBQVcsR0FBR0QsS0FBSyxDQUFDRSxhQUFOLEVBQXBCOztRQUNBLElBQUlELFdBQVcsSUFBSUEsV0FBVyxDQUFDRSxTQUEvQixFQUEwQztVQUN6QyxPQUFPRixXQUFXLENBQUNFLFNBQVosQ0FBc0JJLG1CQUF0QixFQUFQO1FBQ0E7TUFDRDtJQW5Cc0IsQ0FuTTZCO0lBd05yRCxrQ0FBa0M7TUFDakN6RyxRQUFRLEVBQUUsVUFBVTBHLG1CQUFWLEVBQW9DO1FBQzdDLElBQU1DLFVBQVUsR0FBR0QsbUJBQW1CLENBQUNFLG9CQUFwQixFQUFuQjs7UUFDQSxJQUFJRCxVQUFKLEVBQWdCO1VBQ2YsT0FBTyxLQUFLRSxvQkFBTCxDQUEwQkYsVUFBVSxDQUFDRyxjQUFYLEVBQTFCLENBQVA7UUFDQTs7UUFDRCxPQUFPLEVBQVA7TUFDQSxDQVBnQztNQVFqQzNHLEtBQUssRUFBRSxVQUFVdUcsbUJBQVYsRUFBb0N0RyxhQUFwQyxFQUF3RG1HLGNBQXhELEVBQTZFO1FBQ25GLElBQU1JLFVBQVUsR0FBR0QsbUJBQW1CLENBQUNFLG9CQUFwQixFQUFuQjs7UUFDQSxJQUFJRCxVQUFKLEVBQWdCO1VBQ2YsT0FBTyxLQUFLSSxpQkFBTCxDQUF1QkosVUFBVSxDQUFDRyxjQUFYLEVBQXZCLEVBQW9EMUcsYUFBcEQsRUFBbUVtRyxjQUFuRSxDQUFQO1FBQ0E7TUFDRDtJQWJnQztFQXhObUIsQ0FBdEQ7RUF3T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztNQUVNUyxTLFdBRExDLGNBQWMsQ0FBQyw0Q0FBRCxDLFVBa0JiQyxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBdUJkRCxlQUFlLEUsVUFDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxVQU1WQyxnQkFBZ0IsRSxVQUNoQkosY0FBYyxFLFVBbUJkSSxnQkFBZ0IsRSxVQUNoQkosY0FBYyxFLFdBNEJkRCxlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQVlWSixlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQVdWSixlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQXFCVkMsZ0JBQWdCLEUsV0FDaEJKLGNBQWMsRSxXQW1CZEQsZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0FZVkMsZ0JBQWdCLEUsV0FDaEJKLGNBQWMsRSxXQTJCZEQsZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0FZVkosZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWFkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBZ0RkRCxlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQXVCVkMsZ0JBQWdCLEUsV0FDaEJKLGNBQWMsRSxXQStCZEQsZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNHLE9BQW5CLEMsV0FpQlZOLGVBQWUsRSxXQUNmQyxjQUFjLEUsV0ErQ2RJLGdCQUFnQixFLFdBaUNoQkwsZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0FnQlZKLGVBQWUsRSxXQUNmRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBaUJWSixlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQXFCVkosZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0F1QlZDLGdCQUFnQixFLFdBQ2hCSixjQUFjLEU7OztJQWhnQmY7QUFDRDtBQUNBO0lBQ0MscUJBQWM7TUFBQTs7TUFDYjtNQUNBLE1BQUtNLHdCQUFMLEdBQWdDLENBQWhDO01BQ0EsTUFBS0MscUJBQUwsR0FBNkIsSUFBSUMsT0FBSixDQUFZLFVBQUNDLE9BQUQsRUFBYTtRQUNyRCxNQUFLQyw0QkFBTCxHQUFvQ0QsT0FBcEM7TUFDQSxDQUY0QixDQUE3QjtNQUhhO0lBTWI7Ozs7V0FJS25CLG1CO1VBQXNCO1FBQUEsYUFDSCxJQURHOztRQUFBLHVCQUNILE9BQUtxQixjQUFMLENBQW9CLE9BQUtDLElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0IyQiwyQkFBeEMsQ0FERyxpQkFDckJDLFNBRHFCO1VBRTNCLElBQUlDLGFBQWEsR0FBR1AsT0FBTyxDQUFDQyxPQUFSLEVBQXBCO1VBQ0FLLFNBQVMsQ0FDUG5HLE1BREYsQ0FDUyxVQUFDcUcsUUFBRCxFQUFtQjtZQUMxQixPQUFPQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ0MsR0FBckIsSUFBNEJELFFBQVEsQ0FBQ0MsR0FBVCxDQUFhLDJCQUFiLENBQW5DO1VBQ0EsQ0FIRixFQUlFakcsT0FKRixDQUlVLFVBQUNnRyxRQUFELEVBQW1CO1lBQzNCRCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ3pJLElBQWQsQ0FBbUIsT0FBSzRJLHFCQUFMLENBQTJCM0ksSUFBM0IsU0FBc0N5SSxRQUF0QyxDQUFuQixDQUFoQjtVQUNBLENBTkY7VUFPQSxPQUFPRCxhQUFQO1FBVjJCO01BVzNCLEM7Ozs7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7SUFDQUYsMkIsR0FIQSxxQ0FHNEJNLGtCQUg1QixFQUdpRSxDQUNoRTtJQUNBLEM7O1dBSURELHFCLEdBRkEsK0JBRXNCRixRQUZ0QixFQUVxQztNQUNwQyxJQUFNSSw2QkFBNkIsR0FBRyxLQUFLQywrQkFBTCxDQUFxQ0wsUUFBckMsQ0FBdEM7TUFDQSxJQUFJRCxhQUFhLEdBQUdQLE9BQU8sQ0FBQ0MsT0FBUixFQUFwQjs7TUFDQSxJQUFJLE9BQU9XLDZCQUE2QixDQUFDaEcsY0FBckMsS0FBd0QsVUFBNUQsRUFBd0U7UUFDdkVZLEdBQUcsQ0FBQ0MsSUFBSiwrQ0FBZ0QrRSxRQUFRLENBQUNNLFdBQVQsR0FBdUJDLE9BQXZCLEVBQWhEO01BQ0EsQ0FGRCxNQUVPO1FBQ05SLGFBQWEsR0FBR0EsYUFBYSxDQUFDekksSUFBZCxDQUFtQjhJLDZCQUE2QixDQUFDaEcsY0FBOUIsQ0FBNkM3QyxJQUE3QyxDQUFrRCxJQUFsRCxFQUF3RHlJLFFBQXhELENBQW5CLENBQWhCO01BQ0E7O01BQ0QsT0FBT0QsYUFBUDtJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FJQ00sK0IsR0FGQSx5Q0FFZ0NMLFFBRmhDLEVBRW9EO01BQ25ELElBQU1RLHNCQUEyQixHQUFHLEVBQXBDOztNQUNBLElBQUlSLFFBQUosRUFBYztRQUNiLEtBQUssSUFBTVMsS0FBWCxJQUFvQjdJLHdCQUFwQixFQUE4QztVQUM3QyxJQUFJb0ksUUFBUSxDQUFDQyxHQUFULENBQWFRLEtBQWIsQ0FBSixFQUF5QjtZQUN4QjtZQUNBO1lBQ0E7WUFDQUQsc0JBQXNCLENBQUMsZ0JBQUQsQ0FBdEIsR0FBMkM1SSx3QkFBd0IsQ0FBQzZJLEtBQUQsQ0FBeEIsQ0FBZ0NyRyxjQUFoQyxJQUFrRCxFQUE3RjtZQUNBO1VBQ0E7UUFDRDtNQUNEOztNQUNELEtBQUt3RixJQUFMLENBQVUxQixTQUFWLENBQW9Cd0MsMEJBQXBCLENBQStDVixRQUEvQyxFQUF5RFEsc0JBQXpEO01BQ0EsT0FBT0Esc0JBQVA7SUFDQTtJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0lBQ0FFLDBCLEdBSEEsb0NBRzJCVixRQUgzQixFQUdvRFcsZUFIcEQsRUFHNEUsQ0FDM0U7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0NDLFMsR0FGQSxxQkFFWSxDQUNYO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdDQyxTLEdBRkEscUJBRVksQ0FDWDtJQUNBO0lBRUQ7QUFDRDtBQUNBOzs7V0FDQ0MsTyxHQUFBLG1CQUFVO01BQ1QsT0FBTyxLQUFLcEIsNEJBQVo7O01BQ0EsK0JBQU1vQixPQUFOO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ25CLGMsR0FGQSx3QkFFZW9CLE1BRmYsRUFFaUQ7TUFDaEQsSUFBTUMsUUFBZSxHQUFHLEVBQXhCOztNQURnRCxrQ0FBYkMsSUFBYTtRQUFiQSxJQUFhO01BQUE7O01BRWhEQSxJQUFJLENBQUNoRSxJQUFMLENBQVUrRCxRQUFWO01BQ0FELE1BQU0sQ0FBQy9JLEtBQVAsQ0FBYSxJQUFiLEVBQW1CaUosSUFBbkI7TUFDQSxPQUFPekIsT0FBTyxDQUFDMEIsR0FBUixDQUFZRixRQUFaLENBQVA7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0lBQ0FHLHdCLEdBSEEsa0NBR3lCbkIsUUFIekIsRUFHa0RvQixlQUhsRCxFQUc2RSxDQUM1RTtJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ0Msc0IsR0FGQSxnQ0FFdUJyQixRQUZ2QixFQUVzQztNQUNyQyxJQUFNc0IsNEJBQTRCLEdBQUcsRUFBckM7TUFBQSxJQUNDQywwQkFBaUMsR0FBRyxFQURyQzs7TUFFQSxJQUFJdkIsUUFBSixFQUFjO1FBQ2IsS0FBSyxJQUFNUyxLQUFYLElBQW9CN0ksd0JBQXBCLEVBQThDO1VBQzdDLElBQUlvSSxRQUFRLENBQUNDLEdBQVQsQ0FBYVEsS0FBYixDQUFKLEVBQXlCO1lBQ3hCO1lBQ0FhLDRCQUE0QixDQUFDckUsSUFBN0IsQ0FBa0NOLE1BQU0sQ0FBQzZFLE1BQVAsQ0FBYyxFQUFkLEVBQWtCNUosd0JBQXdCLENBQUM2SSxLQUFELENBQTFDLENBQWxDO1lBQ0E7VUFDQTtRQUNEO01BQ0Q7O01BQ0QsS0FBS2IsSUFBTCxDQUFVMUIsU0FBVixDQUFvQmlELHdCQUFwQixDQUE2Q25CLFFBQTdDLEVBQXVEdUIsMEJBQXZEO01BQ0EsT0FBT0QsNEJBQTRCLENBQUNsRSxNQUE3QixDQUFvQ21FLDBCQUFwQyxDQUFQO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7SUFDQUUsa0IsR0FIQSw0QkFHbUJ0QixrQkFIbkIsRUFHd0QsQ0FDdkQ7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0N1QixXLEdBRkEscUJBRVkxQixRQUZaLEVBRTJCO01BQzFCLE9BQU8sS0FBSzJCLE9BQUwsR0FBZUMsVUFBZixDQUEwQjVCLFFBQVEsQ0FBQzlFLEtBQVQsRUFBMUIsS0FBK0M4RSxRQUFRLENBQUM5RSxLQUFULEVBQXREO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHT2lELGlCO1VBQW9CO1FBQUEsYUFDdkIsSUFEdUI7O1FBQUE7VUFrQ3pCLE9BQU8sT0FBS21CLHdCQUFMLEtBQWtDLENBQWxDLEdBQXNDdUMsVUFBdEMsR0FBbUQxSixTQUExRDtRQWxDeUI7O1FBQ3pCLEVBQUUsT0FBS21ILHdCQUFQO1FBQ0EsSUFBSXVDLFVBQUo7O1FBRnlCLDBDQUlyQjtVQUFBLHVCQUNHLE9BQUt0QyxxQkFEUjtZQUFBLHVCQUVxQixPQUFLSSxjQUFMLENBQW9CLE9BQUtDLElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0J1RCxrQkFBeEMsQ0FGckIsaUJBRUczQixTQUZIO2NBQUEsdUJBRzJCTixPQUFPLENBQUMwQixHQUFSLENBQzdCcEIsU0FBUyxDQUNQbkcsTUFERixDQUNTLFVBQVVxRyxRQUFWLEVBQXlCO2dCQUNoQyxPQUFPQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ0MsR0FBckIsSUFBNEJELFFBQVEsQ0FBQ0MsR0FBVCxDQUFhLDJCQUFiLENBQW5DO2NBQ0EsQ0FIRixFQUlFNkIsR0FKRixDQUlNLFVBQUM5QixRQUFELEVBQW1CO2dCQUN2QixPQUFPLE9BQUt0QixvQkFBTCxDQUEwQnNCLFFBQTFCLEVBQW9DMUksSUFBcEMsQ0FBeUMsVUFBQ3lLLE9BQUQsRUFBa0I7a0JBQ2pFLE9BQU87b0JBQ05DLEdBQUcsRUFBRSxPQUFLTixXQUFMLENBQWlCMUIsUUFBakIsQ0FEQztvQkFFTmlDLEtBQUssRUFBRUY7a0JBRkQsQ0FBUDtnQkFJQSxDQUxNLENBQVA7Y0FNQSxDQVhGLENBRDZCLENBSDNCLGlCQUdHRyxlQUhIO2dCQWlCSEwsVUFBVSxHQUFHSyxlQUFlLENBQUNyRixNQUFoQixDQUF1QixVQUFVc0YsT0FBVixFQUF3QkMsTUFBeEIsRUFBcUM7a0JBQ3hFLElBQU1DLGFBQWtCLEdBQUcsRUFBM0I7a0JBQ0FBLGFBQWEsQ0FBQ0QsTUFBTSxDQUFDSixHQUFSLENBQWIsR0FBNEJJLE1BQU0sQ0FBQ0gsS0FBbkM7a0JBQ0EsT0FBT0ssWUFBWSxDQUFDSCxPQUFELEVBQVVFLGFBQVYsQ0FBbkI7Z0JBQ0EsQ0FKWSxFQUlWLEVBSlUsQ0FBYjtnQkFqQkcsdUJBc0I2QjdDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixPQUFLOEMseUJBQUwsRUFBaEIsQ0F0QjdCLGlCQXNCR0MsaUJBdEJIO2tCQUFBLElBdUJDQSxpQkFBaUIsSUFBSTdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZNEYsaUJBQVosRUFBK0J6SSxNQXZCckQ7b0JBd0JGOEgsVUFBVSxDQUFDcEsscUJBQUQsQ0FBVixHQUFvQytLLGlCQUFwQztrQkF4QkU7Z0JBQUE7Y0FBQTtZQUFBO1VBQUE7UUEwQkgsQ0E5QndCO1VBK0J4QixFQUFFLE9BQUtsRCx3QkFBUDtVQS9Cd0I7VUFBQTtRQUFBOztRQUFBO01BbUN6QixDOzs7O0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0lBQ0FtRCx3QixHQUhBLGtDQUd5QkQsaUJBSHpCLEVBR29ELENBQ25EO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0QseUIsR0FBQSxxQ0FBNEI7TUFDM0IsSUFBTUMsaUJBQWlCLEdBQUcsRUFBMUI7TUFDQSxLQUFLNUMsSUFBTCxDQUFVMUIsU0FBVixDQUFvQnVFLHdCQUFwQixDQUE2Q0QsaUJBQTdDO01BQ0EsT0FBT0EsaUJBQVA7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0M5RCxvQixHQUZBLDhCQUVxQnNCLFFBRnJCLEVBRW9DO01BQUE7O01BQ25DLElBQU0wQyxxQkFBcUIsR0FBRyxLQUFLckIsc0JBQUwsQ0FBNEJyQixRQUE1QixDQUE5QjtNQUNBLE9BQU9SLE9BQU8sQ0FBQzBCLEdBQVIsQ0FDTndCLHFCQUFxQixDQUFDWixHQUF0QixDQUEwQixVQUFDYSxvQkFBRCxFQUErQjtRQUN4RCxJQUFJLE9BQU9BLG9CQUFvQixDQUFDOUssUUFBNUIsS0FBeUMsVUFBN0MsRUFBeUQ7VUFDeEQsTUFBTSxJQUFJK0ssS0FBSix1RUFBeUU1QyxRQUFRLENBQUNNLFdBQVQsR0FBdUJDLE9BQXZCLEVBQXpFLEVBQU47UUFDQTs7UUFDRCxPQUFPb0Msb0JBQW9CLENBQUM5SyxRQUFyQixDQUE4QmdMLElBQTlCLENBQW1DLE1BQW5DLEVBQXlDN0MsUUFBekMsQ0FBUDtNQUNBLENBTEQsQ0FETSxFQU9MMUksSUFQSyxDQU9BLFVBQUN3TCxPQUFELEVBQW9CO1FBQzFCLE9BQU9BLE9BQU8sQ0FBQ2pHLE1BQVIsQ0FBZSxVQUFVa0csV0FBVixFQUE0QlYsYUFBNUIsRUFBZ0Q7VUFDckUsT0FBT0MsWUFBWSxDQUFDUyxXQUFELEVBQWNWLGFBQWQsQ0FBbkI7UUFDQSxDQUZNLEVBRUosRUFGSSxDQUFQO01BR0EsQ0FYTSxDQUFQO0lBWUE7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ1cscUIsR0FGQSxpQ0FFd0I7TUFDdkIsT0FBTyxJQUFQO0lBQ0E7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR08zRSxjLDJCQUNMd0QsVSxFQUNBb0IsYTtVQU1lO1FBQUEsYUFDWCxJQURXOztRQUNmLElBQUksT0FBS3JELElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0I4RSxxQkFBcEIsTUFBK0MsT0FBS0UsdUJBQUwsRUFBbkQsRUFBbUY7VUFDbEY7UUFDQTs7UUFIYywwQ0FLWDtVQUFBLHVCQUNHLE9BQUt2RCxjQUFMLENBQW9CLE9BQUtDLElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0JpRixvQkFBeEMsQ0FESDtZQUFBLHVCQUVxQixPQUFLeEQsY0FBTCxDQUFvQixPQUFLQyxJQUFMLENBQVUxQixTQUFWLENBQW9CdUQsa0JBQXhDLENBRnJCLGlCQUVHM0IsU0FGSDtjQUdILElBQUlDLGFBQWEsR0FBR1AsT0FBTyxDQUFDQyxPQUFSLEVBQXBCO2NBQ0FLLFNBQVMsQ0FDUG5HLE1BREYsQ0FDUyxVQUFVcUcsUUFBVixFQUF5QjtnQkFDaEMsT0FBT0EsUUFBUSxJQUFJQSxRQUFRLENBQUNDLEdBQXJCLElBQTRCRCxRQUFRLENBQUNDLEdBQVQsQ0FBYSwyQkFBYixDQUFuQztjQUNBLENBSEYsRUFJRWpHLE9BSkYsQ0FJVSxVQUFDZ0csUUFBRCxFQUFtQjtnQkFDM0IsSUFBTW9ELElBQUksR0FBRyxPQUFLMUIsV0FBTCxDQUFpQjFCLFFBQWpCLENBQWI7O2dCQUNBRCxhQUFhLEdBQUdBLGFBQWEsQ0FBQ3pJLElBQWQsQ0FDZixPQUFLc0gsaUJBQUwsQ0FBdUJySCxJQUF2QixTQUFrQ3lJLFFBQWxDLEVBQTRDNkIsVUFBVSxHQUFHQSxVQUFVLENBQUN1QixJQUFELENBQWIsR0FBc0JqTCxTQUE1RSxFQUF1RjhLLGFBQXZGLENBRGUsQ0FBaEI7Y0FHQSxDQVRGO2NBSkcsdUJBY0dsRCxhQWRIO2dCQUFBO2tCQUFBLElBZUNrRCxhQUFhLENBQUNJLGNBQWQsS0FBaUMzTCxPQUFPLENBQUM0TCxTQWYxQztvQkFBQSx1QkFnQkksT0FBSzNELGNBQUwsQ0FDTCxPQUFLQyxJQUFMLENBQVUxQixTQUFWLENBQW9CcUYscUJBRGYsRUFFTDFCLFVBQVUsR0FBR0EsVUFBVSxDQUFDcEsscUJBQUQsQ0FBYixHQUF1Q1UsU0FGNUMsQ0FoQko7a0JBQUE7b0JBQUEsdUJBcUJJLE9BQUt3SCxjQUFMLENBQW9CLE9BQUtDLElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0JzRix5QkFBeEMsRUFBbUVQLGFBQW5FLENBckJKO2tCQUFBO2dCQUFBOztnQkFBQTtjQUFBO1lBQUE7VUFBQTtRQXVCSCxDQTVCYztVQUFBO1lBQUE7WUFBQTtVQUFBOztVQUFBLGdDQTZCVjtZQUFBLHVCQUNHLE9BQUt0RCxjQUFMLENBQW9CLE9BQUtDLElBQUwsQ0FBVTFCLFNBQVYsQ0FBb0J1RixtQkFBeEMsQ0FESDtjQUVILE9BQUtDLHVCQUFMO1lBRkc7VUFHSCxDQWhDYSxZQWdDTHJNLENBaENLLEVBZ0NHO1lBQ2hCMkQsR0FBRyxDQUFDMkksS0FBSixDQUFVdE0sQ0FBVjtVQUNBLENBbENhOztVQUFBO1FBQUE7O1FBQUE7TUFvQ2YsQzs7Ozs7V0FHRGdCLDRCLEdBREEsc0NBQzZCUCxHQUQ3QixFQUN1QzhMLFVBRHZDLEVBQ3dEO01BQ3ZELElBQU1DLFNBQVMsR0FBRy9MLEdBQUcsQ0FBQ2dNLFdBQUosRUFBbEI7TUFDQSxJQUFJQywrQkFBK0IsR0FBRyxLQUF0QztNQUNBRixTQUFTLENBQUM3SixPQUFWLENBQWtCLFVBQVVnSyxRQUFWLEVBQXlCO1FBQzFDLElBQUlBLFFBQVEsQ0FBQ2hDLEdBQVQsS0FBaUI0QixVQUFyQixFQUFpQztVQUNoQ0csK0JBQStCLEdBQUcsSUFBbEM7UUFDQTtNQUNELENBSkQ7TUFLQSxPQUFPQSwrQkFBUDtJQUNBLEM7O1dBRURMLHVCLEdBQUEsbUNBQTBCO01BQ3pCLElBQUksS0FBS2hFLDRCQUFULEVBQXVDO1FBQ3RDLElBQU11RSwyQkFBMkIsR0FBRyxLQUFLdkUsNEJBQXpDO1FBQ0EsT0FBTyxLQUFLQSw0QkFBWjtRQUNBdUUsMkJBQTJCO01BQzNCO0lBQ0QsQzs7V0FDRGYsdUIsR0FBQSxtQ0FBMEI7TUFDekIsT0FBTyxDQUFDLEtBQUt4RCw0QkFBYjtJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0lBQ0F5RCxvQixHQUhBLDhCQUdxQmUsU0FIckIsRUFHOEMsQ0FDN0M7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7WUFHQztJQUNBVCxtQixHQUhBLDZCQUdvQlMsU0FIcEIsRUFHNkMsQ0FDNUM7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0lBQ0FYLHFCLEdBSEEsK0JBR3NCMUIsVUFIdEIsRUFHMENxQyxTQUgxQyxFQUdtRSxDQUNsRTtJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ1YseUIsR0FGQSxvQ0FHQztJQUNBUCxhQUpELEVBVUM7SUFDQWlCLFNBWEQsRUFZRSxDQUNEO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ3RGLGlCLEdBRkEsMkJBRWtCb0IsUUFGbEIsRUFFaUMvSCxhQUZqQyxFQUV3RG1HLGNBRnhELEVBRWlGO01BQUE7O01BQ2hGLElBQU1zRSxxQkFBcUIsR0FBRyxLQUFLckIsc0JBQUwsQ0FBNEJyQixRQUE1QixDQUE5QjtNQUNBLElBQUlELGFBQWEsR0FBR1AsT0FBTyxDQUFDQyxPQUFSLEVBQXBCO01BQ0FpRCxxQkFBcUIsQ0FBQzFJLE9BQXRCLENBQThCLFVBQUMySSxvQkFBRCxFQUErQjtRQUM1RCxJQUFJLE9BQU9BLG9CQUFvQixDQUFDM0ssS0FBNUIsS0FBc0MsVUFBMUMsRUFBc0Q7VUFDckQsTUFBTSxJQUFJNEssS0FBSixvRUFBc0U1QyxRQUFRLENBQUNNLFdBQVQsR0FBdUJDLE9BQXZCLEVBQXRFLEVBQU47UUFDQTs7UUFDRFIsYUFBYSxHQUFHQSxhQUFhLENBQUN6SSxJQUFkLENBQW1CcUwsb0JBQW9CLENBQUMzSyxLQUFyQixDQUEyQlQsSUFBM0IsQ0FBZ0MsTUFBaEMsRUFBc0N5SSxRQUF0QyxFQUFnRC9ILGFBQWhELEVBQStEbUcsY0FBL0QsQ0FBbkIsQ0FBaEI7TUFDQSxDQUxEO01BTUEsT0FBTzJCLGFBQVA7SUFDQSxDOztXQUNEb0UsWSxHQUFBLHdCQUFlO01BQ2QsT0FBTyxJQUFQO0lBQ0EsQzs7O0lBcGhCc0JDLG1CO1NBdWhCVHZGLFMifQ==