@magic-xpa/engine 4.1100.0-dev4110.98 → 4.1100.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (492) hide show
  1. package/README.md +7 -7
  2. package/{esm2020 → esm2022}/index.mjs +188 -188
  3. package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
  4. package/esm2022/src/AccessHelper.mjs +15 -0
  5. package/esm2022/src/ClientManager.mjs +421 -0
  6. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  7. package/{esm2020 → esm2022}/src/CommandsProcessorManager.mjs +25 -25
  8. package/esm2022/src/CommandsTable.mjs +162 -0
  9. package/esm2022/src/ConstInterface.mjs +517 -0
  10. package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
  11. package/esm2022/src/FlowMonitorInterface.mjs +16 -0
  12. package/esm2022/src/GUIManager.mjs +62 -0
  13. package/esm2022/src/GlobalCommandsManager.mjs +34 -0
  14. package/esm2022/src/GuiEventsProcessor.mjs +156 -0
  15. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  16. package/esm2022/src/ServerConfig.mjs +122 -0
  17. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  18. package/esm2022/src/bridge/MagicBridge.mjs +41 -0
  19. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
  20. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
  21. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
  22. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
  23. package/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
  24. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  25. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +59 -59
  26. package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
  27. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
  28. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  29. package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
  31. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
  32. package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
  33. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  34. package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
  35. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +40 -0
  36. package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
  37. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
  38. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
  39. package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
  40. package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
  41. package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
  42. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
  44. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  45. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
  47. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
  48. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
  49. package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
  50. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  51. package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
  52. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
  53. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
  54. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
  55. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  56. package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
  57. package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
  58. package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
  59. package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +2 -2
  60. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  61. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  62. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddRangeCommand.mjs +62 -62
  63. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddSortCommand.mjs +33 -33
  64. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  65. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
  66. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  67. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  68. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
  69. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
  70. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
  71. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  72. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  73. package/{esm2020 → esm2022}/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -132
  74. package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
  75. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
  76. package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
  77. package/esm2022/src/data/DataView.mjs +1613 -0
  78. package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
  79. package/esm2022/src/data/DataviewManager.mjs +28 -0
  80. package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
  81. package/esm2022/src/data/DvCache.mjs +67 -0
  82. package/esm2022/src/data/Field.mjs +646 -0
  83. package/esm2022/src/data/FieldBase.mjs +15 -0
  84. package/esm2022/src/data/FieldsTable.mjs +103 -0
  85. package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
  86. package/{esm2020 → esm2022}/src/data/Key.mjs +88 -88
  87. package/esm2022/src/data/Record.mjs +880 -0
  88. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  89. package/esm2022/src/data/RecordsTable.mjs +267 -0
  90. package/{esm2020 → esm2022}/src/data/TaskTransactionManager.mjs +107 -103
  91. package/{esm2020 → esm2022}/src/data/XMLBasedDcValuesBuilder.mjs +74 -74
  92. package/{esm2020 → esm2022}/src/enums.mjs +23 -23
  93. package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
  94. package/esm2022/src/env/Environment.mjs +487 -0
  95. package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
  96. package/esm2022/src/env/LanguageData.mjs +227 -0
  97. package/{esm2020 → esm2022}/src/env/MirrorString.mjs +65 -65
  98. package/esm2022/src/event/ActionManager.mjs +91 -0
  99. package/esm2022/src/event/Event.mjs +1333 -0
  100. package/esm2022/src/event/EventHandler.mjs +766 -0
  101. package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
  102. package/esm2022/src/event/EventsManager.mjs +2988 -0
  103. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  104. package/esm2022/src/event/RunTimeEvent.mjs +399 -0
  105. package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
  106. package/esm2022/src/event/UserEventsTable.mjs +47 -0
  107. package/esm2022/src/exp/ExpTable.mjs +57 -0
  108. package/esm2022/src/exp/Expression.mjs +200 -0
  109. package/esm2022/src/exp/ExpressionDict.mjs +727 -0
  110. package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
  111. package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
  112. package/{esm2020 → esm2022}/src/exp/GlobalParamsTable.mjs +85 -85
  113. package/esm2022/src/exp/YesNoExp.mjs +36 -0
  114. package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
  115. package/esm2022/src/gui/FormsTable.mjs +66 -0
  116. package/esm2022/src/gui/MgControl.mjs +363 -0
  117. package/esm2022/src/gui/MgForm.mjs +1224 -0
  118. package/esm2022/src/http/HttpManager.mjs +97 -0
  119. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  120. package/{esm2020 → esm2022}/src/http/client/HttpClientBase.mjs +132 -132
  121. package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
  122. package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
  123. package/esm2022/src/http/client/HttpUtility.mjs +84 -0
  124. package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
  125. package/{esm2020 → esm2022}/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -18
  126. package/{esm2020 → esm2022}/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -18
  127. package/{esm2020 → esm2022}/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -18
  128. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
  129. package/{esm2020 → esm2022}/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -25
  130. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandBase.mjs +24 -24
  131. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandFactory.mjs +60 -60
  132. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
  133. package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
  134. package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
  135. package/{esm2020 → esm2022}/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +16 -16
  136. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  137. package/{esm2020 → esm2022}/src/remote/ResetUserSortRemoteDataviewCommand.mjs +15 -15
  138. package/esm2022/src/remote/ServerError.mjs +40 -0
  139. package/{esm2020 → esm2022}/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +19 -19
  140. package/esm2022/src/rt/Argument.mjs +265 -0
  141. package/esm2022/src/rt/ArgumentsList.mjs +103 -0
  142. package/esm2022/src/rt/Boundary.mjs +152 -0
  143. package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
  144. package/esm2022/src/rt/DataviewHeaderBase.mjs +98 -0
  145. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  146. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  147. package/{esm2020 → esm2022}/src/rt/DataviewHeadersSaxHandler.mjs +38 -38
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStack.mjs +94 -94
  149. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  150. package/{esm2020 → esm2022}/src/rt/HandlersTable.mjs +96 -96
  151. package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
  152. package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
  153. package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
  154. package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
  155. package/esm2022/src/rt/Operation.mjs +735 -0
  156. package/esm2022/src/rt/OperationTable.mjs +67 -0
  157. package/esm2022/src/rt/Recompute.mjs +355 -0
  158. package/{esm2020 → esm2022}/src/rt/RecomputeTable.mjs +62 -62
  159. package/{esm2020 → esm2022}/src/rt/RemoteDataviewHeader.mjs +108 -108
  160. package/esm2022/src/rt/ResultValue.mjs +10 -0
  161. package/esm2022/src/rt/TableCache.mjs +177 -0
  162. package/esm2022/src/rt/TableCacheManager.mjs +67 -0
  163. package/esm2022/src/rt/Transaction.mjs +53 -0
  164. package/esm2022/src/security/UserDetails.mjs +71 -0
  165. package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
  166. package/esm2022/src/tasks/MGData.mjs +552 -0
  167. package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
  168. package/esm2022/src/tasks/RCTimer.mjs +63 -0
  169. package/{esm2020 → esm2022}/src/tasks/RemoteTaskService.mjs +44 -44
  170. package/esm2022/src/tasks/Task.mjs +2499 -0
  171. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  172. package/{esm2020 → esm2022}/src/tasks/TaskServiceBase.mjs +24 -24
  173. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  174. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  175. package/{esm2020 → esm2022}/src/tasks/sort/SortCollection.mjs +67 -67
  176. package/{esm2020 → esm2022}/src/util/ConstUtils.mjs +13 -13
  177. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  178. package/{esm2020 → esm2022}/src/util/HeapSort.mjs +69 -69
  179. package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
  180. package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
  181. package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
  182. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
  183. package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
  184. package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
  185. package/esm2022/src/util/PrmMap.mjs +152 -0
  186. package/esm2022/src/util/ReturnResult.mjs +46 -0
  187. package/esm2022/src/util/ReturnResultBase.mjs +18 -0
  188. package/esm2022/src/util/Scrambler.mjs +89 -0
  189. package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
  190. package/{esm2020 → esm2022}/src/util/cookie.service.mjs +92 -92
  191. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29888 -29690
  192. package/fesm2022/magic-xpa-engine.mjs.map +1 -0
  193. package/index.d.ts +187 -187
  194. package/package.json +8 -14
  195. package/src/AccessHelper.d.ts +20 -20
  196. package/src/ClientManager.d.ts +35 -32
  197. package/src/CommandsProcessorBase.d.ts +23 -23
  198. package/src/CommandsProcessorManager.d.ts +6 -6
  199. package/src/CommandsTable.d.ts +22 -22
  200. package/src/ConstInterface.d.ts +516 -515
  201. package/src/CurrentClientVersion.d.ts +1 -1
  202. package/src/FlowMonitorInterface.d.ts +15 -15
  203. package/src/GUIManager.d.ts +17 -17
  204. package/src/GlobalCommandsManager.d.ts +17 -17
  205. package/src/GuiEventsProcessor.d.ts +24 -24
  206. package/src/ICommandsTable.d.ts +9 -9
  207. package/src/ServerConfig.d.ts +35 -34
  208. package/src/bridge/IGuiEvent.d.ts +19 -19
  209. package/src/bridge/MagicBridge.d.ts +16 -16
  210. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
  211. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
  212. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
  213. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
  214. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +9 -8
  215. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
  216. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
  217. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +11 -10
  218. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
  219. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
  220. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +9 -8
  221. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
  222. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -7
  223. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
  224. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
  225. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
  226. package/src/commands/ClientToServer/EvaluateCommand.d.ts +16 -15
  227. package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
  228. package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
  229. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -8
  230. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
  231. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
  232. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +9 -8
  233. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
  234. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
  235. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  236. package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
  237. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
  238. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
  239. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
  240. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
  241. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  242. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
  243. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
  244. package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
  245. package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -7
  246. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
  247. package/src/commands/DataViewCommandBase.d.ts +6 -6
  248. package/src/commands/IClientCommand.d.ts +2 -2
  249. package/src/commands/IClientTargetedCommand.d.ts +12 -12
  250. package/src/commands/IClientToServerCommandInfo.d.ts +4 -3
  251. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
  252. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
  253. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
  254. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
  255. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
  256. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
  257. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
  258. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
  259. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
  260. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
  261. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
  262. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
  263. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
  264. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
  265. package/src/communications/IConnectionStateManager.d.ts +4 -4
  266. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
  267. package/src/data/DataSourceIdKey.d.ts +2 -2
  268. package/src/data/DataView.d.ts +162 -162
  269. package/src/data/DataViewBase.d.ts +12 -12
  270. package/src/data/DataviewManager.d.ts +14 -14
  271. package/src/data/DataviewManagerBase.d.ts +11 -11
  272. package/src/data/DvCache.d.ts +15 -15
  273. package/src/data/Field.d.ts +103 -103
  274. package/src/data/FieldBase.d.ts +23 -23
  275. package/src/data/FieldsTable.d.ts +27 -27
  276. package/src/data/IRecordsTable.d.ts +7 -7
  277. package/src/data/Key.d.ts +15 -15
  278. package/src/data/Record.d.ts +157 -156
  279. package/src/data/RecordOutOfDataViewException.d.ts +10 -10
  280. package/src/data/RecordsTable.d.ts +38 -38
  281. package/src/data/TaskTransactionManager.d.ts +17 -17
  282. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
  283. package/src/enums.d.ts +21 -21
  284. package/src/env/EnvVariablesTable.d.ts +17 -17
  285. package/src/env/Environment.d.ts +118 -118
  286. package/src/env/ILanguageData.d.ts +3 -3
  287. package/src/env/LanguageData.d.ts +20 -20
  288. package/src/env/MirrorString.d.ts +15 -15
  289. package/src/event/ActionManager.d.ts +14 -14
  290. package/src/event/Event.d.ts +79 -79
  291. package/src/event/EventHandler.d.ts +66 -66
  292. package/src/event/EventHandlerPosition.d.ts +25 -25
  293. package/src/event/EventsManager.d.ts +205 -204
  294. package/src/event/IEventsManager.d.ts +77 -77
  295. package/src/event/RunTimeEvent.d.ts +126 -123
  296. package/src/event/RunTimeEventBase.d.ts +5 -5
  297. package/src/event/UserEventsTable.d.ts +11 -11
  298. package/src/exp/ExpTable.d.ts +11 -11
  299. package/src/exp/Expression.d.ts +37 -37
  300. package/src/exp/ExpressionDict.d.ts +12 -12
  301. package/src/exp/ExpressionEvaluator.d.ts +198 -198
  302. package/src/exp/ExpressionLocalJpn.d.ts +18 -18
  303. package/src/exp/GlobalParamsTable.d.ts +19 -19
  304. package/src/exp/YesNoExp.d.ts +9 -9
  305. package/src/gui/CreatedFormVector.d.ts +10 -10
  306. package/src/gui/FormsTable.d.ts +15 -15
  307. package/src/gui/MgControl.d.ts +60 -60
  308. package/src/gui/MgForm.d.ts +96 -93
  309. package/src/http/HttpManager.d.ts +25 -25
  310. package/src/http/client/HttpClientAsync.d.ts +16 -16
  311. package/src/http/client/HttpClientBase.d.ts +30 -30
  312. package/src/http/client/HttpClientEvents.d.ts +18 -18
  313. package/src/http/client/HttpClientSync.d.ts +17 -17
  314. package/src/http/client/HttpUtility.d.ts +10 -10
  315. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
  316. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
  317. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
  318. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
  319. package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
  320. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
  321. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
  322. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
  323. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
  324. package/src/remote/RemoteDataviewManager.d.ts +9 -9
  325. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
  326. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
  327. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
  328. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
  329. package/src/remote/ServerError.d.ts +16 -16
  330. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
  331. package/src/rt/Argument.d.ts +36 -36
  332. package/src/rt/ArgumentsList.d.ts +24 -24
  333. package/src/rt/Boundary.d.ts +27 -27
  334. package/src/rt/CompMainPrgTable.d.ts +10 -10
  335. package/src/rt/DataviewHeaderBase.d.ts +34 -34
  336. package/src/rt/DataviewHeaderFactory.d.ts +5 -5
  337. package/src/rt/DataviewHeaders.d.ts +12 -12
  338. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
  339. package/src/rt/ExecutionStack.d.ts +22 -22
  340. package/src/rt/ExecutionStackEntry.d.ts +7 -7
  341. package/src/rt/HandlersTable.d.ts +19 -19
  342. package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
  343. package/src/rt/IDataviewHeader.d.ts +10 -10
  344. package/src/rt/IResultValue.d.ts +4 -4
  345. package/src/rt/LastFocusedManager.d.ts +23 -23
  346. package/src/rt/Operation.d.ts +97 -97
  347. package/src/rt/OperationTable.d.ts +15 -15
  348. package/src/rt/Recompute.d.ts +41 -41
  349. package/src/rt/RecomputeTable.d.ts +9 -9
  350. package/src/rt/RemoteDataviewHeader.d.ts +14 -14
  351. package/src/rt/ResultValue.d.ts +7 -7
  352. package/src/rt/TableCache.d.ts +29 -29
  353. package/src/rt/TableCacheManager.d.ts +10 -10
  354. package/src/rt/Transaction.d.ts +23 -23
  355. package/src/security/UserDetails.d.ts +16 -16
  356. package/src/tasks/IMGDataCollection.d.ts +26 -26
  357. package/src/tasks/MGData.d.ts +63 -63
  358. package/src/tasks/MGDataCollection.d.ts +42 -42
  359. package/src/tasks/RCTimer.d.ts +13 -13
  360. package/src/tasks/RemoteTaskService.d.ts +16 -16
  361. package/src/tasks/Task.d.ts +312 -312
  362. package/src/tasks/TaskBase.d.ts +123 -123
  363. package/src/tasks/TaskServiceBase.d.ts +16 -16
  364. package/src/tasks/TasksTable.d.ts +21 -21
  365. package/src/tasks/sort/Sort.d.ts +4 -4
  366. package/src/tasks/sort/SortCollection.d.ts +11 -11
  367. package/src/util/ConstUtils.d.ts +3 -3
  368. package/src/util/FlowMonitorQueue.d.ts +70 -70
  369. package/src/util/HeapSort.d.ts +6 -6
  370. package/src/util/IMirrorXML.d.ts +6 -6
  371. package/src/util/IServerConfig.d.ts +11 -11
  372. package/src/util/MgBlockingQueue.d.ts +5 -5
  373. package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
  374. package/src/util/MgPriorityQueue.d.ts +13 -13
  375. package/src/util/ParamParseResult.d.ts +6 -6
  376. package/src/util/PrmMap.d.ts +28 -28
  377. package/src/util/ReturnResult.d.ts +18 -18
  378. package/src/util/ReturnResultBase.d.ts +11 -11
  379. package/src/util/Scrambler.d.ts +10 -10
  380. package/src/util/UniqueIDUtils.d.ts +4 -4
  381. package/src/util/cookie.service.d.ts +8 -8
  382. package/esm2020/src/AccessHelper.mjs +0 -9
  383. package/esm2020/src/ClientManager.mjs +0 -399
  384. package/esm2020/src/CommandsProcessorBase.mjs +0 -58
  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/bridge/MagicBridge.mjs +0 -41
  393. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
  394. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -23
  395. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
  396. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  397. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  398. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
  399. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  400. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  401. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  402. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  403. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
  404. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  405. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  406. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  407. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  408. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  409. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +0 -15
  410. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
  411. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  412. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  413. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  414. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  415. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  416. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  417. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  418. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  419. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  420. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  421. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  422. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  423. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  424. package/esm2020/src/data/DataView.mjs +0 -1610
  425. package/esm2020/src/data/DataviewManager.mjs +0 -28
  426. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  427. package/esm2020/src/data/DvCache.mjs +0 -67
  428. package/esm2020/src/data/Field.mjs +0 -646
  429. package/esm2020/src/data/FieldBase.mjs +0 -18
  430. package/esm2020/src/data/FieldsTable.mjs +0 -103
  431. package/esm2020/src/data/Record.mjs +0 -846
  432. package/esm2020/src/data/RecordsTable.mjs +0 -267
  433. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  434. package/esm2020/src/env/Environment.mjs +0 -489
  435. package/esm2020/src/env/LanguageData.mjs +0 -226
  436. package/esm2020/src/event/ActionManager.mjs +0 -91
  437. package/esm2020/src/event/Event.mjs +0 -1333
  438. package/esm2020/src/event/EventHandler.mjs +0 -766
  439. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  440. package/esm2020/src/event/EventsManager.mjs +0 -2975
  441. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  442. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  443. package/esm2020/src/exp/ExpTable.mjs +0 -59
  444. package/esm2020/src/exp/Expression.mjs +0 -200
  445. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  446. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4208
  447. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  448. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  449. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  450. package/esm2020/src/gui/FormsTable.mjs +0 -66
  451. package/esm2020/src/gui/MgControl.mjs +0 -353
  452. package/esm2020/src/gui/MgForm.mjs +0 -1181
  453. package/esm2020/src/http/HttpManager.mjs +0 -97
  454. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  455. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  456. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  457. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  458. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  459. package/esm2020/src/remote/ServerError.mjs +0 -40
  460. package/esm2020/src/rt/Argument.mjs +0 -265
  461. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  462. package/esm2020/src/rt/Boundary.mjs +0 -152
  463. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  464. package/esm2020/src/rt/DataviewHeaderBase.mjs +0 -96
  465. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  466. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  467. package/esm2020/src/rt/Operation.mjs +0 -735
  468. package/esm2020/src/rt/OperationTable.mjs +0 -67
  469. package/esm2020/src/rt/Recompute.mjs +0 -355
  470. package/esm2020/src/rt/ResultValue.mjs +0 -12
  471. package/esm2020/src/rt/TableCache.mjs +0 -177
  472. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  473. package/esm2020/src/rt/Transaction.mjs +0 -53
  474. package/esm2020/src/security/UserDetails.mjs +0 -71
  475. package/esm2020/src/tasks/MGData.mjs +0 -552
  476. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  477. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  478. package/esm2020/src/tasks/Task.mjs +0 -2496
  479. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  480. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  481. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  482. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  483. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  484. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  485. package/esm2020/src/util/PrmMap.mjs +0 -151
  486. package/esm2020/src/util/ReturnResult.mjs +0 -46
  487. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  488. package/esm2020/src/util/Scrambler.mjs +0 -89
  489. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  490. package/fesm2015/magic-xpa-engine.mjs +0 -30837
  491. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  492. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,766 @@
1
+ import { ApplicationException, Exception, NString, RefParam, StringBuilder, isNullOrUndefined } from "@magic-xpa/mscorelib";
2
+ import { BrkScope, Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttributeCheck, XMLConstants, XmlParser } from "@magic-xpa/utils";
3
+ import { Event } from "./Event";
4
+ import { FieldBase } from "../data/FieldBase";
5
+ import { OperationTable } from "../rt/OperationTable";
6
+ import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
7
+ import { ServerError } from "../remote/ServerError";
8
+ import { YesNoExp } from "../exp/YesNoExp";
9
+ import { ConstInterface } from "../ConstInterface";
10
+ import { FlowMonitorInterface } from "../FlowMonitorInterface";
11
+ import { LastFocusedManager } from "../rt/LastFocusedManager";
12
+ import { AccessHelper } from "../AccessHelper";
13
+ import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
14
+ import { Environment } from "../env/Environment";
15
+ export class EventHandler {
16
+ _enabledExp = new YesNoExp(true);
17
+ _operationTab = null;
18
+ _propagateExp = new YesNoExp(true);
19
+ _isHandlerOnForm = false;
20
+ _ctrl = null;
21
+ _ctrlName = null;
22
+ _dvLen = 0;
23
+ _dvPos = 0;
24
+ _evt = null;
25
+ _handledByClient = false;
26
+ _handlerFld = null;
27
+ _hasParameters = false;
28
+ _id = 0;
29
+ _level = '\0';
30
+ _scope = null;
31
+ _task = null;
32
+ _taskMgdID = -1;
33
+ constructor() {
34
+ this._operationTab = new OperationTable();
35
+ }
36
+ getCtrlName() {
37
+ return this._ctrlName;
38
+ }
39
+ fillData(taskRef, parser) {
40
+ if (this._task === null) {
41
+ this._task = taskRef;
42
+ this._taskMgdID = this._task.getMgdID();
43
+ }
44
+ while (this.initInnerObjects(parser, parser.getNextTag())) {
45
+ }
46
+ let dataView = this._task.DataView;
47
+ this._hasParameters = dataView.ParametersExist(this._dvPos, this._dvLen);
48
+ }
49
+ initInnerObjects(parser, foundTagName) {
50
+ if (foundTagName === null)
51
+ return false;
52
+ if (foundTagName === ConstInterface.MG_TAG_HANDLER)
53
+ this.initInnerElements(parser, this._task);
54
+ else if (foundTagName === ConstInterface.MG_TAG_OPER)
55
+ this._operationTab.fillData(this._task, this, parser);
56
+ else if (foundTagName === ConstInterface.MG_TAG_EVENT && this._evt === null) {
57
+ this._evt = new Event();
58
+ this._evt.fillData(parser, this._task);
59
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER ||
60
+ (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_TIMER))
61
+ this._task.getMGData().addTimerHandler(this);
62
+ if (((this._evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getInternalCode() === InternalInterface.MG_ACT_ZOOM) || (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEvent() !== null && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getUserEvent().getInternalCode() === InternalInterface.MG_ACT_ZOOM)) && !this._task.getEnableZoomHandler()) {
63
+ if (this._handlerFld !== null)
64
+ this._handlerFld.setHasZoomHandler();
65
+ else if (this._ctrl !== null)
66
+ this._ctrl.HasZoomHandler = true;
67
+ else
68
+ this._task.setEnableZoomHandler();
69
+ }
70
+ }
71
+ else if (foundTagName === '/' + ConstInterface.MG_TAG_HANDLER) {
72
+ parser.setCurrIndex2EndOfTag();
73
+ return false;
74
+ }
75
+ else {
76
+ Logger.Instance.WriteExceptionToLogWithMsg("there is no such tag in EventHandler.initInnerObjects() " + foundTagName);
77
+ return false;
78
+ }
79
+ return true;
80
+ }
81
+ initInnerElements(parser, taskRef) {
82
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
83
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
84
+ let tag = parser.getXMLsubstring(endContext);
85
+ parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_HANDLER) + ConstInterface.MG_TAG_HANDLER.length);
86
+ let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
87
+ this.initElements(tokensVector, taskRef);
88
+ parser.setCurrIndex(++endContext);
89
+ return;
90
+ }
91
+ Logger.Instance.WriteExceptionToLogWithMsg("in Handler.FillData() out of string bounds");
92
+ }
93
+ initElements(tokensVector, taskRef) {
94
+ for (let j = 0; j < tokensVector.length; j += 2) {
95
+ let attribute = (tokensVector.get_Item(j));
96
+ let valueStr = (tokensVector.get_Item(j + 1));
97
+ switch (attribute) {
98
+ case ConstInterface.MG_ATTR_HANDLEDBY:
99
+ this._handledByClient = (valueStr.toUpperCase() === "C".toUpperCase());
100
+ break;
101
+ case XMLConstants.MG_ATTR_ID:
102
+ this._id = XmlParser.getInt(valueStr);
103
+ break;
104
+ case ConstInterface.MG_ATTR_LEVEL:
105
+ this._level = valueStr[0];
106
+ break;
107
+ case ConstInterface.MG_ATTR_OBJECT:
108
+ let valueStringCtrlName = XmlParser.unescape(valueStr);
109
+ this._ctrlName = XmlParser.unescape(valueStringCtrlName).toUpperCase();
110
+ this.calculateCtrlFromControlName(taskRef);
111
+ break;
112
+ case ConstInterface.MG_ATTR_VARIABLE:
113
+ this._handlerFld = this._task.DataView.getField(XmlParser.getInt(valueStr));
114
+ this._handlerFld.setHasChangeEvent();
115
+ break;
116
+ case ConstInterface.MG_ATTR_SCOPE:
117
+ this._scope = valueStr[0];
118
+ break;
119
+ case ConstInterface.MG_ATTR_PROPAGATE:
120
+ this._propagateExp.setVal(taskRef, valueStr);
121
+ break;
122
+ case ConstInterface.MG_ATTR_ENABLED:
123
+ this._enabledExp.setVal(taskRef, valueStr);
124
+ break;
125
+ case ConstInterface.MG_ATTR_DVPOS:
126
+ let i = valueStr.indexOf(",");
127
+ if (i > -1) {
128
+ this._dvLen = XmlParser.getInt(valueStr.substr(0, i));
129
+ this._dvPos = XmlParser.getInt(valueStr.substr(i + 1));
130
+ for (let fldIdx = this._dvPos; fldIdx < this._dvPos + this._dvLen; fldIdx++) {
131
+ let field = this._task.DataView.getField(fldIdx);
132
+ field.IsEventHandlerField = true;
133
+ }
134
+ }
135
+ break;
136
+ case ConstInterface.MG_ATTR_HANDLER_ONFORM:
137
+ this._isHandlerOnForm = XmlParser.getBoolean(valueStr);
138
+ break;
139
+ default:
140
+ Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in EventHandler class. Insert case to EventHandler.initElements for " + attribute);
141
+ break;
142
+ }
143
+ }
144
+ }
145
+ calculateCtrlFromControlName(taskRef) {
146
+ if (!NString.IsNullOrEmpty(this._ctrlName)) {
147
+ this._ctrl = ((taskRef.getForm() !== null) ? taskRef.getForm().getCtrlByCtrlName(this._ctrlName) : null);
148
+ }
149
+ }
150
+ isSpecificHandlerOf(rtEvt) {
151
+ if (this._ctrl === null && this._ctrlName === null && this._handlerFld === null && !this._isHandlerOnForm)
152
+ return false;
153
+ if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask())
154
+ return false;
155
+ if (this._evt.equals(rtEvt)) {
156
+ if (this._handlerFld !== null) {
157
+ return (this._handlerFld === rtEvt.getFld());
158
+ }
159
+ if (rtEvt.Control !== null && !this._isHandlerOnForm) {
160
+ let eventCtrlName = rtEvt.Control.getControlNameForHandlerSearch();
161
+ if (eventCtrlName !== null && this._ctrlName.toLowerCase() === eventCtrlName.toLowerCase())
162
+ return true;
163
+ }
164
+ else if (rtEvt.Control === null && this._isHandlerOnForm)
165
+ return true;
166
+ }
167
+ return false;
168
+ }
169
+ isNonSpecificHandlerOf(rtEvt) {
170
+ if (this._ctrl !== null || this._ctrlName !== null || this._handlerFld !== null || this._isHandlerOnForm)
171
+ return false;
172
+ if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask() && rtEvt.getType() !== ConstInterface.EVENT_TYPE_TIMER)
173
+ return false;
174
+ if (this._scope === BrkScope.Global && this._task !== rtEvt.getTask())
175
+ return false;
176
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_NOTINITED) {
177
+ try {
178
+ this._evt.findUserEvent();
179
+ }
180
+ catch (applicationException) {
181
+ if (applicationException instanceof ApplicationException) {
182
+ }
183
+ else
184
+ throw applicationException;
185
+ }
186
+ }
187
+ return this._evt.equals(rtEvt);
188
+ }
189
+ isGlobalHandlerOf(rtEvt) {
190
+ if (this._scope !== BrkScope.Global)
191
+ return false;
192
+ if (this._ctrl != null || this._ctrlName != null || this._handlerFld != null || this._isHandlerOnForm)
193
+ return false;
194
+ return this._evt.equals(rtEvt);
195
+ }
196
+ isGlobalSpecificHandlerOf(rtEvt) {
197
+ if (this._scope !== BrkScope.Global)
198
+ return false;
199
+ if (this._ctrl == null && this._ctrlName == null && this._handlerFld == null)
200
+ return false;
201
+ return (this._ctrlName != null && this._evt.equals(rtEvt) &&
202
+ NString.Equals(this._ctrlName, rtEvt.Control.Name, true));
203
+ }
204
+ async execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue) {
205
+ let ctrl = null;
206
+ let retVal;
207
+ let depth = 0;
208
+ let taskEnd = false;
209
+ let brkLevel = this._task.getBrkLevel();
210
+ let brkLevelIndex = this._task.getBrkLevelIndex();
211
+ let initialLoopStackSize = 0;
212
+ if (taskEnd !== null && this._evt.getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER || (this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_TIMER))) {
213
+ if (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER_FUNC)
214
+ this._task.setBrkLevel(rtEvt.getBrkLevel(), this._id);
215
+ }
216
+ else
217
+ this._task.setBrkLevel(this._evt.getBrkLevel(), this._id);
218
+ let args = rtEvt.getArgList();
219
+ try {
220
+ let flowMonitor = FlowMonitorQueue.Instance;
221
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_WEBCLIENT_ROUTE) {
222
+ if (!this._task.IsRoute() && this._task !== AccessHelper.mgDataTable.StartupMgData.getFirstTask()) {
223
+ return new RetVals(true, true);
224
+ }
225
+ }
226
+ let nextOperIdx = -1;
227
+ if (returnedFromServer) {
228
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(this._operationTab.getOperation(0), false);
229
+ }
230
+ if (nextOperIdx === -1 && !enabledCndCheckedAndTrue && !await this.isEnabled())
231
+ return new RetVals(true, false);
232
+ if (this._scope === BrkScope.Task && (rtEvt.getType() === ConstInterface.EVENT_TYPE_TIMER || rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
233
+ let currTask = LastFocusedManager.Instance.getLastFocusedTask();
234
+ if (this._task !== currTask)
235
+ return new RetVals(true, true);
236
+ }
237
+ if (!this._handledByClient) {
238
+ return new RetVals(false, true);
239
+ }
240
+ if (rtEvt.getType() !== ConstInterface.EVENT_TYPE_USER && !await this._evt.dataEventIsTrue())
241
+ return new RetVals(false, true);
242
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_TASK_SUFFIX)
243
+ taskEnd = true;
244
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
245
+ switch (rtEvt.getInternalCode()) {
246
+ case InternalInterface.MG_ACT_REC_PREFIX:
247
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
248
+ break;
249
+ case InternalInterface.MG_ACT_REC_SUFFIX:
250
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
251
+ break;
252
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
253
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
254
+ break;
255
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
256
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
257
+ break;
258
+ case InternalInterface.MG_ACT_VARIABLE:
259
+ flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
260
+ break;
261
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
262
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
263
+ break;
264
+ case InternalInterface.MG_ACT_TASK_PREFIX:
265
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
266
+ break;
267
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
268
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
269
+ break;
270
+ default:
271
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
272
+ break;
273
+ }
274
+ }
275
+ else
276
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
277
+ try {
278
+ if (taskEnd !== null)
279
+ ctrl = rtEvt.Control;
280
+ let mgdID = AccessHelper.mgDataTable.currMgdID;
281
+ let isChangedCurrWnd = false;
282
+ let isChangedCurrWndRef = new RefParam(isChangedCurrWnd);
283
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER && mgdID !== rtEvt.getMgdID()) {
284
+ AccessHelper.mgDataTable.currMgdID = rtEvt.getMgdID();
285
+ isChangedCurrWndRef.value = true;
286
+ }
287
+ await this.resetLocalVariables(args);
288
+ initialLoopStackSize = this._task.getLoopStackSize();
289
+ let retVals = null;
290
+ if (this._operationTab.getSize() > 0)
291
+ retVals = await this.executeOperations(0, this._operationTab.getSize() - 1, taskEnd, mgdID, depth, isChangedCurrWndRef, false, false, -1);
292
+ isChangedCurrWnd = isChangedCurrWndRef.value;
293
+ if (retVals !== null)
294
+ return retVals;
295
+ if (!taskEnd)
296
+ await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE);
297
+ if (isChangedCurrWnd) {
298
+ let oldMgd = AccessHelper.mgDataTable.getMGData(mgdID);
299
+ if (oldMgd !== null && !oldMgd.IsAborting)
300
+ AccessHelper.mgDataTable.currMgdID = mgdID;
301
+ }
302
+ }
303
+ catch (ex) {
304
+ if (ex instanceof ServerError) {
305
+ if (Logger.Instance.LogLevel !== Logger_LogLevels.Basic)
306
+ Logger.Instance.WriteExceptionToLog(ex);
307
+ throw ex;
308
+ }
309
+ else if (ex instanceof Exception) {
310
+ Logger.Instance.WriteExceptionToLog(ex);
311
+ return new RetVals(false, true);
312
+ }
313
+ else
314
+ throw ex;
315
+ }
316
+ finally {
317
+ retVal = await this._propagateExp.getVal();
318
+ let currLoopStackSize = this._task.getLoopStackSize();
319
+ for (; currLoopStackSize > initialLoopStackSize; currLoopStackSize = currLoopStackSize--)
320
+ this._task.popLoopCounter();
321
+ }
322
+ if (args !== null)
323
+ await this.getArgValsFromFlds(args);
324
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
325
+ switch (rtEvt.getInternalCode()) {
326
+ case InternalInterface.MG_ACT_REC_PREFIX:
327
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
328
+ break;
329
+ case InternalInterface.MG_ACT_REC_SUFFIX:
330
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
331
+ break;
332
+ case InternalInterface.MG_ACT_TASK_PREFIX:
333
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
334
+ break;
335
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
336
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
337
+ break;
338
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
339
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
340
+ break;
341
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
342
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
343
+ break;
344
+ case InternalInterface.MG_ACT_VARIABLE:
345
+ flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
346
+ break;
347
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
348
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
349
+ break;
350
+ default:
351
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
352
+ break;
353
+ }
354
+ }
355
+ else
356
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), 1, this._task.GetTaskDetails());
357
+ }
358
+ finally {
359
+ this._task.setBrkLevel(brkLevel, brkLevelIndex);
360
+ }
361
+ return new RetVals(retVal, true);
362
+ }
363
+ async executeOperations(fromIdx, toIdx, taskEnd, mgdID, depth, isChangedCurrWndRef, inBlockIf, inReturnedFromServer, inNextOperIdx) {
364
+ let oper;
365
+ let operType;
366
+ let nextOperIdx = -1;
367
+ let returnedFromServer = false;
368
+ let mgd = this._task.getMGData();
369
+ let execFlowIdx = fromIdx;
370
+ let retvals;
371
+ let blockIfReturnedFromServer = false;
372
+ let executeBlock;
373
+ let blockLoopExeconServer;
374
+ let flowMonitor = FlowMonitorQueue.Instance;
375
+ let routeOperationExecuted = false;
376
+ if (!inReturnedFromServer) {
377
+ oper = this._operationTab.getOperation(execFlowIdx);
378
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
379
+ if (nextOperIdx > -1) {
380
+ returnedFromServer = true;
381
+ if (inBlockIf)
382
+ blockIfReturnedFromServer = true;
383
+ }
384
+ else
385
+ returnedFromServer = false;
386
+ }
387
+ else {
388
+ returnedFromServer = inReturnedFromServer;
389
+ nextOperIdx = inNextOperIdx;
390
+ }
391
+ for (; execFlowIdx <= toIdx &&
392
+ (!AccessHelper.eventsManager.GetStopExecutionFlag()) &&
393
+ !mgd.IsAborting && !routeOperationExecuted; execFlowIdx += 1) {
394
+ if (inBlockIf && blockIfReturnedFromServer && this._operationTab.getOperation(toIdx).getServerId() < nextOperIdx)
395
+ break;
396
+ oper = this._operationTab.getOperation(execFlowIdx);
397
+ operType = oper.getType();
398
+ blockIfReturnedFromServer = false;
399
+ if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
400
+ this._task.setUseLoopStack(depth > 0);
401
+ await oper.operServer(null);
402
+ break;
403
+ }
404
+ if (returnedFromServer && oper.getServerId() < nextOperIdx)
405
+ if (operType !== ConstInterface.MG_OPER_BLOCK)
406
+ continue;
407
+ else if (this._operationTab.getOperation(oper.getBlockEnd()).getServerId() < nextOperIdx)
408
+ continue;
409
+ if (!taskEnd) {
410
+ let mainLevel = this._task.getMainLevel().toLowerCase();
411
+ if (await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE) && Environment.Instance.getSpecialImmediateHandlerEnd() &&
412
+ mainLevel != "RP".toLowerCase() && mainLevel != "TP".toLowerCase() && mainLevel != "RS".toLowerCase() && mainLevel != "TS".toLowerCase())
413
+ break;
414
+ }
415
+ if (this._taskMgdID !== mgdID)
416
+ isChangedCurrWndRef.value = true;
417
+ if (!this._task.isMainProg() && this._task.isOpenWin())
418
+ AccessHelper.mgDataTable.currMgdID = this._taskMgdID;
419
+ await AccessHelper.eventsManager.CheckAndShowSpinner(true);
420
+ switch (operType) {
421
+ case ConstInterface.MG_OPER_VERIFY:
422
+ if (await oper.execute(returnedFromServer)) {
423
+ if (!(this._task.getBrkLevel() === "TS")) {
424
+ AccessHelper.eventsManager.setStopExecution(true);
425
+ }
426
+ if (this._task.getInRecordSuffix() && this._task.getLevel() === Constants.TASK_LEVEL_TASK)
427
+ this._task.setLevel(Constants.TASK_LEVEL_RECORD);
428
+ return new RetVals(false, true);
429
+ }
430
+ break;
431
+ case ConstInterface.MG_OPER_LOOP:
432
+ this._task.enterLoop();
433
+ this._task.increaseLoopCounter();
434
+ this._task.setUseLoopStack(true);
435
+ await flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
436
+ blockLoopExeconServer = false;
437
+ if (!oper.getExecOnServer()) {
438
+ while (await oper.execute(false)) {
439
+ retvals = await this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, false, false, -1);
440
+ if (retvals !== null)
441
+ return retvals;
442
+ if ((mgd.IsAborting || AccessHelper.eventsManager.GetStopExecutionFlag()))
443
+ break;
444
+ this._task.increaseLoopCounter();
445
+ this._task.setUseLoopStack(true);
446
+ }
447
+ }
448
+ else {
449
+ if (await oper.execute(false))
450
+ blockLoopExeconServer = true;
451
+ }
452
+ if (!blockLoopExeconServer)
453
+ execFlowIdx = oper.getBlockEnd() - 1;
454
+ this._task.leaveLoop();
455
+ break;
456
+ case ConstInterface.MG_OPER_BLOCK:
457
+ if (!oper.getExecOnServer() || (returnedFromServer && oper.getServerId() < nextOperIdx)) {
458
+ this._task.setUseLoopStack(true);
459
+ if (!returnedFromServer || oper.getServerId() >= nextOperIdx)
460
+ execFlowIdx = await this.getSignificantBlock(execFlowIdx, oper.getBlockEnd());
461
+ else
462
+ execFlowIdx = this.getStartBlockIfIdxByOper(execFlowIdx, nextOperIdx);
463
+ }
464
+ else {
465
+ this._task.setUseLoopStack(depth > 0);
466
+ await oper.operServer(null);
467
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
468
+ if (nextOperIdx > -1) {
469
+ returnedFromServer = true;
470
+ if (inBlockIf)
471
+ blockIfReturnedFromServer = true;
472
+ if (nextOperIdx < this._operationTab.getOperation(oper.getBlockEnd()).getServerId()) {
473
+ while (this._operationTab.getOperation(oper.getBlockClose()).getServerId() < nextOperIdx) {
474
+ execFlowIdx = oper.getBlockClose();
475
+ oper = this._operationTab.getOperation(execFlowIdx);
476
+ }
477
+ }
478
+ }
479
+ else {
480
+ returnedFromServer = false;
481
+ execFlowIdx = -1;
482
+ }
483
+ }
484
+ if (execFlowIdx !== -1) {
485
+ executeBlock = true;
486
+ oper = this._operationTab.getOperation(execFlowIdx);
487
+ if (returnedFromServer) {
488
+ if (this._operationTab.getOperation(oper.getBlockClose()).getServerId() <= nextOperIdx) {
489
+ executeBlock = false;
490
+ blockIfReturnedFromServer = true;
491
+ }
492
+ }
493
+ if (executeBlock) {
494
+ retvals = await this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, true, returnedFromServer, nextOperIdx);
495
+ if (retvals !== null)
496
+ if (!retvals.ReturnedFromServer)
497
+ return retvals;
498
+ else {
499
+ returnedFromServer = retvals.ReturnedFromServer;
500
+ nextOperIdx = retvals.NextOperIdx;
501
+ blockIfReturnedFromServer = retvals.BlockIfReturnedFromServer;
502
+ execFlowIdx = oper.getBlockEnd() - 1;
503
+ continue;
504
+ }
505
+ }
506
+ }
507
+ execFlowIdx = oper.getBlockEnd() - 1;
508
+ break;
509
+ case ConstInterface.MG_OPER_ENDBLOCK:
510
+ await flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
511
+ break;
512
+ case ConstInterface.MG_OPER_CALL:
513
+ this._task.setUseLoopStack(depth > 0);
514
+ routeOperationExecuted = await oper.execute(returnedFromServer);
515
+ break;
516
+ default:
517
+ this._task.setUseLoopStack(depth > 0);
518
+ await oper.execute(returnedFromServer);
519
+ break;
520
+ }
521
+ if (!blockIfReturnedFromServer) {
522
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
523
+ if (nextOperIdx > -1) {
524
+ returnedFromServer = true;
525
+ if (inBlockIf)
526
+ blockIfReturnedFromServer = true;
527
+ }
528
+ else
529
+ returnedFromServer = false;
530
+ }
531
+ }
532
+ if (routeOperationExecuted)
533
+ retvals = new RetVals(false, true);
534
+ else if (blockIfReturnedFromServer)
535
+ retvals = new RetVals(nextOperIdx, returnedFromServer, blockIfReturnedFromServer);
536
+ else
537
+ retvals = null;
538
+ return retvals;
539
+ }
540
+ async getSignificantBlock(startBlockIdx, endIdx) {
541
+ let retIdx = -1;
542
+ while (startBlockIdx < endIdx) {
543
+ let oper = this._operationTab.getOperation(startBlockIdx);
544
+ let operType = oper.getType();
545
+ if (operType !== ConstInterface.MG_OPER_BLOCK && operType !== ConstInterface.MG_OPER_ELSE && operType !== ConstInterface.MG_OPER_SERVER)
546
+ break;
547
+ if (await oper.execute(false)) {
548
+ retIdx = startBlockIdx;
549
+ break;
550
+ }
551
+ else
552
+ startBlockIdx = oper.getBlockClose();
553
+ }
554
+ return retIdx;
555
+ }
556
+ getStartBlockIdxByEnd(endIdx) {
557
+ let retIdx = -1;
558
+ let found = false;
559
+ let j;
560
+ for (j = endIdx - 1; j >= 0 && !found; j--) {
561
+ let oper = this._operationTab.getOperation(j);
562
+ let operType = oper.getType();
563
+ if (operType === ConstInterface.MG_OPER_BLOCK || operType === ConstInterface.MG_OPER_LOOP) {
564
+ if (oper.getBlockEnd() === endIdx) {
565
+ retIdx = j;
566
+ found = true;
567
+ }
568
+ }
569
+ }
570
+ return retIdx;
571
+ }
572
+ getStartBlockIdxByElse(elseIdx) {
573
+ let retIdx = -1;
574
+ let found = false;
575
+ let elseBlockEnd = this._operationTab.getOperation(elseIdx).getBlockEnd();
576
+ let j;
577
+ for (j = elseIdx - 1; j >= 0 && !found; j--) {
578
+ let oper = this._operationTab.getOperation(j);
579
+ let operType = oper.getType();
580
+ if (operType === ConstInterface.MG_OPER_BLOCK) {
581
+ if (oper.getBlockEnd() === elseBlockEnd) {
582
+ retIdx = j;
583
+ found = true;
584
+ }
585
+ }
586
+ }
587
+ return retIdx;
588
+ }
589
+ getStartBlockIfIdxByOper(blockOperIdx, srvrOperIdx) {
590
+ let retIdx = -1;
591
+ let found = false;
592
+ let j = this._operationTab.serverId2operIdx(srvrOperIdx, blockOperIdx) - 1;
593
+ if (j === -2) {
594
+ j = this._operationTab.serverId2FollowingOperIdx(srvrOperIdx, blockOperIdx) - 1;
595
+ }
596
+ while (j >= 0 && !found) {
597
+ let oper = this._operationTab.getOperation(j);
598
+ let operType = oper.getType();
599
+ if (operType === ConstInterface.MG_OPER_BLOCK) {
600
+ if (j === blockOperIdx) {
601
+ retIdx = j;
602
+ found = true;
603
+ }
604
+ else
605
+ j--;
606
+ }
607
+ else if (operType === ConstInterface.MG_OPER_ELSE) {
608
+ let blockStrt = this.getStartBlockIdxByElse(j);
609
+ if (blockStrt === blockOperIdx) {
610
+ retIdx = j;
611
+ found = true;
612
+ }
613
+ else
614
+ j = blockStrt - 1;
615
+ }
616
+ else if (operType === ConstInterface.MG_OPER_ENDBLOCK)
617
+ j = this.getStartBlockIdxByEnd(j) - 1;
618
+ else
619
+ j--;
620
+ }
621
+ return retIdx;
622
+ }
623
+ getLevel() {
624
+ return this._level;
625
+ }
626
+ getEvent() {
627
+ return this._evt;
628
+ }
629
+ getId() {
630
+ return this._id;
631
+ }
632
+ async isEnabled() {
633
+ return await this._enabledExp.getVal();
634
+ }
635
+ async resetLocalVariables(args) {
636
+ let dv = this._task.DataView;
637
+ let argIdx = 0;
638
+ try {
639
+ for (let fieldIdx = this._dvPos; fieldIdx < this._dvPos + this._dvLen; fieldIdx++) {
640
+ let aField = dv.getField(fieldIdx);
641
+ let varIsParm = !this._hasParameters || aField.isParam();
642
+ if ((args !== null && argIdx < args.getSize()) && varIsParm) {
643
+ if (!args.getArg(argIdx).skipArg()) {
644
+ await args.getArg(argIdx).setValueToField(aField);
645
+ }
646
+ else {
647
+ aField.invalidate(true, FieldBase.CLEAR_FLAGS);
648
+ await aField.compute(false);
649
+ }
650
+ argIdx++;
651
+ }
652
+ else {
653
+ aField.invalidate(true, FieldBase.CLEAR_FLAGS);
654
+ await aField.compute(false);
655
+ }
656
+ await aField.updateDisplay();
657
+ }
658
+ }
659
+ catch (exception) {
660
+ throw exception;
661
+ }
662
+ }
663
+ async getArgValsFromFlds(args) {
664
+ let dv = this._task.DataView;
665
+ let k = 0;
666
+ let j;
667
+ for (j = this._dvPos; j < this._dvPos + this._dvLen && k < args.getSize(); j++) {
668
+ let aField = dv.getField(j);
669
+ if (!this._hasParameters || aField.isParam()) {
670
+ let arg = args.getArg(k);
671
+ if (arg.getType() === ConstInterface.ARG_TYPE_FIELD) {
672
+ let argFld = arg.getField();
673
+ if (argFld.getTask() !== null && !argFld.getTask().isAborting()) {
674
+ let val = aField.getValue(false);
675
+ await argFld.setValueAndStartRecompute(val, aField.isNull(), true, aField.isModified(), false);
676
+ await argFld.updateDisplay();
677
+ }
678
+ }
679
+ k++;
680
+ }
681
+ }
682
+ }
683
+ getTask() {
684
+ return this._task;
685
+ }
686
+ argsMatch(Exp_params) {
687
+ let argsMatched = true;
688
+ let dv = this._task.DataView;
689
+ let j = 0;
690
+ let paramCount = 0;
691
+ for (let i = this._dvPos; i < this._dvPos + this._dvLen; i++) {
692
+ let field = dv.getField(i);
693
+ if (field.isParam()) {
694
+ paramCount++;
695
+ if (j < Exp_params.length) {
696
+ let fieldAttr = field.getType();
697
+ let argAttr = Exp_params[j].Attr;
698
+ if (!Exp_params[j].IsNull && !StorageAttributeCheck.isTheSameType(fieldAttr, argAttr) && !StorageAttributeCheck.StorageFldAlphaUnicodeOrBlob(fieldAttr, argAttr)) {
699
+ argsMatched = false;
700
+ break;
701
+ }
702
+ j++;
703
+ }
704
+ }
705
+ }
706
+ if (paramCount !== Exp_params.length) {
707
+ argsMatched = false;
708
+ }
709
+ return argsMatched;
710
+ }
711
+ getOperationTab() {
712
+ return this._operationTab;
713
+ }
714
+ getControlNameForControlHeader() {
715
+ if (this.getEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL) {
716
+ if (this.getEvent().isControlHeader() && !isNullOrUndefined(this._ctrl))
717
+ return this.getCtrlName();
718
+ }
719
+ return NString.Empty;
720
+ }
721
+ getVarNameForVariableHeader() {
722
+ if (this.getEvent().isVariableHeader() && !isNullOrUndefined(this._handlerFld))
723
+ return this._handlerFld.getVarName().toUpperCase();
724
+ return NString.Empty;
725
+ }
726
+ getEventHandlerInfo() {
727
+ let eventDescription = new StringBuilder();
728
+ this.getEvent().AppendDescription(eventDescription);
729
+ let headerAdditionalInfo = this.getControlNameForControlHeader() + this.getVarNameForVariableHeader();
730
+ eventDescription.Append(headerAdditionalInfo);
731
+ if (!NString.IsNullOrEmpty(eventDescription.toString()))
732
+ eventDescription = new StringBuilder(' ' + eventDescription.toString(), eventDescription.toString().length + 1);
733
+ return NString.Format("Handler {0}{1}", this.getEvent().getEventType(), eventDescription);
734
+ }
735
+ toString() {
736
+ return NString.Format("(Handler for {0} on task {1}, scope {2})", this._evt, this._task, this._scope);
737
+ }
738
+ }
739
+ export class RetVals {
740
+ BlockIfReturnedFromServer = false;
741
+ Enabled = false;
742
+ NextOperIdx = 0;
743
+ Propagate = false;
744
+ ReturnedFromServer = false;
745
+ constructor(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer) {
746
+ if (arguments.length === 2)
747
+ this.constructor_0(pOrOperIdx, eOrInReturnedFromServer);
748
+ else
749
+ this.constructor_1(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer);
750
+ }
751
+ constructor_0(p, e) {
752
+ this.Propagate = p;
753
+ this.Enabled = e;
754
+ this.NextOperIdx = 0;
755
+ this.ReturnedFromServer = false;
756
+ this.BlockIfReturnedFromServer = false;
757
+ }
758
+ constructor_1(operIdx, inReturnedFromServer, inBlockIfReturnedFromServer) {
759
+ this.Propagate = false;
760
+ this.Enabled = true;
761
+ this.NextOperIdx = operIdx;
762
+ this.ReturnedFromServer = inReturnedFromServer;
763
+ this.BlockIfReturnedFromServer = inBlockIfReturnedFromServer;
764
+ }
765
+ }
766
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakQsTUFB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UUFDaEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBUU8sYUFBYSxDQUFDLE9BQWUsRUFBRSxvQkFBNkIsRUFBRSwyQkFBb0M7UUFDeEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO1FBQy9DLElBQUksQ0FBQyx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQnJrU2NvcGUsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0V4cFZhbH0gZnJvbSBcIkBtYWdpYy14cGEvZ3VpXCI7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gXCIuL0V2ZW50XCI7XHJcbmltcG9ydCB7RmllbGRCYXNlfSBmcm9tIFwiLi4vZGF0YS9GaWVsZEJhc2VcIjtcclxuaW1wb3J0IHtPcGVyYXRpb25UYWJsZX0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblRhYmxlXCI7XHJcbmltcG9ydCB7QXJndW1lbnR9IGZyb20gXCIuLi9ydC9Bcmd1bWVudFwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tIFwiLi4vZ3VpL01nQ29udHJvbFwiO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gXCIuLi91dGlsL0Zsb3dNb25pdG9yUXVldWVcIjtcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gXCIuLi90YXNrcy9NR0RhdGFcIjtcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSBcIi4uL3JlbW90ZS9TZXJ2ZXJFcnJvclwiO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSBcIi4vUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tIFwiLi4vZ3VpL01nRm9ybVwiO1xyXG5pbXBvcnQge1llc05vRXhwfSBmcm9tIFwiLi4vZXhwL1llc05vRXhwXCI7XHJcbmltcG9ydCB7VGFza30gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4uL2RhdGEvRGF0YVZpZXdcIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JJbnRlcmZhY2V9IGZyb20gXCIuLi9GbG93TW9uaXRvckludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gXCIuLi9lbnYvRW52aXJvbm1lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudEhhbmRsZXIge1xyXG4gIHByaXZhdGUgX2VuYWJsZWRFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKHRydWUpOyAvLyBkZWZhdWx0IGlzIHRydWUgYWx3YXlzXHJcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uVGFiOiBPcGVyYXRpb25UYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcHJvcGFnYXRlRXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cCh0cnVlKTtcclxuICBwcml2YXRlIF9pc0hhbmRsZXJPbkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N0cmxOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2R2TGVuOiBudW1iZXIgPSAwOyAvLyBUaGUg4oCcZHZwb3PCgUVjb250YWlucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBzZWxlY3RlZCBpbiB0aGUgaGFuZGxlclxyXG4gIHByaXZhdGUgX2R2UG9zOiBudW1iZXIgPSAwOyAvLyBhbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmaWVsZCBvZiBpdCBpbiB0aGUgRGF0YXZpZXcuXHJcbiAgcHJpdmF0ZSBfZXZ0OiBFdmVudCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFuZGxlZEJ5Q2xpZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaGFuZGxlckZsZDogRmllbGRCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9oYXNQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbGV2ZWw6IHN0cmluZyA9ICdcXDAnOyAvLyBDb250cm9sIHwgSGFuZGxlciB8IFJlY29yZCB8IFRhc2sgfCBWYXJpYWJsZVxyXG4gIHByaXZhdGUgX3Njb3BlOiBCcmtTY29wZSA9IG51bGw7IC8vIFRhc2t8U3VidGFza3xHbG9iYWxcclxuICBwcml2YXRlIF90YXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF90YXNrTWdkSUQ6IG51bWJlciA9IC0xO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9vcGVyYXRpb25UYWIgPSBuZXcgT3BlcmF0aW9uVGFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldEN0cmxOYW1lKCkgOiBzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5fY3RybE5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIGV2ZW50IGhhbmRsZXIgYW5kIGl0cyBzdWItc3RydWN0dXJlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbERhdGEodGFza1JlZjogVGFzaywgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YXNrID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2sgPSB0YXNrUmVmO1xyXG4gICAgICB0aGlzLl90YXNrTWdkSUQgPSB0aGlzLl90YXNrLmdldE1nZElEKCk7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgICBsZXQgZGF0YVZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICB0aGlzLl9oYXNQYXJhbWV0ZXJzID0gZGF0YVZpZXcuUGFyYW1ldGVyc0V4aXN0KHRoaXMuX2R2UG9zLCB0aGlzLl9kdkxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6aW5nIG9mIGlubmVyIG9iamVjdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhwYXJzZXI6IFhtbFBhcnNlciwgZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpXHJcbiAgICAgIHRoaXMuaW5pdElubmVyRWxlbWVudHMocGFyc2VyLCB0aGlzLl90YXNrKTtcclxuXHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19PUEVSKVxyXG4gICAgICB0aGlzLl9vcGVyYXRpb25UYWIuZmlsbERhdGEodGhpcy5fdGFzaywgdGhpcywgcGFyc2VyKTtcclxuXHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVCAmJiB0aGlzLl9ldnQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZXZ0ID0gbmV3IEV2ZW50KCk7XHJcbiAgICAgIHRoaXMuX2V2dC5maWxsRGF0YShwYXJzZXIsIHRoaXMuX3Rhc2spO1xyXG4gICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiB8fFxyXG4gICAgICAgICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUikpXHJcbiAgICAgICAgdGhpcy5fdGFzay5nZXRNR0RhdGEoKS5hZGRUaW1lckhhbmRsZXIodGhpcyk7XHJcblxyXG4gICAgICAvLyBmb3IgZW5hYmxlIE1HX0FDVF9aT09NIGFjdGlvblxyXG4gICAgICAvLyAxLiBoYW5kbGVyIG9uIHpvb20gYWN0aW9uLlxyXG4gICAgICAvLyAyLiBoYW5kbGVyIG9uIGEgdXNlciBkZWZpbmVkIGhhbmRsZXIgd2l0aCBhIHRyaWdnZXIgb2Ygem9vbSBhY3Rpb24uXHJcbiAgICAgIGlmICgoKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgdGhpcy5fZXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSkgfHwgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSkgJiYgIXRoaXMuX3Rhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQuc2V0SGFzWm9vbUhhbmRsZXIoKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2N0cmwuSGFzWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcInRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIEV2ZW50SGFuZGxlci5pbml0SW5uZXJPYmplY3RzKCkgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbml0aWFsaXppbmcgb2YgaW5uZXIgYXR0cmlidXRlcyBvZiA8aGFuZGxlcj4gdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdElubmVyRWxlbWVudHMocGFyc2VyOiBYbWxQYXJzZXIsIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZiggQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yLCB0YXNrUmVmKTtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIEhhbmRsZXIuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmRcdGVsZW1lbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVEQlk6XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVkQnlDbGllbnQgPSAodmFsdWVTdHIudG9VcHBlckNhc2UoKSA9PT0gXCJDXCIudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuX2lkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xFVkVMOlxyXG4gICAgICAgICAgdGhpcy5fbGV2ZWwgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT0JKRUNUOlxyXG4gICAgICAgICAgbGV0IHZhbHVlU3RyaW5nQ3RybE5hbWU6IHN0cmluZyA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9jdHJsTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cmluZ0N0cmxOYW1lKS50b1VwcGVyQ2FzZSgpOyAvLyByZWxldmFudCBmb3IgdXNlciBoYW5kbGVycyBvbmx5XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUN0cmxGcm9tQ29udHJvbE5hbWUodGFza1JlZik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBUklBQkxFOlxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZCA9IDxGaWVsZEJhc2U+dGhpcy5fdGFzay5EYXRhVmlldy5nZXRGaWVsZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkLnNldEhhc0NoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NDT1BFOlxyXG4gICAgICAgICAgdGhpcy5fc2NvcGUgPSA8QnJrU2NvcGU+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BST1BBR0FURTpcclxuICAgICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTkFCTEVEOlxyXG4gICAgICAgICAgdGhpcy5fZW5hYmxlZEV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPUzpcclxuICAgICAgICAgIGxldCBpOiBudW1iZXIgPSB2YWx1ZVN0ci5pbmRleE9mKFwiLFwiKTtcclxuICAgICAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHZMZW4gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyLnN1YnN0cigwLCBpKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2R2UG9zID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0ci5zdWJzdHIoaSArIDEpKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgZmxkSWR4OiBudW1iZXIgPSB0aGlzLl9kdlBvczsgZmxkSWR4IDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgZmxkSWR4KyspIHtcclxuICAgICAgICAgICAgICBsZXQgZmllbGQ6IEZpZWxkQmFzZSA9ICg8RmllbGRCYXNlPnRoaXMuX3Rhc2suRGF0YVZpZXcuZ2V0RmllbGQoZmxkSWR4KSk7XHJcbiAgICAgICAgICAgICAgZmllbGQuSXNFdmVudEhhbmRsZXJGaWVsZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFORExFUl9PTkZPUk06XHJcbiAgICAgICAgICB0aGlzLl9pc0hhbmRsZXJPbkZvcm0gPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIEV2ZW50SGFuZGxlciBjbGFzcy4gSW5zZXJ0IGNhc2UgdG8gRXZlbnRIYW5kbGVyLmluaXRFbGVtZW50cyBmb3IgXCIgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNhbGN1bGF0ZSB0aGUgY3RybCBwcm9wZXJ0eSBmcm9tIGN0cmwgbmFtZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJpbmdDdHJsTmFtZVwiPjwvcGFyYW0+XHJcblxyXG4gIGNhbGN1bGF0ZUN0cmxGcm9tQ29udHJvbE5hbWUodGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGhpcy5fY3RybE5hbWUpKSB7XHJcbiAgICAgIHRoaXMuX2N0cmwgPSAoKHRhc2tSZWYuZ2V0Rm9ybSgpICE9PSBudWxsKSA/ICg8TWdGb3JtPnRhc2tSZWYuZ2V0Rm9ybSgpKS5nZXRDdHJsQnlDdHJsTmFtZSh0aGlzLl9jdHJsTmFtZSkgOiBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBzcGVjaWZpYyBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoPC9yZXR1cm5zPlxyXG4gIGlzU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9jdHJsID09PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lID09PSBudWxsICYmIHRoaXMuX2hhbmRsZXJGbGQgPT09IG51bGwgJiYgIXRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCBhbmRcclxuICAgIC8vIHRoZSBoYW5kbGVyIGhhbmRsZXMgdGhlIGNvbnRyb2wgYXR0YWNoZWQgdG8gdGhlIGNoZWNrZWQgZXZlbnQsIHJldHVybiB0cnVlXHJcbiAgICAvLyBjb21wYXJlIGNvbnRyb2wgbmFtZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sIGluIHRoZSBldmVudFxyXG4gICAgaWYgKHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpKSB7XHJcbiAgICAgIC8vIFZhcmlhYmxlIGNoYW5nZSBoYW5kbGVycyBkbyBub3QgaGF2ZSBjb250cm9sIG5hbWVzLiBPbmx5IGZpZWxkcyBuZWVkIHRvIGJlIGNvbXBhcmVkXHJcbiAgICAgIGlmICh0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl9oYW5kbGVyRmxkID09PSBydEV2dC5nZXRGbGQoKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJ0RXZ0LkNvbnRyb2wgIT09IG51bGwgJiYgIXRoaXMuX2lzSGFuZGxlck9uRm9ybSkge1xyXG4gICAgICAgIGxldCBldmVudEN0cmxOYW1lOiBzdHJpbmcgPSBydEV2dC5Db250cm9sLmdldENvbnRyb2xOYW1lRm9ySGFuZGxlclNlYXJjaCgpO1xyXG4gICAgICAgIGlmIChldmVudEN0cmxOYW1lICE9PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGV2ZW50Q3RybE5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJ0RXZ0LkNvbnRyb2wgPT09IG51bGwgJiYgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBub24tc3BlY2lmaWMgb3IgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc05vblNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlciBoYW5kbGVzIGEgY29udHJvbCByZXR1cm4gZmFsc2VcclxuICAgIGlmICh0aGlzLl9jdHJsICE9PSBudWxsIHx8IHRoaXMuX2N0cmxOYW1lICE9PSBudWxsIHx8IHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwgfHwgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSAmJiBydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuR2xvYmFsICYmIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsIHJldHVybiB0cnVlXHJcbiAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfTk9USU5JVEVEKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5fZXZ0LmZpbmRVc2VyRXZlbnQoKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoYXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICBpZiAoYXBwbGljYXRpb25FeGNlcHRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBhcHBsaWNhdGlvbkV4Y2VwdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNHbG9iYWxIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlICE9PSBCcmtTY29wZS5HbG9iYWwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlciBoYW5kbGVzIGEgY29udHJvbCByZXR1cm4gZmFsc2VcclxuICAgIGlmICh0aGlzLl9jdHJsICE9IG51bGwgfHwgdGhpcy5fY3RybE5hbWUgIT0gbnVsbCB8fCB0aGlzLl9oYW5kbGVyRmxkICE9IG51bGwgfHwgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0LmVxdWFscyhydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgc3BlY2lmaWMgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc0dsb2JhbFNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSAhPT0gQnJrU2NvcGUuR2xvYmFsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2N0cmwgPT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZSA9PSBudWxsICYmIHRoaXMuX2hhbmRsZXJGbGQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuICh0aGlzLl9jdHJsTmFtZSAhPSBudWxsICYmIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpICYmXHJcbiAgICAgIE5TdHJpbmcuRXF1YWxzKHRoaXMuX2N0cmxOYW1lLCBydEV2dC5Db250cm9sLk5hbWUsIHRydWUpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IG9uIHdoaWNoIHRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgYW5kXHJcbiAgLy8vICAgdGhlcmVmb3JlIG1pZ2h0IG5vdCBuZWVkIHRvIGNoZWNrIHRoZSBlbmFibGVkIGNvbmRpdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlXCI+aW5kaWNhdGVzIHRoYXQgdGhlIGVuYWJsZWQgY29uZGl0aW9uIHdhcyBhbHJlYWR5IGNoZWNrZWQgYW5kIHRoZXJlJ3Mgbm9cclxuICAvLy8gICBuZWVkIHRvIHJlLWNoZWNrIGl0IChiZWNhdXNlIGl0IG1pZ2h0IGJlIGZhbHNlIG5vdywgYnV0IHdlIHN0aWxsIG5lZWQgdG9cclxuICAvLy8gICBleGVjdXRlIHRoZSBoYW5kbGVyKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0aGlzIGlzIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgaGFuZGxlciwgaWYgdHJ1ZSB0aGVuIHRoZSBldmVudHNcclxuICAvLy8gICBtYW5hZ2VyIG11c3QgY29udGludWUgc2VhcmNoaW5nIGZvciB0aGUgbmV4dCBldmVudCBoYW5kbGVyIGZvciB0aGUgZXZlbnRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gYXN5bmMgZXhlY3V0ZShydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZTogYm9vbGVhbik6IFByb21pc2U8UmV0VmFscz4ge1xyXG5cclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHJldFZhbDogYm9vbGVhbjtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gMDtcclxuICAgIGxldCB0YXNrRW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgYnJrTGV2ZWw6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWwoKTtcclxuICAgIGxldCBicmtMZXZlbEluZGV4OiBudW1iZXIgPSB0aGlzLl90YXNrLmdldEJya0xldmVsSW5kZXgoKTtcclxuICAgIGxldCBpbml0aWFsTG9vcFN0YWNrU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzZXQgbGV2ZWwgZm9yIExFVkVMIGZ1bmN0aW9uXHJcbiAgICBpZiAodGFza0VuZCAhPT0gbnVsbCAmJiB0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiB8fCAodGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpKSkge1xyXG4gICAgICAvLyBVbmxpa2UgYSBoYW5kbGVyLCB0aGUgdXNlciBmdW5jdGlvbiBzaG91bGQgbm90IGNoYW5nZSB0aGUgbGV2ZWwgb2YgdGhlIHRhc2suXHJcbiAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVJfRlVOQylcclxuICAgICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKHJ0RXZ0LmdldEJya0xldmVsKCksIHRoaXMuX2lkKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwodGhpcy5fZXZ0LmdldEJya0xldmVsKCksIHRoaXMuX2lkKTtcclxuXHJcbiAgICBsZXQgYXJnczogQXJndW1lbnRzTGlzdCA9IHJ0RXZ0LmdldEFyZ0xpc3QoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG5cclxuICAgICAgLy8gUm91dGUgZXZlbnQgY2FuIG9ubHkgYmUgaGFuZGxlZCBpbiBhIHRhc2sgd2hpY2ggaXMgb3BlbmVkIGFzIHJvdXRlciBsaW5rIG9yIHRoZSByb290IHRhc2suXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNSb3V0ZSgpICYmIHRoaXMuX3Rhc2sgIT09IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkLiBpZiBub3QsIHJldHVybiB0cnVlIHRvIGNvbnRpbnVlIHNlYXJjaGluZ1xyXG4gICAgICAvLyBmb3IgdGhlIG5leHQgZXZlbnQgaGFuZGxlclxyXG4gICAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIC0gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbmV4dCBvcGVyYXRpb24gaXMgb24gdGhlIGN1cnJlbnRcclxuICAgICAgICAvLyBoYW5kbGVyICh1c2luZyBhIGNhbGwgdG8gZ2V0TmV4dE9wZXJJZHgoKSB3aXRoIGZhbHNlIGluIHRoZSBjbGVhcldoZW5Gb3VuZCBwYXJhbWV0ZXIpXHJcbiAgICAgICAgLy8gYW5kIGlmIGl0IGlzIC0gZG8gbm90IGNoZWNrIHRoZSBlbmFibGVkIGNvbmRpdGlvbiwgYmVjYXVzZSBpdCBtaWdodCBoYXZlIGNoYW5nZWRcclxuICAgICAgICAvLyBzaW5jZSBpdCB3YXMgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgdG8gZ28gaW50byB0aGlzIGhhbmRsZXIgZXZlbiBpZiBpdCBpcyBub3RcclxuICAgICAgICAvLyBjdXJyZW50bHkgZW5hYmxlZFxyXG4gICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbigwKSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXh0T3BlcklkeCA9PT0gLTEgJiYgIWVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSAmJiAhYXdhaXQgdGhpcy5pc0VuYWJsZWQoKSlcclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgdGhlIHNjb3BlIGZvciBFeHByZXNzaW9uIGFuZCBUaW1lciBoYW5kbGVyc1xyXG4gICAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiB8fCBydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpIHtcclxuICAgICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2sgIT09IGN1cnJUYXNrKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX2hhbmRsZWRCeUNsaWVudCkge1xyXG4gICAgICAgIC8vIHJldHVybiBmYWxzZSB0byBzdG9wIHNlYXJjaGluZyBmb3IgdGhlIG1vcmUgaGFuZGxlcnMgYmVjYXVzZVxyXG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIgaGFkIHRha2VuIGNhcmUgb2YgYWxsIG9mIHRoZW1cclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgIWF3YWl0IHRoaXMuX2V2dC5kYXRhRXZlbnRJc1RydWUoKSlcclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKVxyXG4gICAgICAgIHRhc2tFbmQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCwgcnRFdnQuQ29udHJvbC5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgsIHJ0RXZ0LkNvbnRyb2wuTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0ZsZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUsIHJ0RXZ0LmdldEZsZCgpLmdldE5hbWUoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04sXHJcbiAgICAgICAgICAgICAgcnRFdnQuQ29udHJvbC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGlmICh0YXNrRW5kICE9PSBudWxsKVxyXG4gICAgICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuXHJcbiAgICAgICAgbGV0IG1nZElEOiBudW1iZXIgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWRDdXJyV25kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZEN1cnJXbmRSZWY6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGlzQ2hhbmdlZEN1cnJXbmQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZm9yIHRpbWVyIGV2ZW50cyBjaGVjayBpZiB0aGUgdGFzayBvZiB0aGUgZXZlbnQgaXMgaW4gdGhlXHJcbiAgICAgICAgLy8gY3VycmVudCB3aW5kb3cgYW5kIGlmIG5vdCB0aGVuIGNoYW5nZSB0aGUgY3VycmVudCB3aW5kb3dcclxuICAgICAgICAvLyB0ZW1wb3JhcmlseSB0aWxsIHRoZSBoYW5kbGVyIGZpbmlzaGVzXHJcbiAgICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgJiYgbWdkSUQgIT09IHJ0RXZ0LmdldE1nZElEKCkpIHtcclxuICAgICAgICAgIC8vIHNldCBudW1iZXIgb2Ygd2luZG93IGZvciB0aW1lciBldmVudFxyXG4gICAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IHJ0RXZ0LmdldE1nZElEKCk7XHJcbiAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHB1dCBpbml0aWFsIHZhbHVlcyB0byB0aGUgbG9jYWwgdmFyaWFibGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldExvY2FsVmFyaWFibGVzKGFyZ3MpO1xyXG5cclxuICAgICAgICBpbml0aWFsTG9vcFN0YWNrU2l6ZSA9IHRoaXMuX3Rhc2suZ2V0TG9vcFN0YWNrU2l6ZSgpO1xyXG4gICAgICAgIGxldCByZXRWYWxzOiBSZXRWYWxzID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldFNpemUoKSA+IDApXHJcbiAgICAgICAgICByZXRWYWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucygwLCB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0U2l6ZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoLCBpc0NoYW5nZWRDdXJyV25kUmVmLCBmYWxzZSwgZmFsc2UsIC0xKTtcclxuXHJcbiAgICAgICAgaXNDaGFuZ2VkQ3VyclduZCA9IGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChyZXRWYWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIHJldFZhbHM7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIHRoZSBlbmR0YXNrIGNvbmRpdGlvbiBvbmNlIGFnYWluIGF0IHRoZSBlbmQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICBpZiAoIXRhc2tFbmQpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl90YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIGN1cnJlbnQgd2luZG93IGJhY2sgaWYgaXQgd2FzIGNoYW5nZWQgZm9yIFRpbWVyXHJcbiAgICAgICAgaWYgKGlzQ2hhbmdlZEN1cnJXbmQpIHtcclxuICAgICAgICAgIGxldCBvbGRNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEobWdkSUQpO1xyXG4gICAgICAgICAgaWYgKG9sZE1nZCAhPT0gbnVsbCAmJiAhb2xkTWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSBtZ2RJRDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIHdoaWxlIG9wZXJhdGlvbiBibG9ja1xyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgaWYgKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYylcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBwcm9wYWdhdGUgdmFsdWVcclxuICAgICAgICByZXRWYWwgPSBhd2FpdCB0aGlzLl9wcm9wYWdhdGVFeHAuZ2V0VmFsKCk7XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBsb29wIGNvdW50ZXJzIHRoYXQgd2VyZSBsZWZ0IHVudXNlZCBpbiB0aGUgc3RhY2sgZHVlIHRvIGxlYXZpbmdcclxuICAgICAgICAvLyB0aGUgaGFuZGxlciBvbiBcInN0b3BFeGVjdXRpb24oKSA9PSB0cnVlXCJcclxuICAgICAgICBsZXQgY3Vyckxvb3BTdGFja1NpemU6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0TG9vcFN0YWNrU2l6ZSgpO1xyXG4gICAgICAgIGZvciAoOyBjdXJyTG9vcFN0YWNrU2l6ZSA+IGluaXRpYWxMb29wU3RhY2tTaXplOyBjdXJyTG9vcFN0YWNrU2l6ZSA9IGN1cnJMb29wU3RhY2tTaXplLS0pXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFmdGVyIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyB1cGRhdGUgdGhlIGFyZ3VtZW50cyBiYWNrIGFuZCByZWNvbXB1dGVcclxuICAgICAgaWYgKGFyZ3MgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRBcmdWYWxzRnJvbUZsZHMoYXJncyk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dGbGQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFLCBydEV2dC5nZXRGbGQoKS5nZXROYW1lKCksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgMSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAvLyByZXN0b3JpbmcgIHRoZSBvcmlnaW5hbCBicmVhayBsZXZlbCBzdGF0ZSBhbmQgY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleFxyXG4gICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKGJya0xldmVsLCBicmtMZXZlbEluZGV4KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmV0VmFscyhyZXRWYWwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgc3RhcnRpbmcgZnJvbSBmcm9tSWR4IGFuZCBlbmRpbmcgYXQgZW5kSWR4LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlT3BlcmF0aW9ucyhmcm9tSWR4OiBudW1iZXIsIHRvSWR4OiBudW1iZXIsIHRhc2tFbmQ6IGJvb2xlYW4sIG1nZElEOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmOiBSZWZQYXJhbTxib29sZWFuPiwgaW5CbG9ja0lmOiBib29sZWFuLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmV4dE9wZXJJZHg6IG51bWJlcik6IFByb21pc2UgPFJldFZhbHM+IHtcclxuICAgIGxldCBvcGVyOiBPcGVyYXRpb247XHJcbiAgICBsZXQgb3BlclR5cGU6IG51bWJlcjtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSB0aGlzLl90YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGV4ZWNGbG93SWR4OiBudW1iZXIgPSBmcm9tSWR4O1xyXG4gICAgbGV0IHJldHZhbHM6IFJldFZhbHM7XHJcbiAgICBsZXQgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGV4ZWN1dGVCbG9jazogYm9vbGVhbjtcclxuICAgIGxldCBibG9ja0xvb3BFeGVjb25TZXJ2ZXI6IGJvb2xlYW47XHJcbiAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG4gICAgbGV0IHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIWluUmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWQgcnVubmluZyB0aGlzIGhhbmRsZXJcclxuICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG4gICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gaW5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgIG5leHRPcGVySWR4ID0gaW5OZXh0T3BlcklkeDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDsgZXhlY0Zsb3dJZHggPD0gdG9JZHggJiZcclxuICAgICAgICAgICAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpICYmXHJcbiAgICAgICAgICAgIW1nZC5Jc0Fib3J0aW5nICYmICFyb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkO1xyXG4gICAgICAgICAgIGV4ZWNGbG93SWR4ICs9IDEpIHtcclxuICAgICAgaWYgKGluQmxvY2tJZiAmJiBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyICYmIHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24odG9JZHgpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuXHJcbiAgICAgIG9wZXJUeXBlID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBJZiBEZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlLCBpdCBtZWFucyB3ZSBhcmUgaGVyZSBUUyBvZiBjbG9zaW5nIHRhc2suXHJcbiAgICAgIC8vIFNvLCBzZXQgZmlyc3Qgb3BlcmF0aW9uIG9mIGhhbmRsZXIgYXMgc2VydmVyLiByZXR1cm4gYmFjay5cclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICBhd2FpdCBvcGVyLm9wZXJTZXJ2ZXIobnVsbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNraXAgdG8gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIGFmdGVyIHJldHVybmluZyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlciAmJiBvcGVyLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICBpZiAob3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tFbmQoKSkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoIXRhc2tFbmQpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgbWFpbkxldmVsOiBzdHJpbmcgID0gdGhpcy5fdGFzay5nZXRNYWluTGV2ZWwoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmKGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpICYmIEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxJbW1lZGlhdGVIYW5kbGVyRW5kKCkgJiZcclxuICAgICAgICAgICBtYWluTGV2ZWwgIT0gXCJSUFwiLnRvTG93ZXJDYXNlKCkgICYmIG1haW5MZXZlbCAhPSBcIlRQXCIudG9Mb3dlckNhc2UoKSAmJiBtYWluTGV2ZWwgIT0gXCJSU1wiLnRvTG93ZXJDYXNlKCkgJiYgbWFpbkxldmVsICE9IFwiVFNcIi50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fdGFza01nZElEICE9PSBtZ2RJRClcclxuICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5pc01haW5Qcm9nKCkgJiYgdGhpcy5fdGFzay5pc09wZW5XaW4oKSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gdGhpcy5fdGFza01nZElEO1xyXG5cclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuQ2hlY2tBbmRTaG93U3Bpbm5lcih0cnVlKTtcclxuXHJcbiAgICAgIHN3aXRjaCAob3BlclR5cGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfVkVSSUZZOlxyXG4gICAgICAgICAgLy8gaWYgdHJ1ZSByZXR1cm5lZCB0aGVuIHRoZSB2ZXJpZnkgY29uZGl0aW9uIHdhcyB0cnVlIGFuZCB0aGUgbW9kZSBpcyBFcnJvclxyXG4gICAgICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWwoKSA9PT0gXCJUU1wiKSkge1xyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRJblJlY29yZFN1ZmZpeCgpICYmIHRoaXMuX3Rhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTk1MTA4IC0gdmVyaWZ5IGVycm9yIGluIFJTIHNob3VsZG4ndCB0cmlnZ2VyIFJQXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIGlmIHdlIGFyZSBpbiB0aGUgcmV2ZXJ0IG1vZGUsIGRvbnQgc3RvcCBpbW1lZGlhdGVseS5cclxuICAgICAgICAgICAgICogZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBvZiB0aGUgaGFuZGxlciBpbiB0aGUgcmV2ZXJzZSBvcmRlciBhbmQgdGhlbiBzdG9wLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUDpcclxuICAgICAgICAgIC8vIG9uIGdldHRpbmcgYSBCbG9ja0xvb3AsIGV4ZWN1dGUgdGhlIGxvb3AgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgaW50ZW5kZWQsXHJcbiAgICAgICAgICAvLyBhbmQgdGhlbiBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5lbnRlckxvb3AoKTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suaW5jcmVhc2VMb29wQ291bnRlcigpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKG9wZXIsIHRydWUsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgICAgICAgYmxvY2tMb29wRXhlY29uU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIW9wZXIuZ2V0RXhlY09uU2VydmVyKCkpIHtcclxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgbG9vcCBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpbnRlbmRlZFxyXG4gICAgICAgICAgICB3aGlsZSAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNhbGwgZXhlY3V0ZU9wZXJhdGlvbnMoKSB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25zIHdpdGhpbiBhIEJsb2NrTG9vcFxyXG4gICAgICAgICAgICAgIHJldHZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKGV4ZWNGbG93SWR4ICsgMSwgb3Blci5nZXRCbG9ja0Nsb3NlKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGggKyAxLFxyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZiwgZmFsc2UsIGZhbHNlLCAtMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFscztcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IGEgcmV2ZXJ0IGluc2lkZSBhIGxvb3AsIGJyZWFrIHRoZSBsb29wXHJcbiAgICAgICAgICAgICAgaWYgKChtZ2QuSXNBYm9ydGluZyB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLmluY3JlYXNlTG9vcENvdW50ZXIoKTtcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKVxyXG4gICAgICAgICAgICAgIGJsb2NrTG9vcEV4ZWNvblNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWJsb2NrTG9vcEV4ZWNvblNlcnZlcilcclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgKiBPbmNlIHdlIGZpbmlzaCBleGVjdXRpbmcgdGhlIGxvb3AsXHJcbiAgICAgICAgICAgKiBpZiB3ZSBhcmUgbW92aW5nIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLmxlYXZlTG9vcCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSzpcclxuICAgICAgICAgIC8vIG9uIGdldHRpbmcgYSBCbG9jayBJRiwgZXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBibG9jayAoaWYgb3IgZWxzZSlcclxuICAgICAgICAgIC8vIGFuZCB0aGVuIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICBpZiAoIW9wZXIuZ2V0RXhlY09uU2VydmVyKCkgfHwgKHJldHVybmVkRnJvbVNlcnZlciAmJiBvcGVyLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmICghcmV0dXJuZWRGcm9tU2VydmVyIHx8IG9wZXIuZ2V0U2VydmVySWQoKSA+PSBuZXh0T3BlcklkeClcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBleGVjdXRhYmxlIGJsb2NrIGJldHdlZW4gQmxvY2sgSUYgYW5kIEJsb2NrIEVORFxyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gYXdhaXQgdGhpcy5nZXRTaWduaWZpY2FudEJsb2NrKGV4ZWNGbG93SWR4LCBvcGVyLmdldEJsb2NrRW5kKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSB0aGlzLmdldFN0YXJ0QmxvY2tJZklkeEJ5T3BlcihleGVjRmxvd0lkeCwgbmV4dE9wZXJJZHgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICAgIGF3YWl0IG9wZXIub3BlclNlcnZlcihudWxsKTtcclxuICAgICAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG5leHRPcGVySWR4IDwgdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrRW5kKCkpLmdldFNlcnZlcklkKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNpZ25pZmljYW50IGJsb2NrIGluIHdoaWNoIHRoZSBuZXh0IG9wZXJhdGlvbiBpc1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0Nsb3NlKCkpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeCkge1xyXG4gICAgICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tDbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChleGVjRmxvd0lkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgZXhlY3V0ZUJsb2NrID0gdHJ1ZTtcclxuICAgICAgICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tDbG9zZSgpKS5nZXRTZXJ2ZXJJZCgpIDw9IG5leHRPcGVySWR4KSB7XHJcbiAgICAgICAgICAgICAgICBleGVjdXRlQmxvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVCbG9jaykge1xyXG4gICAgICAgICAgICAgIC8vIGNhbGwgZXhlY3V0ZU9wZXJhdGlvbnMoKSB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25zIGluIHRoZSBleGVjdXRhYmxlIGJsb2NrXHJcbiAgICAgICAgICAgICAgcmV0dmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoZXhlY0Zsb3dJZHggKyAxLCBvcGVyLmdldEJsb2NrQ2xvc2UoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCArIDEsXHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLCB0cnVlLCByZXR1cm5lZEZyb21TZXJ2ZXIsIG5leHRPcGVySWR4KTtcclxuICAgICAgICAgICAgICBpZiAocmV0dmFscyAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGlmICghcmV0dmFscy5SZXR1cm5lZEZyb21TZXJ2ZXIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxzO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHJldHZhbHMuUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICAgICAgICAgICAgICBuZXh0T3BlcklkeCA9IHJldHZhbHMuTmV4dE9wZXJJZHg7XHJcbiAgICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSByZXR2YWxzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgICogT25jZSB3ZSBmaW5pc2ggZXhlY3V0aW5nIHRoZSBibG9jayxcclxuICAgICAgICAgICAqIGlmIHdlIGFyZSBtb3ZpbmcgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLCBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgICogb3RoZXJ3aXNlLCBtb3ZlIHRvIEJsb2NrIElGXHJcbiAgICAgICAgICAgKi9cclxuICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0s6XHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24ob3BlciwgdHJ1ZSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQ0FMTDpcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICAvLyBpZiBmYWxzZSBpcyByZXR1cm5lZCwgaXQgbWVhbnMgdGhhdCBhIHJvdXRlIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQuXHJcbiAgICAgICAgICByb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkID0gYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb25zICh0aG9zZSB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGZsb3cpXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIHNlcnZlciBoYXZlIGV4ZWN1dGVkIGEgYmxvY2sgb2Ygb3BlcmF0aW9ucyB0aGVuIGdldCB0aGUgbmV4dFxyXG4gICAgICAvLyBvcGVyYXRpb24gaW5kZXhcclxuICAgICAgaWYgKCFibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkKVxyXG4gICAgICByZXR2YWxzID0gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgZWxzZSBpZiAoYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcilcclxuICAgICAgcmV0dmFscyA9IG5ldyBSZXRWYWxzKG5leHRPcGVySWR4LCByZXR1cm5lZEZyb21TZXJ2ZXIsIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR2YWxzID0gbnVsbDtcclxuICAgIHJldHVybiByZXR2YWxzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZXhlY3V0YWJsZSBCbG9jayAoSUYgb3IgRUxTRSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhcnRCbG9ja0lkeFwiPnRoZSBpbmRleCBvZiB0aGUgQmxvY2sgSUY8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kSWR4XCI+dGhlIEJsb2NrIEVuZCBJbmRleCBvZiB0aGUgQmxvY2sgSUY8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgaW5kZXggb2YgdGhlIGJsb2NrIChJRiBvciBFTFNFIG9yIG5leHQgRUxTRSAuLi4pdGhhdCBjYW4gYmUgZXhlY3V0ZWQuXHJcbiAgLy8vICAgSWYgbm8gYmxvY2tzIGNhbiBiZSBleGVjdXRlZCwgcmV0dXJuIC0xXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGdldFNpZ25pZmljYW50QmxvY2soc3RhcnRCbG9ja0lkeDogbnVtYmVyLCBlbmRJZHg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnRCbG9ja0lkeCA8IGVuZElkeCkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihzdGFydEJsb2NrSWR4KTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSyAmJiBvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFICYmIG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX1NFUlZFUilcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKSB7XHJcbiAgICAgICAgcmV0SWR4ID0gc3RhcnRCbG9ja0lkeDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc3RhcnRCbG9ja0lkeCA9IG9wZXIuZ2V0QmxvY2tDbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGlkeCBvZiB0aGUgQmxvY2sgSUZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kSWR4XCI+LS0tIHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgRW5kXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiB3aG9zZSBCbG9ja0VuZCBJZHggbWF0Y2hlcyB3aXRoIHRoZSBlbmRJZHhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lkeEJ5RW5kKGVuZElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgZm9yIChqID0gZW5kSWR4IC0gMTsgaiA+PSAwICYmICFmb3VuZDsgai0tKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLIHx8IG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1ApIHtcclxuICAgICAgICBpZiAob3Blci5nZXRCbG9ja0VuZCgpID09PSBlbmRJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGlkeCBvZiB0aGUgQmxvY2sgSUZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZWxzZUlkeFwiPi0tLSB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIEVsc2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIHdob3NlIEJsb2NrRW5kIElkeCBtYXRjaGVzIHdpdGggdGhlIGVuZElkeFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWR4QnlFbHNlKGVsc2VJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVsc2VCbG9ja0VuZDogbnVtYmVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihlbHNlSWR4KS5nZXRCbG9ja0VuZCgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGZvciAoaiA9IGVsc2VJZHggLSAxOyBqID49IDAgJiYgIWZvdW5kOyBqLS0pIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spIHtcclxuICAgICAgICBpZiAob3Blci5nZXRCbG9ja0VuZCgpID09PSBlbHNlQmxvY2tFbmQpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIElGIG9yIEVsc2UgYWNjb3JkaW5nIHRvIHRoZSBpbmRleCBvZiBvbmUgb2YgdGhlIG9mIG9wZXJhdGlvbnMgaW4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvY2tPcGVySWR4XCI+LS0tIGluZGV4IG9mIHRoZSBpZiBibG9jayBmb3Igd2hpY2ggd2UgaGF2ZSB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBibG9jayB0byBleGVjdXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzcnZyT3BlcklkeFwiPi0tLSB0aGUgc2VydmVyIGlkIG9mIHRoZSBuZXh0IG9wZXJhdGlvbiB3aGljaCB0aGUgY2xpZW50IHNob3VsZCBleGVjdXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiBvciBFbHNlIHdoaWNoIGhvbGQgdGhlIG9wZXJhdGlvbiB3aGljaCBvcGVySWR4IGlzIGl0cyBpbmRleFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWZJZHhCeU9wZXIoYmxvY2tPcGVySWR4OiBudW1iZXIsIHNydnJPcGVySWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBqOiBudW1iZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuc2VydmVySWQyb3BlcklkeChzcnZyT3BlcklkeCwgYmxvY2tPcGVySWR4KSAtIDE7XHJcblxyXG4gICAgaWYgKGogPT09IC0yKSB7XHJcbiAgICAgIGogPSB0aGlzLl9vcGVyYXRpb25UYWIuc2VydmVySWQyRm9sbG93aW5nT3BlcklkeChzcnZyT3BlcklkeCwgYmxvY2tPcGVySWR4KSAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKGogPj0gMCAmJiAhZm91bmQpIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgIGlmIChqID09PSBibG9ja09wZXJJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGotLTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFKSB7XHJcbiAgICAgICAgbGV0IGJsb2NrU3RydDogbnVtYmVyID0gdGhpcy5nZXRTdGFydEJsb2NrSWR4QnlFbHNlKGopO1xyXG4gICAgICAgIGlmIChibG9ja1N0cnQgPT09IGJsb2NrT3BlcklkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaiA9IGJsb2NrU3RydCAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0spXHJcbiAgICAgICAgaiA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lkeEJ5RW5kKGopIC0gMTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGotLTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExldmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBldmVudCBvZiB0aGlzIGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEV2ZW50KCk6IEV2ZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9ldnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBJZCBvZiB0aGUgZXZlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNFbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VuYWJsZWRFeHAuZ2V0VmFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIHVzaW5nIHRoZSBhcmd1bWVudCB2YWx1ZXMgb3IgdGhlIGRlZmF1bHRcclxuICAvLy8gICB2YWx1ZXMgb3IgdGhlIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhcmdzXCI+dGhlIGFyZ3VtZW50cyBsaXN0IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyByZXNldExvY2FsVmFyaWFibGVzKGFyZ3M6IEFyZ3VtZW50c0xpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBhcmdJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgZmllbGRJZHg6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBmaWVsZElkeCA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGZpZWxkSWR4KyspIHtcclxuICAgICAgICBsZXQgYUZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGZpZWxkSWR4KTtcclxuICAgICAgICBsZXQgdmFySXNQYXJtOiBib29sZWFuID0gIXRoaXMuX2hhc1BhcmFtZXRlcnMgfHwgYUZpZWxkLmlzUGFyYW0oKTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGZpZWxkIHNob3VsZCBnZXQgaXRzIHZhbHVlIGZyb20gYW4gYXJndW1lbnRcclxuICAgICAgICBpZiAoKGFyZ3MgIT09IG51bGwgJiYgYXJnSWR4IDwgYXJncy5nZXRTaXplKCkpICYmIHZhcklzUGFybSkge1xyXG4gICAgICAgICAgaWYgKCFhcmdzLmdldEFyZyhhcmdJZHgpLnNraXBBcmcoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdzLmdldEFyZyhhcmdJZHgpLnNldFZhbHVlVG9GaWVsZChhRmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFGaWVsZC5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFGaWVsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ0lkeCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGFGaWVsZC5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgICBhd2FpdCBhRmllbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IGFGaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVzdWx0IHZhbHVlcyB0byB0aGUgZmllbGQgYXJndW1lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFyZ3NcIj50aGUgYXJndW1lbnRzIGxpc3QgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdldEFyZ1ZhbHNGcm9tRmxkcyhhcmdzOiBBcmd1bWVudHNMaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgazogbnVtYmVyID0gMDtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gdGhpcy5fZHZQb3M7IGogPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuICYmIGsgPCBhcmdzLmdldFNpemUoKTsgaisrKSB7XHJcbiAgICAgIGxldCBhRmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoaik7XHJcbiAgICAgIGlmICghdGhpcy5faGFzUGFyYW1ldGVycyB8fCBhRmllbGQuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgbGV0IGFyZzogQXJndW1lbnQgPSBhcmdzLmdldEFyZyhrKTtcclxuICAgICAgICBpZiAoYXJnLmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuQVJHX1RZUEVfRklFTEQpIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmllbGQgdmFsdWUgZnJvbSB0aGUgdGhlIFBhcmFtXHJcbiAgICAgICAgICBsZXQgYXJnRmxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmFyZy5nZXRGaWVsZCgpO1xyXG5cclxuICAgICAgICAgIC8vIEEgaGFuZGxlciBjYW4gYmUgY2FsbGVkIGVpdGhlciBmcm9tIHRoZSBzYW1lIHRhc2sgKG9mIHRoZSBoYW5kbGVyKSBvciBmcm9tIGFcclxuICAgICAgICAgIC8vIHRhc2sgbG93ZXIgZG93biBpbiB0aGUgaGllcmFyY2h5LlxyXG4gICAgICAgICAgLy8gSGVyZSB3ZSBhcmUgY29weWluZyB2YWx1ZSBmcm9tIHRoZSBoYW5kbGVyIHRhc2sgdG8gdGhlIGludm9rZXIgdGFzay5cclxuICAgICAgICAgIC8vIENvcHlpbmcgc2hvdWxkIG5vdCBiZSBkb25lIGlmIGFueSBvbmUgb2YgdGhlIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICAvLyBCdXQgY2hlY2tpbmcgb25seSB0aGUgaW52b2tlciB0YXNrJ3MgaXNBYm9ydGluZyBpcyBzdWZmaWNpZW50IGhlcmUgYmVjYXVzZSxcclxuICAgICAgICAgIC8vIGl0IHdpbGwgYmUgdHJ1ZSBldmVuIGlmIHRoZSBoYW5kbGVyIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICBpZiAoYXJnRmxkLmdldFRhc2soKSAhPT0gbnVsbCAmJiAhKDxUYXNrPmFyZ0ZsZC5nZXRUYXNrKCkpLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBhRmllbGQuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdGbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWwsIGFGaWVsZC5pc051bGwoKSwgdHJ1ZSwgYUZpZWxkLmlzTW9kaWZpZWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdGbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBrKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBoYW5kbGVyJ3MgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkIGJ5IHRoZSBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhcmdzTWF0Y2goRXhwX3BhcmFtczogRXhwVmFsW10pOiBib29sZWFuIHtcclxuICAgIGxldCBhcmdzTWF0Y2hlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBwYXJhbUNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBpIDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgaSsrKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKGZpZWxkLmlzUGFyYW0oKSkge1xyXG4gICAgICAgIHBhcmFtQ291bnQrKztcclxuICAgICAgICBpZiAoaiA8IEV4cF9wYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgZmllbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmllbGQuZ2V0VHlwZSgpO1xyXG4gICAgICAgICAgbGV0IGFyZ0F0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBFeHBfcGFyYW1zW2pdLkF0dHI7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGFyZ3VtZW50IGFuZCBwYXJhbWV0ZXIgd2lsbCBub3QgbWF0Y2ggaWYgOlxyXG4gICAgICAgICAgLy8gMS4gVGhleSBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGVcclxuICAgICAgICAgIC8vIDIuIFRoZXkgQ2Fubm90IGJlIGNhc3QgKGFscGhhIGNhbiBiZSBjYXN0IHRvIHVuaWNvZGUpXHJcbiAgICAgICAgICAvLyAzLiBBbGwgdGhvc2UgYXBwbHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbC4gaWYgdGhlIHBhcmFtIHZhbCBpcyBudWxsIGl0IGNhbiBnbyBpbnRvIGFueSB0eXBlIG9mIHBhcmFtZXRlci5cclxuICAgICAgICAgIGlmICghRXhwX3BhcmFtc1tqXS5Jc051bGwgJiYgIVN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1RoZVNhbWVUeXBlKGZpZWxkQXR0ciwgYXJnQXR0cikgJiYgIVN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5TdG9yYWdlRmxkQWxwaGFVbmljb2RlT3JCbG9iKGZpZWxkQXR0ciwgYXJnQXR0cikpIHtcclxuICAgICAgICAgICAgYXJnc01hdGNoZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBqKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhcmFtQ291bnQgIT09IEV4cF9wYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgIGFyZ3NNYXRjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJnc01hdGNoZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgT3BlcmF0aW9uVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9wZXJhdGlvblRhYigpOiBPcGVyYXRpb25UYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9uVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbiBjYXNlIG9mIENvbnRyb2wgaGVhZGVycywgcmV0dXJuIGNvbnRyb2wgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29udHJvbE5hbWVGb3JDb250cm9sSGVhZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZih0aGlzLmdldEV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuXHJcbiAgICAgIC8vIFJldHVybiB0aGUgY29udHJvbCBuYW1lIGZvciBDb250cm9sIEhlYWRlcnNcclxuICAgICAgaWYgKHRoaXMuZ2V0RXZlbnQoKS5pc0NvbnRyb2xIZWFkZXIoKSAmJiAhaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fY3RybCkpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3RybE5hbWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbiBjYXNlIG9mIFZhcmlhYmxlIGhlYWRlcnMsIHJldHVybiBmaWVsZCBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRWYXJOYW1lRm9yVmFyaWFibGVIZWFkZXIoKTogc3RyaW5nIHtcclxuICAgIC8vIFJldHVybiB0aGUgRmllbGQgbmFtZSBmb3IgVmFyaWFibGUgSGVhZGVyc1xyXG4gICBpZiAodGhpcy5nZXRFdmVudCgpLmlzVmFyaWFibGVIZWFkZXIoKSAmJiAhaXNOdWxsT3JVbmRlZmluZWQodGhpcy5faGFuZGxlckZsZCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyRmxkLmdldFZhck5hbWUoKS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybiB0aGUgZXZlbnQgaGFuZGxlciBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gY2FzZSBvZiAnUmVxdWVzdEluZm8nIGxvZyBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXZlbnRIYW5kbGVySW5mbygpOiBzdHJpbmcge1xyXG4gICAgbGV0IGV2ZW50RGVzY3JpcHRpb246IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHRoaXMuZ2V0RXZlbnQoKS5BcHBlbmREZXNjcmlwdGlvbihldmVudERlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAvLyBBcHBlbmQgY29udHJvbC92YXJpYWJsZSBuYW1lIGluIENvbnRyb2wvVmFyaWFibGUgaGVhZGVyc1xyXG4gICAgbGV0IGhlYWRlckFkZGl0aW9uYWxJbmZvOiBzdHJpbmcgPSB0aGlzLmdldENvbnRyb2xOYW1lRm9yQ29udHJvbEhlYWRlcigpICsgdGhpcy5nZXRWYXJOYW1lRm9yVmFyaWFibGVIZWFkZXIoKTtcclxuXHJcbiAgICBldmVudERlc2NyaXB0aW9uLkFwcGVuZChoZWFkZXJBZGRpdGlvbmFsSW5mbyk7XHJcblxyXG4gICAgLy8gRm9yIHNvbWUgaGVhZGVycyBsaWtlIFJQL1RQLCB0aGUgZXZlbnQgZGVzY3JpcHRpb24gaXMgZW1wdHkuXHJcbiAgICAvLyBGb3Igb3RoZXJzIGVtcHR5IHNwYWNlIHNob3VsZCBiZSBhZGRlZCBiZXR3ZWVuIGV2ZW50IHR5cGUgYW5kIGRlc2NyaXB0aW9uLlxyXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJsYW5rIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGhhbmRsZXIgdHlwZVxyXG4gICAgaWYoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCkpKVxyXG4gICAgICBldmVudERlc2NyaXB0aW9uID0gbmV3IFN0cmluZ0J1aWxkZXIoJyAnICsgZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpLCBldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCkubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiSGFuZGxlciB7MH17MX1cIiwgdGhpcy5nZXRFdmVudCgpLmdldEV2ZW50VHlwZSgpLCBldmVudERlc2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiKEhhbmRsZXIgZm9yIHswfSBvbiB0YXNrIHsxfSwgc2NvcGUgezJ9KVwiLCB0aGlzLl9ldnQsIHRoaXMuX3Rhc2ssIHRoaXMuX3Njb3BlKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdXNlZCB0byByZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGUoKSBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJldFZhbHMgIHtcclxuICBCbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE5leHRPcGVySWR4OiBudW1iZXIgPSAwO1xyXG4gIFByb3BhZ2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwOiBib29sZWFuLCBlOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3RvcihvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKHBPck9wZXJJZHg6IGFueSwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcj86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIsIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwXCI+cHJvcGFnYXRlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlXCI+ZW5hYmxlZCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMChwOiBib29sZWFuLCBlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IHA7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSBlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IDA7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVySWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpblJldHVybmVkRnJvbVNlcnZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEob3BlcklkeDogbnVtYmVyLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5FbmFibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuTmV4dE9wZXJJZHggPSBvcGVySWR4O1xyXG4gICAgdGhpcy5SZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgIHRoaXMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==