@magic-xpa/engine 4.1100.0-dev4110.19 → 4.1100.0-dev4110.190

Sign up to get free protection for your applications and to get access to all the features.
Files changed (515) hide show
  1. package/{esm2020 → esm2022}/index.mjs +188 -188
  2. package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
  3. package/esm2022/src/AccessHelper.mjs +15 -0
  4. package/esm2022/src/ClientManager.mjs +399 -0
  5. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  6. package/esm2022/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2022/src/CommandsTable.mjs +162 -0
  8. package/esm2022/src/ConstInterface.mjs +516 -0
  9. package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
  10. package/esm2022/src/FlowMonitorInterface.mjs +16 -0
  11. package/esm2022/src/GUIManager.mjs +62 -0
  12. package/esm2022/src/GlobalCommandsManager.mjs +34 -0
  13. package/esm2022/src/GuiEventsProcessor.mjs +154 -0
  14. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  15. package/esm2022/src/ServerConfig.mjs +118 -0
  16. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  17. package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
  18. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
  19. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
  20. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
  21. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
  22. package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
  23. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  24. package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
  26. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
  27. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  28. package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
  29. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
  31. package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
  32. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  33. package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
  34. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
  35. package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
  38. package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
  39. package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
  40. package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
  41. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  44. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
  49. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  50. package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
  51. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
  53. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
  54. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
  56. package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
  57. package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
  58. package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
  59. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  61. package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  64. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
  65. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  67. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
  68. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
  69. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
  70. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  72. package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
  73. package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
  74. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
  75. package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
  76. package/esm2022/src/data/DataView.mjs +1613 -0
  77. package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
  78. package/esm2022/src/data/DataviewManager.mjs +28 -0
  79. package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
  80. package/esm2022/src/data/DvCache.mjs +67 -0
  81. package/esm2022/src/data/Field.mjs +646 -0
  82. package/esm2022/src/data/FieldBase.mjs +15 -0
  83. package/esm2022/src/data/FieldsTable.mjs +103 -0
  84. package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
  85. package/esm2022/src/data/Key.mjs +88 -0
  86. package/esm2022/src/data/Record.mjs +866 -0
  87. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  88. package/esm2022/src/data/RecordsTable.mjs +267 -0
  89. package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/{esm2020 → esm2022}/src/enums.mjs +23 -23
  92. package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2022/src/env/Environment.mjs +487 -0
  94. package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
  95. package/esm2022/src/env/LanguageData.mjs +226 -0
  96. package/esm2022/src/env/MirrorString.mjs +65 -0
  97. package/esm2022/src/event/ActionManager.mjs +91 -0
  98. package/esm2022/src/event/Event.mjs +1333 -0
  99. package/esm2022/src/event/EventHandler.mjs +766 -0
  100. package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
  101. package/esm2022/src/event/EventsManager.mjs +2975 -0
  102. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  103. package/esm2022/src/event/RunTimeEvent.mjs +392 -0
  104. package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
  105. package/esm2022/src/event/UserEventsTable.mjs +47 -0
  106. package/esm2022/src/exp/ExpTable.mjs +57 -0
  107. package/esm2022/src/exp/Expression.mjs +200 -0
  108. package/esm2022/src/exp/ExpressionDict.mjs +727 -0
  109. package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
  110. package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2022/src/exp/YesNoExp.mjs +36 -0
  113. package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
  114. package/esm2022/src/gui/FormsTable.mjs +66 -0
  115. package/esm2022/src/gui/MgControl.mjs +363 -0
  116. package/esm2022/src/gui/MgForm.mjs +1181 -0
  117. package/esm2022/src/http/HttpManager.mjs +97 -0
  118. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  119. package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
  120. package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
  121. package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
  122. package/esm2022/src/http/client/HttpUtility.mjs +84 -0
  123. package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
  124. package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
  128. package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
  131. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
  132. package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
  133. package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
  134. package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  136. package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2022/src/remote/ServerError.mjs +40 -0
  138. package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
  139. package/esm2022/src/rt/Argument.mjs +265 -0
  140. package/esm2022/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2022/src/rt/Boundary.mjs +152 -0
  142. package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
  143. package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
  144. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  145. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  146. package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
  147. package/esm2022/src/rt/ExecutionStack.mjs +94 -0
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  149. package/esm2022/src/rt/HandlersTable.mjs +96 -0
  150. package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
  151. package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
  152. package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
  153. package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
  154. package/esm2022/src/rt/Operation.mjs +735 -0
  155. package/esm2022/src/rt/OperationTable.mjs +67 -0
  156. package/esm2022/src/rt/Recompute.mjs +355 -0
  157. package/esm2022/src/rt/RecomputeTable.mjs +63 -0
  158. package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
  159. package/esm2022/src/rt/ResultValue.mjs +10 -0
  160. package/esm2022/src/rt/TableCache.mjs +177 -0
  161. package/esm2022/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2022/src/rt/Transaction.mjs +53 -0
  163. package/esm2022/src/security/UserDetails.mjs +71 -0
  164. package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
  165. package/esm2022/src/tasks/MGData.mjs +552 -0
  166. package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
  167. package/esm2022/src/tasks/RCTimer.mjs +63 -0
  168. package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
  169. package/esm2022/src/tasks/Task.mjs +2497 -0
  170. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  171. package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
  172. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  174. package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
  175. package/esm2022/src/util/ConstUtils.mjs +14 -0
  176. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  177. package/esm2022/src/util/HeapSort.mjs +70 -0
  178. package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
  179. package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
  180. package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
  181. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
  182. package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
  183. package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
  184. package/esm2022/src/util/PrmMap.mjs +152 -0
  185. package/esm2022/src/util/ReturnResult.mjs +46 -0
  186. package/esm2022/src/util/ReturnResultBase.mjs +18 -0
  187. package/esm2022/src/util/Scrambler.mjs +89 -0
  188. package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
  189. package/esm2022/src/util/cookie.service.mjs +92 -0
  190. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29713 -29693
  191. package/fesm2022/magic-xpa-engine.mjs.map +1 -0
  192. package/index.d.ts +187 -187
  193. package/package.json +8 -14
  194. package/src/AccessHelper.d.ts +20 -20
  195. package/src/ClientManager.d.ts +32 -32
  196. package/src/CommandsProcessorBase.d.ts +23 -23
  197. package/src/CommandsProcessorManager.d.ts +6 -6
  198. package/src/CommandsTable.d.ts +22 -22
  199. package/src/ConstInterface.d.ts +515 -515
  200. package/src/CurrentClientVersion.d.ts +1 -1
  201. package/src/FlowMonitorInterface.d.ts +15 -15
  202. package/src/GUIManager.d.ts +17 -17
  203. package/src/GlobalCommandsManager.d.ts +17 -17
  204. package/src/GuiEventsProcessor.d.ts +24 -24
  205. package/src/ICommandsTable.d.ts +9 -9
  206. package/src/ServerConfig.d.ts +34 -34
  207. package/src/bridge/IGuiEvent.d.ts +19 -19
  208. package/src/bridge/MagicBridge.d.ts +16 -16
  209. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
  210. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
  211. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
  212. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
  213. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
  214. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
  215. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
  216. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
  217. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
  218. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
  219. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
  220. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
  221. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
  222. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
  223. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
  224. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
  225. package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
  226. package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
  227. package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
  228. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
  229. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
  230. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
  231. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
  232. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
  233. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
  234. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  235. package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
  236. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
  237. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
  238. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
  239. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
  240. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  241. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
  242. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
  243. package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
  244. package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
  245. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
  246. package/src/commands/DataViewCommandBase.d.ts +6 -6
  247. package/src/commands/IClientCommand.d.ts +2 -2
  248. package/src/commands/IClientTargetedCommand.d.ts +12 -12
  249. package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
  250. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
  251. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
  252. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
  253. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
  254. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
  255. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
  256. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
  257. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
  258. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
  259. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
  260. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
  261. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
  262. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
  263. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
  264. package/src/communications/IConnectionStateManager.d.ts +4 -4
  265. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
  266. package/src/data/DataSourceIdKey.d.ts +2 -2
  267. package/src/data/DataView.d.ts +162 -162
  268. package/src/data/DataViewBase.d.ts +12 -12
  269. package/src/data/DataviewManager.d.ts +14 -14
  270. package/src/data/DataviewManagerBase.d.ts +11 -11
  271. package/src/data/DvCache.d.ts +15 -15
  272. package/src/data/Field.d.ts +103 -103
  273. package/src/data/FieldBase.d.ts +23 -23
  274. package/src/data/FieldsTable.d.ts +27 -27
  275. package/src/data/IRecordsTable.d.ts +7 -7
  276. package/src/data/Key.d.ts +15 -15
  277. package/src/data/Record.d.ts +156 -156
  278. package/src/data/RecordOutOfDataViewException.d.ts +10 -10
  279. package/src/data/RecordsTable.d.ts +38 -38
  280. package/src/data/TaskTransactionManager.d.ts +17 -17
  281. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
  282. package/src/enums.d.ts +21 -21
  283. package/src/env/EnvVariablesTable.d.ts +17 -17
  284. package/src/env/Environment.d.ts +118 -118
  285. package/src/env/ILanguageData.d.ts +3 -3
  286. package/src/env/LanguageData.d.ts +20 -20
  287. package/src/env/MirrorString.d.ts +15 -15
  288. package/src/event/ActionManager.d.ts +14 -14
  289. package/src/event/Event.d.ts +79 -79
  290. package/src/event/EventHandler.d.ts +66 -66
  291. package/src/event/EventHandlerPosition.d.ts +25 -25
  292. package/src/event/EventsManager.d.ts +204 -204
  293. package/src/event/IEventsManager.d.ts +77 -77
  294. package/src/event/RunTimeEvent.d.ts +123 -123
  295. package/src/event/RunTimeEventBase.d.ts +5 -5
  296. package/src/event/UserEventsTable.d.ts +11 -11
  297. package/src/exp/ExpTable.d.ts +11 -11
  298. package/src/exp/Expression.d.ts +37 -37
  299. package/src/exp/ExpressionDict.d.ts +12 -12
  300. package/src/exp/ExpressionEvaluator.d.ts +198 -198
  301. package/src/exp/ExpressionLocalJpn.d.ts +18 -18
  302. package/src/exp/GlobalParamsTable.d.ts +19 -19
  303. package/src/exp/YesNoExp.d.ts +9 -9
  304. package/src/gui/CreatedFormVector.d.ts +10 -10
  305. package/src/gui/FormsTable.d.ts +15 -15
  306. package/src/gui/MgControl.d.ts +60 -60
  307. package/src/gui/MgForm.d.ts +93 -93
  308. package/src/http/HttpManager.d.ts +25 -25
  309. package/src/http/client/HttpClientAsync.d.ts +16 -16
  310. package/src/http/client/HttpClientBase.d.ts +30 -30
  311. package/src/http/client/HttpClientEvents.d.ts +18 -18
  312. package/src/http/client/HttpClientSync.d.ts +17 -17
  313. package/src/http/client/HttpUtility.d.ts +10 -10
  314. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
  315. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
  316. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
  317. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
  318. package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
  319. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
  320. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
  321. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
  322. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
  323. package/src/remote/RemoteDataviewManager.d.ts +9 -9
  324. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
  325. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
  326. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
  327. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
  328. package/src/remote/ServerError.d.ts +16 -16
  329. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
  330. package/src/rt/Argument.d.ts +36 -36
  331. package/src/rt/ArgumentsList.d.ts +24 -24
  332. package/src/rt/Boundary.d.ts +27 -27
  333. package/src/rt/CompMainPrgTable.d.ts +10 -10
  334. package/src/rt/DataviewHeaderBase.d.ts +34 -34
  335. package/src/rt/DataviewHeaderFactory.d.ts +5 -5
  336. package/src/rt/DataviewHeaders.d.ts +12 -12
  337. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
  338. package/src/rt/ExecutionStack.d.ts +22 -22
  339. package/src/rt/ExecutionStackEntry.d.ts +7 -7
  340. package/src/rt/HandlersTable.d.ts +19 -19
  341. package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
  342. package/src/rt/IDataviewHeader.d.ts +10 -10
  343. package/src/rt/IResultValue.d.ts +4 -4
  344. package/src/rt/LastFocusedManager.d.ts +23 -23
  345. package/src/rt/Operation.d.ts +97 -97
  346. package/src/rt/OperationTable.d.ts +15 -15
  347. package/src/rt/Recompute.d.ts +41 -41
  348. package/src/rt/RecomputeTable.d.ts +9 -9
  349. package/src/rt/RemoteDataviewHeader.d.ts +14 -14
  350. package/src/rt/ResultValue.d.ts +7 -7
  351. package/src/rt/TableCache.d.ts +29 -29
  352. package/src/rt/TableCacheManager.d.ts +10 -10
  353. package/src/rt/Transaction.d.ts +23 -23
  354. package/src/security/UserDetails.d.ts +16 -16
  355. package/src/tasks/IMGDataCollection.d.ts +26 -26
  356. package/src/tasks/MGData.d.ts +63 -63
  357. package/src/tasks/MGDataCollection.d.ts +42 -42
  358. package/src/tasks/RCTimer.d.ts +13 -13
  359. package/src/tasks/RemoteTaskService.d.ts +16 -16
  360. package/src/tasks/Task.d.ts +312 -312
  361. package/src/tasks/TaskBase.d.ts +123 -123
  362. package/src/tasks/TaskServiceBase.d.ts +16 -16
  363. package/src/tasks/TasksTable.d.ts +21 -21
  364. package/src/tasks/sort/Sort.d.ts +4 -4
  365. package/src/tasks/sort/SortCollection.d.ts +11 -11
  366. package/src/util/ConstUtils.d.ts +3 -3
  367. package/src/util/FlowMonitorQueue.d.ts +70 -70
  368. package/src/util/HeapSort.d.ts +6 -6
  369. package/src/util/IMirrorXML.d.ts +6 -6
  370. package/src/util/IServerConfig.d.ts +11 -11
  371. package/src/util/MgBlockingQueue.d.ts +5 -5
  372. package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
  373. package/src/util/MgPriorityQueue.d.ts +13 -13
  374. package/src/util/ParamParseResult.d.ts +6 -6
  375. package/src/util/PrmMap.d.ts +28 -28
  376. package/src/util/ReturnResult.d.ts +18 -18
  377. package/src/util/ReturnResultBase.d.ts +11 -11
  378. package/src/util/Scrambler.d.ts +10 -10
  379. package/src/util/UniqueIDUtils.d.ts +4 -4
  380. package/src/util/cookie.service.d.ts +8 -8
  381. package/esm2020/src/AccessHelper.mjs +0 -9
  382. package/esm2020/src/ClientManager.mjs +0 -399
  383. package/esm2020/src/CommandsProcessorBase.mjs +0 -58
  384. package/esm2020/src/CommandsProcessorManager.mjs +0 -26
  385. package/esm2020/src/CommandsTable.mjs +0 -162
  386. package/esm2020/src/ConstInterface.mjs +0 -516
  387. package/esm2020/src/FlowMonitorInterface.mjs +0 -16
  388. package/esm2020/src/GUIManager.mjs +0 -62
  389. package/esm2020/src/GlobalCommandsManager.mjs +0 -34
  390. package/esm2020/src/GuiEventsProcessor.mjs +0 -154
  391. package/esm2020/src/ServerConfig.mjs +0 -117
  392. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
  393. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
  394. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  395. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  396. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  397. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  398. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
  399. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  400. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  401. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  402. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  403. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  404. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  405. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  406. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  407. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  408. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  409. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  410. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  411. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  412. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
  413. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
  414. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  415. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  416. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  417. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  418. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  419. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  420. package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
  421. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  422. package/esm2020/src/data/DataView.mjs +0 -1610
  423. package/esm2020/src/data/DataviewManager.mjs +0 -28
  424. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  425. package/esm2020/src/data/DvCache.mjs +0 -67
  426. package/esm2020/src/data/Field.mjs +0 -646
  427. package/esm2020/src/data/FieldBase.mjs +0 -18
  428. package/esm2020/src/data/FieldsTable.mjs +0 -103
  429. package/esm2020/src/data/Key.mjs +0 -88
  430. package/esm2020/src/data/Record.mjs +0 -846
  431. package/esm2020/src/data/RecordsTable.mjs +0 -267
  432. package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
  433. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
  434. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  435. package/esm2020/src/env/Environment.mjs +0 -489
  436. package/esm2020/src/env/LanguageData.mjs +0 -226
  437. package/esm2020/src/env/MirrorString.mjs +0 -65
  438. package/esm2020/src/event/ActionManager.mjs +0 -91
  439. package/esm2020/src/event/Event.mjs +0 -1333
  440. package/esm2020/src/event/EventHandler.mjs +0 -766
  441. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  442. package/esm2020/src/event/EventsManager.mjs +0 -2975
  443. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  444. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  445. package/esm2020/src/exp/ExpTable.mjs +0 -59
  446. package/esm2020/src/exp/Expression.mjs +0 -200
  447. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  448. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
  449. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  450. package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
  451. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  452. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  453. package/esm2020/src/gui/FormsTable.mjs +0 -66
  454. package/esm2020/src/gui/MgControl.mjs +0 -353
  455. package/esm2020/src/gui/MgForm.mjs +0 -1181
  456. package/esm2020/src/http/HttpManager.mjs +0 -97
  457. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  458. package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
  459. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  460. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  461. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  462. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
  463. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
  464. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
  465. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  466. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
  467. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
  468. package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
  469. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
  470. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
  471. package/esm2020/src/remote/ServerError.mjs +0 -40
  472. package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
  473. package/esm2020/src/rt/Argument.mjs +0 -265
  474. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  475. package/esm2020/src/rt/Boundary.mjs +0 -152
  476. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  477. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  478. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
  479. package/esm2020/src/rt/ExecutionStack.mjs +0 -94
  480. package/esm2020/src/rt/HandlersTable.mjs +0 -96
  481. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  482. package/esm2020/src/rt/Operation.mjs +0 -735
  483. package/esm2020/src/rt/OperationTable.mjs +0 -67
  484. package/esm2020/src/rt/Recompute.mjs +0 -355
  485. package/esm2020/src/rt/RecomputeTable.mjs +0 -63
  486. package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
  487. package/esm2020/src/rt/ResultValue.mjs +0 -12
  488. package/esm2020/src/rt/TableCache.mjs +0 -177
  489. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  490. package/esm2020/src/rt/Transaction.mjs +0 -53
  491. package/esm2020/src/security/UserDetails.mjs +0 -71
  492. package/esm2020/src/tasks/MGData.mjs +0 -552
  493. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  494. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  495. package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
  496. package/esm2020/src/tasks/Task.mjs +0 -2495
  497. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  498. package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
  499. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  500. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  501. package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
  502. package/esm2020/src/util/ConstUtils.mjs +0 -14
  503. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  504. package/esm2020/src/util/HeapSort.mjs +0 -70
  505. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  506. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  507. package/esm2020/src/util/PrmMap.mjs +0 -151
  508. package/esm2020/src/util/ReturnResult.mjs +0 -46
  509. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  510. package/esm2020/src/util/Scrambler.mjs +0 -89
  511. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  512. package/esm2020/src/util/cookie.service.mjs +0 -92
  513. package/fesm2015/magic-xpa-engine.mjs +0 -30835
  514. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  515. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,2975 @@
1
+ import { Constants, ForceExit, InternalInterface, Logger, Logger_LogLevels, MgControlType, Misc, MsgInterface, Priority, RaiseAt, StorageAttribute, StrUtil, SubformType } from '@magic-xpa/utils';
2
+ import { ApplicationException, Int32, List, NString, RefParam, Stack, StringBuilder, Thread, isNullOrUndefined } from '@magic-xpa/mscorelib';
3
+ import { Commands, CommandType, DataModificationTypes, ExpVal, FocusManager, GuiConstants, GuiEnvironment, KeyboardItem, Manager, Modifiers, PropInterface, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
4
+ import { EventSubType } from '../enums';
5
+ import { RollbackEventCommand_RollbackType } from '../commands/ClientToServer/RollbackEventCommand';
6
+ import { MgControl } from '../gui/MgControl';
7
+ import { MgPriorityBlockingQueue } from '../util/MgPriorityBlockingQueue';
8
+ import { RunTimeEvent } from './RunTimeEvent';
9
+ import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
10
+ import { GUIManager } from '../GUIManager';
11
+ import { Task } from '../tasks/Task';
12
+ import { Task_SubformExecModeEnum } from '../tasks/TaskBase';
13
+ import { ArgumentsList } from '../rt/ArgumentsList';
14
+ import { MGData } from '../tasks/MGData';
15
+ import { MGDataCollection } from '../tasks/MGDataCollection';
16
+ import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
17
+ import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
18
+ import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
19
+ import { CommandsProcessorManager } from '../CommandsProcessorManager';
20
+ import { ClientRefreshCommand } from '../commands/ServerToClient/ClientRefreshCommand';
21
+ import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
22
+ import { ExecutionStack } from '../rt/ExecutionStack';
23
+ import { EventHandlerPosition } from './EventHandlerPosition';
24
+ import { ConstInterface } from '../ConstInterface';
25
+ import { FlowMonitorInterface } from '../FlowMonitorInterface';
26
+ import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
27
+ import { ServerError } from '../remote/ServerError';
28
+ import { Environment } from '../env/Environment';
29
+ import { LastFocusedManager } from '../rt/LastFocusedManager';
30
+ import { EventsAllowedType } from './IEventsManager';
31
+ import { LanguageData } from '../env/LanguageData';
32
+ import { Subject } from 'rxjs';
33
+ import { ClientManager } from '../ClientManager';
34
+ import { ClearEventsOnStopExecution } from '../AccessHelper';
35
+ var EventScope;
36
+ (function (EventScope) {
37
+ EventScope["NONE"] = " ";
38
+ EventScope["TRANS"] = "T";
39
+ })(EventScope || (EventScope = {}));
40
+ export class EventsManager {
41
+ static REAL_ONLY = true;
42
+ static MAX_OPER = 9999;
43
+ static userGrantedForContextActivity = true;
44
+ _eventsQueue = null;
45
+ _execStack = null;
46
+ _rtEvents = null;
47
+ _serverExecStack = null;
48
+ _allowEvents = EventsAllowedType.ALL;
49
+ _compMainPrgTab = null;
50
+ _currCtrl = null;
51
+ _currField = null;
52
+ _currKbdItem = null;
53
+ _endOfWork = false;
54
+ _eventScope = EventScope.NONE;
55
+ _forceExit = ForceExit.None;
56
+ _forceExitTask = null;
57
+ _ignoreUnknownAbort = false;
58
+ _initialized = false;
59
+ _isHandlingForceExit = false;
60
+ _isNonReversibleExit = false;
61
+ _isInRecordFlushEvent = false;
62
+ static clientInactivityTimerON = false;
63
+ static clientContextInactivityTimerAborted = false;
64
+ lastSavedRouteEvent = null;
65
+ _stopExecution = false;
66
+ _processingTopMostEndTask = false;
67
+ _stopExecutionCtrl = null;
68
+ guiPendingEvent = null;
69
+ KBI_DOWN = null;
70
+ KBI_UP = null;
71
+ confirmationDialogMsg = 'The server context serving this application is about to time out. Do you want to continue your work?';
72
+ confirmationDialogTitle = 'Session is about to be terminated!';
73
+ static Instance = new EventsManager();
74
+ _lastFailedFocusedControl = null;
75
+ isSpinnerShown = false;
76
+ isInViewRefresh = false;
77
+ SpinnerStopped = new Subject();
78
+ static clientBusyTimeStart = 0;
79
+ constructor() {
80
+ this._rtEvents = new Stack();
81
+ this._eventsQueue = new MgPriorityBlockingQueue();
82
+ this._execStack = new Stack();
83
+ this._execStack.push(new ExecutionStack());
84
+ this._serverExecStack = new Stack();
85
+ this._serverExecStack.push(null);
86
+ this.KBI_DOWN = new KeyboardItem(GuiConstants.KEY_DOWN, Modifiers.MODIFIER_NONE);
87
+ this.KBI_UP = new KeyboardItem(GuiConstants.KEY_UP, Modifiers.MODIFIER_NONE);
88
+ }
89
+ getPendingGuiEvent() {
90
+ return this.guiPendingEvent;
91
+ }
92
+ setPendingGuiEvent(guiEvent) {
93
+ this.guiPendingEvent = guiEvent;
94
+ }
95
+ addToTail(rtEvt) {
96
+ if (!rtEvt.isIdleTimer()) {
97
+ if (EventsManager.clientInactivityTimerON) {
98
+ EventsManager.clientContextInactivityTimerAborted = true;
99
+ }
100
+ }
101
+ else {
102
+ if (this.getLastSavedRouteEvent() != null) {
103
+ this.addToTail(this.getLastSavedRouteEvent());
104
+ this.setLastSavedRouteEvent(null);
105
+ }
106
+ }
107
+ this._eventsQueue.put(rtEvt);
108
+ }
109
+ AddKeyboardEvent(mgForm, mgControl, modifier, keyCode, start, end, text, isActChar, suggestedValue, code) {
110
+ let rtEvt = (mgControl !== null) ? new RunTimeEvent(mgControl, true, false) : new RunTimeEvent(mgForm.getTask(), true);
111
+ rtEvt.setInternal(code);
112
+ let newKbItem = new KeyboardItem(keyCode, modifier);
113
+ if (isActChar && (mgControl !== null && (mgControl.isTextControl())))
114
+ newKbItem.setAction(InternalInterface.MG_ACT_CHAR);
115
+ rtEvt.setKeyboardItem(newKbItem);
116
+ if (code === InternalInterface.MG_ACT_CTRL_KEYDOWN) {
117
+ rtEvt.setEditParms(start, end, text);
118
+ }
119
+ else
120
+ rtEvt.setValue(suggestedValue);
121
+ this.addToTail(rtEvt);
122
+ return;
123
+ }
124
+ async checkParkability() {
125
+ let current = LastFocusedManager.getLastFocusedControl();
126
+ if (current !== null && (current.getForm().getTask()).getLevel() === Constants.TASK_LEVEL_CONTROL && !await current.IsParkable())
127
+ await this.HandleNonParkableControls(current.getForm().getTask());
128
+ }
129
+ async HandleParkabilityOnRowChange(itask) {
130
+ await this.HandleNonParkableControls(itask);
131
+ }
132
+ async HandleNonParkableControls(itask) {
133
+ let task = itask;
134
+ if (task.getMode() === Constants.TASK_MODE_CREATE && task.IsInteractive) {
135
+ await task.enableModes();
136
+ let oldMode = task.getOriginalTaskMode();
137
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
138
+ if (!this.GetStopExecutionFlag()) {
139
+ if (oldMode !== Constants.TASK_MODE_CREATE) {
140
+ task.setMode(oldMode);
141
+ await task.DataView.currRecCompute(true);
142
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
143
+ await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
144
+ task.setLastParkedCtrl(null);
145
+ await FocusManager.SetFocus(task, null, -1, true);
146
+ return;
147
+ }
148
+ }
149
+ }
150
+ if (task.getLevel() === Constants.TASK_LEVEL_CONTROL)
151
+ await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
152
+ task.setLastParkedCtrl(null);
153
+ MgControl.ReturnToCtrl = null;
154
+ await FocusManager.SetFocus(task, null, -1, true);
155
+ }
156
+ async handleEvent(rtEvt, returnedFromServer) {
157
+ let handler = null;
158
+ let pos = new EventHandlerPosition();
159
+ let task = rtEvt.getTask();
160
+ let ctrl = task.getLastParkedCtrl();
161
+ let forceExitDone = false;
162
+ let endTaskError = false;
163
+ let oldRtEvt = null;
164
+ let oldForceExit = this.getForceExit();
165
+ let oldForceExitTask = this.getForceExitTask();
166
+ let oldIsHandlingForceExit = this._isHandlingForceExit;
167
+ let restoreIsForceExit = false;
168
+ let restoreCurrCtrl;
169
+ let restoreCurrField = null;
170
+ if ((rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL)) {
171
+ if (rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT && (!task.ActionManager.isEnabled(rtEvt.InternalEvent) || (!rtEvt.isImmediate() && this.NoEventsAllowed())))
172
+ return;
173
+ }
174
+ else if (!rtEvt.isImmediate() && this.NoEventsAllowed())
175
+ return;
176
+ restoreCurrCtrl = this._currCtrl;
177
+ this._currCtrl = ctrl;
178
+ let propagate = rtEvt.getType() !== ConstInterface.EVENT_TYPE_INTERNAL || rtEvt.getInternalCode() < 1000;
179
+ try {
180
+ this.pushRtEvent(rtEvt);
181
+ await this.CheckAndShowSpinner(true);
182
+ let bRcBefore = await this.commonHandlerBefore(rtEvt);
183
+ restoreCurrField = this._currField;
184
+ this._currField = task.getCurrField();
185
+ if (bRcBefore) {
186
+ pos.init(rtEvt);
187
+ handler = pos.getNext();
188
+ if (handler !== null && handler.getEvent() !== null && handler.getEvent().UserEvt !== null)
189
+ this.setForceExit(handler.getEvent().UserEvt.ForceExit, task);
190
+ while (handler !== null) {
191
+ let handlerContextTask = null;
192
+ let rtEvtChanged;
193
+ try {
194
+ let enabledCndCheckedAndTrue = false;
195
+ handlerContextTask = handler.getTask().GetContextTask();
196
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() >= 1000 && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_VARIABLE)
197
+ handler.getTask().SetContextTask(handler.getTask());
198
+ else
199
+ handler.getTask().SetContextTask(rtEvt.getTask());
200
+ if (handler.getEvent().getType() === ConstInterface.EVENT_TYPE_USER && await handler.isEnabled()) {
201
+ enabledCndCheckedAndTrue = true;
202
+ this._isHandlingForceExit = false;
203
+ restoreIsForceExit = true;
204
+ if (await this.handleForceExitBefore(handler.getEvent(), rtEvt)) {
205
+ forceExitDone = true;
206
+ }
207
+ }
208
+ if (rtEvt !== handler.getEvent()) {
209
+ oldRtEvt = rtEvt;
210
+ rtEvt = new RunTimeEvent(handler.getEvent(), rtEvt);
211
+ rtEvtChanged = true;
212
+ this.popRtEvent();
213
+ this.pushRtEvent(rtEvt);
214
+ }
215
+ else
216
+ rtEvtChanged = false;
217
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
218
+ rtEvt.getTask().setInRecordSuffix(true);
219
+ this.createEventArguments(rtEvt);
220
+ let handlerRetVals = await handler.execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue);
221
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
222
+ rtEvt.getTask().setInRecordSuffix(false);
223
+ propagate = handlerRetVals.Propagate;
224
+ if (!handlerRetVals.Enabled && rtEvtChanged) {
225
+ rtEvt = oldRtEvt;
226
+ oldRtEvt = null;
227
+ rtEvtChanged = false;
228
+ this.popRtEvent();
229
+ this.pushRtEvent(rtEvt);
230
+ }
231
+ if (rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TASK_PREFIX && task.isStarted() && task.getExecEndTask()) {
232
+ endTaskError = await task.endTask(true, false, false);
233
+ if (endTaskError)
234
+ break;
235
+ }
236
+ if (this.GetStopExecutionFlag()) {
237
+ if (await this.handleStopExecution(rtEvt))
238
+ break;
239
+ }
240
+ }
241
+ finally {
242
+ handler.getTask().SetContextTask(handlerContextTask);
243
+ }
244
+ if (!propagate)
245
+ break;
246
+ if (rtEvtChanged)
247
+ handler = pos.getNext(rtEvt);
248
+ else
249
+ handler = pos.getNext();
250
+ if (handler !== null)
251
+ FlowMonitorQueue.Instance.addTaskEvent(rtEvt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_PROPAGATE, task.GetTaskDetails());
252
+ }
253
+ if (propagate && !endTaskError)
254
+ await this.commonHandler(rtEvt);
255
+ }
256
+ if (!endTaskError) {
257
+ await this.commonHandlerAfter(rtEvt, bRcBefore);
258
+ }
259
+ if (forceExitDone && this._isHandlingForceExit) {
260
+ this._isHandlingForceExit = false;
261
+ await this.handleForceExitAfter(rtEvt);
262
+ }
263
+ this.setForceExit(oldForceExit, oldForceExitTask);
264
+ if (restoreIsForceExit)
265
+ this._isHandlingForceExit = oldIsHandlingForceExit;
266
+ }
267
+ finally {
268
+ this._currCtrl = restoreCurrCtrl;
269
+ this._currField = restoreCurrField;
270
+ this.popRtEvent();
271
+ }
272
+ GUIManager.Instance.execGuiCommandQueue();
273
+ }
274
+ async simulateSelection(ctrl, val, line, produceClick) {
275
+ let mgControl = ctrl;
276
+ let currTask = mgControl.getForm().getTask();
277
+ let cancelWasRaised = currTask.cancelWasRaised();
278
+ if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON) {
279
+ let aRtEvt = new RunTimeEvent(mgControl);
280
+ let raiseAt = (await (mgControl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt());
281
+ if (aRtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && (aRtEvt.InternalEvent === InternalInterface.MG_ACT_CANCEL || aRtEvt.InternalEvent === InternalInterface.MG_ACT_RT_QUIT)) {
282
+ if (raiseAt === RaiseAt.TaskInFocus)
283
+ currTask = LastFocusedManager.Instance.getLastFocusedTask();
284
+ cancelWasRaised = currTask.cancelWasRaised();
285
+ currTask.setCancelWasRaised(true);
286
+ }
287
+ if (raiseAt === RaiseAt.TaskInFocus)
288
+ mgControl.setRtEvtTask(LastFocusedManager.Instance.getLastFocusedTask());
289
+ }
290
+ await this.handleFocus(mgControl, line, produceClick);
291
+ currTask.setCancelWasRaised(cancelWasRaised);
292
+ if (this._stopExecution)
293
+ return;
294
+ let controlIsParkable = await mgControl.IsParkable();
295
+ if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON || (mgControl.getField() === null || controlIsParkable)) {
296
+ if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON && !controlIsParkable) {
297
+ let subformTask = mgControl.getForm().getTask();
298
+ if (subformTask.IsSubForm) {
299
+ currTask = LastFocusedManager.Instance.getLastFocusedTask();
300
+ if (subformTask !== currTask && subformTask.pathContains(currTask)) {
301
+ if (subformTask.getLevel() === Constants.TASK_LEVEL_TASK) {
302
+ await this.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_PREFIX);
303
+ }
304
+ await this.HandleNonParkableControls(subformTask);
305
+ }
306
+ }
307
+ }
308
+ let rtEvt = new RunTimeEvent(mgControl);
309
+ RuntimeContextBase.Instance.CurrentClickedCtrl = mgControl;
310
+ rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_HIT);
311
+ await this.handleEvent(rtEvt, false);
312
+ if (this._stopExecution)
313
+ return;
314
+ }
315
+ if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON)
316
+ await this.handleSelection(mgControl, line, val);
317
+ if (this._stopExecution)
318
+ return;
319
+ await this.handleMouseUp(mgControl, line, produceClick);
320
+ }
321
+ async handleInternalEventWithTask(itask, eventCode) {
322
+ await this.handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, false);
323
+ }
324
+ async handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, subformRefresh) {
325
+ let task = itask;
326
+ if (eventCode === InternalInterface.MG_ACT_REC_PREFIX && task.IsSubForm && task.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME) {
327
+ task.SubformExecMode = (subformRefresh ? Task_SubformExecModeEnum.REFRESH : Task_SubformExecModeEnum.SET_FOCUS);
328
+ }
329
+ if (subformRefresh)
330
+ await this.handleInternalEventWithTask(itask, InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT);
331
+ if (task.DataView.isEmptyDataview()) {
332
+ if (eventCode === InternalInterface.MG_ACT_REC_PREFIX || eventCode === InternalInterface.MG_ACT_REC_SUFFIX) {
333
+ if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
334
+ await task.emptyDataviewOpen(subformRefresh);
335
+ else
336
+ task.emptyDataviewClose();
337
+ if (task.getForm() !== null) {
338
+ if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
339
+ await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
340
+ task.getForm().SelectRow();
341
+ }
342
+ }
343
+ else
344
+ await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
345
+ }
346
+ else
347
+ await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
348
+ }
349
+ async handleInternalEventWithMgControlBase(ctrl, eventCode) {
350
+ await this.handleInternalEventWithMgControl(ctrl, eventCode, EventSubType.Normal);
351
+ }
352
+ GetStopExecutionFlag() {
353
+ return this._stopExecution;
354
+ }
355
+ getStopExecutionCtrl() {
356
+ return this._stopExecutionCtrl;
357
+ }
358
+ Init() {
359
+ if (this._initialized) {
360
+ this._isHandlingForceExit = false;
361
+ this._forceExit = ForceExit.None;
362
+ this._forceExitTask = null;
363
+ this._currField = null;
364
+ this.setEndOfWork(true);
365
+ }
366
+ this._initialized = true;
367
+ }
368
+ addInternalEventWithItaskAndCode(itask, code) {
369
+ this.addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code);
370
+ }
371
+ addInternalEventWithCtrlAndCode(ctrl, code) {
372
+ let rtEvt = new RunTimeEvent(ctrl);
373
+ rtEvt.setInternal(code);
374
+ this.addToTail(rtEvt);
375
+ }
376
+ addInternalEventWithCtrlAndDisplayLineAndCode(ctrl, DisplayLine, code) {
377
+ let rtEvt = new RunTimeEvent(ctrl, DisplayLine, false);
378
+ rtEvt.setInternal(code);
379
+ this.addToTail(rtEvt);
380
+ }
381
+ addInternalEventWithCtrlAndCodeAndPriority(ctrl, code, priority) {
382
+ let rtEvt = new RunTimeEvent(ctrl);
383
+ rtEvt.setInternal(code);
384
+ rtEvt.setPriority(priority);
385
+ this.addToTail(rtEvt);
386
+ }
387
+ addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code) {
388
+ let task = itask;
389
+ let rtEvt = new RunTimeEvent(task);
390
+ rtEvt.setInternal(code);
391
+ this.addToTail(rtEvt);
392
+ }
393
+ addGuiTriggeredEventWithCtrlAndCodeAndLineAndModifier(ctrl, code, line) {
394
+ let rtEvt = new RunTimeEvent(ctrl, line, false);
395
+ rtEvt.setInternal(code);
396
+ this.addToTail(rtEvt);
397
+ }
398
+ addGuiTriggeredEventWithTaskAndCodeAndLine(task, code, line) {
399
+ let tsk = null;
400
+ if (task !== null)
401
+ tsk = task;
402
+ let rtEvt = new RunTimeEvent(tsk);
403
+ rtEvt.setInternal(code);
404
+ rtEvt.DisplayLine = line;
405
+ this.addToTail(rtEvt);
406
+ }
407
+ AddColumnClickEvent(columnCtrl, direction, columnHeader) {
408
+ let rtEvt = new RunTimeEvent(columnCtrl, direction, 0);
409
+ rtEvt.setInternal(InternalInterface.MG_ACT_COL_CLICK);
410
+ let argsList = new Array();
411
+ argsList[0] = new ExpVal(StorageAttribute.UNICODE, false, columnHeader);
412
+ let args = new ArgumentsList(argsList);
413
+ rtEvt.setArgList(args);
414
+ this.addToTail(rtEvt);
415
+ }
416
+ AddRouteEvent(task, code, routerpath, routerOutletName, routeParams) {
417
+ let rtEvt = new RunTimeEvent(task, true);
418
+ rtEvt.setInternal(code);
419
+ let argsList = new Array(2);
420
+ argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, routerpath);
421
+ if (routerOutletName === null)
422
+ routerOutletName = '';
423
+ argsList[1] = new ExpVal(StorageAttribute.ALPHA, false, routerOutletName);
424
+ let args = new ArgumentsList(argsList);
425
+ rtEvt.setArgList(args);
426
+ rtEvt.setRouteParamList(routeParams);
427
+ this.addToTail(rtEvt);
428
+ }
429
+ AddRouterClosedEvent(task) {
430
+ let subFormControl = task.getForm().getSubFormCtrl();
431
+ let rtEvt = new RunTimeEvent(subFormControl.getForm().getTask(), true);
432
+ rtEvt.setInternal(InternalInterface.MG_ACT_SUBFORM_CLOSE);
433
+ let argsList = new Array(1);
434
+ argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, subFormControl.getName());
435
+ let args = new ArgumentsList(argsList);
436
+ rtEvt.setArgList(args);
437
+ EventsManager.Instance.addToTail(rtEvt);
438
+ }
439
+ AddLastSavedRouteEvent(srcTask, args) {
440
+ let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), true);
441
+ rtEvt.setInternal(InternalInterface.MG_ACT_WEBCLIENT_ROUTE);
442
+ if (srcTask != null) {
443
+ rtEvt.setTask(srcTask);
444
+ if (args != null) {
445
+ rtEvt.setArgList(args);
446
+ }
447
+ this.setLastSavedRouteEvent(rtEvt);
448
+ }
449
+ }
450
+ AddExternalValueEvent(ctrl, value, refreshDisplay) {
451
+ let rtEvt = new RunTimeEvent(ctrl, 0, true);
452
+ rtEvt.setInternal(InternalInterface.MG_ACT_SET_EXTERNAL_VALUE);
453
+ rtEvt.setValue(value);
454
+ let argsList = new Array(1);
455
+ argsList[0] = new ExpVal(StorageAttribute.BOOLEAN, false, refreshDisplay ? '1' : '0');
456
+ let args = new ArgumentsList(argsList);
457
+ rtEvt.setArgList(args);
458
+ this.addToTail(rtEvt);
459
+ }
460
+ addGuiTriggeredEventWithCtrlAndCodeAndLine(ctrl, code, line) {
461
+ let rtEvt = new RunTimeEvent(ctrl, line, true);
462
+ rtEvt.setInternal(code);
463
+ this.addToTail(rtEvt);
464
+ }
465
+ addGuiTriggeredEventWithCtrlAndLineAndCodeAndIsProductClick(ctrl, code, line, isProduceClick) {
466
+ let rtEvt = new RunTimeEvent(ctrl, line, true);
467
+ rtEvt.setInternal(code);
468
+ rtEvt.setProduceClick(isProduceClick);
469
+ this.addToTail(rtEvt);
470
+ }
471
+ addGuiTriggeredEventWithCtrlAndCodeAndList(ctrl, code, list) {
472
+ let rtEvt = new RunTimeEvent(ctrl, list, true);
473
+ rtEvt.setInternal(code);
474
+ this.addToTail(rtEvt);
475
+ }
476
+ addGuiTriggeredEventWithTaskAndCode(task, code) {
477
+ let rtEvt = new RunTimeEvent(task, true);
478
+ rtEvt.setInternal(code);
479
+ this.addToTail(rtEvt);
480
+ }
481
+ addGuiTriggeredEventTaskAndCodeAndRaisedBy(task, code) {
482
+ this.addGuiTriggeredEventWithTaskAndCode(task, code);
483
+ }
484
+ getEvent() {
485
+ return this._eventsQueue.poll();
486
+ }
487
+ getForceExit() {
488
+ return this._forceExit;
489
+ }
490
+ setForceExit(forceExit, task) {
491
+ this._forceExit = forceExit;
492
+ this.setForceExitTask(task);
493
+ }
494
+ getForceExitTask() {
495
+ return this._forceExitTask;
496
+ }
497
+ setForceExitTask(task) {
498
+ this._forceExitTask = task;
499
+ }
500
+ isForceExitPreRecordUpdate(task) {
501
+ return this._isHandlingForceExit && this.getForceExit() === ForceExit.PreRecordUpdate && task === this.getForceExitTask();
502
+ }
503
+ async ExecuteClientContextInactivityTimer() {
504
+ let startTime = Misc.getSystemMilliseconds();
505
+ let clientCtxInactivityTimeout = Environment.Instance.getClientContextInactivityTimeout() * 100;
506
+ EventsManager.clientInactivityTimerON = true;
507
+ while (EventsManager.clientInactivityTimerON) {
508
+ await Thread.Sleep(1000);
509
+ var timeLapsed = Misc.getSystemMilliseconds() - startTime;
510
+ if (EventsManager.clientContextInactivityTimerAborted || timeLapsed >= clientCtxInactivityTimeout) {
511
+ EventsManager.clientInactivityTimerON = false;
512
+ }
513
+ }
514
+ }
515
+ async CheckAndShowSpinner(show) {
516
+ let sendCommand = false;
517
+ if (this.getLastRtEvent() !== null && this.getLastRtEvent().getPriority() === Priority.LOWEST)
518
+ show = false;
519
+ if (show != this.isSpinnerShown) {
520
+ if (show) {
521
+ if (Misc.getSystemMilliseconds() - this.GetEventTime() > 1000) {
522
+ sendCommand = true;
523
+ EventsManager.clientBusyTimeStart = Misc.getSystemMilliseconds();
524
+ }
525
+ }
526
+ else
527
+ sendCommand = true;
528
+ if (sendCommand) {
529
+ Commands.addShowSpinner(show);
530
+ Commands.beginInvoke();
531
+ await Thread.Sleep(50);
532
+ this.isSpinnerShown = show;
533
+ if (!this.isSpinnerShown) {
534
+ let totalClientBusyTime = Misc.getSystemMilliseconds() - EventsManager.clientBusyTimeStart;
535
+ this.SpinnerStopped.next(totalClientBusyTime);
536
+ EventsManager.clientBusyTimeStart = 0;
537
+ }
538
+ }
539
+ }
540
+ }
541
+ async EventsLoop(mgData) {
542
+ let savedAllowEvents = this.getAllowEvents();
543
+ this.setAllowEvents(EventsAllowedType.ALL);
544
+ this.pushNewExecStacks();
545
+ while (!mgData.IsAborting) {
546
+ await this.CheckAndShowSpinner(false);
547
+ await this._eventsQueue.waitForElement();
548
+ await this.handleEvents(mgData, 0);
549
+ if (!mgData.IsAborting)
550
+ await this.checkParkability();
551
+ }
552
+ this.popNewExecStacks();
553
+ this.setAllowEvents(savedAllowEvents);
554
+ }
555
+ async NonInteractiveEventsLoop(mgData, taskBase) {
556
+ let task = taskBase;
557
+ let savedAllowEvents = this.getAllowEvents();
558
+ this.setNonInteractiveAllowEvents(await task.isAllowEvents());
559
+ this.pushNewExecStacks();
560
+ while (!mgData.IsAborting) {
561
+ if (task.getMode() === Constants.TASK_MODE_DELETE)
562
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC);
563
+ else
564
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_REC);
565
+ await Thread.Sleep(10);
566
+ if (!mgData.IsAborting && await task.isAllowEvents())
567
+ await this.handleEvents(mgData, 1);
568
+ }
569
+ this.popNewExecStacks();
570
+ this.setAllowEvents(savedAllowEvents);
571
+ }
572
+ async handleEvents(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt) {
573
+ if ((baseMgDataOrHandlersTab === null || baseMgDataOrHandlersTab instanceof MGData) && (eventsToHandleCntOrRtEvt === null || eventsToHandleCntOrRtEvt.constructor === Number)) {
574
+ await this.handleEvents_0(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
575
+ return;
576
+ }
577
+ await this.handleEvents_1(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
578
+ }
579
+ async handleEvents_0(baseMgData, eventsToHandleCnt) {
580
+ let task = null;
581
+ let delta = 0;
582
+ let eventsPolledCnt = 0;
583
+ this.setStopExecution(false);
584
+ while (!this._eventsQueue.isEmpty() && !this._stopExecution && (eventsToHandleCnt === 0 || eventsPolledCnt < eventsToHandleCnt)) {
585
+ let rtEvt = this.getEvent();
586
+ if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
587
+ delta = Misc.getSystemMilliseconds();
588
+ this._currKbdItem = null;
589
+ let blockedByModalWindow = rtEvt.isBlockedByModalWindow(baseMgData);
590
+ if (blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TIMER) {
591
+ continue;
592
+ }
593
+ if (!rtEvt.isIdleTimer() && !blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_ENABLE_EVENTS && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_DISABLE_EVENTS && rtEvt.getTask() !== null && !rtEvt.getTask().getMGData().IsAborting) {
594
+ MGDataCollection.Instance.currMgdID = rtEvt.getTask().getMGData().GetId();
595
+ }
596
+ }
597
+ let currMgd = MGDataCollection.Instance.getCurrMGData();
598
+ if (currMgd !== null) {
599
+ while (currMgd !== null && currMgd.IsAborting) {
600
+ currMgd = currMgd.getParentMGdata();
601
+ if (currMgd !== null)
602
+ MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
603
+ }
604
+ }
605
+ else {
606
+ task = rtEvt.getTask();
607
+ while (currMgd === null && task !== null && task.getParent() !== null) {
608
+ task = task.getParent();
609
+ currMgd = task.getMGData();
610
+ if (currMgd.IsAborting)
611
+ currMgd = null;
612
+ if (currMgd !== null)
613
+ MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
614
+ }
615
+ }
616
+ if (currMgd === null)
617
+ break;
618
+ if (rtEvt.getTask() === null) {
619
+ task = LastFocusedManager.Instance.getLastFocusedTask();
620
+ while (task !== null && (task.isAborting() || task.InEndTask))
621
+ task = task.getParent();
622
+ if (task !== null) {
623
+ rtEvt.setCtrl(task.getLastParkedCtrl());
624
+ rtEvt.setTask(task);
625
+ }
626
+ }
627
+ else
628
+ task = rtEvt.getTask();
629
+ if (task !== null) {
630
+ await this.handleEvent(rtEvt, false);
631
+ }
632
+ GUIManager.Instance.execGuiCommandQueue();
633
+ this._currCtrl = null;
634
+ if (task !== null)
635
+ await Task.CommandsProcessor.SendMonitorOnly();
636
+ else {
637
+ await Task.CommandsProcessor.SendMonitorOnly();
638
+ }
639
+ if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
640
+ if (delta > 0) {
641
+ delta = Misc.getSystemMilliseconds() - delta;
642
+ }
643
+ }
644
+ if (eventsToHandleCnt > 0 && rtEvt !== null && rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT)
645
+ eventsPolledCnt++;
646
+ }
647
+ }
648
+ async handleStopExecution(rtEvt) {
649
+ let stop = false;
650
+ if (!this.GetStopExecutionFlag())
651
+ return stop;
652
+ let task = rtEvt.getTask();
653
+ let currCtrl = rtEvt.Control;
654
+ let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
655
+ let endTaskDueToVerifyError = false;
656
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
657
+ switch (rtEvt.getInternalCode()) {
658
+ case InternalInterface.MG_ACT_TASK_PREFIX:
659
+ endTaskDueToVerifyError = true;
660
+ break;
661
+ case InternalInterface.MG_ACT_REC_PREFIX:
662
+ endTaskDueToVerifyError = true;
663
+ break;
664
+ case InternalInterface.MG_ACT_REC_SUFFIX:
665
+ this.setStopExecutionCtrl(null);
666
+ this.setStopExecutionCtrl(task.getLastParkedCtrl());
667
+ break;
668
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
669
+ this.setStopExecution(false);
670
+ task.InCtrlPrefix = false;
671
+ if (lastParkedCtrl === null) {
672
+ task.setCurrField(null);
673
+ this.setStopExecutionCtrl(null);
674
+ this.setStopExecutionCtrl(currCtrl);
675
+ await this.HandleNonParkableControls(task);
676
+ }
677
+ else {
678
+ task.setCurrField(lastParkedCtrl.getField());
679
+ await FocusManager.SetFocus(lastParkedCtrl, -1);
680
+ }
681
+ this.setStopExecution(true);
682
+ break;
683
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
684
+ currCtrl.setInControlSuffix(false);
685
+ break;
686
+ }
687
+ if (endTaskDueToVerifyError) {
688
+ await task.endTask(true, false, true);
689
+ stop = true;
690
+ }
691
+ }
692
+ return stop;
693
+ }
694
+ async handleForceExitBefore(evt, rtEvt) {
695
+ let forceExit = evt.UserEvt.ForceExit;
696
+ let isNewRec = false;
697
+ let oldIdx = 0;
698
+ if (forceExit === ForceExit.None || rtEvt.isImmediate())
699
+ return false;
700
+ this._isHandlingForceExit = true;
701
+ let task = rtEvt.getTask();
702
+ let oldRec = task.DataView.getCurrRec();
703
+ if (oldRec !== null && oldRec.getMode() === DataModificationTypes.Insert && oldRec.isNewRec()) {
704
+ isNewRec = true;
705
+ oldIdx = oldRec.getId();
706
+ }
707
+ if (forceExit !== ForceExit.Editing && task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
708
+ let ctrl = task.getLastParkedCtrl();
709
+ if (ctrl !== null)
710
+ await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
711
+ }
712
+ if ((forceExit === ForceExit.PreRecordUpdate || forceExit === ForceExit.PostRecordUpdate) && task.getLevel() === Constants.TASK_LEVEL_RECORD) {
713
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
714
+ if (task.getMode() === Constants.TASK_MODE_CREATE && !this._stopExecution)
715
+ task.setMode(Constants.TASK_MODE_MODIFY);
716
+ let currRec = task.DataView.getCurrRec();
717
+ if (currRec !== null && this._stopExecution && isNewRec && oldIdx === currRec.getId() && task.getMode() === Constants.TASK_MODE_CREATE) {
718
+ currRec.clearMode();
719
+ currRec.restart(DataModificationTypes.Insert);
720
+ }
721
+ }
722
+ if (forceExit === ForceExit.PostRecordUpdate && !this._stopExecution) {
723
+ if (task.getLevel() === Constants.TASK_LEVEL_TASK)
724
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
725
+ }
726
+ if (forceExit === ForceExit.Editing) {
727
+ let evtCtrl = rtEvt.Control;
728
+ if (evtCtrl !== null && evtCtrl.getField() !== null) {
729
+ let ctrlVal = Manager.GetCtrlVal(evtCtrl);
730
+ await evtCtrl.validateAndSetValue(ctrlVal, true);
731
+ }
732
+ }
733
+ return true;
734
+ }
735
+ async handleForceExitAfter(rtEvt) {
736
+ let forceExit = rtEvt.UserEvt.ForceExit;
737
+ let task = rtEvt.getTask();
738
+ if (forceExit === ForceExit.PreRecordUpdate) {
739
+ await this.commitRecord(task, true);
740
+ if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
741
+ if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
742
+ await task.endTask(true, false, false);
743
+ }
744
+ }
745
+ if (forceExit !== ForceExit.PostRecordUpdate) {
746
+ task = rtEvt.getTask();
747
+ if (task.getLevel() === Constants.TASK_LEVEL_TASK)
748
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
749
+ }
750
+ let ctrl = LastFocusedManager.getLastFocusedControl();
751
+ if (ctrl !== null && forceExit !== ForceExit.Editing) {
752
+ await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
753
+ }
754
+ if (forceExit === ForceExit.Editing) {
755
+ let evtCtrl = rtEvt.Control;
756
+ if (evtCtrl !== null && evtCtrl.getField() !== null)
757
+ await evtCtrl.getField().updateDisplay();
758
+ }
759
+ }
760
+ async handleEvents_1(handlersTab, rtEvt) {
761
+ try {
762
+ this.pushRtEvent(rtEvt);
763
+ for (let i = 0; i < handlersTab.getSize(); i++) {
764
+ let handler = handlersTab.getHandler(i);
765
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION || handler.isSpecificHandlerOf(rtEvt) || handler.isNonSpecificHandlerOf(rtEvt) || handler.isGlobalHandlerOf(rtEvt)) {
766
+ await handler.execute(rtEvt, false, false);
767
+ }
768
+ }
769
+ }
770
+ finally {
771
+ this.popRtEvent();
772
+ }
773
+ }
774
+ async handleKeyDown(task, ctrl, evt) {
775
+ let kbdItem = evt.getKbdItmAlways();
776
+ let keyCode = kbdItem.getKeyCode();
777
+ this._currKbdItem = kbdItem;
778
+ if (evt.IgnoreSpecifiedControl) {
779
+ ctrl = this.getCurrCtrl();
780
+ task = (((ctrl.getForm().getTask() instanceof Task) ? ctrl.getForm().getTask() : null));
781
+ if (ctrl.Type !== MgControlType.CTRL_TYPE_TEXT)
782
+ return;
783
+ }
784
+ Logger.Instance.WriteDevToLog('Start handling KEYDOWN event. Key code: ' + keyCode);
785
+ try {
786
+ if (this._currKbdItem.equals(this.KBI_DOWN) || this._currKbdItem.equals(this.KBI_UP)) {
787
+ if (ctrl !== null && (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO))
788
+ return;
789
+ }
790
+ let rtEvt = new RunTimeEvent(task, ctrl);
791
+ rtEvt.setSystem(this._currKbdItem);
792
+ rtEvt.setEditParms(evt.getStartSelection(), evt.getEndSelection(), evt.getValue());
793
+ try {
794
+ await this.handleEvent(rtEvt, false);
795
+ }
796
+ finally {
797
+ if (this._stopExecution) {
798
+ let returnToCtrl = MgControl.ReturnToCtrl;
799
+ if (returnToCtrl !== null && MgControl.validReturnToCtrl())
800
+ returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
801
+ }
802
+ }
803
+ let mgd = MGDataCollection.Instance.getCurrMGData();
804
+ if (mgd !== null && !mgd.IsAborting)
805
+ await this.handleExpressionHandlers();
806
+ Logger.Instance.WriteDevToLog('End handling KEYDOWN event. Key code: ' + keyCode);
807
+ if (ctrl !== null && ctrl.IsRepeatable && ctrl === MgControl.ReturnToCtrl) {
808
+ await ctrl.getForm().bringRecordToPage();
809
+ }
810
+ }
811
+ finally {
812
+ }
813
+ }
814
+ async handleSelection(ctrl, line, val) {
815
+ if (ctrl.Type === MgControlType.CTRL_TYPE_TAB || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_COMBO || ctrl.Type === MgControlType.CTRL_TYPE_LIST) {
816
+ let checkFocus = (ctrl.Type !== MgControlType.CTRL_TYPE_TAB && ctrl.Type !== MgControlType.CTRL_TYPE_CHECKBOX);
817
+ let allowSelection = (checkFocus ? (ctrl.getForm().getTask().getLastParkedCtrl() === ctrl) : true);
818
+ if (!allowSelection || !ctrl.isModifiable() || !await ctrl.IsParkable())
819
+ await ctrl.restoreOldValue();
820
+ else {
821
+ if (ctrl.isChoiceControl())
822
+ Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, true);
823
+ if (ctrl.isDifferentValue(val, ctrl.IsNull, true)) {
824
+ ctrl.ModifiedByUser = true;
825
+ await this.handleCtrlModify(ctrl, InternalInterface.MG_ACT_SELECTION);
826
+ }
827
+ if (ctrl.isChoiceControl())
828
+ Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, false);
829
+ if (!ctrl.IsMultipleSelectionListBox())
830
+ await ctrl.validateAndSetValue(val, true);
831
+ }
832
+ }
833
+ }
834
+ async handleMouseUp(ctrl, line, produceClick) {
835
+ if (ctrl === null)
836
+ return;
837
+ if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO)
838
+ RuntimeContextBase.Instance.CurrentClickedRadio = ctrl;
839
+ try {
840
+ if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE) {
841
+ if (!await ctrl.checkPropWithLine(PropInterface.PROP_TYPE_ENABLED, true, line)) {
842
+ return;
843
+ }
844
+ let canGotoCtrl = this.canGoToControl(ctrl, true);
845
+ let StopFocus = ctrl.isFocusedStopExecution();
846
+ let returnToCtrl = MgControl.ReturnToCtrl;
847
+ if ((!canGotoCtrl || ((this._stopExecution || StopFocus) && returnToCtrl !== ctrl)) && returnToCtrl !== null) {
848
+ MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
849
+ if (returnToCtrl.IsRepeatable)
850
+ await returnToCtrl.getForm().bringRecordToPage();
851
+ await FocusManager.SetFocus(returnToCtrl, -1);
852
+ returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
853
+ }
854
+ if (this._stopExecution || StopFocus)
855
+ return;
856
+ }
857
+ if (produceClick && (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST)) {
858
+ let rtEvt = new RunTimeEvent(ctrl);
859
+ rtEvt.setInternal(InternalInterface.MG_ACT_WEB_CLICK);
860
+ this.addToTail(rtEvt);
861
+ }
862
+ }
863
+ finally {
864
+ RuntimeContextBase.Instance.CurrentClickedRadio = null;
865
+ }
866
+ }
867
+ checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt) {
868
+ if (aRtEvt.getType() == ConstInterface.EVENT_TYPE_INTERNAL && aRtEvt.getInternalCode() ==
869
+ InternalInterface.MG_ACT_WEBCLIENT_ROUTE && RuntimeContextBase.Instance.RemovedContextFromServer) {
870
+ this.setLastSavedRouteEvent(aRtEvt);
871
+ }
872
+ }
873
+ async handleFocus(ctrl, line, onClick) {
874
+ try {
875
+ if (ctrl.isStatic())
876
+ return;
877
+ if (ctrl !== this._lastFailedFocusedControl && ctrl.HasExpOrParentTaskField()) {
878
+ if (ctrl.isListBox() || ctrl.isCheckBox() || ctrl.isComboBox() || ctrl.isTextControl() || ctrl.isRadio() || ctrl.isTabControl()) {
879
+ Logger.Instance.WriteErrorToLog(NString.Format('Control either has expression or has parent task variable attached to it. Failed to park on control with name: {0}', ctrl.Name));
880
+ FocusManager.SetFocus(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl(), 0, LastFocusedManager.getLastFocusedControl() === null ? true : false);
881
+ this._lastFailedFocusedControl = ctrl;
882
+ return;
883
+ }
884
+ }
885
+ this._lastFailedFocusedControl = null;
886
+ if (onClick)
887
+ RuntimeContextBase.Instance.CurrentClickedCtrl = ctrl;
888
+ let prevCtrl = LastFocusedManager.getLastFocusedControl();
889
+ if (ctrl === prevCtrl && !ctrl.isRepeatable()) {
890
+ await ctrl.getForm().bringRecordToPage();
891
+ return;
892
+ }
893
+ let prevTask = LastFocusedManager.Instance.getLastFocusedTask();
894
+ if (ctrl === null || ctrl.Type === MgControlType.CTRL_TYPE_TABLE) {
895
+ if (prevCtrl === null)
896
+ await this.HandleNonParkableControls(ctrl.getForm().getTask());
897
+ return;
898
+ }
899
+ let currTask;
900
+ if ((ctrl.Type === MgControlType.CTRL_TYPE_BUTTON) && ((await (ctrl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt()) === RaiseAt.TaskInFocus))
901
+ currTask = prevTask;
902
+ else
903
+ currTask = ctrl.getForm().getTask();
904
+ let canGotoCtrl = this.canGoToControl(ctrl, onClick);
905
+ if (canGotoCtrl) {
906
+ if (this.guiPendingEvent != null)
907
+ return;
908
+ let handled = await this.HandleSubformModality(ctrl, prevTask, currTask);
909
+ if (handled)
910
+ return;
911
+ let eventLine = (ctrl.isRepeatable() || ctrl.isRadio()) ? line : Int32.MinValue;
912
+ let rtEvt = new RunTimeEvent(ctrl, eventLine);
913
+ rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_PREFIX);
914
+ await this.handleEvent(rtEvt, false);
915
+ }
916
+ else if (prevCtrl !== null) {
917
+ if (!prevCtrl.isModifiable()) {
918
+ if (prevCtrl.isChoiceControl())
919
+ await prevCtrl.restoreOldValue();
920
+ }
921
+ else if (!currTask.cancelWasRaised()) {
922
+ let newVal = Manager.GetCtrlVal(prevCtrl);
923
+ if (!await prevCtrl.validateAndSetValue(newVal, true))
924
+ this.setStopExecution(true);
925
+ }
926
+ MgControl.ReturnToCtrl = prevCtrl;
927
+ }
928
+ else
929
+ await this.HandleNonParkableControls(ctrl.getForm().getTask());
930
+ if (!this._stopExecution && MgControl.ReturnToCtrl === ctrl)
931
+ LastFocusedManager.setLastFocusedControl(ctrl.getForm().getTask(), ctrl);
932
+ return;
933
+ }
934
+ finally {
935
+ ctrl.setFocusedStopExecution(this._stopExecution);
936
+ if (this._stopExecution) {
937
+ {
938
+ let returnToCtrl = MgControl.ReturnToCtrl;
939
+ if (returnToCtrl !== null) {
940
+ MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
941
+ await FocusManager.SetFocus(returnToCtrl, -1);
942
+ returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
943
+ }
944
+ }
945
+ }
946
+ }
947
+ }
948
+ async HandleSubformModality(ctrl, prevTask, currTask) {
949
+ let handledSubformModality = false;
950
+ let length = prevTask.getMGData().getTasksCount();
951
+ let topTask = prevTask.getMGData().getTask(length - 1);
952
+ if (currTask == prevTask || prevTask != topTask) {
953
+ if (topTask != null && prevTask != topTask && topTask.IsSubForm) {
954
+ let subformCtrl = topTask.getForm().getSubFormCtrl();
955
+ if (subformCtrl.IsModal())
956
+ prevTask = topTask;
957
+ }
958
+ }
959
+ if (prevTask != ctrl.getForm().getTask() && prevTask.getIsDestinationCall()) {
960
+ if (!currTask.isDescendentOf(prevTask)) {
961
+ let subformCtrl = prevTask.getForm().getSubFormCtrl();
962
+ if (!subformCtrl.IsModal() && !currTask.getIsDestinationCall())
963
+ subformCtrl = prevTask.GetSubformModalParentTask();
964
+ if (subformCtrl != null && (ctrl != subformCtrl) && subformCtrl.IsModal()) {
965
+ await this.performSubformClose(subformCtrl);
966
+ if (!this._stopExecution)
967
+ this.guiPendingEvent = this.getLastRtEvent();
968
+ handledSubformModality = true;
969
+ }
970
+ }
971
+ }
972
+ return handledSubformModality;
973
+ }
974
+ async handleFocusOnNonMagicControl(ctrl) {
975
+ try {
976
+ await EventsManager.Instance.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
977
+ }
978
+ finally {
979
+ ctrl.setFocusedStopExecution(this._stopExecution);
980
+ if (this._stopExecution) {
981
+ {
982
+ let returnToCtrl = MgControl.ReturnToCtrl;
983
+ if (returnToCtrl !== null) {
984
+ MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
985
+ await FocusManager.SetFocus(returnToCtrl, -1);
986
+ returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
987
+ }
988
+ }
989
+ }
990
+ }
991
+ }
992
+ canGoToControl(ctrl, onClick) {
993
+ if (onClick && (ctrl.Type === MgControlType.CTRL_TYPE_SUBFORM || ctrl.Type === MgControlType.CTRL_TYPE_BROWSER))
994
+ return false;
995
+ let canGotoCtrl = true;
996
+ let currTask = ctrl.getForm().getTask();
997
+ let lastTask = LastFocusedManager.Instance.getLastFocusedTask();
998
+ if (!currTask.IsInteractive || (lastTask != null && lastTask.getLastParkedCtrl() != null &&
999
+ lastTask.cancelWasRaised()))
1000
+ return false;
1001
+ if (ctrl.Type === MgControlType.CTRL_TYPE_IMAGE && !ctrl.IsRepeatable)
1002
+ canGotoCtrl = false;
1003
+ return canGotoCtrl;
1004
+ }
1005
+ async handleTimer(evt) {
1006
+ evt.setType(ConstInterface.EVENT_TYPE_TIMER);
1007
+ if (evt.isIdleTimer()) {
1008
+ await this.handleExpressionHandlers();
1009
+ await this.handleContextInactivityAlert(evt);
1010
+ }
1011
+ else {
1012
+ let mgd = MGDataCollection.Instance.getMGData(evt.getMgdID());
1013
+ await this.handleEvents(mgd.getTimerHandlers(), evt);
1014
+ }
1015
+ }
1016
+ async handleContextInactivityAlert(evt) {
1017
+ let timeNow = Misc.getSystemMilliseconds();
1018
+ let mgd = evt.getTask().getMGData();
1019
+ let lastRequestTime = RemoteCommandsProcessor.GetInstance().GetLastRequestTime;
1020
+ let contextInactivityTimeout = Environment.Instance.getContextInactivityTimeout() / 10;
1021
+ let contextInactivityWarningTime = Environment.Instance.getContextInactivityWarningTime() / 10;
1022
+ let idleTime = (timeNow - lastRequestTime) / 1000;
1023
+ if (contextInactivityTimeout == 0 || contextInactivityWarningTime == 0)
1024
+ return;
1025
+ if (EventsManager.userGrantedForContextActivity && idleTime >= (contextInactivityTimeout - contextInactivityWarningTime)) {
1026
+ let userConfirmation = await GUIManager.Instance.MessageBox(this.confirmationDialogTitle, this.confirmationDialogMsg, Styles.MSGBOX_BUTTON_YES_NO);
1027
+ if (userConfirmation == Styles.MSGBOX_RESULT_YES) {
1028
+ let cmd = CommandFactory.CreateContextTimeoutResetEventCommand();
1029
+ mgd.CmdsToServer.Add(cmd);
1030
+ await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
1031
+ }
1032
+ else {
1033
+ EventsManager.userGrantedForContextActivity = false;
1034
+ }
1035
+ }
1036
+ }
1037
+ async handleExpressionHandlers() {
1038
+ let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl());
1039
+ rtEvt.setExpression(null);
1040
+ rtEvt.setMainPrgCreator(rtEvt.getTask());
1041
+ for (let i = 0; i < MGDataCollection.Instance.getSize(); i++) {
1042
+ let mgd = MGDataCollection.Instance.getMGData(i);
1043
+ if (mgd !== null && !mgd.IsAborting)
1044
+ await this.handleEvents(mgd.getExpHandlers(), rtEvt);
1045
+ }
1046
+ }
1047
+ handleResize(ctrl, rowsInPage) {
1048
+ ctrl.getForm().setRowsInPage(rowsInPage);
1049
+ }
1050
+ async handleRowDataCurPage(table, desiredTopIndex, sendAll, lastFocusedVal) {
1051
+ let form = table.getForm();
1052
+ await form.setRowData(desiredTopIndex, sendAll);
1053
+ }
1054
+ async handleTransferDataToGui(ctrl) {
1055
+ let form = ctrl.getForm();
1056
+ await form.transferDataToGui();
1057
+ }
1058
+ async fetchRecordsAheadFromServer(ctrl) {
1059
+ let form = ctrl.getForm();
1060
+ await form.FetchRecordsAheadFromServer();
1061
+ }
1062
+ handleEnableEvents(evt, enable) {
1063
+ evt.getTask().ActionManager.enableList(evt.getActEnableList(), enable, true);
1064
+ }
1065
+ async handleCtrlPrefix(evt) {
1066
+ let task = evt.getTask();
1067
+ let currClickedCtrl = RuntimeContextBase.Instance.CurrentClickedCtrl;
1068
+ let form = task.getForm();
1069
+ let displayLine = evt.getDisplayLine();
1070
+ let ctrl = evt.Control;
1071
+ if (form.isLineMode()) {
1072
+ if (displayLine === Int32.MinValue || ctrl.isRadio())
1073
+ displayLine = form.DisplayLine;
1074
+ }
1075
+ else
1076
+ displayLine = Int32.MinValue;
1077
+ let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
1078
+ if (lastParkedCtrl !== null && lastParkedCtrl.getForm().getTask().getMGData().GetId() === ctrl.getForm().getTask().getMGData().GetId() && lastParkedCtrl.getForm().getTask().getLevel() === Constants.TASK_LEVEL_CONTROL) {
1079
+ if ((ctrl !== lastParkedCtrl || (ctrl.isRepeatable() && displayLine !== ctrl.getDisplayLine(true))) && !lastParkedCtrl.isInControlSuffix()) {
1080
+ await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
1081
+ if (this._stopExecution) {
1082
+ if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
1083
+ ctrl.resetPrevVal();
1084
+ await ctrl.RefreshDisplay();
1085
+ }
1086
+ return false;
1087
+ }
1088
+ }
1089
+ else
1090
+ return false;
1091
+ }
1092
+ if (task.InCtrlPrefix)
1093
+ return false;
1094
+ task.InCtrlPrefix = true;
1095
+ let prevCtrl = lastParkedCtrl;
1096
+ if (currClickedCtrl !== null && currClickedCtrl.getForm().getTask().getMgdID() === ctrl.getForm().getTask().getMgdID() && ctrl.onDiffForm(currClickedCtrl))
1097
+ prevCtrl = currClickedCtrl;
1098
+ if (prevCtrl !== null && ctrl.onDiffForm(prevCtrl)) {
1099
+ let prevTask = prevCtrl.getForm().getTask();
1100
+ await prevTask.execSubformRecSuffix(ctrl.getForm().getTask());
1101
+ if (this._stopExecution) {
1102
+ if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
1103
+ ctrl.resetPrevVal();
1104
+ await ctrl.RefreshDisplay();
1105
+ }
1106
+ task.InCtrlPrefix = false;
1107
+ return false;
1108
+ }
1109
+ if (ctrl.getForm().getTask().isAborting()) {
1110
+ task.InCtrlPrefix = false;
1111
+ return false;
1112
+ }
1113
+ await EventsManager.doSyncForSubformParent(task);
1114
+ }
1115
+ if (task.DataView.isEmptyDataview())
1116
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1117
+ else {
1118
+ task.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
1119
+ let rtEvt = new RunTimeEvent(ctrl, displayLine);
1120
+ rtEvt.setInternal(InternalInterface.MG_ACT_REC_PREFIX);
1121
+ await this.handleEvent(rtEvt, false);
1122
+ }
1123
+ if (this.GetStopExecutionFlag()) {
1124
+ task.InCtrlPrefix = false;
1125
+ return false;
1126
+ }
1127
+ if (!await ctrl.IsParkable() && ctrl !== lastParkedCtrl) {
1128
+ task.InCtrlPrefix = false;
1129
+ if (lastParkedCtrl === null || !await lastParkedCtrl.invoke())
1130
+ await this.HandleNonParkableControls(ctrl.getForm().getTask());
1131
+ return false;
1132
+ }
1133
+ Logger.Instance.WriteSupportToLog(NString.Format('{0} Entering control: control {1}, row {2}', task.GetTaskDetails(), ctrl.Name, displayLine < 0 ? 0 : displayLine), true);
1134
+ task.setLevel(Constants.TASK_LEVEL_CONTROL);
1135
+ ctrl.KeyStrokeOn = false;
1136
+ ctrl.ModifiedByUser = false;
1137
+ task.setCurrField(ctrl.getField());
1138
+ if (ctrl.IsRepeatable)
1139
+ await form.bringRecordToPage();
1140
+ if (lastParkedCtrl !== ctrl) {
1141
+ if ((lastParkedCtrl === null && ctrl.getForm().isSubForm()) || (lastParkedCtrl !== null && (ctrl.getForm().isSubForm() || lastParkedCtrl.getForm().isSubForm()))) {
1142
+ let lastParkedTask = null;
1143
+ if (lastParkedCtrl !== null)
1144
+ lastParkedTask = lastParkedCtrl.getForm().getTask();
1145
+ if (lastParkedTask !== task) {
1146
+ let firstTime = true;
1147
+ let isSonSubform;
1148
+ let parentTask;
1149
+ if (lastParkedTask !== null) {
1150
+ isSonSubform = lastParkedTask.IsSubForm;
1151
+ for (parentTask = lastParkedTask; parentTask !== null && isSonSubform; parentTask = parentTask.getParent()) {
1152
+ if (!firstTime) {
1153
+ isSonSubform = parentTask.IsSubForm;
1154
+ parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
1155
+ parentTask.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
1156
+ parentTask.enableCreateActs(false);
1157
+ }
1158
+ else
1159
+ firstTime = false;
1160
+ }
1161
+ }
1162
+ isSonSubform = task.IsSubForm;
1163
+ for (parentTask = task.getParent(); (parentTask !== null) && isSonSubform; parentTask = parentTask.getParent()) {
1164
+ isSonSubform = parentTask.IsSubForm;
1165
+ if (parentTask.getEnableZoomHandler())
1166
+ parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
1167
+ await parentTask.setCreateDeleteActsEnableState();
1168
+ }
1169
+ await task.enableModes();
1170
+ }
1171
+ }
1172
+ }
1173
+ if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
1174
+ task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
1175
+ if (ctrl.isTextControl() || ctrl.isChoiceControl())
1176
+ ctrl.SetKeyboardLanguage();
1177
+ if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
1178
+ task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, true);
1179
+ await task.setCreateDeleteActsEnableState();
1180
+ let field = ctrl.getField();
1181
+ if (field !== null && field.NullAllowed && ctrl.isModifiable() && ctrl.Type !== MgControlType.CTRL_TYPE_BUTTON)
1182
+ task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, true);
1183
+ return true;
1184
+ }
1185
+ async commonHandlerBefore(evt) {
1186
+ let evtSave = evt;
1187
+ let task = evt.getTask();
1188
+ let rec = null;
1189
+ let prevRec = null;
1190
+ let val;
1191
+ let oldDisplayLine = Int32.MinValue;
1192
+ if (this._stopExecution)
1193
+ return false;
1194
+ if (task.isAborting())
1195
+ return false;
1196
+ if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
1197
+ let actId = this.getMatchingAction(evt.getKbdItm());
1198
+ if (actId !== 0 && evt.Control !== null) {
1199
+ evt = new RunTimeEvent(evt, evt);
1200
+ evt.setInternal(actId);
1201
+ evt.setArgList(null);
1202
+ let mgControl = evt.Control;
1203
+ evtSave.setCtrl(mgControl);
1204
+ if (mgControl === null)
1205
+ return false;
1206
+ }
1207
+ }
1208
+ if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
1209
+ let form = task.getForm();
1210
+ let displayLine = evt.getDisplayLine();
1211
+ let dv = task.DataView;
1212
+ rec = dv.getCurrRec();
1213
+ let ctrl = evt.Control;
1214
+ let intEvtCode = evt.getInternalCode();
1215
+ let lastFocusedCtrl = LastFocusedManager.getLastFocusedControl();
1216
+ switch (intEvtCode) {
1217
+ case InternalInterface.MG_ACT_ZOOM:
1218
+ let boolval = await this.selectProg(ctrl);
1219
+ if (boolval)
1220
+ return false;
1221
+ case InternalInterface.MG_ACT_WEB_ON_DBLICK:
1222
+ break;
1223
+ case InternalInterface.MG_ACT_CTRL_FOCUS:
1224
+ await this.handleFocus(ctrl, displayLine, evt.isProduceClick());
1225
+ return false;
1226
+ case InternalInterface.MG_ACT_CTRL_FOCUS_ON_NON_MAGIC_CONTROL:
1227
+ await this.handleFocusOnNonMagicControl(ctrl);
1228
+ return false;
1229
+ case InternalInterface.MG_ACT_CTRL_KEYDOWN:
1230
+ await this.handleKeyDown(task, ctrl, evt);
1231
+ return false;
1232
+ case InternalInterface.MG_ACT_CTRL_MOUSEUP:
1233
+ await this.handleMouseUp(ctrl, displayLine, evt.isProduceClick());
1234
+ return false;
1235
+ case InternalInterface.MG_ACT_SELECTION:
1236
+ await this.onActSelection(ctrl, form, evt);
1237
+ return false;
1238
+ case InternalInterface.MG_ACT_TIMER:
1239
+ await this.handleTimer(evt);
1240
+ return false;
1241
+ case InternalInterface.MG_ACT_RESIZE:
1242
+ this.handleResize(ctrl, displayLine);
1243
+ return false;
1244
+ case InternalInterface.MG_ACT_ROW_DATA_CURR_PAGE:
1245
+ await this.handleRowDataCurPage(ctrl, displayLine, evt.isSendAll(), evt.LastFocusedVal);
1246
+ return false;
1247
+ case InternalInterface.MG_ACT_DV_TO_GUI:
1248
+ await this.handleTransferDataToGui(ctrl);
1249
+ return false;
1250
+ case InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER:
1251
+ await this.fetchRecordsAheadFromServer(ctrl);
1252
+ break;
1253
+ case InternalInterface.MG_ACT_ENABLE_EVENTS:
1254
+ this.handleEnableEvents(evt, true);
1255
+ return false;
1256
+ case InternalInterface.MG_ACT_DISABLE_EVENTS:
1257
+ this.handleEnableEvents(evt, false);
1258
+ return false;
1259
+ case InternalInterface.MG_ACT_TASK_PREFIX:
1260
+ task.setLevel(Constants.TASK_LEVEL_TASK);
1261
+ break;
1262
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
1263
+ task.setLevel(Constants.TASK_LEVEL_TASK);
1264
+ break;
1265
+ case InternalInterface.MG_ACT_REC_PREFIX:
1266
+ if (task.IsSubForm && task.getParent().InCommonHandlerBeforeRP)
1267
+ return false;
1268
+ task.setAfterRetry(ConstInterface.RECOVERY_NONE);
1269
+ task.DataSynced = false;
1270
+ if (!task.isStarted())
1271
+ return false;
1272
+ if (form.getRowsInPage() > Int32.MinValue && displayLine > Int32.MinValue) {
1273
+ while (!dv.recExists(displayLine) && displayLine > 0) {
1274
+ displayLine--;
1275
+ }
1276
+ if (displayLine >= 0) {
1277
+ prevRec = dv.getCurrRec();
1278
+ let oldTaskMode = task.getMode();
1279
+ let oldRecId = prevRec.getId();
1280
+ try {
1281
+ oldDisplayLine = form.DisplayLine;
1282
+ form.PrevDisplayLine = oldDisplayLine;
1283
+ await form.setCurrRowByDisplayLine(displayLine, true, false);
1284
+ if (prevRec != null && !dv.recExistsById(prevRec.getId())) {
1285
+ await form.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
1286
+ await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1287
+ }
1288
+ rec = dv.getCurrRec();
1289
+ }
1290
+ catch (e) {
1291
+ if (e instanceof RecordOutOfDataViewException) {
1292
+ if (this._stopExecution) {
1293
+ if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0 &&
1294
+ !dv.recExistsById(oldRecId)) {
1295
+ let prevLine = form.getPrevLine(oldDisplayLine);
1296
+ await form.restoreOldDisplayLine(prevLine);
1297
+ }
1298
+ else
1299
+ await form.restoreOldDisplayLine(oldDisplayLine);
1300
+ await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
1301
+ this.setStopExecution(false);
1302
+ lastFocusedCtrl = task.getLastParkedCtrl();
1303
+ task.getLastParkedCtrl();
1304
+ if (lastFocusedCtrl != null)
1305
+ await lastFocusedCtrl.invoke();
1306
+ this.setStopExecution(true);
1307
+ return false;
1308
+ }
1309
+ else
1310
+ Logger.Instance.WriteDevToLog(e.StackTrace);
1311
+ }
1312
+ else
1313
+ throw e;
1314
+ }
1315
+ }
1316
+ else
1317
+ throw new ApplicationException('in EventsManager.commonHandlerBefore(): invalid line number: ' +
1318
+ displayLine);
1319
+ }
1320
+ if (rec == null)
1321
+ throw new ApplicationException('in EventsManager.commonHandlerBefore(): no current record available !');
1322
+ if (!task.IsInteractive && task.getLevel() === Constants.TASK_LEVEL_TASK)
1323
+ task.increaseCounter();
1324
+ if (await task.evalEndCond(ConstInterface.END_COND_EVAL_BEFORE)) {
1325
+ await task.endTask(true, false, false);
1326
+ return false;
1327
+ }
1328
+ if (form.HasTable())
1329
+ await form.bringRecordToPage();
1330
+ if (task.getLevel() !== Constants.TASK_LEVEL_TASK)
1331
+ return false;
1332
+ await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1333
+ Logger.Instance.WriteDevToLog('RECORD PREFIX: ' + task.queryTaskPath());
1334
+ (dv.getCurrRec()).setForceSaveOrg(false);
1335
+ (dv.getCurrRec()).Synced = false;
1336
+ dv.saveOriginal();
1337
+ if (task.IsSubForm && task.PerformParentRecordPrefix) {
1338
+ let parentTask = task.getParent();
1339
+ while (parentTask.IsSubForm) {
1340
+ if (parentTask.getLevel() === Constants.TASK_LEVEL_TASK) {
1341
+ await this.handleInternalEventWithTask(parentTask, InternalInterface.MG_ACT_REC_PREFIX);
1342
+ parentTask = parentTask.getParent();
1343
+ if (this.GetStopExecutionFlag())
1344
+ break;
1345
+ }
1346
+ else
1347
+ break;
1348
+ }
1349
+ }
1350
+ task.InCommonHandlerBeforeRP = true;
1351
+ if (await task.CheckRefreshSubTasks())
1352
+ await dv.computeSubForms();
1353
+ task.InCommonHandlerBeforeRP = false;
1354
+ task.setLevel(Constants.TASK_LEVEL_RECORD);
1355
+ await task.enableRecordActions();
1356
+ break;
1357
+ case InternalInterface.MG_ACT_REC_SUFFIX:
1358
+ let forceSuffix = false;
1359
+ let isSelectionTable;
1360
+ task.ConfirmUpdateNo = false;
1361
+ if (rec == null)
1362
+ return false;
1363
+ forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1364
+ if ((rec.Modified || forceSuffix) && rec.getMode() === DataModificationTypes.Delete &&
1365
+ task.getMode() === Constants.TASK_MODE_DELETE)
1366
+ return true;
1367
+ if (task.getLevel() === Constants.TASK_LEVEL_TASK)
1368
+ return false;
1369
+ if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
1370
+ task.setInRecordSuffix(true);
1371
+ await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
1372
+ task.setInRecordSuffix(false);
1373
+ if (this._stopExecution)
1374
+ return false;
1375
+ }
1376
+ await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_SUFFIX);
1377
+ if (this._stopExecution)
1378
+ return false;
1379
+ Logger.Instance.WriteDevToLog('RECORD SUFFIX: ' + task.queryTaskPath());
1380
+ task.setLevel(Constants.TASK_LEVEL_TASK);
1381
+ isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
1382
+ if (task.getMode() === Constants.TASK_MODE_QUERY && !forceSuffix && !rec.Modified &&
1383
+ !isSelectionTable)
1384
+ return false;
1385
+ if (!rec.Modified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
1386
+ if (rec.getMode() === DataModificationTypes.Delete) {
1387
+ return await this.executeControlVerification(task);
1388
+ }
1389
+ return false;
1390
+ }
1391
+ if (task.getMode() !== Constants.TASK_MODE_DELETE && rec.Modified) {
1392
+ if (!await this.updateConfirmed(task))
1393
+ return false;
1394
+ }
1395
+ let stopExecution = !await this.executeControlVerification(task);
1396
+ if (stopExecution)
1397
+ return false;
1398
+ break;
1399
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
1400
+ if (await this.handleCtrlPrefix(evt))
1401
+ return true;
1402
+ else {
1403
+ evt.Control.InControl = false;
1404
+ return false;
1405
+ }
1406
+ case InternalInterface.MG_ACT_CANCEL:
1407
+ Manager.CleanMessagePane(task);
1408
+ break;
1409
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
1410
+ if (ctrl == null || this.getStopExecutionCtrl() != null)
1411
+ return false;
1412
+ if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL)
1413
+ return false;
1414
+ if (!ctrl.isSubform()) {
1415
+ val = Manager.GetCtrlVal(ctrl);
1416
+ task.CurrentEditingControl = null;
1417
+ if (!task.cancelWasRaised() &&
1418
+ (ctrl.Type !== MgControlType.CTRL_TYPE_BROWSER && (!isNullOrUndefined(ctrl._field) && (ctrl._field.getType() === StorageAttribute.DATE || ctrl._field.getType() == StorageAttribute.NUMERIC) || val !== null) && typeof val != 'undefined' &&
1419
+ !await ctrl.validateAndSetValue(val, true))) {
1420
+ this.setStopExecution(true);
1421
+ return false;
1422
+ }
1423
+ }
1424
+ if (!this._stopExecution)
1425
+ Manager.CleanMessagePane(task);
1426
+ ctrl.InControl = false;
1427
+ ctrl.ClipBoardDataExists = false;
1428
+ ctrl.ValidateControl = true;
1429
+ ctrl.setInControlSuffix(true);
1430
+ break;
1431
+ }
1432
+ }
1433
+ return true;
1434
+ }
1435
+ async selectProg(ctrl) {
1436
+ let cmd;
1437
+ let value;
1438
+ let mgVal;
1439
+ let progExecuted = false;
1440
+ let task = ctrl.getForm().getTask();
1441
+ if (ctrl.HasSelectProgram()) {
1442
+ if (ctrl.IsParkable()) {
1443
+ value = Manager.GetCtrlVal(ctrl);
1444
+ if (!ctrl.validateAndSetValue(value, false))
1445
+ this.setStopExecution(true);
1446
+ else {
1447
+ let encodedVal = null;
1448
+ mgVal = await ctrl.getMgValue(value);
1449
+ var rec = task.DataView.getCurrRec();
1450
+ encodedVal = rec.getXMLForValue(ctrl.getField().getId(), mgVal);
1451
+ cmd = CommandFactory.CreateSelectProgramCommand(task.getTaskTag(), null, Int32.MinValue, ctrl.getDitIdx(), encodedVal);
1452
+ task.getMGData().CmdsToServer.Add(cmd);
1453
+ let commandsProcessorServer = CommandsProcessorManager.GetCommandsProcessor();
1454
+ await commandsProcessorServer.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1455
+ progExecuted = true;
1456
+ }
1457
+ }
1458
+ }
1459
+ return progExecuted;
1460
+ }
1461
+ async executeControlVerification(task) {
1462
+ let table = task.getHandlersTab();
1463
+ for (let i = 0; i < table.getSize(); i++) {
1464
+ let handler = table.getHandler(i);
1465
+ let evt = handler.getEvent();
1466
+ if (evt.getInternalCode() === InternalInterface.MG_ACT_CTRL_VERIFICATION) {
1467
+ let control = ((task.getForm() !== null) ? task.getForm().getCtrlByCtrlName(handler.getCtrlName()) : null);
1468
+ if (!isNullOrUndefined(control)) {
1469
+ let runTimeEvent = new RunTimeEvent(control);
1470
+ runTimeEvent.setInternal(InternalInterface.MG_ACT_CTRL_VERIFICATION);
1471
+ await this.handleEvent(runTimeEvent, false);
1472
+ if (this._stopExecution) {
1473
+ LastFocusedManager.setLastFocusedControl(task, control);
1474
+ this.setStopExecutionCtrl(null);
1475
+ this.setStopExecutionCtrl(control);
1476
+ return false;
1477
+ }
1478
+ }
1479
+ }
1480
+ }
1481
+ return true;
1482
+ }
1483
+ async onActSelection(ctrl, form, evt) {
1484
+ let displayLine = evt.getDisplayLine();
1485
+ if (displayLine === Int32.MinValue)
1486
+ displayLine = form.DisplayLine;
1487
+ let simulate = ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || (ctrl.Type === MgControlType.CTRL_TYPE_TAB && !evt.isProduceClick());
1488
+ if (simulate)
1489
+ await this.simulateSelection(ctrl, evt.getValue(), displayLine, evt.isProduceClick());
1490
+ else
1491
+ await this.handleSelection(ctrl, displayLine, evt.getValue());
1492
+ }
1493
+ async onSubformClose(task, evt) {
1494
+ if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
1495
+ let subformCtrl = null;
1496
+ let closingSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
1497
+ if (closingSubformName == null)
1498
+ return;
1499
+ for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
1500
+ subformCtrl = parentTask.getForm().getCtrlByName(closingSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
1501
+ if (subformCtrl != null) {
1502
+ let subformTask = subformCtrl.getSubformTask();
1503
+ if (subformTask != null && !subformTask.IsRoute()) {
1504
+ {
1505
+ await this.performSubformClose(subformCtrl);
1506
+ }
1507
+ break;
1508
+ }
1509
+ }
1510
+ }
1511
+ }
1512
+ }
1513
+ async performSubformClose(subformCtrl) {
1514
+ let subformTask = subformCtrl.getSubformTask();
1515
+ let parentTask = subformCtrl.getForm().getTask();
1516
+ let mgd = subformTask.getMGData();
1517
+ this.pushNewExecStacks();
1518
+ await subformTask.endTask(true, false, false, true);
1519
+ this.popNewExecStacks();
1520
+ if (!this._stopExecution) {
1521
+ parentTask.TaskService.RemoveRecomputes(parentTask);
1522
+ await subformTask.stop();
1523
+ subformCtrl.resetSubformTask();
1524
+ await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1525
+ Commands.addClosesubform(CommandType.CLOSE_SUB_FORM, subformCtrl, subformTask.getTaskTag(), subformCtrl.getName(), subformTask.getForm().buildFormName());
1526
+ if (subformCtrl.IsModal())
1527
+ mgd.abort();
1528
+ }
1529
+ }
1530
+ createEventArguments(evt) {
1531
+ if (evt.getArgList() === null) {
1532
+ if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
1533
+ switch (evt.getInternalCode()) {
1534
+ default:
1535
+ break;
1536
+ }
1537
+ }
1538
+ }
1539
+ }
1540
+ async DoTaskLevelRecordSuffix(task, refDoSuffix) {
1541
+ let shouldReturn = false;
1542
+ if (task.getLevel() === Constants.TASK_LEVEL_RECORD) {
1543
+ refDoSuffix.value = false;
1544
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1545
+ if (this.GetStopExecutionFlag())
1546
+ shouldReturn = true;
1547
+ }
1548
+ return shouldReturn;
1549
+ }
1550
+ async DoTaskLevelRecordPrefix(task) {
1551
+ if (!this.GetStopExecutionFlag()) {
1552
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1553
+ }
1554
+ }
1555
+ async commonHandler(evt) {
1556
+ let task = evt.getTask();
1557
+ let mgData = task.getMGData();
1558
+ let form = task.getForm();
1559
+ let ctrl = evt.Control;
1560
+ let lastParkedCtrl;
1561
+ let doSuffix = true;
1562
+ let oldMode;
1563
+ let server = Task.CommandsProcessor;
1564
+ if (this._stopExecution)
1565
+ return;
1566
+ if (evt.getType() === ConstInterface.EVENT_TYPE_USER)
1567
+ evt = new RunTimeEvent(evt.getUserEvent(), evt);
1568
+ try {
1569
+ this.pushRtEvent(evt);
1570
+ if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
1571
+ let actId = this.getMatchingAction(evt.getKbdItm());
1572
+ if (actId !== 0) {
1573
+ evt = new RunTimeEvent(evt, evt);
1574
+ evt.setInternal(actId);
1575
+ evt.setArgList(null);
1576
+ }
1577
+ }
1578
+ let cmd;
1579
+ if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && !evt.isImmediate() && this.ActAllowed(evt.getInternalCode()) && !this._processingTopMostEndTask) {
1580
+ let cmdsToServer = mgData.CmdsToServer;
1581
+ let dv = task.DataView;
1582
+ let rec = dv.getCurrRec();
1583
+ let intEvtCode = evt.getInternalCode();
1584
+ switch (intEvtCode) {
1585
+ case InternalInterface.MG_ACT_SUBFORM_CLOSE:
1586
+ await this.onSubformClose(task, evt);
1587
+ break;
1588
+ case InternalInterface.MG_ACT_BUTTON:
1589
+ case InternalInterface.MG_ACT_CTRL_HIT:
1590
+ if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON &&
1591
+ (intEvtCode === InternalInterface.MG_ACT_BUTTON || !evt.isGuiTriggeredEvent() || ctrl.isParkable(true))) {
1592
+ let aRtEvt = new RunTimeEvent(ctrl);
1593
+ if (ctrl.getRtEvtTask() != null)
1594
+ aRtEvt.setTask(ctrl.getRtEvtTask());
1595
+ if (ConstInterface.EVENT_TYPE_NONE !== aRtEvt.getType()) {
1596
+ if (ctrl.useZoomHandler()) {
1597
+ let taskToEnable = aRtEvt.getTask();
1598
+ if (taskToEnable != null)
1599
+ taskToEnable.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
1600
+ }
1601
+ aRtEvt.setArgList(ctrl.ArgList);
1602
+ await aRtEvt.setPublicName();
1603
+ this.addToTail(aRtEvt);
1604
+ this.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
1605
+ }
1606
+ }
1607
+ else if (ctrl.Type === MgControlType.CTRL_TYPE_TAB) {
1608
+ this.addInternalEventWithCtrlAndCode(ctrl, InternalInterface.MG_ACT_ZOOM);
1609
+ }
1610
+ else if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO) {
1611
+ ctrl.setControlToFocus();
1612
+ }
1613
+ break;
1614
+ case InternalInterface.MG_ACT_TOGGLE_INSERT:
1615
+ RuntimeContextBase.Instance.ToggleInsertMode();
1616
+ break;
1617
+ case InternalInterface.MG_ACT_CLOSE:
1618
+ let rtEvt = new RunTimeEvent(evt, evt);
1619
+ rtEvt.setInternal(InternalInterface.MG_ACT_EXIT);
1620
+ this.addToTail(rtEvt);
1621
+ break;
1622
+ case InternalInterface.MG_ACT_EXIT:
1623
+ let taskToEnd = (task.isMainProg() ? MGDataCollection.Instance.StartupMgData.getFirstTask() : task);
1624
+ await taskToEnd.endTask(evt.reversibleExit(), false, evt.ExitDueToError());
1625
+ break;
1626
+ case InternalInterface.MG_ACT_EXIT_SYSTEM:
1627
+ await MGDataCollection.Instance.StartupMgData.getFirstTask().endTask(evt.reversibleExit(), false, false);
1628
+ break;
1629
+ case InternalInterface.MG_ACT_TBL_NXTLINE:
1630
+ if (form != null)
1631
+ await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_NEXT);
1632
+ break;
1633
+ case InternalInterface.MG_ACT_TBL_PRVLINE:
1634
+ if (form != null)
1635
+ await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_PREV);
1636
+ break;
1637
+ case InternalInterface.MG_ACT_TBL_NXTPAGE:
1638
+ if (form != null)
1639
+ await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
1640
+ break;
1641
+ case InternalInterface.MG_ACT_TBL_PRVPAGE:
1642
+ if (form != null)
1643
+ await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_PREV);
1644
+ break;
1645
+ case InternalInterface.MG_ACT_TBL_BEGPAGE:
1646
+ if (form != null)
1647
+ await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_BEGIN);
1648
+ break;
1649
+ case InternalInterface.MG_ACT_TBL_ENDPAGE:
1650
+ if (form != null)
1651
+ await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_END);
1652
+ break;
1653
+ case InternalInterface.MG_ACT_TBL_BEGTBL:
1654
+ lastParkedCtrl = task.getLastParkedCtrl();
1655
+ if (lastParkedCtrl == null || !lastParkedCtrl.isListBox()) {
1656
+ if (form != null)
1657
+ await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_BEGIN);
1658
+ }
1659
+ break;
1660
+ case InternalInterface.MG_ACT_TBL_ENDTBL:
1661
+ lastParkedCtrl = task.getLastParkedCtrl();
1662
+ if (lastParkedCtrl === null || !lastParkedCtrl.isListBox()) {
1663
+ if (form != null)
1664
+ await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_END);
1665
+ }
1666
+ break;
1667
+ case InternalInterface.MG_ACT_WEB_ON_DBLICK:
1668
+ {
1669
+ let ctrlType = ctrl.Type;
1670
+ let putAction = InternalInterface.MG_ACT_NONE;
1671
+ if (ctrlType !== MgControlType.CTRL_TYPE_TABLE && ctrlType !== MgControlType.CTRL_TYPE_LABEL &&
1672
+ ctrlType !== MgControlType.CTRL_TYPE_IMAGE) {
1673
+ if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_SELECT))
1674
+ putAction = InternalInterface.MG_ACT_SELECT;
1675
+ else {
1676
+ if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_ZOOM))
1677
+ putAction = InternalInterface.MG_ACT_ZOOM;
1678
+ }
1679
+ if (putAction !== InternalInterface.MG_ACT_NONE)
1680
+ this.addInternalEventWithCtrlAndCode(ctrl, putAction);
1681
+ }
1682
+ }
1683
+ break;
1684
+ case InternalInterface.MG_ACT_DELLINE:
1685
+ if (await this.HandleActionDelline(task, dv, rec, false))
1686
+ return;
1687
+ break;
1688
+ case InternalInterface.MG_ACT_CRELINE:
1689
+ case InternalInterface.MG_ACT_CRELINE_ABOVE:
1690
+ if (task.DataView.isEmptyDataview()) {
1691
+ await this.gotoCreateMode(task);
1692
+ break;
1693
+ }
1694
+ if (task.getInCreateLine())
1695
+ break;
1696
+ task.setInCreateLine(true);
1697
+ try {
1698
+ if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
1699
+ await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
1700
+ if (this.GetStopExecutionFlag())
1701
+ return;
1702
+ }
1703
+ if (task.getMode() === Constants.TASK_MODE_CREATE && rec != null && !rec.Modified) {
1704
+ if (await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
1705
+ doSuffix = false;
1706
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1707
+ if (this.GetStopExecutionFlag() || task.isAborting())
1708
+ return;
1709
+ }
1710
+ else {
1711
+ task.setLevel(Constants.TASK_LEVEL_TASK);
1712
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1713
+ if (!this.GetStopExecutionFlag() && form != null) {
1714
+ let lastParkedControl = task.getLastParkedCtrl();
1715
+ if (lastParkedControl !== null)
1716
+ await lastParkedControl.invoke();
1717
+ }
1718
+ return;
1719
+ }
1720
+ }
1721
+ let refDoSuffix = new RefParam(doSuffix);
1722
+ if (await this.DoTaskLevelRecordSuffix(task, refDoSuffix))
1723
+ return;
1724
+ doSuffix = refDoSuffix.value;
1725
+ if (form != null) {
1726
+ if ((task.getMode() !== Constants.TASK_MODE_CREATE) || !task.ConfirmUpdateNo)
1727
+ await form.addRec(doSuffix, intEvtCode == InternalInterface.MG_ACT_CRELINE_ABOVE ? true : false);
1728
+ }
1729
+ await this.DoTaskLevelRecordPrefix(task);
1730
+ await this.HandleActEnterRowEditing(task);
1731
+ }
1732
+ finally {
1733
+ task.setInCreateLine(false);
1734
+ }
1735
+ break;
1736
+ case InternalInterface.MG_ACT_CANCEL:
1737
+ await this.HandleActCancel(evt, task, form, ctrl, rec, true);
1738
+ break;
1739
+ case InternalInterface.MG_ACT_ENTER_ROW_EDITING:
1740
+ await this.HandleActEnterRowEditing(task);
1741
+ break;
1742
+ case InternalInterface.MG_ACT_RT_QUIT:
1743
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_QUIT);
1744
+ break;
1745
+ case InternalInterface.MG_ACT_RTO_CREATE:
1746
+ if (task.getMode() === Constants.TASK_MODE_CREATE ||
1747
+ await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) {
1748
+ await this.gotoCreateMode(task);
1749
+ }
1750
+ break;
1751
+ case InternalInterface.MG_ACT_RTO_QUERY:
1752
+ if (task.getMode() !== Constants.TASK_MODE_QUERY &&
1753
+ (await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
1754
+ break;
1755
+ await task.enableModes();
1756
+ oldMode = task.getOriginalTaskMode();
1757
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1758
+ if (!this.GetStopExecutionFlag()) {
1759
+ task.setMode(Constants.TASK_MODE_QUERY);
1760
+ if (oldMode !== Constants.TASK_MODE_CREATE) {
1761
+ await dv.currRecCompute(true);
1762
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1763
+ if (ctrl != null)
1764
+ await ctrl.invoke();
1765
+ await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1766
+ }
1767
+ else {
1768
+ task.setPreventRecordSuffix(true);
1769
+ task.setPreventControlChange(true);
1770
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
1771
+ if (ctrl != null)
1772
+ await ctrl.invoke();
1773
+ task.setPreventRecordSuffix(false);
1774
+ task.setPreventControlChange(false);
1775
+ if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
1776
+ task.setMode(Constants.TASK_MODE_QUERY);
1777
+ else
1778
+ task.setMode(Constants.TASK_MODE_CREATE);
1779
+ await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1780
+ }
1781
+ task.setOriginalTaskMode(Constants.TASK_MODE_QUERY);
1782
+ await task.setCreateDeleteActsEnableState();
1783
+ }
1784
+ break;
1785
+ case InternalInterface.MG_ACT_RTO_MODIFY:
1786
+ if (task.getMode() !== Constants.TASK_MODE_MODIFY &&
1787
+ (await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
1788
+ break;
1789
+ await task.enableModes();
1790
+ oldMode = task.getOriginalTaskMode();
1791
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1792
+ if (!this.GetStopExecutionFlag()) {
1793
+ task.setMode(Constants.TASK_MODE_MODIFY);
1794
+ if (oldMode !== Constants.TASK_MODE_CREATE) {
1795
+ await dv.currRecCompute(true);
1796
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1797
+ if (ctrl != null)
1798
+ await ctrl.invoke();
1799
+ }
1800
+ else {
1801
+ task.setPreventRecordSuffix(true);
1802
+ task.setPreventControlChange(true);
1803
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
1804
+ if (ctrl != null)
1805
+ await ctrl.invoke();
1806
+ task.setPreventRecordSuffix(false);
1807
+ task.setPreventControlChange(false);
1808
+ if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
1809
+ task.setMode(Constants.TASK_MODE_MODIFY);
1810
+ else
1811
+ task.setMode(Constants.TASK_MODE_CREATE);
1812
+ await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1813
+ }
1814
+ task.setOriginalTaskMode(Constants.TASK_MODE_MODIFY);
1815
+ await task.setCreateDeleteActsEnableState();
1816
+ }
1817
+ break;
1818
+ case InternalInterface.MG_ACT_SELECT:
1819
+ try {
1820
+ task.InSelect = true;
1821
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1822
+ }
1823
+ finally {
1824
+ task.InSelect = false;
1825
+ }
1826
+ if (!this._stopExecution) {
1827
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
1828
+ }
1829
+ break;
1830
+ case InternalInterface.MG_ACT_SUBFORM_REFRESH:
1831
+ if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
1832
+ let subformCtrl = null;
1833
+ let RefreshedSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
1834
+ if (RefreshedSubformName == null)
1835
+ break;
1836
+ for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
1837
+ subformCtrl = parentTask.getForm().getCtrlByName(RefreshedSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
1838
+ if (subformCtrl != null) {
1839
+ let subformTask = subformCtrl.getSubformTask();
1840
+ if (subformTask == null) {
1841
+ if (await (subformCtrl.getProp(PropInterface.PROP_TYPE_SUBFORM_TYPE)).getValueInt() !== SubformType.None)
1842
+ await this.OpenSubform(parentTask, subformCtrl);
1843
+ }
1844
+ else
1845
+ await parentTask.SubformRefresh(subformTask, true);
1846
+ break;
1847
+ }
1848
+ }
1849
+ }
1850
+ else if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 2)) {
1851
+ let subformTask = task, parentTask;
1852
+ let taskTag = await evt.getArgList().getArgValue(1, StorageAttribute.NUMERIC, 0);
1853
+ while (subformTask.IsSubForm) {
1854
+ parentTask = subformTask.getParent();
1855
+ if (subformTask.getTaskTag() === taskTag) {
1856
+ await parentTask.SubformRefresh(subformTask, true);
1857
+ break;
1858
+ }
1859
+ subformTask = parentTask;
1860
+ }
1861
+ }
1862
+ break;
1863
+ case InternalInterface.MG_ACT_SUBFORM_OPEN:
1864
+ await this.OpenSubform(task, evt.Control);
1865
+ break;
1866
+ case InternalInterface.MG_ACT_RTO_SEARCH:
1867
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1868
+ if (!this.GetStopExecutionFlag()) {
1869
+ cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
1870
+ task.getTaskCache().clearCache();
1871
+ await task.DataviewManager.Execute(cmd);
1872
+ if (!form.isScreenMode()) {
1873
+ dv.setTopRecIdx(0);
1874
+ if (form.HasTable()) {
1875
+ await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
1876
+ }
1877
+ }
1878
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1879
+ if (ctrl != null)
1880
+ await ctrl.invoke();
1881
+ }
1882
+ break;
1883
+ case InternalInterface.MG_ACT_RT_REFRESH_SCREEN:
1884
+ case InternalInterface.MG_ACT_RT_REFRESH_VIEW:
1885
+ case InternalInterface.MG_ACT_RT_REFRESH_RECORD:
1886
+ await this.handleRefreshEvents(evt);
1887
+ break;
1888
+ case InternalInterface.MG_ACT_ACT_CLOSE_APPL:
1889
+ cmd =
1890
+ CommandFactory.CreateEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag(), InternalInterface.MG_ACT_BROWSER_ESC);
1891
+ cmdsToServer.Add(cmd);
1892
+ await server.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1893
+ break;
1894
+ case InternalInterface.MG_ACT_CONTEXT_REMOVE:
1895
+ let currRecord = LastFocusedManager.Instance.getLastFocusedTask().DataView.getCurrRec();
1896
+ if (ClientManager.TransCacheExists() || (currRecord != null && currRecord.Modified)) {
1897
+ console.log('Pending transaction/record is modified, discarded \'Context Remove\' event.');
1898
+ }
1899
+ else {
1900
+ if (Environment.Instance.getClientContextInactivityTimeout() > 0) {
1901
+ await this.ExecuteClientContextInactivityTimer();
1902
+ }
1903
+ if (!EventsManager.clientContextInactivityTimerAborted) {
1904
+ let contextTerminationEventCommand = CommandFactory.CreateContextTerminationEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag());
1905
+ MGDataCollection.Instance.getCurrMGData().CmdsToServer.Add(contextTerminationEventCommand);
1906
+ RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
1907
+ console.log('Removed context from server');
1908
+ RuntimeContextBase.Instance.RemovingContextFromServer = true;
1909
+ }
1910
+ else {
1911
+ console.log('Discarded \'Context Remove\' event as user event occurred.');
1912
+ EventsManager.clientContextInactivityTimerAborted = false;
1913
+ break;
1914
+ }
1915
+ }
1916
+ break;
1917
+ case InternalInterface.MG_ACT_SERVER_TERMINATION:
1918
+ case InternalInterface.MG_ACT_DUMP_ENVIRONMENT:
1919
+ cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
1920
+ cmdsToServer.Add(cmd);
1921
+ await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1922
+ break;
1923
+ case InternalInterface.MG_ACT_RT_EDT_NULL:
1924
+ if (this._currField != null && this._currField.NullAllowed) {
1925
+ await this._currField.setValueAndStartRecompute(this._currField.getMagicDefaultValue(), true, true, true, false);
1926
+ await this._currField.updateDisplay();
1927
+ }
1928
+ break;
1929
+ case InternalInterface.MG_ACT_ROLLBACK:
1930
+ await EventsManager.HandleRollbackAction(task, cmdsToServer, RollbackEventCommand_RollbackType.ROLLBACK);
1931
+ break;
1932
+ case InternalInterface.MG_ACT_OK:
1933
+ case InternalInterface.MG_ACT_INDEX_CHANGE:
1934
+ case InternalInterface.MG_ACT_COL_SORT:
1935
+ if ((intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE && task.DataviewManager.HasRemoteData) ||
1936
+ (intEvtCode === InternalInterface.MG_ACT_COL_SORT && ctrl.getField() != null)) {
1937
+ let lastFocusedTask = LastFocusedManager.Instance.getLastFocusedTask();
1938
+ let focusedCtrl = LastFocusedManager.getLastFocusedControl(LastFocusedManager.LastFocusMgdID);
1939
+ if (focusedCtrl != null)
1940
+ await this.handleInternalEventWithMgControlBase(focusedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
1941
+ if (!this.GetStopExecutionFlag())
1942
+ await task.ExecuteNestedRS(lastFocusedTask);
1943
+ if (!this.GetStopExecutionFlag() && task.getLevel() !== Constants.TASK_LEVEL_TASK)
1944
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
1945
+ if (!this.GetStopExecutionFlag()) {
1946
+ task.getTaskCache().clearCache();
1947
+ if (intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE) {
1948
+ let taskForm = task.getForm();
1949
+ if (taskForm.HasTable())
1950
+ form.clearTableColumnSortMark(true);
1951
+ cmd = await CommandFactory.CreateIndexChangeCommand(task.getTaskTag(), task.DataView.GetCurrentRecId(), evt.getArgList());
1952
+ }
1953
+ else {
1954
+ cmd = CommandFactory.CreateColumnSortCommand(task.getTaskTag(), evt.Direction, ctrl.getDitIdx(), ctrl.getField().getId(), task.DataView.GetCurrentRecId());
1955
+ }
1956
+ await task.DataviewManager.Execute(cmd);
1957
+ dv.setTopRecIdx(0);
1958
+ await form.restoreOldDisplayLine(0);
1959
+ if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask()))) {
1960
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1961
+ if (!this.GetStopExecutionFlag() && !task.getPreventControlChange())
1962
+ await lastFocusedTask.ExecuteNestedRS(task);
1963
+ if (!this.GetStopExecutionFlag() && focusedCtrl != null)
1964
+ await focusedCtrl.invoke();
1965
+ }
1966
+ else
1967
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
1968
+ }
1969
+ }
1970
+ break;
1971
+ case InternalInterface.MG_ACT_COL_CLICK:
1972
+ if (!this.GetStopExecutionFlag() && evt.isGuiTriggeredEvent() && ctrl.isColumnSortable()) {
1973
+ let columnChildControl = ctrl.getColumnChildControl();
1974
+ if (columnChildControl != null) {
1975
+ let aRtEvt = new RunTimeEvent(columnChildControl, evt.Direction, 0);
1976
+ aRtEvt.setInternal(InternalInterface.MG_ACT_COL_SORT);
1977
+ this.addToTail(aRtEvt);
1978
+ }
1979
+ }
1980
+ break;
1981
+ }
1982
+ }
1983
+ }
1984
+ finally {
1985
+ this.popRtEvent();
1986
+ }
1987
+ }
1988
+ async HandleActEnterRowEditing(task) {
1989
+ if (task.getMode() === Constants.TASK_MODE_QUERY)
1990
+ task.WriteToMessagePane(`Cannot enter Row Editing when in Query Mode.`);
1991
+ else {
1992
+ let myform = task.getForm();
1993
+ await myform.startRowEditing(myform.DisplayLine);
1994
+ }
1995
+ }
1996
+ async HandleStopRowEditing(task) {
1997
+ let myform = task.getForm();
1998
+ await myform.stopRowEditing(myform.DisplayLine);
1999
+ }
2000
+ async OpenSubform(task, subformControl) {
2001
+ task.TaskService.RemoveRecomputes(task);
2002
+ let cmd = CommandFactory.CreateSubformOpenCommand(task.getTaskTag(), subformControl.getDitIdx());
2003
+ task.getMGData().CmdsToServer.Add(cmd);
2004
+ await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
2005
+ }
2006
+ static async HandleRollbackAction(task, cmdsToServer, rollbackType) {
2007
+ let commandsProcessor = Task.CommandsProcessor;
2008
+ ClientRefreshCommand.ClientIsInRollbackCommand = true;
2009
+ task = task.TaskService.GetOwnerTransactionTask(task);
2010
+ let cmd = CommandFactory.CreateRollbackEventCommand(task.getTaskTag(), rollbackType);
2011
+ cmdsToServer.Add(cmd);
2012
+ await commandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
2013
+ ClientRefreshCommand.ClientIsInRollbackCommand = false;
2014
+ }
2015
+ async HandleActCancel(evt, task, form, ctrl, rec, isMG_ACT_CANCEL) {
2016
+ if (task.InHandleActCancel)
2017
+ return;
2018
+ task.InHandleActCancel = true;
2019
+ let oldMode = task.getMode();
2020
+ let saveDisplayLine = task.getForm().DisplayLine;
2021
+ if (oldMode !== Constants.TASK_MODE_QUERY && !rec.Updated) {
2022
+ if (isMG_ACT_CANCEL) {
2023
+ if (rec.Modified || (task.getLastParkedCtrl() !== null && task.getLastParkedCtrl().ModifiedByUser)) {
2024
+ if (await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_CANCEL, false)) {
2025
+ let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_CANCEL);
2026
+ if (!confirmed) {
2027
+ task.InHandleActCancel = false;
2028
+ return;
2029
+ }
2030
+ }
2031
+ }
2032
+ }
2033
+ let oldRecMode = rec.getMode();
2034
+ if (GuiEnvironment.Environment.GetSpecialCancelOnCreate() && task.getMode() == Constants.TASK_MODE_CREATE
2035
+ && task.getOriginalTaskMode() == Constants.TASK_MODE_CREATE) {
2036
+ let enable = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
2037
+ if (enable) {
2038
+ let allowEmptyDataView = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true);
2039
+ if (task.DataView.getSize() == 1 && allowEmptyDataView) {
2040
+ task.setMode('M');
2041
+ task.DataView.setEmptyDataview(true);
2042
+ }
2043
+ }
2044
+ }
2045
+ if (isMG_ACT_CANCEL) {
2046
+ if (task.isTransactionOnLevel(ConstInterface.TRANS_RECORD_PREFIX) && evt.RollbackInCancel()) {
2047
+ await EventsManager.HandleRollbackAction(task, task.getMGData().CmdsToServer, RollbackEventCommand_RollbackType.CANCEL);
2048
+ }
2049
+ }
2050
+ await EventsManager.HandleCancelEdit(evt, task, form, rec, oldRecMode);
2051
+ }
2052
+ else {
2053
+ task.setLevel(Constants.TASK_LEVEL_TASK);
2054
+ let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
2055
+ if (lastFocusedControl !== null) {
2056
+ lastFocusedControl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
2057
+ }
2058
+ if (!evt.isQuit()) {
2059
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2060
+ await this.HandleParkabilityOnRowChange(task);
2061
+ }
2062
+ }
2063
+ if (evt.isQuit())
2064
+ await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_EXIT);
2065
+ await form.stopRowEditing(saveDisplayLine);
2066
+ task.InHandleActCancel = false;
2067
+ }
2068
+ static async HandleCancelEdit(evt, task, form, rec, oldRecMode) {
2069
+ if (rec.Synced && oldRecMode === DataModificationTypes.Insert)
2070
+ rec.setMode(oldRecMode);
2071
+ if (form !== null) {
2072
+ if (task.getLastParkedCtrl() !== null)
2073
+ task.getLastParkedCtrl().resetPrevVal();
2074
+ await form.cancelEdit(true, evt.isQuit());
2075
+ }
2076
+ }
2077
+ async HandleActionDelline(task, dv, rec, nonInteractiveDelete) {
2078
+ let lastParkedCtrl;
2079
+ let myform = task.getForm();
2080
+ let saveIsRowEditing = myform.getIsRowEditingFromGui(myform.DisplayLine);
2081
+ let oldRecMode;
2082
+ if (await task.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true)) {
2083
+ lastParkedCtrl = task.getLastParkedCtrl();
2084
+ if (lastParkedCtrl !== null)
2085
+ await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
2086
+ if (!this.GetStopExecutionFlag()) {
2087
+ oldRecMode = rec.getMode();
2088
+ rec.clearMode();
2089
+ rec.setMode(DataModificationTypes.Delete);
2090
+ if (oldRecMode === DataModificationTypes.Insert)
2091
+ rec.setSendToServer(false);
2092
+ if (rec.Modified || await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
2093
+ task.setMode(Constants.TASK_MODE_MODIFY);
2094
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2095
+ if (this._stopExecution) {
2096
+ if (!rec.SendToServer) {
2097
+ await dv.addCurrToModified();
2098
+ rec.setSendToServer(true);
2099
+ }
2100
+ rec.clearMode();
2101
+ rec.setMode(oldRecMode);
2102
+ this.setStopExecution(false);
2103
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2104
+ this.setStopExecution(true);
2105
+ return true;
2106
+ }
2107
+ }
2108
+ rec.setInDeleteProcess(true);
2109
+ task.setMode(Constants.TASK_MODE_DELETE);
2110
+ let skipConfirmDialog = nonInteractiveDelete;
2111
+ if (!skipConfirmDialog) {
2112
+ if (task.mustConfirmInDeleteMode() || await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false)) {
2113
+ let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_DELETE);
2114
+ if (!confirmed) {
2115
+ rec.clearMode();
2116
+ rec.setMode(oldRecMode);
2117
+ task.setMode(Constants.TASK_MODE_MODIFY);
2118
+ if (lastParkedCtrl !== null)
2119
+ await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_PREFIX);
2120
+ if (saveIsRowEditing) {
2121
+ let myform = task.getForm();
2122
+ await myform.startRowEditing(myform.DisplayLine);
2123
+ }
2124
+ return true;
2125
+ }
2126
+ }
2127
+ }
2128
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2129
+ rec.setInDeleteProcess(false);
2130
+ if (this._stopExecution) {
2131
+ if (!rec.SendToServer) {
2132
+ await dv.addCurrToModified();
2133
+ rec.setSendToServer(true);
2134
+ }
2135
+ rec.clearMode();
2136
+ rec.setMode(oldRecMode);
2137
+ this.setStopExecution(false);
2138
+ task.setMode(Constants.TASK_MODE_MODIFY);
2139
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2140
+ this.setStopExecution(true);
2141
+ return true;
2142
+ }
2143
+ if (oldRecMode === DataModificationTypes.Insert) {
2144
+ rec.clearMode();
2145
+ rec.setMode(oldRecMode);
2146
+ }
2147
+ let newCurrRec = dv.getCurrRec();
2148
+ try {
2149
+ if (rec !== newCurrRec)
2150
+ await dv.setCurrRec(rec.getId(), false);
2151
+ if (!task.isAborting())
2152
+ await this.delCurrRec(task, false);
2153
+ }
2154
+ finally {
2155
+ if (rec !== newCurrRec) {
2156
+ await dv.setCurrRec(newCurrRec.getId(), false);
2157
+ if (dv.getSize() === 1)
2158
+ task.setMode(Constants.TASK_MODE_CREATE);
2159
+ }
2160
+ if (nonInteractiveDelete)
2161
+ task.setMode(Constants.TASK_MODE_DELETE);
2162
+ }
2163
+ }
2164
+ }
2165
+ return false;
2166
+ }
2167
+ async handleRefreshEvents(evt) {
2168
+ let task = evt.getTask();
2169
+ let form = task.getForm();
2170
+ let dv = task.DataView;
2171
+ let intEvtCode = evt.getInternalCode();
2172
+ let cmd = null;
2173
+ if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD)
2174
+ this._isInRecordFlushEvent = true;
2175
+ if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && task.getMode() === Constants.TASK_MODE_CREATE && !await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true)) {
2176
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
2177
+ }
2178
+ else {
2179
+ await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
2180
+ if (!this.GetStopExecutionFlag()) {
2181
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2182
+ }
2183
+ if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
2184
+ if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN) {
2185
+ let currentRow = 0;
2186
+ if (!evt.getRefreshType()) {
2187
+ if (evt.RtViewRefreshUseCurrentRow() && task.IsInteractive) {
2188
+ currentRow = form.getCurrRecPosInForm();
2189
+ }
2190
+ cmd = CommandFactory.CreateInternalRefreshCommand(task.getTaskTag(), intEvtCode, dv.CurrentRecId, currentRow);
2191
+ }
2192
+ else {
2193
+ if (task.IsInteractive)
2194
+ currentRow = form.getCurrRecPosInForm();
2195
+ let refetchRecord = true;
2196
+ if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && evt.getArgList() !== null && evt.getArgList().getSize() !== 0) {
2197
+ let refetchRecStr;
2198
+ refetchRecStr = await evt.getArgList().getArgValue(0, StorageAttribute.BOOLEAN, 0);
2199
+ refetchRecord = (isNullOrUndefined(refetchRecStr) || refetchRecStr === '1');
2200
+ }
2201
+ if (refetchRecord)
2202
+ cmd = await CommandFactory.CreateRealRefreshCommand(task.getTaskTag(), intEvtCode, currentRow, evt.getArgList(), dv.CurrentRecId);
2203
+ }
2204
+ }
2205
+ else {
2206
+ let id;
2207
+ if (task.getForm() === null)
2208
+ id = 0;
2209
+ else if (task.getForm().isScreenMode())
2210
+ id = (task.DataView.getCurrRec()).getId();
2211
+ else
2212
+ id = task.DataView.getRecByIdx(task.DataView.getTopRecIdx()).getId();
2213
+ cmd = CommandFactory.CreateScreenRefreshCommand(task.getTaskTag(), id, dv.CurrentRecId);
2214
+ }
2215
+ if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN)
2216
+ task.getTaskCache().clearCache();
2217
+ if (cmd !== null)
2218
+ await task.DataviewManager.Execute(cmd);
2219
+ this._isInRecordFlushEvent = false;
2220
+ if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
2221
+ if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && !form.isScreenMode()) {
2222
+ dv.setTopRecIdx(0);
2223
+ if (form.HasTable()) {
2224
+ form.clearTableColumnSortMark(true);
2225
+ await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
2226
+ }
2227
+ }
2228
+ if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
2229
+ if (task.getMode() === Constants.TASK_MODE_CREATE) {
2230
+ task.setMode(Constants.TASK_MODE_MODIFY);
2231
+ (task.DataView.getCurrRec()).setOldRec();
2232
+ }
2233
+ await dv.currRecCompute(true);
2234
+ }
2235
+ else if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_SCREEN && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
2236
+ await dv.currRecCompute(true);
2237
+ }
2238
+ this.setIsInViewRefresh(true);
2239
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2240
+ if (!this.GetStopExecutionFlag() && !task.getPreventControlChange()) {
2241
+ if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask())))
2242
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2243
+ }
2244
+ }
2245
+ }
2246
+ }
2247
+ }
2248
+ async gotoCreateMode(task) {
2249
+ let cmd;
2250
+ await task.enableModes();
2251
+ await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
2252
+ if (!this.GetStopExecutionFlag())
2253
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2254
+ if (!this.GetStopExecutionFlag()) {
2255
+ cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
2256
+ await task.DataviewManager.Execute(cmd);
2257
+ if (task.getLevel() === Constants.TASK_LEVEL_TASK)
2258
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2259
+ await this.HandleNonParkableControls(task);
2260
+ await task.setCreateDeleteActsEnableState();
2261
+ task.setOriginalTaskMode(Constants.TASK_MODE_CREATE);
2262
+ await this.HandleActEnterRowEditing(task);
2263
+ }
2264
+ }
2265
+ async commonHandlerAfter(evt, rcBefore) {
2266
+ let task = evt.getTask();
2267
+ let dv;
2268
+ let rec = null;
2269
+ let ctrl;
2270
+ let recModified = false;
2271
+ let recModeIsDelete = false;
2272
+ let forceSuffix;
2273
+ if (this._stopExecution && evt.getInternalCode() !== InternalInterface.MG_ACT_REC_SUFFIX && evt.getInternalCode() !== InternalInterface.MG_ACT_CTRL_SUFFIX)
2274
+ return;
2275
+ if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
2276
+ dv = task.DataView;
2277
+ rec = dv.getCurrRec();
2278
+ ctrl = evt.Control;
2279
+ switch (evt.getInternalCode()) {
2280
+ case InternalInterface.MG_ACT_REC_PREFIX:
2281
+ if (rcBefore) {
2282
+ if (await task.CheckRefreshSubTasks())
2283
+ await task.doSubformRecPrefixSuffix();
2284
+ await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
2285
+ await task.enableModes();
2286
+ }
2287
+ break;
2288
+ case InternalInterface.MG_ACT_REC_SUFFIX:
2289
+ task.isFirstRecordCycle(false);
2290
+ if (task.getPreventRecordSuffix()) {
2291
+ task.setPreventRecordSuffix(false);
2292
+ return;
2293
+ }
2294
+ task.DoSubformPrefixSuffix = false;
2295
+ if (this._stopExecution) {
2296
+ if (rec.getMode() === DataModificationTypes.Delete)
2297
+ rec.clearMode();
2298
+ if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL) {
2299
+ let last = this.getStopExecutionCtrl();
2300
+ if (last === null)
2301
+ last = task.getLastParkedCtrl();
2302
+ this.setStopExecution(false);
2303
+ this.setStopExecutionCtrl(null);
2304
+ if (last != null) {
2305
+ task.setLevel(Constants.TASK_LEVEL_RECORD);
2306
+ let inCtrlPrefix = task.InCtrlPrefix;
2307
+ task.InCtrlPrefix = false;
2308
+ await this.handleInternalEventWithMgControlBase(last, InternalInterface.MG_ACT_CTRL_PREFIX);
2309
+ task.InCtrlPrefix = inCtrlPrefix;
2310
+ }
2311
+ this.setStopExecution(true);
2312
+ }
2313
+ return;
2314
+ }
2315
+ else {
2316
+ await this.HandleStopRowEditing(task);
2317
+ }
2318
+ if (rec != null) {
2319
+ recModified = rec.Modified;
2320
+ if (!this._stopExecution && rec.isCauseInvalidation()) {
2321
+ task.getForm().invalidateTable();
2322
+ rec.setCauseInvalidation(false);
2323
+ }
2324
+ recModeIsDelete = (rec.getMode() === DataModificationTypes.Delete);
2325
+ forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
2326
+ if (recModeIsDelete && task.getMode() === Constants.TASK_MODE_DELETE ||
2327
+ !recModeIsDelete && !rec.inDeleteProcess() && (recModified || forceSuffix)) {
2328
+ rec.setMode(DataModificationTypes.Update);
2329
+ await dv.addCurrToModified();
2330
+ dv.setChanged(true);
2331
+ if (recModified && task.getMode() === Constants.TASK_MODE_QUERY) {
2332
+ if (rec.realModified() &&
2333
+ !Environment.Instance.allowUpdateInQueryMode(task.getCompIdx())) {
2334
+ await dv.cancelEdit(EventsManager.REAL_ONLY, false);
2335
+ task.WriteToMessagePanebyMsgId(MsgInterface.RT_STR_UPDATE_IN_QUERY);
2336
+ await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
2337
+ }
2338
+ }
2339
+ }
2340
+ if (!this.isForceExitPreRecordUpdate(task) &&
2341
+ (!task.isAborting() || MGDataCollection.Instance.GetTaskByID(task.getTaskTag()) != null)) {
2342
+ if ((!recModeIsDelete || task.getMode() === Constants.TASK_MODE_DELETE))
2343
+ await this.commitRecord(task, evt.reversibleExit());
2344
+ }
2345
+ if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
2346
+ if ((rec.getMode() === DataModificationTypes.Delete &&
2347
+ task.getMode() === Constants.TASK_MODE_DELETE) ||
2348
+ rec.getMode() !== DataModificationTypes.Delete)
2349
+ if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
2350
+ await task.endTask(true, false, false);
2351
+ }
2352
+ }
2353
+ break;
2354
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
2355
+ if (rcBefore) {
2356
+ if (await ctrl.IsParkable() || ctrl === LastFocusedManager.getLastFocusedControl()) {
2357
+ ctrl.InControl = true;
2358
+ if (ctrl.ShouldRefreshOnControlEnter())
2359
+ await ctrl.getField().updateDisplay();
2360
+ task.setLastParkedCtrl(ctrl);
2361
+ RuntimeContextBase.Instance.CurrentClickedCtrl = null;
2362
+ await ctrl.SetFocus(ctrl, ctrl.getDisplayLine(false), true);
2363
+ this.setStopExecutionCtrl(null);
2364
+ MgControl.ReturnToCtrl = ctrl;
2365
+ task.InCtrlPrefix = false;
2366
+ }
2367
+ else {
2368
+ task.InCtrlPrefix = false;
2369
+ await this.HandleNonParkableControls(ctrl.getForm().getTask());
2370
+ }
2371
+ }
2372
+ break;
2373
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
2374
+ if (!this.GetStopExecutionFlag()) {
2375
+ if (ctrl.isChoiceControl()) {
2376
+ ctrl.SetKeyboardLanguage();
2377
+ }
2378
+ if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
2379
+ task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, false);
2380
+ if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
2381
+ task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
2382
+ task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, false);
2383
+ }
2384
+ if (rcBefore) {
2385
+ if (this.GetStopExecutionFlag()) {
2386
+ ctrl.InControl = true;
2387
+ return;
2388
+ }
2389
+ let fld = ctrl.getField();
2390
+ if (fld != null && (ctrl.Type === MgControlType.CTRL_TYPE_TEXT))
2391
+ await fld.updateDisplay();
2392
+ task.setLevel(Constants.TASK_LEVEL_RECORD);
2393
+ ctrl.setInControlSuffix(false);
2394
+ ctrl.IsInteractiveUpdate = false;
2395
+ if (ctrl.PropertyExists(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS))
2396
+ await ctrl.getProp(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS).RefreshDisplay(true);
2397
+ ctrl.ValidateControl = false;
2398
+ LastFocusedManager.setLastFocusedControl(task, null);
2399
+ if (await task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE))
2400
+ await task.endTask(true, false, false);
2401
+ }
2402
+ break;
2403
+ case InternalInterface.MG_ACT_TASK_PREFIX:
2404
+ task.setLevel(Constants.TASK_LEVEL_TASK);
2405
+ break;
2406
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
2407
+ task.setLevel(Constants.TASK_LEVEL_NONE);
2408
+ break;
2409
+ case InternalInterface.MG_ACT_CYCLE_NEXT_REC:
2410
+ let form = task.getForm();
2411
+ if (!task.isMainProg() && form != null) {
2412
+ await form.moveInView(form.isLineMode()
2413
+ ? Constants.MOVE_UNIT_ROW
2414
+ : Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
2415
+ if (task.getExecEndTask())
2416
+ await task.endTask(true, false, false);
2417
+ }
2418
+ break;
2419
+ case InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC:
2420
+ if (task.DataView.isEmptyDataview())
2421
+ (task).setExecEndTask();
2422
+ else
2423
+ await this.HandleActionDelline(task, dv, rec, true);
2424
+ if (task.getExecEndTask())
2425
+ await task.endTask(true, false, false);
2426
+ break;
2427
+ case InternalInterface.MG_ACT_SET_EXTERNAL_VALUE:
2428
+ let refreshDisplay = await evt.getArgList().getArgValue(1, StorageAttribute.BOOLEAN, 0) === '1' ? true : false;
2429
+ await ctrl.validateAndSetValueIfAllowed(evt.getValue(), refreshDisplay);
2430
+ break;
2431
+ }
2432
+ }
2433
+ }
2434
+ async handleNonReversibleEvent(task, eventCode) {
2435
+ let rtEvt = new RunTimeEvent(task);
2436
+ let exitCommand = (eventCode === InternalInterface.MG_ACT_EXIT || eventCode === InternalInterface.MG_ACT_CLOSE);
2437
+ rtEvt.setInternal(eventCode);
2438
+ if (exitCommand)
2439
+ this._isNonReversibleExit = true;
2440
+ try {
2441
+ rtEvt.setNonReversibleExit();
2442
+ rtEvt.setCtrl(task.getLastParkedCtrl());
2443
+ rtEvt.setArgList(null);
2444
+ await this.handleEvent(rtEvt, false);
2445
+ }
2446
+ finally {
2447
+ if (exitCommand)
2448
+ this._isNonReversibleExit = false;
2449
+ }
2450
+ }
2451
+ async handleInternalEventWithTaskAndEventSubtype(task, eventCode, eventSubType) {
2452
+ let lastParkedCtrl = task.getLastParkedCtrl();
2453
+ let rtEvt;
2454
+ if (eventCode < InternalInterface.MG_ACT_TOT_CNT && task != null && !(eventSubType === EventSubType.CancelIsQuit) && !task.ActionManager.isEnabled(eventCode))
2455
+ return;
2456
+ if (lastParkedCtrl !== null)
2457
+ await this.handleInternalEventWithMgControl(lastParkedCtrl, eventCode, eventSubType);
2458
+ else {
2459
+ if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
2460
+ await this.handleInternalEventWithTaskAndEventSubtype(task, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
2461
+ else {
2462
+ rtEvt = new RunTimeEvent(task);
2463
+ rtEvt.setInternal(eventCode);
2464
+ rtEvt.SetEventSubType(eventSubType);
2465
+ if (InternalInterface.BuiltinEvent(eventCode))
2466
+ await this.handleEvent(rtEvt, false);
2467
+ else
2468
+ await this.commonHandler(rtEvt);
2469
+ }
2470
+ }
2471
+ }
2472
+ async handleInternalEventWithMgControl(ctrl, eventCode, eventSubType) {
2473
+ let rtEvt;
2474
+ if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
2475
+ await this.handleInternalEventWithMgControl(ctrl, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
2476
+ else {
2477
+ rtEvt = new RunTimeEvent(ctrl);
2478
+ rtEvt.setInternal(eventCode);
2479
+ rtEvt.SetEventSubType(eventSubType);
2480
+ if (eventCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW)
2481
+ rtEvt.setIsRealRefresh(false);
2482
+ if (InternalInterface.BuiltinEvent(eventCode))
2483
+ await this.handleEvent(rtEvt, false);
2484
+ else
2485
+ await this.commonHandler(rtEvt);
2486
+ }
2487
+ }
2488
+ getCurrField() {
2489
+ return this._currField;
2490
+ }
2491
+ getCurrCtrl() {
2492
+ return this._currCtrl;
2493
+ }
2494
+ getCurrTask() {
2495
+ if (this._currField == null)
2496
+ return null;
2497
+ return this._currField.getTask();
2498
+ }
2499
+ setStopExecution(stop, clearEventsOnStopExecution) {
2500
+ if (arguments.length === 1)
2501
+ this.setStopExecution_0(stop);
2502
+ else
2503
+ this.setStopExecution_1(stop, clearEventsOnStopExecution);
2504
+ }
2505
+ setStopExecution_0(stop) {
2506
+ this.setStopExecution(stop, ClearEventsOnStopExecution.ALL);
2507
+ }
2508
+ setStopExecution_1(stop, clearEventsOnStopExecution) {
2509
+ if (stop)
2510
+ if (clearEventsOnStopExecution == ClearEventsOnStopExecution.ALL)
2511
+ this._eventsQueue.clear();
2512
+ else if (clearEventsOnStopExecution == ClearEventsOnStopExecution.SERVER) {
2513
+ let tmpVec = new List();
2514
+ let rtEvt;
2515
+ let i;
2516
+ while (!this._eventsQueue.isEmpty()) {
2517
+ rtEvt = this._eventsQueue.poll();
2518
+ if (rtEvt.isFromServer()) {
2519
+ rtEvt.resetFromServer();
2520
+ tmpVec.push(rtEvt);
2521
+ }
2522
+ }
2523
+ for (i = 0; i < tmpVec.length; i++)
2524
+ this._eventsQueue.put(tmpVec.get_Item(i));
2525
+ }
2526
+ this._stopExecution = stop;
2527
+ }
2528
+ setStopExecutionCtrl(ctrl) {
2529
+ if (this._stopExecutionCtrl === null || ctrl === null)
2530
+ this._stopExecutionCtrl = ctrl;
2531
+ }
2532
+ async delCurrRec(task, inForceDel) {
2533
+ let dv = task.DataView;
2534
+ task.setMode(Constants.TASK_MODE_MODIFY);
2535
+ await task.getForm().delCurrRec();
2536
+ if (!task.DataView.isEmptyDataview()) {
2537
+ if (dv.getCurrRecIdx() >= 0) {
2538
+ if ((dv.getCurrRec()).getMode() !== DataModificationTypes.Delete && !inForceDel) {
2539
+ let ctrl = task.getLastParkedCtrl();
2540
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2541
+ if (!this.GetStopExecutionFlag())
2542
+ if (ctrl === null)
2543
+ await this.HandleNonParkableControls(task);
2544
+ else
2545
+ await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
2546
+ }
2547
+ }
2548
+ else if (!task.getInCreateLine())
2549
+ await this.handleNonReversibleEvent(task, InternalInterface.MG_ACT_EXIT);
2550
+ }
2551
+ else {
2552
+ await this.HandleNonParkableControls(task);
2553
+ await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
2554
+ }
2555
+ }
2556
+ async updateConfirmed(task) {
2557
+ let confirm;
2558
+ let answer;
2559
+ let ans;
2560
+ if (task == null)
2561
+ return false;
2562
+ confirm = await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false);
2563
+ if (!this._isInRecordFlushEvent && confirm && !task.DataSynced) {
2564
+ ans = await GUIManager.Instance.confirm(MsgInterface.CRF_STR_CONF_UPD, Styles.MSGBOX_ICON_QUESTION | Styles.MSGBOX_BUTTON_YES_NO_CANCEL);
2565
+ if (ans === Styles.MSGBOX_RESULT_YES)
2566
+ answer = 'Y';
2567
+ else if (ans === Styles.MSGBOX_RESULT_NO)
2568
+ answer = 'N';
2569
+ else
2570
+ answer = 'C';
2571
+ }
2572
+ else
2573
+ answer = 'Y';
2574
+ switch (answer) {
2575
+ case 'Y':
2576
+ break;
2577
+ case 'N':
2578
+ await task.getForm().cancelEdit(false, false);
2579
+ await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
2580
+ task.ConfirmUpdateNo = true;
2581
+ return false;
2582
+ case 'C':
2583
+ this.setStopExecution(true);
2584
+ this.setStopExecutionCtrl(LastFocusedManager.getLastFocusedControl());
2585
+ await FocusManager.SetFocus(LastFocusedManager.getLastFocusedControl(), -1);
2586
+ return false;
2587
+ default:
2588
+ Logger.Instance.WriteExceptionToLogWithMsg('in ClientManager.Instance.updateConfirmed() illegal confirmation code: ' +
2589
+ confirm);
2590
+ break;
2591
+ }
2592
+ return true;
2593
+ }
2594
+ setCompMainPrgTab(compMainPrgTable) {
2595
+ this._compMainPrgTab = compMainPrgTable;
2596
+ }
2597
+ setEndOfWork(endOfWork_) {
2598
+ this._endOfWork = endOfWork_;
2599
+ }
2600
+ getEndOfWork() {
2601
+ return this._endOfWork;
2602
+ }
2603
+ getCompMainPrgTab() {
2604
+ return this._compMainPrgTab;
2605
+ }
2606
+ inNonReversibleExit() {
2607
+ return this._isNonReversibleExit;
2608
+ }
2609
+ pushRtEvent(rtEvt) {
2610
+ this._rtEvents.push(rtEvt);
2611
+ }
2612
+ popRtEvent() {
2613
+ if (this._rtEvents.count() === 0)
2614
+ return null;
2615
+ return this._rtEvents.pop();
2616
+ }
2617
+ storeLastSavedRouteEventOnLocalStorage() {
2618
+ let dataStorage = window.localStorage;
2619
+ if (this.getLastSavedRouteEvent() != null) {
2620
+ let rtEvt = this.getLastSavedRouteEvent();
2621
+ dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT, '1');
2622
+ dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK, JSON.stringify(rtEvt.getTask().TaskDefinitionId));
2623
+ if (rtEvt.getArgList().getSize() > 0) {
2624
+ let str = new StringBuilder();
2625
+ rtEvt.getArgList().buildXML(str);
2626
+ dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST, str.toString());
2627
+ }
2628
+ }
2629
+ }
2630
+ restoreLastSavedRouteEventFromLocalStorage() {
2631
+ let dataStorage = window.localStorage;
2632
+ let lastRouteEvent = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT);
2633
+ if (lastRouteEvent === '1') {
2634
+ let srcTaskDefinitionStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK);
2635
+ let routeArgListStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST);
2636
+ let taskDefinitionId = new TaskDefinitionId();
2637
+ taskDefinitionId.fromJSON(srcTaskDefinitionStr);
2638
+ let srcTask = MGDataCollection.Instance.getCurrMGData().getTaskByTaskDefinitionID(taskDefinitionId);
2639
+ let args = null;
2640
+ if (routeArgListStr != null) {
2641
+ args = new ArgumentsList();
2642
+ args.fillList(routeArgListStr, srcTask);
2643
+ }
2644
+ EventsManager.Instance.AddLastSavedRouteEvent(srcTask, args);
2645
+ }
2646
+ }
2647
+ getLastSavedRouteEvent() {
2648
+ return this.lastSavedRouteEvent;
2649
+ }
2650
+ setLastSavedRouteEvent(rtEvt) {
2651
+ if (rtEvt == null)
2652
+ this.lastSavedRouteEvent = null;
2653
+ else
2654
+ this.lastSavedRouteEvent = rtEvt.replicate();
2655
+ }
2656
+ getLastRtEvent() {
2657
+ if (this._rtEvents.count() === 0)
2658
+ return null;
2659
+ return this._rtEvents.peek();
2660
+ }
2661
+ setIgnoreUnknownAbort(val) {
2662
+ this._ignoreUnknownAbort = val;
2663
+ }
2664
+ ignoreUnknownAbort() {
2665
+ return this._ignoreUnknownAbort;
2666
+ }
2667
+ async failTaskOverlay(taskId, mgd) {
2668
+ let cmd;
2669
+ if (taskId !== null) {
2670
+ this.setIgnoreUnknownAbort(true);
2671
+ try {
2672
+ cmd = CommandFactory.CreateNonReversibleExitCommand(taskId, false);
2673
+ mgd.CmdsToServer.Add(cmd);
2674
+ await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
2675
+ }
2676
+ finally {
2677
+ this.setIgnoreUnknownAbort(false);
2678
+ }
2679
+ }
2680
+ }
2681
+ isEventScopeTrans() {
2682
+ return this._eventScope === EventScope.TRANS;
2683
+ }
2684
+ setEventScopeTrans() {
2685
+ this._eventScope = EventScope.TRANS;
2686
+ }
2687
+ clearEventScope() {
2688
+ this._eventScope = EventScope.NONE;
2689
+ }
2690
+ GetEventTime() {
2691
+ return this._eventsQueue.GetTime();
2692
+ }
2693
+ getMatchingAction(kbItm) {
2694
+ let act = 0;
2695
+ if (kbItm == null)
2696
+ return act;
2697
+ if (act === 0) {
2698
+ if (kbItm.getAction() !== 0)
2699
+ act = kbItm.getAction();
2700
+ else if (kbItm.getKeyCode() === 45 && kbItm.getModifier() === Modifiers.MODIFIER_NONE && kbItm.getStates() === 0)
2701
+ act = InternalInterface.MG_ACT_TOGGLE_INSERT;
2702
+ }
2703
+ return (act);
2704
+ }
2705
+ getExecStack() {
2706
+ return this._execStack.peek();
2707
+ }
2708
+ pushExecStack(taskId, handlerId, operIdx) {
2709
+ this._execStack.peek().push(MGDataCollection.Instance.getTaskIdById(taskId), handlerId, operIdx);
2710
+ }
2711
+ popExecStack() {
2712
+ return this._execStack.peek().pop();
2713
+ }
2714
+ pushNewExecStacks() {
2715
+ this._serverExecStack.push(null);
2716
+ this._execStack.push(new ExecutionStack());
2717
+ }
2718
+ popNewExecStacks() {
2719
+ this._serverExecStack.pop();
2720
+ this._execStack.pop();
2721
+ }
2722
+ pushServerExecStack(taskId, handlerId, operIdx) {
2723
+ if (this._serverExecStack.peek() === null) {
2724
+ this._serverExecStack.pop();
2725
+ this._serverExecStack.push(new ExecutionStack());
2726
+ }
2727
+ this._serverExecStack.peek().push(taskId, handlerId, operIdx);
2728
+ }
2729
+ clearServerExecStack() {
2730
+ if (this._serverExecStack.peek() !== null) {
2731
+ this._serverExecStack.peek().clear();
2732
+ }
2733
+ }
2734
+ reverseServerExecStack() {
2735
+ if (this._serverExecStack.peek() !== null)
2736
+ this._serverExecStack.peek().reverse();
2737
+ }
2738
+ getNextOperIdx(oper, clearWhenFound) {
2739
+ let tmpServerExecStackEntry = null;
2740
+ let nextOperIdx = -1;
2741
+ if (this._serverExecStack.count() !== 0 && this._serverExecStack.peek() !== null && !this._serverExecStack.peek().empty()) {
2742
+ if (this._serverExecStack.peek().size() > this._execStack.peek().size()) {
2743
+ let tmpServerExecStack = new ExecutionStack(this._serverExecStack.peek());
2744
+ while (tmpServerExecStack.size() > this._execStack.peek().size()) {
2745
+ tmpServerExecStackEntry = tmpServerExecStack.pop();
2746
+ }
2747
+ if (this._execStack.peek().Equals(tmpServerExecStack) && tmpServerExecStackEntry.TaskId === oper.getTaskTag() && tmpServerExecStackEntry.HandlerId === oper.getHandlerId() && tmpServerExecStackEntry.OperIdx >= oper.getServerId()) {
2748
+ nextOperIdx = tmpServerExecStackEntry.OperIdx;
2749
+ if (clearWhenFound && this._serverExecStack.peek().size() === this._execStack.peek().size() + 1) {
2750
+ this._serverExecStack.peek().clear();
2751
+ }
2752
+ }
2753
+ else
2754
+ nextOperIdx = EventsManager.MAX_OPER;
2755
+ }
2756
+ else {
2757
+ nextOperIdx = EventsManager.MAX_OPER;
2758
+ }
2759
+ }
2760
+ return nextOperIdx;
2761
+ }
2762
+ setProcessingTopMostEndTask(inProcessingTopMostEndTask) {
2763
+ this._processingTopMostEndTask = inProcessingTopMostEndTask;
2764
+ }
2765
+ getProcessingTopMostEndTask() {
2766
+ return this._processingTopMostEndTask;
2767
+ }
2768
+ setAllowEvents(AllowEvents) {
2769
+ this._allowEvents = AllowEvents;
2770
+ }
2771
+ setNonInteractiveAllowEvents(AllowEvents) {
2772
+ if (AllowEvents)
2773
+ this._allowEvents = EventsAllowedType.NON_INTERACTIVE;
2774
+ else
2775
+ this._allowEvents = EventsAllowedType.NONE;
2776
+ }
2777
+ getAllowEvents() {
2778
+ return this._allowEvents;
2779
+ }
2780
+ NoEventsAllowed() {
2781
+ return this._allowEvents === EventsAllowedType.NONE;
2782
+ }
2783
+ async handleCtrlModify(ctrl, act) {
2784
+ if (ctrl == null || !ctrl.isModifiable())
2785
+ return;
2786
+ switch (act) {
2787
+ case InternalInterface.MG_ACT_RT_EDT_NULL:
2788
+ case InternalInterface.MG_ACT_CTRL_MODIFY:
2789
+ case InternalInterface.MG_ACT_SELECTION:
2790
+ break;
2791
+ default:
2792
+ return;
2793
+ }
2794
+ let rtEvt;
2795
+ rtEvt = new RunTimeEvent(ctrl);
2796
+ rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_MODIFY);
2797
+ await this.handleEvent(rtEvt, false);
2798
+ }
2799
+ ActAllowed(act) {
2800
+ let allowed = true;
2801
+ switch (this.getAllowEvents()) {
2802
+ case EventsAllowedType.ALL:
2803
+ allowed = true;
2804
+ break;
2805
+ case EventsAllowedType.NONE:
2806
+ allowed = (act === InternalInterface.MG_ACT_CRELINE);
2807
+ break;
2808
+ case EventsAllowedType.NON_INTERACTIVE:
2809
+ switch (act) {
2810
+ case InternalInterface.MG_ACT_EXIT_SYSTEM:
2811
+ case InternalInterface.MG_ACT_EXIT:
2812
+ case InternalInterface.MG_ACT_CLOSE:
2813
+ case InternalInterface.MG_ACT_CRELINE:
2814
+ case InternalInterface.MG_ACT_CRELINE_ABOVE:
2815
+ case InternalInterface.MG_ACT_ROLLBACK:
2816
+ allowed = true;
2817
+ break;
2818
+ default:
2819
+ allowed = false;
2820
+ break;
2821
+ }
2822
+ break;
2823
+ }
2824
+ return allowed;
2825
+ }
2826
+ async commitRecord(task, isReversibleExit) {
2827
+ let dv = task.DataView;
2828
+ let rec = dv.getCurrRec();
2829
+ let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
2830
+ let isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
2831
+ let isNewRec = rec.isNewRec();
2832
+ let savePrevCurrRec = true;
2833
+ let recModified = rec.Modified;
2834
+ if (!dv.recInModifiedTab(rec.getId()))
2835
+ rec.clearFlagsHistory();
2836
+ await task.TaskTransactionManager.checkAndCommit(isReversibleExit, ConstInterface.TRANS_RECORD_PREFIX, task.ConfirmUpdateNo);
2837
+ if (task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
2838
+ try {
2839
+ task.DataSynced = true;
2840
+ this.setStopExecution(false);
2841
+ await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
2842
+ }
2843
+ finally {
2844
+ this.setStopExecution(true);
2845
+ }
2846
+ }
2847
+ else if (task.isAborting())
2848
+ this.setStopExecution(true);
2849
+ else {
2850
+ if (recModified)
2851
+ rec.setLateCompute(true);
2852
+ if (!this._stopExecution)
2853
+ task.setLevel(Constants.TASK_LEVEL_TASK);
2854
+ rec.resetUpdated();
2855
+ rec.resetModified();
2856
+ if (!recModified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
2857
+ if (isNewRec) {
2858
+ dv.setPrevCurrRec();
2859
+ savePrevCurrRec = false;
2860
+ rec.setNewRec();
2861
+ await task.getForm().cancelEdit(false, false);
2862
+ await this.HandleStopRowEditing(task);
2863
+ }
2864
+ else if (!rec.getForceSaveOrg())
2865
+ await dv.cancelEdit(EventsManager.REAL_ONLY, true);
2866
+ else
2867
+ dv.saveOriginal();
2868
+ }
2869
+ else
2870
+ dv.saveOriginal();
2871
+ }
2872
+ if (savePrevCurrRec)
2873
+ dv.setPrevCurrRec();
2874
+ }
2875
+ incLocateTimerCB(taskObj) {
2876
+ let task = taskObj;
2877
+ let rtEvt = new RunTimeEvent(task, true);
2878
+ rtEvt.setInternal(InternalInterface.MG_ACT_INCREMENTAL_LOCATE);
2879
+ rtEvt.setMainPrgCreator(task);
2880
+ rtEvt.setCtrl(task.getLastParkedCtrl());
2881
+ this.addToTail(rtEvt);
2882
+ }
2883
+ static async doSyncForSubformParent(task) {
2884
+ let parentTask = task.getParent();
2885
+ let parentDv = parentTask.DataView;
2886
+ let parentRec = parentDv.getCurrRec();
2887
+ if (task.IsSubForm && parentRec != null && parentRec.Modified && !parentDv.isEmptyDataview()) {
2888
+ parentRec.setMode(DataModificationTypes.Update);
2889
+ await parentDv.addCurrToModified(false);
2890
+ ((parentDv.getCurrRec())).Synced = true;
2891
+ parentDv.setChanged(true);
2892
+ let dataViewExecuteLocalUpdatesCommand = CommandFactory.CreateDataViewCommand(parentTask.getTaskTag(), DataViewCommandType.ExecuteLocalUpdates);
2893
+ await parentTask.DataviewManager.Execute(dataViewExecuteLocalUpdatesCommand);
2894
+ }
2895
+ }
2896
+ async ProcessAbortingError(ex) {
2897
+ let eMsg;
2898
+ let errForConsole;
2899
+ let errForMsgBox;
2900
+ if (ex instanceof ServerError)
2901
+ eMsg = ex.GetMessage();
2902
+ else
2903
+ eMsg = ((ex.Message !== null) ? ex.Message : ex.GetType());
2904
+ errForConsole = StrUtil.getConsoleErorString(eMsg);
2905
+ errForMsgBox = StrUtil.getMsgBoxErorString(eMsg);
2906
+ if (ex.InnerException !== null)
2907
+ Logger.Instance.WriteExceptionToLog(ex.InnerException, errForConsole);
2908
+ else {
2909
+ if (!(ex instanceof ServerError) || Logger.Instance.LogLevel !== Logger_LogLevels.Basic) {
2910
+ Logger.Instance.WriteExceptionToLogWithMsg(errForConsole);
2911
+ }
2912
+ }
2913
+ let sendUnloadToServer = RuntimeContextBase.Instance.ContextID !== RuntimeContextBase.noContextId;
2914
+ MGDataCollection.Instance.currMgdID = 0;
2915
+ let messageString = LanguageData.Instance.getConstMessage(MsgInterface.BRKTAB_STR_ERROR);
2916
+ let style = 16;
2917
+ if (ex.Message.startsWith('<HTML')) {
2918
+ this.processHTMLContent(ex.Message);
2919
+ }
2920
+ else {
2921
+ if (this.ShowErrorInMessageBox(ex)) {
2922
+ await GUIManager.Instance.MessageBox(messageString, errForMsgBox, style);
2923
+ }
2924
+ if (ex instanceof ServerError) {
2925
+ if (ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
2926
+ ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
2927
+ Commands.addGlobalCommand(CommandType.RELOAD_PAGE);
2928
+ Commands.beginInvoke();
2929
+ }
2930
+ }
2931
+ }
2932
+ if (ex instanceof ServerError) {
2933
+ if (ex.GetCode() === ServerError.ERR_CTX_NOT_FOUND ||
2934
+ ex.GetCode() === ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
2935
+ ex.GetCode() === ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
2936
+ sendUnloadToServer = false;
2937
+ }
2938
+ }
2939
+ if (sendUnloadToServer) {
2940
+ try {
2941
+ let cmd = CommandFactory.CreateUnloadCommand();
2942
+ MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
2943
+ await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
2944
+ }
2945
+ catch (ex3) {
2946
+ if (ex3 instanceof ApplicationException) {
2947
+ Logger.Instance.WriteExceptionToLog(ex3);
2948
+ }
2949
+ else
2950
+ throw ex3;
2951
+ }
2952
+ }
2953
+ GUIManager.Instance.abort();
2954
+ }
2955
+ processHTMLContent(htmlContent) {
2956
+ Commands.addShowHTMLError(CommandType.SHOW_HTML_ERROR, htmlContent);
2957
+ Commands.beginInvoke();
2958
+ }
2959
+ ShowErrorInMessageBox(ex) {
2960
+ if (!(ex instanceof ServerError))
2961
+ return true;
2962
+ if ((ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED ||
2963
+ ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED) &&
2964
+ RuntimeContextBase.Instance.ContextID === RuntimeContextBase.noContextId)
2965
+ return false;
2966
+ return true;
2967
+ }
2968
+ getIsInViewRefresh() {
2969
+ return this.isInViewRefresh;
2970
+ }
2971
+ setIsInViewRefresh(inViewRefresh) {
2972
+ this.isInViewRefresh = inViewRefresh;
2973
+ }
2974
+ }
2975
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFE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YW50cyxcclxuICBGb3JjZUV4aXQsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQcmlvcml0eSxcclxuICBSYWlzZUF0LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBTdWJmb3JtVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWQsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7Um9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Sb2xsYmFja0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZX0gZnJvbSAnLi4vdXRpbC9NZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSc7XHJcbmltcG9ydCB7Q29tcE1haW5QcmdUYWJsZX0gZnJvbSAnLi4vcnQvQ29tcE1haW5QcmdUYWJsZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyLCBSZXRWYWxzfSBmcm9tICcuL0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuLi90YXNrcy9NR0RhdGEnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4uL0NvbW1hbmRzVGFibGUnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuLi9ydC9PcGVyYXRpb24nO1xyXG5pbXBvcnQge0NsaWVudFJlZnJlc2hDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9DbGllbnRSZWZyZXNoQ29tbWFuZCc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2t9IGZyb20gJy4uL3J0L0V4ZWN1dGlvblN0YWNrJztcclxuaW1wb3J0IHtFeGVjdXRpb25TdGFja0VudHJ5fSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFja0VudHJ5JztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuL0V2ZW50JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGUsIElFdmVudHNNYW5hZ2VyfSBmcm9tICcuL0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gJy4uL0NsaWVudE1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQUxfT05MWTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX09QRVI6IG51bWJlciA9IDk5OTk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2V2ZW50c1F1ZXVlOiBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSA9IG51bGw7IC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gZXhlY3V0ZVxyXG4gIHByaXZhdGUgX2V4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiBvciBjYWxscyB0byB1c2VyXHJcbiAgcHJpdmF0ZSBfcnRFdmVudHM6IFN0YWNrPFJ1blRpbWVFdmVudD4gPSBudWxsOyAvLyBBIHN0YWNrIG9mIGluLXByb2Nlc3MgcnVuLXRpbWUgZXZlbnRzICh0aGUgbGFzdCBvbmUgaXMgYXQgdGhlIHRvcCkuXHJcbiAgcHJpdmF0ZSBfc2VydmVyRXhlY1N0YWNrOiBTdGFjazxFeGVjdXRpb25TdGFjaz4gPSBudWxsOyAvLyBFeGVjdXRpb24gc3RhY2sgb2YgRXhlY3V0aW9uIHN0YWNrcyBvZiBvcGVyYXRpb25zIHRoYXRcclxuICBwcml2YXRlIF9hbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBFdmVudHNBbGxvd2VkVHlwZS5BTEw7XHJcbiAgcHJpdmF0ZSBfY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBudWxsOyAvLyB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgcHJpdmF0ZSBfY3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VyckZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIGZvciBldmVyeSBldmVudCBleGVjdXRlZCB0aGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2wgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBmaXJlZFxyXG4gIHByaXZhdGUgX2N1cnJLYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2VuZE9mV29yazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2ZW50U2NvcGU6IEV2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7IC8vIGluc3RydWN0cyBob3cgdG8gcHJvY2VzcyBldmVudHMgd2hpY2ggYXJlIHByb3BhZ2F0ZWQgdG8gc2xhdmUgdGFza3MgZHVyaW5nIGV4ZWN1dGlvbi5cclxuICBwcml2YXRlIF9mb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gIHByaXZhdGUgX2ZvcmNlRXhpdFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lnbm9yZVVua25vd25BYm9ydDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIHdoZW4gJ2Fib3J0JyBjb21tYW5kcyBvbiB1bmtub3duIHRhc2tzIG1heSBhcnJpdmVcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VkIHRvIGRldGVjdCByZS1pbml0aWFsaXphdGlvblxyXG4gIHByaXZhdGUgX2lzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGUgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIGZvcmNlRXhpdCByZWxhdGVkIGhhbmRsZXJcclxuICBwcml2YXRlIF9pc05vblJldmVyc2libGVFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGlzIHRoZSBjb21tYW5kIG5vbnJldmVyc2libGVcclxuICBwcml2YXRlIF9pc0luUmVjb3JkRmx1c2hFdmVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIGN1cnJlbnQgYWN0IGlzIE1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRFxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRSb3V0ZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gIC8vIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4gd2UgbmVlZCBhIHN0YWNrIG9mIGV4ZWNzdGFja3NcclxuICAvLyBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgY2FsbCBhIG5ldyBwcm9ncmFtIGJlZm9yZSB3ZSBoYW5kbGVkXHJcbiAgLy8gdGhlIHByZXZpb3VzIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgcHJpdmF0ZSBfc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZVxyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb25DdHJsOiBNZ0NvbnRyb2wgPSBudWxsOyAvLyBob2xkcyB0aGUgY3RybCBvbiB3aGljaCB3ZSBnZXQgdGhlIGZpcnN0IHN0b3AgZXhlY3V0aW9uXHJcblxyXG4gIHB1YmxpYyBndWlQZW5kaW5nRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgLy8gS0VZQk9BUkQgRVZFTlRTIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IEtCSV9ET1dOOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHJlYWRvbmx5IEtCSV9VUDogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuXHJcbiAgLy8gQ09OVEVYVCBURVJNSU5BVElPTiBXQVJOSU5HIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ01zZzogc3RyaW5nID0gJ1RoZSBzZXJ2ZXIgY29udGV4dCBzZXJ2aW5nIHRoaXMgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gdGltZSBvdXQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHlvdXIgd29yaz8nO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSAnU2Vzc2lvbiBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkISc7XHJcblxyXG4gIHN0YXRpYyBJbnN0YW5jZTogRXZlbnRzTWFuYWdlciA9IG5ldyBFdmVudHNNYW5hZ2VyKCk7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaXNTcGlubmVyU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzSW5WaWV3UmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBTcGlubmVyU3RvcHBlZDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc3RhdGljIGNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcml2YXRlIENUT1IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fcnRFdmVudHMgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZSA9IG5ldyBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSgpO1xyXG5cclxuICAgIHRoaXMuX2V4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcblxyXG5cclxuICAgIHRoaXMuS0JJX0RPV04gPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfRE9XTiwgTW9kaWZpZXJzLk1PRElGSUVSX05PTkUpO1xyXG4gICAgdGhpcy5LQklfVVAgPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfVVAsIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRQZW5kaW5nR3VpRXZlbnQoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmd1aVBlbmRpbmdFdmVudDtcclxuICB9XHJcblxyXG4gIHNldFBlbmRpbmdHdWlFdmVudChndWlFdmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IGd1aUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpcnRFdnRcIj50aGUgZXZlbnQgdG8gYmUgYWRkZWQgPC9wYXJhbT5cclxuICBhZGRUb1RhaWwocnRFdnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gaWYgY3VycmVudCBldmVudCBpcyBub3QgaWRsZSB0aW1lIGV2ZW50IGNoZWNrIGlmIHRoZXJlIGlzIGNsaWVudEluYWN0aXZpdHlUaW1lciBydW5uaW5nP1xyXG4gICAgLy8gaWYgc28gLCBzdG9wIHRoaXMgY2xpZW50IENvbnRleHQgaW5hY3Rpdml0eSB0aW1lclxyXG4gICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpKSB7XHJcbiAgICAgIGlmIChFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OKSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvLyBpZiBjbGllbnQgaXMgaWRsZSBhZnRlciByZWNyZWF0aW5nIGNvbnRleHQgLCB0aGVuIGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50XHJcbiAgICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkpO1xyXG4gICAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGFuIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRm9ybVwiPmZvcm0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nQ29udHJvbFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGlmaWVyXCI+bW9kaWZpZXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0XCI+c3RhcnQgb2Ygc2VsZWN0ZWQgdGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kXCI+ZW5kIG9mIHNlbGVjdGVkIHRleHQgIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0ZXh0XCI+dGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW1cIj5pbSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDaGFyXCI+aXMga2V5Ym9hcmQgY2hhciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VnZ2VzdGVkVmFsdWVcIj5zdWdnZXN0ZWQgdmFsdWUgZm9yIGNob2ljZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgdG8gYmUgYWRkZWQgaW4gdGhlIHF1ZXVlIDwvcGFyYW0+XHJcbiAgQWRkS2V5Ym9hcmRFdmVudChtZ0Zvcm06IE1nRm9ybUJhc2UsIG1nQ29udHJvbDogTWdDb250cm9sQmFzZSwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBpc0FjdENoYXI6IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSAobWdDb250cm9sICE9PSBudWxsKSA/IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5tZ0NvbnRyb2wsIHRydWUsIGZhbHNlKSA6IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+bWdGb3JtLmdldFRhc2soKSwgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IG5ld0tiSXRlbTogS2V5Ym9hcmRJdGVtID0gbmV3IEtleWJvYXJkSXRlbShrZXlDb2RlLCBtb2RpZmllcik7XHJcblxyXG4gICAgaWYgKGlzQWN0Q2hhciAmJiAobWdDb250cm9sICE9PSBudWxsICYmIChtZ0NvbnRyb2wuaXNUZXh0Q29udHJvbCgpKSkpXHJcbiAgICAgIG5ld0tiSXRlbS5zZXRBY3Rpb24oSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NIQVIpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEtleWJvYXJkSXRlbShuZXdLYkl0ZW0pO1xyXG5cclxuICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOKSB7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhzdGFydCwgZW5kLCB0ZXh0KTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBydEV2dC5zZXRWYWx1ZShzdWdnZXN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFFDUiA3NjAzODEgaWYgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZSBjdXJyZW50IGNvbnRyb2wgaXMgdW5wYXJrYWJsZSB0cnlcclxuICAvLy8gICBhbiBtb3ZlIHRvIHRoZSBuZXh0IHBhcmthYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGNoZWNrUGFya2FiaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8qIFFDUiMgOTI1NDY0LiBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbiBkZWxldGluZyBhIHJlY29yZCwgQ1Mgb2YgdGhlIGNvbnRyb2wgZ2V0cyBleGVjdXRlZC5cclxuICAgICAqIFNvLCB0aGUgdGFzaydzIGxldmVsIGlzIHNldCB0byBUQVNLLiBUaGVuIHdlIGdvIHRvIHNlcnZlciBhbiBvbiByZXR1cm5pbmcgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAgKiB3ZSByZWZyZXNoIHRoZSBmb3JtLiBIZXJlLCBzaW5jZSB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpLmUuIFwiZnJvbVwiIChudW1lcmljKSBpcyBoaWRkZW4sXHJcbiAgICAgKiB3ZSB0cnkgdG8gcGFyayBvbiB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sIGZyb20gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKS4gVGhpcyBtYWtlcyB0aGVcclxuICAgICAqIHRhc2sncyBsZXZlbCBhcyBDT05UUk9MLiBOb3csIHdlIHRyeSB0byBleGVjdXRlIFJQLCBidXQgc2luY2UgdGhlIGxldmVsIGlzIENPTlRST0wsXHJcbiAgICAgKiB3ZSBkbyBub3QgZXhlY3V0ZSBpdC4gVGhlIHNvbHV0aW9uIGlzIHRoYXQgY2hlY2tQYXJrYWJpbGl0eSgpIHdoaWNoIGlzIGNhbGxlZCBmcm9tXHJcbiAgICAgKiBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpLCBzaG91bGQgdHJ5IHRvIHBhcmsgb24gdGhlIGNvbnRyb2wgb25seSBpZiB0aGUgdGFzaydzIGxldmVsIGlzIENPTlRST0wuXHJcbiAgICAgKi9cclxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgIWF3YWl0IGN1cnJlbnQuSXNQYXJrYWJsZSgpKVxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBzaXR1YXRpb24gd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhpdGFzazogSVRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICAvLyB3ZSBjYW4gbm90IHN0YXkgaW4gY3JlYXRlIG1vZGUgd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShvbGRNb2RlKTtcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIG9yIGluIHN0b3AgZXhlY3V0aW9uIHN0YXRlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgICAgLy8gRG8gbm90IGdpdmUgcGFyayBlcnJvciwgaWYgdGFzayBpcyBvcGVuZWQgaW4gY3JlYXRlIG1vZGUuIFRoaXMgaXMgdGVtcG9yYXJ5IGNoYW5nZSBmb3IgY3VzdG9tZXIgcHJvYmxlbS5cclxuICAgICAgLy90aGlzLmV4aXRXaXRoRXJyb3IodGFzaywgTXNnSW50ZXJmYWNlLlJUX1NUUl9DUlNSX0NBTlRfUEFSSyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hpbGUgaGFuZGxlIG5vbi1wYXJrYWJpbGl0eSBjb25kaXRpb24sIGVuc3VyZSBDUyBpcyBjYWxsZWQgZm9yIGNvbnRyb2wgaWYgaXQgaXMgaW4gQ29udHJvbCBsZXZlbCB0aGVuIHBhcmtpbmcgaXMgc2V0IG9uIGZvcm0uXHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBudWxsO1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYSBzaW5nbGUgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIHByb2Nlc3MgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHRvIGJlIHBhc3NlZCB0byBoYW5kbGVyLmV4ZWN1dGUoKSA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICBsZXQgcG9zOiBFdmVudEhhbmRsZXJQb3NpdGlvbiA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgZm9yY2VFeGl0RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZFRhc2tFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZFJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gICAgbGV0IG9sZEZvcmNlRXhpdDogRm9yY2VFeGl0ID0gdGhpcy5nZXRGb3JjZUV4aXQoKTtcclxuICAgIGxldCBvbGRGb3JjZUV4aXRUYXNrOiBUYXNrID0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDogYm9vbGVhbiA9IHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQ7XHJcbiAgICBsZXQgcmVzdG9yZUlzRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJGaWVsZDogRmllbGQgPSBudWxsO1xyXG5cclxuICAgIC8vIHRoZSBhY3Rpb24gbmVlZCB0byBiZSBjaGVjayBhY2NvcmRpbmcgdG8gdGhlIHRhc2sgb24gdGhlIGV2ZW50LlxyXG4gICAgLy8gSWYgdGhlIGFjdGlvbiBpcyBpbnRlcm5hbCAodW5kZXIgQUNUX1RPVCksIGRvIG5vdGhpbmcgaWYgaXRzIGRpc2FibGVkIG9yIG5vdCBhbGxvd2VkLlxyXG4gICAgaWYgKChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpKSB7XHJcbiAgICAgIC8vIGRvIG5vdGhpbmcgaWYgYWN0aW9uIGlzIDEuIG5vdCBlbmFibGVkIDIuIHdhaXQgPT0gbm8gYW5kIGV2ZW50cyBhcmUgbm90IGFsbG93ZWRcclxuICAgICAgaWYgKHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVCAmJiAoIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQocnRFdnQuSW50ZXJuYWxFdmVudCkgfHwgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9IGVsc2VcclxuICAgIC8vIGRvIHRoZSBoYW5kbGVycyB3aGVuIDEuIHdhaXQgPT0geWVzIG9yIDIuIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgaWYgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICByZXN0b3JlQ3VyckN0cmwgPSB0aGlzLl9jdXJyQ3RybDtcclxuICAgIHRoaXMuX2N1cnJDdHJsID0gY3RybDsgLy8gc2F2ZSBjdXJyZW50IGNvbnRyb2wgZm9yIEhBTkRMRVJfQ1RSTCBmdW5jdGlvblxyXG5cclxuICAgIGxldCBwcm9wYWdhdGU6IGJvb2xlYW4gPSBydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgfHwgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPCAxMDAwO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcih0cnVlKTtcclxuXHJcbiAgICAgIC8vIGRvIHNvbWUgY29tbW9uIHByb2Nlc3NpbmcgYW5kIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSB0aGVuIGNvbnRpbnVlXHJcbiAgICAgIC8vIHdpdGggdGhlIHVzZXIgZGVmaW5lZCBoYW5kbGVyc1xyXG4gICAgICBsZXQgYlJjQmVmb3JlOiBib29sZWFuID0gYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyQmVmb3JlKHJ0RXZ0KTtcclxuXHJcbiAgICAgIHJlc3RvcmVDdXJyRmllbGQgPSB0aGlzLl9jdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IDxGaWVsZD50YXNrLmdldEN1cnJGaWVsZCgpO1xyXG5cclxuICAgICAgaWYgKGJSY0JlZm9yZSkge1xyXG4gICAgICAgIHBvcy5pbml0KHJ0RXZ0KTtcclxuICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50XHJcbiAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsICYmIGhhbmRsZXIuZ2V0RXZlbnQoKSAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuc2V0Rm9yY2VFeGl0KGhhbmRsZXIuZ2V0RXZlbnQoKS5Vc2VyRXZ0LkZvcmNlRXhpdCwgdGFzayk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNoYWluIG9mIGhhbmRsZXJzIGZvciB0aGUgY3VycmVudCBldmVudC4gdGhlIGV4ZWN1dGlvblxyXG4gICAgICAgIC8vIGNvbnRpbnVlcyB0aWxsIGFuIGV2ZW50IGhhbmRsZXIgcmV0dXJucyBmYWxzZS5cclxuICAgICAgICB3aGlsZSAoaGFuZGxlciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGhhbmRsZXJDb250ZXh0VGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgICBsZXQgcnRFdnRDaGFuZ2VkOiBib29sZWFuO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGNoYW5nZSB0aGUgaGFuZGxlcidzIGNvbnRleHQgdGFzayB0byB0aGUgZXZlbnQncyB0YXNrXHJcbiAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0VGFzayA9IDxUYXNrPmhhbmRsZXIuZ2V0VGFzaygpLkdldENvbnRleHRUYXNrKCk7XHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPj0gMTAwMCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFKVxyXG4gICAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKGhhbmRsZXIuZ2V0VGFzaygpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKHJ0RXZ0LmdldFRhc2soKSk7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGhhbmRsZSBGb3JjZUV4aXQgZm9yIG5vbi11c2VyIGV2ZW50c1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlci5nZXRFdmVudCgpLmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIGF3YWl0IGhhbmRsZXIuaXNFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICByZXN0b3JlSXNGb3JjZUV4aXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIC8vIGhhbmRsZSBmb3JjZUV4aXQgb25seSBvbmNlXHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlRm9yY2VFeGl0QmVmb3JlKGhhbmRsZXIuZ2V0RXZlbnQoKSwgcnRFdnQpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JjZUV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHJ1biB0aW1lIGV2ZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBldmVudFxyXG4gICAgICAgICAgICAvLyBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAocnRFdnQgIT09IGhhbmRsZXIuZ2V0RXZlbnQoKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgcnVudGltZSBldmVudCBpcyB0aGF0IG9mIHRoZSBoYW5kbGVyIGNvbWJpbmVkIHdpdGggdGhlXHJcbiAgICAgICAgICAgICAgLy8gZGF0YSBvZiB0aGUgY3VycmVudCBydW50aW1lIGV2ZW50LlxyXG4gICAgICAgICAgICAgIC8vIHRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gcHJvcGFnYXRlIHRoZSBldmVudCBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICAgIC8vIGluIHBsYWNlIG9mIHRoZSBvcmlnaW5hbCBldmVudFxyXG4gICAgICAgICAgICAgIG9sZFJ0RXZ0ID0gcnRFdnQ7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGhhbmRsZXIuZ2V0RXZlbnQoKSwgcnRFdnQpO1xyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgbmV3IHJ1bnRpbWUgZXZlbnQgdG8gaGFuZGxlIHNvIHBvcCB0aGUgb2xkIG9uZSBhbmQgcHVzaFxyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgb25lIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVFdmVudEFyZ3VtZW50cyhydEV2dCk7XHJcbiAgICAgICAgICAgIGxldCBoYW5kbGVyUmV0VmFsczogUmV0VmFscyA9IGF3YWl0IGhhbmRsZXIuZXhlY3V0ZShydEV2dCwgcmV0dXJuZWRGcm9tU2VydmVyLCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWClcclxuICAgICAgICAgICAgICBydEV2dC5nZXRUYXNrKCkuc2V0SW5SZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBwcm9wYWdhdGUgPSBoYW5kbGVyUmV0VmFscy5Qcm9wYWdhdGU7XHJcbiAgICAgICAgICAgIGlmICghaGFuZGxlclJldFZhbHMuRW5hYmxlZCAmJiBydEV2dENoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBydEV2dCA9IG9sZFJ0RXZ0O1xyXG4gICAgICAgICAgICAgIG9sZFJ0RXZ0ID0gbnVsbDtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGZ1bGZpbGxlZCB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAvLyBBZnRlciBleGVjdXRpbmcgYSBoYW5kbGVyLCBiZWZvcmUgZW5kaW5nIGEgdGFzayAoaWYgdGhlIGVuZCBjb25kaXRpb24gaXMgVFJVRSksXHJcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgdGFzayBpcyBub3QgYWxyZWFkeSBjbG9zZWQuIFRoaXMgY2FuIGhhcHBlbiBsaWtlIGluIGNhc2VcclxuICAgICAgICAgICAgLy8gb2YgUUNSICM3OTY0NzYgLS0tIGEgbm9uLWludGVyYWN0aXZlIHRhc2sgaGFzIGNhbGxlZCBhbiBpbnRlcmFjdGl2ZSB0YXNrIGZyb21cclxuICAgICAgICAgICAgLy8gdGFzayBzdWZmaXguIE5vdyBpZiB3ZSBwcmVzcyBBbHQrRjQsIHdlIGdldCBFWElUX1NZU1RFTSBhY3QuIEFuZCBzbyB3ZSBjbG9zZVxyXG4gICAgICAgICAgICAvLyBhbGwgdGFza3Mgc3RhcnRpbmcgZnJvbSBNYWluIFByb2dyYW0uIFNvLCB3aGVuIHdlIGNvbWUgb3V0IG9mIHRoZSBUUyBoYW5kbGVyXHJcbiAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiwgdGhlIHRhc2sgaXMgYWxyZWFkeSBjbG9zZWQuXHJcbiAgICAgICAgICAgIC8vIEZvciBPZmZsaW5lIDogVFAgaXMgZXhlY3V0ZWQgYXQgY2xpZW50IHNpZGUuIElmIHdlIGFyZSBpbiBUYXNrIFByZWZpeCwgZG9udCBjaGVjayBlbmRUYXNrIGNvbmRpdGlvbiBoZXJlLlxyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCAmJiB0YXNrLmlzU3RhcnRlZCgpICYmIHRhc2suZ2V0RXhlY0VuZFRhc2soKSkge1xyXG4gICAgICAgICAgICAgIGVuZFRhc2tFcnJvciA9IGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGlmIChlbmRUYXNrRXJyb3IpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZVN0b3BFeGVjdXRpb24ocnRFdnQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3RvcmluZyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyQ29udGV4dFRhc2spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghcHJvcGFnYXRlKVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBpZiAocnRFdnRDaGFuZ2VkKVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQocnRFdnQpO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG4gICAgICAgICAgaWYgKGhhbmRsZXIgIT09IG51bGwpXHJcbiAgICAgICAgICAgIEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2UuYWRkVGFza0V2ZW50KHJ0RXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfUFJPUEFHQVRFLCB0YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvcGFnYXRlICYmICFlbmRUYXNrRXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZW5kVGFza0Vycm9yKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyQWZ0ZXIocnRFdnQsIGJSY0JlZm9yZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZvcmNlRXhpdERvbmUgJiYgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCkge1xyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEZvcmNlRXhpdChvbGRGb3JjZUV4aXQsIG9sZEZvcmNlRXhpdFRhc2spO1xyXG4gICAgICBpZiAocmVzdG9yZUlzRm9yY2VFeGl0KVxyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBvbGRJc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSByZXN0b3JlQ3VyckN0cmw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IHJlc3RvcmVDdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHNpbXVsYXRlcyBhbGwgZXZlbnRzIHRoYXQgYXJlIGluIHNlbGVjdGlvbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIGZvY3VzIGV2ZW50XHJcbiAgLy8vICAgSXQgaXMgdXNlZCBpbiA6XHJcbiAgLy8vICAgYWN0aW9ucyBDVFJMK1RBQiAmJiBDVFJMK1NISUZUK1RBQiB0aGF0IG1vdmUgdXMgdG8gdGhlIG5leHQvcHJldmlvdXMgaXRlbSBpbiBUYWIgY29udHJvbFxyXG4gIC8vLyAgIGNsaWNrIG9yIGFjY2VsZXJhdG9yIG9uIHB1c2ggYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5jdHJsIGxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvZHVjZUNsaWNrXCI+dHJ1ZSBzaG91bGQgcHJvZHVjZSBjbGljayBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzaW11bGF0ZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2xCYXNlLCB2YWw6IGFueSwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybDtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGNhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG5cclxuICAgIC8vIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAvLyAgIGlmICghbWdDb250cm9sLmlzTW9kaWZpYWJsZSgpIHx8ICFtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpKSB7XHJcbiAgICAvLyAgICAgbWdDb250cm9sLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgLy8gICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IEdVSU1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAvLyAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgIC8vICAgICAgIE1hbmFnZXIuU2V0Rm9jdXMobGFzdEZvY3VzZWRDb250cm9sLCAtMSk7XHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gd2hlbiBhIHB1c2ggYnV0dG9uIGlzIGFib3V0IHRvIHJhaXNlIGEgJ0NhbmNlbCcgb3IgYSAnUXVpdCcgZXZlbnQuIHdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBmaWVsZC5cclxuICAgIC8vIFRoYXQgc2V0dGluZyBtaWdodCBjYXVzZSBhIHJlYyBzdWZmaXggYW5kIGEgdmFyaWFibGUgY2hhbmdlLlxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pIHtcclxuICAgICAgbGV0IGFSdEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgcmFpc2VBdDogUmFpc2VBdCA9IDxSYWlzZUF0Pihhd2FpdCAobWdDb250cm9sLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQpKS5nZXRWYWx1ZUludCgpKTtcclxuICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgKGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMIHx8IGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCkpIHtcclxuICAgICAgICBpZiAocmFpc2VBdCA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cylcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGNhbmNlbFdhc1JhaXNlZCA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZCh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgbWdDb250cm9sLnNldFJ0RXZ0VGFzayhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpcnN0IHdlIGhhbmRsZSBmb2N1c1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcblxyXG4gICAgY3VyclRhc2suc2V0Q2FuY2VsV2FzUmFpc2VkKGNhbmNlbFdhc1JhaXNlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IjIDk3NDA0NyA6IElmIHdlIGhhdmUgYSBQdXNoIEJ1dHRvbiB3aXRoIEFsbG93IFBhcmtpbmcgPSBObyBhbmQgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIGRvbid0IGhhbmRsZSB0aGUgZXZlbnQuXHJcbiAgICAvLyBUaGlzIGlzIHNhbWUgYXMgb25saW5lLiBJbiBvbmxpbmUsIGlmIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCB0byBub24gcGFya2FibGUgcHVzaCBCdXR0b24sIHdlIGhhbmRsZSB0aGUgZXZlbnRcclxuICAgIC8vIEJ1dCBpZiBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgd2UgZG9uJ3QgaGFuZGxlIGV2ZW50LlxyXG4gICAgLy8gU28gaWYgY29udHJvbCBpcyBwdXNoIGJ1dHRvbiwgZXhlY3V0ZSBoYW5kbGVFdmVudCBvbmx5IHdoZW4gZmllbGQgaXMgbm90IGF0dGFjaGVkIG9yIFBhcmtvbkNMaWNrIGlzIE5vIG9yXHJcbiAgICAvLyBQYXJrb25DTGljayBhbmQgYWxsb3dwYXJraW5nIGlzIGJvdGggWWVzXHJcbiAgICBsZXQgY29udHJvbElzUGFya2FibGU6IGJvb2xlYW4gPSBhd2FpdCBtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpO1xyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKG1nQ29udHJvbC5nZXRGaWVsZCgpID09PSBudWxsIHx8IGNvbnRyb2xJc1BhcmthYmxlKSkge1xyXG5cclxuICAgICAgLy8gUUNSICMzMDE2NTIuIEZvciBub24tcGFya2FibGUgYnV0dG9uIGNvbnRyb2wgd2l0aCBldmVudCByYWlzZWQgYXQgdGhlIGNvbnRhaW5lciB0YXNrIHdpbGwgYmUgY2hhbmdlZCBzb1xyXG4gICAgICAvLyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCB0aGVuIHRoZSB0YXNrIHdpbGwgZ2V0IGZvY3VzLiAoYXMgaW4gT25saW5lIGFuZCBhcyBpZiB0aGUgYnV0dG9uIHdhcyBwYXJrYWJsZSkuXHJcbiAgICAgIC8vIFRoZSBmb2N1cyB3aWxsIGJlIG9uIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJiAhY29udHJvbElzUGFya2FibGUpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU0NzQuIEZvciB0aGUgc2FtZSB0YXNrIGRvIG5vdCBtb3ZlIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9PSBjdXJyVGFzayAmJiBzdWJmb3JtVGFzay5wYXRoQ29udGFpbnMoY3VyclRhc2spKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykgeyAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIGNvZGUgY2FuIGJlIG1vdmVkIHRvIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHN1YmZvcm1UYXNrKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyB0aGVuIEFDVF9ISVQgaXMgc2VudFxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG1nQ29udHJvbDtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYW5kIHNlbGVjdGlvbiBpcyBoYW5kbGVkIGluIHRoZSBlbmQgaWYgcHJldmlvdXMgYWN0aW9ucyBzdWNjZWVkZWRcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgLy8gZm9yIGJ1dHRvblxcY2hlY2sgd2UgZG8gbm90IGNhbGwgdGhpcyB0byBwcmV2ZW50IHJlY3Vyc2lvblxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNlbGVjdGlvbihtZ0NvbnRyb2wsIGxpbmUsIHZhbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuICAgIC8vIHRoZW4gbW91c2UgdXBcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrLCBldmVudENvZGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVJlZnJlc2hcIj5pZGVudGlmaWVyIGlmIHRoZSBldmVudCBjYWxsZWQgYnkgc3ViZm9ybSByZWZyZXNoPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyLCBzdWJmb3JtUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuXHJcbiAgICAvLyBzZXQgU3ViZm9ybUV4ZWNNb2RlIChmb3IgU3ViZm9ybUV4ZWNNb2RlIGZ1bmN0aW9uKSBvbmx5IGluIHJlY29yZCBwcmVmaXguXHJcbiAgICAvLyBTdWJmb3JtRXhlY01vZGUgaXMgY2hhbmdlZCBpbiByZWNvcmQgcHJlZml4IGFuZCBpdCBpcyB0aGUgc2FtZSB1bnRpbCB0aGVcclxuICAgIC8vIG5leHQgcmVjb3JkIHByZWZpeCBleGVjdXRpb24sIGJlY2F1c2Ugd2UgZG8gbm90IG9wZW4gYSBzdWJmb3JtIHRhc2sgZWFjaCB0aW1lXHJcbiAgICAvLyBpbiBSQyBhcyBpdCBpcyBpbiBPbmxpbmUuIEJ1dCB3aGVuIHRoZSBzdWJmb3JtIGlzIHJlZnJlc2hlZCBmcm9tIHRoZSBwYXJlbnRcclxuICAgIC8vIGl0cyByZWNvcmQgcHJlZml4ICYgc3VmZml4IGFyZSBhbHNvIGV4ZWN1dGVkLlxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5Jc1N1YkZvcm0gJiYgdGFzay5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FKS8vIEZJUlNUX1RJTUUgaXMgc2V0IG9ubHkgb25jZSBpblxyXG4gICAgLy8gZG9GaXJzdFJlY29yZEN5Y2xlLlxyXG4gICAge1xyXG4gICAgICB0YXNrLlN1YmZvcm1FeGVjTW9kZSA9IChzdWJmb3JtUmVmcmVzaCA/IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5SRUZSRVNIIDogVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIHRoZSBzdWJmb3JtIHJlZnJlc2ggaXQgaXMgbmVlZGVkIHRvIGV4ZWN1dGUgTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQgaGFuZGxlciBiZWZvcmUgUkVDT1JEX1BSRUZJWCBoYW5kbGVyXHJcbiAgICBpZiAoc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCk7XHJcblxyXG4gICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggfHwgZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbXB0eURhdGF2aWV3T3BlbihzdWJmb3JtUmVmcmVzaCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGFzay5lbXB0eURhdGF2aWV3Q2xvc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5nZXRGb3JtKCkuU2VsZWN0Um93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKDxNZ0NvbnRyb2w+Y3RybCwgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN0cmwgb24gd2hpY2ggd2UgaGFkIGEgXCJzdG9wIGV4ZWN1dGlvblwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFN0b3BFeGVjdXRpb25DdHJsKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemVzIHRoZSBzdGF0aWMgc2VjdGlvbiBvZiB0aGUgZXZlbnRzIG1hbmFnZXIuIFVzdWFsbHkgZG9lcyBub3RoaW5nIGJ1dCBpbiB0aGVcclxuICAvLy8gICBldmVudCBvZiBhcHBsZXQgcmUtbG9hZCAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYSBicm93c2VyIHJlZnJlc2gpIGl0IGluaXRpYWxpemVzIHRoZVxyXG4gIC8vLyAgIHN0YXRpYyBwYXJ0IG9mIHRoaXMgY2xhc3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0ID0gRm9yY2VFeGl0Lk5vbmU7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSBudWxsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldEVuZE9mV29yayh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudDwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzaywgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZERpc3BsYXlMaW5lQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBEaXNwbGF5TGluZTogbnVtYmVyLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIERpc3BsYXlMaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByaW9yaXR5XCI+PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBwcmlvcml0eTogUHJpb3JpdHkpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcmlvcml0eShwcmlvcml0eSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGFkZCBndWkgdHJpZ2dlcmVkIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25NdWx0aU1hcmtcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd2lsbCBiZSB1c2VkIGZvciBtdWx0aW1hcmtpbmcgaW4gdGhlIGZ1dHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9kaWZpZXJzXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpbmVBbmRNb2RpZmllcihjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgbGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgaW4gYSB0YWJsZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRMaW5lKHRhc2s6IFRhc2ssIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdHNrOiBUYXNrID0gbnVsbDtcclxuICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICB0c2sgPSA8VGFzaz50YXNrO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0c2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5EaXNwbGF5TGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGhhbmRsZSBDb2x1bW4gQ2xpY2sgZXZlbnQgb24gQ29sdW1uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlDb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgQWRkQ29sdW1uQ2xpY2tFdmVudChjb2x1bW5DdHJsOiBNZ0NvbnRyb2xCYXNlLCBkaXJlY3Rpb246IG51bWJlciwgY29sdW1uSGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmNvbHVtbkN0cmwsIGRpcmVjdGlvbiwgMCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX0NMSUNLKTtcclxuXHJcbiAgICAvLyBQcmVwYXJlIGFuIGFyZ3VtZW50IGxpc3Qgd2l0aCBhcmd1bWVudCBhcyBjb2x1bW5IZWFkZXJTdHJpbmcuXHJcbiAgICBsZXQgYXJnc0xpc3QgPSBuZXcgQXJyYXk8RXhwVmFsPigpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSwgZmFsc2UsIGNvbHVtbkhlYWRlcik7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVFdmVudCh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyLCByb3V0ZXJwYXRoOiBzdHJpbmcsIHJvdXRlck91dGxldE5hbWU6IHN0cmluZywgcm91dGVQYXJhbXM6IExpc3Q8YW55Pikge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPnRhc2ssIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IGFyZ3NMaXN0OiBFeHBWYWxbXSA9IG5ldyBBcnJheTxFeHBWYWw+KDIpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJwYXRoKTtcclxuICAgIGlmIChyb3V0ZXJPdXRsZXROYW1lID09PSBudWxsKVxyXG4gICAgICByb3V0ZXJPdXRsZXROYW1lID0gJyc7XHJcbiAgICBhcmdzTGlzdFsxXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHJvdXRlck91dGxldE5hbWUpO1xyXG5cclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgIHJ0RXZ0LnNldFJvdXRlUGFyYW1MaXN0KHJvdXRlUGFyYW1zKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICBBZGRSb3V0ZXJDbG9zZWRFdmVudCh0YXNrOiBUYXNrKSB7XHJcbiAgICBsZXQgc3ViRm9ybUNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT50YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFza0Jhc2U+c3ViRm9ybUNvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9DTE9TRSk7XHJcblxyXG4gICAgbGV0IGFyZ3NMaXN0OiBFeHBWYWxbXSA9IG5ldyBBcnJheTxFeHBWYWw+KDEpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCBzdWJGb3JtQ29udHJvbC5nZXROYW1lKCkpO1xyXG5cclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYWRkIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNyY1Rhc2tTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFyZ0xpc3RTdHJcIj48L3BhcmFtPlxyXG4gIEFkZExhc3RTYXZlZFJvdXRlRXZlbnQoc3JjVGFzazogVGFzaywgYXJnczogQXJndW1lbnRzTGlzdCkge1xyXG4gICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFza0Jhc2U+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUpO1xyXG5cclxuICAgIGlmIChzcmNUYXNrICE9IG51bGwpIHtcclxuICAgICAgcnRFdnQuc2V0VGFzayhzcmNUYXNrKTtcclxuICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIEFkZCBpbnRlcm5hbCBldmVudCBybyBzZXQgdGhlIHZhbHVlIG9mIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPiBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPiB2YWx1ZSBvZiBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWZyZXNoRGlzcGxheVwiPiByZWZyZXNoIGRpc3BsYXkgPC9wYXJhbT5cclxuICBBZGRFeHRlcm5hbFZhbHVlRXZlbnQoY3RybDogTWdDb250cm9sLCB2YWx1ZTogYW55LCByZWZyZXNoRGlzcGxheTogYm9vbGVhbikge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIDAsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFVF9FWFRFUk5BTF9WQUxVRSk7XHJcbiAgICBydEV2dC5zZXRWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgbGV0IGFyZ3NMaXN0OiBFeHBWYWxbXSA9IG5ldyBBcnJheTxFeHBWYWw+KDEpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgZmFsc2UsIHJlZnJlc2hEaXNwbGF5ID8gJzEnIDogJzAnKTtcclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgaW4gYSB0YWJsZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaW5lKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBmb3IgbXVsdGlsaW5lIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZExpbmVBbmRDb2RlQW5kSXNQcm9kdWN0Q2xpY2soY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGlzUHJvZHVjZUNsaWNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LnNldFByb2R1Y2VDbGljayhpc1Byb2R1Y2VDbGljayk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGlzdFwiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaXN0KGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGlzdDogTGlzdDxNZ0NvbnRyb2xCYXNlPik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpc3QsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIHRvIHRoZSBxdWV1ZSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+cmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFzaz50YXNrLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJhaXNlZEJ5XCI+cmVsZXZhbnQgb25seSBmb3Igb25saW5lIChmb3Igd2hpY2ggc3ViZm9ybSBhcmUgaGFuZGxlZCBhcyBvcnBoYW5zKTwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRUYXNrQW5kQ29kZUFuZFJhaXNlZEJ5KHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGFzaywgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZmlyc3QgZXZlbnQgZnJvbSB0aGUgcXVldWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICByZXR1cm4gPFJ1blRpbWVFdmVudD50aGlzLl9ldmVudHNRdWV1ZS5wb2xsKCk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JjZUV4aXQoKTogRm9yY2VFeGl0IHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZvcmNlRXhpdChmb3JjZUV4aXQ6IEZvcmNlRXhpdCwgdGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VFeGl0ID0gZm9yY2VFeGl0O1xyXG4gICAgdGhpcy5zZXRGb3JjZUV4aXRUYXNrKHRhc2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JjZUV4aXRUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlRXhpdFRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZvcmNlRXhpdFRhc2sodGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VFeGl0VGFzayA9IHRhc2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIEV2ZW50c01hbmFnZXIgaXMgY3VycmVudGx5IGhhbmRsaW5nIGEgdXNlciBldmVudCB3aXRoXHJcbiAgICogRm9yY2UgRXhpdCA9ICdQcmUtUmVjb3JkIFVwZGF0ZSdcclxuICAgKi9cclxuICBpc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgJiYgdGhpcy5nZXRGb3JjZUV4aXQoKSA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSAmJiB0YXNrID09PSB0aGlzLmdldEZvcmNlRXhpdFRhc2soKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZSBDbGllbnRDb250ZXh0SW5hY3Rpdml0eSBUaW1lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3RhcnRUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAvLyBjb252ZXJ0IHRlbnRocyBvZiBzZWNvbmRzIHRvIG1pbGxpc2Vjb25kcy5cclxuICAgIGxldCBjbGllbnRDdHhJbmFjdGl2aXR5VGltZW91dCA9XHJcbiAgICAgIEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpICogMTAwO1xyXG5cclxuICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSB0cnVlO1xyXG4gICAgd2hpbGUgKEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04pIHtcclxuICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDEwMDApO1xyXG4gICAgICB2YXIgdGltZUxhcHNlZCA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBzdGFydFRpbWU7XHJcbiAgICAgIGlmIChFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkIHx8IHRpbWVMYXBzZWQgPj0gY2xpZW50Q3R4SW5hY3Rpdml0eVRpbWVvdXQpIHtcclxuICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3cgb3IgaGlkZSB0aGUgc3Bpbm5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzaG93XCI+IDwvcGFyYW0+XHJcbiAgYXN5bmMgQ2hlY2tBbmRTaG93U3Bpbm5lcihzaG93OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2VuZENvbW1hbmQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY3VycmVudCBldmVudCBpcyBvZiBsb3dlc3QgcHJpb3JpdHksIGl0IGlzIGFjdHVhbGx5IHNhZmUgdG8gb3BlbiB1c2VyIGludGVyYWN0aW9uLlxyXG4gICAgLy8gU28sIHN0b3AgdGhlIHNwaW5uZXIuXHJcbiAgICBpZiAodGhpcy5nZXRMYXN0UnRFdmVudCgpICE9PSBudWxsICYmIHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKS5nZXRQcmlvcml0eSgpID09PSBQcmlvcml0eS5MT1dFU1QpXHJcbiAgICAgIHNob3cgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc2hvdyAhPSB0aGlzLmlzU3Bpbm5lclNob3duKSB7XHJcbiAgICAgIGlmIChzaG93KSB7XHJcbiAgICAgICAgLy8gU2hvdyB0aGUgc3Bpbm5lciBvbmx5IGlmIHRocmVzaG9sZCBpcyByZWFjaGVkLlxyXG4gICAgICAgIC8vVG9EbzogRGVmaW5lIGEgY29uc3QgZm9yIDEwMDAuIEFsc28gbWFrZSBpdCBjdXN0b21pemFibGUgZnJvbSBhbmd1bGFyIGFwcFxyXG4gICAgICAgIGlmIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gdGhpcy5HZXRFdmVudFRpbWUoKSA+IDEwMDApIHtcclxuICAgICAgICAgIHNlbmRDb21tYW5kID0gdHJ1ZTtcclxuICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50QnVzeVRpbWVTdGFydCA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoc2VuZENvbW1hbmQpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRTaG93U3Bpbm5lcihzaG93KTtcclxuICAgICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgICAgIC8vIHJlbGVhc2UgdGhlIHRocmVhZCBzbyB0aGF0IGZyYW1ld29yayBjYW4gc2hvdy9oaWRlIHRoZSBzcGlubmVyXHJcbiAgICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDUwKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1NwaW5uZXJTaG93biA9IHNob3c7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1NwaW5uZXJTaG93bikge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSB0aW1lIGZvciB3aGljaCBjbGllbnQgd2FzIGJ1c3lcclxuICAgICAgICAgIGxldCB0b3RhbENsaWVudEJ1c3lUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIEV2ZW50c01hbmFnZXIuY2xpZW50QnVzeVRpbWVTdGFydDtcclxuICAgICAgICAgIHRoaXMuU3Bpbm5lclN0b3BwZWQubmV4dCh0b3RhbENsaWVudEJ1c3lUaW1lKTtcclxuICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50QnVzeVRpbWVTdGFydCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTWFpbiBldmVudHMgbG9vcCwgcnVucyBpbiB3b3JrZXIgdGhyZWFkIGZvciBtYWluIHdpbmRvdyBhbmQgZm9yIGV2ZXJ5XHJcbiAgLy8vICAgbW9kYWwgd2luZG93IFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdEYXRhXCI+IDwvcGFyYW0+XHJcbiAgYXN5bmMgRXZlbnRzTG9vcChtZ0RhdGE6IE1HRGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmVkQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gdGhpcy5nZXRBbGxvd0V2ZW50cygpO1xyXG5cclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoRXZlbnRzQWxsb3dlZFR5cGUuQUxMKTtcclxuXHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgd2hpbGUgKCFtZ0RhdGEuSXNBYm9ydGluZykge1xyXG4gICAgICAvLyBIaWRlIHRoZSBzcGlubmVyIGJlZm9yZSBtb3ZpbmcgdG8gaWRsZVxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIoZmFsc2UpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5fZXZlbnRzUXVldWUud2FpdEZvckVsZW1lbnQoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdEYXRhLCAwKTtcclxuXHJcbiAgICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhcmthYmlsaXR5KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhzYXZlZEFsbG93RXZlbnRzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBOb24gaW50ZXJhY3RpdmUgZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2tzXHJcbiAgLy8vICAgUmVzcG9uc2libGUgZm9yIGN5Y2xpbmcgZm9yd2FyZCBvbiByZWNvcmRzIGFuZCBoYW5kbGluZyBldmVudHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgTm9uSW50ZXJhY3RpdmVFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhLCB0YXNrQmFzZTogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGFza0Jhc2U7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgd2hpbGUgKCFtZ0RhdGEuSXNBYm9ydGluZykge1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX0RFTEVURV9SRUMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfUkVDKTtcclxuXHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMCk7XHJcblxyXG4gICAgICAvLyBwb2xsIG9ubHkgMSBldmVudC5cclxuICAgICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZyAmJiBhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhzYXZlZEFsbG93RXZlbnRzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWI6IGFueSwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICgoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgPT09IG51bGwgfHwgYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgaW5zdGFuY2VvZiBNR0RhdGEpICYmIChldmVudHNUb0hhbmRsZUNudE9yUnRFdnQgPT09IG51bGwgfHwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzXzEoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGFuZCBoYW5kbGUgdGhlbSBvbmUgYnkgb25lIHRpbGwgdGhlIHF1ZXVlIGlzIGVtcHR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJhc2VNZ0RhdGFcIj4gbWdkYXRhIG9mIHRoZSB3aW5kb3cgdGhhdCBvcGVuZWRlZCB0aGF0IGhhYmRsZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudHNUb0hhbmRsZUNudFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBkZWx0YTogbnVtYmVyID0gMDtcclxuICAgIGxldCBldmVudHNQb2xsZWRDbnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAvLyBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgdGlsbCBpdHMgZW1wdHlcclxuICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIChldmVudHNUb0hhbmRsZUNudCA9PT0gMCB8fCBldmVudHNQb2xsZWRDbnQgPCBldmVudHNUb0hhbmRsZUNudCkpIHtcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSB0aGlzLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgdGhpcy5fY3VycktiZEl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgYmxvY2tlZEJ5TW9kYWxXaW5kb3c6IGJvb2xlYW4gPSBydEV2dC5pc0Jsb2NrZWRCeU1vZGFsV2luZG93KGJhc2VNZ0RhdGEpO1xyXG4gICAgICAgIGlmIChibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSKSAvLyBRQ1IgIzcyNjE5OCwgZXZlbnRzIGZyb20gLk5FVCBvYmplY3RzIHdoaWNoIGFyZSBub3Qgb24gZm9ybVxyXG4gICAgICAgIC8vIHNob3VsZCBiZSBoYW5kbGVkIG9uIHBhcmVudCBvZiBtb2RhbCB3aW5kb3cgYWxzb1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWRsZSB0aW1lciwgdGltZXIgZXZlbnRzIGFuZCBlbmFibGUvZGlzYWJsZSBldmVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgd2luZG93LlxyXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgY3VycmVudCB3aW5kb3cgZGV0ZXJtaW5lcyB0aGUgY3VycmVudCB0YXNrIGFuZCBjaGFuZ2luZyB0aGUgdGFza1xyXG4gICAgICAgIC8vIGNhdXNlcyBzb21lIHRhc2stc2NvcGVkIGV2ZW50cyB0byBydW4gb24gc3ViLXRhc2tzIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpICYmICFibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRUYXNrKCkgIT09IG51bGwgJiYgIXJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IHJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5HZXRJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgY3Vyck1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKSB7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgIT09IG51bGwgJiYgY3Vyck1nZC5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBjdXJyTWdkID0gY3Vyck1nZC5nZXRQYXJlbnRNR2RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvKiBRQ1JzICM3NzcyMTcgJiAjOTQyOTY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHdlIGhhdmUgcmVtb3ZlZCB0aGUgTUdEYXRhICAgICovXHJcbiAgICAgICAgLyogZnJvbSB0aGUgTUdUYWJsZSBpbiBNYW5hZ2VyLkNsb3NlRXZlbnQoKS4gICovXHJcbiAgICAgICAgLyogSXQgd2FzIGRvbmUgZm9yIGZpeGluZyBRQ1IjIDI5NjI3NyByZWxhdGluZyB0byBtZW0gKi9cclxuICAgICAgICAvKiBsZWFrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgbWdkIHdvdWxkIGJlIG51bGwgaGVyZS4gICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gc3VjaCBhIHNjZW5hcmlvLCB0YWtlIHRoZSBwYXJlbnQgbWdkIGZyb20gdGhlICAgKi9cclxuICAgICAgICAvKiByZWxhdGVkIHRhc2sgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGV2ZW50cy4gICAqL1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgPT09IG51bGwgJiYgdGFzayAhPT0gbnVsbCAmJiB0YXNrLmdldFBhcmVudCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgIGN1cnJNZ2QgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgY3Vyck1nZCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyTWdkID09PSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFRhc2soKSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKHRhc2sgIT09IG51bGwgJiYgKHRhc2suaXNBYm9ydGluZygpIHx8IHRhc2suSW5FbmRUYXNrKSlcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBydEV2dC5zZXRUYXNrKHRhc2spO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSBudWxsOyAvLyBkZWxldGUgY3VycmVudCBwcm9jZXNzZWQgY29udHJvbFxyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICAvLyBsb2dnaW5nIGZvciBwZXJmb3JtYW5jZVxyXG4gICAgICAgIGlmIChkZWx0YSA+IDApIHtcclxuICAgICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIGRlbHRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWR2YW5jZSBFdmVudHNQb2xsZWQgb25seSBpZiB0aGUgZXZlbnQgaXMgaW50ZXJuYWwuIG90aGVyd2lzZSBpbnRlcm5hbHMgdG8gYmUgZXhlY3V0ZWQgd2lsbCBiZSBuZXZlciByZWFjaGVkIGJ5IG5vbiBpbnRlcmFjdGl2ZSB0YXNrcy5cclxuICAgICAgaWYgKGV2ZW50c1RvSGFuZGxlQ250ID4gMCAmJiBydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuSW50ZXJuYWxFdmVudCA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UKVxyXG4gICAgICAgIGV2ZW50c1BvbGxlZENudCsrO1xyXG4gICAgfSAvLyB3aGlsZSAoIV9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgLi4uXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgYW55IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdG9wOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybiBzdG9wO1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGxldCBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEFuIGVycm9yIGluIHRoZSByZWNvcmQgcHJlZml4IHNlbmRzIHVzIHJpZ2h0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQgcHJlZml4LlxyXG4gICAgICAgICAgLy8gSXQgbWlnaHQgY3JlYXRlIGFuIGVuZGxlc3MgbG9vcCBidXQgaXQgaXMgT0sgdG8gZG8gc28uIEl0IGlzIGEgZGV2ZWxvcGVyIGJ1Zy5cclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSBoYW5kbGVkIGluIGNvbW1vbmhhbmRsZXJhZnRlclxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRXJyb3IgbWlnaHQgaGF2ZSBvY2N1cnJlZCBpbiBDUC5cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbClcclxuICAgICAgICAgIC8vIG9ubHkgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0b3AgZXhlY3V0aW9uIGN0cmxcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjdXJyQ3RybCk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDUCBnb3Qgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIGluIHRoaXMgaGFuZGxlciBhbmQgaXMgcGFya2FibGUuXHJcbiAgICAgICAgICAgIC8vIHdlIG1vdmUgdG8gdGhlIExhc3RQYXJrYWJsZSBjb250cm9sXHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChsYXN0UGFya2VkQ3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhsYXN0UGFya2VkQ3RybCwgLTEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gSXQgbXVzdCBiZSBzZXQgdG8gZmFsc2Ugc28gdGhhdCBuZXh0IHRpbWUgZm9yIGZhc3QgbW9kZSBDUyBtdXN0IGJlIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgY3VyckN0cmwuc2V0SW5Db250cm9sU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgICBpZiAoZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYmVmb3JlIHRoZSBoYW5kbGVyIGV4ZWN1dGUgaXRzIG9wZXJhdGlvbnMgcmV0dXJucyB0cnVlXHJcbiAgLy8vICAgaWYgdGhlIGZvcmNlIGV4aXQgd2FzIGhhbmRsZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRcIj50aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRCZWZvcmUoZXZ0OiBFdmVudCwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gZXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG4gICAgbGV0IGlzTmV3UmVjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgb2xkSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgZm9yY2VFeGl0ID09PSA8Rm9yY2VFeGl0PjBcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Ob25lIHx8IHJ0RXZ0LmlzSW1tZWRpYXRlKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSB0cnVlO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChvbGRSZWMgIT09IG51bGwgJiYgb2xkUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiBvbGRSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICBpc05ld1JlYyA9IHRydWU7XHJcbiAgICAgIG9sZElkeCA9IG9sZFJlYy5nZXRJZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaG91bGQgd2UgZXhpdCB0aGUgcmVjb3JkP1xyXG4gICAgaWYgKChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgfHwgZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgLy8gSWYgd2UgZmFpbGVkIGV4aXRpbmcgYSBuZXdseSBjcmVhdGVkIHJlY29yZCAtIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiB0aGlzLl9zdG9wRXhlY3V0aW9uICYmIGlzTmV3UmVjICYmIG9sZElkeCA9PT0gY3VyclJlYy5nZXRJZCgpICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgIC8vIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgY3VyclJlYy5yZXN0YXJ0KERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzMwMzc2MiAtIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgZm9yY2VFeGl0ID0gZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBjdHJsVmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwoZXZ0Q3RybCk7XHJcbiAgICAgICAgLy8gdGVzdCB0aGUgbmV3IGNvbnRyb2wgdmFsdWVcclxuICAgICAgICBhd2FpdCBldnRDdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUoY3RybFZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnQgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHJ0RXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21taXRSZWNvcmQodGFzaywgdHJ1ZSk7XHJcbiAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBwb3N0LXJlY29yZCB0eXBlIHdlIGFscmVhZHkgZGlkIHJlYy1wcmVmaXggYW5kIGN0cmwgcHJlZml4IGluIHRoZSBoYW5kbGVGb3JjZUV4aXRCZWZvcmVcclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChjdHJsICE9PSBudWxsICYmIGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgODAxODczIC0gdXBkYXRlIHRoZSBkaXNwbGF5IGFmdGVyIGhhbmRsZXIgb2YgZm9yY2UgZXhpdCBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIGNvbnRyb2wgdGhhdCBpcyBhdHRhY2hlZCB0byBhIGZpZWxkXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCAoPEZpZWxkPmV2dEN0cmwuZ2V0RmllbGQoKSkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGEgc3BlY2lhbCByb3V0aW5lIHRvIGhhbmRsZSBkYXRhIGFuZCB0aW1lciBldmVudHNcclxuICAvLy8gICBpdCByZWNlaXZlcyBhIEhhbmRsZXJzVGFibGUgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYnkgb25lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJzVGFiXCI+dGhlIGhhbmRsZXJzIHRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+YSByZWZlcmVubmNlIHRvIHRoZSB0aW1lciBydW50aW1lIGV2ZW50IC0gZm9yIGV4cHJlc3Npb24gZXZlbnRzIGl0IG11c3QgYmUgbnVsbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMShoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBoYW5kbGVyc1RhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBoYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICAgIC8vIHRoZSBydEV2dCBpcyB1c2VkIHRvIHBhc3MgdGhlIGN0cmwsIHRoZXJlZm9yIGl0IG11c3QgYmUgdmFsaWQgKG5vdCBudWxsKVxyXG4gICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fCBoYW5kbGVyLmlzU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNOb25TcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc0dsb2JhbEhhbmRsZXJPZihydEV2dCkpIHtcclxuICAgICAgICAgIGF3YWl0IGhhbmRsZXIuZXhlY3V0ZShydEV2dCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRha2VzIGNhcmUgb2Yga2V5ZG93biBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCBwcmVzc2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtiZEl0ZW1cIj5rZXlib3JkIGl0ZW08L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlS2V5RG93bih0YXNrOiBUYXNrLCBjdHJsOiBNZ0NvbnRyb2wsIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQga2JkSXRlbTogS2V5Ym9hcmRJdGVtID0gZXZ0LmdldEtiZEl0bUFsd2F5cygpO1xyXG4gICAgbGV0IGtleUNvZGU6IG51bWJlciA9IGtiZEl0ZW0uZ2V0S2V5Q29kZSgpO1xyXG4gICAgdGhpcy5fY3VycktiZEl0ZW0gPSBrYmRJdGVtO1xyXG5cclxuICAgIC8vIElmIGtleWJvYXJkIGJ1ZmZlcmluZyBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudCwgd2UgbmVlZCB0byBmaW5kIHRoZSByaWdodCBjb250cm9sIHRvIHJlY2VpdmVcclxuICAgIC8vIHRoaXMgZXZlbnRcclxuICAgIGlmIChldnQuSWdub3JlU3BlY2lmaWVkQ29udHJvbCkge1xyXG4gICAgICBjdHJsID0gdGhpcy5nZXRDdXJyQ3RybCgpO1xyXG4gICAgICB0YXNrID0gKCgoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIGluc3RhbmNlb2YgVGFzaykgPyA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgOiBudWxsKSk7XHJcbiAgICAgIC8vIFRoZSBjb250cm9sIHJlY2VpdmluZyBrZXlzIGZyb20ga2V5Ym9hcmQgYnVmZmVyaW5nIG11c3QgYmUgYSB0ZXh0Ym94XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdTdGFydCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogJyArIGtleUNvZGUpO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAvLyBET1dOIG9yIFVQIGludm9rZWQgb24gYSBTRUxFQ1QvUkFESU8gY29udHJvbFxyXG4gICAgICBpZiAodGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX0RPV04pIHx8IHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9VUCkpIHtcclxuICAgICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzaywgY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldFN5c3RlbSh0aGlzLl9jdXJyS2JkSXRlbSk7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhldnQuZ2V0U3RhcnRTZWxlY3Rpb24oKSwgZXZ0LmdldEVuZFNlbGVjdGlvbigpLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCAmJiBNZ0NvbnRyb2wudmFsaWRSZXR1cm5Ub0N0cmwoKSlcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBNR0RhdGEgaXMgc3RpbGwgYWxpdmUgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50cyBhYm92ZVxyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnRW5kIGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiAnICsga2V5Q29kZSk7XHJcbiAgICAgIC8vIGlmIGEga2V5IHdhcyBwcmVzc2VkIG9uIHRhYmxlIGNoaWxkLCBtYWtlIHN1cmUgdGhhdCBpcyBpcyB2aXNpYmxlXHJcbiAgICAgIGlmIChjdHJsICE9PSBudWxsICYmIGN0cmwuSXNSZXBlYXRhYmxlICYmIGN0cmwgPT09IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5IYW5kbGUgU2VsZWN0aW9uIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj52YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZWxlY3Rpb24oY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHZhbDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUKSB7XHJcbiAgICAgIGxldCBjaGVja0ZvY3VzOiBib29sZWFuID0gKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1gpO1xyXG4gICAgICBsZXQgYWxsb3dTZWxlY3Rpb246IGJvb2xlYW4gPSAoY2hlY2tGb2N1cyA/IChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGFzdFBhcmtlZEN0cmwoKSA9PT0gY3RybCkgOiB0cnVlKTtcclxuXHJcbiAgICAgIGlmICghYWxsb3dTZWxlY3Rpb24gfHwgIWN0cmwuaXNNb2RpZmlhYmxlKCkgfHwgIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpKVxyXG4gICAgICAgIGF3YWl0IGN0cmwucmVzdG9yZU9sZFZhbHVlKCk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgQ29tbWFuZHMuc2V0R2V0U3VnZ2VzdGVkVmFsdWVPZkNob2ljZUNvbnRyb2xPblRhZ0RhdGEoY3RybCwgY3RybC5Jc1JlcGVhdGFibGUgPyBsaW5lIDogMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjdHJsLmlzRGlmZmVyZW50VmFsdWUodmFsLCBjdHJsLklzTnVsbCwgdHJ1ZSkpIHtcclxuICAgICAgICAgIC8vICM5MzE1NDUgLSB2YXIgY2hhbmdlIG11c3QgYmUgaW52b2tlZCBmaXJzdCBiZWZvcmUgY29udHJvbCB2ZXJpZmljYXRpb24uXHJcbiAgICAgICAgICBjdHJsLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ3RybE1vZGlmeShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgQ29tbWFuZHMuc2V0R2V0U3VnZ2VzdGVkVmFsdWVPZkNob2ljZUNvbnRyb2xPblRhZ0RhdGEoY3RybCwgY3RybC5Jc1JlcGVhdGFibGUgPyBsaW5lIDogMCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBGb3IgbXVsdGlwbGUgc2VsZWN0aW9uIExpc3RCb3ggdmFsdWUgdG8gZmllbGQgYW5kIGN0cmwgd291bGQgYmUgc2V0IG9uIGxlYXZpbmdcclxuICAgICAgICAvLyBjb250cm9sLCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgc3VmZml4LiBTbyB2YXJpYWJsZSBjaGFuZ2UgaW50ZXJuYWwgZXZlbnQgd291bGQgYmVcclxuICAgICAgICAvLyBoYW5kbGVkIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCBzdWZmaXguXHJcbiAgICAgICAgaWYgKCFjdHJsLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCkpXHJcbiAgICAgICAgICBhd2FpdCBjdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUodmFsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBNb3VzZSBVcCBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udG9sXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvZHVjZUNsaWNrXCI+aWYgdHJ1ZSwgcHJvZHVjZSBjbGljayBldmVudFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTW91c2VVcChjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoY3RybCA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiAjIDYxNDQgc2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBfY3VyckNsaWNrZWRSYWRpbyBtZW1iZXJcclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPKVxyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRSYWRpbyA9IGN0cmw7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICAgIGlmICghYXdhaXQgY3RybC5jaGVja1Byb3BXaXRoTGluZShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlLCBsaW5lKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIHRydWUpO1xyXG4gICAgICAgIGxldCBTdG9wRm9jdXM6IGJvb2xlYW4gPSBjdHJsLmlzRm9jdXNlZFN0b3BFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgaWYgKCghY2FuR290b0N0cmwgfHwgKCh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cykgJiYgcmV0dXJuVG9DdHJsICE9PSBjdHJsKSkgJiYgcmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJvZHVjZUNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkpIHtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9DTElDSyk7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRSYWRpbyA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBDaGVjayBpZiBjdHggaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciwgaWYgc28gYW5kIGN1cnJlbnQgZXZlbnQgaXMgcm91dGUgZXZlbnQgLCB0aGVuIHNhdmUgaXRcclxuICAvLyAgdG8gZXhlY3V0ZSBhZ2FpbiB3aGVuICBzZXJ2ZXIgY3R4IGlzIHJlY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyKGFSdEV2dDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBhUnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT1cclxuICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSAmJiBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKSB7XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChhUnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBGb2N1cyBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXMoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIG9uQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcblxyXG4gICAgICBpZiAoY3RybC5pc1N0YXRpYygpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIElmIHdlIGF0dGVtcHQgdG8gcGFyayBvbiBjb250cm9sIHdoZXJlIHdlIGRvIG5vdCB3YW50IHRvIGFsbG93IHRvIHBhcmsgbGlrZSBpZiBjb250cm9sIGhhcyBleHByZXNzaW9uIG9yIHBhcmVudCB0YXNrIGZpZWxkLCBkbyBub3QgYWxsb3cgdG8gZm9jdXMgb24gaXQuXHJcbiAgICAgIC8vIFNldCBGb2N1cyBiYWNrIHRvIGxhc3RGb2N1c2VkQ29udHJvbC4gV2UgbmVlZCBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sIGFzIHdlIGdldCBmb2N1cyBldmVudCBvbiBhIGNvbnRyb2wgdHdpY2UuIFNvIHRvIGF2b2lkIHRvIHNob3cgZXJyb3IgbXVsdGlwbGUgdGltZXMsXHJcbiAgICAgIC8vIG1haW50YWluIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wuXHJcbiAgICAgIGlmIChjdHJsICE9PSB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgJiYgY3RybC5IYXNFeHBPclBhcmVudFRhc2tGaWVsZCgpKSB7XHJcbiAgICAgICAgLy8gU2hvdyBlcnJvciBvbmx5IGZvciBjb250cm9scyBoYXZpbmcgRGF0YSBwcm9wZXJ0eSBhbmQgcGFya2FibGVcclxuICAgICAgICBpZiAoY3RybC5pc0xpc3RCb3goKSB8fCBjdHJsLmlzQ2hlY2tCb3goKSB8fCBjdHJsLmlzQ29tYm9Cb3goKSB8fCBjdHJsLmlzVGV4dENvbnRyb2woKSB8fCBjdHJsLmlzUmFkaW8oKSB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFcnJvclRvTG9nKE5TdHJpbmcuRm9ybWF0KCdDb250cm9sIGVpdGhlciBoYXMgZXhwcmVzc2lvbiBvciBoYXMgcGFyZW50IHRhc2sgdmFyaWFibGUgYXR0YWNoZWQgdG8gaXQuIEZhaWxlZCB0byBwYXJrIG9uIGNvbnRyb2wgd2l0aCBuYW1lOiB7MH0nLCBjdHJsLk5hbWUpKTtcclxuICAgICAgICAgIC8vIERlZmVjdCAxNTI3Mjg6IFVzZSBsYXN0IGZvY3VzZWQgdGFzayBpbnN0ZWFkIGNvbnRyb2wgdGFzayBhcyBjb250cm9sIGNhbiBiZSBmcm9tIHN1YmZvcm0uXHJcbiAgICAgICAgICBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCksIDAsXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSA9PT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgPSBjdHJsO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAgIGlmIChvbkNsaWNrKVxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBjdHJsO1xyXG5cclxuICAgICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChjdHJsID09PSBwcmV2Q3RybCAmJiAhY3RybC5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICAgIC8vIHdlIHJlY2VpdmVkIGZvY3VzIHR3aWNlXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL2NoZWNrIGlmIGxhc3QgdGFzayBpcyBvcGVuZWQgaW4gTW9kYWwgU3ViZm9ybSwgaWYgeWVzLCBjbG9zZSBpdCBiZWZvcmUgZm9jdXNzaW5nIG9uIHBhcmVudCB0YXNrJ3MgY3RybFxyXG4gICAgICBsZXQgcHJldlRhc2s6IFRhc2sgPSA8VGFzaz5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcblxyXG5cclxuICAgICAgaWYgKGN0cmwgPT09IG51bGwgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICAgIGlmIChwcmV2Q3RybCA9PT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrO1xyXG4gICAgICBpZiAoKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSAmJiAoPFJhaXNlQXQ+KGF3YWl0IChjdHJsLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQpKS5nZXRWYWx1ZUludCgpKSA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cykpXHJcbiAgICAgICAgY3VyclRhc2sgPSBwcmV2VGFzaztcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGN1cnJUYXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdGhpcy5jYW5Hb1RvQ29udHJvbChjdHJsLCBvbkNsaWNrKTtcclxuXHJcbiAgICAgIC8vIEdvIHRvIHRoZSBjb250cm9sIC0gaW5zZXJ0IHByZWZpeFxyXG4gICAgICBpZiAoY2FuR290b0N0cmwpIHtcclxuICAgICAgICAvLyBNb2RhbCBzdWJmb3JtIHRhc2sgY2xvc2luZyBoYXMgYWxyZWFkeSBiZWd1bi4gRG8gbm90IGhhbmRsZSBIYW5kbGVTdWJmb3JtTW9kYWxpdHkoKSBhZ2Fpbi5cclxuICAgICAgICBpZiAodGhpcy5ndWlQZW5kaW5nRXZlbnQgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgaGFuZGxlZCA9IGF3YWl0IHRoaXMuSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmwsIHByZXZUYXNrLCBjdXJyVGFzayk7XHJcbiAgICAgICAgaWYgKGhhbmRsZWQpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBldmVudExpbmU6IG51bWJlciA9IChjdHJsLmlzUmVwZWF0YWJsZSgpIHx8IGN0cmwuaXNSYWRpbygpKSA/IGxpbmUgOiBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZXZlbnRMaW5lKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIGlmIChwcmV2Q3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghcHJldkN0cmwuaXNNb2RpZmlhYmxlKCkpIHtcclxuICAgICAgICAgIGlmIChwcmV2Q3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgICAgYXdhaXQgcHJldkN0cmwucmVzdG9yZU9sZFZhbHVlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghY3VyclRhc2suY2FuY2VsV2FzUmFpc2VkKCkpIHtcclxuICAgICAgICAgIGxldCBuZXdWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChwcmV2Q3RybCk7XHJcbiAgICAgICAgICBpZiAoIWF3YWl0IHByZXZDdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUobmV3VmFsLCB0cnVlKSlcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gcHJldkN0cmw7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPT09IGN0cmwpXHJcbiAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgY3RybC5zZXRGb2N1c2VkU3RvcEV4ZWN1dGlvbih0aGlzLl9zdG9wRXhlY3V0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBzdWJmb3JtIG1vZGFsaXR5IGJlZm9yIGZvdWNzc2luZyBvbiBwYXJlbnQgY3RybFxyXG4gIC8vLyAxLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSB0YXNrIGFuZCB1c2VyIGNsaWNrcyBvbiBpdCdzIHBhcmVudCA6IGNsb3NlIHRoZSBzdWJmb3JtIHRhc2suXHJcbiAgLy8vIDIuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBtb2RhbCBzdWJmb3JtICdTMicgd2hpY2ggaXMgb3BlbmVkIGluIGFub3RoZXIgc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uICBwYXJlbnQnUDEnXHJcbiAgLy8vIHdpbGwgY2xvc2UgYm90aCBTMiBhbmQgUzEuXHJcbiAgLy8vIDMuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBub24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBzdWJmb3JtIG1vZGFsICdTMScsIHRoZW4gY2xpY2tpbmcgb24gUzEsIHdpbGwgbm90IGNsb3NlIFMyXHJcbiAgLy8vIGJ1dCBjbGlja2luZyBvbiBQMSB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y3RybCB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcmV2VGFza1wiPnByZXZpb3VzIHRhc2sgd2hpY2ggd2FzIGluIGZvY3VzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJUYXNrXCI+Y3VycmVudCB0YXNrIHdoaWNoIGlzIHRvIGJlIGZvY3Vzc2VkPC9wYXJhbT5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVTdWJmb3JtTW9kYWxpdHkoY3RybDogTWdDb250cm9sLCBwcmV2VGFzazogVGFzaywgY3VyclRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZXZhbHVhdGUgdGhlIGNvcnJlY3QgcHJldlRhc2sgdG8gYmUgY2xvc2VkIGlmIGl0IGlzIE1vZGFsLlxyXG4gICAgLy8gaWYgbmV3bHkgc3ViZm9ybSBNb2RhbCB0YXNrIGlzIG9wZW5lZCBhbmQgaXQgaXMgbm90IHlldCBmb2N1c3NlZCwgaW4gdGhhdCBjYXNlIGN1cnIgdGFzayBpcyBzYW1lIGFzIHByZXZ0YXNrLlxyXG4gICAgLy8gbm93IGNsaWNraW5nIG9uIGl0J3MgcGFyZW50IHRhc2ssIHNob3VsZCBjbG9zZSB0aGUgTW9kYWwgc3ViZm9ybSB0YXNrXHJcbiAgICBsZXQgbGVuZ3RoID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFza3NDb3VudCgpO1xyXG4gICAgbGV0IHRvcFRhc2s6IFRhc2sgPSBwcmV2VGFzay5nZXRNR0RhdGEoKS5nZXRUYXNrKGxlbmd0aCAtIDEpO1xyXG4gICAgaWYgKGN1cnJUYXNrID09IHByZXZUYXNrIHx8IHByZXZUYXNrICE9IHRvcFRhc2sgLyogbmVzdGVkIHN1YmZvcm0gKi8pIHtcclxuICAgICAgaWYgKHRvcFRhc2sgIT0gbnVsbCAmJiBwcmV2VGFzayAhPSB0b3BUYXNrICYmIHRvcFRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRvcFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsLklzTW9kYWwoKSlcclxuICAgICAgICAgIHByZXZUYXNrID0gdG9wVGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNsb3NlIHN1YmZvcm0gdGFzayBpcyBNb2RhbCBpZiB0byBiZSBwYXJrZWQgb24gcGFyZW50LlxyXG4gICAgaWYgKHByZXZUYXNrICE9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSAmJiBwcmV2VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcblxyXG4gICAgICBpZiAoIWN1cnJUYXNrLmlzRGVzY2VuZGVudE9mKHByZXZUYXNrKSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5wcmV2VGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLklzTW9kYWwoKSAmJiAhY3VyclRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSlcclxuICAgICAgICAgIHN1YmZvcm1DdHJsID0gcHJldlRhc2suR2V0U3ViZm9ybU1vZGFsUGFyZW50VGFzaygpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsICYmIChjdHJsICE9IHN1YmZvcm1DdHJsKSAmJiBzdWJmb3JtQ3RybC5Jc01vZGFsKCkpIHtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1TdWJmb3JtQ2xvc2UoPE1nQ29udHJvbD5zdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuZ3VpUGVuZGluZ0V2ZW50ID0gdGhpcy5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgICAgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBDYWxscyBDb250cm9scyBTdWZmaXggd2hlbiBmb2N1cyBvbiBOb24gbWFnaWMgY29udHJvbCBpLmUuIGNvbnRyb2wgd2l0aCBNYWdpY0R1bW15Q29udHJvbCBpcyByZWNlaXZlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgY3RybC5zZXRGb2N1c2VkU3RvcEV4ZWN1dGlvbih0aGlzLl9zdG9wRXhlY3V0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgd2UgY2FuIGdvIHRvIHRoZSBjb250cm9sIGFuZCB0cnkgdG8gcGFyayBvbiBpblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+cmVhbCBjbGljayBpcyBwZXJmb3JtZWQsIHRoaXMgbm90IGNsaWNrIHNpbXVsYXRpb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjYW5Hb1RvQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wsIG9uQ2xpY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAob25DbGljayAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUikpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBWOS40U1A0ZCBjaGFuZ2Ugb2YgYmVoYXZpb3IgLSB3ZSBkbyBub3QgXCJleGl0XCIgZnJvbSB0aGUgY3VycmVudCBjdHJsXHJcbiAgICAvLyAoaS5lLiBub3QgcGVyZm9ybWluZyBjdHJsIHN1ZmZpeCBvciBjdHJsIHZlcmlmaWNhdGlvbnMpIGlmIHRoZSB0YXJnZXQgY3RybFxyXG4gICAgLy8gaXMgSU1HIG9yIGh5cGVydGV4dC5cclxuICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAvLyBpZiBjYW5jZWwgaXMgcmFpc2VkICwgdGhlbiBkbyBub3QgZ28gdG8gbmV4dCBjb250cm9sIGJlZm9yZSBoYW5kbGluZyBjYW5jZWwgZXZlbnQuXHJcbiAgICBsZXQgbGFzdFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICBpZiAoIWN1cnJUYXNrLklzSW50ZXJhY3RpdmUgfHwgKGxhc3RUYXNrICE9IG51bGwgJiYgbGFzdFRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPSBudWxsICYmXHJcbiAgICAgIGxhc3RUYXNrLmNhbmNlbFdhc1JhaXNlZCgpKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFICYmICFjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgY2FuR290b0N0cmwgPSBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gY2FuR290b0N0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIFRpbWVyIEV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50dW50aW1lIHRpbWVyIGV2ZW50PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVRpbWVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBldnQuc2V0VHlwZShDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKTtcclxuICAgIGlmIChldnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbnRleHRJbmFjdGl2aXR5QWxlcnQoZXZ0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGV2dC5nZXRNZ2RJRCgpKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdkLmdldFRpbWVySGFuZGxlcnMoKSwgZXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgV2hlbiB0aGUgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQgaXMgYWJvdXQgdG8gZXhwaXJlLCByYWlzZSBhIHdhcm5pbmcgdG8gdXNlclxyXG4gIC8vICAgIHNvIHRoYXQgdGhlIHNlc3Npb24gY2FuIGJlIGNvbnRpbnVlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50dW50aW1lIHRpbWVyIGV2ZW50PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNvbnRleHRJbmFjdGl2aXR5QWxlcnQoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0aW1lTm93OiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gZXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKTtcclxuICAgIGxldCBsYXN0UmVxdWVzdFRpbWU6IG51bWJlciA9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuR2V0TGFzdFJlcXVlc3RUaW1lO1xyXG4gICAgbGV0IGNvbnRleHRJbmFjdGl2aXR5VGltZW91dDogbnVtYmVyID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgLyAxMDtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lOiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKCkgLyAxMDtcclxuXHJcbiAgICBsZXQgaWRsZVRpbWUgPSAodGltZU5vdyAtIGxhc3RSZXF1ZXN0VGltZSkgLyAxMDAwO1xyXG5cclxuICAgIC8vIERpc3BsYXkgdGhlIGNvbmZpcm1hdGlvbiBvbmx5IGZvciB2YWxpZCB0aW1lb3V0c1xyXG4gICAgaWYgKGNvbnRleHRJbmFjdGl2aXR5VGltZW91dCA9PSAwIHx8IGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUgPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ICYmIGlkbGVUaW1lID49IChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLSBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKSkge1xyXG4gICAgICAvLyByYWlzZSBhbiBhbGVydCB0byBub3RpZnkgdXNlciB3aGVuIHRoZSBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWRcclxuICAgICAgLy8gaWYgdXNlciBjbGlja3Mgb24gT0ssIHNlbmQgZHVtbXkgcmVxdWVzdCB0byBzZXJ2ZXIuIElmIENhbmNlbCBpcyBjbGlja2VkLCBkbyBub3RoaW5nLlxyXG4gICAgICBsZXQgdXNlckNvbmZpcm1hdGlvbjogbnVtYmVyID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KHRoaXMuY29uZmlybWF0aW9uRGlhbG9nVGl0bGUsIHRoaXMuY29uZmlybWF0aW9uRGlhbG9nTXNnLCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk8pO1xyXG4gICAgICBpZiAodXNlckNvbmZpcm1hdGlvbiA9PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpIHtcclxuICAgICAgICAvLyBzZW5kIHJlcXVlc3QgdG8gc2VydmVyIHRvIG1hcmsgdGhlIGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0IHRvIHplcm9cclxuICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbnRleHRUaW1lb3V0UmVzZXRFdmVudENvbW1hbmQoKTtcclxuICAgICAgICBtZ2QuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIudXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgZXhwcmVzc2lvbiBoYW5kbGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgIHJ0RXZ0LnNldEV4cHJlc3Npb24obnVsbCk7XHJcbiAgICBydEV2dC5zZXRNYWluUHJnQ3JlYXRvcihydEV2dC5nZXRUYXNrKCkpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgIT09IG51bGwgJiYgIW1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRFeHBIYW5kbGVycygpLCBydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzaXplIG9mIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPnRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplKGN0cmw6IE1nQ29udHJvbCwgcm93c0luUGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuc2V0Um93c0luUGFnZShyb3dzSW5QYWdlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZGF0YSBmb3IgUm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj5pZiB0cnVlLCBzZW5kIGFsbCByZWNvcmRzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJvd0RhdGFDdXJQYWdlKHRhYmxlOiBNZ0NvbnRyb2wsIGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBsYXN0Rm9jdXNlZFZhbDogTGFzdEZvY3VzZWRWYWwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhYmxlLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0uc2V0Um93RGF0YShkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zZmVycyBkYXRhIHRvIEdVSSB0aHJlYWQgaW4gZnJlZSB3b3JrZXIgdGhyZWFkIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUcmFuc2ZlckRhdGFUb0d1aShjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS50cmFuc2ZlckRhdGFUb0d1aSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLkZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gaW50ZXJuYWwgYWN0IGFza3MgZm9yIGVuYWJsZS9kaXNhYmxlIG9mIGFuIGFjdCBsaXN0LlxyXG4gIC8vLyAgIGNhbGwgZW5hYmxlTGlzdCB3aXRoIG9ubHlJZkNoYW5nZWQgPSB0cnVlIHRvIG1pbmltaXplIGNhbGxzIHRvcyByZWZyZXNoLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmFibGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlRW5hYmxlRXZlbnRzKGV2dDogUnVuVGltZUV2ZW50LCBlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGV2dC5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5lbmFibGVMaXN0KGV2dC5nZXRBY3RFbmFibGVMaXN0KCksIGVuYWJsZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlcyBjb250cm9sIFByZWZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDdHJsUHJlZml4KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3VyckNsaWNrZWRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPlJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmw7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICBpZiAoZm9ybS5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSB8fCBjdHJsLmlzUmFkaW8oKSlcclxuICAgICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcbiAgICB9IGVsc2VcclxuICAgICAgZGlzcGxheUxpbmUgPSBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvLyBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgLy8gRm9yIEZhc3QgTW9kZSwgQ1MgaXMgZXhlY3V0ZWQgZnJvbSBoZXJlLCB3aGVyZWFzIGZvciBzdGVwIG1vZGUgaXQgaXMgZG9uZVxyXG4gICAgLy8gaW4gbW92ZUluUm93LiBzbywgZm9yIHN0ZXAgbW9kZSBkb3VibGUgZXhlY3V0aW9uIG9mIENTIG11c3QgYmUgc3RvcHBlZC5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TUdEYXRhKCkuR2V0SWQoKSA9PT0gKDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TUdEYXRhKCkuR2V0SWQoKSAmJiBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgaWYgKChjdHJsICE9PSBsYXN0UGFya2VkQ3RybCB8fCAoY3RybC5pc1JlcGVhdGFibGUoKSAmJiBkaXNwbGF5TGluZSAhPT0gY3RybC5nZXREaXNwbGF5TGluZSh0cnVlKSkpICYmICFsYXN0UGFya2VkQ3RybC5pc0luQ29udHJvbFN1ZmZpeCgpKVxyXG4gICAgICAvLyBRQ1IgIzk3MDgwNlxyXG4gICAgICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gVE9ETzogRm9jdXMgJiBUYWJiaW5nOiBIYW5kbGUgUGFya2luZyBpbiB0aGlzIGNhc2UuIFNob3VsZCBub3QgcmV0dXJuIGZhbHNlIGluIHNjcmVlbiBtb2RlXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGFzay5JbkN0cmxQcmVmaXgpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB0YXNrLkluQ3RybFByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIGl0IGhhcyBub3QgY29tZSBhZ2FpbiB0aHJvdWdoIG1vdmVpbnJvdy5cclxuICAgIC8vIGVnOiBpZiBjbGlja2VkIGN0cmwgb24gc3ViZm9ybSBpcyBub24gcGFya2FibGUsIGZpcnN0IHRpbWUgaXQgZXhlY3V0ZXMgUlAgQ1YgZm9yIHN1YmZvcm1zIGFuZCB0aGVuXHJcbiAgICAvLyBlbnRlcnMgbW92ZWlucm93IGZvciBwYXJrYWJsZSBjdHJsLiB3ZSBzaG91bGRub3QgZXhlY3V0ZSB0aGlzIGJsb2NrIHdoZW4gd2UgY29tZSBmb3IgQ1Agb2YgcGFya2FibGUgY3RybC5cclxuICAgIC8vIEZvciB0YWIsIHdlIGNvbWUgaGVyZSBkaXJlY3RseSBmb3IgcGFya2FibGUgY3RybCwgYW5kIHRoaXMgYmxvY2sgbXVzdCBhbHdheXMgZXhlY3V0ZSBpZiBvbiBkaWZmIGZvcm1zLlxyXG4gICAgLy8gaXNTb3J0IDogaWYgY2xpY2tlZCBvbiB0YWJsZSBoZWFkZXIsIHdlIHBhcmsgb24gY29sb21uIGN0cmwgYWZ0ZXIgc29ydCwgYW5kIHdlIG11c3QgaW5jbHVkZSBzdWJmb3Jtc1xyXG4gICAgLy8gaW4gZXhlY3V0aW5nIENWc1xyXG5cclxuICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogQ2hlY2sgZ2V0TGFzdE1vdmVJblJvd0RpcmVjdGlvbiBpcyByZWxldmFudC4gV2hpbGUgbW92aW5nIGJldHdlZW4gY29udHJvbHMgYnkgVGFiIGNvZGUgaW4gaWYgYmxvY2sgd2FzIG5vdCBjYWxsZWQuXHJcbiAgICAvLyBCdXQgaXQgd2FzIGNhbGxlZCBvbiBjbGljayB0byBhbm90aGVyIGNvbnRyb2wuXHJcbiAgICAvL2lmICh0YXNrLmdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24oKSA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05PTkUgfHwgdGhpcy5faXNTb3J0aW5nKSB7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY3RybCBpcyBvbiBhIHN1YmZvcm0sIHRoZW4gZXhlY3V0ZSBpbiBzZXF1ZW5jZVxyXG4gICAgLy8gMS4gUlMgb2YgbmVzdGVkIHN1YmZvcm1zIHVudGlsIHN1YmZvcm0gdGFzayBjb250YWluZyB0aGVzZSAyIHN1YmZvcm1zLiB3ZSBtdXN0IGFsc28gZXhlY3V0ZSBSUyBpZiBjbGlja2VkXHJcbiAgICAvLyAgICBpbiBzdWJmb3JtIGFuZCBwYXJrZWQgYmFjayBvbiBhIGN0cmwncyB0YXNrLiAoIzcyMjExNS0gY3VyckNsaWNrZWRDdHJsIGFuZCBjdHJsIHNob3VsZCBub3QgYmUgb24gZGlmZmVyZW50IHdpbmRvdylcclxuICAgIC8vIDIuIENWIGV4ZWN1dGlvbiBvZiBMYXN0UGFya2VkQ3RybCB0aWxsIGVuZFxyXG4gICAgLy8gMy4gUlAtQ1ZzIGZvciBhbGwgaW50ZXJtZWRpYXRlIHN1YmZvcm1zXHJcbiAgICBsZXQgcHJldkN0cmw6IE1nQ29udHJvbCA9IGxhc3RQYXJrZWRDdHJsO1xyXG4gICAgaWYgKGN1cnJDbGlja2VkQ3RybCAhPT0gbnVsbCAmJiAoPFRhc2s+Y3VyckNsaWNrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCkgJiYgY3RybC5vbkRpZmZGb3JtKGN1cnJDbGlja2VkQ3RybCkpXHJcbiAgICAgIHByZXZDdHJsID0gY3VyckNsaWNrZWRDdHJsO1xyXG5cclxuICAgIGlmIChwcmV2Q3RybCAhPT0gbnVsbCAmJiBjdHJsLm9uRGlmZkZvcm0ocHJldkN0cmwpKSB7XHJcbiAgICAgIC8vIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFuaW5nIHRoZXNlIDIgc3ViZm9ybXNcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+cHJldkN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgYXdhaXQgcHJldlRhc2suZXhlY1N1YmZvcm1SZWNTdWZmaXgoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5kb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEV4ZWN1dGUgUlAgb2YgdGhlIGN1cnJlbnQgdGFzayBiZWZvcmUgZXhlY3V0aW5nIHRoZSBDVnMgYmVmb3JlICdjdHJsJ1xyXG4gICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVM7XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvL31cclxuXHJcbiAgICAvLyBRQ1IjIDgwNjAxNTogSWYgd2UgaGF2ZSBhIHNpbmdsZSBmaWVsZCB3aXRoIGFsbG93IHBhcmtpbmcgPSBZZXMgYW5kIFRhYiBJbnRvID0gTm8sIHRoZW4gb24gcHJlc3NpbmcgdGFiIGlmIGN1cnNvciBpcyBub3QgbW92ZWQsIHdlIGNvbWUgdG9cclxuICAgIC8vIHBhcmsgb24gbGFzdFBhcmtlZEN0cmwod2hpY2ggaXMgc2FtZSBhcyBjdHJsKSBzaW5jZSBUYWJJbnRvIGlzIG5vdCBhbGxvd2VkLlxyXG4gICAgLy8gU28gdG8gYXZhb2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgd2Ugc2hvdWxkIG5vdCBhZ2FpbiB0cnkgdG8gcGFyayBvbiBpdC5cclxuICAgIGlmICghYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkgJiYgY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhYXdhaXQgbGFzdFBhcmtlZEN0cmwuaW52b2tlKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKE5TdHJpbmcuRm9ybWF0KCd7MH0gRW50ZXJpbmcgY29udHJvbDogY29udHJvbCB7MX0sIHJvdyB7Mn0nLCB0YXNrLkdldFRhc2tEZXRhaWxzKCksIGN0cmwuTmFtZSwgZGlzcGxheUxpbmUgPCAwID8gMCA6IGRpc3BsYXlMaW5lKSwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gaWYgd2UgaGF2ZSBhIHN0b3AgZXhlY3V0aW9uIGN0cmwsIHdlIG5lZWQgdG8gdXNlIGl0IGFzIGEgc3JjdHJsLCBvdGhlcndpc2UgdXNlXHJcbiAgICAvLyB0aGUgY3RybCBvbiB3aGljaCB3ZSBleGVjdXRlZCBsYXN0IENTLlxyXG5cclxuXHJcbiAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpO1xyXG4gICAgY3RybC5LZXlTdHJva2VPbiA9IGZhbHNlO1xyXG4gICAgY3RybC5Nb2RpZmllZEJ5VXNlciA9IGZhbHNlO1xyXG5cclxuICAgIHRhc2suc2V0Q3VyckZpZWxkKGN0cmwuZ2V0RmllbGQoKSk7XHJcblxyXG4gICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgLy8gZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgU3ViZm9ybXNcclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gY3RybCkge1xyXG4gICAgICBpZiAoKGxhc3RQYXJrZWRDdHJsID09PSBudWxsICYmIGN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSB8fCAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKGN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpIHx8IGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSkpKSB7XHJcbiAgICAgICAgbGV0IGxhc3RQYXJrZWRUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICBsYXN0UGFya2VkVGFzayA9IDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgICAgIGlmIChsYXN0UGFya2VkVGFzayAhPT0gdGFzaykge1xyXG4gICAgICAgICAgbGV0IGZpcnN0VGltZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgaXNTb25TdWJmb3JtOiBib29sZWFuO1xyXG4gICAgICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2s7XHJcblxyXG4gICAgICAgICAgaWYgKGxhc3RQYXJrZWRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IGxhc3RQYXJrZWRUYXNrLklzU3ViRm9ybTtcclxuXHJcbiAgICAgICAgICAgIGZvciAocGFyZW50VGFzayA9IGxhc3RQYXJrZWRUYXNrOyBwYXJlbnRUYXNrICE9PSBudWxsICYmIGlzU29uU3ViZm9ybTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoIWZpcnN0VGltZSkge1xyXG4gICAgICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gcGFyZW50VGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrLmVuYWJsZUNyZWF0ZUFjdHMoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc1NvblN1YmZvcm0gPSB0YXNrLklzU3ViRm9ybTtcclxuXHJcbiAgICAgICAgICBmb3IgKHBhcmVudFRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpOyAocGFyZW50VGFzayAhPT0gbnVsbCkgJiYgaXNTb25TdWJmb3JtOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBwYXJlbnRUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgICAgICAgICBwYXJlbnRUYXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBXaGVuZXZlciB3ZSBhcmUgbW92aW5nIGJldHdlZW4gdGFza3MsIHJlLWV2YWx1YXRlIEFsbG93TW9kZXMuXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZW5hYmxlIGFjdGlvbnMgYW5kIHN0YXRlc1xyXG4gICAgaWYgKHRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSB8fCBjdHJsLnVzZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG5cclxuICAgIGlmIChjdHJsLmlzVGV4dENvbnRyb2woKSB8fCBjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICBjdHJsLlNldEtleWJvYXJkTGFuZ3VhZ2UoKTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiwgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG5cclxuICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+Y3RybC5nZXRGaWVsZCgpO1xyXG4gICAgaWYgKGZpZWxkICE9PSBudWxsICYmIGZpZWxkLk51bGxBbGxvd2VkICYmIGN0cmwuaXNNb2RpZmlhYmxlKCkgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMLCB0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gc29tZSBkZWZhdWx0IG9wZXJhdGlvbnMgZm9yIGFuIGV2ZW50IGFuZCByZXR1cm4gdHJ1ZSB0byB0ZWxsIHRoZSBjYWxsZXJcclxuICAvLy8gICB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uSGFuZGxlckJlZm9yZShldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGV2dFNhdmU6IFJ1blRpbWVFdmVudCA9IGV2dDtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgcHJldlJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCB2YWw6IHN0cmluZztcclxuICAgIGxldCBvbGREaXNwbGF5TGluZTogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgbGV0IGFjdElkOiBudW1iZXIgPSB0aGlzLmdldE1hdGNoaW5nQWN0aW9uKGV2dC5nZXRLYmRJdG0oKSk7XHJcbiAgICAgIGlmIChhY3RJZCAhPT0gMCAmJiBldnQuQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgLy8gJiYgYWN0SWQgIT0gTUdfQUNUX1NFTEVDVClcclxuICAgICAge1xyXG4gICAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgZXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgICAgICBldnRTYXZlLnNldEN0cmwobWdDb250cm9sKTtcclxuICAgICAgICBpZiAobWdDb250cm9sID09PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIyA5MzkyNTMgLSB3ZSBoYXZlIHRvIHByb2Nlc3MgY29tbW9uSGFuZGxlckJlZm9yZSBldmVuIGZvciBpbnRlcm5hbCBldmVudCBjb252ZXJ0ZWRcclxuICAgIC8vIGZyb20gc3lzdGVtIEV2ZW50XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSBldnQuZ2V0RGlzcGxheUxpbmUoKTtcclxuICAgICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgc3dpdGNoIChpbnRFdnRDb2RlKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTTpcclxuICAgICAgICAgIGxldCBib29sdmFsID0gYXdhaXQgdGhpcy5zZWxlY3RQcm9nKGN0cmwpO1xyXG4gICAgICAgICAgaWYgKGJvb2x2YWwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJfT05fREJMSUNLOlxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfRk9DVVM6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvY3VzKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfRk9DVVNfT05fTk9OX01BR0lDX0NPTlRST0w6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlS2V5RG93bih0YXNrLCBjdHJsLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PVVNFVVA6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbkFjdFNlbGVjdGlvbihjdHJsLCBmb3JtLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVGltZXIoZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVTSVpFOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST1dfREFUQV9DVVJSX1BBR0U6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJvd0RhdGFDdXJQYWdlKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNTZW5kQWxsKCksIGV2dC5MYXN0Rm9jdXNlZFZhbCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIGZhbHNlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTkwMy4gRG8gbm90IGV4ZWN1dGUgUlAgaWYgdGhlIHN1YmZvcm0gcGFyZW50IHRhc2sgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gICAgICAgICAgLy8gaXQncyBDb21tb25IYW5kbGVyQmVmb3JlIGZvciBSUC5cclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiAoPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkuSW5Db21tb25IYW5kbGVyQmVmb3JlUlApXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBSZWNvdmVyeSBmcm9tIHRyYW5zYWN0aW9uIHJlc3RhcnQgd2FzIGNvbXBsZXRlZC4gV2UgbWF5IG5vdyBjbGVhciB0aGUgZmxhZ1xyXG4gICAgICAgICAgdGFzay5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG4gICAgICAgICAgdGFzay5EYXRhU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzU3RhcnRlZCgpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBmb3JtIGNvbnRhaW5zIGEgdGFibGUgYW5kIHRoZSBjb250cm9sIHdhcyBpbiB0aGUgdGFibGVcclxuICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5ldyByb3dcclxuICAgICAgICAgIGlmIChmb3JtLmdldFJvd3NJblBhZ2UoKSA+IEludDMyLk1pblZhbHVlICYmIGRpc3BsYXlMaW5lID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gZW5zdXJlIGEgdmFsaWQgcm93XHJcbiAgICAgICAgICAgIHdoaWxlICghZHYucmVjRXhpc3RzKGRpc3BsYXlMaW5lKSAmJiBkaXNwbGF5TGluZSA+IDApIHtcclxuICAgICAgICAgICAgICBkaXNwbGF5TGluZS0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5TGluZSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgcHJldlJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkVGFza01vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gcHJldlJlYy5nZXRJZCgpO1xyXG5cclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb2xkRGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgLy8gb2xkRGlzcGxheUxpbmUgPSBmb3JtLmdldEN1cnJSb3coKVxyXG4gICAgICAgICAgICAgICAgZm9ybS5QcmV2RGlzcGxheUxpbmUgPSBvbGREaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXkgaWYgdGhlIHByZXZpb3VzIHJlY29yZCB3YXMgZGVsZXRlZCBvciBjYW5jZWxlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZSZWMgIT0gbnVsbCAmJiAhZHYucmVjRXhpc3RzQnlJZChwcmV2UmVjLmdldElkKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVmcmVzaCBpcyBlc3NlbnRpYWwuIElmIGl0IGZhaWxzIGJlY2F1c2Ugb2YgYW5cclxuICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHRoZW4gdGhlIG9sZCBjdXJyIHJvdyBpcyByZXN0b3JlZCAoaW4gdGhlIGNhdGNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudCkuIEl0IGNhbiBoYXBwZW4gd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5lIHdoaWNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgYmxhbmsgZHVlIHRvIHRoZSBkZWxldGlvbiBvZiB0aGUgcHJldmlvdXMgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhZHYucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2TGluZTogbnVtYmVyID0gZm9ybS5nZXRQcmV2TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShwcmV2TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RGb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLlN0YWNrVHJhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBpbnZhbGlkIGxpbmUgbnVtYmVyOiAnICtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgICdpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXJCZWZvcmUoKTogbm8gY3VycmVudCByZWNvcmQgYXZhaWxhYmxlICEnKTtcclxuXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciBub24gaW50ZXJhY3RpdmUgdGFza3MuIEluY3JlYXNlIHRoZSB0YXNrJ3MgY291bnRlciBmb3IgZXZlcnkgcmVjb3JkIHdlIHBhc3MuXHJcbiAgICAgICAgICAvLyBkbyBpdCBiZWZvcmUgdGhlIGV2YWxFbmRDb25kIHNpbmNlIGl0IG1pZ2h0IGluY2x1ZGUgY291bnRlcigwKS5cclxuICAgICAgICAgIC8vIGluY3JlYXNlIG9ubHkgaWYgZ29pbmcgaW50byB0aGUgcmVjIHByZWZpeC5cclxuICAgICAgICAgIGlmICghdGFzay5Jc0ludGVyYWN0aXZlICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgdGFzay5pbmNyZWFzZUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgXCJ0YXNrIGVuZCBjb25kaXRpb25cIiBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlY29yZFxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9CRUZPUkUpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcblxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1JFQ09SRCBQUkVGSVg6ICcgKyB0YXNrLnF1ZXJ5VGFza1BhdGgoKSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5zZXRGb3JjZVNhdmVPcmcoZmFsc2UpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gUmVjb3JkIFByZWZpeCBmb3IgYWxsIGZhdGhlcnMgdGhhdCB0aGVpciBSZWNvcmQgUHJlZml4IGlzIG5vdCBkb25lIGVhcmxpZXJcclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgICAgICAgbGV0IHBhcmVudFRhc2sgPSB0YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICB3aGlsZSAocGFyZW50VGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhwYXJlbnRUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gcGFyZW50VGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBoYW5kbGUgc3ViLWZvcm1zXHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgLy8gZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgYSByZWNvcmRcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBGb3JjZSByZWNvcmQgc3VmZml4OlxyXG4gICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICBsZXQgaXNTZWxlY3Rpb25UYWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIE5vIHJlY29yZCAtPiBubyBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gbm90IGV4ZWN1dGUgdGhlIFwiYmVmb3JlIHJlY29yZCBzdWZmaXhcIiB3aGVuIGRlbGV0aW5nIHRoZSByZWNvcmQgYW5kXHJcbiAgICAgICAgICAvLyB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAodGhlIHNlY29uZCByb3VuZClcclxuICAgICAgICAgIGlmICgocmVjLk1vZGlmaWVkIHx8IGZvcmNlU3VmZml4KSAmJiByZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdSRUNPUkQgU1VGRklYOiAnICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpbmRpY2F0ZSBuZXh0IHZlcmlmeUN0cmwgaXMgdGhlIGZpcnN0IGN0cmwgaW4gdGhlIHJlY29yZFxyXG5cclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgICAgaXNTZWxlY3Rpb25UYWJsZSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIFF1ZXJ5IG1vZGUgLT4gZG8gc3VmZml4IG9ubHkgaWYgd2UgZm9yY2UgaXQgb3Igc29tZWhvdyB0aGUgcmVjb3JkIHdhcyB1cGRhdGVkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIWZvcmNlU3VmZml4ICYmICFyZWMuTW9kaWZpZWQgJiZcclxuICAgICAgICAgICAgIWlzU2VsZWN0aW9uVGFibGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJlYy5Nb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFICYmIHJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudXBkYXRlQ29uZmlybWVkKHRhc2spKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9ICFhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgLy8gZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgUlMgaWYgQ1YgcmV0dXJucyBlcnJvclxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUN0cmxQcmVmaXgoZXZ0KSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGlkIG5vdCBzdWNjZWVkIGluIGVudGVyaW5nIHRoZSBjdHJsXHJcbiAgICAgICAgICAgIGV2dC5Db250cm9sLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTsgLy8gUUNSICMzNzEzMjFcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuXHJcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcGV4ZWN1dGlvbiBjdHJsIHdlIHNob3VsZCBub3QgZXhlY3V0ZSBDUy5cclxuICAgICAgICAgIGlmIChjdHJsID09IG51bGwgfHwgdGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghY3RybC5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgICB2YWwgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBhcmUgcmVzZXR0aW5nIHRoZSBmbGFnIGFzIHdlIGFyZSBtb3ZpbmcgZnJvbSBvbmUgY29udHJvbCB0byBvdGhlciBjb250cm9sLlxyXG4gICAgICAgICAgICB0YXNrLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6NzU4Nzg4LCB0aGUgYnJvd3NlciBjb250cm9sIHdpbGwgbm90IGJlIHVwZGF0ZSBmcm9tIHRoZSBmaWxlZC5cclxuICAgICAgICAgICAgLy8gUGF0Y2ggZm9yIFFDUiAjNzI5NzA2OlxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgcHV0cyB0aGUgZm9sbG93aW5nIEdVSSBjb21tYW5kczpcclxuICAgICAgICAgICAgLy8gICAgUFJPUF9TRVRfSU1BR0VfRklMRV9OQU1FIHRvIHNldCB0aGUgaW1hZ2Ugb24gdGhlIEltYWdlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX1RFWFQgdG8gc2V0IHRoZSB0ZXh0IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFNFVF9GT0NVUyB0byBmb2N1cyBvbiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3csIHdoZW4gdGhlIGV4ZWN1dGlvbiBpcyBieSBGNywgaWYgdGhlIGZpbGUgaXMgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgLy8gKGkuZS4gaWYgdGhlcmUgaXMgNDA0IGVycm9yKSwgSHR0cENsaWVudCByZS10cmllcyB0byBnZXQgdGhlIGZpbGUgZm9yIEhUVFB0aW1lb3V0LlxyXG4gICAgICAgICAgICAvLyBEdXJpbmcgdGhpcyB0aW1lIGFsbCB0aGUgR1VJIGV2ZW50cyBpbiBHdWlDb21tYW5kc1F1ZXVlIHJlbWFpbnMgcGVuZGluZyB1bmhhbmRsZWQuXHJcbiAgICAgICAgICAgIC8vIEluIHRoZSBtZWFuIHRpbWUsIE1hZ2ljIHRocmVhZCBleGVjdXRlcyB0aGUgRXhpdCBldmVudCBhbmQgZHVyaW5nIHRoaXMsIGl0IHRyaWVzXHJcbiAgICAgICAgICAgIC8vIHRvIGV4ZWN1dGUgdGhlIEN0cmwgU3VmZml4IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIFNFVF9GT0NVUyBpcyBzdGlsbCBwZW5kaW5nIGluIHRoZSBxdWV1ZSwgdGhlIGxvZ2ljYWwgY29udHJvbCAoaWYgYWxsb3dUZXN0aW5nPU5vKVxyXG4gICAgICAgICAgICAvLyBpcyBub3QgbWFwcGVkIHdpdGggYW55IGFjdHVhbCB3aW5kb3dzIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIE5vdyB3aGVuIHdlIHRyeSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoaXMgbG9naWNhbCBjb250cm9sLCBMb2dpY2FsQ29udHJvbC5nZXRFZGl0b3JDb250cm9sKClcclxuICAgICAgICAgICAgLy8gcmV0dXJucyBudWxsIGFuZCBzbywgU3RhdGljVGV4dC5nZXRWYWx1ZSgpIHJldHVybnMgTG9naWNhbENvbnRyb2wuVGV4dCBpbnN0ZWFkIG9mIENvbnRyb2wuVGV4dFxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIFBST1BfU0VUX1RFWFQgaXMgYWxzbyBwZW5kaW5nLCBMb2dpY2FsQ29udHJvbC5UZXh0IGlzIG51bGwuXHJcbiAgICAgICAgICAgIC8vIEFuZCBzbyB0aGVyZSBpcyBhbiBleGNlcHRpb24gd2hlbiB1c2luZyBpdC5cclxuICAgICAgICAgICAgLy8gSWYgQWxsb3dUZXN0aW5nPVllcywgdGhlIHZhbCB3aWxsIGJlIGEgYmxhbmsgc3RyaW5nLiBTbywgdGhlcmUgaXMgbm8gY3Jhc2guXHJcbiAgICAgICAgICAgIC8vIEJ1dCBoZXJlIHdlIGhhdmUgYW5vdGhlciBwcm9ibGVtLiBTdXBwb3NlLCB0aGUgZmllbGQgaGFkIGFuIEluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICAgLy8gTm93LCBNZ0NvbnRyb2wncyB2YWx1ZSB3b3VsZCBiZSB0aGUgaW5pdGVkIHZhbHVlIGFuZCB0aGUgdmFsIGlzIGEgYmxhbmsgc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBTbywgd2Ugd2lsbCBoYXZlIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2JsZW0gaXMgcmVsYXRlZCB0byBhIHZlcnkgc3BlY2lmaWMgc2NlbmFyaW8gLS0gd2hlbiB0aGUgaW1hZ2UgY29udHJvbCB3YXNcclxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGRyb3BwZWQgY29udHJvbCBvbiB0aGUgZm9ybSwgaW1hZ2UgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IHRoZSB0aW1lIG9mIHRhc2tcclxuICAgICAgICAgICAgLy8gbG9hZGluZyBhbmQgdGFzayBuZWVkcyB0byBiZSBjbG9zZWQsIHdlIGFyZSBwdXR0aW5nIGEgcGF0Y2ggaGVyZSBieSBjaGVja2luZyB2YWwgZm9yIE5VTEwuXHJcbiAgICAgICAgICAgIC8vIFRoZSBpZGVhbCBzb2x1dGlvbiB3b3VsZCBiZSAtLS0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSBpbWFnZSBmaWxlIG5hbWUgZnJvbSBNYWdpYyB0aHJlYWRcclxuICAgICAgICAgICAgLy8gdG8gR3VpIHRocmVhZCBhbmQgbG9hZGluZyB0aGUgaW1hZ2UgZnJvbSB0aGUgR3VpIHRocmVhZCwgd2UgY2FuIGxvYWQgdGhlIGltYWdlIGZyb20gdGhlXHJcbiAgICAgICAgICAgIC8vIE1hZ2ljIHRocmVhZCAodXNpbmcgc3luYyBleGVjdXRpb24gaS5lLiB2aWEgR3VpSW50ZXJhY3RpdmUpIGFuZCBzZW5kIGl0IHRvIHRoZSBHdWkgdGhyZWFkLlxyXG4gICAgICAgICAgICBpZiAoIXRhc2suY2FuY2VsV2FzUmFpc2VkKCkgJiZcclxuICAgICAgICAgICAgICAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSICYmICghaXNOdWxsT3JVbmRlZmluZWQoY3RybC5fZmllbGQpICYmIChjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB8fCB2YWwgIT09IG51bGwpICYmIHR5cGVvZiB2YWwgIT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAgICAgICAgICFhd2FpdCBjdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUodmFsLCB0cnVlKSkpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiBzdG9wIGV4ZWN1dGlvbiBpbiBvbiwgZG9uJ3QgY2xlYXIgdGhlIG1zZyBmcm9tIHN0YXR1cy5cclxuICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgTWFuYWdlci5DbGVhbk1lc3NhZ2VQYW5lKHRhc2spO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IEluQ29udHJvbCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgdmVyaWZpY2F0aW9uXHJcbiAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5DbGlwQm9hcmREYXRhRXhpc3RzID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLlZhbGlkYXRlQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgYSBzZWxlY3QgcHJvZ3JhbSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9ncmFtIHdhcyBleGVjdXRlZCAgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj50aGUgc291cmNlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb21wdFwiPmlmIHRydWUgdGhlbiB0aGUgY2FsbGVyIGlzIGV4ZWN1dGluZyB0aGUgY2FsbGVkIHByb2dyYW0gYXQgdGhlIGVuZCBvZiBjb250cm9sIHByZWZpeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0UHJvZyhjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgbGV0IHZhbHVlOiBTdHJpbmc7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIGxldCBwcm9nRXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNlbGVjdCBwcm9ncmFtIHRvIHRoZSBjb250cm9sXHJcbiAgICBpZiAoY3RybC5IYXNTZWxlY3RQcm9ncmFtKCkpIHtcclxuICAgICAgLy9jaGVjayBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gICAgICBpZiAoY3RybC5Jc1BhcmthYmxlKCkpIHtcclxuXHJcbiAgICAgICAgdmFsdWUgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb250cm9scyB2YWx1ZVxyXG4gICAgICAgIGlmICghY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbHVlLCBmYWxzZSkpXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZW5jb2RlZFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgY3RybC5nZXRNZ1ZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgIHZhciByZWMgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgIGVuY29kZWRWYWwgPSByZWMuZ2V0WE1MRm9yVmFsdWUoY3RybC5nZXRGaWVsZCgpLmdldElkKCksIG1nVmFsKTtcclxuICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNlbGVjdFByb2dyYW1Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBudWxsLCBJbnQzMi5NaW5WYWx1ZSwgY3RybC5nZXREaXRJZHgoKSwgZW5jb2RlZFZhbCk7XHJcbiAgICAgICAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuXHJcbiAgICAgICAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgcHJvZ0V4ZWN1dGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9nRXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgaGFuZGxlcnMgaWYgaXQgaXMgY29udHJvbCB2ZXJpZmljYXRpb24uIEV4ZWN1dGUgYWxsIFNWIGhhbmRsZXJzXHJcbiAgICBsZXQgdGFibGU6IEhhbmRsZXJzVGFibGUgPSB0YXNrLmdldEhhbmRsZXJzVGFiKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRhYmxlLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gKCh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkgPyAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuZ2V0Q3RybEJ5Q3RybE5hbWUoaGFuZGxlci5nZXRDdHJsTmFtZSgpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoY29udHJvbCkpIHtcclxuICAgICAgICAgIGxldCBydW5UaW1lRXZlbnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY29udHJvbCk7XHJcbiAgICAgICAgICBydW5UaW1lRXZlbnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnVuVGltZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlcnJvciwgcGFyay9mb2N1cyBvbiB0aGlzIGNvbnRyb2wgd2hlcmUgZXJyb3Igb2NjdXJzIGluIENWIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjb250cm9sKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkFjdFNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGZvcm06IE1nRm9ybSwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcblxyXG4gICAgbGV0IHNpbXVsYXRlOiBib29sZWFuID0gY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgIWV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGlmIChzaW11bGF0ZSlcclxuICAgICAgYXdhaXQgdGhpcy5zaW11bGF0ZVNlbGVjdGlvbihjdHJsLCBldnQuZ2V0VmFsdWUoKSwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24oY3RybCwgZGlzcGxheUxpbmUsIGV2dC5nZXRWYWx1ZSgpKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRoZSBNR19BQ1RfU1VCRk9STV9DTE9TRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9uU3ViZm9ybUNsb3NlKHRhc2s6IFRhc2ssIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKChldnQuZ2V0QXJnTGlzdCgpICE9IG51bGwpICYmIChldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA9PT0gMSkpIHtcclxuICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICBsZXQgY2xvc2luZ1N1YmZvcm1OYW1lOiBzdHJpbmcgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIDApO1xyXG5cclxuICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgaWYgKGNsb3NpbmdTdWJmb3JtTmFtZSA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIFJTIG11c3QgYmUgZXhlY3V0ZWQgb25seSBpZiB0aGUgY3VycmVudCBzdWJmb3JtIGlzIHJlZnJlc2hlZC5cclxuICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY2xvc2luZ1N1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT0gbnVsbCAmJiAhc3ViZm9ybVRhc2suSXNSb3V0ZSgpKSB7XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1TdWJmb3JtQ2xvc2Uoc3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm1TdWJmb3JtQ2xvc2UoKSAgIDogQ2xvc2VzIHRoZSBzdWJmb3JtIHRhc2sgb3BlbmVkIGluIHRoZSBzdWJmb3JtQ3RybFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtQ3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gc3ViZm9ybVRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBzdWJmb3JtVGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBwYXJlbnRUYXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXMocGFyZW50VGFzayk7XHJcbiAgICAgIGF3YWl0IHN1YmZvcm1UYXNrLnN0b3AoKTtcclxuXHJcbiAgICAgIHN1YmZvcm1DdHJsLnJlc2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIENvbW1hbmRzLmFkZENsb3Nlc3ViZm9ybShDb21tYW5kVHlwZS5DTE9TRV9TVUJfRk9STSwgc3ViZm9ybUN0cmwsIHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSwgKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5nZXROYW1lKCksIHN1YmZvcm1UYXNrLmdldEZvcm0oKS5idWlsZEZvcm1OYW1lKCkpO1xyXG5cclxuICAgICAgLy8gU2V0IG1nZC5hYm9ydCgpLCBpbiBvcmRlciB0byBjbG9zZSBjdXJyZW50IGV2ZW50IGxvb3Agb2YgTW9kYWwgc3ViZm9ybS5cclxuICAgICAgLy8gYW5kIHJlc2V0IGl0IGJhY2sgdG8gZmFsc2Ugb25jZSBpdCBjb21lcyBvdXQgb2YgY3VycmVudCBldmVudHNsb29wKCkuXHJcbiAgICAgIGlmICgoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLklzTW9kYWwoKSlcclxuICAgICAgICBtZ2QuYWJvcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhcmd1bWVudHMgZm9yIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50QXJndW1lbnRzKGV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZ0LmdldEFyZ0xpc3QoKSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvU3VmZml4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2s6IFRhc2tCYXNlLCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzaG91bGRSZXR1cm46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICByZWZEb1N1ZmZpeC52YWx1ZSA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgc2hvdWxkUmV0dXJuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzazogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyB0aGUgbWFnaWMgZGVmYXVsdCBvcGVyYXRpb25zIGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50IDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBtZ0RhdGE6IE1HRGF0YSA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgZG9TdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZztcclxuICAgIGxldCBzZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGEgdXNlciBldmVudCB0aGF0IGNvbnZlcnRzIHRvIGEgc3lzdGVtIG9yIGludGVybmFsIGV2ZW4sIGNvbnZlcnQgaXRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpXHJcbiAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LmdldFVzZXJFdmVudCgpLCBldnQpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQoZXZ0KTtcclxuXHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICAgIGlmIChhY3RJZCAhPT0gMClcclxuICAgICAgICAvLyBoYW5kbGVkIGludGVybmFsbHlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0vLyBlbmQgb2Ygc3lzdGVtIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tb24gaGFuZGxpbmcgb2YgaW50ZXJuYWwgZXZlbnRzIG9ubHkgaWYgdGhleSBhcmUgbm90IGltbWVkaWF0ZS5cclxuICAgICAgLy8gYW4gZXZlbnQgaXMgaW1tZWRpYXRlIHdoZW4gaXQgd2FzIHJhaXNlZCBieSBhIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiB0aGF0IGl0c1xyXG4gICAgICAvLyB3YWl0IGNvbmRpdGlvbiBpcyB5ZXMgb3IgZXZhbHVhdGVzIHRvIHRydWUuXHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAhZXZ0LmlzSW1tZWRpYXRlKCkgJiYgdGhpcy5BY3RBbGxvd2VkKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkgJiYgIXRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaykge1xyXG4gICAgICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5tZ0RhdGEuQ21kc1RvU2VydmVyO1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uU3ViZm9ybUNsb3NlKHRhc2ssIGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVDpcclxuICAgICAgICAgICAgLy8gaWYgYnV0dG9uIGlzIG5vdCBwYXJrYWJsZSwgcmFpc2UgaXRzIGV2ZW50IG9ubHkgaWYgdGhlIGFjdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBieSBndWkuXHJcbiAgICAgICAgICAgIC8vIGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uIHdpbGwgZ2V0IGhlcmUgYXMgY3RybCBoaXQgLCBidXQgaXMgbm90IHRyaWdnZXJlZCBieSBndWkgKGdvZXMgdmlhIHNlbGVjdGlvbiBldmVudCAxc3QpXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGN0cmxfaGl0IGFjdGlvbnMgc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJrYWJpbGl0eVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiZcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiB8fCAhZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSB8fCBjdHJsLmlzUGFya2FibGUodHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0UnRFdnRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRUYXNrKGN0cmwuZ2V0UnRFdnRUYXNrKCkpO1xyXG4gICAgICAgICAgICAgIGlmIChDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PTkUgIT09IGFSdEV2dC5nZXRUeXBlKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnVzZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tUb0VuYWJsZTogVGFzayA9IDxUYXNrPmFSdEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrVG9FbmFibGUgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0YXNrVG9FbmFibGUuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoY3RybC5BcmdMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIpIHtcclxuICAgICAgICAgICAgICAvLyBGaXhlZCBidWcgIzcyNDE1MDogYXMgd2UgZG9pbmcgZm9yIG9ubGluZSBmb3IgdGFiIGNvbnRyb2wgd2Ugc2VuZCBBQ1RfWk9PTSAoQ2hvaWNlaW5wLmNwcCA6OkRpdEdldCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykge1xyXG4gICAgICAgICAgICAgIGN0cmwuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDpcclxuICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlRvZ2dsZUluc2VydE1vZGUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgICAgLy8gaWYgJ2V4aXQnIGFjY2VwdGVkIG9uIE1ESSwgZXhpdCB0aGUgdG9wIG1vc3QgdGFzay4gc2FtZSBhcyB3aGVuIGV4aXRpbmcgdGhlIHN5c3RlbS5cclxuICAgICAgICAgICAgbGV0IHRhc2tUb0VuZDogVGFzayA9ICh0YXNrLmlzTWFpblByb2coKSA/IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSA6IHRhc2spO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrVG9FbmQuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsIGV2dC5FeGl0RHVlVG9FcnJvcigpKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgICAvLyBlbmQgdGhlIHRvcCBtb3N0IHRhc2sgd2l0aCBmb3JtLlxyXG4gICAgICAgICAgICBhd2FpdCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBHZXRUb3BNb3N0VGFza1dpdGhGb3JtKHRhc2spLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1JPVywgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMOlxyXG4gICAgICAgICAgICAvLyAjOTE4NTg4OiBJZiBjdHJsK2hvbWUvY3RybCtlbmQgcHJlc3NlZCB3aGVuIHBhcmtlZCBvbiBsaXN0Ym94XHJcbiAgICAgICAgICAgIC8vIHRoZW4gQmVnaW4gdGFibGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkLlxyXG4gICAgICAgICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFsYXN0UGFya2VkQ3RybC5pc0xpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzoge1xyXG4gICAgICAgICAgICAvLyBVbmxpa2UgT25saW5lLCBoZXJlIFNFTEVDVCBvciBaT09NIGNvbWVzIGFmdGVyIHRoZSBEQkNMSUNLLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIERCQ0xJQ0sgaGFuZGxlciB3aXRoIHByb3BvZ2F0ZSA9ICdOTycgLCB0aGVzZSBhY3Rpb25zIHdpbGwgbm90IGJlIHJhaXNlZC5cclxuICAgICAgICAgICAgbGV0IGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlID0gY3RybC5UeXBlO1xyXG4gICAgICAgICAgICBsZXQgcHV0QWN0aW9uOiBudW1iZXIgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORTtcclxuICAgICAgICAgICAgaWYgKGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTEFCRUwgJiZcclxuICAgICAgICAgICAgICBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UpIHtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QpKVxyXG4gICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKVxyXG4gICAgICAgICAgICAgICAgICBwdXRBY3Rpb24gPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwdXRBY3Rpb24gIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT05FKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmwsIHB1dEFjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORTpcclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSh0YXNrLCBkdiwgcmVjLCBmYWxzZSkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdvdG9DcmVhdGVNb2RlKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRJbkNyZWF0ZUxpbmUoKSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGFscmVhZHkgYSBuZXcgb25lXHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiByZWMgIT0gbnVsbCAmJiAhcmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgZG9TdWZmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAxNTIzNTU6IFBhcmsgb24gbGFzdFBhcmtlZENvbnRyb2wgaWYgbmV4dFNjcmVlbiBldmVudCBvY2N1cnMgaWYgYWxyZWFkeSBpbiBjcmVhdGUgbW9kZSBhbmQgcmVjb3JkIG5vdCBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0UGFya2VkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdFBhcmtlZENvbnRyb2wuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGRvU3VmZml4KTtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrLCByZWZEb1N1ZmZpeCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgZG9TdWZmaXggPSByZWZEb1N1ZmZpeC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB8fCAhdGFzay5Db25maXJtVXBkYXRlTm8pXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uYWRkUmVjKGRvU3VmZml4LCBpbnRFdnRDb2RlID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzayk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0Q2FuY2VsKGV2dCwgdGFzaywgZm9ybSwgY3RybCwgcmVjLCB0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgfHxcclxuICAgICAgICAgICAgICBhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1FVRVJZOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJlxyXG4gICAgICAgICAgICAgIChhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgICAgb2xkTW9kZSA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q6XHJcbiAgICAgICAgICAgIC8qIHByZWZvcm0gcmVjIHN1ZmZpeCAqL1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5TZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIHNlbGVjdGlvbiBwcm9ncmFtICovXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX1JFRlJFU0g6XHJcbiAgICAgICAgICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGxldCBSZWZyZXNoZWRTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgICAgICAgICBpZiAoUmVmcmVzaGVkU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBwYXJlbnRUYXNrOiBUYXNrID0gdGFzazsgcGFyZW50VGFzay5nZXRGb3JtKCkgIT0gbnVsbCAmJiBwYXJlbnRUYXNrLmdldE1nZElEKCkgPT09IHRhc2suZ2V0TWdkSUQoKTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKFJlZnJlc2hlZFN1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI4NzU2Mi4gT3BlbiB0aGUgc3ViZm9ybSB0YXNrIG9ubHkgaWYgdGhlIHN1YmZvcm0gY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IChzdWJmb3JtQ3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRSkpLmdldFZhbHVlSW50KCkgIT09IFN1YmZvcm1UeXBlLk5vbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHBhcmVudFRhc2ssIHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5TdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBTdWJmb3JtUmVmcmVzaCB0aGF0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgc28gc2VhcmNoIHRoZSB0YXNrIGFjY29yZGluZyB0byBpdHMgdGFzayBpZCAodGFnKVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDIpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gdGFzaywgcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICBsZXQgdGFza1RhZzogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIDApO1xyXG5cclxuICAgICAgICAgICAgICB3aGlsZSAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gc3ViZm9ybVRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpID09PSB0YXNrVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1YmZvcm1UYXNrID0gcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHRhc2ssIDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2wpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNIOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICAgICAgaWYgKCFmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKGZvcm0ucmVjb3JkSWR4MkRpc3BsYXlMaW5lKGR2LmdldEN1cnJSZWNJZHgoKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQ6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RfQ0xPU0VfQVBQTDpcclxuICAgICAgICAgICAgY21kID1cclxuICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQoXHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpLFxyXG4gICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JST1dTRVJfRVNDKTtcclxuICAgICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTlRFWFRfUkVNT1ZFOlxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgcGVuZGluZ1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgIGlmIChDbGllbnRNYW5hZ2VyLlRyYW5zQ2FjaGVFeGlzdHMoKSB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BlbmRpbmcgdHJhbnNhY3Rpb24vcmVjb3JkIGlzIG1vZGlmaWVkLCBkaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQuJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gSXMgdGhlcmUgY2xpZW50IGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0P1xyXG4gICAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdGVybWluYXRlIGNvbnRleHQgYXQgc2VydmVyIHNpZGVcclxuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQ6IENvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZFxyXG4gICAgICAgICAgICAgICAgICA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpKTtcclxuICAgICAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoPElDbGllbnRDb21tYW5kPmNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgbmVlZCBub3QgdG8gYmUgaGFuZGxlZCBhcyB0aGUgd2UgYXJlIHRlcm1pbmF0aW5nIHRoZSBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCBjb250ZXh0IGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZmxhZyB0byB0aGF0IGNvbnRleHQgaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciBieSAnQ29udGV4dCBSZW1vdmUnIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQgYXMgdXNlciBldmVudCBvY2N1cnJlZC4nKTtcclxuICAgICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFUlZFUl9URVJNSU5BVElPTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RVTVBfRU5WSVJPTk1FTlQ6XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VyckZpZWxkICE9IG51bGwgJiYgdGhpcy5fY3VyckZpZWxkLk51bGxBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZXMgaXMgYW4gaW1taXRhdGlvbiBvZiB0aGUgYmVoYXZpb3VyIG9mIGFuIG9ubGluZSBwcm9ncmFtOlxyXG4gICAgICAgICAgICAgIC8vIDEpIHRoZSByZWNvcmQgbXVzdCBiZSB1cGRhdGVkIGluIHRoaXMgZXZlbnRcclxuICAgICAgICAgICAgICAvLyAyKSBhIFwibmV4dCBmaWVsZFwiIGV2ZW50IGlzIHJhaXNlZFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2N1cnJGaWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIG5lZWQgdG8gY2FuY2VsIHRoZSBlZGl0IGFuZCB0aGVuIGdvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiwgdGhlIHNhbWUgd2UgZG9pbmcgZm9yIHJlbW92ZSB3aGlsZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIHNlZSBkYXRhdmlldy5jcyBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSB3aWxsIG5vdCBnZXQgdG8gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0tcclxuICAgICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCBjbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbmx5IG9uIGNvbHVtbiB3aXRoIGFuIGF0dGFjaGVkIGZpZWxkLlxyXG4gICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGluZGV4IG9ubHkgaWYgdGhlIGRhdGF2aWV3IGlzIHJlbW90ZS5cclxuICAgICAgICAgICAgaWYgKChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFICYmIHRhc2suRGF0YXZpZXdNYW5hZ2VyLkhhc1JlbW90ZURhdGEpIHx8XHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCAmJiBjdHJsLmdldEZpZWxkKCkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI5NjMyNSAmIFFDUiAjNDMwMjg4LlxyXG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgQ1Mgb2YgdGhlIGN1cnJlbnQgY29udHJvbCwgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYXJhbWV0ZXIgZm9yIGEgc3ViZm9ybS5cclxuICAgICAgICAgICAgICAvLyBJZiBpdCdzIHZhbHVlIHdhcyBjaGFuZ2VkLCBDUyB3aWxsIHJlZnJlc2ggdGhlIHN1YmZvcm0gYmVmb3JlIHRoZSBzb3J0LlxyXG4gICAgICAgICAgICAgIGxldCBsYXN0Rm9jdXNlZFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKExhc3RGb2N1c2VkTWFuYWdlci5MYXN0Rm9jdXNNZ2RJRCk7XHJcbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShmb2N1c2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhsYXN0Rm9jdXNlZFRhc2spO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzQzODc1My4gRXhlY3V0ZSBSUyBvZiB0aGUgc29ydGVkIHRhc2suXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza0Zvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUluZGV4Q2hhbmdlQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSwgZXZ0LmdldEFyZ0xpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb2x1bW5Tb3J0Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgZXZ0LkRpcmVjdGlvbiwgY3RybC5nZXREaXRJZHgoKSwgY3RybC5nZXRGaWVsZCgpLmdldElkKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKDApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUidzICMxNjU4MTUgJiAjMjkxOTc0LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgc29ydGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzb3J0ZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM0Mjg2OTcuIEV4ZWN1dGUgUlMgb2YgYWxsIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZFRhc2suRXhlY3V0ZU5lc3RlZFJTKHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0s6XHJcbiAgICAgICAgICAgIC8vIGNhbiBzb3J0IG9uIGNvbHVtbiBvbmx5IGlmIGV2ZW50IGlzIHJhaXNlZCBkdWUgdG8gY2xpY2sgYWN0aW9uXHJcbiAgICAgICAgICAgIC8vIGFuZCBhIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGNvbHVtbi5cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgJiYgY3RybC5pc0NvbHVtblNvcnRhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY29sdW1uQ2hpbGRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmwuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoaWxkQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgU29ydCBvbiBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbHVtbkNoaWxkQ29udHJvbCwgZXZ0LkRpcmVjdGlvbiwgMCk7XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIG9mIGludGVybmFsIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4qIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZ1xyXG4qIHN0YXJ0IHRoZSBlZGl0aW5nIG9uIHJvd1xyXG4qICovXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKVxyXG4gICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZShgQ2Fubm90IGVudGVyIFJvdyBFZGl0aW5nIHdoZW4gaW4gUXVlcnkgTW9kZS5gKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBteWZvcm0uc3RvcFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgc3ViZm9ybSBvcGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtQ29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBPcGVuU3ViZm9ybSh0YXNrOiBUYXNrLCBzdWJmb3JtQ29udHJvbDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0YXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXModGFzayk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1PcGVuQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgc3ViZm9ybUNvbnRyb2wuZ2V0RGl0SWR4KCkpO1xyXG4gICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY21kc1RvU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb2xsYmFja1R5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzazogVGFzaywgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlLCByb2xsYmFja1R5cGU6IFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IHRydWU7XHJcbiAgICAvLyBmb3IgcmVtb3RlIHByb2dyYW0gOiAod2l0aFxcd2l0aG91dCBsb2NhbCBkYXRhKSB0aGUgcm9sbGJhY2sgZXZlbnQgaW4gdGhlIHNlcnZlciBNVVNUXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igb2ZmbGluZSBwcm9ncmFtIHRoZSByb2xsYmFjayB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgdGFzayA9IHRhc2suVGFza1NlcnZpY2UuR2V0T3duZXJUcmFuc2FjdGlvblRhc2sodGFzayk7XHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVSb2xsYmFja0V2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgcm9sbGJhY2tUeXBlKTtcclxuICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0UGFya2VkQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkUmVjTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdENhbmNlbChldnQ6IFJ1blRpbWVFdmVudCwgdGFzazogVGFzaywgZm9ybTogTWdGb3JtLCBjdHJsOiBNZ0NvbnRyb2wsIHJlYzogUmVjb3JkLCBpc01HX0FDVF9DQU5DRUw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFByZXZlbnQgcmVjdXJzaXZlIG1vZGVcclxuICAgIC8vIGZpeGVkIGJ1Z3MgIzoyODU0OTgsIDI5NzQ1NVxcNDI3NzAzXFxcclxuICAgIGlmICh0YXNrLkluSGFuZGxlQWN0Q2FuY2VsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IHNhdmVEaXNwbGF5TGluZSA9IHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIC8vIFdoZW4gZG8gd2Ugc2hvdyB0aGUgJ0NvbmZpcm0gQ2FuY2VsIHdpbmRvdycgPyB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHk6XHJcbiAgICAvLyAxLiBUYXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgICAvLyAyLiByZWMgaXMgbm90IFVwZGF0ZWQuIFVwZGF0ZWQgaXMgdHJ1ZSB3aGVuIHRoZXJlIHdhcyBhbiBVcGRhdGUgb3BlcmF0aW9uIHdpdGggJ2ZvcmNlIHVwZGF0ZScuIElmIGl0IGlzIHRydWUsIHRoZW4gdGhlcmUgaXMgbm8gbWVhbmluZyB0byBzaG93IHRoZVxyXG4gICAgLy8gICAgd2luZG93IHNpbmNlIHRoZSB1cGRhdGUgc3RheXMgYW55d2F5IChsaWtlIGluIG9ubGluZSB3aGVuIHdlIGdvIHRvIENhbmNlbFdhc1RyaWdnZXJlZCkuXHJcbiAgICAvLyAzLiBUaGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIFNvIGVpdGhlciBNb2RpZmllZCBpcyB0cnVlLCBtZWFuaW5nIGEgZmllbGQgd2FzIG1vaWRmaWVkICwgb3JcclxuICAgIC8vICAgIExhc3RQYXJrZWRDdHJsKCkubW9kaWZpZWRCeVVzZXIoKSwgbWVhbmluZyB0aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nIHRoZSBmaWVsZCdzIHZhbHVlIChUaGUgbW9kaWZpZWQgaXMgZmFsc2UgdW50aWxsIHdlIGV4aXQgdGhlIGZpZWxkKS5cclxuICAgIC8vIENyZWF0ZSBtb2RlIGFsc28gZ29lcyBoZXJlIChyZWMgcmVtb3ZlZCBhbmQgbW9kZSBjaGFuZ2VzIHRvIG1vZGlmeSkgLCBidXQgYWxzbyB3aWxsIHNob3cgdGhlIGNvbmZpcm0gY2FuY2VsIG9ubHkgaWYgc29tZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gdGhlIG5ldyByZWNvcmQuXHJcbiAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhcmVjLlVwZGF0ZWQpIHtcclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbCAmJiB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkuTW9kaWZpZWRCeVVzZXIpKSB7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUwsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0NBTkNFTCk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiB0YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICYmIHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICBsZXQgYWxsb3dFbXB0eURhdGFWaWV3OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG5cclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFNpemUoKSA9PSAxICYmIGFsbG93RW1wdHlEYXRhVmlldykge1xyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoJ00nKTtcclxuICAgICAgICAgICAgdGFzay5EYXRhVmlldy5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUodGFzazogVGFzaywgZHY6IERhdGFWaWV3LCByZWM6IFJlY29yZCwgbm9uSW50ZXJhY3RpdmVEZWxldGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBzYXZlSXNSb3dFZGl0aW5nID0gbXlmb3JtLmdldElzUm93RWRpdGluZ0Zyb21HdWkobXlmb3JtLkRpc3BsYXlMaW5lKTsgLy9Db21tYW5kcy5nZXRJc1JvdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7d0VkaXRpbmcoIHRhc2suZ2V0Rm9ybSgpLmdldE1haW5Db250cm9sKCksIHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lKTsgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFLCB0cnVlKSkge1xyXG4gICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgb2xkUmVjTW9kZSA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIEZvcmNlIHRoZSBjaGFuZ2UgdG8gZGVsZXRlIG1vZGVcclxuICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcihmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGFzayBzdWZmaXggaW4gTW9kaWZ5IG1vZGUgb3Igd2hlbiB0aGVyZSBpcyAnZm9yY2UgcmVjb3JkIHN1ZmZpeCcuXHJcbiAgICAgICAgaWYgKHJlYy5Nb2RpZmllZCB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWNvcmQgc3VmZml4IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSByZWNvcmQgc3VmZml4IGluIERlbGV0ZSBtb2RlXHJcbiAgICAgICAgLy8gc2V0IHRoZSBJbkRlbGV0ZVByb2Nlc3MgZmxhZyAsIHNvIHdlIHdpbGwgbm90IHRyeSB0byBzZW5kIHVwZGF0ZXMgb24gdGhlIHJlY29yZCBhZnRlclxyXG4gICAgICAgIC8vIHdlIGRlbGV0ZSBpdCBpbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIChyZWMgc3VmZml4KS5cclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKHRydWUpO1xyXG5cclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIC8vIG5vIGNvbmZpcm0gbWVzc2FnZSBkaWFsb2cgaWYgaW4gbm9uIGludGVyYWN0aXZlIGRlbGV0ZS5cclxuICAgICAgICBsZXQgc2tpcENvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBub25JbnRlcmFjdGl2ZURlbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKCFza2lwQ29uZmlybURpYWxvZykge1xyXG4gICAgICAgICAgaWYgKHRhc2subXVzdENvbmZpcm1JbkRlbGV0ZU1vZGUoKSB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25maXJtZWQ6IGJvb2xlYW4gPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfREVMRVRFKTtcclxuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNhdmVJc1Jvd0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlJ3JlIGRlbGV0aW5nIGFuIGluc2VydGVkIHJlY29yZCwgdGhlIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgaXRcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB1cG9uIGRlbGV0ZSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZGlmaWVkIHJlYyBsaXN0XHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpIHtcclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1OiB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgYSByZWNvcmQsIHdoaWNoIGlzIHRoZSBzaW5nbGVcclxuICAgICAgICAgIC8vIHJlY29yZCBpbiB0aGUgZHYsIHRoZW4gd2hlbiBpdHMgcmVjb3JkIHN1ZmZpeCBpcyBleGVjdXRlZCBhbmQgdGhlXHJcbiAgICAgICAgICAvLyBzZXJ2ZXIgc2VuZHMgYSBuZXcgcmVjb3JkIHRvIHRoZSBjbGllbnQgYW5kIHNldCBpdCB0byBiZSB0aGVcclxuICAgICAgICAgIC8vIGN1cnJlbnQgcmVjb3JkLlxyXG4gICAgICAgICAgLy8gVGhpcyBmaXggbWFrZXMgdGhlIGRlbGV0ZWQgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGZvciBhXHJcbiAgICAgICAgICAvLyBtb21lbnQganVzdCB0byBkZWxldGUgaXQgZnJvbSB0aGUgY2xpZW50cyBjYWNoZS4gVGhlbiwgaXQgbWFrZXNcclxuICAgICAgICAgIC8vIHRoZSBuZXcgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGFnYWluIGFuZCBlbnRlcnMgaW50byBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgIC8vIEkgdGhpbmsgdGhhdCBhIGJldHRlciBzb2x1dGlvbiBpcyB0byBkZWNpZGUgd2hldGhlciB0aGUgY2xpZW50IGlzXHJcbiAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGEgbmV3IHJlY29yZCBvciB0aGUgc2VydmVyLCBhbmQgbWFrZSBzdXJlXHJcbiAgICAgICAgICAvLyB0aGF0IGl0IGlzIGRvbmUgc3lzdGVtd2lkZS5cclxuICAgICAgICAgIC8vIEVodWQgLSAxMC8wOS8yMDAxXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKHJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gbm8gbmVlZCB0byBkZWwgdGhlIGN1cnIgcmVjIGFuZCBwb3NpdGlvbiBvbiB0aGUgbmV4IHJlYyBpZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIFRoZSBkZWxDdXJyUmVjIG1heSBjYXVzZSBhIGNyYXNoIGlmIGl0IHRyaWVzIHRvIGdldCB0aGUgbmV4dCByZWMgZnJvbSB0aGUgbmV4dCBjaHVuay5cclxuICAgICAgICAgIGlmICghdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsQ3VyclJlYyh0YXNrLCBmYWxzZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1IC0gZml4IGNvbnRpbnVlXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMobmV3Q3VyclJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChkdi5nZXRTaXplKCkgPT09IDEpXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEluIGludGVyYWN0aXZlLCB0aGUgbW9kZSBtaWdodCBjaGFuZ2UgdG8gbW9kaWZ5IG9yIGNyZWF0ZS4gSG93ZXZlciwgZm9yIG5vbiBpbnRlcmFjdGl2ZSAoZGVsZXRlIG1vZGUpXHJcbiAgICAgICAgICAvLyB0aGUgbW9kZSBzaG91bGQgYmUgc2V0IGJhY2sgdG8gZGVsZXRlIGFuZCB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcmVjb3JkIGN5Y2xlLlxyXG4gICAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlRGVsZXRlKVxyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSB2aWV3IHJlZnJlc2gsIHNjcmVlbiByZWZyZXNoIGFuZCByZWNvcmQgZmx1c2ggZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGUgd2l0aCBhbGwgaXRzIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBudWxsO1xyXG5cclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIGlmIHdlIHRyeSB0byB2aWV3IHJlZnJlc2ggd2l0aCBhbGxvd19tb2RpZnk9biBpbiBjcmVhdGUgbW9kZVxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICFhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudFJvdzogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICghZXZ0LmdldFJlZnJlc2hUeXBlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGV2dC5SdFZpZXdSZWZyZXNoVXNlQ3VycmVudFJvdygpICYmIHRhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbnRlcm5hbFJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlLCBkdi5DdXJyZW50UmVjSWQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVmZXRjaFJlY29yZDogYm9vbGVhbiA9IHRydWU7IC8vUmVmZXRjaCByZWNvcmQgZnJvbSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgZXZ0LmdldEFyZ0xpc3QoKSAhPT0gbnVsbCAmJiBldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIGxldCByZWZldGNoUmVjU3RyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY1N0ciA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKTtcclxuICAgICAgICAgICAgICByZWZldGNoUmVjb3JkID0gKGlzTnVsbE9yVW5kZWZpbmVkKHJlZmV0Y2hSZWNTdHIpIHx8IHJlZmV0Y2hSZWNTdHIgPT09ICcxJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZWZldGNoUmVjb3JkKVxyXG4gICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJlYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgY3VycmVudFJvdywgZXZ0LmdldEFyZ0xpc3QoKSwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZXZlbnRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbClcclxuICAgICAgICAgICAgaWQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGlkID0gKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0UmVjQnlJZHgoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRUb3BSZWNJZHgoKSkuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTY3JlZW5SZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaWQsIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWFsIHZpZXcgcmVmcmVzaCBjYXVzZXMgdGhlIGNhY2hlIG9mIHRoZSBjdXJyZW50IHN1YiBmb3JtIHRhc2sgdG8gYmUgY2xlYXJlZFxyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pXHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZG9lcyBub3QgY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAvLyBRQ1IgIzI4OTIyMi4gRG8gbm90IGNvbnRpbnVlIHdpdGggUmVmcmVzaCBpZiB0aGUgdGFzayBtdXN0IGJlIGVuZGVkLlxyXG4gICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiAhZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEFmdGVyIHJlY29yZCBoYXMgYmVlbiBmbHVzaGVkIGl0IGlzIG5vdCBjb25zaWRlcmVkIGEgbmV3IHJlY29yZCBhbnltb3JlLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5zZXRPbGRSZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzQzMDA1OS4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHJlZnJlc2hlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgcmVmcmVzaGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgdGhpcy5zZXRJc0luVmlld1JlZnJlc2godHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRhc2sgPT09IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSB8fCAhdGFzay5wYXRoQ29udGFpbnMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdvIHRvIGNyZWF0ZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY21kc1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBnb3RvQ3JlYXRlTW9kZSh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgIC8vIFFDUiAjNDE3NzMzLiBFeGVjdXRlIFJTJ3Mgb2YgdGhlIG5lc3RlZCBzdWJmb3JtcyBpZiB0aGUgY3VycmVudCB0YXNrIGlzIG9uZSBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zLlxyXG4gICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFKTtcclxuICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gc29tZSBkZWZhdWx0IG9wZXJhdGlvbnMgZm9yIGFuIGV2ZW50IGFmdGVyIGFsbCB0aGUgaGFuZGxlcnMgZmluaXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmNCZWZvcmVcIj50aGUgUkMgcmV0dXJuZWQgZnJvbSB0aGUgY29tbW9uSGFuZGxlckJlZm9yZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wb2dhdGVcIj5pZiBldmVudCB3YXMgcHJvcG9nYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uSGFuZGxlckFmdGVyKGV2dDogUnVuVGltZUV2ZW50LCByY0JlZm9yZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldztcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlY01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVjTW9kZUlzRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgZXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIGR2ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlY29yZCBwcmVmaXggZm9yIHRoZSBzdWIgdGFza3MgdG9vXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5pc0ZpcnN0UmVjb3JkQ3ljbGUoZmFsc2UpO1xyXG4gICAgICAgICAgLy8gT25jZSBhcmUgcmVhZHkgdG8gZW5kIHRoZSBSUywgaXQgbWVhbnMgd2UgY2Fubm90IGJlIHRoZSBGSVJTVCByZWNvcmQgY3ljbGVcclxuICAgICAgICAgIGlmICh0YXNrLmdldFByZXZlbnRSZWNvcmRTdWZmaXgoKSkge1xyXG4gICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICMxMTU5NTEuIEV2ZW4gaWYgcmVjb3JkIHN1ZmZpeCBpcyBub3QgZXhlY3V0ZWQsIGluIHRoZSBuZXh0IHRpbWUgZG8gbm90IGV4ZWN1dGUgUlAgJiBSUyBvZiB0aGUgc3ViZm9ybS5cclxuICAgICAgICAgIHRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gUUNSICM5ODQwMzE6IGlmIHRoZSBkZWxldGUgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gXCJ2ZXJpZnkgZXJyb3JcIlxyXG4gICAgICAgICAgICAvLyBpbiB0aGUgcmVjb3JkIHN1ZmZpeCB0aGVuIHRoZSByZWNvcmQgbW9kZSBtdXN0IGJlIGNsZWFyZWRcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAvLyBRY3IgNzgzMDM5IDogSWYgd2UgYXJlIGFscmVhZHkgaW4gY29udHJvbCBsZXZlbCBpdCBtZWFucyB0aGF0IGNvbnRyb2wgcHJlZml4IHdhcyBhbHJlYWR5IGRvbmUgb3IgdGhhdFxyXG4gICAgICAgICAgICAvLyBjb250cm9sIHN1ZmZpeCB3YXMgbm90IGRvbmUuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBjb250cm9sIHByZWZpeCBhZ2Fpbi5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gPE1nQ29udHJvbD50aGlzLmdldFN0b3BFeGVjdXRpb25DdHJsKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBsYXN0ID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSIDQyNjI4MyBpcyB3ZSBoYXZlIGEgc3ViLWZvcm0gdGhhdCB3YXMgbmV2ZXIgYmVlbiBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNvbnRyb2wgbGV2ZWwgd2lsbCBub3QgYmUgZW50ZXJlZFxyXG4gICAgICAgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvbm90IHdhbnQgQ1MgdG8gYmUgY2FsbGVkIGFnYWluIGZyb20gQ1AgaW5jYXNlIG9mIHZlcmlmeSBlcnIgaW4gQ1ZcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaW5DdHJsUHJlZml4OiBib29sZWFuID0gdGFzay5JbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gaW5DdHJsUHJlZml4O1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBjaGVjayB0aGUgc3RvcEV4ZWN1dGlvbiBmbGFnIGhlcmUgdG9vIGFuZCBkaXNwbGF5IGFcclxuICAgICAgICAgICAgICAvLyBjb25maXJtIGNhbmNlbCBkaWFsb2cgdGhhdCB3aWxsIGNsb3NlIHRoZSBicm93c2VyIGlmIHRoZSB2YWx1ZSBpcyB0cnVlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIERlZmVjdCAxNTI4NzE6IFdpdGggbmV3IHdheSBvZiBlZGl0aW5nIHJvdywgUlMgaXMgbm90IGZpcmVkIGluZmluaXRlbHksIGJ1dCByb3cgc2VsZWN0aW9uIGlzIHNoaWZ0ZWQgdG8gbmV3IHJvdy4gQWxzbyByb3cgbGVhdmVzIGVkaXRpbmcgbW9kZS5cclxuICAgICAgICAgICAgLy8gU28gZW5zdXJlIHJvdyBlZGl0aW5nIGlzIGxlZnQgd2hlbiB0aGVyZSBpcyBubyB2ZXJpZnkgZXJyb3IgYW5kIG5vdCB1bmNvbmRpdGlvbmFsbHkuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlY01vZGlmaWVkID0gcmVjLk1vZGlmaWVkO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgcmVjLmlzQ2F1c2VJbnZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5pbnZhbGlkYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlY01vZGVJc0RlbGV0ZSA9IChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgZGVsZXRlZCB0aGVuIGV4ZWN1dGUgdGhlIFwicmVjIHN1ZmZpeCBhZnRlclwiIG9ubHlcclxuICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAoc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgICAvLyBpbkRlbGV0ZVByb2Nlc3MgOiBpZiB0aGVyZSBpcyBhbiAnRU5EIFRBU0sgQ09ORCcgd2Ugd2lsbCBoYXZlIGEgM3JkIGN5Y2xlIGluIHJlY29yZCBzdWZmaXgod2hlbiB1cGQrZGVsIG9yIGZvcmNlIHN1ZmYgKyBkZWwpLlxyXG4gICAgICAgICAgICAvLyAxc3QgY3ljbGUgOiB1cGRhZSBjeWNsZSAodGFzayBtb2RlIHdpbGwgYmUgdXBkYXRlKSwgMm5kIDogdGFzayBtb2RlIGlzIGRlbGV0ZSAsIHRoaXMgaXMgd2hlbiB3ZSBzZW5kIHRoZSBkZWxldGUgdG8gdGhlIHNlcnZlci5cclxuICAgICAgICAgICAgLy8gM3JkIC0gc3VmZml4IHRoYXQgaXMgY2FsbGVkIGZyb20gdGhlIGVuZFRhc2suIEluIHRoZSAzcmQgY3ljbGUgdGhlIHJlY01vZGVJc0RlbGV0ZSB3aWxsIGJlIGZhbHNlIGFsdGhvdWdoIHdlIGFyZSBzdGlsbCBpbiB0aGUgZGVsZXRlIHByb2Nlc3MgKHdlIGFscmVhZHkgc2VudCB0aGUgZGVsZXRlIG9wZXIpLlxyXG4gICAgICAgICAgICAvLyBBIGNvbWJpbmF0aW9uIG9mIGZvcmNlIHN1ZmZpeCArIGVuZCB0YXNrIGNvbmQgKyBkZWwgbGluZSAsIHdpbGwgY3Jhc2ggdGhlIHNlcnZlciBvbiB0aGUgM3JkIGN5Y2xlIHNpbmNlIHdlIHdpbGwgYXNrIGZvciB1cGRhdGUgb2ZmXHJcbiAgICAgICAgICAgIC8vIGEgcmVjb3JkIHRoYXQgdGhlIHNlcnZlciBoYWQgZGVsZXRlZCBvbiB0aGUgMm5kIGN5Y2xlLiBUaGF0IGl0IHdoeSB3ZSB1c2UgJ2luRGVsZXRlUHJvY2VzcycsIHNvIHdpbGwgd2lsbCBrbm93IG5vdFxyXG4gICAgICAgICAgICAvLyB0byBhZGQgdXBkYXRlIG9wZXIgb24gYW4gYWxyZWFkeSBkZWxldGVkIHJlY29yZC4gKFFjciAjNzkwMjgzKS5cclxuICAgICAgICAgICAgLy8gKiB0aGVyZSBpcyBzdGlsbCBhIHByb2JsZW0gaW4gJ3VwZGF0ZScgYW5kICdpbnNlcnQnIHdpdGggJ2VuZCB0YXNrIGNvbmQnICsgJ2ZvcmNlJyA6IGFuIGV4dHJhIHVwZGF0ZSB3aWxsIGJlIHNlbmRcclxuICAgICAgICAgICAgLy8gICB0byB0aGUgc2VydmVyIG9uIHRoZSByZWMgc3VmZml4IG9mIHRoZSBlbmQgdGFzay4gYnV0IGFwYXJ0IGZyb20gc2VydmVyIHVwZGF0ZSBpdCBjYXVzZXMgbm8gcmVhbCBwcm9ibGVtLlxyXG4gICAgICAgICAgICBpZiAocmVjTW9kZUlzRGVsZXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSB8fFxyXG4gICAgICAgICAgICAgICFyZWNNb2RlSXNEZWxldGUgJiYgIXJlYy5pbkRlbGV0ZVByb2Nlc3MoKSAmJiAocmVjTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpKSB7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICBkdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocmVjTW9kaWZpZWQgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMucmVhbE1vZGlmaWVkKCkgJiZcclxuICAgICAgICAgICAgICAgICAgIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93VXBkYXRlSW5RdWVyeU1vZGUodGFzay5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHJlYWwgZmllbGRzIHdlcmUgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZHYuY2FuY2VsRWRpdChFdmVudHNNYW5hZ2VyLlJFQUxfT05MWSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZWJ5TXNnSWQoTXNnSW50ZXJmYWNlLlJUX1NUUl9VUERBVEVfSU5fUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGNvbnRpbnVlIGhlcmUgYW5kIHRyeSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIGFsc28gc29tZSBzdWIgdGFza3MgdG8gdGhpcyB0YXNrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjMwNjkyOSwgRm9yY2VFeGl0UHJlIGlzIHJlbGV2YW50IG9ubHkgZm9yIHRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBldmVudFxyXG4gICAgICAgICAgICAvLyBzZWUgYWxzbyBidWcjOjI5Mjg3NlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzaykgJiZcclxuICAgICAgICAgICAgICAvLyBEZWZlY3QgMTU0MDQ3IDogZG8gbm90IHRyeSBhbmQgY29tbWl0IGlmIHRhc2sgaXMgYWJvcnRpbmcgYW5kIHdhcyBhbHJlYWR5IHJlbW92ZWQgKG9yIGFsbCBNR0Qgd2FzIHJlbW92ZWQpLlxyXG4gICAgICAgICAgICAgICghdGFzay5pc0Fib3J0aW5nKCkgfHwgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrLmdldFRhc2tUYWcoKSkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICBpZiAoKCFyZWNNb2RlSXNEZWxldGUgfHwgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIGV2dC5yZXZlcnNpYmxlRXhpdCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSAyIGN5Y2xlcyAodXBkYXRlL2ZvcmNlIHN1ZmZpeCArIGRlbGV0ZSksIGRvIHRoZSBlbmQgdGFzayBvbmx5IGluIHRoZSAybmQgY3ljbGUuXHJcbiAgICAgICAgICAgICAgaWYgKChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpIHx8XHJcbiAgICAgICAgICAgICAgICByZWMuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IC8vIHJlYyAhPSBudWxsXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgcGFya2FiaWxpdHkgb25jZSBhZ2FpbiBhcyBwcm9wZXJ0eSBtaWdodCBoYXZlIGNoYW5nZWQgaW4gdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gOTI0MTEyIC0gaWdub3JlIGRpcmVjdGlvbiAoaWYgZmxhZyBzZXQpIGFzIHdlIGFyZSBmb3JjaW5nIHBhcmsgaW5zcGl0ZSBvZiBmYWlsZWQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdFxyXG4gICAgICAgICAgICAvLyBtb3ZlZCwgd2UgY29tZSB0byBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsICh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAgICAgICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBjdHJsLklzUGFya2FibGUoKSB8fCBjdHJsID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgSW5Db250cm9sIHRydWUgYWZ0ZXIgQ29udHJvbCBQcmVmaXhcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjdHJsLlNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgKDxGaWVsZD5jdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb2RlIGlzIHJlYWNoZWQgdGhlbiBldmVyeXRoaW5nIGlzIG9rIGluIHRoZSBjb250cm9sIHByZWZpeFxyXG4gICAgICAgICAgICAgIC8vIHVzZXIgaGFuZGxlci4gTm93LCBtb3ZlIHRoZSBmb2N1cyB0byB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgcGFya2VkIG9uIGEgY3RybCBzZXQgY2xpY2tlZCBjdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdG8gdGFrZSBjYXJlIG9mIHRlbXBvcmFyeSBlZGl0b3JcclxuICAgICAgICAgICAgICAvLyBNYW5hZ2VyLnNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLlNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwYXJrZWQgb24gYSBjdHJsLCBzZXQgc2V0c3RvcGV4ZWN1dGlvbkN0cmwgdG8gbnVsbFxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBjdHJsO1xyXG4gICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGRpc2FibGUgYWN0aW9ucyBhbmQgc3RhdGVzLiBkbyBpdCBvbmx5IGlmIHdlIGFyZSBnZXR0aW5nIG91dCBvZiB0aGUgY29udHJvbC5cclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAvLyBJZiBjb250cm9sIHN1ZmZpeCBnZXQgJ3N0b3AgZXhlY3V0aW9uJyAoZS5nLiB2ZXJpZnkgZXJyb3IpLCB0aGUgZm9jdXMgd2lsbCBiZSByZW1haW4gb24gY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgIC8vIFNvIHNldCBJbkNvbnRyb2wgdG8gdHJ1ZVxyXG4gICAgICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmllbGRzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgdGV4dCBjb250cm9sIGFuZCB3aXRoIHR5cGUgdGhhdCBoYXMgZGVmYXVsdCBkaXNwbGF5XHJcbiAgICAgICAgICAgIC8vIHZhbHVlIChudW1lcmljLCBkYXRlLCB0aW1lLCBsb2dpY2FsIGV0YylcclxuICAgICAgICAgICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+Y3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBpZiAoZmxkICE9IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZmxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBjdHJsLklzSW50ZXJhY3RpdmVVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0cmwuUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9OT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBzaW11bGF0ZXMgdXNlciBhc2tpbmcgZm9yIHRoZSBuZXh0IHJlYy5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQzpcclxuICAgICAgICAgIGxldCBmb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgIGlmICghdGFzay5pc01haW5Qcm9nKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhmb3JtLmlzTGluZU1vZGUoKVxyXG4gICAgICAgICAgICAgID8gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1dcclxuICAgICAgICAgICAgICA6IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSxcclxuICAgICAgICAgICAgICBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBkZWxldGUgcmVjb3JkIGluIG5vbiBpbnRlcmFjdGl2ZSB0YXNrXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDOlxyXG4gICAgICAgICAgLy8gY2hlY2sgZW1wdHkgZGF0YXZpZXcgYmVmb3JlIHRyeWluZyB0byBkZWxldGUsIGluIGNhc2UgdGFzayBzdGFydGVkIHdpdGggZW1wdHkgZGF0YXZpZXcuXHJcbiAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgKHRhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHJlZnJlc2hEaXNwbGF5IDogYm9vbGVhbiA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSA9PT0gJzEnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0NvbnRyb2w+Y3RybCkudmFsaWRhdGVBbmRTZXRWYWx1ZUlmQWxsb3dlZChldnQuZ2V0VmFsdWUoKSwgcmVmcmVzaERpc3BsYXkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5vbiByZXZlcnNpYmxlIGV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBsZXQgZXhpdENvbW1hbmQ6IGJvb2xlYW4gPSAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJ0RXZ0LnNldE5vblJldmVyc2libGVFeGl0KCk7XHJcbiAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UICYmIHRhc2sgIT0gbnVsbCAmJiAhKGV2ZW50U3ViVHlwZSA9PT0gRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCkgJiYgIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoZXZlbnRDb2RlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChsYXN0UGFya2VkQ3RybCwgZXZlbnRDb2RlLCBldmVudFN1YlR5cGUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7XHJcbiAgICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmw6IE1nQ29udHJvbCwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpOyAvLyAodXNlIGZvciBhY3RfY2FuY2VsICYgYWN0X3J0X3ZpZXdfcmVmcmVzaFxyXG4gICAgICAvLyBiYXNpY2FsbHkgTUdfQUNUX1ZJRVdfUkVGUkVTSCByZXByZXNlbnQgdGhlIHZpZXcgcmVmcmVzaCBldmVudCByYWlzZWQgYnkgdGhlIHVzZXJcclxuICAgICAgLy8gaG93ZXZlciB3ZSB1c2UgaW50ZXJuYWxseSBpbiB0aGUgY29kZSB0byByZWZyZXNoIHRoZSBkaXNwbGF5IChtYWlubHkgaW4gc3ViIGZvcm1zIHJlZnJlc2hlcylcclxuICAgICAgLy8gaW4gb3JkZXIgdGhlIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHJlYWwgdXNlIGFuZCB0aGUgaW50ZXJuYWwgdXNlIHdlIHNldCB0aGlzIGZsYWcgdG8gZmFsc2VcclxuICAgICAgLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gc2luY2Ugd2UgbWFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGNhY2hpbmcgYSBzdWJmb3JtXHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpXHJcbiAgICAgICAgcnRFdnQuc2V0SXNSZWFsUmVmcmVzaChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGQoKTogRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGN1cnJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJGaWVsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl9jdXJyRmllbGQuZ2V0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uPyA6IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzAoc3RvcCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8xKHN0b3AsIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3A6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihzdG9wLCBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5BTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb246IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTClcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIGlmKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLlNFUlZFUikge1xyXG4gICAgICAgIGxldCB0bXBWZWMgPSBuZXcgTGlzdDxSdW5UaW1lRXZlbnQ+KCk7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gbGVhdmUgdGhlIFwic2VydmVyIGV2ZW50c1wiIGluIHRoZSBxdWV1ZS5cclxuICAgICAgICAvLyBEbyBpdCwgYnV0IGFsc28gcmVtb3ZlIHRoZSBcInByb3RlY3Rpb25cIiBmcm9tIHRoZXNlIGV2ZW50cyBzbyBuZXh0XHJcbiAgICAgICAgLy8gdGltZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBxdWV1ZSB0aGV5IHdpbGwgYWxzbyBiZSBkZWxldGVkLlxyXG4gICAgICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgICBydEV2dCA9IDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gICAgICAgICAgaWYgKHJ0RXZ0LmlzRnJvbVNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnJlc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgICAgICB0bXBWZWMucHVzaChydEV2dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG1wVmVjLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHRtcFZlYy5nZXRfSXRlbShpKSk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX3N0b3BFeGVjdXRpb24gPSBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN0b3BFeGVjdXRpb25DdHJsKGN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID09PSBudWxsIHx8IGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50aGUgdGFzayB0byByZWZlciB0byA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Gb3JjZURlbFwiPnRydWUgaWYgdGhlIGRlbGV0ZSBpcyBkb25lIGJlY2F1c2Ugb2YgZm9yY2UgZGVsZXRlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxDdXJyUmVjKHRhc2s6IFRhc2ssIGluRm9yY2VEZWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuXHJcbiAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgcmVjb3JkIGFuZCBydW4gcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIG5ldyBjdXJyZW50IHJlY29yZFxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmRlbEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBubyBjdXJyLXJlYyA9PT4gd2UgZGVsZXRlZCB0aGUgbGFzdCByZWNvcmQgYW5kIGZhaWxlZCB0byBjcmVhdGUgYSBuZXcgb25lIChlLmcuXHJcbiAgICAvLyBDUkVBVEUgbW9kZSBpcyBub3QgYWxsb3dlZCkgPT0+IGVuZCB0aGUgdGFzay4gQW4gZXhjZXB0aW9uIHRvIHRoZSBydWxlIGlzIHdoZW5cclxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgcmVjb3JkLlxyXG4gICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChkdi5nZXRDdXJyUmVjSWR4KCkgPj0gMCkge1xyXG4gICAgICAgIC8vIFFDUiAjNjU2NDk1OiBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCBhbmQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIHN0aWxsIHRoZVxyXG4gICAgICAgIC8vIGRlbGV0ZWQgb25lIHRoZW4gdGhlIHJlY29yZCBwcmVmaXggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cclxuICAgICAgICBpZiAoKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpbkZvcmNlRGVsKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgdXNlcnMgY29uZmlybWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50byBjaGVjayBjb25maXJtIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gcHJvY2VzcyBjb21tYW5kLCBmYWxzZSAtIHN0b3AgY29tbWFuZCBwcm9jZXNzaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlybWVkKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjb25maXJtOiBib29sZWFuO1xyXG4gICAgbGV0IGFuc3dlcjogc3RyaW5nO1xyXG4gICAgbGV0IGFuczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0YXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25maXJtID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgJiYgY29uZmlybSAmJiAhdGFzay5EYXRhU3luY2VkKSB7XHJcbiAgICAgIGFucyA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybShNc2dJbnRlcmZhY2UuQ1JGX1NUUl9DT05GX1VQRCxcclxuICAgICAgICBTdHlsZXMuTVNHQk9YX0lDT05fUVVFU1RJT04gfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMKTtcclxuICAgICAgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICAgIGFuc3dlciA9ICdZJztcclxuICAgICAgLy8gWWVzXHJcbiAgICAgIGVsc2UgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfTk8pXHJcbiAgICAgICAgYW5zd2VyID0gJ04nO1xyXG4gICAgICAvLyBOb1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYW5zd2VyID0gJ0MnOyAvLyBDYW5jZWxcclxuICAgIH0gZWxzZVxyXG4gICAgICBhbnN3ZXIgPSAnWSc7XHJcblxyXG4gICAgc3dpdGNoIChhbnN3ZXIpIHtcclxuICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdOJzpcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgY29udGludWUgcmVjb3JkIHN1ZmZpeFxyXG5cclxuICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGV2ZW50IHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLnVwZGF0ZUNvbmZpcm1lZCgpIGlsbGVnYWwgY29uZmlybWF0aW9uIGNvZGU6ICcgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgJzEnKTtcclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0ssIEpTT04uc3RyaW5naWZ5KCg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpLlRhc2tEZWZpbml0aW9uSWQpKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHJ0RXZ0LmdldEFyZ0xpc3QoKS5idWlsZFhNTChzdHIpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCwgIHN0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgZnJvbSBsb2NhbCBzdG9yYWdlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRGcm9tTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICAvL2dldCByb3V0ZSBldmVudCBpZiBzdG9yZWQgb24gbG9jYWwgc3RvcmFnZVxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuXHJcbiAgICBsZXQgbGFzdFJvdXRlRXZlbnQgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG5cclxuICAgIGlmIChsYXN0Um91dGVFdmVudCA9PT0gJzEnKSB7XHJcbiAgICAgIGxldCBzcmNUYXNrRGVmaW5pdGlvblN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgbGV0IHJvdXRlQXJnTGlzdFN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcblxyXG4gICAgICAvLyBwYXJzZSBzcmNUYXNrRGVmaW5pdGlvblN0ciBhbmQgcHJlcGFyZSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCB0YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQoKTtcclxuICAgICAgdGFza0RlZmluaXRpb25JZC5mcm9tSlNPTihzcmNUYXNrRGVmaW5pdGlvblN0cik7XHJcblxyXG4gICAgICAvL3NlYXJjaCBzb3VyY2UgdGFzayBpbiBuZXdseSBsb2FkZWQgdGFzayB0cmVlIGJ5IHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHNyY1Rhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5nZXRUYXNrQnlUYXNrRGVmaW5pdGlvbklEKHRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgICBsZXQgYXJncyA9IG51bGw7XHJcbiAgICAgIGlmIChyb3V0ZUFyZ0xpc3RTdHIgIT0gbnVsbCkge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICAgIGFyZ3MuZmlsbExpc3Qocm91dGVBcmdMaXN0U3RyLCBzcmNUYXNrKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2ssIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHNhdmUgdGhlIGxhc3Qgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChydEV2dDpSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChydEV2dCA9PSBudWxsKVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBydEV2dC5yZXBsaWNhdGUoKTtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcnVudGltZSBldmVudCBsb2NhdGVkIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBpZ25vcmUgdW5rbm93biBjb21tYW5kc1xyXG4gIC8vLyAgIGFycml2aW5nIGZyb20gdGhlIGVuZ2luZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldElnbm9yZVVua25vd25BYm9ydCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpZ25vcmUgdW5rbm93biBhYm9ydFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlnbm9yZVVua25vd25BYm9ydCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY292ZXIgZnJvbSBhIGZhaWx1cmUgdG8gb3ZlcmxheSBhIHRhc2suIFdoZW4gdGhlIHNlcnZlciBvcmRlcnMgdGhlIGNsaWVudCB0byBydW4gYVxyXG4gIC8vLyAgIG5ldyB0YXNrIGluIGEgZnJhbWUgd2hpY2ggYWxyZWFkeSBjb250YWlucyBhbiBhY3RpdmUgdGFzaywgdGhlIGNsaWVudCB0cmllcyB0byB0ZXJtIHRoZVxyXG4gIC8vLyAgIGV4aXN0aW5nIHRhc2sgYW5kIHJlcGxhY2UgaGltLiBXaGVuIHRoaXMgYWN0aW9uIGZhaWxzLCB0aGUgY2xpZW50IGhhcyB0byBhc2sgdGhlIHNlcnZlclxyXG4gIC8vLyAgIHRvIHRlcm1pbmF0ZSB0aGUgTkVXIFRBU0ssIGFuZCBpZ25vcmUgdGhlIG92ZXJsYXkgYWN0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNraWRcIj4tIHRoZSBpZCBvZiB0aGUgTkVXIFRBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+ICAgLSB0aGUgTUdEYXRhIG9mIHRoZSBPTEQgVEFTSy48L3BhcmFtPlxyXG4gIGFzeW5jIGZhaWxUYXNrT3ZlcmxheSh0YXNrSWQ6IHN0cmluZywgbWdkOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG5cclxuICAgIGlmICh0YXNrSWQgIT09IG51bGwpIHtcclxuICAgICAgLy8gVGhlIHNlcnZlciB3aWxsIHJldHVybiB1cyAnYWJvcnQnIGNvbW1hbmRzIGZvciB0aGUgbmV3IHRhc2suIElnbm9yZSB0aGVtLCBzaW5jZSBpdCB3YXNudCBzdGFydGVkIHlldFxyXG4gICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydCh0cnVlKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGFza0lkLCBmYWxzZSk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiBjdXJyZW50IGV2ZW50IHNob3VsZCBiZSBwcm9wb2d0YXRlZCB0byBhbGwgdGFza3MgaW4gYSBzcGVjaWZpYyB0cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFdmVudFNjb3BlVHJhbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRTY29wZSA9PT0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV2ZW50U2NvcGVUcmFucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBOT04gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRXZlbnRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRpbWUgb2YgZmlzdCBldmVudCBpbiBzZXF1ZW5jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aW1lIG9mIGZpdHN0IGV2ZW50IGluIHNlcXVlbmNlPC9yZXR1cm5zPlxyXG4gIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50c1F1ZXVlLkdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYkl0bVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGFzdCBlbmFibGVkIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmljIGtleSAoaW4ga2JJdGVtKTwvcmV0dXJucz5cclxuICAvLy8gPGNoZWNrQWNjZXNzS2V5SW5NZW51czo+ICBpZiB0byBjaGVjayB0aGUga2V5Ym9hcmQgaW4gdGhlIG1lbnUgPC9jaGVja0FjY2Vzc0tleUluTWVudXM6PlxyXG4gIHB1YmxpYyBnZXRNYXRjaGluZ0FjdGlvbiggIGtiSXRtOiBLZXlib2FyZEl0ZW0pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBhY3Q6IG51bWJlciA9IDA7XHJcbiAgICAvLyB3aGVuIG1lbnUgaXMgZGVmaW5lIHdpdGggbm8ga2V5Ym9hcmQgZGVmaW5lLCB0aGUga2JJdGVtIGlzIHJldHVybiBudWxsO1xyXG4gICAgaWYgKGtiSXRtID09IG51bGwpXHJcbiAgICAgIHJldHVybiBhY3Q7XHJcblxyXG5cclxuICAgIC8vIFRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXksIGJ1dCBpdCBzdGlsbCBiZWxvbmdzIHRvIGFuIGFjdGlvbi5cclxuICAgIC8vIHNlZSBpZiB0aGUga2JJdG0gaG9sZCBhbiBhY3Rpb24gKG9yaWdpbmFsbHkgbWFkZSBmb3IgTUdfQUNUX0NIQVIpLlxyXG4gICAgaWYgKGFjdCA9PT0gMCkge1xyXG4gICAgICAvLyBpZiBtZW51IHdhcyBmb3VuZCBhbmQgaXQgaXMgaW50ZXJuYWwgZXZlbnQgcHV0IGFjdGlvbiB0byB0aGUgcXVldWUgb25seSBpZiB0aGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LlxyXG4gICAgICBpZiAoa2JJdG0uZ2V0QWN0aW9uKCkgIT09IDApXHJcbiAgICAgICAgYWN0ID0ga2JJdG0uZ2V0QWN0aW9uKCk7XHJcbiAgICAgIC8vIHRoaXMgaXMgb25seSBURU1QIGhhcmRjb2RlZC4gdGhlIGFjdGlvbiB3aWxsIG5lZWQgdG8gYmUgaW4gdGhlIGtleWJvYXJkIG1hcHBpbmdcclxuICAgICAgLy8gYWxzbyBhIGNoYW5nZSB0byB0aGUgb25saW5lIChpZiB0aW1lIHBlcm1pdHMpIGFsc28gdG8gdHVybiB0aGUgdG9nZ2xlIGluc2VydCBpbnRvIGFuIGFjdC5cclxuICAgICAgZWxzZSBpZiAoa2JJdG0uZ2V0S2V5Q29kZSgpID09PSA0NSAmJiBrYkl0bS5nZXRNb2RpZmllcigpID09PSBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSAmJiBrYkl0bS5nZXRTdGF0ZXMoKSA9PT0gMClcclxuICAgICAgICBhY3QgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFjdCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0dGVyIGZvciB0aGUgZXhlY1N0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjazwvcmV0dXJucz5cclxuICBnZXRFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2sge1xyXG4gICAgcmV0dXJuIDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBvbmUgZW50cnkgb2YgYW4gb3BlcmF0aW9uIGludG8gdGhlIGV4ZWN1dGlvbiBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgY3VycmVudCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHdoaWNoIGhvbGRzIHRoZSByYWlzZSBldmVudCBjb21tYW5kIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSB0aGUgaWR4IG9mIHRoZSBjb21tYW5kIHdoaWNoIGNyZWF0ZWQgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IChyYWlzZSBldmVudCBvZiBmdW5jdGlvbiBjYWxsKTwvcGFyYW0+XHJcbiAgcHVzaEV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wdXNoKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0VGFza0lkQnlJZCh0YXNrSWQpLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgb25lIGVudHJ5IGZyb20gdGhlIGV4ZWN1dGlvbiBzdGFjayAtIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbiB3aGljaCBjYW4gaG9sZFxyXG4gIC8vLyAgIG90aGVyIG9wZXJhdGlvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGVudHJ5IHRoYXQgd2FzIHBvcHBlZDwvcmV0dXJucz5cclxuICBwb3BFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2tFbnRyeSB7XHJcbiAgICByZXR1cm4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlYyBzdGFja3MgLSB0aGlzIGlzIHRvIGRlZmVyIG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90XHJcbiAgLy8vICAgZ2V0IGluZmx1ZW5jZXMgYnkgdGhlIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdoZW4gcGVyZm9ybWluZyB0aGUgcmVjb3JkIHByZWZpeCBvZiBhIHRhc2tcclxuICAvLy8gICB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBjYWxsaW5nIGEgbW9kYWwgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVzaE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChudWxsKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSBuZXcgZW50cnkgZnJvbSB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWN1dGlvbiBzdGFja3Mgd2hlbiB0aGUgc2VxdWVuY2UgdGhhdCBuZWVkcyB0byBhdm9pZFxyXG4gIC8vLyAgIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBoYXMgZW5kZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSBpbnRvIHRoZSBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgdGFzayBpbiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSBoYW5kbGVyIGlkIG9mIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSBpZHggb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgZW50cnkgcmVmZXJzIHRvPC9wYXJhbT5cclxuICBwdXNoU2VydmVyRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnB1c2godGFza0lkLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFycyB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBhZnRlciB3ZSBmb3VuZCB0aGUgY29ycmVjdCBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gY29udGludWUgZnJvbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCkge1xyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV2ZXJzZSB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdlIGdldCBpdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHB1c2ggaXQgaW4gdGhlIHNhbWUgb3JkZXJcclxuICAvLy8gICBpdCBpcyB3cml0dGVuIGluIHRoZSBtZXNzYWdlLCB3aGljaCBhY3R1YWxseSBtZWFucyB3ZSBoYXZlIHRvIHJldmVyc2UgaXQgaW4gb3JkZXIgdG8gaGFuZGxlIGl0IGNvcnJlY3RseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmV2ZXJzZVNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKVxyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnJldmVyc2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayBvbiB0aGUgY2xpZW50ICtcclxuICAvLy8gICB0aGUgY3VycmVudCBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIG9uLCB3aGljaCBpcyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGV4ZWN1dGVcclxuICAvLy8gICBpbiB0aGUgY3VycmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJcIj4tIHRoZSBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhcldoZW5Gb3VuZFwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBjbGVhciB0aGUgc2VydmVyIHN0YWNrIHdoZW4gd2UgcmVhY2ggaXRzIGVuZCxcclxuICAvLy8gICBvciBpZiB3ZSBqdXN0IHVzaW5nIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHdoYXQgdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnRcclxuICAvLy8gICBpZiBpdCByZXR1cm5zIC0xIHRoZW4gdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgYXMgdXN1YWxcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE5leHRPcGVySWR4KG9wZXI6IE9wZXJhdGlvbiwgY2xlYXJXaGVuRm91bmQ6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5OiBFeGVjdXRpb25TdGFja0VudHJ5ID0gbnVsbDtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGVtcHJ5IGl0IG1lYW5zIHdlIGRpZCBub3QgcmV0dXJuIGZyb20gdGhlIHNlcnZlcixcclxuICAgIC8vIHNvIHdlIGhhdmUgdG8gY29udGludWUgd2l0aCBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgaGFuZGxlciBhcyB1c3VhbFxyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5jb3VudCgpICE9PSAwICYmIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwgJiYgISg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuZW1wdHkoKSkge1xyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyJ3MgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgLVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlbnRyeSBpbiB0aGUgY2xpZW50J3Mgc3RhY2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlcidzIHN0YWNrIHNpemVcclxuICAgICAgaWYgKCg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAvLyB3ZSBjb3B5IHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHBvcCBmcm9tIGl0IHVudGlsIHRoZSBzaXplIG9mIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBhbmQgdGhlIGNsaWVudCBpcyB0aGUgc2FtZVxyXG4gICAgICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2s6IEV4ZWN1dGlvblN0YWNrID0gbmV3IEV4ZWN1dGlvblN0YWNrKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKTtcclxuICAgICAgICB3aGlsZSAodG1wU2VydmVyRXhlY1N0YWNrLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgICB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeSA9IHRtcFNlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIGFsbCBlbnRyaWVzIGJlZm9yZSB0aGUgbGFzdCBvbmUgd2UgcG9wcGVkIGFyZSB0aGUgc2FtZSBhcyBpbiB0aGUgY2xpZW50IGFuZFxyXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGVudHJ5IGlzIG9uIHRoZSBzYW1lIGhhbmRsZXIgYXMgdGhlIHNlcnZlcidzIGxhc3QgZW50cnksXHJcbiAgICAgICAgLy8gYW5kIHRoZSBvcGVyYXRpb24gaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLFxyXG4gICAgICAgIC8vIHRoZW4gdGhpcyBlbnRyeSBpbiB0aGUgc2VydmVyIGluZGljYXRlcyB3aGljaCBpcyBvdXIgbmV4dCBvcGVyYXRpb25cclxuICAgICAgICBpZiAodGhpcy5fZXhlY1N0YWNrLnBlZWsoKS5FcXVhbHModG1wU2VydmVyRXhlY1N0YWNrKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5UYXNrSWQgPT09IG9wZXIuZ2V0VGFza1RhZygpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LkhhbmRsZXJJZCA9PT0gb3Blci5nZXRIYW5kbGVySWQoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4ID49IG9wZXIuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4O1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgYnkgb25seSAxLFxyXG4gICAgICAgICAgLy8gd2hpY2ggbWVhbnMgd2UgYXJlIGNoZWNraW5nIHRoZSB0b3AgbW9zdCBlbnRyeSBvbiB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrLFxyXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN0YWNrIGlzIHRoZSBzYW1lIG5vdywgc28gd2UgY2FuIGNsZWFyIHRoZSBzZXJ2ZXIncyBzdGFjayAtXHJcbiAgICAgICAgICAvLyB3ZSBnb3QgdG8gdGhlIHBvaW50IHdoaWNoIHdlIGFyZSBvbiB0aGUgZXhhY3Qgb3BlcmF0aW9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGVmdCBleGVjdXRpb24uXHJcbiAgICAgICAgICBpZiAoY2xlYXJXaGVuRm91bmQgJiYgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPT09ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpICsgMSkge1xyXG4gICAgICAgICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dE9wZXJJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcIj48L3BhcmFtPlxyXG4gIHNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrID0gaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldEFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBBbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzIGZvciBhIG5vbiBpbnRlcmFjdGl2ZSB0YXNrLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEFsbG93RXZlbnRzKVxyXG5cclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU7XHJcbiAgICAvLyBRQ1IgIzgwMjQ5NSwgVGhlIEZvcm1zIENvbnRyb2xsZXIgbWVjaGFuaXNtIGlzIGRpc2FibGUgaWYgd2UgYXJlIGluIE5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggQWxsb3dFdmVudHMgPSB0cnVlIGFuZCBPcGVuIFdpbmRvdyA9IHRydWVcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndpdGhpbk5vbkludGVyYWN0aXZlTG9vcFwiPjwvcGFyYW0+XHJcbiAgZ2V0QWxsb3dFdmVudHMoKTogRXZlbnRzQWxsb3dlZFR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBUUlVFIGlmIG5vIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBOb0V2ZW50c0FsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHMgPT09IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgYW5kIGV4ZWN1dGUgY29udHJvbCBtb2RpZnkgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybE1vZGlmeShjdHJsOiBNZ0NvbnRyb2wsIGFjdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiBjYW5ub3QgbW9kaWZ5LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoY3RybCA9PSBudWxsIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEw6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWSk7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYWN0aW9uIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBBbGxvd2VkRXZlbnRzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEFjdEFsbG93ZWQoYWN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvd2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHN3aXRjaCAodGhpcy5nZXRBbGxvd0V2ZW50cygpKSB7XHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuQUxMOlxyXG4gICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05FOlxyXG4gICAgICAgIC8vIGFsbG93IGNyZWxpbmUgZXZlbiBpbiBhbGxvdz1uby4gd2UgaGF2ZSBubyBjaG9pY2UuIFJDIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgdGhlbiBiYXRjaC4gaXQgdXNlcyBBQ1RfQ1JFQUxJTkVcclxuICAgICAgICAvLyB3aGVuIGluIGNyZWF0ZSBtb2RlLiBXZSB3aWxsIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZSBmdXR1cmUgc28gdGhhdCB3aGVuIHVzZXIgcmFpc2VzIGNyZWxpbmUgZXZlbnQgaXQgd2lsbCBub3Qgd29yay4ganVzdCBpbnRlcm5hbGx5LlxyXG4gICAgICAgIGFsbG93ZWQgPSAoYWN0ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgYWxsb3dlZCB3aGVuIHJ1bm5pbmcgaW5zaWRlIGEgbm9uIGludGVyYWN0aXZlIGxvb3Agd2hlbiBhbGxvdyBldmVudHMgPSBZRVMuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFOlxyXG5cclxuICAgICAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVF9TWVNURU06XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjb21taXRzIHRoZSByZWNvcmQgYW5kIHRoZW4gZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdHJhbnNhY3Rpb24sIGl0IHBlcmZvcm1zIG90aGVyIGFjdGlvbnMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNSZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRSZWNvcmQodGFzazogVGFzaywgaXNSZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IHJlYy5pc05ld1JlYygpO1xyXG4gICAgbGV0IHNhdmVQcmV2Q3VyclJlYzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSByZWMuTW9kaWZpZWQ7XHJcblxyXG4gICAgaWYgKCFkdi5yZWNJbk1vZGlmaWVkVGFiKHJlYy5nZXRJZCgpKSlcclxuICAgICAgcmVjLmNsZWFyRmxhZ3NIaXN0b3J5KCk7XHJcbiAgICBhd2FpdCB0YXNrLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoaXNSZXZlcnNpYmxlRXhpdCwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCwgdGFzay5Db25maXJtVXBkYXRlTm8pO1xyXG4gICAgaWYgKHRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkpIHtcclxuICAgICAgLy8gb24gZmFpbHVyZSBvZiB0aGUgdHJhbnNhY3Rpb24gcmVlbnRlciB0aGUgcmVjb3JkIGxldmVsIGJ5XHJcbiAgICAgIC8vIGV4ZWN1dGluZyBcInJlY29yZCBwcmVmaXhcIiBmb3IgdGhlIHN1YmZvcm1zIHdoaWNoIGV4ZWN1dGVkXHJcbiAgICAgIC8vIHRoZSBzdWZmaXggc3VjY2Vzc2Z1bGx5XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGFzay5EYXRhU3luY2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChyZWNNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0TGF0ZUNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNzgzMDcxIGlmIGFmdGVyIGNoZWNrQW5kQ29tbWl0IGFsbCBpZiBPLksuIHRoZVxyXG4gICAgICAvLyByZXR1cm4gdGhlIGxldmVsIGJhY2sgdG8gdGFzayBsZXZlbCBpbiBvcmRlciB0byBsZXQgcmVjX3ByZml4IHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgICAvLyBldmVuIHRob3VnaCB0aGUgdGFzayBsZXZlbCBzaG91bGQgYmUgVEFTS19MRVZFTF9UQVNLXHJcbiAgICAgIC8vIHRoZSBjaGVja0FuZENvbW1pdCBwcm9jZXNzIGNvdWxkIGhhdmUgY2hhbmdlIGl0XHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgcmVjLnJlc2V0VXBkYXRlZCgpO1xyXG4gICAgICByZWMucmVzZXRNb2RpZmllZCgpO1xyXG5cclxuICAgICAgLy8gUUNSICM5ODMxNzg6IGNhbmNlbCB0aGUgcmVjb3JkIG9ubHkgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIGhhbmRsaW5nIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgcmVjb3JkIHdhc24ndFxyXG4gICAgICAvLyBtb2RpZmllZFxyXG4gICAgICBpZiAoIXJlY01vZGlmaWVkICYmICFmb3JjZVN1ZmZpeCAmJiAoIWlzU2VsZWN0aW9uVGFibGUgfHwgIXRhc2suSW5TZWxlY3QpKSB7XHJcbiAgICAgICAgaWYgKGlzTmV3UmVjKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQyODk2NTogc2F2ZSB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgQkVGT1JFXHJcbiAgICAgICAgICAvLyBcImNhbmNlbCBlZGl0XCIgc28gdGhlIGNvcnJlY3QgcmVjb3JkIGlzIHNhdmVkXHJcbiAgICAgICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gICAgICAgICAgc2F2ZVByZXZDdXJyUmVjID0gZmFsc2U7XHJcbiAgICAgICAgICByZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFyZWMuZ2V0Rm9yY2VTYXZlT3JnKCkpXHJcbiAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCB0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBRQ1IgIzk5NTIyMjogaWYgdGhlIHJlY29yZCB3YXMgbW9kaWZpZWQgdGhlbiBzYXZlIHRoZVxyXG4gICAgICAvLyBvcmlnaW5hbCByZWNvcmQgYWdhaW4gaW4gY2FzZSBhIHRhc2sgbGF2ZWwgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gd2lsbCBmYWlsIHdpdGggcmV0cnkgc3RyYXRlZ3kuIEJlZm9yZSB0aGlzIGZpeCwgaWYgc3VjaFxyXG4gICAgICAvLyB0aGluZyBoYXBwZW5lZCBvbiBhIHJlY29yZCB3aGljaCB3YXNuJ3QgdGhlIGZpcnN0IHRoZW5cclxuICAgICAgLy8gdGhlIFwiYmVnaW4gdGFibGVcIiBldmVudCByYWlzZWQgYSByZWNvcmQgc3VmZml4IGV2ZW50IGFuZFxyXG4gICAgICAvLyBjYXVzZWQgXCJjYW5jZWwgZWRpdFwiLlxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNhdmVQcmV2Q3VyclJlYylcclxuICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgbG9jYXRlIHRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbmNMb2NhdGVUaW1lckNCKHRhc2tPYmo6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0YXNrT2JqO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkNSRU1FTlRBTF9MT0NBVEUpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IodGFzayk7XHJcbiAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBkb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICBsZXQgcGFyZW50RHYgPSA8RGF0YVZpZXc+cGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCBwYXJlbnRSZWM6IFJlY29yZCA9IHBhcmVudER2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBkbyBub3QgdG91Y2ggdGhlIHBhcmVudCByZWNvcmQgaWYgdGhlIHBhcmVudCBkYXRhdmlldyBpcyAnZW1wdHkgZGF0YXZpZXcnLlxyXG4gICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHBhcmVudFJlYyAhPSBudWxsICYmIHBhcmVudFJlYy5Nb2RpZmllZCAmJiAhcGFyZW50RHYuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgcGFyZW50UmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIGF3YWl0IHBhcmVudER2LmFkZEN1cnJUb01vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgKChwYXJlbnREdi5nZXRDdXJyUmVjKCkpKS5TeW5jZWQgPSB0cnVlO1xyXG4gICAgICBwYXJlbnREdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICBsZXQgZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQocGFyZW50VGFzay5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRXhlY3V0ZUxvY2FsVXBkYXRlcyk7XHJcbiAgICAgIGF3YWl0IHBhcmVudFRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBQcm9jZXNzQWJvcnRpbmdFcnJvcihleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlTXNnOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yQ29uc29sZTogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvck1zZ0JveDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICBlTXNnID0gKDxTZXJ2ZXJFcnJvcj5leCkuR2V0TWVzc2FnZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBlTXNnID0gKChleC5NZXNzYWdlICE9PSBudWxsKSA/IGV4Lk1lc3NhZ2UgOiBleC5HZXRUeXBlKCkpO1xyXG5cclxuICAgIGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGVNc2cpO1xyXG4gICAgZXJyRm9yTXNnQm94ID0gU3RyVXRpbC5nZXRNc2dCb3hFcm9yU3RyaW5nKGVNc2cpO1xyXG5cclxuICAgIGlmIChleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXguSW5uZXJFeGNlcHRpb24sIGVyckZvckNvbnNvbGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHx8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhlcnJGb3JDb25zb2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gOiBoYW5kbGUgZXJyb3JzXHJcbiAgICBsZXQgc2VuZFVubG9hZFRvU2VydmVyOiBib29sZWFuID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCAhPT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkOyAgLy8gdW5sb2FkIHRoZSBjb250ZXh0IGluIHRoZSBzZXJ2ZXIgb25seSBpZiBhIGNvbnRleHQgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IHNlc3Npb25cclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IDA7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG5cclxuICAgIGxldCBzdHlsZTogbnVtYmVyID0gMTY7XHJcbiAgICBpZiAoZXguTWVzc2FnZS5zdGFydHNXaXRoKCc8SFRNTCcpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRJc0luVmlld1JlZnJlc2goKTogYm9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmlzSW5WaWV3UmVmcmVzaDtcclxuICB9XHJcblxyXG4gIHNldElzSW5WaWV3UmVmcmVzaChpblZpZXdSZWZyZXNoOiBib29sZWFuKTogdm9pZHtcclxuICAgIHRoaXMuaXNJblZpZXdSZWZyZXNoID0gaW5WaWV3UmVmcmVzaDtcclxuICB9XHJcbn1cclxuIl19