@magic-xpa/engine 4.1100.0-dev4110.106 → 4.1100.0-dev4110.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +7 -7
  2. package/esm2020/index.mjs +188 -2
  3. package/esm2020/src/AccessHelper.mjs +9 -0
  4. package/esm2020/src/ClientManager.mjs +399 -0
  5. package/esm2020/src/CommandsProcessorBase.mjs +58 -0
  6. package/esm2020/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2020/src/CommandsTable.mjs +162 -0
  8. package/esm2020/src/ConstInterface.mjs +516 -0
  9. package/esm2020/src/CurrentClientVersion.mjs +2 -0
  10. package/esm2020/src/FlowMonitorInterface.mjs +16 -0
  11. package/esm2020/src/GUIManager.mjs +62 -0
  12. package/esm2020/src/GlobalCommandsManager.mjs +34 -0
  13. package/esm2020/src/GuiEventsProcessor.mjs +154 -0
  14. package/esm2020/src/ICommandsTable.mjs +2 -0
  15. package/esm2020/src/ServerConfig.mjs +117 -0
  16. package/esm2020/src/bridge/IGuiEvent.mjs +20 -0
  17. package/esm2020/src/bridge/MagicBridge.mjs +41 -0
  18. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +11 -0
  19. package/esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +9 -0
  20. package/esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -0
  21. package/esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -0
  22. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
  23. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
  24. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -0
  26. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +260 -0
  27. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +69 -0
  28. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
  29. package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
  30. package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -0
  31. package/esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -0
  32. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  33. package/esm2020/src/commands/ClientToServer/DataviewCommand.mjs +44 -0
  34. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
  35. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
  38. package/esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +11 -0
  39. package/esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs +2 -0
  40. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
  41. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
  43. package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
  44. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -0
  48. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +15 -0
  49. package/esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -0
  50. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
  51. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
  53. package/esm2020/src/commands/ClientToServer/UnloadCommand.mjs +15 -0
  54. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
  56. package/esm2020/src/commands/IClientCommand.mjs +2 -0
  57. package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
  58. package/esm2020/src/commands/IClientToServerCommandInfo.mjs +2 -0
  59. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
  61. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  64. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
  65. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  67. package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
  68. package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
  69. package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
  70. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  72. package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
  73. package/esm2020/src/communications/IConnectionStateManager.mjs +2 -0
  74. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
  75. package/esm2020/src/data/DataSourceIdKey.mjs +3 -0
  76. package/esm2020/src/data/DataView.mjs +1610 -0
  77. package/esm2020/src/data/DataViewBase.mjs +4 -0
  78. package/esm2020/src/data/DataviewManager.mjs +28 -0
  79. package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
  80. package/esm2020/src/data/DvCache.mjs +67 -0
  81. package/esm2020/src/data/Field.mjs +646 -0
  82. package/esm2020/src/data/FieldBase.mjs +18 -0
  83. package/esm2020/src/data/FieldsTable.mjs +103 -0
  84. package/esm2020/src/data/IRecordsTable.mjs +2 -0
  85. package/esm2020/src/data/Key.mjs +88 -0
  86. package/esm2020/src/data/Record.mjs +846 -0
  87. package/esm2020/src/data/RecordOutOfDataViewException.mjs +16 -0
  88. package/esm2020/src/data/RecordsTable.mjs +267 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/esm2020/src/enums.mjs +24 -0
  92. package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2020/src/env/Environment.mjs +489 -0
  94. package/esm2020/src/env/ILanguageData.mjs +2 -0
  95. package/esm2020/src/env/LanguageData.mjs +226 -0
  96. package/esm2020/src/env/MirrorString.mjs +65 -0
  97. package/esm2020/src/event/ActionManager.mjs +91 -0
  98. package/esm2020/src/event/Event.mjs +1333 -0
  99. package/esm2020/src/event/EventHandler.mjs +766 -0
  100. package/esm2020/src/event/EventHandlerPosition.mjs +204 -0
  101. package/esm2020/src/event/EventsManager.mjs +2975 -0
  102. package/esm2020/src/event/IEventsManager.mjs +7 -0
  103. package/esm2020/src/event/RunTimeEvent.mjs +392 -0
  104. package/esm2020/src/event/RunTimeEventBase.mjs +4 -0
  105. package/esm2020/src/event/UserEventsTable.mjs +47 -0
  106. package/esm2020/src/exp/ExpTable.mjs +59 -0
  107. package/esm2020/src/exp/Expression.mjs +200 -0
  108. package/esm2020/src/exp/ExpressionDict.mjs +727 -0
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4208 -0
  110. package/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2020/src/exp/YesNoExp.mjs +36 -0
  113. package/esm2020/src/gui/CreatedFormVector.mjs +23 -0
  114. package/esm2020/src/gui/FormsTable.mjs +66 -0
  115. package/esm2020/src/gui/MgControl.mjs +353 -0
  116. package/esm2020/src/gui/MgForm.mjs +1181 -0
  117. package/esm2020/src/http/HttpManager.mjs +97 -0
  118. package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
  119. package/esm2020/src/http/client/HttpClientBase.mjs +132 -0
  120. package/esm2020/src/http/client/HttpClientEvents.mjs +39 -0
  121. package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
  122. package/esm2020/src/http/client/HttpUtility.mjs +84 -0
  123. package/esm2020/src/http/client/ICommunicationsFailureHandler.mjs +2 -0
  124. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +880 -0
  128. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
  131. package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
  132. package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
  133. package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
  134. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
  136. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2020/src/remote/ServerError.mjs +40 -0
  138. package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
  139. package/esm2020/src/rt/Argument.mjs +265 -0
  140. package/esm2020/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2020/src/rt/Boundary.mjs +152 -0
  142. package/esm2020/src/rt/CompMainPrgTable.mjs +65 -0
  143. package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
  144. package/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
  145. package/esm2020/src/rt/DataviewHeaders.mjs +53 -0
  146. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
  147. package/esm2020/src/rt/ExecutionStack.mjs +94 -0
  148. package/esm2020/src/rt/ExecutionStackEntry.mjs +17 -0
  149. package/esm2020/src/rt/HandlersTable.mjs +96 -0
  150. package/esm2020/src/rt/IDataSourceViewDefinition.mjs +2 -0
  151. package/esm2020/src/rt/IDataviewHeader.mjs +2 -0
  152. package/esm2020/src/rt/IResultValue.mjs +2 -0
  153. package/esm2020/src/rt/LastFocusedManager.mjs +67 -0
  154. package/esm2020/src/rt/Operation.mjs +735 -0
  155. package/esm2020/src/rt/OperationTable.mjs +67 -0
  156. package/esm2020/src/rt/Recompute.mjs +355 -0
  157. package/esm2020/src/rt/RecomputeTable.mjs +63 -0
  158. package/esm2020/src/rt/RemoteDataviewHeader.mjs +108 -0
  159. package/esm2020/src/rt/ResultValue.mjs +12 -0
  160. package/esm2020/src/rt/TableCache.mjs +177 -0
  161. package/esm2020/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2020/src/rt/Transaction.mjs +53 -0
  163. package/esm2020/src/security/UserDetails.mjs +71 -0
  164. package/esm2020/src/tasks/IMGDataCollection.mjs +2 -0
  165. package/esm2020/src/tasks/MGData.mjs +552 -0
  166. package/esm2020/src/tasks/MGDataCollection.mjs +252 -0
  167. package/esm2020/src/tasks/RCTimer.mjs +63 -0
  168. package/esm2020/src/tasks/RemoteTaskService.mjs +45 -0
  169. package/esm2020/src/tasks/Task.mjs +2496 -0
  170. package/esm2020/src/tasks/TaskBase.mjs +87 -0
  171. package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
  172. package/esm2020/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2020/src/tasks/sort/Sort.mjs +7 -0
  174. package/esm2020/src/tasks/sort/SortCollection.mjs +67 -0
  175. package/esm2020/src/util/ConstUtils.mjs +14 -0
  176. package/esm2020/src/util/FlowMonitorQueue.mjs +453 -0
  177. package/esm2020/src/util/HeapSort.mjs +70 -0
  178. package/esm2020/src/util/IMirrorXML.mjs +2 -0
  179. package/esm2020/src/util/IServerConfig.mjs +2 -0
  180. package/esm2020/src/util/MgBlockingQueue.mjs +2 -0
  181. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +74 -0
  182. package/esm2020/src/util/MgPriorityQueue.mjs +66 -0
  183. package/esm2020/src/util/ParamParseResult.mjs +8 -0
  184. package/esm2020/src/util/PrmMap.mjs +151 -0
  185. package/esm2020/src/util/ReturnResult.mjs +46 -0
  186. package/esm2020/src/util/ReturnResultBase.mjs +18 -0
  187. package/esm2020/src/util/Scrambler.mjs +89 -0
  188. package/esm2020/src/util/UniqueIDUtils.mjs +12 -0
  189. package/esm2020/src/util/cookie.service.mjs +92 -0
  190. package/fesm2015/magic-xpa-engine.mjs +30835 -0
  191. package/fesm2015/magic-xpa-engine.mjs.map +1 -1
  192. package/fesm2020/magic-xpa-engine.mjs +30004 -0
  193. package/fesm2020/magic-xpa-engine.mjs.map +1 -1
  194. package/index.d.ts +187 -1
  195. package/package.json +4 -4
  196. package/src/AccessHelper.d.ts +20 -0
  197. package/src/ClientManager.d.ts +32 -0
  198. package/src/CommandsProcessorBase.d.ts +23 -0
  199. package/src/CommandsProcessorManager.d.ts +6 -0
  200. package/src/CommandsTable.d.ts +22 -0
  201. package/src/ConstInterface.d.ts +515 -0
  202. package/src/CurrentClientVersion.d.ts +1 -0
  203. package/src/FlowMonitorInterface.d.ts +15 -0
  204. package/src/GUIManager.d.ts +17 -0
  205. package/src/GlobalCommandsManager.d.ts +17 -0
  206. package/src/GuiEventsProcessor.d.ts +24 -0
  207. package/src/ICommandsTable.d.ts +9 -0
  208. package/src/ServerConfig.d.ts +34 -0
  209. package/src/bridge/IGuiEvent.d.ts +19 -0
  210. package/src/bridge/MagicBridge.d.ts +16 -0
  211. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -0
  212. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -0
  213. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -0
  214. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -0
  215. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -0
  216. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -0
  217. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -0
  218. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -0
  219. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -0
  220. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -0
  221. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -0
  222. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -0
  223. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -0
  224. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -0
  225. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -0
  226. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -0
  227. package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -0
  228. package/src/commands/ClientToServer/EventCommand.d.ts +15 -0
  229. package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -0
  230. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -0
  231. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -0
  232. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -0
  233. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -0
  234. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -0
  235. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -0
  236. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -0
  237. package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -0
  238. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -0
  239. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -0
  240. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -0
  241. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -0
  242. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -0
  243. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -0
  244. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -0
  245. package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -0
  246. package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -0
  247. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -0
  248. package/src/commands/DataViewCommandBase.d.ts +6 -0
  249. package/src/commands/IClientCommand.d.ts +2 -0
  250. package/src/commands/IClientTargetedCommand.d.ts +12 -0
  251. package/src/commands/IClientToServerCommandInfo.d.ts +3 -0
  252. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -0
  253. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -0
  254. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -0
  255. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -0
  256. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -0
  257. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -0
  258. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -0
  259. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -0
  260. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -0
  261. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -0
  262. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -0
  263. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -0
  264. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -0
  265. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -0
  266. package/src/communications/IConnectionStateManager.d.ts +4 -0
  267. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -0
  268. package/src/data/DataSourceIdKey.d.ts +2 -0
  269. package/src/data/DataView.d.ts +162 -0
  270. package/src/data/DataViewBase.d.ts +12 -0
  271. package/src/data/DataviewManager.d.ts +14 -0
  272. package/src/data/DataviewManagerBase.d.ts +11 -0
  273. package/src/data/DvCache.d.ts +15 -0
  274. package/src/data/Field.d.ts +103 -0
  275. package/src/data/FieldBase.d.ts +23 -0
  276. package/src/data/FieldsTable.d.ts +27 -0
  277. package/src/data/IRecordsTable.d.ts +7 -0
  278. package/src/data/Key.d.ts +15 -0
  279. package/src/data/Record.d.ts +156 -0
  280. package/src/data/RecordOutOfDataViewException.d.ts +10 -0
  281. package/src/data/RecordsTable.d.ts +38 -0
  282. package/src/data/TaskTransactionManager.d.ts +17 -0
  283. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -0
  284. package/src/enums.d.ts +21 -0
  285. package/src/env/EnvVariablesTable.d.ts +17 -0
  286. package/src/env/Environment.d.ts +118 -0
  287. package/src/env/ILanguageData.d.ts +3 -0
  288. package/src/env/LanguageData.d.ts +20 -0
  289. package/src/env/MirrorString.d.ts +15 -0
  290. package/src/event/ActionManager.d.ts +14 -0
  291. package/src/event/Event.d.ts +79 -0
  292. package/src/event/EventHandler.d.ts +66 -0
  293. package/src/event/EventHandlerPosition.d.ts +25 -0
  294. package/src/event/EventsManager.d.ts +204 -0
  295. package/src/event/IEventsManager.d.ts +77 -0
  296. package/src/event/RunTimeEvent.d.ts +123 -0
  297. package/src/event/RunTimeEventBase.d.ts +5 -0
  298. package/src/event/UserEventsTable.d.ts +11 -0
  299. package/src/exp/ExpTable.d.ts +11 -0
  300. package/src/exp/Expression.d.ts +37 -0
  301. package/src/exp/ExpressionDict.d.ts +12 -0
  302. package/src/exp/ExpressionEvaluator.d.ts +198 -0
  303. package/src/exp/ExpressionLocalJpn.d.ts +18 -0
  304. package/src/exp/GlobalParamsTable.d.ts +19 -0
  305. package/src/exp/YesNoExp.d.ts +9 -0
  306. package/src/gui/CreatedFormVector.d.ts +10 -0
  307. package/src/gui/FormsTable.d.ts +15 -0
  308. package/src/gui/MgControl.d.ts +60 -0
  309. package/src/gui/MgForm.d.ts +93 -0
  310. package/src/http/HttpManager.d.ts +25 -0
  311. package/src/http/client/HttpClientAsync.d.ts +16 -0
  312. package/src/http/client/HttpClientBase.d.ts +30 -0
  313. package/src/http/client/HttpClientEvents.d.ts +18 -0
  314. package/src/http/client/HttpClientSync.d.ts +17 -0
  315. package/src/http/client/HttpUtility.d.ts +10 -0
  316. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -0
  317. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -0
  318. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -0
  319. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -0
  320. package/src/remote/RemoteCommandsProcessor.d.ts +51 -0
  321. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -0
  322. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -0
  323. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -0
  324. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -0
  325. package/src/remote/RemoteDataviewManager.d.ts +9 -0
  326. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -0
  327. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -0
  328. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -0
  329. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -0
  330. package/src/remote/ServerError.d.ts +16 -0
  331. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -0
  332. package/src/rt/Argument.d.ts +36 -0
  333. package/src/rt/ArgumentsList.d.ts +24 -0
  334. package/src/rt/Boundary.d.ts +27 -0
  335. package/src/rt/CompMainPrgTable.d.ts +10 -0
  336. package/src/rt/DataviewHeaderBase.d.ts +34 -0
  337. package/src/rt/DataviewHeaderFactory.d.ts +5 -0
  338. package/src/rt/DataviewHeaders.d.ts +12 -0
  339. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -0
  340. package/src/rt/ExecutionStack.d.ts +22 -0
  341. package/src/rt/ExecutionStackEntry.d.ts +7 -0
  342. package/src/rt/HandlersTable.d.ts +19 -0
  343. package/src/rt/IDataSourceViewDefinition.d.ts +6 -0
  344. package/src/rt/IDataviewHeader.d.ts +10 -0
  345. package/src/rt/IResultValue.d.ts +4 -0
  346. package/src/rt/LastFocusedManager.d.ts +23 -0
  347. package/src/rt/Operation.d.ts +97 -0
  348. package/src/rt/OperationTable.d.ts +15 -0
  349. package/src/rt/Recompute.d.ts +41 -0
  350. package/src/rt/RecomputeTable.d.ts +9 -0
  351. package/src/rt/RemoteDataviewHeader.d.ts +14 -0
  352. package/src/rt/ResultValue.d.ts +7 -0
  353. package/src/rt/TableCache.d.ts +29 -0
  354. package/src/rt/TableCacheManager.d.ts +10 -0
  355. package/src/rt/Transaction.d.ts +23 -0
  356. package/src/security/UserDetails.d.ts +16 -0
  357. package/src/tasks/IMGDataCollection.d.ts +26 -0
  358. package/src/tasks/MGData.d.ts +63 -0
  359. package/src/tasks/MGDataCollection.d.ts +42 -0
  360. package/src/tasks/RCTimer.d.ts +13 -0
  361. package/src/tasks/RemoteTaskService.d.ts +16 -0
  362. package/src/tasks/Task.d.ts +312 -0
  363. package/src/tasks/TaskBase.d.ts +123 -0
  364. package/src/tasks/TaskServiceBase.d.ts +16 -0
  365. package/src/tasks/TasksTable.d.ts +21 -0
  366. package/src/tasks/sort/Sort.d.ts +4 -0
  367. package/src/tasks/sort/SortCollection.d.ts +11 -0
  368. package/src/util/ConstUtils.d.ts +3 -0
  369. package/src/util/FlowMonitorQueue.d.ts +70 -0
  370. package/src/util/HeapSort.d.ts +6 -0
  371. package/src/util/IMirrorXML.d.ts +6 -0
  372. package/src/util/IServerConfig.d.ts +11 -0
  373. package/src/util/MgBlockingQueue.d.ts +5 -0
  374. package/src/util/MgPriorityBlockingQueue.d.ts +17 -0
  375. package/src/util/MgPriorityQueue.d.ts +13 -0
  376. package/src/util/ParamParseResult.d.ts +6 -0
  377. package/src/util/PrmMap.d.ts +28 -0
  378. package/src/util/ReturnResult.d.ts +18 -0
  379. package/src/util/ReturnResultBase.d.ts +11 -0
  380. package/src/util/Scrambler.d.ts +10 -0
  381. package/src/util/UniqueIDUtils.d.ts +4 -0
  382. package/src/util/cookie.service.d.ts +8 -0
@@ -0,0 +1,66 @@
1
+ import { List } from "@magic-xpa/mscorelib";
2
+ import { XMLConstants } from "@magic-xpa/utils";
3
+ import { Manager, RuntimeContextBase } from "@magic-xpa/gui";
4
+ import { RemoteTaskService } from "../tasks/RemoteTaskService";
5
+ export class FormsTable {
6
+ get Count() {
7
+ return this._formsStringXml.length;
8
+ }
9
+ get_Item(formDisplayIndex) {
10
+ if (formDisplayIndex > 0 && formDisplayIndex <= this._formsStringXml.length)
11
+ return this._formsStringXml.get_Item(formDisplayIndex - 1);
12
+ return null;
13
+ }
14
+ constructor(task, parentForm) {
15
+ this._task = null;
16
+ this._parentForm = null;
17
+ this._formsStringXml = null;
18
+ this._task = task;
19
+ this._parentForm = parentForm;
20
+ }
21
+ async fillData() {
22
+ this._formsStringXml = new List();
23
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
24
+ while (await this.initInnerObjects(parser.getNextTag())) {
25
+ }
26
+ }
27
+ InitFormFromXmlString(formDisplayIndex) {
28
+ let formStrXml = this.get_Item(1);
29
+ if (formDisplayIndex > 0 && formDisplayIndex <= this._formsStringXml.length)
30
+ formStrXml = this.get_Item(formDisplayIndex);
31
+ if (formStrXml !== null) {
32
+ RuntimeContextBase.Instance.Parser.push();
33
+ RuntimeContextBase.Instance.Parser.PrepareFormReadString(formStrXml);
34
+ this._task.FormInitData(this._parentForm);
35
+ RuntimeContextBase.Instance.Parser.pop();
36
+ }
37
+ }
38
+ async initInnerObjects(foundTagName) {
39
+ if (foundTagName === null)
40
+ return false;
41
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
42
+ if (foundTagName === XMLConstants.MG_TAG_FORMS) {
43
+ parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
44
+ }
45
+ else if (foundTagName === XMLConstants.MG_TAG_FORM) {
46
+ let formStringXml = RuntimeContextBase.Instance.Parser.ReadToEndOfCurrentElement();
47
+ this._formsStringXml.push(formStringXml);
48
+ return true;
49
+ }
50
+ else if (foundTagName === ('/' + XMLConstants.MG_TAG_FORM)) {
51
+ parser.setCurrIndex2EndOfTag();
52
+ return true;
53
+ }
54
+ else if (foundTagName === ('/' + XMLConstants.MG_TAG_FORMS)) {
55
+ await this.PrepareMainDisplayForConnectedTask();
56
+ parser.setCurrIndex2EndOfTag();
57
+ return false;
58
+ }
59
+ return true;
60
+ }
61
+ async PrepareMainDisplayForConnectedTask() {
62
+ if (this._task.TaskService instanceof RemoteTaskService)
63
+ await this._task.PrepareTaskForm();
64
+ }
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9ybXNUYWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZ3VpL0Zvcm1zVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBWSxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsT0FBTyxFQUFjLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFLN0QsTUFBTSxPQUFPLFVBQVU7SUFRckIsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBT0QsUUFBUSxDQUFDLGdCQUF3QjtRQUMvQixJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07WUFDekUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxZQUFZLElBQVUsRUFBRSxVQUFzQjtRQXZCdEMsVUFBSyxHQUFTLElBQUksQ0FBQztRQUNuQixnQkFBVyxHQUFlLElBQUksQ0FBQztRQUN2QyxvQkFBZSxHQUFpQixJQUFJLENBQUM7UUFzQm5DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2hDLENBQUM7SUFNRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVsQyxJQUFJLE1BQU0sR0FBYyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFbEUsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtTQUN4RDtJQUNILENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxnQkFBd0I7UUFFNUMsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07WUFDekUsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUvQyxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDdkIsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXJFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQU9PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFvQjtRQUNqRCxJQUFJLFlBQVksS0FBSyxJQUFJO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxNQUFNLEdBQWMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2xFLElBQUksWUFBWSxLQUFLLFlBQVksQ0FBQyxZQUFZLEVBQUU7WUFDOUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDckc7YUFDSSxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQ2xELElBQUksYUFBYSxHQUFXLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUMzRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQztTQUNiO2FBQ0ksSUFBSSxZQUFZLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzFELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFDSSxJQUFJLFlBQVksS0FBSyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDM0QsTUFBTSxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztZQUVoRCxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS08sS0FBSyxDQUFDLGtDQUFrQztRQUM5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxZQUFZLGlCQUFpQjtZQUNyRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMaXN0fSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtYbWxQYXJzZXIsIFhNTENvbnN0YW50c30gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtNYW5hZ2VyLCBNZ0Zvcm1CYXNlLCBSdW50aW1lQ29udGV4dEJhc2V9IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7UmVtb3RlVGFza1NlcnZpY2V9IGZyb20gXCIuLi90YXNrcy9SZW1vdGVUYXNrU2VydmljZVwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gc2F2ZSBhbGwgZm9ybXMgb24gdGFza1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRm9ybXNUYWJsZSB7XHJcbiAgcHJpdmF0ZSBfdGFzazogVGFzayA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgX2Zvcm1zU3RyaW5nWG1sOiBMaXN0PHN0cmluZz4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvdW50IG9mIGZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3Jtc1N0cmluZ1htbC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgZm9ybSBieSBzZW5kIHRoZSBkaXNwbGF5IGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtRGlzcGxheUluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldF9JdGVtKGZvcm1EaXNwbGF5SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoZm9ybURpc3BsYXlJbmRleCA+IDAgJiYgZm9ybURpc3BsYXlJbmRleCA8PSB0aGlzLl9mb3Jtc1N0cmluZ1htbC5sZW5ndGgpXHJcbiAgICAgIHJldHVybiB0aGlzLl9mb3Jtc1N0cmluZ1htbC5nZXRfSXRlbShmb3JtRGlzcGxheUluZGV4IC0gMSk7XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0YXNrOiBUYXNrLCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlKSB7XHJcbiAgICB0aGlzLl90YXNrID0gdGFzaztcclxuICAgIHRoaXMuX3BhcmVudEZvcm0gPSBwYXJlbnRGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBmb3JtIHN0cnVjdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+cmVmZXJlbmNlIHRvIHRoZSBvd25lclRhc2sgb2YgdGhpcyBmb3JtPC9wYXJhbT5cclxuICBhc3luYyBmaWxsRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2Zvcm1zU3RyaW5nWG1sID0gbmV3IExpc3QoKTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuXHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXQgdGhlIGZvcm0gb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1EaXNwbGF5SW5kZXhcIj48L3BhcmFtPlxyXG4gIEluaXRGb3JtRnJvbVhtbFN0cmluZyhmb3JtRGlzcGxheUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIHdoaWxlIHRoZSBmb3JtIGlzbid0IGV4aXN0IHRoZSBmaXJzdCBmb3JtIHdpbGwgYmUgb3Blbi4gKGl0IGlzIHRoZSBzYW1lIGluIG5vbiBvZmZsaW5lIHRhc2spXHJcbiAgICBsZXQgZm9ybVN0clhtbDogc3RyaW5nID0gdGhpcy5nZXRfSXRlbSgxKTtcclxuXHJcbiAgICBpZiAoZm9ybURpc3BsYXlJbmRleCA+IDAgJiYgZm9ybURpc3BsYXlJbmRleCA8PSB0aGlzLl9mb3Jtc1N0cmluZ1htbC5sZW5ndGgpXHJcbiAgICAgIGZvcm1TdHJYbWwgPSB0aGlzLmdldF9JdGVtKGZvcm1EaXNwbGF5SW5kZXgpO1xyXG5cclxuICAgIGlmIChmb3JtU3RyWG1sICE9PSBudWxsKSB7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIucHVzaCgpOyAvLyBhbGxvdyByZWN1cnNpdmUgcGFyc2luZ1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLlByZXBhcmVGb3JtUmVhZFN0cmluZyhmb3JtU3RyWG1sKTtcclxuXHJcbiAgICAgIHRoaXMuX3Rhc2suRm9ybUluaXREYXRhKHRoaXMuX3BhcmVudEZvcm0pO1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnBvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3VuZFRhZ05hbWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk1TKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgocGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgKyAxKTsgLy8gbW92ZSBJbmRleCB0byBlbmQgb2YgPGR2aGVhZGVyPiArMSBmb3IgJz4nXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfRk9STSkge1xyXG4gICAgICBsZXQgZm9ybVN0cmluZ1htbDogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICAgIHRoaXMuX2Zvcm1zU3RyaW5nWG1sLnB1c2goZm9ybVN0cmluZ1htbCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAoJy8nICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GT1JNKSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAoJy8nICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GT1JNUykpIHtcclxuICAgICAgYXdhaXQgdGhpcy5QcmVwYXJlTWFpbkRpc3BsYXlGb3JDb25uZWN0ZWRUYXNrKCk7XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmb3IgcmVtb3RlIHRhc2sgd2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZvcm0gZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBQcmVwYXJlTWFpbkRpc3BsYXlGb3JDb25uZWN0ZWRUYXNrKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2suVGFza1NlcnZpY2UgaW5zdGFuY2VvZiBSZW1vdGVUYXNrU2VydmljZSlcclxuICAgICAgYXdhaXQgdGhpcy5fdGFzay5QcmVwYXJlVGFza0Zvcm0oKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,353 @@
1
+ import { Commands, CommandType, GuiDataCollection, HtmlProperties, MgControlBase, PropInterface } from '@magic-xpa/gui';
2
+ import { InternalInterface, Logger, MgControlType, ScrollBarThumbType, StorageAttribute, SubformType, TableBehaviour } from '@magic-xpa/utils';
3
+ import { Debug, NString } from '@magic-xpa/mscorelib';
4
+ import { ArgumentsList } from '../rt/ArgumentsList';
5
+ import { TaskBase } from '../tasks/TaskBase';
6
+ import { ConstInterface } from '../ConstInterface';
7
+ import { AccessHelper } from '../AccessHelper';
8
+ export class MgControl extends MgControlBase {
9
+ initialize() {
10
+ this._focusedStopExecution = false;
11
+ this._inControlSuffix = false;
12
+ this._rtEvtTask = null;
13
+ this._subformTaskId = null;
14
+ this._subformTask = null;
15
+ this.IsInteractiveUpdate = false;
16
+ this.refreshOnString = null;
17
+ this.SubformLoaded = false;
18
+ this.HasZoomHandler = false;
19
+ this.ArgList = null;
20
+ }
21
+ constructor(type, taskOrParentMgForm, parentControlOrParentControlIdx) {
22
+ if (arguments.length === 0)
23
+ super();
24
+ else if (arguments.length === 3 && (type === null || type.constructor === Number) && (taskOrParentMgForm === null || taskOrParentMgForm instanceof TaskBase) && (parentControlOrParentControlIdx === null || parentControlOrParentControlIdx.constructor === Number))
25
+ super(type, taskOrParentMgForm.getForm(), parentControlOrParentControlIdx);
26
+ else
27
+ super(type, taskOrParentMgForm, parentControlOrParentControlIdx);
28
+ this.initialize();
29
+ }
30
+ GetVarIndex() {
31
+ return super.getForm().getTask().DataView.Dvcount + this.veeIndx;
32
+ }
33
+ async fillData(mgForm, ditIdx, parser) {
34
+ super.fillData(mgForm, ditIdx, parser);
35
+ this.ArgList = await this.GetArgumentList();
36
+ }
37
+ SetAttribute(attribute, valueStr) {
38
+ let isTagProcessed = super.SetAttribute(attribute, valueStr);
39
+ if (!isTagProcessed) {
40
+ switch (attribute) {
41
+ case ConstInterface.MG_ATTR_SUBFORM_TASK:
42
+ if (valueStr.trim() != "")
43
+ this._subformTaskId = valueStr;
44
+ break;
45
+ case ConstInterface.MG_ATTR_REFRESHON:
46
+ this.refreshOnString = valueStr.trim();
47
+ break;
48
+ default:
49
+ isTagProcessed = false;
50
+ Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
51
+ break;
52
+ }
53
+ }
54
+ return isTagProcessed;
55
+ }
56
+ async GetArgumentList() {
57
+ let argList = null;
58
+ if (this._propTab === null)
59
+ return argList;
60
+ let ArgListProp = this._propTab.getPropById(PropInterface.PROP_TYPE_PARAMETERS);
61
+ if (ArgListProp === null)
62
+ return argList;
63
+ let parms = await ArgListProp.getValue();
64
+ if (parms !== null) {
65
+ argList = new ArgumentsList();
66
+ argList.fillList(parms, super.getForm().getTask());
67
+ if (this.refreshOnString !== null)
68
+ argList.RefreshOnString = this.refreshOnString;
69
+ }
70
+ return argList;
71
+ }
72
+ isDescendent(parentForm) {
73
+ let isDescendent = false;
74
+ let checkCurrentForm = super.getForm();
75
+ Debug.Assert(parentForm !== null);
76
+ while (!isDescendent && checkCurrentForm !== null) {
77
+ if (parentForm === checkCurrentForm)
78
+ isDescendent = true;
79
+ else {
80
+ let currTask = checkCurrentForm.getTask();
81
+ if (currTask.getParent() !== null)
82
+ checkCurrentForm = currTask.getParent().getForm();
83
+ else
84
+ break;
85
+ }
86
+ }
87
+ return isDescendent;
88
+ }
89
+ async refreshOnExpression() {
90
+ let i;
91
+ let size = (this._propTab === null ? 0 : this._propTab.getSize());
92
+ let prop;
93
+ let refresh = false;
94
+ for (i = 0; i < size && !refresh; i++) {
95
+ prop = this._propTab.getProp(i);
96
+ switch (prop.getID()) {
97
+ case PropInterface.PROP_TYPE_DATA:
98
+ if (!prop.isExpression() && this._field !== null && this._field.getTask() !== this.getForm().getTask()) {
99
+ refresh = true;
100
+ break;
101
+ }
102
+ case PropInterface.PROP_TYPE_FORMAT:
103
+ case PropInterface.PROP_TYPE_VISIBLE:
104
+ case PropInterface.PROP_TYPE_ENABLED:
105
+ case PropInterface.PROP_TYPE_RANGE:
106
+ case PropInterface.PROP_TYPE_TRANSLATOR:
107
+ if (prop.isExpression())
108
+ refresh = true;
109
+ break;
110
+ default:
111
+ break;
112
+ }
113
+ if (refresh)
114
+ await this.RefreshDisplay();
115
+ }
116
+ }
117
+ async invoke() {
118
+ let invoked = false;
119
+ if (await this.isParkable(true)) {
120
+ await AccessHelper.eventsManager.handleInternalEventWithMgControlBase(this, InternalInterface.MG_ACT_CTRL_PREFIX);
121
+ invoked = true;
122
+ }
123
+ return invoked;
124
+ }
125
+ async isParkable(checkEnabledAndVisible) {
126
+ let result = !super.isImageControl();
127
+ if (result) {
128
+ await super.checkProp(PropInterface.PROP_TYPE_ENABLED, true);
129
+ await super.checkProp(PropInterface.PROP_TYPE_VISIBLE, true);
130
+ result = await super.isParkable(checkEnabledAndVisible);
131
+ }
132
+ return result;
133
+ }
134
+ getSubformTaskId() {
135
+ return this._subformTaskId;
136
+ }
137
+ initSubformTask() {
138
+ if (super.isSubform())
139
+ this._subformTask = GuiDataCollection.MGDataTable.GetTaskByID(this._subformTaskId);
140
+ }
141
+ getParentTable() {
142
+ return this._parentTable;
143
+ }
144
+ async restoreOldValue() {
145
+ if (this._field !== null)
146
+ await this._field.updateDisplay();
147
+ else {
148
+ super.resetPrevVal();
149
+ await super.SetAndRefreshDisplayValue(await this.getMgValue(this.Value), this.IsNull);
150
+ }
151
+ }
152
+ setRtEvtTask(curTask) {
153
+ this._rtEvtTask = curTask;
154
+ }
155
+ getRtEvtTask() {
156
+ return this._rtEvtTask;
157
+ }
158
+ setSubformTaskId(taskId) {
159
+ this._subformTaskId = taskId;
160
+ }
161
+ isFocusedStopExecution() {
162
+ return this._focusedStopExecution;
163
+ }
164
+ setFocusedStopExecution(focusedStopExecution) {
165
+ this._focusedStopExecution = focusedStopExecution;
166
+ }
167
+ onTheSameSubFormControl(ctrl) {
168
+ let retValue = false;
169
+ if (ctrl !== null) {
170
+ if (super.getForm().isSubForm() && ctrl.getForm().isSubForm()) {
171
+ if (super.getForm().getTask() === ctrl.getForm().getTask())
172
+ retValue = true;
173
+ }
174
+ }
175
+ return retValue;
176
+ }
177
+ onDiffForm(ctrl) {
178
+ let isSubform = super.getForm().isSubForm() || ctrl.getForm().isSubForm();
179
+ let isOnDiffForm = (isSubform) && !this.onTheSameSubFormControl(ctrl);
180
+ return isOnDiffForm;
181
+ }
182
+ isInControlSuffix() {
183
+ return this._inControlSuffix;
184
+ }
185
+ setInControlSuffix(inControlSuffix) {
186
+ this._inControlSuffix = inControlSuffix;
187
+ }
188
+ HasSelectProgram() {
189
+ let HasSelectProgram = false;
190
+ let selectProgProp = super.GetComputedProperty(PropInterface.PROP_TYPE_SELECT_PROGRAM);
191
+ if (selectProgProp !== null && selectProgProp.GetComputedValue() !== null)
192
+ HasSelectProgram = true;
193
+ return HasSelectProgram;
194
+ }
195
+ useZoomHandler() {
196
+ return this.HasZoomHandler || (super.getField() !== null && (super.getField().getHasZoomHandler() || (this.HasSelectProgram())));
197
+ }
198
+ async updatePropertyLogicNesting(propId, commandType, val, updateThis) {
199
+ if (val && super.haveToCheckParentValue())
200
+ val = super.isParentPropValue(propId);
201
+ if (val && super.isSubform() && commandType === CommandType.PROP_SET_VISIBLE && this.ShouldSetSubformInvisible())
202
+ val = false;
203
+ if (updateThis) {
204
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, super.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
205
+ }
206
+ await super.updateChildrenPropValue(propId, commandType, val);
207
+ }
208
+ ShouldSetSubformInvisible() {
209
+ let setInvisible = false;
210
+ let subformType = super.GetComputedProperty(PropInterface.PROP_TYPE_SUBFORM_TYPE).GetComputedValueInteger();
211
+ if (subformType === SubformType.None && this.getSubformTaskId() === null)
212
+ setInvisible = true;
213
+ return setInvisible;
214
+ }
215
+ async updateSubformChildrenPropValue(propId, commandType, val) {
216
+ Debug.Assert(super.isSubform());
217
+ if (!super.getForm().getTask().AfterFirstRecordPrefix)
218
+ return;
219
+ let subformType = super.GetComputedProperty(PropInterface.PROP_TYPE_SUBFORM_TYPE).GetComputedValueInteger();
220
+ if (this._subformTaskId !== null || subformType === SubformType.None) {
221
+ if (this._subformTask !== null && this._subformTask.isStarted()) {
222
+ this.SubformLoaded = true;
223
+ if (commandType === CommandType.PROP_SET_VISIBLE && val && this.RefreshOnVisible) {
224
+ this.RefreshOnVisible = false;
225
+ await super.getForm().getTask().SubformRefresh(this._subformTask, true);
226
+ }
227
+ let subformForm = this._subformTask.getForm();
228
+ for (let i = 0; i < subformForm.getCtrlCount(); i++) {
229
+ let child = subformForm.getCtrl(i);
230
+ if (!child.isColumnControl())
231
+ continue;
232
+ let childValue = await child.checkProp(propId, true) && val;
233
+ if (childValue)
234
+ childValue = child.isParentPropValue(propId);
235
+ await child.updateChildrenPropValue(propId, commandType, childValue);
236
+ }
237
+ }
238
+ }
239
+ else if ((commandType === CommandType.PROP_SET_VISIBLE && val) && !this.SubformLoaded) {
240
+ this.SubformLoaded = true;
241
+ await AccessHelper.eventsManager.handleInternalEventWithMgControlBase(this, InternalInterface.MG_ACT_SUBFORM_OPEN);
242
+ }
243
+ }
244
+ Init() {
245
+ this.initSubformTask();
246
+ }
247
+ GetTableBehaviour() {
248
+ return TableBehaviour.UnlimitedItems;
249
+ }
250
+ async validateAndSetValue(NewValue, updateCtrl) {
251
+ super.UpdateModifiedByUser(NewValue);
252
+ if (this.ModifiedByUser) {
253
+ let ctrlCurrValue = this.Value;
254
+ let vd;
255
+ if (super.getPIC() === null)
256
+ return true;
257
+ vd = super.buildPicture(ctrlCurrValue, NewValue);
258
+ vd.evaluate();
259
+ if (vd.ValidationFailed) {
260
+ this.ModifiedByUser = false;
261
+ return false;
262
+ }
263
+ this.IsInteractiveUpdate = true;
264
+ super.getForm().getTask().setDataSynced(false);
265
+ if (updateCtrl) {
266
+ if (this._field !== null && this._field.getType() === StorageAttribute.NUMERIC && typeof NewValue === 'string' && NewValue.trim().length > 0)
267
+ vd.setValue(NewValue);
268
+ await this.setValue(vd);
269
+ }
270
+ }
271
+ return true;
272
+ }
273
+ async setValue(vd) {
274
+ let isNull = vd.getIsNull();
275
+ let newValue = vd.getDispValue();
276
+ let mgVal;
277
+ if (!isNull || !this._field.hasNullDisplayValue())
278
+ mgVal = await super.getMgValue(newValue);
279
+ else
280
+ mgVal = ((this._field.getType() === StorageAttribute.BLOB_VECTOR) ? this._field.getCellDefualtValue() : this._field.getDefaultValue());
281
+ if (mgVal !== null) {
282
+ if (this._field !== null && (!(newValue === this.Value) || this.KeyStrokeOn || this.IsNull !== isNull)) {
283
+ await this._field.setValueAndStartRecompute(mgVal, isNull, true, true, false);
284
+ if (super.isCheckBox()) {
285
+ this.forceRefresh = true;
286
+ mgVal = this._field.getValue(false);
287
+ }
288
+ }
289
+ if ((this._field !== null && isNull) && this._field.hasNullDisplayValue())
290
+ mgVal = newValue;
291
+ await super.SetAndRefreshDisplayValue(mgVal, isNull);
292
+ this.forceRefresh = false;
293
+ this.KeyStrokeOn = false;
294
+ }
295
+ }
296
+ getSubformTask() {
297
+ return this._subformTask;
298
+ }
299
+ resetSubformTask() {
300
+ this._subformTask = null;
301
+ this._subformTaskId = "0";
302
+ }
303
+ GetSubformMgForm() {
304
+ let form = null;
305
+ if (this._subformTask !== null)
306
+ form = this._subformTask.getForm();
307
+ return form;
308
+ }
309
+ IsTableWithAbsoluteScrollbar() {
310
+ let tableWithAbsoluteScrollbar = false;
311
+ Debug.Assert(this.Type === MgControlType.CTRL_TYPE_TABLE, "In MgControl.IsTableWithAbsoluteScrollbar(): Not a table control.");
312
+ if (this._propTab.propExists(PropInterface.PROP_TYPE_SCROLL_BAR_THUMB))
313
+ tableWithAbsoluteScrollbar = (this._propTab.getPropById(PropInterface.PROP_TYPE_SCROLL_BAR_THUMB).GetComputedValueInteger() === ScrollBarThumbType.Absolute);
314
+ return tableWithAbsoluteScrollbar;
315
+ }
316
+ static validReturnToCtrl() {
317
+ if (MgControl.ReturnToCtrl !== null && MgControl.ReturnToCtrl.getForm().getTask().isAborting())
318
+ return false;
319
+ return true;
320
+ }
321
+ maySetValue() {
322
+ switch (this.Type) {
323
+ case MgControlType.CTRL_TYPE_CHECKBOX:
324
+ case MgControlType.CTRL_TYPE_TEXT:
325
+ case MgControlType.CTRL_TYPE_COMBO:
326
+ case MgControlType.CTRL_TYPE_LIST:
327
+ case MgControlType.CTRL_TYPE_RADIO:
328
+ case MgControlType.CTRL_TYPE_TAB:
329
+ break;
330
+ default:
331
+ return false;
332
+ }
333
+ if (this._field === null || this._valExpId > 0)
334
+ return false;
335
+ return this.isModifiable();
336
+ }
337
+ async validateAndSetValueIfAllowed(NewValue, refreshDisplay) {
338
+ if (!this.maySetValue()) {
339
+ Logger.Instance.WriteErrorToLog(NString.Format("Unable to change value of control {0}: The control is read-only.", this.Name));
340
+ return false;
341
+ }
342
+ let retVal = await this.validateAndSetValue(NewValue, true);
343
+ if (!retVal)
344
+ Logger.Instance.WriteErrorToLog(NString.Format("Value validation failed for {0}.", this.Name));
345
+ if (refreshDisplay) {
346
+ Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
347
+ Commands.invoke();
348
+ }
349
+ return retVal;
350
+ }
351
+ }
352
+ MgControl.ReturnToCtrl = null;
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdDb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsYUFBYSxFQUdiLGFBQWEsRUFHZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxjQUFjLEVBRWYsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFJM0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQVE3QyxNQUFNLE9BQU8sU0FBVSxTQUFRLGFBQWE7SUFnQmxDLFVBQVU7UUFDaEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FB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QUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsTUFBTTtZQUNULE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFakcsSUFBSSxjQUFjLEVBQUU7WUFDbEIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNuQjtRQUdELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBcGtCTSxzQkFBWSxHQUFjLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgR3VpRGF0YUNvbGxlY3Rpb24sXHJcbiAgSHRtbFByb3BlcnRpZXMsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUHJvcFBhcmVudEludGVyZmFjZSxcclxuICBWYWxpZGF0aW9uRGV0YWlsc1xyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBTY3JvbGxCYXJUaHVtYlR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdWJmb3JtVHlwZSxcclxuICBUYWJsZUJlaGF2aW91cixcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtEZWJ1ZywgTlN0cmluZ30gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge1Rhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tICcuL01nRm9ybSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGNvbnRyb2w+IC4uLjwvY29udHJvbD4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPiAgZWh1ZG1cclxuLy8vXHJcbi8vLyA8L2F1dGhvcj5cclxuZXhwb3J0IGNsYXNzIE1nQ29udHJvbCBleHRlbmRzIE1nQ29udHJvbEJhc2UgaW1wbGVtZW50cyBQcm9wUGFyZW50SW50ZXJmYWNlIHtcclxuICBwcml2YXRlIF9mb2N1c2VkU3RvcEV4ZWN1dGlvbjogYm9vbGVhbjsgLy8gdXNlZCB0byByZW1lbWJlciBzdG9wRXhlY3V0aW9uIGZsYWcgaW4gdGhlIGVuZCBvZlxyXG4gIHByaXZhdGUgX2luQ29udHJvbFN1ZmZpeDogYm9vbGVhbjsgLy8gdHJ1ZSwgaXMgY29udHJvbCBpcyBpbiBjb250cm9sIHN1ZmZpeFxyXG4gIHByaXZhdGUgX3J0RXZ0VGFzazogVGFza0Jhc2U7XHJcblxyXG4gIHByaXZhdGUgX3N1YmZvcm1UYXNrSWQ6IHN0cmluZzsgLy8gdGhlIHRhc2sgaWQgb2YgdGhlIHN1YiBmb3JtIHRhc2sgKGlmIHRoaXNcclxuICBwcml2YXRlIF9zdWJmb3JtVGFzazogVGFza0Jhc2U7IC8vIHJlZmVyZW5jZSB0byB0YXNrIG9mIHRoZSBzdWIgZm9ybSB0YXNrXHJcblxyXG4gIElzSW50ZXJhY3RpdmVVcGRhdGU6IGJvb2xlYW47IC8vIHRydWUgaWYgdGhpcyBjb250cm9sIHdhcyBtb2RpZmllZCBieSB1c2VyXHJcbiAgcHJpdmF0ZSByZWZyZXNoT25TdHJpbmc6IHN0cmluZzsgLy8gT25seSBmb3Igb2ZmbGluZS4gR2V0IGl0IGZyb20gWE1MIGFuZCBwdXQgaXQgb24gdGhlIHN1YmZvcm0gdGFzayB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkXHJcbiAgU3ViZm9ybUxvYWRlZDogYm9vbGVhbjsgLy8gdHJ1ZSwgaWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbG9hZGVkIGFscmVhZHlcclxuICBIYXNab29tSGFuZGxlcjogYm9vbGVhbjsgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSB6b29tIGhhbmRsZXIgb24gdGhpcyBjdHJsXHJcbiAgQXJnTGlzdDogQXJndW1lbnRzTGlzdDsgLy8gYXJndW1lbnQgbGlzdCBidWlsdCBmcm9tIHRoZSBwcm9wZXJ0eVxyXG5cclxuICBzdGF0aWMgUmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemUoKSB7XHJcbiAgICB0aGlzLl9mb2N1c2VkU3RvcEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5Db250cm9sU3VmZml4ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9ydEV2dFRhc2sgPSBudWxsO1xyXG4gICAgdGhpcy5fc3ViZm9ybVRhc2tJZCA9IG51bGw7XHJcbiAgICB0aGlzLl9zdWJmb3JtVGFzayA9IG51bGw7XHJcbiAgICB0aGlzLklzSW50ZXJhY3RpdmVVcGRhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMucmVmcmVzaE9uU3RyaW5nID0gbnVsbDtcclxuICAgIHRoaXMuU3ViZm9ybUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5IYXNab29tSGFuZGxlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5BcmdMaXN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHRhc2s6IFRhc2tCYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlPzogTWdDb250cm9sVHlwZSwgdGFza09yUGFyZW50TWdGb3JtPzogYW55LCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgc3VwZXIoKTtcclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgKHR5cGUgPT09IG51bGwgfHwgdHlwZS5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAodGFza09yUGFyZW50TWdGb3JtID09PSBudWxsIHx8IHRhc2tPclBhcmVudE1nRm9ybSBpbnN0YW5jZW9mIFRhc2tCYXNlKSAmJiAocGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeCA9PT0gbnVsbCB8fCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKVxyXG4gICAgICBzdXBlcih0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0uZ2V0Rm9ybSgpLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICAgIGVsc2VcclxuICAgICAgc3VwZXIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKDxEYXRhVmlldz5zdXBlci5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3KS5EdmNvdW50ICsgdGhpcy52ZWVJbmR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgYXJndW1lbnRzIGZyb20gdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpdElkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEobWdGb3JtOiBNZ0Zvcm1CYXNlLCBkaXRJZHg6IG51bWJlciwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLmZpbGxEYXRhKG1nRm9ybSwgZGl0SWR4LCBwYXJzZXIpO1xyXG4gICAgdGhpcy5BcmdMaXN0ID0gYXdhaXQgdGhpcy5HZXRBcmd1bWVudExpc3QoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGNvbnRyb2wgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSBzdXBlci5TZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKSB7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NVQkZPUk1fVEFTSzpcclxuICAgICAgICAgIGlmICh2YWx1ZVN0ci50cmltKCkgIT0gXCJcIilcclxuICAgICAgICAgICAgdGhpcy5fc3ViZm9ybVRhc2tJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIHRoaXMucmVmcmVzaE9uU3RyaW5nID0gdmFsdWVTdHIudHJpbSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGJ1aWxkIEFyZ3VtZW50IGxpc3QgZnJvbSB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgR2V0QXJndW1lbnRMaXN0KCk6IFByb21pc2U8QXJndW1lbnRzTGlzdD4ge1xyXG4gICAgbGV0IGFyZ0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBhcmdMaXN0O1xyXG4gICAgbGV0IEFyZ0xpc3RQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUyk7XHJcbiAgICBpZiAoQXJnTGlzdFByb3AgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBhcmdMaXN0O1xyXG5cclxuICAgIGxldCBwYXJtczogc3RyaW5nID0gYXdhaXQgQXJnTGlzdFByb3AuZ2V0VmFsdWUoKTtcclxuICAgIGlmIChwYXJtcyAhPT0gbnVsbCkge1xyXG4gICAgICBhcmdMaXN0ID0gbmV3IEFyZ3VtZW50c0xpc3QoKTtcclxuICAgICAgYXJnTGlzdC5maWxsTGlzdChwYXJtcywgPFRhc2tCYXNlPnN1cGVyLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICBpZiAodGhpcy5yZWZyZXNoT25TdHJpbmcgIT09IG51bGwpXHJcbiAgICAgICAgYXJnTGlzdC5SZWZyZXNoT25TdHJpbmcgPSB0aGlzLnJlZnJlc2hPblN0cmluZztcclxuICAgIH1cclxuICAgIHJldHVybiBhcmdMaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBkZXNjZW5kYW50IG9mIHRoZSBwYXJlbnRGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudEZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEZXNjZW5kZW50KHBhcmVudEZvcm06IE1nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRGVzY2VuZGVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGNoZWNrQ3VycmVudEZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+c3VwZXIuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIERlYnVnLkFzc2VydChwYXJlbnRGb3JtICE9PSBudWxsKTtcclxuXHJcbiAgICB3aGlsZSAoIWlzRGVzY2VuZGVudCAmJiBjaGVja0N1cnJlbnRGb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChwYXJlbnRGb3JtID09PSBjaGVja0N1cnJlbnRGb3JtKVxyXG4gICAgICAgIGlzRGVzY2VuZGVudCA9IHRydWU7XHJcblxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY3VyclRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPmNoZWNrQ3VycmVudEZvcm0uZ2V0VGFzaygpO1xyXG4gICAgICAgIGlmIChjdXJyVGFzay5nZXRQYXJlbnQoKSAhPT0gbnVsbClcclxuICAgICAgICAgIGNoZWNrQ3VycmVudEZvcm0gPSA8TWdGb3JtPmN1cnJUYXNrLmdldFBhcmVudCgpLmdldEZvcm0oKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzRGVzY2VuZGVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWZyZXNoIGNvbnRyb2wgZGlzcGxheSBpZiBpdCBoYXMgYSBwcm9wZXJ0eSB3aGljaCBpcyBhbiBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaE9uRXhwcmVzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gKHRoaXMuX3Byb3BUYWIgPT09IG51bGwgPyAwIDogdGhpcy5fcHJvcFRhYi5nZXRTaXplKCkpO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAmJiAhcmVmcmVzaDsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3AoaSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHByb3AuZ2V0SUQoKSkge1xyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQTpcclxuICAgICAgICAgIGlmICghcHJvcC5pc0V4cHJlc3Npb24oKSAmJiB0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5nZXRUYXNrKCkgIT09IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKSkge1xyXG4gICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgLyogIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFOU0xBVE9SOlxyXG4gICAgICAgICAgaWYgKHByb3AuaXNFeHByZXNzaW9uKCkpXHJcbiAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZWZyZXNoKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGludm9rZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpbnZva2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGNvbnRyb2wgaXMgbm90IHZpc2libGUsIG5vdCBlbmFibGVkIG9yIG5vdCBwYXJrYWJsZSBza2lwIHRoaXMgY29udHJvbFxyXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNQYXJrYWJsZSh0cnVlKSkge1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgaW52b2tlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW52b2tlZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGlzUGFya2FibGUoY2hlY2tFbmFibGVkQW5kVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9ICFzdXBlci5pc0ltYWdlQ29udHJvbCgpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICBhd2FpdCBzdXBlci5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSk7XHJcblxyXG4gICAgICBhd2FpdCBzdXBlci5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHN1cGVyLmlzUGFya2FibGUoY2hlY2tFbmFibGVkQW5kVmlzaWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWJmb3JtIHRhc2sgaWQgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN1YmZvcm1UYXNrSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJmb3JtVGFza0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgdGhlIHN1YmZvcm0gdGFzayBhY2NvcmRpbmcgdG8gaXRzIGlkIGFuZCBzYXZlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbml0U3ViZm9ybVRhc2soKTogdm9pZCB7XHJcbiAgICBpZiAoc3VwZXIuaXNTdWJmb3JtKCkpXHJcbiAgICAgIHRoaXMuX3N1YmZvcm1UYXNrID0gPFRhc2tCYXNlPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldFRhc2tCeUlEKHRoaXMuX3N1YmZvcm1UYXNrSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY29udHJvbCdzIHBhcmVudFRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnRUYWJsZSgpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIDxNZ0NvbnRyb2w+dGhpcy5fcGFyZW50VGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSBhbmQgZGlzcGxheSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBjb250cm9sIHVzZWQgd2hlbiB0aGUgY29udHJvbCBpcyBub3QgbW9kaWZpYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVzdG9yZU9sZFZhbHVlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKVxyXG4gICAgICBhd2FpdCAoPEZpZWxkPnRoaXMuX2ZpZWxkKS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgc3VwZXIucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoYXdhaXQgdGhpcy5nZXRNZ1ZhbHVlKHRoaXMuVmFsdWUpLCB0aGlzLklzTnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgZXZlbnQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0UnRFdnRUYXNrKGN1clRhc2s6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2dFRhc2sgPSBjdXJUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGV2ZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJ0RXZ0VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcnRFdnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHN1YmZvcm0gdGFzayBpZCBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3ViZm9ybVRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3ViZm9ybVRhc2tJZCA9IHRhc2tJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHN0b3BFeGVjdXRpb24gZmxhZyBpbiB0aGUgZW5kIG9mIGhhbmRsZSBmb2N1cyBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0ZvY3VzZWRTdG9wRXhlY3V0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRTdG9wRXhlY3V0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbWVtYmVyIHN0b3BFeGVjdXRpb24gZmxhZyBpbiB0aGUgZW5kIG9mIGhhbmRsZSBmb2N1cyBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb2N1c2VkU3RvcEV4ZWN1dGlvblwiPjwvcGFyYW0+XHJcbiAgc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24oZm9jdXNlZFN0b3BFeGVjdXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvY3VzZWRTdG9wRXhlY3V0aW9uID0gZm9jdXNlZFN0b3BFeGVjdXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmwtXCI+VGhlIGN0cmwgdG8gY2hlY2suIGNhbiBiZSBmcmFtZSBmb3JtIGFuZCBhbHNvIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgb25UaGVTYW1lU3ViRm9ybUNvbnRyb2woY3RybDogTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChjdHJsICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChzdXBlci5nZXRGb3JtKCkuaXNTdWJGb3JtKCkgJiYgY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICBpZiAoc3VwZXIuZ2V0Rm9ybSgpLmdldFRhc2soKSA9PT0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKVxyXG4gICAgICAgICAgcmV0VmFsdWUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJ1ZSBpZiB0aGUgY3RybHMgYXJlIG9uIGRpZmZlcmVudCBmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIG9uRGlmZkZvcm0oY3RybDogTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNTdWJmb3JtOiBib29sZWFuID0gc3VwZXIuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpIHx8IGN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpO1xyXG4gICAgbGV0IGlzT25EaWZmRm9ybTogYm9vbGVhbiA9IChpc1N1YmZvcm0gKSAmJiAhdGhpcy5vblRoZVNhbWVTdWJGb3JtQ29udHJvbChjdHJsKTtcclxuXHJcbiAgICByZXR1cm4gaXNPbkRpZmZGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUgaWYgY29udHJvbCBpcyBpbiBjb250cm9sIHN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0luQ29udHJvbFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkNvbnRyb2xTdWZmaXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRydWUgaWYgY29udHJvbCBpcyBpbiBjb250cm9sIHN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbkNvbnRyb2xTdWZmaXhcIj48L3BhcmFtPlxyXG4gIHNldEluQ29udHJvbFN1ZmZpeChpbkNvbnRyb2xTdWZmaXg6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luQ29udHJvbFN1ZmZpeCA9IGluQ29udHJvbFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBoYXMgc2VsZWN0IHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhc1NlbGVjdFByb2dyYW0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgSGFzU2VsZWN0UHJvZ3JhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHNlbGVjdFByb2dQcm9wOiBQcm9wZXJ0eSA9IHN1cGVyLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX1BST0dSQU0pO1xyXG4gICAgaWYgKHNlbGVjdFByb2dQcm9wICE9PSBudWxsICYmIHNlbGVjdFByb2dQcm9wLkdldENvbXB1dGVkVmFsdWUoKSAhPT0gbnVsbClcclxuICAgICAgSGFzU2VsZWN0UHJvZ3JhbSA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIEhhc1NlbGVjdFByb2dyYW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRyb2wgdXNlIHRoZSBoYW5kbGVyIFpPT00gKGZvciBzZWxlY3QgcHJvZ3JhbSBvciBab29tIGhhbmRsZXIpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHVzZVpvb21IYW5kbGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSGFzWm9vbUhhbmRsZXIgfHwgKHN1cGVyLmdldEZpZWxkKCkgIT09IG51bGwgJiYgKCg8RmllbGQ+c3VwZXIuZ2V0RmllbGQoKSkuZ2V0SGFzWm9vbUhhbmRsZXIoKSB8fCAodGhpcy5IYXNTZWxlY3RQcm9ncmFtKCkpKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlIGJvb2xlYW4gcHJvcGVydHkoZXg6dmlzaWJsZVxcZW5hYmxlKSBvZiBjb250cm9sIGFuZCBpdCdzIGNoaWxkcmVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnByb3BlcnR5IGlkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPmNvbW1hbmQgdHlwZSB0aGF0IGJlbG9uZyB0byB0aGUgcHJvcCBpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidXBkYXRlVGhpc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuLCB1cGRhdGVUaGlzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodmFsICYmIHN1cGVyLmhhdmVUb0NoZWNrUGFyZW50VmFsdWUoKSlcclxuICAgICAgdmFsID0gc3VwZXIuaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgc3ViZm9ybSBtdXN0IGJlIGludmlzaWJsZSAoQ1RSTF9TVUJGT1JNX05PTkUpIHdlIGNoYW5nZSBpdHMgdmlzaWJpbGl0eSB0byBmYWxzZVxyXG4gICAgaWYgKHZhbCAmJiBzdXBlci5pc1N1YmZvcm0oKSAmJiBjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSAmJiB0aGlzLlNob3VsZFNldFN1YmZvcm1JbnZpc2libGUoKSlcclxuICAgICAgdmFsID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHVwZGF0ZVRoaXMpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBzdXBlci5nZXREaXNwbGF5TGluZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFID8gSHRtbFByb3BlcnRpZXMuVmlzaWJsZSA6IEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQsIHZhbCk7XHJcblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc3VwZXIudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSWYgdGhlIHN1YmZvcm0gbXVzdCBiZSBpbnZpc2libGUgKGZvciBleGFtcGxlIENUUkxfU1VCRk9STV9OT05FKSByZXR1cm5zIHRydWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2V0U3ViZm9ybUludmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBzZXRJbnZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJmb3JtVHlwZTogU3ViZm9ybVR5cGUgPSA8U3ViZm9ybVR5cGU+c3VwZXIuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEUpLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcbiAgICBpZiAoc3ViZm9ybVR5cGUgPT09IFN1YmZvcm1UeXBlLk5vbmUgJiYgdGhpcy5nZXRTdWJmb3JtVGFza0lkKCkgPT09IG51bGwpXHJcbiAgICAgIHNldEludmlzaWJsZSA9IHRydWU7XHJcbiAgICByZXR1cm4gc2V0SW52aXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHkgb2Ygc3ViZm9ybSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5JZCBvZiB2aXNpYmlsaXR5IG9yIGVuYWJsZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPnR5cGUgb2YgdGhlIEdVSSBjb21tYW5kPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIGZvciB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZVN1YmZvcm1DaGlsZHJlblByb3BWYWx1ZShwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIERlYnVnLkFzc2VydChzdXBlci5pc1N1YmZvcm0oKSk7XHJcblxyXG4gICAgaWYgKCEoPFRhc2tCYXNlPnN1cGVyLmdldEZvcm0oKS5nZXRUYXNrKCkpLkFmdGVyRmlyc3RSZWNvcmRQcmVmaXgpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgc3ViZm9ybVR5cGU6IFN1YmZvcm1UeXBlID0gPFN1YmZvcm1UeXBlPnN1cGVyLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgaWYgKHRoaXMuX3N1YmZvcm1UYXNrSWQgIT09IG51bGwgfHwgc3ViZm9ybVR5cGUgPT09IFN1YmZvcm1UeXBlLk5vbmUpIHtcclxuICAgICAgaWYgKHRoaXMuX3N1YmZvcm1UYXNrICE9PSBudWxsICYmIHRoaXMuX3N1YmZvcm1UYXNrLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgdGhpcy5TdWJmb3JtTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgJiYgdmFsICYmIHRoaXMuUmVmcmVzaE9uVmlzaWJsZSkge1xyXG4gICAgICAgICAgdGhpcy5SZWZyZXNoT25WaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnN1cGVyLmdldEZvcm0oKS5nZXRUYXNrKCkpLlN1YmZvcm1SZWZyZXNoKHRoaXMuX3N1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdWJmb3JtRm9ybTogTWdGb3JtQmFzZSA9IHRoaXMuX3N1YmZvcm1UYXNrLmdldEZvcm0oKTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViZm9ybUZvcm0uZ2V0Q3RybENvdW50KCk7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGNoaWxkOiBNZ0NvbnRyb2xCYXNlID0gc3ViZm9ybUZvcm0uZ2V0Q3RybChpKTtcclxuICAgICAgICAgIC8vIFFDUiAjOTgxNTU1LCBXZSBzaG91bGQgbm90IGFmZmVjdCB2aXNpYmlsaXR5IG9mIHRoZSBUYWJsZUNvbHVtbnMgc2luY2UgaXQgaXMgbWFuYWdlZCBieSB0aGUgdGFibGUuU2V0dGluZyB2aXNpYmlsaXR5XHJcbiAgICAgICAgICAvLyBvZiBhbGwgY29sdW1ucyB0byBmYWxzZSBwcmV2ZW50cyB0YWJsZSBwbGFjZW1lbnRcclxuICAgICAgICAgIGlmICghY2hpbGQuaXNDb2x1bW5Db250cm9sKCkpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgbGV0IGNoaWxkVmFsdWU6IGJvb2xlYW4gPSBhd2FpdCBjaGlsZC5jaGVja1Byb3AocHJvcElkLCB0cnVlKSAmJiB2YWw7XHJcbiAgICAgICAgICBpZiAoY2hpbGRWYWx1ZSlcclxuICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkLmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCk7XHJcblxyXG4gICAgICAgICAgLy8gaWYgKHRoaXMuX3N1YmZvcm1UYXNrLmlzU3RhcnRlZCgpKVxyXG4gICAgICAgICAgLy8gICBDb21tYW5kcy5hZGRBc3luYyhjb21tYW5kVHlwZSwgY2hpbGQsIGNoaWxkLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgY2hpbGRWYWx1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBjaGlsZC51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCBjaGlsZFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKChjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSAmJiB2YWwpICYmICF0aGlzLlN1YmZvcm1Mb2FkZWQpIHtcclxuICAgICAgdGhpcy5TdWJmb3JtTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX09QRU4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgc3ViZm9ybSB0YXNrIGlkIGZvciBhIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFN1YmZvcm1UYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgYmVoYXZpb3VyIGZvciB0aGUgdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRUYWJsZUJlaGF2aW91cigpOiBUYWJsZUJlaGF2aW91ciB7XHJcbiAgICByZXR1cm4gVGFibGVCZWhhdmlvdXIuVW5saW1pdGVkSXRlbXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFuZCBzZXQgaXQncyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJOZXdWYWx1ZVwiPnRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1cGRhdGVDdHJsXCI+aWYgdHJ1ZSB0aGVuIHRoZSBjb250cm9sIHdpbGwgYmUgdXBkYXRlZCB1cG9uIHN1Y2Nlc3NmdWwgY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXR1cm5zIGlmIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bDwvcmV0dXJucz5cclxuICBhc3luYyB2YWxpZGF0ZUFuZFNldFZhbHVlKE5ld1ZhbHVlOiBhbnksIHVwZGF0ZUN0cmw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHN1cGVyLlVwZGF0ZU1vZGlmaWVkQnlVc2VyKE5ld1ZhbHVlKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgbnVsbCBvciB3YXMgY2hhbmdlZFxyXG4gICAgLy8gY2hlY2sgdmFsaWRhdGlvbiBhbmQgdXBkYXRlIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgICBpZiAodGhpcy5Nb2RpZmllZEJ5VXNlcikge1xyXG4gICAgICBsZXQgY3RybEN1cnJWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgICAgbGV0IHZkOiBWYWxpZGF0aW9uRGV0YWlscztcclxuXHJcbiAgICAgIGlmIChzdXBlci5nZXRQSUMoKSA9PT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgdmQgPSBzdXBlci5idWlsZFBpY3R1cmUoY3RybEN1cnJWYWx1ZSwgTmV3VmFsdWUpO1xyXG5cclxuICAgICAgdmQuZXZhbHVhdGUoKTtcclxuXHJcbiAgICAgIC8vIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZHMgdmFsdWUgd2FzIHdyb25nXHJcbiAgICAgIGlmICh2ZC5WYWxpZGF0aW9uRmFpbGVkKSB7XHJcbiAgICAgICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5Jc0ludGVyYWN0aXZlVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIHN1cGVyLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0RGF0YVN5bmNlZChmYWxzZSk7XHJcblxyXG4gICAgICAvLyBzZXQgdGhlIHZhbHVlIChoYW5kbGUgcmVjb21wdXRlLCBldGMuKVxyXG4gICAgICBpZiAodXBkYXRlQ3RybCkge1xyXG4gICAgICAgIC8vIFFDUiM0NDEwMjA6QWZ0ZXIgdmFsaWRhdGluZyBkaXNwbGF5IHZhbHVlLCB0YWtlIHRoZSBzYW1lIGN0cmwncyB2YWx1ZSBmb3IgbWcgdmFsdWUgY29udmVyc2lvbi5cclxuICAgICAgICAvLyBVc2luZyBkaXNwbGF5IHZhbHVlIGdlbmVyYXRlZCBmcm9tIE1nVmFsdWUsIG1pZ2h0IGhhdmUgcHJvYmxlbSB0byBjb252ZXJ0IGJhY2sgdG8gTWdWYWwgdXNpbmcgcGljdHVyZSBkdWUgdG8gYWxpZ25tZW50IChjaGFuZ2VkIGFsaWdubWVudCApLlxyXG4gICAgICAgIC8vIFRoaXMgcHJvYmxlbSBvY2N1cnMgZm9yIG51bWVyaWMuXHJcbiAgICAgICAgLy8gVGhlIGZpeCBzaG91bGQgYmUgYXBwbGljYWJsZSBmb3IgbnVtZXJpYyB0eXBlIG9ubHkuIEJlY2F1c2UgZGF0ZSBhbmQgdGltZSBmaWVsZCB3aXRoIGNvbXBsZXggbWFza2luZyBoYXZlIHByb2JsZW0gb24gdXNpbmcgY3RybCdzIHZhbHVlLlxyXG4gICAgICAgIC8vIFJlZmVyIGRhdGUgcWNyczogIzI5MTY2NiwgIzMwNzM1MywgIzQzNDI0MSBhbmQgZm9yIHRpbWUsIGNoZWNrIGRlZmF1bHQgdmFsdWUgd2hlbiBmb3JtYXQgaXMgJ0hILU1NLVNTIFBNWkAnXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuX2ZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIHR5cGVvZiBOZXdWYWx1ZSA9PT0gJ3N0cmluZycgJiYgTmV3VmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICB2ZC5zZXRWYWx1ZShOZXdWYWx1ZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0VmFsdWUodmQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIHVzZXIgaW5wdXQgYWZ0ZXIgdmFsaWRhdGlvbiBhbmQgdXBkYXRlIHRoZSBmaWVsZCBjb25uZWN0ZWQgdG8gdGhpc1xyXG4gIC8vLyAgIGNvbnRyb2wgKGlmIGV4aXN0cylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmRcIj50aGUgdmFsaWRhdGlvbiBkZXRhaWxzIG9iamVjdDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRWYWx1ZSh2ZDogVmFsaWRhdGlvbkRldGFpbHMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSB2ZC5nZXRJc051bGwoKTtcclxuICAgIGxldCBuZXdWYWx1ZTogYW55ID0gdmQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWlzTnVsbCB8fCAhdGhpcy5fZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKVxyXG4gICAgICBtZ1ZhbCA9IGF3YWl0IHN1cGVyLmdldE1nVmFsdWUobmV3VmFsdWUpO1xyXG4gICAgLy8gaXQncyBpbm5lciB2YWx1ZSAtPiB0cmFuc2xhdGUgaXQgdG8gdGhlIGRpc3BsYXlcclxuICAgIGVsc2VcclxuICAgICAgbWdWYWwgPSAoKHRoaXMuX2ZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyB0aGlzLl9maWVsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCkgOiB0aGlzLl9maWVsZC5nZXREZWZhdWx0VmFsdWUoKSk7XHJcbiAgICBpZiAobWdWYWwgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmICghKG5ld1ZhbHVlID09PSB0aGlzLlZhbHVlKSB8fCB0aGlzLktleVN0cm9rZU9uIHx8IHRoaXMuSXNOdWxsICE9PSBpc051bGwpKSB7XHJcbiAgICAgICAgYXdhaXQgKDxGaWVsZD50aGlzLl9maWVsZCkuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZShtZ1ZhbCwgaXNOdWxsLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIGRlZmVjdCAxMjc3MzQgOiB2YWx1ZSBvZiB0aGUgZmllbGQgbWlnaHQgYmUgY2hhbmdlZCBhbHJlYWR5IGluc2lkZSBhIGNvbnRyb2wgY2hhbmdlIGhhbmRsZXJcclxuICAgICAgICAvLyB0byBhdm9pZCB1cGRhdGluZyBvbGQgdmFsdWUgYW5kIG92ZXJydW5uaW5nIHRoZSB2YWx1ZSBmcjBtIHRoZSBjb250cm9sIGNoYW5nZVxyXG4gICAgICAgIC8vIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZmllbGQuIChuZWVkIHRvIGJlIGRvbmUgZm9yIGNvbWJvIGFuZCBsaXN0IGJveCwgYnV0IGl0J3MgdG9vIHJpc2t5XHJcbiAgICAgICAgLy8gYW5kIHVubGlrZWx5IHRvIGhhcHBlbiwgc28gdGhlIGZpeCB3aWxsIGJlIGZvciBjaGVjayBib3ggb25seSlcclxuXHJcbiAgICAgICAgaWYgKHN1cGVyLmlzQ2hlY2tCb3goKSkge1xyXG4gICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2ggPSB0cnVlO1xyXG4gICAgICAgICAgbWdWYWwgPSAoPEZpZWxkPnRoaXMuX2ZpZWxkKS5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiBmaWVsZCB2YWx1ZSBpcyBudWxsICYgaGFzIG51bGwgZGlzcGxheSB2YWx1ZSwgdGFrZSBldmFsdWF0ZWQgbnVsbCBkaXNwbGF5IHZhbHVlLlxyXG4gICAgICBpZiAoKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIGlzTnVsbCkgJiYgdGhpcy5fZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKVxyXG4gICAgICAgIG1nVmFsID0gbmV3VmFsdWU7XHJcblxyXG4gICAgICBhd2FpdCBzdXBlci5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsLCBpc051bGwpO1xyXG4gICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAvLyBRQ1IgIzQzODc1My4gUHJldmVudCBSUCZSUyBjeWNsZSwgd2hlbiBpdCdzIG5vdCBuZWVkZWQuXHJcbiAgICAgIHRoaXMuS2V5U3Ryb2tlT24gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWJmb3JtIHRhc2sgb2YgdGhpcyBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN1YmZvcm1UYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJmb3JtVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWJmb3JtIHRhc2sgb2YgdGhpcyBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0U3ViZm9ybVRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJmb3JtVGFzayA9IG51bGw7XHJcbiAgICB0aGlzLl9zdWJmb3JtVGFza0lkID0gXCIwXCI7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyBNZ0Zvcm0gb2YgdGhlIHN1YmZvcm0gY29udHJvbCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdWJmb3JtTWdGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX3N1YmZvcm1UYXNrICE9PSBudWxsKVxyXG4gICAgICBmb3JtID0gdGhpcy5fc3ViZm9ybVRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIElzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFLCBcIkluIE1nQ29udHJvbC5Jc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk6IE5vdCBhIHRhYmxlIGNvbnRyb2wuXCIpO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSX1RIVU1CKSlcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAodGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSX1RIVU1CKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpID09PSA8bnVtYmVyPlNjcm9sbEJhclRodW1iVHlwZS5BYnNvbHV0ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgdGhlIHJldHVybi10by1jb250cm9sIHBvaW50cyB0byBhbiBleGlzdGluZyB0YXNrLjwvc3VtbWFyeT5cclxuICBzdGF0aWMgdmFsaWRSZXR1cm5Ub0N0cmwoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoTWdDb250cm9sLlJldHVyblRvQ3RybCAhPT0gbnVsbCAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGNoZWNrIGlmIG9uZSBtYXkgZGlyZWN0bHkgKG5vdCB2aWEgdGhlIGd1aSkgc2V0IGEgdmFsdWUgb24gdGhpcyBjb250cm9sLjwvc3VtbWFyeT5cclxuICBtYXlTZXRWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1g6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTzpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZXZlbnQgdmFsdWUgc2V0dGluZyBpZiB0aGUgY29udHJvbCBkb2Vzbid0IGhhdmUgYSBmaWVsZCwgb3IgaWYgaXQgZ2V0cyBpdHMgdmFsdWUgZnJvbSBhbiBleHByZXNzaW9uXHJcbiAgICBpZiAodGhpcy5fZmllbGQgPT09IG51bGwgfHwgdGhpcy5fdmFsRXhwSWQgPiAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaXNNb2RpZmlhYmxlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hlY2tzIGlmIGEgdmFsdWUgbWF5IGJlIHNldCwgYW5kIHRyaWVzIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiTmV3VmFsdWVcIj50aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidXBkYXRlQ3RybFwiPmlmIHRydWUgdGhlbiB0aGUgY29udHJvbCB3aWxsIGJlIHVwZGF0ZWQgdXBvbiBzdWNjZXNzZnVsIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+cmV0dXJucyBpZiB2YWx1ZSBzZXR0aW5nIHdhcyBzdWNjZXNzZnVsIDwvcmV0dXJucz5cclxuICBhc3luYyB2YWxpZGF0ZUFuZFNldFZhbHVlSWZBbGxvd2VkKE5ld1ZhbHVlOiBhbnksIHJlZnJlc2hEaXNwbGF5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMubWF5U2V0VmFsdWUoKSkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFcnJvclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVW5hYmxlIHRvIGNoYW5nZSB2YWx1ZSBvZiBjb250cm9sIHswfTogVGhlIGNvbnRyb2wgaXMgcmVhZC1vbmx5LlwiLCB0aGlzLk5hbWUpKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXRWYWwgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kU2V0VmFsdWUoTmV3VmFsdWUsIHRydWUpO1xyXG4gICAgaWYgKCFyZXRWYWwpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJWYWx1ZSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgezB9LlwiLCB0aGlzLk5hbWUpKTtcclxuXHJcbiAgICBpZiAocmVmcmVzaERpc3BsYXkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICAgICBDb21tYW5kcy5pbnZva2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL3JlZnJlc2ggdGFza1xyXG4gICAgcmV0dXJuIHJldFZhbDtcclxuICB9XHJcbn1cclxuIl19